From patchwork Wed Nov 1 10:54:34 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Bryan O'Donoghue X-Patchwork-Id: 160519 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:abcd:0:b0:403:3b70:6f57 with SMTP id f13csp326502vqx; Wed, 1 Nov 2023 03:56:51 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHckzkki4OptC/UIuN/BzTJOS9AYF7qB9Ast7c3rUsiwEmBny22KOVV6+hXnHn4e5y4m3WT X-Received: by 2002:a05:6358:5912:b0:168:e876:de46 with SMTP id g18-20020a056358591200b00168e876de46mr13346277rwf.27.1698836211470; Wed, 01 Nov 2023 03:56:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698836211; cv=none; d=google.com; s=arc-20160816; b=wLPHRU5JbbDgLwDKkC5yVdzo7yshk0/5xgBy4UqAWpLvmv8I9h+7DxVwoK5jokhE8U yvHAuTw+R8ZsVhjv7rqujkOfKyp9pcJ9wewbo6IibOZbyRYQgKIiDBfopKxMa7vhYteb s2zW7BUIVAXr6FBI3q1+a38niqDXjL2NS9s9Hl5rQs5gnpmLgZXlJKhefNq+qnGST1NJ RAl3cxiKT4VFPIvCx+R4fcHh6kCfiswtsOJnWBM9dqijm3/YIVlevhB8bi0EOBZ6/OWn EQhWjccv3Fzp4eqN7X9EbNFu7HF3YwPOFVPKUlmxrSY6AcwcE9hEjN4ql7y7VTAYpBhJ AlAQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:in-reply-to:references:message-id :content-transfer-encoding:mime-version:subject:date:from :dkim-signature; bh=fN35jdBut2R695pmfQNF8kcSJalU/FCNDBQnENZZob0=; fh=i6Xq0IxPe+xfIAGis/HEEizm5QSFvbEDbWBJK8514h0=; b=S4TPFJOjZxth99A9EQb2o6mzFF8LuV3is8Yqvhi7DOl2KdPzsU8xkN3rDoUN2WsbTm pox32zwKtpR6fD/j2moEQlNSFS0fTafXGAhUsG5z468OOvnZ1TrQmhe6q0kzYL514ccD LSm3PDAHXFibAsP6PY88Aj/l1/SEPTAYfZQgmpbmB0YuFGuyWFhzJZ93LVeECAL9VsvK tF+XGzvG8shsxpf+JU4wRbksAc5KakSOWK6DAML8CA+lD/xX3WG5UDqX5g5Qn02UWeNz ZuvfC3m2keoQA2DpPJJXTQk18VXjfGvR9b9zHq+phY1VgxQmCJMBOON1+8gVf3bKXHKO WeeA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="nKvWW/pp"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from lipwig.vger.email (lipwig.vger.email. [23.128.96.33]) by mx.google.com with ESMTPS id 143-20020a630195000000b005b9053cf6f2si2784411pgb.163.2023.11.01.03.56.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Nov 2023 03:56:51 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) client-ip=23.128.96.33; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="nKvWW/pp"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by lipwig.vger.email (Postfix) with ESMTP id ADE2A809E22F; Wed, 1 Nov 2023 03:56:43 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at lipwig.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233979AbjKAKz5 (ORCPT + 35 others); Wed, 1 Nov 2023 06:55:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36380 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229731AbjKAKzf (ORCPT ); Wed, 1 Nov 2023 06:55:35 -0400 Received: from mail-wm1-x329.google.com (mail-wm1-x329.google.com [IPv6:2a00:1450:4864:20::329]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 32616128 for ; Wed, 1 Nov 2023 03:55:29 -0700 (PDT) Received: by mail-wm1-x329.google.com with SMTP id 5b1f17b1804b1-4081ccf69dcso4140225e9.0 for ; Wed, 01 Nov 2023 03:55:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1698836127; x=1699440927; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=fN35jdBut2R695pmfQNF8kcSJalU/FCNDBQnENZZob0=; b=nKvWW/ppiwtOciRoZIbCqSHwc30b4zljV+1prl/46+gd+6IDbtWdHAODpAYgc91U4Z rDBHx56CxuxAX+D3VXiHXVj8C1t+RYg4zIgevn7s2b8CJgeQxyBRF1LQtrUhb1dhpYT1 x0YnnXJNEFUHx2pW86RpYVxhSg+gUGFkNZOm3AGMS4B9WXIsBeUn00BaztlwF6UgYHMx LAFrT5H0exci6AkOaQTxceZ1jBBlO0JFnEyr6JFDzx0cVfITnADONhB0LltkI/kJyb8H xkFGswW8HPxJPQsrT7LnXrVh5HAx2RiSuONxpsgSrZSxSkMjUH5uhEt3nKPveA9RUdRb 912w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698836127; x=1699440927; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=fN35jdBut2R695pmfQNF8kcSJalU/FCNDBQnENZZob0=; b=G4EeGzkRCLWYeuXclVNC96bqgj0ZrUA6ULT19m5ywrobgAYOK9dChcfTu6rI2Mj4Yr 4yK2A0SPtzAyLE8ZH7aC5z1HLYqLOk5YzjikkIjPu+Wee9Bcx0EY/g8pbJ42VbbGoVaj HM9Kzz3AJyp7qbId+T2paOL6ooVIC098h5tuCoUI0SBmezgMcFL2g2RCLleGrjHt/HQ4 QYzln0uMdOTpp0e2TlOFvzIxFXLL2mRjQlHdBSGNI01Pq7kpgcz8aFnPle4DnOk3f1uW ike2s98yqQYPk7Ojcn9q+1DxXJ9gEOu+hgEZZf36uALTa0K87ByYopVgk4SPsTEX3aaK 7oEw== X-Gm-Message-State: AOJu0Yz7MZpbZzs5Cm1PepiFARjZNmV2C39J0rFlsup/SEUxMHTA+E7m xsAoK2N6qMkrjppdhwh1kmu5LQ== X-Received: by 2002:a5d:64aa:0:b0:32d:ddb9:289f with SMTP id m10-20020a5d64aa000000b0032dddb9289fmr2973784wrp.34.1698836127649; Wed, 01 Nov 2023 03:55:27 -0700 (PDT) Received: from [127.0.0.1] ([37.228.218.3]) by smtp.gmail.com with ESMTPSA id z2-20020a5d6542000000b0032d09f7a713sm3830948wrv.18.2023.11.01.03.55.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Nov 2023 03:55:27 -0700 (PDT) From: Bryan O'Donoghue Date: Wed, 01 Nov 2023 10:54:34 +0000 Subject: [PATCH v3 4/5] media: qcom: camss: Move VFE power-domain specifics into vfe.c MIME-Version: 1.0 Message-Id: <20231101-b4-camss-named-power-domains-v3-4-bbdf5f22462a@linaro.org> References: <20231101-b4-camss-named-power-domains-v3-0-bbdf5f22462a@linaro.org> In-Reply-To: <20231101-b4-camss-named-power-domains-v3-0-bbdf5f22462a@linaro.org> To: hverkuil-cisco@xs4all.nl, laurent.pinchart@ideasonboard.com, Robert Foss , Todor Tomov , Bryan O'Donoghue , Andy Gross , Bjorn Andersson , Konrad Dybcio , Mauro Carvalho Chehab , matti.lehtimaki@gmail.com Cc: linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.13-dev-26615 X-Spam-Status: No, score=-0.9 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lipwig.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (lipwig.vger.email [0.0.0.0]); Wed, 01 Nov 2023 03:56:43 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1781358879454692304 X-GMAIL-MSGID: 1781358879454692304 Moving the location of the hooks to VFE power domains has several advantages. 1. Separation of concerns and functional decomposition. vfe.c should be responsible for and know best how manage power-domains for a VFE, excising from camss.c follows this principle. 2. Embedding a pointer to genpd in struct camss_vfe{} meas that we can dispense with a bunch of kmalloc array inside of camss.c. 3. Splitting up titan top gdsc from vfe/ife gdsc provides a base for breaking up magic indexes in dtsi. Suggested-by: Matti Lehtimäki Signed-off-by: Bryan O'Donoghue --- drivers/media/platform/qcom/camss/camss-vfe.c | 24 +++++++++- drivers/media/platform/qcom/camss/camss-vfe.h | 2 + drivers/media/platform/qcom/camss/camss.c | 63 +++++++++++++-------------- drivers/media/platform/qcom/camss/camss.h | 4 +- 4 files changed, 56 insertions(+), 37 deletions(-) diff --git a/drivers/media/platform/qcom/camss/camss-vfe.c b/drivers/media/platform/qcom/camss/camss-vfe.c index 5172eb5612a1c..defff24f07ce3 100644 --- a/drivers/media/platform/qcom/camss/camss-vfe.c +++ b/drivers/media/platform/qcom/camss/camss-vfe.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -1381,8 +1382,13 @@ int msm_vfe_subdev_init(struct camss *camss, struct vfe_device *vfe, if (!res->line_num) return -EINVAL; - if (res->has_pd) - vfe->genpd = camss->genpd[id]; + if (res->has_pd) { + vfe->genpd = dev_pm_domain_attach_by_id(camss->dev, id); + if (IS_ERR(vfe->genpd)) { + ret = PTR_ERR(vfe->genpd); + return ret; + } + } vfe->line_num = res->line_num; vfe->ops->subdev_init(dev, vfe); @@ -1506,6 +1512,20 @@ int msm_vfe_subdev_init(struct camss *camss, struct vfe_device *vfe, return 0; } +/* + * msm_vfe_genpd_cleanup - Cleanup VFE genpd linkages + * @vfe: VFE device + * + */ +void msm_vfe_genpd_cleanup(struct vfe_device *vfe) +{ + if (vfe->genpd_link) + device_link_del(vfe->genpd_link); + + if (vfe->genpd) + dev_pm_domain_detach(vfe->genpd, true); +} + /* * vfe_link_setup - Setup VFE connections * @entity: Pointer to media entity structure diff --git a/drivers/media/platform/qcom/camss/camss-vfe.h b/drivers/media/platform/qcom/camss/camss-vfe.h index 992a2103ec44c..cdbe59d8d437e 100644 --- a/drivers/media/platform/qcom/camss/camss-vfe.h +++ b/drivers/media/platform/qcom/camss/camss-vfe.h @@ -159,6 +159,8 @@ struct camss_subdev_resources; int msm_vfe_subdev_init(struct camss *camss, struct vfe_device *vfe, const struct camss_subdev_resources *res, u8 id); +void msm_vfe_genpd_cleanup(struct vfe_device *vfe); + int msm_vfe_register_entities(struct vfe_device *vfe, struct v4l2_device *v4l2_dev); diff --git a/drivers/media/platform/qcom/camss/camss.c b/drivers/media/platform/qcom/camss/camss.c index ed01a3ac7a38e..415164bf00402 100644 --- a/drivers/media/platform/qcom/camss/camss.c +++ b/drivers/media/platform/qcom/camss/camss.c @@ -1487,7 +1487,6 @@ static const struct media_device_ops camss_media_ops = { static int camss_configure_pd(struct camss *camss) { struct device *dev = camss->dev; - int i; int ret; camss->genpd_num = of_count_phandle_with_args(dev->of_node, @@ -1506,45 +1505,36 @@ static int camss_configure_pd(struct camss *camss) if (camss->genpd_num == 1) return 0; - camss->genpd = devm_kmalloc_array(dev, camss->genpd_num, - sizeof(*camss->genpd), GFP_KERNEL); - if (!camss->genpd) - return -ENOMEM; - - camss->genpd_link = devm_kmalloc_array(dev, camss->genpd_num, - sizeof(*camss->genpd_link), - GFP_KERNEL); - if (!camss->genpd_link) - return -ENOMEM; + /* + * If the number of power-domains is greater than the number of VFEs + * then the additional power-domain is for the entire CAMSS block the + * 'top' power-domain. + */ + if (camss->genpd_num <= camss->res->vfe_num) + return 0; /* * VFE power domains are in the beginning of the list, and while all * power domains should be attached, only if TITAN_TOP power domain is * found in the list, it should be linked over here. */ - for (i = 0; i < camss->genpd_num; i++) { - camss->genpd[i] = dev_pm_domain_attach_by_id(camss->dev, i); - if (IS_ERR(camss->genpd[i])) { - ret = PTR_ERR(camss->genpd[i]); - goto fail_pm; - } + camss->genpd = dev_pm_domain_attach_by_id(camss->dev, camss->genpd_num - 1); + if (IS_ERR(camss->genpd)) { + ret = PTR_ERR(camss->genpd); + goto fail_pm; } - - if (i > camss->res->vfe_num) { - camss->genpd_link[i - 1] = device_link_add(camss->dev, camss->genpd[i - 1], - DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME | - DL_FLAG_RPM_ACTIVE); - if (!camss->genpd_link[i - 1]) { - ret = -EINVAL; - goto fail_pm; - } + camss->genpd_link = device_link_add(camss->dev, camss->genpd, + DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME | + DL_FLAG_RPM_ACTIVE); + if (!camss->genpd_link) { + ret = -EINVAL; + goto fail_pm; } return 0; fail_pm: - for (--i ; i >= 0; i--) - dev_pm_domain_detach(camss->genpd[i], true); + dev_pm_domain_detach(camss->genpd, true); return ret; } @@ -1566,18 +1556,25 @@ static int camss_icc_get(struct camss *camss) return 0; } -static void camss_genpd_cleanup(struct camss *camss) +static void camss_genpd_subdevice_cleanup(struct camss *camss) { int i; + for (i = 0; i < camss->vfe_total_num; i++) + msm_vfe_genpd_cleanup(&camss->vfe[i]); +} + +static void camss_genpd_cleanup(struct camss *camss) +{ if (camss->genpd_num == 1) return; - if (camss->genpd_num > camss->res->vfe_num) - device_link_del(camss->genpd_link[camss->genpd_num - 1]); + if (camss->genpd_link) + device_link_del(camss->genpd_link); + + dev_pm_domain_detach(camss->genpd, true); - for (i = 0; i < camss->genpd_num; i++) - dev_pm_domain_detach(camss->genpd[i], true); + camss_genpd_subdevice_cleanup(camss); } /* diff --git a/drivers/media/platform/qcom/camss/camss.h b/drivers/media/platform/qcom/camss/camss.h index b854cff1774d4..1ba824a2cb76c 100644 --- a/drivers/media/platform/qcom/camss/camss.h +++ b/drivers/media/platform/qcom/camss/camss.h @@ -107,8 +107,8 @@ struct camss { struct vfe_device *vfe; atomic_t ref_count; int genpd_num; - struct device **genpd; - struct device_link **genpd_link; + struct device *genpd; + struct device_link *genpd_link; struct icc_path *icc_path[ICC_SM8250_COUNT]; const struct camss_resources *res; unsigned int vfe_total_num;