Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp1577530pxf; Fri, 19 Mar 2021 10:11:59 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyWI0SU1fHR/Zx0BDcUGkbhRRwB6ySm4YiBBaADeLR80IAouGLUWGrmNUqtp/lumZKBrTGz X-Received: by 2002:a17:906:2ac1:: with SMTP id m1mr5558220eje.472.1616173919480; Fri, 19 Mar 2021 10:11:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1616173919; cv=none; d=google.com; s=arc-20160816; b=zUOFpJNXbr2xGZHb/yFTR3X6QPC/Vbat9HE6dxFcjxjup5Jx8mFziRUsxLu2hZ3b4F QhBmbvLTRDA0x/mR5wZKWvfKYoUbQo9VUWokrRjPHeWo9vJTcPvGdRIZWM46saqnErqH MMBuP0Dq61qw5F3R4VtQVyWCVCgSLI5pb4ePYMBuNZZ+jQN4Z+jrz0XswBqDQsCu0tNM 17+qvpBC4S0OXJAK/2OxxMfxY9lei71E3o17UpAzyy3tlGCkUzve1OiyhlOGTYm867/Y OfKp1cQ55CZXZWcmlZHl6I9fmtHPvgCISKay4PmTSuB5LpUczqnrc1h6at8XSvFYgwAN FFyA== 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=Vbmq6DvAp8/As0foK4j0pVO4aWYaVi9swp3Py2nra/g=; b=NJt5DFqzAiNpthT0FR5QM0EpapFVfOyw4M1MEB41rFCTcbQJkUale0lsG6N/Nc2Cpv y51LinoDI9/3Fy7ixqqZoOYlbH/cc8hPRg39gjsuSDIYy3xDI6Kuq/vJZ2Opfa+WhOEo nmAaNu9r/6DeMHsBQGtGhP98JeLWHrN/LWenduvcRN7k4PsYfqfVO20YuzMIHYVYIzmK oHxxcRRzkKNo6e+pRuPi2uk4WUGobJZQ/rMxUTfT3FPkfSAmK0abWtVsUhKV4Z7mfjPQ RMDVDfeua1WFkjQrDxwFNazCW3CFr8+6jr9uegNcPs1HAIIGtTRgA3am42qv6XLqjre0 GCDg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=K1mI3bhz; 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 bw19si4418453ejb.85.2021.03.19.10.11.36; Fri, 19 Mar 2021 10:11:59 -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=K1mI3bhz; 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 S230473AbhCSRJz (ORCPT + 99 others); Fri, 19 Mar 2021 13:09:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33368 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230194AbhCSRJQ (ORCPT ); Fri, 19 Mar 2021 13:09:16 -0400 Received: from mail-ej1-x62a.google.com (mail-ej1-x62a.google.com [IPv6:2a00:1450:4864:20::62a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4FA08C061760 for ; Fri, 19 Mar 2021 10:09:16 -0700 (PDT) Received: by mail-ej1-x62a.google.com with SMTP id jy13so10861391ejc.2 for ; Fri, 19 Mar 2021 10:09:16 -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=Vbmq6DvAp8/As0foK4j0pVO4aWYaVi9swp3Py2nra/g=; b=K1mI3bhzTFCvdDooDLvfIT6wz1CpeTQuGptAmfgkcso6MCHgpWmuo0RWDvQ4/d/HyP Ti5aY8LNByf+cbvJ9DEJh85DGxoNScdMkW8oLF6fawfSWvvwINECR62U6qR5r5OtRGJ7 trPBmmdo74GtGw/KB39Vlznoz9i5Uz44r2/+U= 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=Vbmq6DvAp8/As0foK4j0pVO4aWYaVi9swp3Py2nra/g=; b=DTSfZvDMZJoo8DTCLjm2gvvMo0ktWxN/NpkNNKeZ1hyw8VhV253e1uGNPhjjMoXEGN D8uqpGdGdNvncNLL+17xuUoWdOEQ5t/dnjwv1hWeLyjWfs4rMT1B56Ug9VCXQC/J8hxZ RuYZLMJfD5sTCJQ5gUkYequqzs9fzV5g4/4nknfHHoUvqRu5wwU5wYald2ucgWmj5h1y n2cpSNJUyNnI//sPPHjf4J7uO60A4EeBOiXNdToYchziCPzBsMjxu2cTyruS5ATal00K UPsCFVBFbm7TE3Vj+902znTJTScle+LC7nzOS9/CvCtziwxURk0EtaMofmozQw0lSYlj hubg== X-Gm-Message-State: AOAM531lK4FW0R5C4N7Ib1GpzuEkPCmORz8dAOx9k3HeEPM4nQNt8in/ ymItH0rp2clTTlEvQezPFrL7Vw== X-Received: by 2002:a17:906:e2d4:: with SMTP id gr20mr5637603ejb.432.1616173755039; Fri, 19 Mar 2021 10:09:15 -0700 (PDT) Received: from alco.lan ([80.71.134.83]) by smtp.gmail.com with ESMTPSA id be27sm4506050edb.47.2021.03.19.10.09.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Mar 2021 10:09: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, tfiga@chromium.org Cc: Ricardo Ribalda Subject: [PATCH v8 08/19] media: uvcvideo: refactor __uvc_ctrl_add_mapping Date: Fri, 19 Mar 2021 18:08:55 +0100 Message-Id: <20210319170906.278238-9-ribalda@chromium.org> X-Mailer: git-send-email 2.31.0.rc2.261.g7f71774620-goog In-Reply-To: <20210319170906.278238-1-ribalda@chromium.org> References: <20210319170906.278238-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.rc2.261.g7f71774620-goog