From: Anusha Arun Nandi <anusha.nandi@oss.qualcomm.com>
To: Vinod Koul <vkoul@kernel.org>, Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Neil Armstrong <neil.armstrong@linaro.org>,
Manivannan Sadhasivam <mani@kernel.org>,
Bryan O'Donoghue <bod@kernel.org>
Cc: gjorgji.rosikopulos@oss.qualcomm.com,
hariram.purushothaman@oss.qualcomm.com, akapatra@quicinc.com,
jigarkumar.zala@oss.qualcomm.com, linux-phy@lists.infradead.org,
linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org,
linux-kernel@vger.kernel.org, devicetree@vger.kernel.org
Subject: [PATCH v3 2/4] phy: qcom-mipi-csi2: Make OPP table optional
Date: Thu, 5 Nov 2026 15:51:35 -0800 [thread overview]
Message-ID: <20261105235137.2635442-3-anusha.nandi@oss.qualcomm.com> (raw)
In-Reply-To: <20261105235137.2635442-1-anusha.nandi@oss.qualcomm.com>
Not every SoC the generic MIPI CSI2 PHY driver supports needs an OPP
table: a CSIPHY with only a single, unscaled power-domain has no
performance state to vote on, so running its "core" clock through
the OPP framework buys nothing over a plain clk_set_rate(). Add a
no_opp flag to struct mipi_csi2phy_soc_cfg and skip
devm_pm_opp_set_clkname()/devm_pm_opp_of_add_table() in probe() and
the OPP/performance-state handling in
phy_qcom_mipi_csi2_set_clock_rates() when it's set, falling back to
clk_round_rate()/clk_set_rate() on the timer clock only.
x1e80100 doesn't set no_opp, so this is a no-op for it. The "core"/
"timer" clock-name strings themselves stay hardcoded literals: every
SoC this driver supports uses the same two names, so there's nothing
to make configurable there.
Reviewed-by: Jigarkumar Zala <jigarkumar.zala@oss.qualcomm.com>
Signed-off-by: Anusha Arun Nandi <anusha.nandi@oss.qualcomm.com>
---
.../phy/qualcomm/phy-qcom-mipi-csi2-core.c | 72 ++++++++++---------
drivers/phy/qualcomm/phy-qcom-mipi-csi2.h | 3 +
2 files changed, 42 insertions(+), 33 deletions(-)
diff --git a/drivers/phy/qualcomm/phy-qcom-mipi-csi2-core.c b/drivers/phy/qualcomm/phy-qcom-mipi-csi2-core.c
index 269232499fca..8bebc943a771 100644
--- a/drivers/phy/qualcomm/phy-qcom-mipi-csi2-core.c
+++ b/drivers/phy/qualcomm/phy-qcom-mipi-csi2-core.c
@@ -32,40 +32,43 @@ phy_qcom_mipi_csi2_set_clock_rates(struct mipi_csi2phy_device *csi2phy,
unsigned long opp_rate = link_freq / 4;
struct dev_pm_opp *opp;
long timer_rate;
- int i, pstate;
+ int i = 0, pstate;
int ret;
- opp = dev_pm_opp_find_freq_ceil(dev, &opp_rate);
- if (IS_ERR(opp)) {
- dev_err(csi2phy->dev, "Couldn't find ceiling for %lld Hz\n",
- link_freq);
- return PTR_ERR(opp);
- }
+ if (!csi2phy->soc_cfg->no_opp) {
+ opp = dev_pm_opp_find_freq_ceil(dev, &opp_rate);
+ if (IS_ERR(opp)) {
+ dev_err(csi2phy->dev, "Couldn't find ceiling for %lld Hz\n",
+ link_freq);
+ return PTR_ERR(opp);
+ }
- pstate = 0;
- for (i = 0; csi2phy->pd_list && i < csi2phy->pd_list->num_pds; i++) {
- unsigned int perf;
+ pstate = 0;
+ for (i = 0; csi2phy->pd_list && i < csi2phy->pd_list->num_pds; i++) {
+ unsigned int perf;
- if (!csi2phy->soc_cfg->genpds[i].scaled)
- continue;
+ if (!csi2phy->soc_cfg->genpds[i].scaled)
+ continue;
- perf = dev_pm_opp_get_required_pstate(opp, pstate);
- pstate += 1;
+ perf = dev_pm_opp_get_required_pstate(opp, pstate);
+ pstate += 1;
- ret = dev_pm_genpd_set_performance_state(csi2phy->pd_list->pd_devs[i], perf);
- if (ret) {
- dev_err(csi2phy->dev, "Couldn't set perf state %u\n",
- perf);
- dev_pm_opp_put(opp);
- goto unset_pstate;
+ ret = dev_pm_genpd_set_performance_state(csi2phy->pd_list->pd_devs[i],
+ perf);
+ if (ret) {
+ dev_err(csi2phy->dev, "Couldn't set perf state %u\n",
+ perf);
+ dev_pm_opp_put(opp);
+ goto unset_pstate;
+ }
}
- }
- dev_pm_opp_put(opp);
+ dev_pm_opp_put(opp);
- ret = dev_pm_opp_set_rate(dev, opp_rate);
- if (ret) {
- dev_err(csi2phy->dev, "dev_pm_opp_set_rate() fail\n");
- goto unset_opp_rate;
+ ret = dev_pm_opp_set_rate(dev, opp_rate);
+ if (ret) {
+ dev_err(csi2phy->dev, "dev_pm_opp_set_rate() fail\n");
+ goto unset_opp_rate;
+ }
}
timer_rate = clk_round_rate(csi2phy->timer_clk, link_freq / 4);
@@ -83,7 +86,8 @@ phy_qcom_mipi_csi2_set_clock_rates(struct mipi_csi2phy_device *csi2phy,
return 0;
unset_opp_rate:
- dev_pm_opp_set_rate(dev, 0);
+ if (!csi2phy->soc_cfg->no_opp)
+ dev_pm_opp_set_rate(dev, 0);
unset_pstate:
while (i--) {
@@ -405,13 +409,15 @@ static int phy_qcom_mipi_csi2_probe(struct platform_device *pdev)
if (!csi2phy->timer_clk)
return dev_err_probe(dev, -ENODEV, "no timer clock\n");
- ret = devm_pm_opp_set_clkname(dev, "core");
- if (ret)
- return dev_err_probe(dev, ret, "Failed to set opp clkname\n");
+ if (!csi2phy->soc_cfg->no_opp) {
+ ret = devm_pm_opp_set_clkname(dev, "core");
+ if (ret)
+ return dev_err_probe(dev, ret, "Failed to set opp clkname\n");
- ret = devm_pm_opp_of_add_table(dev);
- if (ret)
- return dev_err_probe(dev, ret, "invalid OPP table in device tree\n");
+ ret = devm_pm_opp_of_add_table(dev);
+ if (ret)
+ return dev_err_probe(dev, ret, "invalid OPP table in device tree\n");
+ }
num_supplies = csi2phy->soc_cfg->num_supplies;
csi2phy->supplies = devm_kzalloc(dev, sizeof(*csi2phy->supplies) * num_supplies,
diff --git a/drivers/phy/qualcomm/phy-qcom-mipi-csi2.h b/drivers/phy/qualcomm/phy-qcom-mipi-csi2.h
index 7e55ae007370..6cf9e5b956f7 100644
--- a/drivers/phy/qualcomm/phy-qcom-mipi-csi2.h
+++ b/drivers/phy/qualcomm/phy-qcom-mipi-csi2.h
@@ -68,6 +68,9 @@ struct mipi_csi2phy_soc_cfg {
const char ** const clk_names;
const unsigned int num_clk;
+ /* Skip OPP-based clock/pstate scaling. */
+ const bool no_opp;
+
const struct mipi_csi2_genpd *genpds;
const unsigned int num_genpds;
};
--
2.34.1
next prev parent reply other threads:[~2026-11-05 23:51 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-05 23:51 [PATCH v3 0/4] phy: qcom-mipi-csi2: Add D-PHY support for sa8775p, qcs8300 and sc7280 Anusha Arun Nandi
2026-11-05 23:51 ` [PATCH v3 1/4] dt-bindings: phy: qcom: Add common qcom,csi2-phy Anusha Arun Nandi
2026-11-05 23:51 ` Anusha Arun Nandi [this message]
2026-11-05 23:51 ` [PATCH v3 3/4] phy: qcom-mipi-csi2: Add sa8775p D-PHY support Anusha Arun Nandi
2026-11-05 23:51 ` [PATCH v3 4/4] phy: qcom-mipi-csi2: Add sc7280 D-PHY provider Anusha Arun Nandi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261105235137.2635442-3-anusha.nandi@oss.qualcomm.com \
--to=anusha.nandi@oss.qualcomm.com \
--cc=akapatra@quicinc.com \
--cc=bod@kernel.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=gjorgji.rosikopulos@oss.qualcomm.com \
--cc=hariram.purushothaman@oss.qualcomm.com \
--cc=jigarkumar.zala@oss.qualcomm.com \
--cc=krzk+dt@kernel.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=linux-phy@lists.infradead.org \
--cc=mani@kernel.org \
--cc=neil.armstrong@linaro.org \
--cc=robh@kernel.org \
--cc=vkoul@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®