[PATCH 19/20] drm: merge drm_usb into udl

Daniel Vetter daniel at ffwll.ch
Fri Aug 29 06:06:21 PDT 2014


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 at 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 at 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
> 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch


More information about the dri-devel mailing list