From patchwork Wed Jan 27 14:49:19 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Robert Foss X-Patchwork-Id: 12050357 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.1 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,TVD_SUBJ_WIPE_DEBT, URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id BE583C433DB for ; Wed, 27 Jan 2021 15:17:38 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 1B45220771 for ; Wed, 27 Jan 2021 15:17:38 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1B45220771 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-Id:Date: Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=V5SumcQD10/MfCBWN1hP+JnjItnVUxNfdwAEa7H5U9U=; b=MnQ9dwbOZ9NRlLOsBk6pPGnHX 053i335xI6lPepeV3pbTVx8Nwh0yIrsCXseEZbHUd0o/+SmjLErCOkoxKuRx7veOT73Bn8oTFqdMF ZwevaxP4hpXlzJAePkVn95iwNQJ05D4JZhtOSL/VpPxT52CNhT+G92yFv0pp14pxNYC/8zCMgvOZ+ fYz2F+nm09kkcgdEJRxZJFORR4fwVHVqYzQVZmtx2WCRcOkn3L+K2VJarARt3/+L4oY8cfYP6UW/Q 1dwE/zOaI7ZMjBrWenjw/WxCu48XP9+yD46crxApee0qLIwRtq9u5Ebxb5TnVz6faXQpMqAyigRBT ritMYXVeQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1l4mX1-00045c-RI; Wed, 27 Jan 2021 15:14:55 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1l4mWt-0003b1-5e for linux-arm-kernel@merlin.infradead.org; Wed, 27 Jan 2021 15:14:47 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description; bh=bhijpy86VBLH1z/QR8DmTQnzKog7xaGemOCJvaezDFY=; b=MhNidrp3kRBSIL+T/+r0qZ5fs0 NcFnhHsgW/WSEEZYQscvJweuzQDmPc9S5aujU8c01IeLIi/oFfGmEVoRW4Q+RhKCMgR5sdG2NsR7f LjCuupPgB2MLUsDnoXbhJpe1VatmB0mLPRkle/pef3ABrr8hNyFRH9BoMgrNU6gOqdfE3PcW/yCb9 HBf8Od+kl6bzGjXQ3VjA0Xr6Zp0Kcd7PdLYDF8WoWXukJNSgkoNy/mztSqU0kOazLahBmlJc/ErV7 rfmpoA9fjWokii0HLgptuoh9IkOKTzWwHjt8PHadQesdmwkt8YcBThmcxbE4Qw620Q/P3m/OUxZIt NP8odfuw==; Received: from mail-ej1-x62f.google.com ([2a00:1450:4864:20::62f]) by casper.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1l4mJD-0078zH-Id for linux-arm-kernel@lists.infradead.org; Wed, 27 Jan 2021 15:01:30 +0000 Received: by mail-ej1-x62f.google.com with SMTP id a10so3034647ejg.10 for ; Wed, 27 Jan 2021 06:57:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=bhijpy86VBLH1z/QR8DmTQnzKog7xaGemOCJvaezDFY=; b=cZTuiDDbXYFe9UWedZaqasEOQbkdDLLf8b4x6U6d44+yYsHgoFZNwNND6iWEDlLy/5 nnBgcYX2o9CPgbUlu173Xsu8gW/TwglSi0EAVVHuCRKYhQOar9ol1BpJmqqoXJXbXJT8 71bxbaMdQtKi6wXic7K3vJQ1pqB1k6MeZiYoJ88RU5Lkih6ANBMDEUJdNQzz25Wwtldu 8axzWUxIhK4KyflidUJhl+Hc4aEv2tN88yqvwf8LVB67aj1GXb/YCKvBtO/IFuna8yVo djeENr/IH6Qly6dgrLRifzG6U9b5kMrq7Krvl3W0nUT9EMAJPuu5jO3orTgKN4IRj55q aQIw== 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=bhijpy86VBLH1z/QR8DmTQnzKog7xaGemOCJvaezDFY=; b=aZlueFh1wbQ10GphDbQjk0MY3fii8dO4VDN1b6RYiKVvujb4QVEfNTs8leEsoxL70E 4Qv+Ed0bSAp76uz/wf3vZg8KqNrlB5gAd0z1qlEk3B+dK7SIQl39mVTfHl9uuHvGFkN4 UWNK63PEVN1EVrzmVQVcojZeZfvgjY/wHW068z1xOzPJaZQ90bk9p7M8ajbUfI7CA2Ym WpPmzasWX8iS4kbiidiJ8XCLhmI3vBR/46Wk9aO5CB1Fa2pgM4FBt1+C7ckgWVeZu2xF JVFbe612F/yUapzAhk0vDDIfZiCIOwPxGzCRM1yyyjFoYrRFxDi4I+3kj5vUrnJaLPXC xSkA== X-Gm-Message-State: AOAM53118qJrzA0Gddmu010PuTgPCEhZI52vZ9fYT96eMhEUCboXHfs8 mVQ1rF3x8Q7k1koPbXNHg0MJoOnoS1aceA== X-Google-Smtp-Source: ABdhPJz1uqw3lQgfejPQ96YgZX6TaacArlhWt6EmxMZ5WJFggXpWNIijpgEPpM0ktf7WRLRrzxCl9w== X-Received: by 2002:a17:907:9483:: with SMTP id dm3mr6994757ejc.120.1611759033309; Wed, 27 Jan 2021 06:50:33 -0800 (PST) Received: from localhost.localdomain ([2a02:2450:102f:d6a:62e7:589a:1625:7acc]) by smtp.gmail.com with ESMTPSA id ah12sm947799ejc.70.2021.01.27.06.50.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Jan 2021 06:50:32 -0800 (PST) From: Robert Foss To: agross@kernel.org, bjorn.andersson@linaro.org, robert.foss@linaro.org, todor.too@gmail.com, mchehab@kernel.org, robh+dt@kernel.org, catalin.marinas@arm.com, will@kernel.org, shawnguo@kernel.org, leoyang.li@nxp.com, geert+renesas@glider.be, arnd@arndb.de, Anson.Huang@nxp.com, michael@walle.cc, agx@sigxcpu.org, max.oss.09@gmail.com, angelogioacchino.delregno@somainline.org, linux-arm-msm@vger.kernel.org, linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, AngeloGioacchino Del Regno , Rob Herring , Andrey Konovalov Subject: [PATCH v3 11/22] media: camss: Remove per VFE power domain toggling Date: Wed, 27 Jan 2021 15:49:19 +0100 Message-Id: <20210127144930.2158242-12-robert.foss@linaro.org> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210127144930.2158242-1-robert.foss@linaro.org> References: <20210127144930.2158242-1-robert.foss@linaro.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210127_150130_024081_25F2943F X-CRM114-Status: GOOD ( 20.87 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Azam Sadiq Pasha Kapatrala Syed , Sarvesh Sridutt , Laurent Pinchart , Jonathan Marek , Tomasz Figa Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org For Titan ISPs clocks fail to re-enable during vfe_get() after any vfe has been halted and its corresponding power domain power has been detached. Since all of the clocks depend on all of the PDs, per VFE PD detaching is no option for this generation of HW. Signed-off-by: Robert Foss --- .../media/platform/qcom/camss/camss-ispif.c | 11 --- drivers/media/platform/qcom/camss/camss-vfe.c | 7 -- drivers/media/platform/qcom/camss/camss.c | 94 +++++++++++-------- drivers/media/platform/qcom/camss/camss.h | 12 +-- 4 files changed, 60 insertions(+), 64 deletions(-) diff --git a/drivers/media/platform/qcom/camss/camss-ispif.c b/drivers/media/platform/qcom/camss/camss-ispif.c index c36570042082..e41925850ba2 100644 --- a/drivers/media/platform/qcom/camss/camss-ispif.c +++ b/drivers/media/platform/qcom/camss/camss-ispif.c @@ -323,14 +323,6 @@ static int ispif_reset(struct ispif_device *ispif, u8 vfe_id) struct camss *camss = ispif->camss; int ret; - ret = camss_pm_domain_on(camss, PM_DOMAIN_VFE0); - if (ret < 0) - return ret; - - ret = camss_pm_domain_on(camss, PM_DOMAIN_VFE1); - if (ret < 0) - return ret; - ret = camss_enable_clocks(ispif->nclocks_for_reset, ispif->clock_for_reset, camss->dev); @@ -343,9 +335,6 @@ static int ispif_reset(struct ispif_device *ispif, u8 vfe_id) camss_disable_clocks(ispif->nclocks_for_reset, ispif->clock_for_reset); - camss_pm_domain_off(camss, PM_DOMAIN_VFE0); - camss_pm_domain_off(camss, PM_DOMAIN_VFE1); - return ret; } diff --git a/drivers/media/platform/qcom/camss/camss-vfe.c b/drivers/media/platform/qcom/camss/camss-vfe.c index fa9629835e98..e41c22da4b9b 100644 --- a/drivers/media/platform/qcom/camss/camss-vfe.c +++ b/drivers/media/platform/qcom/camss/camss-vfe.c @@ -587,10 +587,6 @@ static int vfe_get(struct vfe_device *vfe) mutex_lock(&vfe->power_lock); if (vfe->power_count == 0) { - ret = camss_pm_domain_on(vfe->camss, vfe->id); - if (ret < 0) - goto error_pm_domain; - ret = pm_runtime_get_sync(vfe->camss->dev); if (ret < 0) goto error_pm_runtime_get; @@ -627,9 +623,7 @@ static int vfe_get(struct vfe_device *vfe) error_pm_runtime_get: pm_runtime_put_sync(vfe->camss->dev); - camss_pm_domain_off(vfe->camss, vfe->id); -error_pm_domain: mutex_unlock(&vfe->power_lock); return ret; @@ -653,7 +647,6 @@ static void vfe_put(struct vfe_device *vfe) } camss_disable_clocks(vfe->nclocks, vfe->clock); pm_runtime_put_sync(vfe->camss->dev); - camss_pm_domain_off(vfe->camss, vfe->id); } vfe->power_count--; diff --git a/drivers/media/platform/qcom/camss/camss.c b/drivers/media/platform/qcom/camss/camss.c index 7e7763f04b58..22f9d7d7085a 100644 --- a/drivers/media/platform/qcom/camss/camss.c +++ b/drivers/media/platform/qcom/camss/camss.c @@ -774,28 +774,6 @@ int camss_get_pixel_clock(struct media_entity *entity, u32 *pixel_clock) return 0; } -int camss_pm_domain_on(struct camss *camss, int id) -{ - if (camss->version == CAMSS_8x96 || - camss->version == CAMSS_660) { - camss->genpd_link[id] = device_link_add(camss->dev, - camss->genpd[id], DL_FLAG_STATELESS | - DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE); - - if (!camss->genpd_link[id]) - return -EINVAL; - } - - return 0; -} - -void camss_pm_domain_off(struct camss *camss, int id) -{ - if (camss->version == CAMSS_8x96 || - camss->version == CAMSS_660) - device_link_del(camss->genpd_link[id]); -} - /* * camss_of_parse_endpoint_node - Parse port endpoint node * @dev: Device @@ -1214,6 +1192,48 @@ static const struct media_device_ops camss_media_ops = { .link_notify = v4l2_pipeline_link_notify, }; + +static int camss_configure_pd(struct camss *camss) +{ + int nbr_pm_domains = 0; + int last_pm_domain = 0; + int i; + int ret; + + if (camss->version == CAMSS_8x96 || + camss->version == CAMSS_660) + nbr_pm_domains = PM_DOMAIN_CAMSS_COUNT; + + for (i = 0; i < nbr_pm_domains; 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_link[i] = device_link_add(camss->dev, camss->genpd[i], + DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE); + + if (!camss->genpd_link[i]) { + dev_pm_domain_detach(camss->genpd[i], true); + ret = -EINVAL; + goto fail_pm; + } + + last_pm_domain = i; + } + + return 0; + +fail_pm: + for (i = 0; i < last_pm_domain; i++) { + device_link_del(camss->genpd_link[i]); + dev_pm_domain_detach(camss->genpd[i], true); + } + + return ret; +} + /* * camss_probe - Probe CAMSS platform device * @pdev: Pointer to CAMSS platform device @@ -1346,20 +1366,10 @@ static int camss_probe(struct platform_device *pdev) } } - if (camss->version == CAMSS_8x96 || - camss->version == CAMSS_660) { - camss->genpd[PM_DOMAIN_VFE0] = dev_pm_domain_attach_by_id( - camss->dev, PM_DOMAIN_VFE0); - if (IS_ERR(camss->genpd[PM_DOMAIN_VFE0])) - return PTR_ERR(camss->genpd[PM_DOMAIN_VFE0]); - - camss->genpd[PM_DOMAIN_VFE1] = dev_pm_domain_attach_by_id( - camss->dev, PM_DOMAIN_VFE1); - if (IS_ERR(camss->genpd[PM_DOMAIN_VFE1])) { - dev_pm_domain_detach(camss->genpd[PM_DOMAIN_VFE0], - true); - return PTR_ERR(camss->genpd[PM_DOMAIN_VFE1]); - } + ret = camss_configure_pd(camss); + if (ret < 0) { + dev_err(dev, "Failed to configure power domains: %d\n", ret); + return ret; } pm_runtime_enable(dev); @@ -1380,6 +1390,9 @@ static int camss_probe(struct platform_device *pdev) void camss_delete(struct camss *camss) { + int nbr_pm_domains = 0; + int i; + v4l2_device_unregister(&camss->v4l2_dev); media_device_unregister(&camss->media_dev); media_device_cleanup(&camss->media_dev); @@ -1387,9 +1400,12 @@ void camss_delete(struct camss *camss) pm_runtime_disable(camss->dev); if (camss->version == CAMSS_8x96 || - camss->version == CAMSS_660) { - dev_pm_domain_detach(camss->genpd[PM_DOMAIN_VFE0], true); - dev_pm_domain_detach(camss->genpd[PM_DOMAIN_VFE1], true); + camss->version == CAMSS_660) + nbr_pm_domains = PM_DOMAIN_CAMSS_COUNT; + + for (i = 0; i < nbr_pm_domains; i++) { + device_link_del(camss->genpd_link[i]); + dev_pm_domain_detach(camss->genpd[i], true); } kfree(camss); diff --git a/drivers/media/platform/qcom/camss/camss.h b/drivers/media/platform/qcom/camss/camss.h index b7ad8e9f68a8..7560d85b3352 100644 --- a/drivers/media/platform/qcom/camss/camss.h +++ b/drivers/media/platform/qcom/camss/camss.h @@ -57,9 +57,9 @@ struct resources_ispif { }; enum pm_domain { - PM_DOMAIN_VFE0, - PM_DOMAIN_VFE1, - PM_DOMAIN_COUNT + PM_DOMAIN_VFE0 = 0, + PM_DOMAIN_VFE1 = 1, + PM_DOMAIN_CAMSS_COUNT = 2, /* CAMSS series of ISPs */ }; enum camss_version { @@ -83,8 +83,8 @@ struct camss { int vfe_num; struct vfe_device *vfe; atomic_t ref_count; - struct device *genpd[PM_DOMAIN_COUNT]; - struct device_link *genpd_link[PM_DOMAIN_COUNT]; + struct device *genpd[PM_DOMAIN_CAMSS_COUNT]; + struct device_link *genpd_link[PM_DOMAIN_CAMSS_COUNT]; }; struct camss_camera_interface { @@ -110,8 +110,6 @@ int camss_enable_clocks(int nclocks, struct camss_clock *clock, void camss_disable_clocks(int nclocks, struct camss_clock *clock); struct media_entity *camss_find_sensor(struct media_entity *entity); int camss_get_pixel_clock(struct media_entity *entity, u32 *pixel_clock); -int camss_pm_domain_on(struct camss *camss, int id); -void camss_pm_domain_off(struct camss *camss, int id); void camss_delete(struct camss *camss); #endif /* QC_MSM_CAMSS_H */