mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-02-16 22:25:13 -05:00
drm/udl: Set struct drm_device.dma_dev
Set the dma_dev field provided by the DRM device. Required for PRIME dma-buf import. Remove the driver's implementation. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Jani Nikula <jani.nikula@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20250307080836.42848-6-tzimmermann@suse.de
This commit is contained in:
@@ -49,22 +49,6 @@ static int udl_usb_reset_resume(struct usb_interface *interface)
|
||||
return drm_mode_config_helper_resume(dev);
|
||||
}
|
||||
|
||||
/*
|
||||
* FIXME: Dma-buf sharing requires DMA support by the importing device.
|
||||
* This function is a workaround to make USB devices work as well.
|
||||
* See todo.rst for how to fix the issue in the dma-buf framework.
|
||||
*/
|
||||
static struct drm_gem_object *udl_driver_gem_prime_import(struct drm_device *dev,
|
||||
struct dma_buf *dma_buf)
|
||||
{
|
||||
struct udl_device *udl = to_udl(dev);
|
||||
|
||||
if (!udl->dmadev)
|
||||
return ERR_PTR(-ENODEV);
|
||||
|
||||
return drm_gem_prime_import_dev(dev, dma_buf, udl->dmadev);
|
||||
}
|
||||
|
||||
DEFINE_DRM_GEM_FOPS(udl_driver_fops);
|
||||
|
||||
static const struct drm_driver driver = {
|
||||
@@ -73,7 +57,6 @@ static const struct drm_driver driver = {
|
||||
/* GEM hooks */
|
||||
.fops = &udl_driver_fops,
|
||||
DRM_GEM_SHMEM_DRIVER_OPS,
|
||||
.gem_prime_import = udl_driver_gem_prime_import,
|
||||
DRM_FBDEV_SHMEM_DRIVER_OPS,
|
||||
|
||||
.name = DRIVER_NAME,
|
||||
|
||||
@@ -51,7 +51,6 @@ struct urb_list {
|
||||
struct udl_device {
|
||||
struct drm_device drm;
|
||||
struct device *dev;
|
||||
struct device *dmadev;
|
||||
|
||||
struct drm_plane primary_plane;
|
||||
struct drm_crtc crtc;
|
||||
|
||||
@@ -308,12 +308,17 @@ int udl_init(struct udl_device *udl)
|
||||
{
|
||||
struct drm_device *dev = &udl->drm;
|
||||
int ret = -ENOMEM;
|
||||
struct device *dma_dev;
|
||||
|
||||
DRM_DEBUG("\n");
|
||||
|
||||
udl->dmadev = usb_intf_get_dma_device(to_usb_interface(dev->dev));
|
||||
if (!udl->dmadev)
|
||||
dma_dev = usb_intf_get_dma_device(to_usb_interface(dev->dev));
|
||||
if (dma_dev) {
|
||||
drm_dev_set_dma_dev(dev, dma_dev);
|
||||
put_device(dma_dev);
|
||||
} else {
|
||||
drm_warn(dev, "buffer sharing not supported"); /* not an error */
|
||||
}
|
||||
|
||||
mutex_init(&udl->gem_lock);
|
||||
|
||||
@@ -343,18 +348,13 @@ int udl_init(struct udl_device *udl)
|
||||
err:
|
||||
if (udl->urbs.count)
|
||||
udl_free_urb_list(dev);
|
||||
put_device(udl->dmadev);
|
||||
DRM_ERROR("%d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int udl_drop_usb(struct drm_device *dev)
|
||||
{
|
||||
struct udl_device *udl = to_udl(dev);
|
||||
|
||||
udl_free_urb_list(dev);
|
||||
put_device(udl->dmadev);
|
||||
udl->dmadev = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user