From nobody Mon Apr 27 03:19:14 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C5BD7C433EF for ; Fri, 17 Jun 2022 23:56:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1382668AbiFQX4a (ORCPT ); Fri, 17 Jun 2022 19:56:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50988 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235867AbiFQX4P (ORCPT ); Fri, 17 Jun 2022 19:56:15 -0400 Received: from mail-ed1-x52e.google.com (mail-ed1-x52e.google.com [IPv6:2a00:1450:4864:20::52e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5F92C54195 for ; Fri, 17 Jun 2022 16:56:14 -0700 (PDT) Received: by mail-ed1-x52e.google.com with SMTP id o10so8062095edi.1 for ; Fri, 17 Jun 2022 16:56:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=XGyvgzMv/o67vUhjuadDgOPqP6bhpgbwlijxZc2E+uw=; b=LP7WqlQcTCQrr6X3k4GSlkNW2hhRAOd5wxFafKA1jUlJdUy1jJq6cRySyriytN2jpJ 0eT2HeQYXGlDjosKyRxec2chetVVzCU0czgjx9jhEHPmbwOAVsEnVgVk2DW/3jaYrxoZ epT1EqBf7K2r4ZiLv3bVKwg6u+Lz5KiEhb2w4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=XGyvgzMv/o67vUhjuadDgOPqP6bhpgbwlijxZc2E+uw=; b=QIrCz47jWAnndwV7Fv1ecJ3azsRTzudQPoaic/H0UAinQN4vHEnxaKk2wR8DyNi4lE dBMlArhIvZGwsjtM4cwyIIEb80wCjH4yBJ3vMZLZuOzHd+b1a/jW18rdWlOCxaQswCMk v9w2qh+k9K2QMWdGJjVgUeOyn+rcYx5Hj0cpKm9tISU/apxPOEhWfGYB+qBC8OtxgWiY ShOdTImWZW0QantAwfHUPar7/OoyRvpDN4yZgLCjRncBf/5DueEQcJfm9paO8gU0ZvhA rKi2TYW22lJKmTopPro4HhHz6VYzb6+VN8vDcLHXgKuDQqQXxl0VDsWe407stGdUslYL rrdg== X-Gm-Message-State: AJIora/GwoFi58pw67tlYPellvCC+30je78j6NqMRLAAcQMylddtof3p DxeX4elsVBZxSy1zO2J/gVTZPg== X-Google-Smtp-Source: AGRyM1tJGH6oMZrjLMSMpk5XR2asvL1lPSg4xxY9zB68xl7XOrnUIZwfRaIBY/JEhCXSiXdH4cDbEw== X-Received: by 2002:a05:6402:2211:b0:42d:cb9e:cbf with SMTP id cq17-20020a056402221100b0042dcb9e0cbfmr15566816edb.76.1655510172931; Fri, 17 Jun 2022 16:56:12 -0700 (PDT) Received: from alco.lan (80.71.134.83.ipv4.parknet.dk. [80.71.134.83]) by smtp.gmail.com with ESMTPSA id z21-20020aa7d415000000b0043566884333sm1452538edq.63.2022.06.17.16.56.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jun 2022 16:56:12 -0700 (PDT) From: Ricardo Ribalda To: Laurent Pinchart , Mauro Carvalho Chehab , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, tfiga@chromium.org, senozhatsky@chromium.org, yunkec@google.com Cc: Ricardo Ribalda Subject: [PATCH v8 1/9] media: uvcvideo: Add missing value for power_line_frequency Date: Sat, 18 Jun 2022 01:56:02 +0200 Message-Id: <20220617235610.321917-2-ribalda@chromium.org> X-Mailer: git-send-email 2.37.0.rc0.104.g0611611a94-goog In-Reply-To: <20220617235610.321917-1-ribalda@chromium.org> References: <20220617235610.321917-1-ribalda@chromium.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" 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 Signed-off-by: Laurent Pinchart --- drivers/media/usb/uvc/uvc_ctrl.c | 56 +++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 11 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_c= trl.c index 0e78233fc8a0..a709ebbb4d69 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -366,6 +366,7 @@ static const struct uvc_menu_info power_line_frequency_= controls[] =3D { { 0, "Disabled" }, { 1, "50 Hz" }, { 2, "60 Hz" }, + { 3, "Auto" }, }; =20 static const struct uvc_menu_info exposure_auto_controls[] =3D { @@ -504,17 +505,6 @@ static const struct uvc_control_mapping uvc_ctrl_mappi= ngs[] =3D { .v4l2_type =3D V4L2_CTRL_TYPE_INTEGER, .data_type =3D UVC_CTRL_DATA_TYPE_UNSIGNED, }, - { - .id =3D V4L2_CID_POWER_LINE_FREQUENCY, - .entity =3D UVC_GUID_UVC_PROCESSING, - .selector =3D UVC_PU_POWER_LINE_FREQUENCY_CONTROL, - .size =3D 2, - .offset =3D 0, - .v4l2_type =3D V4L2_CTRL_TYPE_MENU, - .data_type =3D UVC_CTRL_DATA_TYPE_ENUM, - .menu_info =3D power_line_frequency_controls, - .menu_count =3D ARRAY_SIZE(power_line_frequency_controls), - }, { .id =3D V4L2_CID_HUE_AUTO, .entity =3D UVC_GUID_UVC_PROCESSING, @@ -730,6 +720,34 @@ static const struct uvc_control_mapping uvc_ctrl_mappi= ngs[] =3D { }, }; =20 +static const struct uvc_control_mapping uvc_ctrl_mappings_uvc11[] =3D { + { + .id =3D V4L2_CID_POWER_LINE_FREQUENCY, + .entity =3D UVC_GUID_UVC_PROCESSING, + .selector =3D UVC_PU_POWER_LINE_FREQUENCY_CONTROL, + .size =3D 2, + .offset =3D 0, + .v4l2_type =3D V4L2_CTRL_TYPE_MENU, + .data_type =3D UVC_CTRL_DATA_TYPE_ENUM, + .menu_info =3D power_line_frequency_controls, + .menu_count =3D ARRAY_SIZE(power_line_frequency_controls) - 1, + }, +}; + +static const struct uvc_control_mapping uvc_ctrl_mappings_uvc15[] =3D { + { + .id =3D V4L2_CID_POWER_LINE_FREQUENCY, + .entity =3D UVC_GUID_UVC_PROCESSING, + .selector =3D UVC_PU_POWER_LINE_FREQUENCY_CONTROL, + .size =3D 2, + .offset =3D 0, + .v4l2_type =3D V4L2_CTRL_TYPE_MENU, + .data_type =3D UVC_CTRL_DATA_TYPE_ENUM, + .menu_info =3D power_line_frequency_controls, + .menu_count =3D ARRAY_SIZE(power_line_frequency_controls), + }, +}; + /* ------------------------------------------------------------------------ * Utility functions */ @@ -2415,6 +2433,22 @@ static void uvc_ctrl_init_ctrl(struct uvc_video_chai= n *chain, if (!ctrl->initialized) return; =20 + /* Process common mappings first. */ + for (; mapping < mend; ++mapping) { + if (uvc_entity_match_guid(ctrl->entity, mapping->entity) && + ctrl->info.selector =3D=3D mapping->selector) + __uvc_ctrl_add_mapping(chain, ctrl, mapping); + } + + /* And then version-specific mappings. */ + if (chain->dev->uvc_version < 0x0150) { + mapping =3D uvc_ctrl_mappings_uvc11; + mend =3D mapping + ARRAY_SIZE(uvc_ctrl_mappings_uvc11); + } else { + mapping =3D uvc_ctrl_mappings_uvc15; + mend =3D mapping + ARRAY_SIZE(uvc_ctrl_mappings_uvc15); + } + for (; mapping < mend; ++mapping) { if (uvc_entity_match_guid(ctrl->entity, mapping->entity) && ctrl->info.selector =3D=3D mapping->selector) --=20 2.37.0.rc0.104.g0611611a94-goog From nobody Mon Apr 27 03:19:14 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8DFA7C43334 for ; Fri, 17 Jun 2022 23:56:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1383273AbiFQX4e (ORCPT ); Fri, 17 Jun 2022 19:56:34 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50998 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237557AbiFQX4Q (ORCPT ); Fri, 17 Jun 2022 19:56:16 -0400 Received: from mail-ej1-x62c.google.com (mail-ej1-x62c.google.com [IPv6:2a00:1450:4864:20::62c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 35A6E4BBA5 for ; Fri, 17 Jun 2022 16:56:15 -0700 (PDT) Received: by mail-ej1-x62c.google.com with SMTP id v1so11323959ejg.13 for ; Fri, 17 Jun 2022 16:56:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=cTvpiA1ZR8U86goCmlr+HfJiNGZOCmT5oj2favFUYLQ=; b=mmZtlQMGzNCjNQcv1eiLgD4N0okaAEzkDLg2T816Ydsp/aqrt1gynFn9IbR10J0kMK ZoKHJuJqwJvu/rKGd2qhUtN/kEtd0v6DRVKf7SIHAGsfzA5XdOPfUmtK9a68uBKB30kO nhS15u+yddeKPuOaAZd8sPI/m9mK5nJbw//7U= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=cTvpiA1ZR8U86goCmlr+HfJiNGZOCmT5oj2favFUYLQ=; b=7MvYaGiFsTJB1ChK3z2MqFlYTYCU7krAhQCFVu3R4WGw59cr6mnQhQnHZ4i5sR/puG i3bipd5jLHaWXGSIouse04eZkhZINKlX4KfB9YygyVuXsRErTcE8LqAT0aZNtiUdtyxd Dkpes7sAGc+cfHaO+pjgXIFqeGtVyecxhbK7USksAW/W0q9iNJ+SoweQtT9iX8Ho2e9d FftY8R0fHvoHoeairXZdgcjl67NrtXLjn53PkP5WKokLSBvpBUnoPHx0MJiTYR5zDY3n 76pnOccfYHKEAyKdArNtpEnJFgxfOxLy9f74Q5Ex00uT2r6NC02KLuWl2PU1kBTuWAqE vKXQ== X-Gm-Message-State: AJIora/1XrooXV9DLI83p/1VSdNoVpKVUc2ldQ2Bgb4K14HbaRQcklms 8YTFEo2jDWdmtn/eNg7ZyNbOgw== X-Google-Smtp-Source: AGRyM1vse0uGK1yWxGhb3BsOpxdtQXZjfNnlbuQsl4ZsUJZ7mUmiQA7UCBYBt+R7/6rjeT2czFMlDw== X-Received: by 2002:a17:907:9005:b0:715:76ce:4476 with SMTP id ay5-20020a170907900500b0071576ce4476mr11643302ejc.560.1655510173781; Fri, 17 Jun 2022 16:56:13 -0700 (PDT) Received: from alco.lan (80.71.134.83.ipv4.parknet.dk. [80.71.134.83]) by smtp.gmail.com with ESMTPSA id z21-20020aa7d415000000b0043566884333sm1452538edq.63.2022.06.17.16.56.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jun 2022 16:56:13 -0700 (PDT) From: Ricardo Ribalda To: Laurent Pinchart , Mauro Carvalho Chehab , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, tfiga@chromium.org, senozhatsky@chromium.org, yunkec@google.com Cc: Ricardo Ribalda Subject: [PATCH v8 2/9] media: uvcvideo: Add support for per-device control mapping overrides Date: Sat, 18 Jun 2022 01:56:03 +0200 Message-Id: <20220617235610.321917-3-ribalda@chromium.org> X-Mailer: git-send-email 2.37.0.rc0.104.g0611611a94-goog In-Reply-To: <20220617235610.321917-1-ribalda@chromium.org> References: <20220617235610.321917-1-ribalda@chromium.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Some devices do not implement all their controls in a way that complies with the UVC specification. This is for instance the case for several devices that do not support the disabled mode for the power line frequency control. Add a mechanism to allow per-device control mapping overrides to avoid errors when accessing non-compliant controls. Signed-off-by: Ricardo Ribalda Signed-off-by: Laurent Pinchart --- drivers/media/usb/uvc/uvc_ctrl.c | 34 +++++++++++++++++++++++++++----- drivers/media/usb/uvc/uvcvideo.h | 1 + 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_c= trl.c index a709ebbb4d69..38e35e369ddf 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -2403,9 +2403,8 @@ static void uvc_ctrl_init_ctrl(struct uvc_video_chain= *chain, { const struct uvc_control_info *info =3D uvc_ctrls; const struct uvc_control_info *iend =3D info + ARRAY_SIZE(uvc_ctrls); - const struct uvc_control_mapping *mapping =3D uvc_ctrl_mappings; - const struct uvc_control_mapping *mend =3D - mapping + ARRAY_SIZE(uvc_ctrl_mappings); + const struct uvc_control_mapping *mapping; + const struct uvc_control_mapping *mend; =20 /* XU controls initialization requires querying the device for control * information. As some buggy UVC devices will crash when queried @@ -2433,14 +2432,39 @@ static void uvc_ctrl_init_ctrl(struct uvc_video_cha= in *chain, if (!ctrl->initialized) return; =20 - /* Process common mappings first. */ + /* + * First check if the device provides a custom mapping for this control, + * used to override standard mappings for non-conformant devices. Don't + * process standard mappings if a custom mapping is found. This + * mechanism doesn't support combining standard and custom mappings for + * a single control. + */ + if (chain->dev->info->mappings) { + bool custom =3D false; + unsigned int i; + + for (i =3D 0; (mapping =3D chain->dev->info->mappings[i]); ++i) { + if (uvc_entity_match_guid(ctrl->entity, mapping->entity) && + ctrl->info.selector =3D=3D mapping->selector) { + __uvc_ctrl_add_mapping(chain, ctrl, mapping); + custom =3D true; + } + } + + if (custom) + return; + } + + /* Process common mappings next. */ + mapping =3D uvc_ctrl_mappings; + mend =3D mapping + ARRAY_SIZE(uvc_ctrl_mappings); for (; mapping < mend; ++mapping) { if (uvc_entity_match_guid(ctrl->entity, mapping->entity) && ctrl->info.selector =3D=3D mapping->selector) __uvc_ctrl_add_mapping(chain, ctrl, mapping); } =20 - /* And then version-specific mappings. */ + /* Finally process version-specific mappings. */ if (chain->dev->uvc_version < 0x0150) { mapping =3D uvc_ctrl_mappings_uvc11; mend =3D mapping + ARRAY_SIZE(uvc_ctrl_mappings_uvc11); diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index c5b4febd2d94..fff5c5c99a3d 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -667,6 +667,7 @@ struct uvc_device_info { u32 quirks; u32 meta_format; u16 uvc_version; + const struct uvc_control_mapping **mappings; }; =20 struct uvc_device { --=20 2.37.0.rc0.104.g0611611a94-goog From nobody Mon Apr 27 03:19:14 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 83849C433EF for ; Fri, 17 Jun 2022 23:56:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1383337AbiFQX4h (ORCPT ); Fri, 17 Jun 2022 19:56:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51016 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1345025AbiFQX4R (ORCPT ); Fri, 17 Jun 2022 19:56:17 -0400 Received: from mail-ed1-x52e.google.com (mail-ed1-x52e.google.com [IPv6:2a00:1450:4864:20::52e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0D61953B41 for ; Fri, 17 Jun 2022 16:56:16 -0700 (PDT) Received: by mail-ed1-x52e.google.com with SMTP id eo8so8105146edb.0 for ; Fri, 17 Jun 2022 16:56:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=jzUksJeBIzpsy16UnewiZbK9lVKFqzRfDsj2A+v5TqE=; b=Aqcio3+OisfYLPjsZkAJKSDbmJUrEQObnag1l5b3iiryXcpoj/AzYByWjPa7XmotVb 3Udj1arHXw5FldLsfjkY3r3XK3Tv8oHTJ/zxgHkZKS/YBBZ1jj81q+0Xj7+Xe/fz4srz cqgqum6vhWyih0CIe9y0AFr+DzXsP7UUFo+yc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=jzUksJeBIzpsy16UnewiZbK9lVKFqzRfDsj2A+v5TqE=; b=eWym11KbzMt45fz4YcQ41ZTn/y/vbFvlqTglyfhJblB5N2ymy6SCwI8thV8jzPFbF2 Efxcp8sKuKGvs4qA3Vqda24+1zhgga9/XWa8zm3yvLXtcquFrlJT3N24FPR3YmCTetLr VbgmP19MsD8Cq6CxZOviZl0Kyl3A5cYMth7zY8pstfaEGn9AY46BgMfKSfP1Vz8zAth8 9h0wTQvjrjQ1MRaVdjTuin0PttnZjUJD06R9O6a5KaykCC80pbZ/qf5MSNVkR7qRV0Jl lYLuL8wFBCz8GjYLznwd9OwqDe42C1zgCqwdAFFeCWOHPF5cZnxuWJxTz9JTopzItQg6 GGiQ== X-Gm-Message-State: AJIora+YgWHMLwA5t/k44tecNuKYJsUHHM9ThlwHxIKmsuzZ74fuFao+ lJgMN/IHDBDmJ912i41xfQq+rQ== X-Google-Smtp-Source: AGRyM1v1BXRQH1QU7y1eRqMlDrpZIcr1QOY200xBGU0eoON+62vb30JkTD1Vhq7N6dpOxtL8S7WF5w== X-Received: by 2002:aa7:df19:0:b0:435:5eb7:5e31 with SMTP id c25-20020aa7df19000000b004355eb75e31mr6980994edy.418.1655510174636; Fri, 17 Jun 2022 16:56:14 -0700 (PDT) Received: from alco.lan (80.71.134.83.ipv4.parknet.dk. [80.71.134.83]) by smtp.gmail.com with ESMTPSA id z21-20020aa7d415000000b0043566884333sm1452538edq.63.2022.06.17.16.56.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jun 2022 16:56:14 -0700 (PDT) From: Ricardo Ribalda To: Laurent Pinchart , Mauro Carvalho Chehab , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, tfiga@chromium.org, senozhatsky@chromium.org, yunkec@google.com Cc: Ricardo Ribalda Subject: [PATCH v8 3/9] media: uvcvideo: Implement mask for V4L2_CTRL_TYPE_MENU Date: Sat, 18 Jun 2022 01:56:04 +0200 Message-Id: <20220617235610.321917-4-ribalda@chromium.org> X-Mailer: git-send-email 2.37.0.rc0.104.g0611611a94-goog In-Reply-To: <20220617235610.321917-1-ribalda@chromium.org> References: <20220617235610.321917-1-ribalda@chromium.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Replace the count with a mask field that let us choose not only the max value, but also the minimum value and what values are valid in between. Signed-off-by: Ricardo Ribalda Suggested-by: Laurent Pinchart --- drivers/media/usb/uvc/uvc_ctrl.c | 32 ++++++++++++++++++++++---------- drivers/media/usb/uvc/uvc_v4l2.c | 2 +- drivers/media/usb/uvc/uvcvideo.h | 2 +- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_c= trl.c index 38e35e369ddf..a03714c3a265 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -524,7 +524,8 @@ static const struct uvc_control_mapping uvc_ctrl_mappin= gs[] =3D { .v4l2_type =3D V4L2_CTRL_TYPE_MENU, .data_type =3D UVC_CTRL_DATA_TYPE_BITMASK, .menu_info =3D exposure_auto_controls, - .menu_count =3D ARRAY_SIZE(exposure_auto_controls), + .menu_mask =3D + BIT_MASK(ARRAY_SIZE(exposure_auto_controls)), .slave_ids =3D { V4L2_CID_EXPOSURE_ABSOLUTE, }, }, { @@ -730,7 +731,8 @@ static const struct uvc_control_mapping uvc_ctrl_mappin= gs_uvc11[] =3D { .v4l2_type =3D V4L2_CTRL_TYPE_MENU, .data_type =3D UVC_CTRL_DATA_TYPE_ENUM, .menu_info =3D power_line_frequency_controls, - .menu_count =3D ARRAY_SIZE(power_line_frequency_controls) - 1, + .menu_mask =3D + BIT_MASK(ARRAY_SIZE(power_line_frequency_controls) - 1), }, }; =20 @@ -744,7 +746,8 @@ static const struct uvc_control_mapping uvc_ctrl_mappin= gs_uvc15[] =3D { .v4l2_type =3D V4L2_CTRL_TYPE_MENU, .data_type =3D UVC_CTRL_DATA_TYPE_ENUM, .menu_info =3D power_line_frequency_controls, - .menu_count =3D ARRAY_SIZE(power_line_frequency_controls), + .menu_mask =3D + BIT_MASK(ARRAY_SIZE(power_line_frequency_controls)), }, }; =20 @@ -970,7 +973,9 @@ static s32 __uvc_ctrl_get_value(struct uvc_control_mapp= ing *mapping, const struct uvc_menu_info *menu =3D mapping->menu_info; unsigned int i; =20 - for (i =3D 0; i < mapping->menu_count; ++i, ++menu) { + for (i =3D 1; BIT(i) <=3D mapping->menu_mask; ++i, ++menu) { + if (!test_bit(i, &mapping->menu_mask)) + continue; if (menu->value =3D=3D value) { value =3D i; break; @@ -1144,12 +1149,14 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_c= hain *chain, =20 switch (mapping->v4l2_type) { case V4L2_CTRL_TYPE_MENU: - v4l2_ctrl->minimum =3D 0; - v4l2_ctrl->maximum =3D mapping->menu_count - 1; + v4l2_ctrl->minimum =3D ffs(mapping->menu_mask) - 1; + v4l2_ctrl->maximum =3D fls(mapping->menu_mask) - 1; v4l2_ctrl->step =3D 1; =20 menu =3D mapping->menu_info; - for (i =3D 0; i < mapping->menu_count; ++i, ++menu) { + for (i =3D 1; BIT(i) <=3D mapping->menu_mask; ++i, ++menu) { + if (!test_bit(i, &mapping->menu_mask)) + continue; if (menu->value =3D=3D v4l2_ctrl->default_value) { v4l2_ctrl->default_value =3D i; break; @@ -1264,7 +1271,7 @@ int uvc_query_v4l2_menu(struct uvc_video_chain *chain, goto done; } =20 - if (query_menu->index >=3D mapping->menu_count) { + if (!test_bit(query_menu->index, &mapping->menu_mask)) { ret =3D -EINVAL; goto done; } @@ -1769,8 +1776,13 @@ int uvc_ctrl_set(struct uvc_fh *handle, break; =20 case V4L2_CTRL_TYPE_MENU: - if (xctrl->value < 0 || xctrl->value >=3D mapping->menu_count) + if (xctrl->value < (ffs(mapping->menu_mask) - 1) || + xctrl->value > (fls(mapping->menu_mask) - 1)) return -ERANGE; + + if (!test_bit(xctrl->value, &mapping->menu_mask)) + return -EINVAL; + value =3D mapping->menu_info[xctrl->value].value; =20 /* Valid menu indices are reported by the GET_RES request for @@ -2217,7 +2229,7 @@ static int __uvc_ctrl_add_mapping(struct uvc_video_ch= ain *chain, =20 INIT_LIST_HEAD(&map->ev_subs); =20 - size =3D sizeof(*mapping->menu_info) * mapping->menu_count; + size =3D sizeof(*mapping->menu_info) * fls(mapping->menu_mask); map->menu_info =3D kmemdup(mapping->menu_info, size, GFP_KERNEL); if (map->menu_info =3D=3D NULL) { kfree(map->name); diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v= 4l2.c index 648dcd579e81..85aced173daa 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -79,7 +79,7 @@ static int uvc_ioctl_ctrl_map(struct uvc_video_chain *cha= in, goto free_map; } =20 - map->menu_count =3D xmap->menu_count; + map->menu_mask =3D BIT_MASK(xmap->menu_count); break; =20 default: diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index fff5c5c99a3d..0736b8815d79 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -254,7 +254,7 @@ struct uvc_control_mapping { u32 data_type; =20 const struct uvc_menu_info *menu_info; - u32 menu_count; + unsigned long menu_mask; =20 u32 master_id; s32 master_manual; --=20 2.37.0.rc0.104.g0611611a94-goog From nobody Mon Apr 27 03:19:14 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 01436C433EF for ; Fri, 17 Jun 2022 23:56:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1383580AbiFQX4k (ORCPT ); Fri, 17 Jun 2022 19:56:40 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51036 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1382433AbiFQX4S (ORCPT ); Fri, 17 Jun 2022 19:56:18 -0400 Received: from mail-ej1-x634.google.com (mail-ej1-x634.google.com [IPv6:2a00:1450:4864:20::634]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1AE7D60066 for ; Fri, 17 Jun 2022 16:56:17 -0700 (PDT) Received: by mail-ej1-x634.google.com with SMTP id u12so11347102eja.8 for ; Fri, 17 Jun 2022 16:56:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=M05mXEEsCUtqw0Yy5vlYj0mxj1VIm7h4Q0ugvilopUQ=; b=MYqD5c5PmVQ3vLo24PfyqQTI2LSm3WSKDIOTiSWiP9/wPfKHfDPb1fhnamNLyk8lrG X+BqbEOmWkDWKnFgh+YtFObJEs1sJtOtI8Hcu9FPEGZ76enJivSLXaKZQ38x7QwqZ4Cl JDCEUWnhKJEZc7sNYYfcAeud+GtRx0Ge9DmOI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=M05mXEEsCUtqw0Yy5vlYj0mxj1VIm7h4Q0ugvilopUQ=; b=TAAPms4Oo/1yt3dpaW+AI5AjqJyaflldPYwLWwvZnCJFTNA5K5/YzIrhdd3r//ZVmT RPoFB3PRkCk+dd8DL5mLFLV5l0i1GLSj2BuiyHx+yQPocW+3rCA9SlHsZzbuTefP2KuY yW+fyHSamRf8XHhaOwj1kx4LaxicM+hnx03EnmEI6t6zvug7et47DRLjpXvPzXotItxm 5MV2XVefdTODVuWVUWlKNfNjk+W7A/HQOUWQH11voOr83E6ze/kxWeu0GI9l+jmR9Qhm cmaBNy2h3PSqVu+9zg9fNsf7XpZxgzzHBJopEVbCyBJANbnNVenIWzz0wujYraPIERfz Fn6A== X-Gm-Message-State: AJIora+dzOSO8fWQlwvSDh7wOprOMjdQoM3A38U+8IyjyxoeGhMF0r39 /5LXsZXDYjNbyGleWIdg5cvCBg== X-Google-Smtp-Source: AGRyM1vueI4Kl7zXsaG4DyZPoxK7P8LQhQyg2HcRdwuyEtMZ41FPn5m0lBPJgAL3x2WdOsfAkUAjVQ== X-Received: by 2002:a17:906:9c82:b0:6e1:2c94:1616 with SMTP id fj2-20020a1709069c8200b006e12c941616mr11421842ejc.64.1655510175518; Fri, 17 Jun 2022 16:56:15 -0700 (PDT) Received: from alco.lan (80.71.134.83.ipv4.parknet.dk. [80.71.134.83]) by smtp.gmail.com with ESMTPSA id z21-20020aa7d415000000b0043566884333sm1452538edq.63.2022.06.17.16.56.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jun 2022 16:56:15 -0700 (PDT) From: Ricardo Ribalda To: Laurent Pinchart , Mauro Carvalho Chehab , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, tfiga@chromium.org, senozhatsky@chromium.org, yunkec@google.com Cc: Ricardo Ribalda Subject: [PATCH v8 4/9] media: uvcvideo: Use standard names for menus Date: Sat, 18 Jun 2022 01:56:05 +0200 Message-Id: <20220617235610.321917-5-ribalda@chromium.org> X-Mailer: git-send-email 2.37.0.rc0.104.g0611611a94-goog In-Reply-To: <20220617235610.321917-1-ribalda@chromium.org> References: <20220617235610.321917-1-ribalda@chromium.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Instead of duplicating the menu info, use the one from the core. Also, do not use extra memory for 1:1 mappings. Signed-off-by: Ricardo Ribalda Suggested-by: Laurent Pinchart --- drivers/media/usb/uvc/uvc_ctrl.c | 116 +++++++++++++++++++++---------- drivers/media/usb/uvc/uvc_v4l2.c | 80 ++++++++++++++++----- drivers/media/usb/uvc/uvcvideo.h | 3 +- include/uapi/linux/uvcvideo.h | 3 +- 4 files changed, 144 insertions(+), 58 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_c= trl.c index a03714c3a265..1a3021a16b76 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -362,19 +362,31 @@ static const u32 uvc_control_classes[] =3D { V4L2_CID_USER_CLASS, }; =20 -static const struct uvc_menu_info power_line_frequency_controls[] =3D { - { 0, "Disabled" }, - { 1, "50 Hz" }, - { 2, "60 Hz" }, - { 3, "Auto" }, -}; +static const int exposure_auto_mapping[] =3D { 2, 1, 4, 8 }; =20 -static const struct uvc_menu_info exposure_auto_controls[] =3D { - { 2, "Auto Mode" }, - { 1, "Manual Mode" }, - { 4, "Shutter Priority Mode" }, - { 8, "Aperture Priority Mode" }, -}; +static u32 uvc_mapping_get_menu_value(struct uvc_control_mapping *mapping, + u32 idx) +{ + if (!test_bit(idx, &mapping->menu_mask)) + return 0; + + if (mapping->menu_mapping) + return mapping->menu_mapping[idx]; + + return idx; +} + +static const char +*uvc_mapping_get_menu_name(struct uvc_control_mapping *mapping, u32 idx) +{ + if (!test_bit(idx, &mapping->menu_mask)) + return NULL; + + if (mapping->menu_names) + return mapping->menu_names[idx]; + + return v4l2_ctrl_get_menu(mapping->id)[idx]; +} =20 static s32 uvc_ctrl_get_zoom(struct uvc_control_mapping *mapping, u8 query, const u8 *data) @@ -523,9 +535,9 @@ static const struct uvc_control_mapping uvc_ctrl_mappin= gs[] =3D { .offset =3D 0, .v4l2_type =3D V4L2_CTRL_TYPE_MENU, .data_type =3D UVC_CTRL_DATA_TYPE_BITMASK, - .menu_info =3D exposure_auto_controls, + .menu_mapping =3D exposure_auto_mapping, .menu_mask =3D - BIT_MASK(ARRAY_SIZE(exposure_auto_controls)), + GENMASK(ARRAY_SIZE(exposure_auto_mapping) - 1, 0), .slave_ids =3D { V4L2_CID_EXPOSURE_ABSOLUTE, }, }, { @@ -730,9 +742,8 @@ static const struct uvc_control_mapping uvc_ctrl_mappin= gs_uvc11[] =3D { .offset =3D 0, .v4l2_type =3D V4L2_CTRL_TYPE_MENU, .data_type =3D UVC_CTRL_DATA_TYPE_ENUM, - .menu_info =3D power_line_frequency_controls, .menu_mask =3D - BIT_MASK(ARRAY_SIZE(power_line_frequency_controls) - 1), + GENMASK(V4L2_CID_POWER_LINE_FREQUENCY_60HZ, 0), }, }; =20 @@ -745,9 +756,8 @@ static const struct uvc_control_mapping uvc_ctrl_mappin= gs_uvc15[] =3D { .offset =3D 0, .v4l2_type =3D V4L2_CTRL_TYPE_MENU, .data_type =3D UVC_CTRL_DATA_TYPE_ENUM, - .menu_info =3D power_line_frequency_controls, .menu_mask =3D - BIT_MASK(ARRAY_SIZE(power_line_frequency_controls)), + GENMASK(V4L2_CID_POWER_LINE_FREQUENCY_AUTO, 0), }, }; =20 @@ -970,13 +980,17 @@ static s32 __uvc_ctrl_get_value(struct uvc_control_ma= pping *mapping, s32 value =3D mapping->get(mapping, UVC_GET_CUR, data); =20 if (mapping->v4l2_type =3D=3D V4L2_CTRL_TYPE_MENU) { - const struct uvc_menu_info *menu =3D mapping->menu_info; unsigned int i; =20 - for (i =3D 1; BIT(i) <=3D mapping->menu_mask; ++i, ++menu) { + for (i =3D 1; BIT(i) <=3D mapping->menu_mask; ++i) { + u32 menu_value; + if (!test_bit(i, &mapping->menu_mask)) continue; - if (menu->value =3D=3D value) { + + menu_value =3D uvc_mapping_get_menu_value(mapping, i); + + if (menu_value =3D=3D value) { value =3D i; break; } @@ -1108,7 +1122,6 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_cha= in *chain, { struct uvc_control_mapping *master_map =3D NULL; struct uvc_control *master_ctrl =3D NULL; - const struct uvc_menu_info *menu; unsigned int i; =20 memset(v4l2_ctrl, 0, sizeof(*v4l2_ctrl)); @@ -1153,11 +1166,15 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_c= hain *chain, v4l2_ctrl->maximum =3D fls(mapping->menu_mask) - 1; v4l2_ctrl->step =3D 1; =20 - menu =3D mapping->menu_info; - for (i =3D 1; BIT(i) <=3D mapping->menu_mask; ++i, ++menu) { + for (i =3D 1; BIT(i) <=3D mapping->menu_mask; ++i) { + u32 menu_value; + if (!test_bit(i, &mapping->menu_mask)) continue; - if (menu->value =3D=3D v4l2_ctrl->default_value) { + + menu_value =3D uvc_mapping_get_menu_value(mapping, i); + + if (menu_value =3D=3D v4l2_ctrl->default_value) { v4l2_ctrl->default_value =3D i; break; } @@ -1250,11 +1267,11 @@ int uvc_query_v4l2_ctrl(struct uvc_video_chain *cha= in, int uvc_query_v4l2_menu(struct uvc_video_chain *chain, struct v4l2_querymenu *query_menu) { - const struct uvc_menu_info *menu_info; struct uvc_control_mapping *mapping; struct uvc_control *ctrl; u32 index =3D query_menu->index; u32 id =3D query_menu->id; + const char *name; int ret; =20 memset(query_menu, 0, sizeof(*query_menu)); @@ -1276,11 +1293,10 @@ int uvc_query_v4l2_menu(struct uvc_video_chain *cha= in, goto done; } =20 - menu_info =3D &mapping->menu_info[query_menu->index]; - if (mapping->data_type =3D=3D UVC_CTRL_DATA_TYPE_BITMASK && (ctrl->info.flags & UVC_CTRL_FLAG_GET_RES)) { s32 bitmap; + u32 menu_value; =20 if (!ctrl->cached) { ret =3D uvc_ctrl_populate_cache(chain, ctrl); @@ -1288,15 +1304,22 @@ int uvc_query_v4l2_menu(struct uvc_video_chain *cha= in, goto done; } =20 + menu_value =3D uvc_mapping_get_menu_value(mapping, + query_menu->index); + bitmap =3D mapping->get(mapping, UVC_GET_RES, uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES)); - if (!(bitmap & menu_info->value)) { + if (!(bitmap & menu_value)) { ret =3D -EINVAL; goto done; } } =20 - strscpy(query_menu->name, menu_info->name, sizeof(query_menu->name)); + name =3D uvc_mapping_get_menu_name(mapping, query_menu->index); + if (name) + strscpy(query_menu->name, name, sizeof(query_menu->name)); + else + ret =3D -EINVAL; =20 done: mutex_unlock(&chain->ctrl_mutex); @@ -1783,7 +1806,7 @@ int uvc_ctrl_set(struct uvc_fh *handle, if (!test_bit(xctrl->value, &mapping->menu_mask)) return -EINVAL; =20 - value =3D mapping->menu_info[xctrl->value].value; + value =3D uvc_mapping_get_menu_value(mapping, xctrl->value); =20 /* Valid menu indices are reported by the GET_RES request for * UVC controls that support it. @@ -2229,12 +2252,28 @@ static int __uvc_ctrl_add_mapping(struct uvc_video_= chain *chain, =20 INIT_LIST_HEAD(&map->ev_subs); =20 - size =3D sizeof(*mapping->menu_info) * fls(mapping->menu_mask); - map->menu_info =3D kmemdup(mapping->menu_info, size, GFP_KERNEL); - if (map->menu_info =3D=3D NULL) { - kfree(map->name); - kfree(map); - return -ENOMEM; + if (mapping->menu_mapping && mapping->menu_mask) { + size =3D sizeof(mapping->menu_mapping[0]) * + fls(mapping->menu_mask); + map->menu_mapping =3D kmemdup(mapping->menu_mapping, size, + GFP_KERNEL); + if (!map->menu_mapping) { + kfree(map->name); + kfree(map); + return -ENOMEM; + } + } + if (mapping->menu_names && mapping->menu_mask) { + size =3D sizeof(mapping->menu_names[0]) * + fls(mapping->menu_mask); + map->menu_names =3D kmemdup(mapping->menu_names, size, + GFP_KERNEL); + if (!map->menu_names) { + kfree(map->menu_mapping); + kfree(map->name); + kfree(map); + return -ENOMEM; + } } =20 if (map->get =3D=3D NULL) @@ -2577,7 +2616,8 @@ static void uvc_ctrl_cleanup_mappings(struct uvc_devi= ce *dev, =20 list_for_each_entry_safe(mapping, nm, &ctrl->info.mappings, list) { list_del(&mapping->list); - kfree(mapping->menu_info); + kfree(mapping->menu_names); + kfree(mapping->menu_mapping); kfree(mapping->name); kfree(mapping); } diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v= 4l2.c index 85aced173daa..0ba1eb92df8e 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -25,6 +25,64 @@ =20 #include "uvcvideo.h" =20 +static int uvc_control_xu_2_mapping(struct uvc_control_mapping *map, + struct uvc_xu_control_mapping *xmap) +{ + char (*names)[UVC_MENU_NAME_LEN]; + unsigned int i; + u32 *mapping; + size_t size; + + /* Prevent excessive memory consumption, as well as integer + * overflows. + */ + if (xmap->menu_count =3D=3D 0 || + xmap->menu_count > UVC_MAX_CONTROL_MENU_ENTRIES) + return -EINVAL; + + map->menu_mask =3D BIT_MASK(xmap->menu_count); + + size =3D xmap->menu_count * sizeof(*map->menu_mapping); + mapping =3D kzalloc(size, GFP_KERNEL); + if (!mapping) + return -ENOMEM; + + for (i =3D 0; i < xmap->menu_count ; i++) + if (copy_from_user(&mapping[i], &xmap->menu_info[i].value, + sizeof(mapping[i]))) { + kfree(mapping); + return -ENOMEM; + } + + map->menu_mapping =3D mapping; + + /* + * Always use the standard naming if available. + */ + if (v4l2_ctrl_get_menu(map->id)) + return 0; + + size =3D xmap->menu_count * sizeof(map->menu_names[0]); + names =3D kzalloc(size, GFP_KERNEL); + if (!names) { + kfree(mapping); + return -ENOMEM; + } + + for (i =3D 0; i < xmap->menu_count ; i++) { + /* sizeof(names[i]) - 1: to take care of \0 */ + if (copy_from_user(&names[i], &xmap->menu_info[i].name, + sizeof(names[i]) - 1)) { + kfree(names); + kfree(mapping); + return -ENOMEM; + } + } + map->menu_names =3D names; + + return 0; +} + /* ------------------------------------------------------------------------ * UVC ioctls */ @@ -32,7 +90,6 @@ static int uvc_ioctl_ctrl_map(struct uvc_video_chain *cha= in, struct uvc_xu_control_mapping *xmap) { struct uvc_control_mapping *map; - unsigned int size; int ret; =20 map =3D kzalloc(sizeof(*map), GFP_KERNEL); @@ -63,23 +120,9 @@ static int uvc_ioctl_ctrl_map(struct uvc_video_chain *c= hain, break; =20 case V4L2_CTRL_TYPE_MENU: - /* Prevent excessive memory consumption, as well as integer - * overflows. - */ - if (xmap->menu_count =3D=3D 0 || - xmap->menu_count > UVC_MAX_CONTROL_MENU_ENTRIES) { - ret =3D -EINVAL; - goto free_map; - } - - size =3D xmap->menu_count * sizeof(*map->menu_info); - map->menu_info =3D memdup_user(xmap->menu_info, size); - if (IS_ERR(map->menu_info)) { - ret =3D PTR_ERR(map->menu_info); + ret =3D uvc_control_xu_2_mapping(map, xmap); + if (ret) goto free_map; - } - - map->menu_mask =3D BIT_MASK(xmap->menu_count); break; =20 default: @@ -91,7 +134,8 @@ static int uvc_ioctl_ctrl_map(struct uvc_video_chain *ch= ain, =20 ret =3D uvc_ctrl_add_mapping(chain, map); =20 - kfree(map->menu_info); + kfree(map->menu_names); + kfree(map->menu_mapping); free_map: kfree(map); =20 diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index 0736b8815d79..b702f1c8547b 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -253,7 +253,8 @@ struct uvc_control_mapping { enum v4l2_ctrl_type v4l2_type; u32 data_type; =20 - const struct uvc_menu_info *menu_info; + const u32 *menu_mapping; + const char (*menu_names)[UVC_MENU_NAME_LEN]; unsigned long menu_mask; =20 u32 master_id; diff --git a/include/uapi/linux/uvcvideo.h b/include/uapi/linux/uvcvideo.h index 8288137387c0..1b64b6aa40b5 100644 --- a/include/uapi/linux/uvcvideo.h +++ b/include/uapi/linux/uvcvideo.h @@ -36,9 +36,10 @@ UVC_CTRL_FLAG_GET_MAX | UVC_CTRL_FLAG_GET_RES | \ UVC_CTRL_FLAG_GET_DEF) =20 +#define UVC_MENU_NAME_LEN 32 struct uvc_menu_info { __u32 value; - __u8 name[32]; + __u8 name[UVC_MENU_NAME_LEN]; }; =20 struct uvc_xu_control_mapping { --=20 2.37.0.rc0.104.g0611611a94-goog From nobody Mon Apr 27 03:19:14 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id ACC0AC433EF for ; Fri, 17 Jun 2022 23:56:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240952AbiFQX4q (ORCPT ); Fri, 17 Jun 2022 19:56:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51064 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1382748AbiFQX4T (ORCPT ); Fri, 17 Jun 2022 19:56:19 -0400 Received: from mail-ej1-x636.google.com (mail-ej1-x636.google.com [IPv6:2a00:1450:4864:20::636]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CFDFA61627 for ; Fri, 17 Jun 2022 16:56:17 -0700 (PDT) Received: by mail-ej1-x636.google.com with SMTP id gl15so11362274ejb.4 for ; Fri, 17 Jun 2022 16:56:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=+5NDpsm7942F8ZAmDt1/U3OvWgy4XsdEFDVSVEbFO9s=; b=nVc1TlGRzm+6zidFMBS9tzR7dsyWC9GpBonuqwNbiK1F8F0kYLpp++P6ranijiHZl6 z812PWhsI0Wgc3cdj7Ye2gLpye5PLOEQWMOWkNvpwc72n/wflQVNpgFJhswrm7QL/wc5 +56RwvzIfBf2LUgOv8PqSdkytqoJQXHO7yo5E= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=+5NDpsm7942F8ZAmDt1/U3OvWgy4XsdEFDVSVEbFO9s=; b=nBmxbyOunNga1S98NBaIFMABdFPL8DxINV0/QxUHqN3e4VWnibjYDcUAE62e4jh5Vh 1apQEaMSQp+k7R45Zi7r+dzBTKboBhHfzWDhyAKar3l9wHflmGjhq/+j29M+7WCw9FS1 Rlmd+smC64HShsNWgRBN+tqiyJXbjoPsoNTmRtO784bKtX5WkEQxbOmXhVVJshuOOYGV Pa/XAkgHLqO3b7+o4SYrFhTPxZL6l/YB7CniXCiTggJEIF/W0OruJ4Zjhi3bXE5zBYOD 622XcAKw/E9PsSD2HUshdHR5w5Jn0WVFW+CtrsjeKSAMTcZTgnoDWaJFAQan0IfD3QPl S8rg== X-Gm-Message-State: AJIora8pwPOPRYzUVWDnhSG1pANyWjfzynPkt9dhSL3RpBy4ukhDyxwb a7Nc9jz92/Ln8IfbxlILPoS6NA== X-Google-Smtp-Source: AGRyM1sjg2BOhrpcR/L31d1agtFPImts7SKC/0t9bER+Rl1EmJAIC4owlQjbMXcYeutidfMIL+I7vA== X-Received: by 2002:a17:906:c041:b0:718:c984:d9ee with SMTP id bm1-20020a170906c04100b00718c984d9eemr12078098ejb.722.1655510176399; Fri, 17 Jun 2022 16:56:16 -0700 (PDT) Received: from alco.lan (80.71.134.83.ipv4.parknet.dk. [80.71.134.83]) by smtp.gmail.com with ESMTPSA id z21-20020aa7d415000000b0043566884333sm1452538edq.63.2022.06.17.16.56.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jun 2022 16:56:16 -0700 (PDT) From: Ricardo Ribalda To: Laurent Pinchart , Mauro Carvalho Chehab , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, tfiga@chromium.org, senozhatsky@chromium.org, yunkec@google.com Cc: Ricardo Ribalda Subject: [PATCH v8 5/9] media: uvcvideo: Limit power line control for Quanta UVC Webcam Date: Sat, 18 Jun 2022 01:56:06 +0200 Message-Id: <20220617235610.321917-6-ribalda@chromium.org> X-Mailer: git-send-email 2.37.0.rc0.104.g0611611a94-goog In-Reply-To: <20220617235610.321917-1-ribalda@chromium.org> References: <20220617235610.321917-1-ribalda@chromium.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The device does not implement the power line control correctly. Add a corresponding control mapping override. Bus 001 Device 003: ID 0408:3090 Quanta Computer, Inc. USB2.0 HD UVC WebCam Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 239 Miscellaneous Device bDeviceSubClass 2 bDeviceProtocol 1 Interface Association bMaxPacketSize0 64 idVendor 0x0408 Quanta Computer, Inc. idProduct 0x3090 bcdDevice 0.04 iManufacturer 3 Quanta iProduct 1 USB2.0 HD UVC WebCam iSerial 2 0x0001 bNumConfigurations 1 Signed-off-by: Ricardo Ribalda Signed-off-by: Laurent Pinchart --- drivers/media/usb/uvc/uvc_driver.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc= _driver.c index 6c86faecbea2..ea8f0bb7a20c 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -2643,6 +2643,24 @@ MODULE_PARM_DESC(timeout, "Streaming control request= s timeout"); * Driver initialization and cleanup */ =20 +static const struct uvc_control_mapping uvc_ctrl_power_line_mapping_limite= d =3D { + .id =3D V4L2_CID_POWER_LINE_FREQUENCY, + .entity =3D UVC_GUID_UVC_PROCESSING, + .selector =3D UVC_PU_POWER_LINE_FREQUENCY_CONTROL, + .size =3D 2, + .offset =3D 0, + .v4l2_type =3D V4L2_CTRL_TYPE_MENU, + .data_type =3D UVC_CTRL_DATA_TYPE_ENUM, + .menu_mask =3D 0x6, +}; + +static const struct uvc_device_info uvc_ctrl_power_line_limited =3D { + .mappings =3D (const struct uvc_control_mapping *[]) { + &uvc_ctrl_power_line_mapping_limited, + NULL, /* Sentinel */ + }, +}; + static const struct uvc_device_info uvc_quirk_probe_minmax =3D { .quirks =3D UVC_QUIRK_PROBE_MINMAX, }; @@ -2673,6 +2691,15 @@ static const struct uvc_device_info uvc_quirk_force_= y8 =3D { * though they are compliant. */ static const struct usb_device_id uvc_ids[] =3D { + /* Quanta USB2.0 HD UVC Webcam */ + { .match_flags =3D USB_DEVICE_ID_MATCH_DEVICE + | USB_DEVICE_ID_MATCH_INT_INFO, + .idVendor =3D 0x0408, + .idProduct =3D 0x3090, + .bInterfaceClass =3D USB_CLASS_VIDEO, + .bInterfaceSubClass =3D 1, + .bInterfaceProtocol =3D 0, + .driver_info =3D (kernel_ulong_t)&uvc_ctrl_power_line_limited }, /* LogiLink Wireless Webcam */ { .match_flags =3D USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, --=20 2.37.0.rc0.104.g0611611a94-goog From nobody Mon Apr 27 03:19:14 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 730E0C43334 for ; Fri, 17 Jun 2022 23:56:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236486AbiFQX4u (ORCPT ); Fri, 17 Jun 2022 19:56:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51068 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1383023AbiFQX4T (ORCPT ); Fri, 17 Jun 2022 19:56:19 -0400 Received: from mail-ed1-x52f.google.com (mail-ed1-x52f.google.com [IPv6:2a00:1450:4864:20::52f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6FD3462CE6 for ; Fri, 17 Jun 2022 16:56:18 -0700 (PDT) Received: by mail-ed1-x52f.google.com with SMTP id es26so6348599edb.4 for ; Fri, 17 Jun 2022 16:56:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=/jnwN8/6Kw9QXkQJc/fBYupKgOyKif9IBYZXUyF1l04=; b=LaHFGJ+vmI7vv9p7PqJtdxNqnbBKiL9mPRLDO8EhOI0iQb4IxPUSAwaflGgrMLqZuB 4zxG26tGBO/+MCqzmKBkXVqDw5lmgsRbF2KQbmmSOmCpSMT/2Lliq3MwwUlNE6OoGO9A ov/dWDMTltr38aasOErN1b1gGrvXNhm93rDLQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=/jnwN8/6Kw9QXkQJc/fBYupKgOyKif9IBYZXUyF1l04=; b=j3lXGEVKdc/TF/8+12NLvmxyLGk4B7XB9mPDc/L7U+Nu1/b+FHqkX3+7MylOOkM5Mu HY9nXjia+wrTbx8pMe6mT6oUdoU5EbmNJVyxL6/Q6TPkD3xVGbFuvJ7wJRmZ4wJdnkus aIWI+/hrMsgM+CDdPqh/Po6FqvJbsNJd+ZqPVoxdhslYDdbLfXyFstWcYVO2+9utAgc3 iBk1h9t679bg8ilb4ZpIJj4YQ4nWATyD+MsxsTNJjqyo0f5k7rXnFF2UJE8D9Na5o/kZ wKAvlfyNBvqfC06pajZEhTIKF//fn947zfmvfyRsDIED9SZHJfLBd/M6OeU9o5Pw8ns3 7pxw== X-Gm-Message-State: AJIora+i2OYUvSoz1iKhaw6TYYzLPiIv6OfCv7Wlc6sN/WE+iruhFuT9 E3M81dGBe0DFOpC1VLE7jmSUwecLOX4wdmNK X-Google-Smtp-Source: AGRyM1t/2FyFec2b3mG0O30RSB+BxB3GsPTeg3wEUIRsx8xxj7AhhzUhk7WcsvxUSz4DDhdSSDnThA== X-Received: by 2002:a05:6402:b8c:b0:435:6d4b:37e4 with SMTP id cf12-20020a0564020b8c00b004356d4b37e4mr1124518edb.109.1655510177029; Fri, 17 Jun 2022 16:56:17 -0700 (PDT) Received: from alco.lan (80.71.134.83.ipv4.parknet.dk. [80.71.134.83]) by smtp.gmail.com with ESMTPSA id z21-20020aa7d415000000b0043566884333sm1452538edq.63.2022.06.17.16.56.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jun 2022 16:56:16 -0700 (PDT) From: Ricardo Ribalda To: Laurent Pinchart , Mauro Carvalho Chehab , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, tfiga@chromium.org, senozhatsky@chromium.org, yunkec@google.com Cc: Ricardo Ribalda Subject: [PATCH v8 6/9] media: uvcvideo: Limit power line control for Chicony Easycamera Date: Sat, 18 Jun 2022 01:56:07 +0200 Message-Id: <20220617235610.321917-7-ribalda@chromium.org> X-Mailer: git-send-email 2.37.0.rc0.104.g0611611a94-goog In-Reply-To: <20220617235610.321917-1-ribalda@chromium.org> References: <20220617235610.321917-1-ribalda@chromium.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Two different Easycamera devices do not implement the power line control correctly. Add a corresponding control mapping override. Bus 001 Device 003: ID 04f2:b6ba Chicony Electronics Co., Ltd EasyCamera Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 239 Miscellaneous Device bDeviceSubClass 2 bDeviceProtocol 1 Interface Association bMaxPacketSize0 64 idVendor 0x04f2 Chicony Electronics Co., Ltd idProduct 0xb6ba bcdDevice 10.70 iManufacturer 3 Chicony Electronics Co.,Ltd. iProduct 1 EasyCamera iSerial 2 0001 bNumConfigurations 1 Bus 001 Device 003: ID 04f2:b746 Chicony Electronics Co., Ltd EasyCamera Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 239 Miscellaneous Device bDeviceSubClass 2 bDeviceProtocol 1 Interface Association bMaxPacketSize0 64 idVendor 0x04f2 Chicony Electronics Co., Ltd idProduct 0xb746 bcdDevice 97.57 iManufacturer 3 Chicony Electronics Co.,Ltd. iProduct 1 EasyCamera iSerial 2 0001 bNumConfigurations 1 Signed-off-by: Ricardo Ribalda Signed-off-by: Laurent Pinchart --- drivers/media/usb/uvc/uvc_driver.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc= _driver.c index ea8f0bb7a20c..b22d083833ee 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -2811,6 +2811,24 @@ static const struct usb_device_id uvc_ids[] =3D { .bInterfaceSubClass =3D 1, .bInterfaceProtocol =3D 0, .driver_info =3D UVC_INFO_QUIRK(UVC_QUIRK_RESTRICT_FRAME_RATE) }, + /* Chicony EasyCamera */ + { .match_flags =3D USB_DEVICE_ID_MATCH_DEVICE + | USB_DEVICE_ID_MATCH_INT_INFO, + .idVendor =3D 0x04f2, + .idProduct =3D 0xb6ba, + .bInterfaceClass =3D USB_CLASS_VIDEO, + .bInterfaceSubClass =3D 1, + .bInterfaceProtocol =3D 0, + .driver_info =3D (kernel_ulong_t)&uvc_ctrl_power_line_limited }, + /* Chicony EasyCamera */ + { .match_flags =3D USB_DEVICE_ID_MATCH_DEVICE + | USB_DEVICE_ID_MATCH_INT_INFO, + .idVendor =3D 0x04f2, + .idProduct =3D 0xb746, + .bInterfaceClass =3D USB_CLASS_VIDEO, + .bInterfaceSubClass =3D 1, + .bInterfaceProtocol =3D 0, + .driver_info =3D (kernel_ulong_t)&uvc_ctrl_power_line_limited }, /* Alcor Micro AU3820 (Future Boy PC USB Webcam) */ { .match_flags =3D USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, --=20 2.37.0.rc0.104.g0611611a94-goog From nobody Mon Apr 27 03:19:14 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A3A2AC43334 for ; Fri, 17 Jun 2022 23:56:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1382512AbiFQX44 (ORCPT ); Fri, 17 Jun 2022 19:56:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51314 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1381373AbiFQX4a (ORCPT ); Fri, 17 Jun 2022 19:56:30 -0400 Received: from mail-ej1-x636.google.com (mail-ej1-x636.google.com [IPv6:2a00:1450:4864:20::636]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 79C9265415 for ; Fri, 17 Jun 2022 16:56:19 -0700 (PDT) Received: by mail-ej1-x636.google.com with SMTP id n10so11368350ejk.5 for ; Fri, 17 Jun 2022 16:56:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=scX391f5blpJybIeBstalb8q/E+bG9Wz4cWkWDEOBNM=; b=WZ25gGhFa6piGaIAblr/7+DjWPKrFrCiYrhva2rjbsBCWQkVv8JG0shVuTPmm4a78Y 5oUqPdiKh8Iopv/haFtV9Fvxg20fPQHUVTN4P5TRhETIt+HM1tyVhbOBj+9kSl9MsSIW Fr0D36hT+p/cFaQkJgwyAKlW8wuNzg/LuTeQo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=scX391f5blpJybIeBstalb8q/E+bG9Wz4cWkWDEOBNM=; b=Tg/ZMoRvk1hBHKIIKq/82K20bSb9zbMSUPww7PC6zD7+9YWJQR3mT/IryXGvhgtxCX BGOKFEsjy+jIcWblRaIWdWzLwKvEyn2hiwTYnP2fOsK2HdPqSpWVi9/C6b9mQOI77X1P U7/Lh4RhZ8e8rNNi/Txn4nXXFSP79snJjYRFdfdbVqv1zRslXFSYaWJaKg5uNpyFeAQX lrBl40PcxyG39TDqm+FEOH5IRuMi1T9J7MbRDn+0IgqwS4f5OmeBKlBpNbaTjq9OSNbg 1rrKIcuKgItGNTBU/fc1DqEMx7+HoLc4Lj5jAkFuRaKxRER5Yp7iC5pEG5Y6epaxJQIj t2tQ== X-Gm-Message-State: AJIora/hDXQR5nSIv7BHYs8RIF45IrOYldWumujxXd6cjKu6fkFYXFWm KGG+hjsKZUKICggsTBDni9Rtrg== X-Google-Smtp-Source: AGRyM1vxunrryRLKRZB0tZ5E/wpySmxklz+mBU9GpldYHFwnCyJousJygAXN+QATaDteTf4N0dO/gg== X-Received: by 2002:a17:907:7da5:b0:711:c9cd:61e0 with SMTP id oz37-20020a1709077da500b00711c9cd61e0mr11257153ejc.443.1655510177994; Fri, 17 Jun 2022 16:56:17 -0700 (PDT) Received: from alco.lan (80.71.134.83.ipv4.parknet.dk. [80.71.134.83]) by smtp.gmail.com with ESMTPSA id z21-20020aa7d415000000b0043566884333sm1452538edq.63.2022.06.17.16.56.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jun 2022 16:56:17 -0700 (PDT) From: Ricardo Ribalda To: Laurent Pinchart , Mauro Carvalho Chehab , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, tfiga@chromium.org, senozhatsky@chromium.org, yunkec@google.com Cc: Ricardo Ribalda Subject: [PATCH v8 7/9] media: uvcvideo: Limit power line control for Chicony Easycamera Date: Sat, 18 Jun 2022 01:56:08 +0200 Message-Id: <20220617235610.321917-8-ribalda@chromium.org> X-Mailer: git-send-email 2.37.0.rc0.104.g0611611a94-goog In-Reply-To: <20220617235610.321917-1-ribalda@chromium.org> References: <20220617235610.321917-1-ribalda@chromium.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Another Chicony camera device does not implement the power line control correctly. Add a corresponding control mapping override. Bus 001 Device 003: ID 04f2:b5eb Chicony Electronics Co., Ltd EasyCamera Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 239 Miscellaneous Device bDeviceSubClass 2 bDeviceProtocol 1 Interface Association bMaxPacketSize0 64 idVendor 0x04f2 Chicony Electronics Co., Ltd idProduct 0xb5eb bcdDevice 90.45 iManufacturer 3 Chicony Electronics Co.,Ltd. iProduct 1 EasyCamera iSerial 2 0001 bNumConfigurations 1 Signed-off-by: Ricardo Ribalda Signed-off-by: Laurent Pinchart --- drivers/media/usb/uvc/uvc_driver.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc= _driver.c index b22d083833ee..425520f06ce4 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -2812,6 +2812,15 @@ static const struct usb_device_id uvc_ids[] =3D { .bInterfaceProtocol =3D 0, .driver_info =3D UVC_INFO_QUIRK(UVC_QUIRK_RESTRICT_FRAME_RATE) }, /* Chicony EasyCamera */ + { .match_flags =3D USB_DEVICE_ID_MATCH_DEVICE + | USB_DEVICE_ID_MATCH_INT_INFO, + .idVendor =3D 0x04f2, + .idProduct =3D 0xb5eb, + .bInterfaceClass =3D USB_CLASS_VIDEO, + .bInterfaceSubClass =3D 1, + .bInterfaceProtocol =3D 0, + .driver_info =3D (kernel_ulong_t)&uvc_ctrl_power_line_limited }, + /* Chicony EasyCamera */ { .match_flags =3D USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, .idVendor =3D 0x04f2, --=20 2.37.0.rc0.104.g0611611a94-goog From nobody Mon Apr 27 03:19:14 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9ED08C43334 for ; Fri, 17 Jun 2022 23:57:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234394AbiFQX5E (ORCPT ); Fri, 17 Jun 2022 19:57:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51016 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1383235AbiFQX4a (ORCPT ); Fri, 17 Jun 2022 19:56:30 -0400 Received: from mail-ej1-x631.google.com (mail-ej1-x631.google.com [IPv6:2a00:1450:4864:20::631]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7F94F663C9 for ; Fri, 17 Jun 2022 16:56:20 -0700 (PDT) Received: by mail-ej1-x631.google.com with SMTP id h23so11327529ejj.12 for ; Fri, 17 Jun 2022 16:56:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Re2uASyH1bxPGXC+tDXunHL1crXE28nbgdRRf+VAYZE=; b=dv/67EKp8F/1FkEq91cv5Q4jIKiMwID0vD2/5uqR9o4uUiOxZgHzT6LstOsaskky/J WGDN7EMDoaomFN0fBEMNM0Y7iwFhZ2O3saSdjwjQDm4GMNVpZXaUouVWWTj/A/WmUiOV +3Xac8jnuhxdMsIU/sQna8MF3t6CiPRYN1tOU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Re2uASyH1bxPGXC+tDXunHL1crXE28nbgdRRf+VAYZE=; b=u3D8Xm3I+v/cH4fD2ZsE11PiDIcvorEnxI+tQawRnkSrqhaIw9yTmqKpQe0ICtm3kc vsiV++pbt52LIuo0+I9nBgbHnxJGyEgKbKt1Dp7M7bj/pzNT+R+ulKC/3EZj9DyvMite o5b+aF3GBtanzDZPlBDh0PERAK3Zkf2vHpTpbJy+ylzPxQhZioCAJLH7XHGC5WMuai/+ 4VOM4d6Io4hJw89xxLJM7JqjNF/MydcAoJjUcR/cUVDU5IgiSY3WJXW8Pqx2CO275r1Q s9EmyDWoJ2/wwGX8RtLHdF9PvPaykUJk3mVSNPTx4BbCt0xb6AOuuFg1Gts2odcv6m+h 5akQ== X-Gm-Message-State: AJIora9TAwejlz+OlfwmzXC4G22prTIFaY26Jkg2FkEN2OO2sBuXmkYe 9VxgCHuzpyE4cOzNAHM3Y0Cf5Q== X-Google-Smtp-Source: AGRyM1v8NNGOwt6zPLVre6A6tr6YO5BFOQ8XbrWj1JrPm0JWr/omugcPjs24nr/YT0hTh4LUZ699sA== X-Received: by 2002:a17:906:7c0c:b0:6f9:1fc:ebf3 with SMTP id t12-20020a1709067c0c00b006f901fcebf3mr11637584ejo.403.1655510179108; Fri, 17 Jun 2022 16:56:19 -0700 (PDT) Received: from alco.lan (80.71.134.83.ipv4.parknet.dk. [80.71.134.83]) by smtp.gmail.com with ESMTPSA id z21-20020aa7d415000000b0043566884333sm1452538edq.63.2022.06.17.16.56.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jun 2022 16:56:18 -0700 (PDT) From: Ricardo Ribalda To: Laurent Pinchart , Mauro Carvalho Chehab , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, tfiga@chromium.org, senozhatsky@chromium.org, yunkec@google.com Cc: Ricardo Ribalda Subject: [PATCH v8 8/9] media: uvcvideo: Limit power line control for Quanta cameras Date: Sat, 18 Jun 2022 01:56:09 +0200 Message-Id: <20220617235610.321917-9-ribalda@chromium.org> X-Mailer: git-send-email 2.37.0.rc0.104.g0611611a94-goog In-Reply-To: <20220617235610.321917-1-ribalda@chromium.org> References: <20220617235610.321917-1-ribalda@chromium.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Two more cameras do not implement the power line control correctly. Add a corresponding control mapping override. Bus 001 Device 003: ID 0408:4034 Quanta Computer, Inc. ACER HD User Facing Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.01 bDeviceClass 239 Miscellaneous Device bDeviceSubClass 2 bDeviceProtocol 1 Interface Association bMaxPacketSize0 64 idVendor 0x0408 Quanta Computer, Inc. idProduct 0x4034 bcdDevice 0.01 iManufacturer 1 Quanta iProduct 2 ACER HD User Facing iSerial 3 01.00.00 bNumConfigurations 1 Bus 001 Device 003: ID 0408:4030 Quanta Computer, Inc. HD User Facing Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.01 bDeviceClass 239 Miscellaneous Device bDeviceSubClass 2 bDeviceProtocol 1 Interface Association bMaxPacketSize0 64 idVendor 0x0408 Quanta Computer, Inc. idProduct 0x4030 bcdDevice 0.02 iManufacturer 1 Quanta iProduct 2 HD User Facing iSerial 3 01.00.00 bNumConfigurations 1 Signed-off-by: Ricardo Ribalda Signed-off-by: Laurent Pinchart --- drivers/media/usb/uvc/uvc_driver.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc= _driver.c index 425520f06ce4..387b85fa1998 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -2700,6 +2700,24 @@ static const struct usb_device_id uvc_ids[] =3D { .bInterfaceSubClass =3D 1, .bInterfaceProtocol =3D 0, .driver_info =3D (kernel_ulong_t)&uvc_ctrl_power_line_limited }, + /* Quanta USB2.0 HD UVC Webcam */ + { .match_flags =3D USB_DEVICE_ID_MATCH_DEVICE + | USB_DEVICE_ID_MATCH_INT_INFO, + .idVendor =3D 0x0408, + .idProduct =3D 0x4030, + .bInterfaceClass =3D USB_CLASS_VIDEO, + .bInterfaceSubClass =3D 1, + .bInterfaceProtocol =3D 1, + .driver_info =3D (kernel_ulong_t)&uvc_ctrl_power_line_limited }, + /* Quanta USB2.0 HD UVC Webcam */ + { .match_flags =3D USB_DEVICE_ID_MATCH_DEVICE + | USB_DEVICE_ID_MATCH_INT_INFO, + .idVendor =3D 0x0408, + .idProduct =3D 0x4034, + .bInterfaceClass =3D USB_CLASS_VIDEO, + .bInterfaceSubClass =3D 1, + .bInterfaceProtocol =3D 0, + .driver_info =3D (kernel_ulong_t)&uvc_ctrl_power_line_limited }, /* LogiLink Wireless Webcam */ { .match_flags =3D USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, --=20 2.37.0.rc0.104.g0611611a94-goog From nobody Mon Apr 27 03:19:14 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C4F79C43334 for ; Fri, 17 Jun 2022 23:57:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1345857AbiFQX5B (ORCPT ); Fri, 17 Jun 2022 19:57:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51318 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1383354AbiFQX4b (ORCPT ); Fri, 17 Jun 2022 19:56:31 -0400 Received: from mail-ej1-x62b.google.com (mail-ej1-x62b.google.com [IPv6:2a00:1450:4864:20::62b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1965066AED for ; Fri, 17 Jun 2022 16:56:22 -0700 (PDT) Received: by mail-ej1-x62b.google.com with SMTP id n20so4575818ejz.10 for ; Fri, 17 Jun 2022 16:56:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=smgH2pDBx1ofaZrM152FsxaiSpM+uoxslxM+FEyW34c=; b=BeEQ4TJ+StpwEeRKtNhqEWyR6951KbaWIfursLBbX0/XJas5D2wzyKEk+BS1ToHLhM 1yea3fbBN1B05sTYEYC0j/VfjOmSdYMqyx6WBpE3PX4Z0Biddp9iTb4t/I3JF47MWy4u x8QhELQHJrISgpvWPiEKiKy7EQUp1igOTHMzw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=smgH2pDBx1ofaZrM152FsxaiSpM+uoxslxM+FEyW34c=; b=5qgrAv2/NPQagjg7vmSzY84aqK59Zmj061cKnkLncWcTxbyyQ3zxOxFRwnqrfwMnbz eR4KQXzRYpzdAPWGPgJ+MeWd9jBeakF3hf0oblJFXEyxo5H5HZBcH2zBXByik6r0i0+v maFd/6okBthTrhOcfP+BI31cdqGR5ZH6ir0udIrKdX+ulA6pe0d2yEisC1XmpGetSYNB z7ubc3mI5mdgnMsq9F9yYmolY/fIQYbjj61431yziZcPFBosqA13Q86rTHTnBz9y4uhs +UBzJ6+Ptnv8uP+XDgXv8UbkY4Vjmt2CVsaEBSRCt7/zJKSM+4klCumfL09BZtdI7n12 Xd0g== X-Gm-Message-State: AJIora9V9IL9wPcFshFOhqfjDjwmyLWzP5ur2hWMNQRBad3UV6IhzsdL SIPJBfaa2bQw9VXbHtQGE3JUHQ== X-Google-Smtp-Source: AGRyM1usF0zfm/ieUT9r1lbPRPzma4aEocNyIUPWHG/uKyyHfOm2qkqIawRoshKy0ZEENfPGxPRgyw== X-Received: by 2002:a17:907:1dd1:b0:715:73d2:df1f with SMTP id og17-20020a1709071dd100b0071573d2df1fmr11536181ejc.46.1655510180195; Fri, 17 Jun 2022 16:56:20 -0700 (PDT) Received: from alco.lan (80.71.134.83.ipv4.parknet.dk. [80.71.134.83]) by smtp.gmail.com with ESMTPSA id z21-20020aa7d415000000b0043566884333sm1452538edq.63.2022.06.17.16.56.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jun 2022 16:56:19 -0700 (PDT) From: Ricardo Ribalda To: Laurent Pinchart , Mauro Carvalho Chehab , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, tfiga@chromium.org, senozhatsky@chromium.org, yunkec@google.com Cc: Ricardo Ribalda Subject: [PATCH v8 9/9] media: uvcvideo: Limit power line control for Acer EasyCamera Date: Sat, 18 Jun 2022 01:56:10 +0200 Message-Id: <20220617235610.321917-10-ribalda@chromium.org> X-Mailer: git-send-email 2.37.0.rc0.104.g0611611a94-goog In-Reply-To: <20220617235610.321917-1-ribalda@chromium.org> References: <20220617235610.321917-1-ribalda@chromium.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The device does not implement the power line control correctly. Add a corresponding control mapping override. Bus 001 Device 003: ID 5986:1172 Acer, Inc EasyCamera Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 239 Miscellaneous Device bDeviceSubClass 2 bDeviceProtocol 1 Interface Association bMaxPacketSize0 64 idVendor 0x5986 Acer, Inc idProduct 0x1172 bcdDevice 56.04 iManufacturer 3 Bison iProduct 1 EasyCamera iSerial 2 bNumConfigurations 1 Signed-off-by: Ricardo Ribalda Signed-off-by: Laurent Pinchart --- drivers/media/usb/uvc/uvc_driver.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc= _driver.c index 387b85fa1998..e037d46b958e 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -3240,6 +3240,15 @@ static const struct usb_device_id uvc_ids[] =3D { .bInterfaceSubClass =3D 1, .bInterfaceProtocol =3D 0, .driver_info =3D UVC_INFO_QUIRK(UVC_QUIRK_FORCE_BPP) }, + /* Acer EasyCamera */ + { .match_flags =3D USB_DEVICE_ID_MATCH_DEVICE + | USB_DEVICE_ID_MATCH_INT_INFO, + .idVendor =3D 0x5986, + .idProduct =3D 0x1172, + .bInterfaceClass =3D USB_CLASS_VIDEO, + .bInterfaceSubClass =3D 1, + .bInterfaceProtocol =3D 0, + .driver_info =3D (kernel_ulong_t)&uvc_ctrl_power_line_limited }, /* Intel RealSense D4M */ { .match_flags =3D USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, --=20 2.37.0.rc0.104.g0611611a94-goog