Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp1373966pxj; Fri, 18 Jun 2021 05:57:25 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxvVmICiI/siWPrQ1CB/4x4x4KDiLReU41iGLMb4n1t4Vtm1yTRxIjlq37o0RvlFg/j5AgF X-Received: by 2002:a05:6638:3898:: with SMTP id b24mr445080jav.17.1624021044876; Fri, 18 Jun 2021 05:57:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1624021044; cv=none; d=google.com; s=arc-20160816; b=Oio1idazW03NmG7MYwxuVjladcaITiYZLt440dJiFiOqz7mDU9vYtF3sWA78VP615z 3PdBoGpSL53e5yMNawWB6xRnzQ9YOneSHzThuVjRhqtkxXzQxl6bgn11pLm9WDy1UTLa kPuxdbYnq4y7MEptaFbzrsx7kuMU0uv1Vi1FnolXrmn0I5PZHSOPQCR3O3M5g0Ubb8Q6 4z5Y9dftEtahwBfvwvt2QNVSzS4wTj8AL5vF+5YbX9glpmjqVsAaw78EctK79ArsVraS Zw4KlDG/cN+7TGzy/tu57I9haJg1xrlnp/zStEJ7eOdAI9uRelQi3rOyci3vkM/heqWr gsSA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=CEVfcS9nZbetqrpATivAP09HKWqGGzcXWpW+RlEV1qo=; b=ljPM6Hr4OD5cPj0f5PFvBbF8zJpFqXaUFCLBknUgLuzuUsMbbYyvxIC5N4lTv9BRdG H3Evi1wHfRv4Nnz9kO0MGhPVWFT5hnPVthkg77aTbJHbjxg/KWaCPImWdoqqoMZ2m/8o wvVjhY6cFyclgqHsVBD4x2GzAs0oNbbTT/c4aCYiEqRDqlMNEZtEWaYWGICuvyWEWJ// aB/KRTGcIgcmFzgwapy+BuypoWVWr12N03pxzTfKjqFWigRpTc+Iux5w5fAGzAxeRH91 X1kYI3LZqQSQcEaPUoUPxW6bSbWVbvzfrtEYYmQf0RJIlATsJELULblL1CUw+/CSKYja O5pQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=cARKgYSC; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id n6si2563058ilk.148.2021.06.18.05.57.12; Fri, 18 Jun 2021 05:57:24 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=cARKgYSC; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234361AbhFRMcG (ORCPT + 99 others); Fri, 18 Jun 2021 08:32:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46184 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234317AbhFRMbo (ORCPT ); Fri, 18 Jun 2021 08:31:44 -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 993C7C061280 for ; Fri, 18 Jun 2021 05:29:32 -0700 (PDT) Received: by mail-ej1-x636.google.com with SMTP id dm5so3254469ejc.9 for ; Fri, 18 Jun 2021 05:29:32 -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=CEVfcS9nZbetqrpATivAP09HKWqGGzcXWpW+RlEV1qo=; b=cARKgYSCnoXJBVZT90iUykflTMwZyV+2Mn87jL33rsIT/zwDdl7gqiRSaLafwJ1okU dZct2XV12vKyCYNs+dqTDPpWIpULz5U6kM+bOcRiD6p0WQpGraPtjNnk7+u16vnVww/x 50hdyE3g6Q7a8G/eAzTPRAEgXDGkMFkXvBwiU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=CEVfcS9nZbetqrpATivAP09HKWqGGzcXWpW+RlEV1qo=; b=ePmuPEZnVkRXieD68QPdNYuZl7Zq0as5My9BuXjYkkm/QI2niKNbVWmiVbALTNidvk WMM0TjyaFBM/dDaNAMCTL/30b60W3SrnxH+Iq9H765l6rqYD6nbXK7xTS8fM+7DqlxBX 7DvsFL44gSDANANcPaSK0+60PekofEn0tAV2YpNpvGRd8344HkCoZtmxElN1MbDwENta 2zZRLHGasFFjxpac4PmYYBRk7Ofr7t9BvXc/6LkML0D3qvTzeu7PG3yLihLdTtCXsLIx yaXY0SaYIvB/8DVm8ZVhXEvRLVzxEY/jWrj6FpCG7auCKhJzwvYr0ZHxYHc5vWm5Z74f 76vQ== X-Gm-Message-State: AOAM531/wBZZcArHRNddZP8tx22DJHuecqUnpQlqkb62ZKJPyidC0ZT7 DiRD3OQGTbNaktDQjxGsgWZuyQ== X-Received: by 2002:a17:906:3b57:: with SMTP id h23mr7298392ejf.241.1624019371155; Fri, 18 Jun 2021 05:29:31 -0700 (PDT) Received: from alco.lan (80.71.134.83.ipv4.parknet.dk. [80.71.134.83]) by smtp.gmail.com with ESMTPSA id o26sm4336403edt.62.2021.06.18.05.29.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Jun 2021 05:29:30 -0700 (PDT) From: Ricardo Ribalda To: Laurent Pinchart , Hans Verkuil , Mauro Carvalho Chehab , Sergey Senozhatsky , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, tfiga@chromium.org Cc: Ricardo Ribalda Subject: [PATCH v10 08/21] media: uvcvideo: refactor __uvc_ctrl_add_mapping Date: Fri, 18 Jun 2021 14:29:10 +0200 Message-Id: <20210618122923.385938-9-ribalda@chromium.org> X-Mailer: git-send-email 2.32.0.288.g62a8d224e6-goog In-Reply-To: <20210618122923.385938-1-ribalda@chromium.org> References: <20210618122923.385938-1-ribalda@chromium.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Pass the chain instead of the device. We want to keep the reference to the chain that controls belong to. We need to delay the initialization of the controls after the chains have been initialized. This is a cleanup needed for the next patches. Reviewed-by: Laurent Pinchart Reviewed-by: Hans Verkuil Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_ctrl.c | 41 ++++++++++++++++++++---------- drivers/media/usb/uvc/uvc_driver.c | 8 +++--- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c index b3dde98499f4..b75da65115ef 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -2057,7 +2057,7 @@ static int uvc_ctrl_add_info(struct uvc_device *dev, struct uvc_control *ctrl, /* * Add a control mapping to a given control. */ -static int __uvc_ctrl_add_mapping(struct uvc_device *dev, +static int __uvc_ctrl_add_mapping(struct uvc_video_chain *chain, struct uvc_control *ctrl, const struct uvc_control_mapping *mapping) { struct uvc_control_mapping *map; @@ -2086,7 +2086,7 @@ static int __uvc_ctrl_add_mapping(struct uvc_device *dev, map->set = uvc_set_le_value; list_add_tail(&map->list, &ctrl->info.mappings); - uvc_dbg(dev, CONTROL, "Adding mapping '%s' to control %pUl/%u\n", + uvc_dbg(chain->dev, CONTROL, "Adding mapping '%s' to control %pUl/%u\n", map->name, ctrl->info.entity, ctrl->info.selector); return 0; @@ -2168,7 +2168,7 @@ int uvc_ctrl_add_mapping(struct uvc_video_chain *chain, goto done; } - ret = __uvc_ctrl_add_mapping(dev, ctrl, mapping); + ret = __uvc_ctrl_add_mapping(chain, ctrl, mapping); if (ret < 0) atomic_dec(&dev->nmappings); @@ -2244,7 +2244,8 @@ static void uvc_ctrl_prune_entity(struct uvc_device *dev, * Add control information and hardcoded stock control mappings to the given * device. */ -static void uvc_ctrl_init_ctrl(struct uvc_device *dev, struct uvc_control *ctrl) +static void uvc_ctrl_init_ctrl(struct uvc_video_chain *chain, + struct uvc_control *ctrl) { const struct uvc_control_info *info = uvc_ctrls; const struct uvc_control_info *iend = info + ARRAY_SIZE(uvc_ctrls); @@ -2263,14 +2264,14 @@ static void uvc_ctrl_init_ctrl(struct uvc_device *dev, struct uvc_control *ctrl) for (; info < iend; ++info) { if (uvc_entity_match_guid(ctrl->entity, info->entity) && ctrl->index == info->index) { - uvc_ctrl_add_info(dev, ctrl, info); + uvc_ctrl_add_info(chain->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); + uvc_ctrl_get_flags(chain->dev, ctrl, &ctrl->info); break; } } @@ -2281,22 +2282,20 @@ static void uvc_ctrl_init_ctrl(struct uvc_device *dev, struct uvc_control *ctrl) for (; mapping < mend; ++mapping) { if (uvc_entity_match_guid(ctrl->entity, mapping->entity) && ctrl->info.selector == mapping->selector) - __uvc_ctrl_add_mapping(dev, ctrl, mapping); + __uvc_ctrl_add_mapping(chain, ctrl, mapping); } } /* * Initialize device controls. */ -int uvc_ctrl_init_device(struct uvc_device *dev) +static int uvc_ctrl_init_chain(struct uvc_video_chain *chain) { struct uvc_entity *entity; unsigned int i; - INIT_WORK(&dev->async_ctrl.work, uvc_ctrl_status_event_work); - /* Walk the entities list and instantiate controls */ - list_for_each_entry(entity, &dev->entities, list) { + list_for_each_entry(entity, &chain->entities, chain) { struct uvc_control *ctrl; unsigned int bControlSize = 0, ncontrols; u8 *bmControls = NULL; @@ -2316,7 +2315,7 @@ int uvc_ctrl_init_device(struct uvc_device *dev) } /* Remove bogus/blacklisted controls */ - uvc_ctrl_prune_entity(dev, entity); + uvc_ctrl_prune_entity(chain->dev, entity); /* Count supported controls and allocate the controls array */ ncontrols = memweight(bmControls, bControlSize); @@ -2338,7 +2337,7 @@ int uvc_ctrl_init_device(struct uvc_device *dev) ctrl->entity = entity; ctrl->index = i; - uvc_ctrl_init_ctrl(dev, ctrl); + uvc_ctrl_init_ctrl(chain, ctrl); ctrl++; } } @@ -2346,6 +2345,22 @@ int uvc_ctrl_init_device(struct uvc_device *dev) return 0; } +int uvc_ctrl_init_device(struct uvc_device *dev) +{ + struct uvc_video_chain *chain; + int ret; + + INIT_WORK(&dev->async_ctrl.work, uvc_ctrl_status_event_work); + + list_for_each_entry(chain, &dev->chains, list) { + ret = uvc_ctrl_init_chain(chain); + if (ret) + return ret; + } + + return 0; +} + /* * Cleanup device controls. */ diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c index 9a791d8ef200..14b60792ffab 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -2455,14 +2455,14 @@ static int uvc_probe(struct usb_interface *intf, if (v4l2_device_register(&intf->dev, &dev->vdev) < 0) goto error; - /* Initialize controls. */ - if (uvc_ctrl_init_device(dev) < 0) - goto error; - /* Scan the device for video chains. */ if (uvc_scan_device(dev) < 0) goto error; + /* Initialize controls. */ + if (uvc_ctrl_init_device(dev) < 0) + goto error; + /* Register video device nodes. */ if (uvc_register_chains(dev) < 0) goto error; -- 2.32.0.288.g62a8d224e6-goog