media: uvcvideo: Refactor power_line_frequency_controls_limited
authorRicardo Ribalda <ribalda@chromium.org>
Thu, 5 Jan 2023 13:52:56 +0000 (14:52 +0100)
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Sun, 15 Jan 2023 21:45:14 +0000 (23:45 +0200)
Move the control mapping to uvc_ctrl.c. This way we do not have
references to UVC controls or V4L2 controls in uvc_driver.c.

This also fixes a bug introduced in commit 382075604a68 ("media:
uvcvideo: Limit power line control for Quanta UVC Webcam"). The
offending commit caused the power line control menu entries to have
incorrect indices compared to the V4L2_CID_POWER_LINE_FREQUENCY_*
enumeration. Now that the limited mapping reuses the correct menu_info
array, the indices correctly map to the V4L2 control specification.

Fixes: 382075604a68 ("media: uvcvideo: Limit power line control for Quanta UVC Webcam")
Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
drivers/media/usb/uvc/uvc_ctrl.c
drivers/media/usb/uvc/uvc_driver.c
drivers/media/usb/uvc/uvcvideo.h

index af765d4..c15c384 100644 (file)
@@ -723,6 +723,19 @@ static const struct uvc_control_mapping uvc_ctrl_mappings[] = {
        },
 };
 
+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,
+       .size           = 2,
+       .offset         = 0,
+       .v4l2_type      = V4L2_CTRL_TYPE_MENU,
+       .data_type      = UVC_CTRL_DATA_TYPE_ENUM,
+       .menu_info      = power_line_frequency_controls,
+       .menu_mask      = GENMASK(V4L2_CID_POWER_LINE_FREQUENCY_60HZ,
+                                 V4L2_CID_POWER_LINE_FREQUENCY_50HZ),
+};
+
 static const struct uvc_control_mapping uvc_ctrl_power_line_mapping_uvc11 = {
        .id             = V4L2_CID_POWER_LINE_FREQUENCY,
        .entity         = UVC_GUID_UVC_PROCESSING,
index b4710e1..370b46c 100644 (file)
@@ -2358,24 +2358,6 @@ MODULE_PARM_DESC(timeout, "Streaming control requests timeout");
  * Driver initialization and cleanup
  */
 
-static const struct uvc_menu_info power_line_frequency_controls_limited[] = {
-       { 1, "50 Hz" },
-       { 2, "60 Hz" },
-};
-
-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,
-       .size           = 2,
-       .offset         = 0,
-       .v4l2_type      = V4L2_CTRL_TYPE_MENU,
-       .data_type      = UVC_CTRL_DATA_TYPE_ENUM,
-       .menu_info      = power_line_frequency_controls_limited,
-       .menu_mask      =
-               GENMASK(ARRAY_SIZE(power_line_frequency_controls_limited) - 1, 0),
-};
-
 static const struct uvc_device_info uvc_ctrl_power_line_limited = {
        .mappings = (const struct uvc_control_mapping *[]) {
                &uvc_ctrl_power_line_mapping_limited,
index e8f277e..6573df1 100644 (file)
@@ -745,6 +745,7 @@ 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 v4l2_subscribed_event_ops uvc_ctrl_sub_ev_ops;
 
 int uvc_query_v4l2_ctrl(struct uvc_video_chain *chain,