[PATCH v2 3/3] drm/udl: Retrieve USB device from struct drm_device.dev

Daniel Vetter daniel at ffwll.ch
Tue Nov 3 10:56:50 UTC 2020


On Tue, Nov 03, 2020 at 11:36:56AM +0100, Thomas Zimmermann wrote:
> Drop the driver's udev field in favor of struct drm_device.dev. No
> functional changes made.
> 
> v2:
> 	* upcast dev with drm_dev_get_usb_device()

Again, witht that helper either moved to udl_drv.h or to usb code:

Acked-by: Daniel Vetter <daniel.vetter at ffwll.ch>

> 
> Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
> ---
>  drivers/gpu/drm/udl/udl_connector.c |  9 +++++----
>  drivers/gpu/drm/udl/udl_drv.c       |  3 ---
>  drivers/gpu/drm/udl/udl_drv.h       |  1 -
>  drivers/gpu/drm/udl/udl_main.c      | 25 ++++++++++++++-----------
>  4 files changed, 19 insertions(+), 19 deletions(-)
> 
> diff --git a/drivers/gpu/drm/udl/udl_connector.c b/drivers/gpu/drm/udl/udl_connector.c
> index cdc1c42e1669..487e03e1727c 100644
> --- a/drivers/gpu/drm/udl/udl_connector.c
> +++ b/drivers/gpu/drm/udl/udl_connector.c
> @@ -10,6 +10,7 @@
>  #include <drm/drm_atomic_state_helper.h>
>  #include <drm/drm_crtc_helper.h>
>  #include <drm/drm_probe_helper.h>
> +#include <drm/drm_usb_helper.h>
>  
>  #include "udl_connector.h"
>  #include "udl_drv.h"
> @@ -20,6 +21,7 @@ static int udl_get_edid_block(void *data, u8 *buf, unsigned int block,
>  	int ret, i;
>  	u8 *read_buff;
>  	struct udl_device *udl = data;
> +	struct usb_device *udev = drm_dev_get_usb_device(&udl->drm);
>  
>  	read_buff = kmalloc(2, GFP_KERNEL);
>  	if (!read_buff)
> @@ -27,10 +29,9 @@ static int udl_get_edid_block(void *data, u8 *buf, unsigned int block,
>  
>  	for (i = 0; i < len; i++) {
>  		int bval = (i + block * EDID_LENGTH) << 8;
> -		ret = usb_control_msg(udl->udev,
> -				      usb_rcvctrlpipe(udl->udev, 0),
> -					  (0x02), (0x80 | (0x02 << 5)), bval,
> -					  0xA1, read_buff, 2, HZ);
> +		ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
> +				      0x02, (0x80 | (0x02 << 5)), bval,
> +				      0xA1, read_buff, 2, HZ);
>  		if (ret < 1) {
>  			DRM_ERROR("Read EDID byte %d failed err %x\n", i, ret);
>  			kfree(read_buff);
> diff --git a/drivers/gpu/drm/udl/udl_drv.c b/drivers/gpu/drm/udl/udl_drv.c
> index 96d4317a2c1b..993469d152da 100644
> --- a/drivers/gpu/drm/udl/udl_drv.c
> +++ b/drivers/gpu/drm/udl/udl_drv.c
> @@ -53,7 +53,6 @@ static struct drm_driver driver = {
>  
>  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;
>  
> @@ -62,8 +61,6 @@ static struct udl_device *udl_driver_create(struct usb_interface *interface)
>  	if (IS_ERR(udl))
>  		return udl;
>  
> -	udl->udev = udev;
> -
>  	r = udl_init(udl);
>  	if (r)
>  		return ERR_PTR(r);
> diff --git a/drivers/gpu/drm/udl/udl_drv.h b/drivers/gpu/drm/udl/udl_drv.h
> index b1461f30780b..889bfa21deb0 100644
> --- a/drivers/gpu/drm/udl/udl_drv.h
> +++ b/drivers/gpu/drm/udl/udl_drv.h
> @@ -50,7 +50,6 @@ struct urb_list {
>  struct udl_device {
>  	struct drm_device drm;
>  	struct device *dev;
> -	struct usb_device *udev;
>  
>  	struct drm_simple_display_pipe display_pipe;
>  
> diff --git a/drivers/gpu/drm/udl/udl_main.c b/drivers/gpu/drm/udl/udl_main.c
> index f5d27f2a5654..208505a39ace 100644
> --- a/drivers/gpu/drm/udl/udl_main.c
> +++ b/drivers/gpu/drm/udl/udl_main.c
> @@ -11,6 +11,7 @@
>  #include <drm/drm.h>
>  #include <drm/drm_print.h>
>  #include <drm/drm_probe_helper.h>
> +#include <drm/drm_usb_helper.h>
>  
>  #include "udl_drv.h"
>  
> @@ -26,10 +27,10 @@
>  #define GET_URB_TIMEOUT	HZ
>  #define FREE_URB_TIMEOUT (HZ*2)
>  
> -static int udl_parse_vendor_descriptor(struct drm_device *dev,
> -				       struct usb_device *usbdev)
> +static int udl_parse_vendor_descriptor(struct udl_device *udl)
>  {
> -	struct udl_device *udl = to_udl(dev);
> +	struct drm_device *dev = &udl->drm;
> +	struct usb_device *udev = drm_dev_get_usb_device(dev);
>  	char *desc;
>  	char *buf;
>  	char *desc_end;
> @@ -41,7 +42,7 @@ static int udl_parse_vendor_descriptor(struct drm_device *dev,
>  		return false;
>  	desc = buf;
>  
> -	total_len = usb_get_descriptor(usbdev, 0x5f, /* vendor specific */
> +	total_len = usb_get_descriptor(udev, 0x5f, /* vendor specific */
>  				    0, desc, MAX_VENDOR_DESCRIPTOR_SIZE);
>  	if (total_len > 5) {
>  		DRM_INFO("vendor descriptor length:%x data:%11ph\n",
> @@ -98,19 +99,20 @@ static int udl_parse_vendor_descriptor(struct drm_device *dev,
>   */
>  static int udl_select_std_channel(struct udl_device *udl)
>  {
> -	int ret;
>  	static const u8 set_def_chn[] = {0x57, 0xCD, 0xDC, 0xA7,
>  					 0x1C, 0x88, 0x5E, 0x15,
>  					 0x60, 0xFE, 0xC6, 0x97,
>  					 0x16, 0x3D, 0x47, 0xF2};
> +
>  	void *sendbuf;
> +	int ret;
> +	struct usb_device *udev = drm_dev_get_usb_device(&udl->drm);
>  
>  	sendbuf = kmemdup(set_def_chn, sizeof(set_def_chn), GFP_KERNEL);
>  	if (!sendbuf)
>  		return -ENOMEM;
>  
> -	ret = usb_control_msg(udl->udev,
> -			      usb_sndctrlpipe(udl->udev, 0),
> +	ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
>  			      NR_USB_REQUEST_CHANNEL,
>  			      (USB_DIR_OUT | USB_TYPE_VENDOR), 0, 0,
>  			      sendbuf, sizeof(set_def_chn),
> @@ -202,6 +204,7 @@ static int udl_alloc_urb_list(struct drm_device *dev, int count, size_t size)
>  	struct urb_node *unode;
>  	char *buf;
>  	size_t wanted_size = count * size;
> +	struct usb_device *udev = drm_dev_get_usb_device(&udl->drm);
>  
>  	spin_lock_init(&udl->urbs.lock);
>  
> @@ -229,7 +232,7 @@ static int udl_alloc_urb_list(struct drm_device *dev, int count, size_t size)
>  		}
>  		unode->urb = urb;
>  
> -		buf = usb_alloc_coherent(udl->udev, size, GFP_KERNEL,
> +		buf = usb_alloc_coherent(udev, size, GFP_KERNEL,
>  					 &urb->transfer_dma);
>  		if (!buf) {
>  			kfree(unode);
> @@ -243,8 +246,8 @@ 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->udev, usb_sndbulkpipe(udl->udev, 1),
> -			buf, size, udl_urb_completion, unode);
> +		usb_fill_bulk_urb(urb, udev, usb_sndbulkpipe(udev, 1),
> +				  buf, size, udl_urb_completion, unode);
>  		urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
>  
>  		list_add_tail(&unode->entry, &udl->urbs.list);
> @@ -316,7 +319,7 @@ int udl_init(struct udl_device *udl)
>  
>  	mutex_init(&udl->gem_lock);
>  
> -	if (!udl_parse_vendor_descriptor(dev, udl->udev)) {
> +	if (!udl_parse_vendor_descriptor(udl)) {
>  		ret = -ENODEV;
>  		DRM_ERROR("firmware not recognized. Assume incompatible device\n");
>  		goto err;
> -- 
> 2.29.0
> 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


More information about the dri-devel mailing list