Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp3488916pxf; Mon, 15 Mar 2021 10:38:33 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxsyRZrtVpz9ZJ+OFE1IfqNU6eZC4bECJ7lywIxMfX/6ydOea9aAqdK+2GD09usDzK3oZ/O X-Received: by 2002:a05:6402:c96:: with SMTP id cm22mr31559565edb.128.1615829913517; Mon, 15 Mar 2021 10:38:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1615829913; cv=none; d=google.com; s=arc-20160816; b=Dz3eADTx91o16ZPgRs3l5hPCbiieq0rVU3aznmAikYWcClP6W6lWeWkOCbyObiNkSb uveouGPkNyRzh75LB80+bmDhQ+tLGERFzrwzPEARj86gFCjjUVoMocrobmETPD1wKdb3 eGDieybY3r6OceWL71iwSeq+LUOOw4ABh3k1Ap5nzwQOiBSWen2uMB3SU2kL2xdZSqTw 5AAFy+EkaQseF1pvbqd0EetrOBEh2JxXv95ERi7z5FmBDRJ0LbL9E9uTnd5wgs2yhUZ9 GgYHgIQ9wsxIV+PqO0w6NJMskjoXt+9olL5SLu5pdRqnsDMa4rohc16XLNPZCtXFNizz PURg== 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=LyOZSvQ+FKwW7E5BHy4fGSxNISgDCKWH+IcVuvUxQPk=; b=l2yrMdGaIogtccuLx9Z2JWxRASt8jNH+aBGH0tXk/NDIqtOoBBkq0Hl2LeURKF5dLB 0KCpRyIVzLqyCYXzg8B2Ioxq+zaaYrNxyFG9Os2VM1XUeRArgdu7T0tHzvh2vT0TQqFr U3jaMeEk3AgnU/h1Ffp947nBeHxyW/zGBS8xanq1zmTcQUu0URtHOnU1nY5DdkUETSUa DZUmA3sZ0LzpZUb8+8/s2bQ1ya7X+yrnMvZWE3udgoOLQfVOBbWb+gwgh3AXOpnsXdea ne31hNr9yc7e+MIg3WshkTtYQfiyw7I+m12T/n99LE2VwiZa2nT72EjtAUbinfSFUSj5 L4Dg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=ZsUSogGM; 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 k13si11717670edr.48.2021.03.15.10.38.09; Mon, 15 Mar 2021 10:38:33 -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=ZsUSogGM; 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 S236547AbhCORgs (ORCPT + 99 others); Mon, 15 Mar 2021 13:36:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35732 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234788AbhCORgQ (ORCPT ); Mon, 15 Mar 2021 13:36:16 -0400 Received: from mail-ed1-x52a.google.com (mail-ed1-x52a.google.com [IPv6:2a00:1450:4864:20::52a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D908DC06174A for ; Mon, 15 Mar 2021 10:36:15 -0700 (PDT) Received: by mail-ed1-x52a.google.com with SMTP id y6so18284363eds.1 for ; Mon, 15 Mar 2021 10:36: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=LyOZSvQ+FKwW7E5BHy4fGSxNISgDCKWH+IcVuvUxQPk=; b=ZsUSogGMUoOjz4dBzt1oyDFFVLnQ1MoQf7tmUaBrD3hjNggCbJ+AO3evQJ84ZZZ3ab vV7fXJmzdknz5aH3kAgSkhlKuGFQ4qfqB/4AosO97FaJHFyftkJ4KEFd9JnCnxPtDrcc bKtWefq5u0OASLXEPSO5xZ4pHSBUAXozez6XY= 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=LyOZSvQ+FKwW7E5BHy4fGSxNISgDCKWH+IcVuvUxQPk=; b=cd/UBSs0SwmXWpDSfnvmGDqvteEY9eqwgu2C0no9A1LrfMHt5YOGcK/M4584slHUJN 7j104Abipv54ECBIklTQimZzIxcGmrAu1yNDRbUKaPyn6FwNhCnEy/byXci8uzhcEsu3 0oRTZ3BVPD+TtzF0K662HzGMJmgAdQvvcxD37uR5uNejDpc2G68oy/V2ST1YetbvttSE XgZu8jymbWhyrR7YORijpf/R+iwrNvdAs9+R4QnDmf1XHzUvyZVOYFLOxmKTlhpPGIsm /89Eewyr0zv+D1e46Zr+EdHTrNdxyW0bhuJCPM3c0kR4aq8R2UcldqlEN6q0ncsvBADN TAKg== X-Gm-Message-State: AOAM530PJ67BdMRu87EfAjLbNlKTcuEldXMkN1MyCaqsRyM3U67aO4CZ DJGO+xE+Hy45pl+2q+VxHP67DA== X-Received: by 2002:a50:ec96:: with SMTP id e22mr31290132edr.385.1615829774539; Mon, 15 Mar 2021 10:36:14 -0700 (PDT) Received: from alco.lan ([80.71.134.83]) by smtp.gmail.com with ESMTPSA id a3sm8109239ejv.40.2021.03.15.10.36.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Mar 2021 10:36:14 -0700 (PDT) From: Ricardo Ribalda To: Laurent Pinchart , Mauro Carvalho Chehab , Hans Verkuil , Sergey Senozhatsky , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Ricardo Ribalda Subject: [PATCH v4 05/11] media: uvcvideo: refactor __uvc_ctrl_add_mapping Date: Mon, 15 Mar 2021 18:36:03 +0100 Message-Id: <20210315173609.1547857-6-ribalda@chromium.org> X-Mailer: git-send-email 2.31.0.rc2.261.g7f71774620-goog In-Reply-To: <20210315173609.1547857-1-ribalda@chromium.org> References: <20210315173609.1547857-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 keed 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 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 30ef2a3110f7..35873cf2773d 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -2423,14 +2423,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.31.0.rc2.261.g7f71774620-goog