media: uvcvideo: Add missing value for power_line_frequency
authorRicardo Ribalda <ribalda@chromium.org>
Tue, 7 Jun 2022 13:43:58 +0000 (14:43 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Sat, 16 Jul 2022 07:49:38 +0000 (08:49 +0100)
UVC 1.5 class defines 4 values for this control on:
4.2.2.3.6 Power Line Frequency Control

Add the missing value when the UVC version is 1.5.

Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/usb/uvc/uvc_ctrl.c

index e1d5760..95fdd41 100644 (file)
@@ -366,6 +366,7 @@ static const struct uvc_menu_info power_line_frequency_controls[] = {
        { 0, "Disabled" },
        { 1, "50 Hz" },
        { 2, "60 Hz" },
+       { 3, "Auto" },
 };
 
 static const struct uvc_menu_info exposure_auto_controls[] = {
@@ -505,17 +506,6 @@ static const struct uvc_control_mapping uvc_ctrl_mappings[] = {
                .data_type      = UVC_CTRL_DATA_TYPE_UNSIGNED,
        },
        {
-               .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_count     = ARRAY_SIZE(power_line_frequency_controls),
-       },
-       {
                .id             = V4L2_CID_HUE_AUTO,
                .entity         = UVC_GUID_UVC_PROCESSING,
                .selector       = UVC_PU_HUE_AUTO_CONTROL,
@@ -730,6 +720,34 @@ static const struct uvc_control_mapping uvc_ctrl_mappings[] = {
        },
 };
 
+static const struct uvc_control_mapping uvc_ctrl_mappings_uvc11[] = {
+       {
+               .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_count     = ARRAY_SIZE(power_line_frequency_controls) - 1,
+       },
+};
+
+static const struct uvc_control_mapping uvc_ctrl_mappings_uvc15[] = {
+       {
+               .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_count     = ARRAY_SIZE(power_line_frequency_controls),
+       },
+};
+
 /* ------------------------------------------------------------------------
  * Utility functions
  */
@@ -2426,6 +2444,22 @@ static void uvc_ctrl_init_ctrl(struct uvc_video_chain *chain,
        if (!ctrl->initialized)
                return;
 
+       /* Process common mappings first. */
+       for (; mapping < mend; ++mapping) {
+               if (uvc_entity_match_guid(ctrl->entity, mapping->entity) &&
+                   ctrl->info.selector == mapping->selector)
+                       __uvc_ctrl_add_mapping(chain, ctrl, mapping);
+       }
+
+       /* And then version-specific mappings. */
+       if (chain->dev->uvc_version < 0x0150) {
+               mapping = uvc_ctrl_mappings_uvc11;
+               mend = mapping + ARRAY_SIZE(uvc_ctrl_mappings_uvc11);
+       } else {
+               mapping = uvc_ctrl_mappings_uvc15;
+               mend = mapping + ARRAY_SIZE(uvc_ctrl_mappings_uvc15);
+       }
+
        for (; mapping < mend; ++mapping) {
                if (uvc_entity_match_guid(ctrl->entity, mapping->entity) &&
                    ctrl->info.selector == mapping->selector)