| From 93df48d37c3f03886d84831992926333e7810640 Mon Sep 17 00:00:00 2001 |
| From: Hans de Goede <hdegoede@redhat.com> |
| Date: Tue, 28 Jul 2020 13:22:08 +0200 |
| Subject: media: uvcvideo: Fix uvc_ctrl_fixup_xu_info() not having any effect |
| |
| From: Hans de Goede <hdegoede@redhat.com> |
| |
| commit 93df48d37c3f03886d84831992926333e7810640 upstream. |
| |
| uvc_ctrl_add_info() calls uvc_ctrl_get_flags() which will override |
| the fixed-up flags set by uvc_ctrl_fixup_xu_info(). |
| |
| uvc_ctrl_init_xu_ctrl() already calls uvc_ctrl_get_flags() before |
| calling uvc_ctrl_add_info(), so the uvc_ctrl_get_flags() call in |
| uvc_ctrl_add_info() is not necessary for xu ctrls. |
| |
| This commit moves the uvc_ctrl_get_flags() call for normal controls |
| from uvc_ctrl_add_info() to uvc_ctrl_init_ctrl(), so that we no longer |
| call uvc_ctrl_get_flags() twice for xu controls and so that we no longer |
| override the fixed-up flags set by uvc_ctrl_fixup_xu_info(). |
| |
| This fixes the xu motor controls not working properly on a Logitech |
| 046d:08cc, and presumably also on the other Logitech models which have |
| a quirk for this in the uvc_ctrl_fixup_xu_info() function. |
| |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Hans de Goede <hdegoede@redhat.com> |
| Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/media/usb/uvc/uvc_ctrl.c | 14 +++++++------- |
| 1 file changed, 7 insertions(+), 7 deletions(-) |
| |
| --- a/drivers/media/usb/uvc/uvc_ctrl.c |
| +++ b/drivers/media/usb/uvc/uvc_ctrl.c |
| @@ -2033,13 +2033,6 @@ static int uvc_ctrl_add_info(struct uvc_ |
| goto done; |
| } |
| |
| - /* |
| - * Retrieve control flags from the device. Ignore errors and work with |
| - * default flag values from the uvc_ctrl array when the device doesn't |
| - * properly implement GET_INFO on standard controls. |
| - */ |
| - uvc_ctrl_get_flags(dev, ctrl, &ctrl->info); |
| - |
| ctrl->initialized = 1; |
| |
| uvc_trace(UVC_TRACE_CONTROL, "Added control %pUl/%u to device %s " |
| @@ -2262,6 +2255,13 @@ static void uvc_ctrl_init_ctrl(struct uv |
| if (uvc_entity_match_guid(ctrl->entity, info->entity) && |
| ctrl->index == info->index) { |
| uvc_ctrl_add_info(dev, ctrl, info); |
| + /* |
| + * Retrieve control flags from the device. Ignore errors |
| + * and work with default flag values from the uvc_ctrl |
| + * array when the device doesn't properly implement |
| + * GET_INFO on standard controls. |
| + */ |
| + uvc_ctrl_get_flags(dev, ctrl, &ctrl->info); |
| break; |
| } |
| } |