diff mbox

[19/20] drm: merge drm_usb into udl

Message ID 1409307166-12396-20-git-send-email-dh.herrmann@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

David Herrmann Aug. 29, 2014, 10:12 a.m. UTC
This merges all the remains of drm_usb into its only user, udl. We can
then drop all the drm_usb stuff, including dev->usbdev.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
---
 Documentation/DocBook/drm.tmpl      |   3 +-
 drivers/gpu/drm/Kconfig             |   6 ---
 drivers/gpu/drm/Makefile            |   3 --
 drivers/gpu/drm/drm_usb.c           |  76 ---------------------------
 drivers/gpu/drm/udl/Kconfig         |   3 +-
 drivers/gpu/drm/udl/udl_connector.c |   4 +-
 drivers/gpu/drm/udl/udl_drv.c       | 102 +++++++++++++++++++++---------------
 drivers/gpu/drm/udl/udl_drv.h       |   1 +
 drivers/gpu/drm/udl/udl_main.c      |   8 +--
 include/drm/drmP.h                  |   1 -
 include/drm/drm_usb.h               |  15 ------
 11 files changed, 70 insertions(+), 152 deletions(-)
 delete mode 100644 drivers/gpu/drm/drm_usb.c
 delete mode 100644 include/drm/drm_usb.h

Comments

Thierry Reding Aug. 29, 2014, 1 p.m. UTC | #1
On Fri, Aug 29, 2014 at 12:12:45PM +0200, David Herrmann wrote:
[...]
> diff --git a/drivers/gpu/drm/udl/udl_drv.c b/drivers/gpu/drm/udl/udl_drv.c
[...]
>  module_init(udl_init);
>  module_exit(udl_exit);
> +MODULE_LICENSE("GPL");

According to the header file the license is GPL v2 only, so this should
be "GPL v2".

Might also be good to add MODULE_AUTHOR and MODULE_DESCRIPTION here.

Other than that:

Reviewed-by: Thierry Reding <treding@nvidia.com>
Daniel Vetter Aug. 29, 2014, 1:06 p.m. UTC | #2
On Fri, Aug 29, 2014 at 12:12:45PM +0200, David Herrmann wrote:
> This merges all the remains of drm_usb into its only user, udl. We can
> then drop all the drm_usb stuff, including dev->usbdev.
> 
> Signed-off-by: David Herrmann <dh.herrmann@gmail.com>

A bit of (seemingly) unecessary code movement (the probe/disconnect
functions and id table). With or without that fixed this is

Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>

And it looks really, really pretty ;-)

> ---
>  Documentation/DocBook/drm.tmpl      |   3 +-
>  drivers/gpu/drm/Kconfig             |   6 ---
>  drivers/gpu/drm/Makefile            |   3 --
>  drivers/gpu/drm/drm_usb.c           |  76 ---------------------------
>  drivers/gpu/drm/udl/Kconfig         |   3 +-
>  drivers/gpu/drm/udl/udl_connector.c |   4 +-
>  drivers/gpu/drm/udl/udl_drv.c       | 102 +++++++++++++++++++++---------------
>  drivers/gpu/drm/udl/udl_drv.h       |   1 +
>  drivers/gpu/drm/udl/udl_main.c      |   8 +--
>  include/drm/drmP.h                  |   1 -
>  include/drm/drm_usb.h               |  15 ------
>  11 files changed, 70 insertions(+), 152 deletions(-)
>  delete mode 100644 drivers/gpu/drm/drm_usb.c
>  delete mode 100644 include/drm/drm_usb.h
> 
> diff --git a/Documentation/DocBook/drm.tmpl b/Documentation/DocBook/drm.tmpl
> index 5c299fa..99f7ee6 100644
> --- a/Documentation/DocBook/drm.tmpl
> +++ b/Documentation/DocBook/drm.tmpl
> @@ -291,10 +291,9 @@ char *date;</synopsis>
>        <title>Device Registration</title>
>        <para>
>          A number of functions are provided to help with device registration.
> -        The functions deal with PCI, USB and platform devices, respectively.
> +        The functions deal with PCI and platform devices, respectively.
>        </para>
>  !Edrivers/gpu/drm/drm_pci.c
> -!Edrivers/gpu/drm/drm_usb.c
>  !Edrivers/gpu/drm/drm_platform.c
>        <para>
>          New drivers that no longer rely on the services provided by the
> diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
> index e3500f9..e3b4b0f 100644
> --- a/drivers/gpu/drm/Kconfig
> +++ b/drivers/gpu/drm/Kconfig
> @@ -25,12 +25,6 @@ config DRM_MIPI_DSI
>  	bool
>  	depends on DRM
>  
> -config DRM_USB
> -	tristate
> -	depends on DRM
> -	depends on USB_SUPPORT && USB_ARCH_HAS_HCD
> -	select USB
> -
>  config DRM_KMS_HELPER
>  	tristate
>  	depends on DRM
> diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
> index 9b7cb3f..9292a76 100644
> --- a/drivers/gpu/drm/Makefile
> +++ b/drivers/gpu/drm/Makefile
> @@ -22,8 +22,6 @@ drm-$(CONFIG_PCI) += ati_pcigart.o
>  drm-$(CONFIG_DRM_PANEL) += drm_panel.o
>  drm-$(CONFIG_OF) += drm_of.o
>  
> -drm-usb-y   := drm_usb.o
> -
>  drm_kms_helper-y := drm_crtc_helper.o drm_dp_helper.o drm_probe_helper.o \
>  		drm_plane_helper.o drm_dp_mst_topology.o
>  drm_kms_helper-$(CONFIG_DRM_LOAD_EDID_FIRMWARE) += drm_edid_load.o
> @@ -36,7 +34,6 @@ CFLAGS_drm_trace_points.o := -I$(src)
>  
>  obj-$(CONFIG_DRM)	+= drm.o
>  obj-$(CONFIG_DRM_MIPI_DSI) += drm_mipi_dsi.o
> -obj-$(CONFIG_DRM_USB)   += drm_usb.o
>  obj-$(CONFIG_DRM_TTM)	+= ttm/
>  obj-$(CONFIG_DRM_TDFX)	+= tdfx/
>  obj-$(CONFIG_DRM_R128)	+= r128/
> diff --git a/drivers/gpu/drm/drm_usb.c b/drivers/gpu/drm/drm_usb.c
> deleted file mode 100644
> index 9c43490..0000000
> --- a/drivers/gpu/drm/drm_usb.c
> +++ /dev/null
> @@ -1,76 +0,0 @@
> -#include <drm/drmP.h>
> -#include <drm/drm_usb.h>
> -#include <linux/usb.h>
> -#include <linux/module.h>
> -
> -int drm_get_usb_dev(struct usb_interface *interface,
> -		    const struct usb_device_id *id,
> -		    struct drm_driver *driver)
> -{
> -	struct drm_device *dev;
> -	int ret;
> -
> -	DRM_DEBUG("\n");
> -
> -	dev = drm_dev_alloc(driver, &interface->dev);
> -	if (!dev)
> -		return -ENOMEM;
> -
> -	dev->usbdev = interface_to_usbdev(interface);
> -	usb_set_intfdata(interface, dev);
> -
> -	ret = drm_dev_register(dev, 0);
> -	if (ret)
> -		goto err_free;
> -
> -	DRM_INFO("Initialized %s %d.%d.%d %s on minor %d\n",
> -		 driver->name, driver->major, driver->minor, driver->patchlevel,
> -		 driver->date, dev->primary->index);
> -
> -	return 0;
> -
> -err_free:
> -	drm_dev_unref(dev);
> -	return ret;
> -
> -}
> -EXPORT_SYMBOL(drm_get_usb_dev);
> -
> -/**
> - * drm_usb_init - Register matching USB devices with the DRM subsystem
> - * @driver: DRM device driver
> - * @udriver: USB device driver
> - *
> - * Registers one or more devices matched by a USB driver with the DRM
> - * subsystem.
> - *
> - * Return: 0 on success or a negative error code on failure.
> - */
> -int drm_usb_init(struct drm_driver *driver, struct usb_driver *udriver)
> -{
> -	int res;
> -	DRM_DEBUG("\n");
> -
> -	res = usb_register(udriver);
> -	return res;
> -}
> -EXPORT_SYMBOL(drm_usb_init);
> -
> -/**
> - * drm_usb_exit - Unregister matching USB devices from the DRM subsystem
> - * @driver: DRM device driver
> - * @udriver: USB device driver
> - *
> - * Unregisters one or more devices matched by a USB driver from the DRM
> - * subsystem.
> - */
> -void drm_usb_exit(struct drm_driver *driver,
> -		  struct usb_driver *udriver)
> -{
> -	usb_deregister(udriver);
> -}
> -EXPORT_SYMBOL(drm_usb_exit);
> -
> -MODULE_AUTHOR("David Airlie");
> -MODULE_DESCRIPTION("USB DRM support");
> -MODULE_LICENSE("GPL and additional rights");
> diff --git a/drivers/gpu/drm/udl/Kconfig b/drivers/gpu/drm/udl/Kconfig
> index f025286..613ab06 100644
> --- a/drivers/gpu/drm/udl/Kconfig
> +++ b/drivers/gpu/drm/udl/Kconfig
> @@ -1,8 +1,9 @@
>  config DRM_UDL
>  	tristate "DisplayLink"
>  	depends on DRM
> +	depends on USB_SUPPORT
>  	depends on USB_ARCH_HAS_HCD
> -	select DRM_USB
> +	select USB
>  	select FB_SYS_FILLRECT
>  	select FB_SYS_COPYAREA
>  	select FB_SYS_IMAGEBLIT
> diff --git a/drivers/gpu/drm/udl/udl_connector.c b/drivers/gpu/drm/udl/udl_connector.c
> index e026a9e..0110d95 100644
> --- a/drivers/gpu/drm/udl/udl_connector.c
> +++ b/drivers/gpu/drm/udl/udl_connector.c
> @@ -34,8 +34,8 @@ static u8 *udl_get_edid(struct udl_device *udl)
>  		goto error;
>  
>  	for (i = 0; i < EDID_LENGTH; i++) {
> -		ret = usb_control_msg(udl->ddev->usbdev,
> -				      usb_rcvctrlpipe(udl->ddev->usbdev, 0), (0x02),
> +		ret = usb_control_msg(udl->udev,
> +				      usb_rcvctrlpipe(udl->udev, 0), (0x02),
>  				      (0x80 | (0x02 << 5)), i << 8, 0xA1, rbuf, 2,
>  				      HZ);
>  		if (ret < 1) {
> diff --git a/drivers/gpu/drm/udl/udl_drv.c b/drivers/gpu/drm/udl/udl_drv.c
> index 06675e5..8607e9e 100644
> --- a/drivers/gpu/drm/udl/udl_drv.c
> +++ b/drivers/gpu/drm/udl/udl_drv.c
> @@ -7,55 +7,15 @@
>   */
>  
>  #include <linux/module.h>
> -#include <drm/drm_usb.h>
> +#include <drm/drmP.h>
>  #include <drm/drm_crtc_helper.h>
>  #include "udl_drv.h"
>  
> -static struct drm_driver driver;
> -
> -/*
> - * There are many DisplayLink-based graphics products, all with unique PIDs.
> - * So we match on DisplayLink's VID + Vendor-Defined Interface Class (0xff)
> - * We also require a match on SubClass (0x00) and Protocol (0x00),
> - * which is compatible with all known USB 2.0 era graphics chips and firmware,
> - * but allows DisplayLink to increment those for any future incompatible chips
> - */
> -static struct usb_device_id id_table[] = {
> -	{.idVendor = 0x17e9, .bInterfaceClass = 0xff,
> -	 .bInterfaceSubClass = 0x00,
> -	 .bInterfaceProtocol = 0x00,
> -	 .match_flags = USB_DEVICE_ID_MATCH_VENDOR |
> -			USB_DEVICE_ID_MATCH_INT_CLASS |
> -			USB_DEVICE_ID_MATCH_INT_SUBCLASS |
> -			USB_DEVICE_ID_MATCH_INT_PROTOCOL,},
> -	{},
> -};
> -MODULE_DEVICE_TABLE(usb, id_table);
> -
> -MODULE_LICENSE("GPL");
> -
>  static int udl_driver_set_busid(struct drm_device *d, struct drm_master *m)
>  {
>  	return 0;
>  }
>  
> -static int udl_usb_probe(struct usb_interface *interface,
> -			 const struct usb_device_id *id)
> -{
> -	return drm_get_usb_dev(interface, id, &driver);
> -}
> -
> -static void udl_usb_disconnect(struct usb_interface *interface)
> -{
> -	struct drm_device *dev = usb_get_intfdata(interface);
> -
> -	drm_kms_helper_poll_disable(dev);
> -	drm_connector_unplug_all(dev);
> -	udl_fbdev_unplug(dev);
> -	udl_drop_usb(dev);
> -	drm_unplug_dev(dev);
> -}
> -
>  static const struct vm_operations_struct udl_gem_vm_ops = {
>  	.fault = udl_gem_fault,
>  	.open = drm_gem_vm_open,
> @@ -102,6 +62,61 @@ static struct drm_driver driver = {
>  	.patchlevel = DRIVER_PATCHLEVEL,
>  };
>  
> +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;
> +
> +	dev = drm_dev_alloc(&driver, &interface->dev);
> +	if (!dev)
> +		return -ENOMEM;
> +
> +	r = drm_dev_register(dev, (unsigned long)udev);
> +	if (r)
> +		goto err_free;
> +
> +	usb_set_intfdata(interface, dev);
> +	DRM_INFO("Initialized udl on minor %d\n", dev->primary->index);
> +
> +	return 0;
> +
> +err_free:
> +	drm_dev_unref(dev);
> +	return r;
> +}
> +
> +static void udl_usb_disconnect(struct usb_interface *interface)
> +{
> +	struct drm_device *dev = usb_get_intfdata(interface);
> +
> +	drm_kms_helper_poll_disable(dev);
> +	drm_connector_unplug_all(dev);
> +	udl_fbdev_unplug(dev);
> +	udl_drop_usb(dev);
> +	drm_unplug_dev(dev);
> +}
> +
> +/*
> + * There are many DisplayLink-based graphics products, all with unique PIDs.
> + * So we match on DisplayLink's VID + Vendor-Defined Interface Class (0xff)
> + * We also require a match on SubClass (0x00) and Protocol (0x00),
> + * which is compatible with all known USB 2.0 era graphics chips and firmware,
> + * but allows DisplayLink to increment those for any future incompatible chips
> + */
> +static struct usb_device_id id_table[] = {
> +	{.idVendor = 0x17e9, .bInterfaceClass = 0xff,
> +	 .bInterfaceSubClass = 0x00,
> +	 .bInterfaceProtocol = 0x00,
> +	 .match_flags = USB_DEVICE_ID_MATCH_VENDOR |
> +			USB_DEVICE_ID_MATCH_INT_CLASS |
> +			USB_DEVICE_ID_MATCH_INT_SUBCLASS |
> +			USB_DEVICE_ID_MATCH_INT_PROTOCOL,},
> +	{},
> +};
> +MODULE_DEVICE_TABLE(usb, id_table);
> +
>  static struct usb_driver udl_driver = {
>  	.name = "udl",
>  	.probe = udl_usb_probe,
> @@ -111,13 +126,14 @@ static struct usb_driver udl_driver = {
>  
>  static int __init udl_init(void)
>  {
> -	return drm_usb_init(&driver, &udl_driver);
> +	return usb_register(&udl_driver);
>  }
>  
>  static void __exit udl_exit(void)
>  {
> -	drm_usb_exit(&driver, &udl_driver);
> +	usb_deregister(&udl_driver);
>  }
>  
>  module_init(udl_init);
>  module_exit(udl_exit);
> +MODULE_LICENSE("GPL");
> diff --git a/drivers/gpu/drm/udl/udl_drv.h b/drivers/gpu/drm/udl/udl_drv.h
> index 1fbf7b3..51e10ee 100644
> --- a/drivers/gpu/drm/udl/udl_drv.h
> +++ b/drivers/gpu/drm/udl/udl_drv.h
> @@ -47,6 +47,7 @@ struct udl_fbdev;
>  struct udl_device {
>  	struct device *dev;
>  	struct drm_device *ddev;
> +	struct usb_device *udev;
>  
>  	int sku_pixel_limit;
>  
> diff --git a/drivers/gpu/drm/udl/udl_main.c b/drivers/gpu/drm/udl/udl_main.c
> index 4279567..33dbfb2 100644
> --- a/drivers/gpu/drm/udl/udl_main.c
> +++ b/drivers/gpu/drm/udl/udl_main.c
> @@ -202,7 +202,7 @@ static int udl_alloc_urb_list(struct drm_device *dev, int count, size_t size)
>  		}
>  		unode->urb = urb;
>  
> -		buf = usb_alloc_coherent(udl->ddev->usbdev, MAX_TRANSFER, GFP_KERNEL,
> +		buf = usb_alloc_coherent(udl->udev, MAX_TRANSFER, GFP_KERNEL,
>  					 &urb->transfer_dma);
>  		if (!buf) {
>  			kfree(unode);
> @@ -211,7 +211,7 @@ static int udl_alloc_urb_list(struct drm_device *dev, int count, size_t size)
>  		}
>  
>  		/* urb->transfer_buffer_length set to actual before submit */
> -		usb_fill_bulk_urb(urb, udl->ddev->usbdev, usb_sndbulkpipe(udl->ddev->usbdev, 1),
> +		usb_fill_bulk_urb(urb, udl->udev, usb_sndbulkpipe(udl->udev, 1),
>  			buf, size, udl_urb_completion, unode);
>  		urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
>  
> @@ -282,6 +282,7 @@ int udl_submit_urb(struct drm_device *dev, struct urb *urb, size_t len)
>  
>  int udl_driver_load(struct drm_device *dev, unsigned long flags)
>  {
> +	struct usb_device *udev = (void*)flags;
>  	struct udl_device *udl;
>  	int ret = -ENOMEM;
>  
> @@ -290,10 +291,11 @@ int udl_driver_load(struct drm_device *dev, unsigned long flags)
>  	if (!udl)
>  		return -ENOMEM;
>  
> +	udl->udev = udev;
>  	udl->ddev = dev;
>  	dev->dev_private = udl;
>  
> -	if (!udl_parse_vendor_descriptor(dev, dev->usbdev)) {
> +	if (!udl_parse_vendor_descriptor(dev, udl->udev)) {
>  		ret = -ENODEV;
>  		DRM_ERROR("firmware not recognized. Assume incompatible device\n");
>  		goto err;
> diff --git a/include/drm/drmP.h b/include/drm/drmP.h
> index 5ae388a..0e73aad 100644
> --- a/include/drm/drmP.h
> +++ b/include/drm/drmP.h
> @@ -1020,7 +1020,6 @@ struct drm_device {
>  #endif
>  
>  	struct platform_device *platformdev; /**< Platform device struture */
> -	struct usb_device *usbdev;
>  
>  	struct drm_sg_mem *sg;	/**< Scatter gather memory */
>  	unsigned int num_crtcs;                  /**< Number of CRTCs on this device */
> diff --git a/include/drm/drm_usb.h b/include/drm/drm_usb.h
> deleted file mode 100644
> index 33506c11..0000000
> --- a/include/drm/drm_usb.h
> +++ /dev/null
> @@ -1,15 +0,0 @@
> -#ifndef DRM_USB_H
> -#define DRM_USB_H
> -
> -#include <drmP.h>
> -
> -#include <linux/usb.h>
> -
> -extern int drm_usb_init(struct drm_driver *driver, struct usb_driver *udriver);
> -extern void drm_usb_exit(struct drm_driver *driver, struct usb_driver *udriver);
> -
> -int drm_get_usb_dev(struct usb_interface *interface,
> -		    const struct usb_device_id *id,
> -		    struct drm_driver *driver);
> -
> -#endif
> -- 
> 2.1.0
>
diff mbox

Patch

diff --git a/Documentation/DocBook/drm.tmpl b/Documentation/DocBook/drm.tmpl
index 5c299fa..99f7ee6 100644
--- a/Documentation/DocBook/drm.tmpl
+++ b/Documentation/DocBook/drm.tmpl
@@ -291,10 +291,9 @@  char *date;</synopsis>
       <title>Device Registration</title>
       <para>
         A number of functions are provided to help with device registration.
-        The functions deal with PCI, USB and platform devices, respectively.
+        The functions deal with PCI and platform devices, respectively.
       </para>
 !Edrivers/gpu/drm/drm_pci.c
-!Edrivers/gpu/drm/drm_usb.c
 !Edrivers/gpu/drm/drm_platform.c
       <para>
         New drivers that no longer rely on the services provided by the
diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index e3500f9..e3b4b0f 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -25,12 +25,6 @@  config DRM_MIPI_DSI
 	bool
 	depends on DRM
 
-config DRM_USB
-	tristate
-	depends on DRM
-	depends on USB_SUPPORT && USB_ARCH_HAS_HCD
-	select USB
-
 config DRM_KMS_HELPER
 	tristate
 	depends on DRM
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index 9b7cb3f..9292a76 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -22,8 +22,6 @@  drm-$(CONFIG_PCI) += ati_pcigart.o
 drm-$(CONFIG_DRM_PANEL) += drm_panel.o
 drm-$(CONFIG_OF) += drm_of.o
 
-drm-usb-y   := drm_usb.o
-
 drm_kms_helper-y := drm_crtc_helper.o drm_dp_helper.o drm_probe_helper.o \
 		drm_plane_helper.o drm_dp_mst_topology.o
 drm_kms_helper-$(CONFIG_DRM_LOAD_EDID_FIRMWARE) += drm_edid_load.o
@@ -36,7 +34,6 @@  CFLAGS_drm_trace_points.o := -I$(src)
 
 obj-$(CONFIG_DRM)	+= drm.o
 obj-$(CONFIG_DRM_MIPI_DSI) += drm_mipi_dsi.o
-obj-$(CONFIG_DRM_USB)   += drm_usb.o
 obj-$(CONFIG_DRM_TTM)	+= ttm/
 obj-$(CONFIG_DRM_TDFX)	+= tdfx/
 obj-$(CONFIG_DRM_R128)	+= r128/
diff --git a/drivers/gpu/drm/drm_usb.c b/drivers/gpu/drm/drm_usb.c
deleted file mode 100644
index 9c43490..0000000
--- a/drivers/gpu/drm/drm_usb.c
+++ /dev/null
@@ -1,76 +0,0 @@ 
-#include <drm/drmP.h>
-#include <drm/drm_usb.h>
-#include <linux/usb.h>
-#include <linux/module.h>
-
-int drm_get_usb_dev(struct usb_interface *interface,
-		    const struct usb_device_id *id,
-		    struct drm_driver *driver)
-{
-	struct drm_device *dev;
-	int ret;
-
-	DRM_DEBUG("\n");
-
-	dev = drm_dev_alloc(driver, &interface->dev);
-	if (!dev)
-		return -ENOMEM;
-
-	dev->usbdev = interface_to_usbdev(interface);
-	usb_set_intfdata(interface, dev);
-
-	ret = drm_dev_register(dev, 0);
-	if (ret)
-		goto err_free;
-
-	DRM_INFO("Initialized %s %d.%d.%d %s on minor %d\n",
-		 driver->name, driver->major, driver->minor, driver->patchlevel,
-		 driver->date, dev->primary->index);
-
-	return 0;
-
-err_free:
-	drm_dev_unref(dev);
-	return ret;
-
-}
-EXPORT_SYMBOL(drm_get_usb_dev);
-
-/**
- * drm_usb_init - Register matching USB devices with the DRM subsystem
- * @driver: DRM device driver
- * @udriver: USB device driver
- *
- * Registers one or more devices matched by a USB driver with the DRM
- * subsystem.
- *
- * Return: 0 on success or a negative error code on failure.
- */
-int drm_usb_init(struct drm_driver *driver, struct usb_driver *udriver)
-{
-	int res;
-	DRM_DEBUG("\n");
-
-	res = usb_register(udriver);
-	return res;
-}
-EXPORT_SYMBOL(drm_usb_init);
-
-/**
- * drm_usb_exit - Unregister matching USB devices from the DRM subsystem
- * @driver: DRM device driver
- * @udriver: USB device driver
- *
- * Unregisters one or more devices matched by a USB driver from the DRM
- * subsystem.
- */
-void drm_usb_exit(struct drm_driver *driver,
-		  struct usb_driver *udriver)
-{
-	usb_deregister(udriver);
-}
-EXPORT_SYMBOL(drm_usb_exit);
-
-MODULE_AUTHOR("David Airlie");
-MODULE_DESCRIPTION("USB DRM support");
-MODULE_LICENSE("GPL and additional rights");
diff --git a/drivers/gpu/drm/udl/Kconfig b/drivers/gpu/drm/udl/Kconfig
index f025286..613ab06 100644
--- a/drivers/gpu/drm/udl/Kconfig
+++ b/drivers/gpu/drm/udl/Kconfig
@@ -1,8 +1,9 @@ 
 config DRM_UDL
 	tristate "DisplayLink"
 	depends on DRM
+	depends on USB_SUPPORT
 	depends on USB_ARCH_HAS_HCD
-	select DRM_USB
+	select USB
 	select FB_SYS_FILLRECT
 	select FB_SYS_COPYAREA
 	select FB_SYS_IMAGEBLIT
diff --git a/drivers/gpu/drm/udl/udl_connector.c b/drivers/gpu/drm/udl/udl_connector.c
index e026a9e..0110d95 100644
--- a/drivers/gpu/drm/udl/udl_connector.c
+++ b/drivers/gpu/drm/udl/udl_connector.c
@@ -34,8 +34,8 @@  static u8 *udl_get_edid(struct udl_device *udl)
 		goto error;
 
 	for (i = 0; i < EDID_LENGTH; i++) {
-		ret = usb_control_msg(udl->ddev->usbdev,
-				      usb_rcvctrlpipe(udl->ddev->usbdev, 0), (0x02),
+		ret = usb_control_msg(udl->udev,
+				      usb_rcvctrlpipe(udl->udev, 0), (0x02),
 				      (0x80 | (0x02 << 5)), i << 8, 0xA1, rbuf, 2,
 				      HZ);
 		if (ret < 1) {
diff --git a/drivers/gpu/drm/udl/udl_drv.c b/drivers/gpu/drm/udl/udl_drv.c
index 06675e5..8607e9e 100644
--- a/drivers/gpu/drm/udl/udl_drv.c
+++ b/drivers/gpu/drm/udl/udl_drv.c
@@ -7,55 +7,15 @@ 
  */
 
 #include <linux/module.h>
-#include <drm/drm_usb.h>
+#include <drm/drmP.h>
 #include <drm/drm_crtc_helper.h>
 #include "udl_drv.h"
 
-static struct drm_driver driver;
-
-/*
- * There are many DisplayLink-based graphics products, all with unique PIDs.
- * So we match on DisplayLink's VID + Vendor-Defined Interface Class (0xff)
- * We also require a match on SubClass (0x00) and Protocol (0x00),
- * which is compatible with all known USB 2.0 era graphics chips and firmware,
- * but allows DisplayLink to increment those for any future incompatible chips
- */
-static struct usb_device_id id_table[] = {
-	{.idVendor = 0x17e9, .bInterfaceClass = 0xff,
-	 .bInterfaceSubClass = 0x00,
-	 .bInterfaceProtocol = 0x00,
-	 .match_flags = USB_DEVICE_ID_MATCH_VENDOR |
-			USB_DEVICE_ID_MATCH_INT_CLASS |
-			USB_DEVICE_ID_MATCH_INT_SUBCLASS |
-			USB_DEVICE_ID_MATCH_INT_PROTOCOL,},
-	{},
-};
-MODULE_DEVICE_TABLE(usb, id_table);
-
-MODULE_LICENSE("GPL");
-
 static int udl_driver_set_busid(struct drm_device *d, struct drm_master *m)
 {
 	return 0;
 }
 
-static int udl_usb_probe(struct usb_interface *interface,
-			 const struct usb_device_id *id)
-{
-	return drm_get_usb_dev(interface, id, &driver);
-}
-
-static void udl_usb_disconnect(struct usb_interface *interface)
-{
-	struct drm_device *dev = usb_get_intfdata(interface);
-
-	drm_kms_helper_poll_disable(dev);
-	drm_connector_unplug_all(dev);
-	udl_fbdev_unplug(dev);
-	udl_drop_usb(dev);
-	drm_unplug_dev(dev);
-}
-
 static const struct vm_operations_struct udl_gem_vm_ops = {
 	.fault = udl_gem_fault,
 	.open = drm_gem_vm_open,
@@ -102,6 +62,61 @@  static struct drm_driver driver = {
 	.patchlevel = DRIVER_PATCHLEVEL,
 };
 
+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;
+
+	dev = drm_dev_alloc(&driver, &interface->dev);
+	if (!dev)
+		return -ENOMEM;
+
+	r = drm_dev_register(dev, (unsigned long)udev);
+	if (r)
+		goto err_free;
+
+	usb_set_intfdata(interface, dev);
+	DRM_INFO("Initialized udl on minor %d\n", dev->primary->index);
+
+	return 0;
+
+err_free:
+	drm_dev_unref(dev);
+	return r;
+}
+
+static void udl_usb_disconnect(struct usb_interface *interface)
+{
+	struct drm_device *dev = usb_get_intfdata(interface);
+
+	drm_kms_helper_poll_disable(dev);
+	drm_connector_unplug_all(dev);
+	udl_fbdev_unplug(dev);
+	udl_drop_usb(dev);
+	drm_unplug_dev(dev);
+}
+
+/*
+ * There are many DisplayLink-based graphics products, all with unique PIDs.
+ * So we match on DisplayLink's VID + Vendor-Defined Interface Class (0xff)
+ * We also require a match on SubClass (0x00) and Protocol (0x00),
+ * which is compatible with all known USB 2.0 era graphics chips and firmware,
+ * but allows DisplayLink to increment those for any future incompatible chips
+ */
+static struct usb_device_id id_table[] = {
+	{.idVendor = 0x17e9, .bInterfaceClass = 0xff,
+	 .bInterfaceSubClass = 0x00,
+	 .bInterfaceProtocol = 0x00,
+	 .match_flags = USB_DEVICE_ID_MATCH_VENDOR |
+			USB_DEVICE_ID_MATCH_INT_CLASS |
+			USB_DEVICE_ID_MATCH_INT_SUBCLASS |
+			USB_DEVICE_ID_MATCH_INT_PROTOCOL,},
+	{},
+};
+MODULE_DEVICE_TABLE(usb, id_table);
+
 static struct usb_driver udl_driver = {
 	.name = "udl",
 	.probe = udl_usb_probe,
@@ -111,13 +126,14 @@  static struct usb_driver udl_driver = {
 
 static int __init udl_init(void)
 {
-	return drm_usb_init(&driver, &udl_driver);
+	return usb_register(&udl_driver);
 }
 
 static void __exit udl_exit(void)
 {
-	drm_usb_exit(&driver, &udl_driver);
+	usb_deregister(&udl_driver);
 }
 
 module_init(udl_init);
 module_exit(udl_exit);
+MODULE_LICENSE("GPL");
diff --git a/drivers/gpu/drm/udl/udl_drv.h b/drivers/gpu/drm/udl/udl_drv.h
index 1fbf7b3..51e10ee 100644
--- a/drivers/gpu/drm/udl/udl_drv.h
+++ b/drivers/gpu/drm/udl/udl_drv.h
@@ -47,6 +47,7 @@  struct udl_fbdev;
 struct udl_device {
 	struct device *dev;
 	struct drm_device *ddev;
+	struct usb_device *udev;
 
 	int sku_pixel_limit;
 
diff --git a/drivers/gpu/drm/udl/udl_main.c b/drivers/gpu/drm/udl/udl_main.c
index 4279567..33dbfb2 100644
--- a/drivers/gpu/drm/udl/udl_main.c
+++ b/drivers/gpu/drm/udl/udl_main.c
@@ -202,7 +202,7 @@  static int udl_alloc_urb_list(struct drm_device *dev, int count, size_t size)
 		}
 		unode->urb = urb;
 
-		buf = usb_alloc_coherent(udl->ddev->usbdev, MAX_TRANSFER, GFP_KERNEL,
+		buf = usb_alloc_coherent(udl->udev, MAX_TRANSFER, GFP_KERNEL,
 					 &urb->transfer_dma);
 		if (!buf) {
 			kfree(unode);
@@ -211,7 +211,7 @@  static int udl_alloc_urb_list(struct drm_device *dev, int count, size_t size)
 		}
 
 		/* urb->transfer_buffer_length set to actual before submit */
-		usb_fill_bulk_urb(urb, udl->ddev->usbdev, usb_sndbulkpipe(udl->ddev->usbdev, 1),
+		usb_fill_bulk_urb(urb, udl->udev, usb_sndbulkpipe(udl->udev, 1),
 			buf, size, udl_urb_completion, unode);
 		urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 
@@ -282,6 +282,7 @@  int udl_submit_urb(struct drm_device *dev, struct urb *urb, size_t len)
 
 int udl_driver_load(struct drm_device *dev, unsigned long flags)
 {
+	struct usb_device *udev = (void*)flags;
 	struct udl_device *udl;
 	int ret = -ENOMEM;
 
@@ -290,10 +291,11 @@  int udl_driver_load(struct drm_device *dev, unsigned long flags)
 	if (!udl)
 		return -ENOMEM;
 
+	udl->udev = udev;
 	udl->ddev = dev;
 	dev->dev_private = udl;
 
-	if (!udl_parse_vendor_descriptor(dev, dev->usbdev)) {
+	if (!udl_parse_vendor_descriptor(dev, udl->udev)) {
 		ret = -ENODEV;
 		DRM_ERROR("firmware not recognized. Assume incompatible device\n");
 		goto err;
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 5ae388a..0e73aad 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -1020,7 +1020,6 @@  struct drm_device {
 #endif
 
 	struct platform_device *platformdev; /**< Platform device struture */
-	struct usb_device *usbdev;
 
 	struct drm_sg_mem *sg;	/**< Scatter gather memory */
 	unsigned int num_crtcs;                  /**< Number of CRTCs on this device */
diff --git a/include/drm/drm_usb.h b/include/drm/drm_usb.h
deleted file mode 100644
index 33506c11..0000000
--- a/include/drm/drm_usb.h
+++ /dev/null
@@ -1,15 +0,0 @@ 
-#ifndef DRM_USB_H
-#define DRM_USB_H
-
-#include <drmP.h>
-
-#include <linux/usb.h>
-
-extern int drm_usb_init(struct drm_driver *driver, struct usb_driver *udriver);
-extern void drm_usb_exit(struct drm_driver *driver, struct usb_driver *udriver);
-
-int drm_get_usb_dev(struct usb_interface *interface,
-		    const struct usb_device_id *id,
-		    struct drm_driver *driver);
-
-#endif