Skip to content

Commit

Permalink
drm/udl: move to embedding drm device inside udl device.
Browse files Browse the repository at this point in the history
commit 6ecac85 upstream.

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
Signed-off-by: Ross Zwisler <zwisler@google.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
airlied authored and gregkh committed Jul 21, 2019
1 parent af48f7d commit 466bdfc
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 37 deletions.
56 changes: 45 additions & 11 deletions drivers/gpu/drm/udl/udl_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,16 @@ static const struct file_operations udl_driver_fops = {
.llseek = noop_llseek,
};

static void udl_driver_release(struct drm_device *dev)
{
udl_fini(dev);
udl_modeset_cleanup(dev);
drm_dev_fini(dev);
kfree(dev);
}

static struct drm_driver driver = {
.driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME,
.load = udl_driver_load,
.unload = udl_driver_unload,
.release = udl_driver_release,

/* gem hooks */
Expand All @@ -74,28 +80,56 @@ static struct drm_driver driver = {
.patchlevel = DRIVER_PATCHLEVEL,
};

static struct udl_device *udl_driver_create(struct usb_interface *interface)
{
struct usb_device *udev = interface_to_usbdev(interface);
struct udl_device *udl;
int r;

udl = kzalloc(sizeof(*udl), GFP_KERNEL);
if (!udl)
return ERR_PTR(-ENOMEM);

r = drm_dev_init(&udl->drm, &driver, &interface->dev);
if (r) {
kfree(udl);
return ERR_PTR(r);
}

udl->udev = udev;
udl->drm.dev_private = udl;

r = udl_init(udl);
if (r) {
drm_dev_fini(&udl->drm);
kfree(udl);
return ERR_PTR(r);
}

usb_set_intfdata(interface, udl);
return udl;
}

static int udl_usb_probe(struct usb_interface *interface,
const struct usb_device_id *id)
{
struct usb_device *udev = interface_to_usbdev(interface);
struct drm_device *dev;
int r;
struct udl_device *udl;

dev = drm_dev_alloc(&driver, &interface->dev);
if (IS_ERR(dev))
return PTR_ERR(dev);
udl = udl_driver_create(interface);
if (IS_ERR(udl))
return PTR_ERR(udl);

r = drm_dev_register(dev, (unsigned long)udev);
r = drm_dev_register(&udl->drm, 0);
if (r)
goto err_free;

usb_set_intfdata(interface, dev);
DRM_INFO("Initialized udl on minor %d\n", dev->primary->index);
DRM_INFO("Initialized udl on minor %d\n", udl->drm.primary->index);

return 0;

err_free:
drm_dev_put(dev);
drm_dev_put(&udl->drm);
return r;
}

Expand Down
9 changes: 4 additions & 5 deletions drivers/gpu/drm/udl/udl_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,8 @@ struct urb_list {
struct udl_fbdev;

struct udl_device {
struct drm_device drm;
struct device *dev;
struct drm_device *ddev;
struct usb_device *udev;
struct drm_crtc *crtc;

Expand All @@ -71,7 +71,7 @@ struct udl_device {
atomic_t cpu_kcycles_used; /* transpired during pixel processing */
};

#define to_udl(x) ((x)->dev_private)
#define to_udl(x) container_of(x, struct udl_device, drm)

struct udl_gem_object {
struct drm_gem_object base;
Expand Down Expand Up @@ -104,9 +104,8 @@ struct urb *udl_get_urb(struct drm_device *dev);
int udl_submit_urb(struct drm_device *dev, struct urb *urb, size_t len);
void udl_urb_completion(struct urb *urb);

int udl_driver_load(struct drm_device *dev, unsigned long flags);
void udl_driver_unload(struct drm_device *dev);
void udl_driver_release(struct drm_device *dev);
int udl_init(struct udl_device *udl);
void udl_fini(struct drm_device *dev);

int udl_fbdev_init(struct drm_device *dev);
void udl_fbdev_cleanup(struct drm_device *dev);
Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/udl/udl_fb.c
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ static int udl_fb_open(struct fb_info *info, int user)
struct udl_device *udl = to_udl(dev);

/* If the USB device is gone, we don't accept new opens */
if (drm_dev_is_unplugged(udl->ddev))
if (drm_dev_is_unplugged(&udl->drm))
return -ENODEV;

ufbdev->fb_count++;
Expand Down
23 changes: 3 additions & 20 deletions drivers/gpu/drm/udl/udl_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -310,20 +310,12 @@ int udl_submit_urb(struct drm_device *dev, struct urb *urb, size_t len)
return ret;
}

int udl_driver_load(struct drm_device *dev, unsigned long flags)
int udl_init(struct udl_device *udl)
{
struct usb_device *udev = (void*)flags;
struct udl_device *udl;
struct drm_device *dev = &udl->drm;
int ret = -ENOMEM;

DRM_DEBUG("\n");
udl = kzalloc(sizeof(struct udl_device), GFP_KERNEL);
if (!udl)
return -ENOMEM;

udl->udev = udev;
udl->ddev = dev;
dev->dev_private = udl;

mutex_init(&udl->gem_lock);

Expand Down Expand Up @@ -357,7 +349,6 @@ int udl_driver_load(struct drm_device *dev, unsigned long flags)
err:
if (udl->urbs.count)
udl_free_urb_list(dev);
kfree(udl);
DRM_ERROR("%d\n", ret);
return ret;
}
Expand All @@ -368,7 +359,7 @@ int udl_drop_usb(struct drm_device *dev)
return 0;
}

void udl_driver_unload(struct drm_device *dev)
void udl_fini(struct drm_device *dev)
{
struct udl_device *udl = to_udl(dev);

Expand All @@ -378,12 +369,4 @@ void udl_driver_unload(struct drm_device *dev)
udl_free_urb_list(dev);

udl_fbdev_cleanup(dev);
kfree(udl);
}

void udl_driver_release(struct drm_device *dev)
{
udl_modeset_cleanup(dev);
drm_dev_fini(dev);
kfree(dev);
}

0 comments on commit 466bdfc

Please sign in to comment.