From: John Bauer <johnebgood@xxxxxxxxxxxxxxxx> Made additional recommended changes from Ricardo. Relative controls are now checked with helper function is_relative_ptz_ctrl(). Signed-off-by: John Bauer <johnebgood@xxxxxxxxxxxxxxxx> --- drivers/media/usb/uvc/uvc_ctrl.c | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c index 04300a782c81..34a9a29b0754 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -441,7 +441,6 @@ static s32 uvc_ctrl_get_rel_speed(struct uvc_control_mapping *mapping, return (rel == 0) ? 0 : (rel > 0 ? data[first+1] : -data[first+1]); case UVC_GET_MIN: - return -data[first+1]; case UVC_GET_MAX: case UVC_GET_RES: case UVC_GET_DEF: @@ -1233,6 +1232,17 @@ static u32 uvc_get_ctrl_bitmap(struct uvc_control *ctrl, return ~0; } +static bool is_relative_ptz_ctrl(__u32 ctrl_id) +{ + switch (ctrl_id) { + case V4L2_CID_ZOOM_CONTINUOUS: + case V4L2_CID_PAN_SPEED: + case V4L2_CID_TILT_SPEED: + return true; + } + return false; +} + static int __uvc_query_v4l2_ctrl(struct uvc_video_chain *chain, struct uvc_control *ctrl, struct uvc_control_mapping *mapping, @@ -1327,22 +1337,16 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_chain *chain, uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MAX)); if (ctrl->info.flags & UVC_CTRL_FLAG_GET_MIN) { - switch (v4l2_ctrl->id) { - case V4L2_CID_ZOOM_CONTINUOUS: - case V4L2_CID_PAN_SPEED: - case V4L2_CID_TILT_SPEED: - /* - * For the relative speed implementation the minimum - * value cannot be probed so it becomes the additive - * inverse of maximum. - */ + /* + * For the relative speed implementation the minimum + * value cannot be probed so it becomes the additive + * inverse of maximum. + */ + if (is_relative_ptz_ctrl(v4l2_ctrl->id)) v4l2_ctrl->minimum = -v4l2_ctrl->maximum; - break; - default: + else v4l2_ctrl->minimum = mapping->get(mapping, UVC_GET_MIN, uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MIN)); - break; - } } if (ctrl->info.flags & UVC_CTRL_FLAG_GET_RES) @@ -1935,14 +1939,8 @@ int uvc_ctrl_set(struct uvc_fh *handle, * value cannot be probed so it becomes the additive * inverse of maximum. */ - switch (xctrl->id) { - case V4L2_CID_ZOOM_CONTINUOUS: - case V4L2_CID_PAN_SPEED: - case V4L2_CID_TILT_SPEED: + if (is_relative_ptz_ctrl(xctrl->id)) min = -max; - default: - break; - } step = mapping->get(mapping, UVC_GET_RES, uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES)); -- 2.34.1