diff options
author | Dave Airlie <airlied@redhat.com> | 2019-04-04 23:17:15 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2019-04-23 23:48:45 -0400 |
commit | 6ecac85eadb9d4065b9038fa3d3c66d49038e14b (patch) | |
tree | 5c01e3067ff528287d512b860ad99ede84e05ad5 | |
parent | fd96e0dba19c53c2d66f2a398716bb74df8ca85e (diff) |
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
-rw-r--r-- | drivers/gpu/drm/udl/udl_drv.c | 56 | ||||
-rw-r--r-- | drivers/gpu/drm/udl/udl_drv.h | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/udl/udl_fb.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/udl/udl_main.c | 23 |
4 files changed, 53 insertions, 37 deletions
diff --git a/drivers/gpu/drm/udl/udl_drv.c b/drivers/gpu/drm/udl/udl_drv.c index b7d01b3664cb..312bf324841a 100644 --- a/drivers/gpu/drm/udl/udl_drv.c +++ b/drivers/gpu/drm/udl/udl_drv.c | |||
@@ -48,10 +48,16 @@ static const struct file_operations udl_driver_fops = { | |||
48 | .llseek = noop_llseek, | 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 | static struct drm_driver driver = { | 59 | static struct drm_driver driver = { |
52 | .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME, | 60 | .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME, |
53 | .load = udl_driver_load, | ||
54 | .unload = udl_driver_unload, | ||
55 | .release = udl_driver_release, | 61 | .release = udl_driver_release, |
56 | 62 | ||
57 | /* gem hooks */ | 63 | /* gem hooks */ |
@@ -75,28 +81,56 @@ static struct drm_driver driver = { | |||
75 | .patchlevel = DRIVER_PATCHLEVEL, | 81 | .patchlevel = DRIVER_PATCHLEVEL, |
76 | }; | 82 | }; |
77 | 83 | ||
84 | static struct udl_device *udl_driver_create(struct usb_interface *interface) | ||
85 | { | ||
86 | struct usb_device *udev = interface_to_usbdev(interface); | ||
87 | struct udl_device *udl; | ||
88 | int r; | ||
89 | |||
90 | udl = kzalloc(sizeof(*udl), GFP_KERNEL); | ||
91 | if (!udl) | ||
92 | return ERR_PTR(-ENOMEM); | ||
93 | |||
94 | r = drm_dev_init(&udl->drm, &driver, &interface->dev); | ||
95 | if (r) { | ||
96 | kfree(udl); | ||
97 | return ERR_PTR(r); | ||
98 | } | ||
99 | |||
100 | udl->udev = udev; | ||
101 | udl->drm.dev_private = udl; | ||
102 | |||
103 | r = udl_init(udl); | ||
104 | if (r) { | ||
105 | drm_dev_fini(&udl->drm); | ||
106 | kfree(udl); | ||
107 | return ERR_PTR(r); | ||
108 | } | ||
109 | |||
110 | usb_set_intfdata(interface, udl); | ||
111 | return udl; | ||
112 | } | ||
113 | |||
78 | static int udl_usb_probe(struct usb_interface *interface, | 114 | static int udl_usb_probe(struct usb_interface *interface, |
79 | const struct usb_device_id *id) | 115 | const struct usb_device_id *id) |
80 | { | 116 | { |
81 | struct usb_device *udev = interface_to_usbdev(interface); | ||
82 | struct drm_device *dev; | ||
83 | int r; | 117 | int r; |
118 | struct udl_device *udl; | ||
84 | 119 | ||
85 | dev = drm_dev_alloc(&driver, &interface->dev); | 120 | udl = udl_driver_create(interface); |
86 | if (IS_ERR(dev)) | 121 | if (IS_ERR(udl)) |
87 | return PTR_ERR(dev); | 122 | return PTR_ERR(udl); |
88 | 123 | ||
89 | r = drm_dev_register(dev, (unsigned long)udev); | 124 | r = drm_dev_register(&udl->drm, 0); |
90 | if (r) | 125 | if (r) |
91 | goto err_free; | 126 | goto err_free; |
92 | 127 | ||
93 | usb_set_intfdata(interface, dev); | 128 | DRM_INFO("Initialized udl on minor %d\n", udl->drm.primary->index); |
94 | DRM_INFO("Initialized udl on minor %d\n", dev->primary->index); | ||
95 | 129 | ||
96 | return 0; | 130 | return 0; |
97 | 131 | ||
98 | err_free: | 132 | err_free: |
99 | drm_dev_put(dev); | 133 | drm_dev_put(&udl->drm); |
100 | return r; | 134 | return r; |
101 | } | 135 | } |
102 | 136 | ||
diff --git a/drivers/gpu/drm/udl/udl_drv.h b/drivers/gpu/drm/udl/udl_drv.h index b3e08e876d62..35c1f33fbc1a 100644 --- a/drivers/gpu/drm/udl/udl_drv.h +++ b/drivers/gpu/drm/udl/udl_drv.h | |||
@@ -50,8 +50,8 @@ struct urb_list { | |||
50 | struct udl_fbdev; | 50 | struct udl_fbdev; |
51 | 51 | ||
52 | struct udl_device { | 52 | struct udl_device { |
53 | struct drm_device drm; | ||
53 | struct device *dev; | 54 | struct device *dev; |
54 | struct drm_device *ddev; | ||
55 | struct usb_device *udev; | 55 | struct usb_device *udev; |
56 | struct drm_crtc *crtc; | 56 | struct drm_crtc *crtc; |
57 | 57 | ||
@@ -71,7 +71,7 @@ struct udl_device { | |||
71 | atomic_t cpu_kcycles_used; /* transpired during pixel processing */ | 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 | struct udl_gem_object { | 76 | struct udl_gem_object { |
77 | struct drm_gem_object base; | 77 | struct drm_gem_object base; |
@@ -104,9 +104,8 @@ struct urb *udl_get_urb(struct drm_device *dev); | |||
104 | int udl_submit_urb(struct drm_device *dev, struct urb *urb, size_t len); | 104 | int udl_submit_urb(struct drm_device *dev, struct urb *urb, size_t len); |
105 | void udl_urb_completion(struct urb *urb); | 105 | void udl_urb_completion(struct urb *urb); |
106 | 106 | ||
107 | int udl_driver_load(struct drm_device *dev, unsigned long flags); | 107 | int udl_init(struct udl_device *udl); |
108 | void udl_driver_unload(struct drm_device *dev); | 108 | void udl_fini(struct drm_device *dev); |
109 | void udl_driver_release(struct drm_device *dev); | ||
110 | 109 | ||
111 | int udl_fbdev_init(struct drm_device *dev); | 110 | int udl_fbdev_init(struct drm_device *dev); |
112 | void udl_fbdev_cleanup(struct drm_device *dev); | 111 | void udl_fbdev_cleanup(struct drm_device *dev); |
diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c index 16593d4f02b4..b9b67a546d4c 100644 --- a/drivers/gpu/drm/udl/udl_fb.c +++ b/drivers/gpu/drm/udl/udl_fb.c | |||
@@ -213,7 +213,7 @@ static int udl_fb_open(struct fb_info *info, int user) | |||
213 | struct udl_device *udl = to_udl(dev); | 213 | struct udl_device *udl = to_udl(dev); |
214 | 214 | ||
215 | /* If the USB device is gone, we don't accept new opens */ | 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 | return -ENODEV; | 217 | return -ENODEV; |
218 | 218 | ||
219 | ufbdev->fb_count++; | 219 | ufbdev->fb_count++; |
diff --git a/drivers/gpu/drm/udl/udl_main.c b/drivers/gpu/drm/udl/udl_main.c index 862c099d7c4c..6743eaef4594 100644 --- a/drivers/gpu/drm/udl/udl_main.c +++ b/drivers/gpu/drm/udl/udl_main.c | |||
@@ -311,20 +311,12 @@ int udl_submit_urb(struct drm_device *dev, struct urb *urb, size_t len) | |||
311 | return ret; | 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; | 316 | struct drm_device *dev = &udl->drm; |
317 | struct udl_device *udl; | ||
318 | int ret = -ENOMEM; | 317 | int ret = -ENOMEM; |
319 | 318 | ||
320 | DRM_DEBUG("\n"); | 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 | mutex_init(&udl->gem_lock); | 321 | mutex_init(&udl->gem_lock); |
330 | 322 | ||
@@ -358,7 +350,6 @@ int udl_driver_load(struct drm_device *dev, unsigned long flags) | |||
358 | err: | 350 | err: |
359 | if (udl->urbs.count) | 351 | if (udl->urbs.count) |
360 | udl_free_urb_list(dev); | 352 | udl_free_urb_list(dev); |
361 | kfree(udl); | ||
362 | DRM_ERROR("%d\n", ret); | 353 | DRM_ERROR("%d\n", ret); |
363 | return ret; | 354 | return ret; |
364 | } | 355 | } |
@@ -369,7 +360,7 @@ int udl_drop_usb(struct drm_device *dev) | |||
369 | return 0; | 360 | return 0; |
370 | } | 361 | } |
371 | 362 | ||
372 | void udl_driver_unload(struct drm_device *dev) | 363 | void udl_fini(struct drm_device *dev) |
373 | { | 364 | { |
374 | struct udl_device *udl = to_udl(dev); | 365 | struct udl_device *udl = to_udl(dev); |
375 | 366 | ||
@@ -379,12 +370,4 @@ void udl_driver_unload(struct drm_device *dev) | |||
379 | udl_free_urb_list(dev); | 370 | udl_free_urb_list(dev); |
380 | 371 | ||
381 | udl_fbdev_cleanup(dev); | 372 | udl_fbdev_cleanup(dev); |
382 | kfree(udl); | ||
383 | } | ||
384 | |||
385 | void udl_driver_release(struct drm_device *dev) | ||
386 | { | ||
387 | udl_modeset_cleanup(dev); | ||
388 | drm_dev_fini(dev); | ||
389 | kfree(dev); | ||
390 | } | 373 | } |