Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/udl: move to embedding drm device inside udl device.

This should help with some of the lifetime issues, and move us away
from load/unload.

Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190405031715.5959-4-airlied@gmail.com

+53 -37
+45 -11
drivers/gpu/drm/udl/udl_drv.c
··· 48 48 .llseek = noop_llseek, 49 49 }; 50 50 51 + static void udl_driver_release(struct drm_device *dev) 52 + { 53 + udl_fini(dev); 54 + udl_modeset_cleanup(dev); 55 + drm_dev_fini(dev); 56 + kfree(dev); 57 + } 58 + 51 59 static struct drm_driver driver = { 52 60 .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME, 53 - .load = udl_driver_load, 54 - .unload = udl_driver_unload, 55 61 .release = udl_driver_release, 56 62 57 63 /* gem hooks */ ··· 81 75 .patchlevel = DRIVER_PATCHLEVEL, 82 76 }; 83 77 78 + static struct udl_device *udl_driver_create(struct usb_interface *interface) 79 + { 80 + struct usb_device *udev = interface_to_usbdev(interface); 81 + struct udl_device *udl; 82 + int r; 83 + 84 + udl = kzalloc(sizeof(*udl), GFP_KERNEL); 85 + if (!udl) 86 + return ERR_PTR(-ENOMEM); 87 + 88 + r = drm_dev_init(&udl->drm, &driver, &interface->dev); 89 + if (r) { 90 + kfree(udl); 91 + return ERR_PTR(r); 92 + } 93 + 94 + udl->udev = udev; 95 + udl->drm.dev_private = udl; 96 + 97 + r = udl_init(udl); 98 + if (r) { 99 + drm_dev_fini(&udl->drm); 100 + kfree(udl); 101 + return ERR_PTR(r); 102 + } 103 + 104 + usb_set_intfdata(interface, udl); 105 + return udl; 106 + } 107 + 84 108 static int udl_usb_probe(struct usb_interface *interface, 85 109 const struct usb_device_id *id) 86 110 { 87 - struct usb_device *udev = interface_to_usbdev(interface); 88 - struct drm_device *dev; 89 111 int r; 112 + struct udl_device *udl; 90 113 91 - dev = drm_dev_alloc(&driver, &interface->dev); 92 - if (IS_ERR(dev)) 93 - return PTR_ERR(dev); 114 + udl = udl_driver_create(interface); 115 + if (IS_ERR(udl)) 116 + return PTR_ERR(udl); 94 117 95 - r = drm_dev_register(dev, (unsigned long)udev); 118 + r = drm_dev_register(&udl->drm, 0); 96 119 if (r) 97 120 goto err_free; 98 121 99 - usb_set_intfdata(interface, dev); 100 - DRM_INFO("Initialized udl on minor %d\n", dev->primary->index); 122 + DRM_INFO("Initialized udl on minor %d\n", udl->drm.primary->index); 101 123 102 124 return 0; 103 125 104 126 err_free: 105 - drm_dev_put(dev); 127 + drm_dev_put(&udl->drm); 106 128 return r; 107 129 } 108 130
+4 -5
drivers/gpu/drm/udl/udl_drv.h
··· 50 50 struct udl_fbdev; 51 51 52 52 struct udl_device { 53 + struct drm_device drm; 53 54 struct device *dev; 54 - struct drm_device *ddev; 55 55 struct usb_device *udev; 56 56 struct drm_crtc *crtc; 57 57 ··· 71 71 atomic_t cpu_kcycles_used; /* transpired during pixel processing */ 72 72 }; 73 73 74 - #define to_udl(x) ((x)->dev_private) 74 + #define to_udl(x) container_of(x, struct udl_device, drm) 75 75 76 76 struct udl_gem_object { 77 77 struct drm_gem_object base; ··· 104 104 int udl_submit_urb(struct drm_device *dev, struct urb *urb, size_t len); 105 105 void udl_urb_completion(struct urb *urb); 106 106 107 - int udl_driver_load(struct drm_device *dev, unsigned long flags); 108 - void udl_driver_unload(struct drm_device *dev); 109 - void udl_driver_release(struct drm_device *dev); 107 + int udl_init(struct udl_device *udl); 108 + void udl_fini(struct drm_device *dev); 110 109 111 110 int udl_fbdev_init(struct drm_device *dev); 112 111 void udl_fbdev_cleanup(struct drm_device *dev);
+1 -1
drivers/gpu/drm/udl/udl_fb.c
··· 213 213 struct udl_device *udl = to_udl(dev); 214 214 215 215 /* If the USB device is gone, we don't accept new opens */ 216 - if (drm_dev_is_unplugged(udl->ddev)) 216 + if (drm_dev_is_unplugged(&udl->drm)) 217 217 return -ENODEV; 218 218 219 219 ufbdev->fb_count++;
+3 -20
drivers/gpu/drm/udl/udl_main.c
··· 311 311 return ret; 312 312 } 313 313 314 - int udl_driver_load(struct drm_device *dev, unsigned long flags) 314 + int udl_init(struct udl_device *udl) 315 315 { 316 - struct usb_device *udev = (void*)flags; 317 - struct udl_device *udl; 316 + struct drm_device *dev = &udl->drm; 318 317 int ret = -ENOMEM; 319 318 320 319 DRM_DEBUG("\n"); 321 - udl = kzalloc(sizeof(struct udl_device), GFP_KERNEL); 322 - if (!udl) 323 - return -ENOMEM; 324 - 325 - udl->udev = udev; 326 - udl->ddev = dev; 327 - dev->dev_private = udl; 328 320 329 321 mutex_init(&udl->gem_lock); 330 322 ··· 350 358 err: 351 359 if (udl->urbs.count) 352 360 udl_free_urb_list(dev); 353 - kfree(udl); 354 361 DRM_ERROR("%d\n", ret); 355 362 return ret; 356 363 } ··· 360 369 return 0; 361 370 } 362 371 363 - void udl_driver_unload(struct drm_device *dev) 372 + void udl_fini(struct drm_device *dev) 364 373 { 365 374 struct udl_device *udl = to_udl(dev); 366 375 ··· 370 379 udl_free_urb_list(dev); 371 380 372 381 udl_fbdev_cleanup(dev); 373 - kfree(udl); 374 - } 375 - 376 - void udl_driver_release(struct drm_device *dev) 377 - { 378 - udl_modeset_cleanup(dev); 379 - drm_dev_fini(dev); 380 - kfree(dev); 381 382 }