@@ -362,12 +362,19 @@ static const u32 uvc_control_classes[] = {
V4L2_CID_USER_CLASS,
};
-static const struct uvc_menu_info power_line_frequency_controls[] = {
+static const struct uvc_menu_info power_line_frequency_controls_uvc11[] = {
{ 0, "Disabled" },
{ 1, "50 Hz" },
{ 2, "60 Hz" },
};
+static const struct uvc_menu_info power_line_frequency_controls_uvc15[] = {
+ { 0, "Disabled" },
+ { 1, "50 Hz" },
+ { 2, "60 Hz" },
+ { 3, "Auto" },
+};
+
static const struct uvc_menu_info exposure_auto_controls[] = {
{ 2, "Auto Mode" },
{ 1, "Manual Mode" },
@@ -504,17 +511,6 @@ static const struct uvc_control_mapping uvc_ctrl_mappings[] = {
.v4l2_type = V4L2_CTRL_TYPE_INTEGER,
.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,
@@ -730,6 +726,32 @@ static const struct uvc_control_mapping uvc_ctrl_mappings[] = {
},
};
+static const
+struct uvc_control_mapping power_line_mapping_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_uvc11,
+ .menu_count = ARRAY_SIZE(power_line_frequency_controls_uvc11),
+};
+
+static const
+struct uvc_control_mapping power_line_mapping_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_uvc15,
+ .menu_count = ARRAY_SIZE(power_line_frequency_controls_uvc15),
+};
+
/* ------------------------------------------------------------------------
* Utility functions
*/
@@ -2366,6 +2388,22 @@ static void uvc_ctrl_prune_entity(struct uvc_device *dev,
}
}
+/*
+ * The powerline control has different valid values depending on the
+ * uvc version.
+ */
+static void uvc_ctrl_init_powerline(struct uvc_video_chain *chain,
+ struct uvc_control *ctrl)
+{
+ if (chain->dev->uvc_version < 0x0150) {
+ __uvc_ctrl_add_mapping(chain, ctrl,
+ &power_line_mapping_uvc11);
+ return;
+ }
+
+ __uvc_ctrl_add_mapping(chain, ctrl, &power_line_mapping_uvc15);
+}
+
/*
* Add control information and hardcoded stock control mappings to the given
* device.
@@ -2375,6 +2413,7 @@ static void uvc_ctrl_init_ctrl(struct uvc_video_chain *chain,
{
const struct uvc_control_info *info = uvc_ctrls;
const struct uvc_control_info *iend = info + ARRAY_SIZE(uvc_ctrls);
+ static const u8 uvc_processing_guid[16] = UVC_GUID_UVC_PROCESSING;
const struct uvc_control_mapping *mapping = uvc_ctrl_mappings;
const struct uvc_control_mapping *mend =
mapping + ARRAY_SIZE(uvc_ctrl_mappings);
@@ -2405,6 +2444,10 @@ static void uvc_ctrl_init_ctrl(struct uvc_video_chain *chain,
if (!ctrl->initialized)
return;
+ if (uvc_entity_match_guid(ctrl->entity, uvc_processing_guid) &&
+ ctrl->info.selector == UVC_PU_POWER_LINE_FREQUENCY_CONTROL)
+ return uvc_ctrl_init_powerline(chain, ctrl);
+
for (; mapping < mend; ++mapping) {
if (uvc_entity_match_guid(ctrl->entity, mapping->entity) &&
ctrl->info.selector == mapping->selector)
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> --- v2: Thanks Laurent uvc 1.1 only has 3 values, do not break those devices. drivers/media/usb/uvc/uvc_ctrl.c | 67 ++++++++++++++++++++++++++------ 1 file changed, 55 insertions(+), 12 deletions(-)