Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp1212858pxf; Fri, 12 Mar 2021 04:51:50 -0800 (PST) X-Google-Smtp-Source: ABdhPJz82qScttuqF9k+5FCy+83t8Ox/c49tePNhdijFnwB9fgOm1TsbrZVgACAiHaEO6Kt6SpBR X-Received: by 2002:a05:6402:4395:: with SMTP id o21mr13730453edc.22.1615553510327; Fri, 12 Mar 2021 04:51:50 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1615553510; cv=none; d=google.com; s=arc-20160816; b=NO7s3wAOv/4rW1SKKLrzC0Nb4OBSvlfRed8itfm+sTJ5vdu/AlxntJaphLiQi5R3jj oZM4ug8EFP7otVs5ZkW507W6e1YquijDCXPCZYO5SRWFbMF5+pDrKbpRQwn+nzxStp2J 3tgOkzA0A4EtQ98Fra2CBtCTJGfLHMwMb2OaQWrONQdkz60eJ62RToh0PnnFXntNkXhX W8DQPA+nYZF2h/sjbV6+JtG9GjVHLFCUhSi6z8glxADy25kB7YrXpZw//0GVYNV2/NhM uOnRrjWCJWG8Fel36TEJNrHk6U1jbYDPNFps+M+v3zI2IQhfr07Tl2PmmpSbJEMO1cD1 dZTg== 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=RYWQRmXCJ6/UasbZqdSmOkECNSkwLA511lEj8hQno1s=; b=rXnLKC1aWw1+8h8ryWwFYR2ArBt/Z5PxrbFTyNSVRpUw758vTKjnKx/9gMGItLrG5z csBdVmvmPubENLgAgNMwEWc4ouI30XMyVUu9vopyROLs59srwIS2HlU1EWoBHloYBB10 5T4nAv2/aELb3Bc7vNGKNLojxTSEKVmQOlTNzmMbQmlNKhQ20D4vFKY0Cg4htug1JTQI cXIosr4hPzfRyv67ygGLVIi7Z5PHTVRs9BImBbrlyFlGIVojYkGd7y1BNxfqXZgCEXdL 08sEu7msrCZVgnvDoEcoq0/JQnhF9VZKTyzeU2q2VDhGWAxj+7zSVS7uoJP05rIvkTfu a3QQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=P0zLdIoN; 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 u6si3834560eje.555.2021.03.12.04.51.25; Fri, 12 Mar 2021 04:51:50 -0800 (PST) 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=P0zLdIoN; 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 S231564AbhCLMtO (ORCPT + 99 others); Fri, 12 Mar 2021 07:49:14 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37354 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230072AbhCLMsh (ORCPT ); Fri, 12 Mar 2021 07:48:37 -0500 Received: from mail-ed1-x532.google.com (mail-ed1-x532.google.com [IPv6:2a00:1450:4864:20::532]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 47339C0613D8 for ; Fri, 12 Mar 2021 04:48:37 -0800 (PST) Received: by mail-ed1-x532.google.com with SMTP id j3so7783131edp.11 for ; Fri, 12 Mar 2021 04:48:37 -0800 (PST) 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=RYWQRmXCJ6/UasbZqdSmOkECNSkwLA511lEj8hQno1s=; b=P0zLdIoN9Db+vChLZxTPPY7MrgEFqGwJOeV2eA0S3GkEL36dCyhMCAkosfL0Z30qwH s16cojezgadqigRoWXf5IhZNME9w3flx3uoVQ1Cthgx4iBBJzr/9JEnxCm7cW3zG590Z CglKO0vbm9C5QK55JEaqGRuslBSKCFLftSEyE= 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=RYWQRmXCJ6/UasbZqdSmOkECNSkwLA511lEj8hQno1s=; b=gtcIsRmmX1OEKLfc005Pytvzq3yUa7Z268HWuABKtaskOROP9HtYHeDgkRyqextzUu vBVFA8l7ev5W8Hto5ON6f9tCP1VS1sMCM7tSFgJJJWqvMpke4+M/S8oagmzpbasEFGJq yX8LUlMBoB7+EfvVd7OY2Q6XFwXEXHblVnmaTBMuSl7xhvBbqbvt2kjNJjNtwTNbRZaj R4hccC0Mq0QQ792i6fZp2kWX1B3yEXWfoUkc60Yl4StkoxV4p12YfBnjeuUtRTBzBLdX PtdPQGepalFJ2fFQiHPnCyJciLakojlL52mYzPOvQXyh2XcoWLRD/hDDhTFSkEBC2Jm+ eRGA== X-Gm-Message-State: AOAM533oia5GXOEnuYz9NLYGmuxxVKxFJ8dewTWVYhIq60yi3ijD5QhU tfPDdjPP1FQjbs9TVQ83zBsfJA== X-Received: by 2002:a05:6402:d07:: with SMTP id eb7mr13509064edb.242.1615553316058; Fri, 12 Mar 2021 04:48:36 -0800 (PST) Received: from alco.lan ([80.71.134.83]) by smtp.gmail.com with ESMTPSA id t6sm2924402edq.48.2021.03.12.04.48.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Mar 2021 04:48:35 -0800 (PST) From: Ricardo Ribalda To: Laurent Pinchart , Mauro Carvalho Chehab , Tomasz Figa , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, senozhatsky@chromium.org, Hans Verkuil Cc: Ricardo Ribalda Subject: [PATCH v3 5/8] media: uvcvideo: refactor __uvc_ctrl_add_mapping Date: Fri, 12 Mar 2021 13:48:27 +0100 Message-Id: <20210312124830.1344255-6-ribalda@chromium.org> X-Mailer: git-send-email 2.31.0.rc2.261.g7f71774620-goog In-Reply-To: <20210312124830.1344255-1-ribalda@chromium.org> References: <20210312124830.1344255-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. 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..90ecdc24d70a 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 ret; +} + /* * 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