Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp1186669pxf; Fri, 26 Mar 2021 03:00:16 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzp1K+3dwz30+ViecYxCXAqnB4Ny1C/aoBx8Wwg3IDl2mmcnMcndALmL+tvuCi9N3ZOe0uE X-Received: by 2002:a17:906:ecf3:: with SMTP id qt19mr14098840ejb.467.1616752816709; Fri, 26 Mar 2021 03:00:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1616752816; cv=none; d=google.com; s=arc-20160816; b=xBu+E3+fu3Vd6PRJcLJve1V9dyGEVYtwcAz7Ow9q5nIok8HTHY6GftrETZxrrMEJoi lr277DIqr7XWSuH+qEg5jT3/we1FXtJEyy+VVqAf58yIYbiO+U/4YhJr9T2AseMjYAlt XJqUYlJDfUFeaV5ST4sHFHEcGh/FSIXkONUyA4curycrSKqIDAaMuQI0BqzNHWT7DiX5 +644O69ZEuePORMxU/yT+S+Ftx40mXqj0/sk3Kx/DBAMghWTiDdihRMwST9j8VQxPWiv zEaK3Xk0Q7glZropwk45zBFQofNdzEfsXafE2y1ygCIc9fIvGVBMCLzKU4kmuY1oY+6S ueEw== 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=PozJDrjBoFoiSACjiJTngE3Hc/EWz/RcQCo80H4qmY4=; b=j1kJBXxzSlsIXLN4bHCI8q6718gqq8FnMW8u1MxZLVXbqzE9cTsfOetdWAbxyS8dz4 1H28L8n2Nz0po+euxRrngavRywlJiL7r4CZfp320ZdBAL1p19543HtIqI6aVW3qLgqKt XpxOEy9msaKTdu1gD4RTW82dZXo3xR+oe22RkOjGzjZu77ZQuxsQNERajuLwTb4Q/gP7 ohgci3HeuoDKwoeVwS2jzuD/vplgWd+aN6yK2sUxVa8YBg4/I8Ls5QMfGU0+b5jg68bi dpKtFxcUcsNTuwp1fWaq2yeFLCfkcdxS0vcmUdRyQSMMEdZaguTFRycuQpKw4158dq+x pfZA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=B281Mtgj; 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 l6si6264933ejo.624.2021.03.26.02.59.53; Fri, 26 Mar 2021 03:00:16 -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=B281Mtgj; 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 S230230AbhCZJ7F (ORCPT + 99 others); Fri, 26 Mar 2021 05:59:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49608 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229969AbhCZJ6v (ORCPT ); Fri, 26 Mar 2021 05:58:51 -0400 Received: from mail-ej1-x629.google.com (mail-ej1-x629.google.com [IPv6:2a00:1450:4864:20::629]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 20BE1C0613B1 for ; Fri, 26 Mar 2021 02:58:51 -0700 (PDT) Received: by mail-ej1-x629.google.com with SMTP id kt15so7467606ejb.12 for ; Fri, 26 Mar 2021 02:58:51 -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=PozJDrjBoFoiSACjiJTngE3Hc/EWz/RcQCo80H4qmY4=; b=B281Mtgj/j0RDsuT3O9weLX9L+2dGtyBfinH0McNTQFKKbJmnwab1zsesWdyWnS39O IWY4OXmGDJdA21vr+7JgA8qwj7Pi/Ek5idb4y6nFUuxNqFz/DHhfve+9rFP8jgU+c/Cz iAdCTQawixOdRhk19yy4Jex8oHMXV1Qxw8GG0= 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=PozJDrjBoFoiSACjiJTngE3Hc/EWz/RcQCo80H4qmY4=; b=RUMhi7RPtKuVd8vuRO469ikbDJ/6GyCs5xiuyudUb9xzVjC8tCVntmy4Z74AzWq8IM yuOQt6TIgfULoUebpRRUWBBxLCQtDeH99UGUmrKO3cZoGNDdri/77M5IgwGIgwncbKQ8 YpAmRYJCDRu6y8iFcZ+DrWMeUTzY258RwWe+JVUDo7olS5LKYGkk+wyGmEN6s5r+6avl VRF84jmQYXH5xSsOEQFXpVPu/ln8W3OIqUFa8KHftIzXAGFH4Yt/B98iJzkKhWxgx3Xd xNDH80nFceK9dzaU182VcjSanRq9tfQfGa2qkxT0kfR7cLSA+61xU2gnmqWffotpSr4U yKzg== X-Gm-Message-State: AOAM530YqRiFraKIALuLqaFa9PcoBQhVA6eaKFXzwj5w0IVl2vj7O6TS tOnSx3E0h1LKAvkFGute7vLVPA== X-Received: by 2002:a17:906:7c44:: with SMTP id g4mr14179083ejp.269.1616752729888; Fri, 26 Mar 2021 02:58:49 -0700 (PDT) Received: from alco.lan ([80.71.134.83]) by smtp.gmail.com with ESMTPSA id h13sm4036658edz.71.2021.03.26.02.58.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 26 Mar 2021 02:58:49 -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, tfiga@chromium.org Cc: Ricardo Ribalda Subject: [PATCH v9 08/22] media: uvcvideo: refactor __uvc_ctrl_add_mapping Date: Fri, 26 Mar 2021 10:58:26 +0100 Message-Id: <20210326095840.364424-9-ribalda@chromium.org> X-Mailer: git-send-email 2.31.0.291.g576ba9dcdaf-goog In-Reply-To: <20210326095840.364424-1-ribalda@chromium.org> References: <20210326095840.364424-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 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.291.g576ba9dcdaf-goog