Re: [PATCH 5/5] media: uvcvideo: Remove PLF device quirking

From: Laurent Pinchart
Date: Mon Jun 10 2024 - 10:57:31 EST


Hi Ricardo,

Thank you for the patch.

On Mon, Mar 18, 2024 at 11:55:27PM +0000, Ricardo Ribalda wrote:
> We can use heuristics to figure out the proper range of the control
> instead of quirking every single device.
>
> Signed-off-by: Ricardo Ribalda <ribalda@xxxxxxxxxxxx>
> ---
> drivers/media/usb/uvc/uvc_ctrl.c | 4 +-
> drivers/media/usb/uvc/uvc_driver.c | 122 -------------------------------------
> drivers/media/usb/uvc/uvcvideo.h | 2 -
> 3 files changed, 2 insertions(+), 126 deletions(-)
>
> diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c
> index 41578ded1174e..11ba1e8ee25b8 100644
> --- a/drivers/media/usb/uvc/uvc_ctrl.c
> +++ b/drivers/media/usb/uvc/uvc_ctrl.c
> @@ -459,7 +459,7 @@ static void uvc_ctrl_set_rel_speed(struct uvc_control_mapping *mapping,
> data[first+1] = min_t(int, abs(value), 0xff);
> }
>
> -const struct uvc_control_mapping uvc_ctrl_power_line_mapping_limited = {
> +static const struct uvc_control_mapping uvc_ctrl_power_line_mapping_limited = {
> .id = V4L2_CID_POWER_LINE_FREQUENCY,
> .entity = UVC_GUID_UVC_PROCESSING,
> .selector = UVC_PU_POWER_LINE_FREQUENCY_CONTROL,
> @@ -471,7 +471,7 @@ const struct uvc_control_mapping uvc_ctrl_power_line_mapping_limited = {
> V4L2_CID_POWER_LINE_FREQUENCY_50HZ),
> };
>
> -const struct uvc_control_mapping uvc_ctrl_power_line_mapping_uvc11 = {
> +static const struct uvc_control_mapping uvc_ctrl_power_line_mapping_uvc11 = {
> .id = V4L2_CID_POWER_LINE_FREQUENCY,
> .entity = UVC_GUID_UVC_PROCESSING,
> .selector = UVC_PU_POWER_LINE_FREQUENCY_CONTROL,
> diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c
> index bbd90123a4e76..5f689fee60a9e 100644
> --- a/drivers/media/usb/uvc/uvc_driver.c
> +++ b/drivers/media/usb/uvc/uvc_driver.c
> @@ -2383,20 +2383,6 @@ MODULE_PARM_DESC(timeout, "Streaming control requests timeout");
> * Driver initialization and cleanup
> */
>
> -static const struct uvc_device_info uvc_ctrl_power_line_limited = {
> - .mappings = (const struct uvc_control_mapping *[]) {
> - &uvc_ctrl_power_line_mapping_limited,
> - NULL, /* Sentinel */
> - },

I think you can drop the mappings field from the uvc_device_info
structure, as well as the corresponding code in uvc_ctrl_init_ctrl().

> -};
> -
> -static const struct uvc_device_info uvc_ctrl_power_line_uvc11 = {
> - .mappings = (const struct uvc_control_mapping *[]) {
> - &uvc_ctrl_power_line_mapping_uvc11,
> - NULL, /* Sentinel */
> - },
> -};
> -
> static const struct uvc_device_info uvc_quirk_probe_minmax = {
> .quirks = UVC_QUIRK_PROBE_MINMAX,
> };
> @@ -2427,33 +2413,6 @@ static const struct uvc_device_info uvc_quirk_force_y8 = {
> * though they are compliant.
> */
> static const struct usb_device_id uvc_ids[] = {
> - /* Quanta USB2.0 HD UVC Webcam */
> - { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
> - | USB_DEVICE_ID_MATCH_INT_INFO,
> - .idVendor = 0x0408,
> - .idProduct = 0x3090,
> - .bInterfaceClass = USB_CLASS_VIDEO,
> - .bInterfaceSubClass = 1,
> - .bInterfaceProtocol = 0,
> - .driver_info = (kernel_ulong_t)&uvc_ctrl_power_line_limited },
> - /* Quanta USB2.0 HD UVC Webcam */
> - { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
> - | USB_DEVICE_ID_MATCH_INT_INFO,
> - .idVendor = 0x0408,
> - .idProduct = 0x4030,
> - .bInterfaceClass = USB_CLASS_VIDEO,
> - .bInterfaceSubClass = 1,
> - .bInterfaceProtocol = 0,
> - .driver_info = (kernel_ulong_t)&uvc_ctrl_power_line_limited },
> - /* Quanta USB2.0 HD UVC Webcam */
> - { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
> - | USB_DEVICE_ID_MATCH_INT_INFO,
> - .idVendor = 0x0408,
> - .idProduct = 0x4034,
> - .bInterfaceClass = USB_CLASS_VIDEO,
> - .bInterfaceSubClass = 1,
> - .bInterfaceProtocol = UVC_PC_PROTOCOL_15,
> - .driver_info = (kernel_ulong_t)&uvc_ctrl_power_line_limited },
> /* LogiLink Wireless Webcam */
> { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
> | USB_DEVICE_ID_MATCH_INT_INFO,
> @@ -2583,42 +2542,6 @@ static const struct usb_device_id uvc_ids[] = {
> .bInterfaceSubClass = 1,
> .bInterfaceProtocol = 0,
> .driver_info = UVC_INFO_QUIRK(UVC_QUIRK_RESTRICT_FRAME_RATE) },
> - /* Chicony EasyCamera */
> - { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
> - | USB_DEVICE_ID_MATCH_INT_INFO,
> - .idVendor = 0x04f2,
> - .idProduct = 0xb5eb,
> - .bInterfaceClass = USB_CLASS_VIDEO,
> - .bInterfaceSubClass = 1,
> - .bInterfaceProtocol = 0,
> - .driver_info = (kernel_ulong_t)&uvc_ctrl_power_line_limited },
> - /* Chicony Electronics Co., Ltd Integrated Camera */
> - { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
> - | USB_DEVICE_ID_MATCH_INT_INFO,
> - .idVendor = 0x04f2,
> - .idProduct = 0xb67c,
> - .bInterfaceClass = USB_CLASS_VIDEO,
> - .bInterfaceSubClass = 1,
> - .bInterfaceProtocol = UVC_PC_PROTOCOL_15,
> - .driver_info = (kernel_ulong_t)&uvc_ctrl_power_line_uvc11 },
> - /* Chicony EasyCamera */
> - { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
> - | USB_DEVICE_ID_MATCH_INT_INFO,
> - .idVendor = 0x04f2,
> - .idProduct = 0xb6ba,
> - .bInterfaceClass = USB_CLASS_VIDEO,
> - .bInterfaceSubClass = 1,
> - .bInterfaceProtocol = 0,
> - .driver_info = (kernel_ulong_t)&uvc_ctrl_power_line_limited },
> - /* Chicony EasyCamera */
> - { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
> - | USB_DEVICE_ID_MATCH_INT_INFO,
> - .idVendor = 0x04f2,
> - .idProduct = 0xb746,
> - .bInterfaceClass = USB_CLASS_VIDEO,
> - .bInterfaceSubClass = 1,
> - .bInterfaceProtocol = 0,
> - .driver_info = (kernel_ulong_t)&uvc_ctrl_power_line_limited },
> /* Alcor Micro AU3820 (Future Boy PC USB Webcam) */
> { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
> | USB_DEVICE_ID_MATCH_INT_INFO,
> @@ -3003,51 +2926,6 @@ static const struct usb_device_id uvc_ids[] = {
> .bInterfaceSubClass = 1,
> .bInterfaceProtocol = 0,
> .driver_info = UVC_INFO_QUIRK(UVC_QUIRK_FORCE_BPP) },
> - /* SunplusIT Inc HD Camera */
> - { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
> - | USB_DEVICE_ID_MATCH_INT_INFO,
> - .idVendor = 0x2b7e,
> - .idProduct = 0xb752,
> - .bInterfaceClass = USB_CLASS_VIDEO,
> - .bInterfaceSubClass = 1,
> - .bInterfaceProtocol = UVC_PC_PROTOCOL_15,
> - .driver_info = (kernel_ulong_t)&uvc_ctrl_power_line_uvc11 },
> - /* Lenovo Integrated Camera */
> - { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
> - | USB_DEVICE_ID_MATCH_INT_INFO,
> - .idVendor = 0x30c9,
> - .idProduct = 0x0093,
> - .bInterfaceClass = USB_CLASS_VIDEO,
> - .bInterfaceSubClass = 1,
> - .bInterfaceProtocol = UVC_PC_PROTOCOL_15,
> - .driver_info = (kernel_ulong_t)&uvc_ctrl_power_line_uvc11 },
> - /* Sonix Technology USB 2.0 Camera */
> - { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
> - | USB_DEVICE_ID_MATCH_INT_INFO,
> - .idVendor = 0x3277,
> - .idProduct = 0x0072,
> - .bInterfaceClass = USB_CLASS_VIDEO,
> - .bInterfaceSubClass = 1,
> - .bInterfaceProtocol = 0,
> - .driver_info = (kernel_ulong_t)&uvc_ctrl_power_line_limited },
> - /* Acer EasyCamera */
> - { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
> - | USB_DEVICE_ID_MATCH_INT_INFO,
> - .idVendor = 0x5986,
> - .idProduct = 0x1172,
> - .bInterfaceClass = USB_CLASS_VIDEO,
> - .bInterfaceSubClass = 1,
> - .bInterfaceProtocol = 0,
> - .driver_info = (kernel_ulong_t)&uvc_ctrl_power_line_limited },
> - /* Acer EasyCamera */
> - { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
> - | USB_DEVICE_ID_MATCH_INT_INFO,
> - .idVendor = 0x5986,
> - .idProduct = 0x1180,
> - .bInterfaceClass = USB_CLASS_VIDEO,
> - .bInterfaceSubClass = 1,
> - .bInterfaceProtocol = 0,
> - .driver_info = (kernel_ulong_t)&uvc_ctrl_power_line_limited },
> /* Intel D410/ASR depth camera */
> { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
> | USB_DEVICE_ID_MATCH_INT_INFO,
> diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvideo.h
> index 611350a82c37f..896bb7362fa27 100644
> --- a/drivers/media/usb/uvc/uvcvideo.h
> +++ b/drivers/media/usb/uvc/uvcvideo.h
> @@ -751,8 +751,6 @@ int uvc_status_start(struct uvc_device *dev, gfp_t flags);
> void uvc_status_stop(struct uvc_device *dev);
>
> /* Controls */
> -extern const struct uvc_control_mapping uvc_ctrl_power_line_mapping_limited;
> -extern const struct uvc_control_mapping uvc_ctrl_power_line_mapping_uvc11;
> extern const struct v4l2_subscribed_event_ops uvc_ctrl_sub_ev_ops;
>
> int uvc_query_v4l2_ctrl(struct uvc_video_chain *chain,
>

--
Regards,

Laurent Pinchart