drm/udl: Set struct drm_device.dma_dev
authorThomas Zimmermann <tzimmermann@suse.de>
Fri, 7 Mar 2025 08:04:03 +0000 (09:04 +0100)
committerThomas Zimmermann <tzimmermann@suse.de>
Wed, 12 Mar 2025 08:04:01 +0000 (09:04 +0100)
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
drivers/gpu/drm/udl/udl_drv.c
drivers/gpu/drm/udl/udl_drv.h
drivers/gpu/drm/udl/udl_main.c

index 05b3a152cc332135240bcedca3bc99d422f5df8f..3b56ca2f6eb82b4b192815e527b42a852fb36cc8 100644 (file)
@@ -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,
index be00dc1d87a1e13749859388f992eabea387964e..e67e7e2e6f1f7ab4ce056886c0c385d55dd1d805 100644 (file)
@@ -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;
index 3ebe2ce55dfdf8332098410ca51b2f87f3ab55c5..cbb0169cc03066ef7b8b004efecb0486d4466f9c 100644 (file)
@@ -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;
 }