From: Konrad Dybcio <konradybcio@kernel.org>
To: Bjorn Andersson <andersson@kernel.org>,
Konrad Dybcio <konradybcio@kernel.org>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Bryan O'Donoghue <bryan.odonoghue@linaro.org>,
Loic Poulain <loic.poulain@oss.qualcomm.com>,
Robert Foss <rfoss@kernel.org>,
Andi Shyti <andi.shyti@kernel.org>
Cc: Marijn Suijten <marijn.suijten@somainline.org>,
linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-i2c@vger.kernel.org,
Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Subject: [PATCH 4/5] i2c: qcom-cci: Add OPP table support and enforce FAST_PLUS requirements
Date: Thu, 04 Sep 2025 16:31:23 +0200 [thread overview]
Message-ID: <20250904-topic-cci_updates-v1-4-d38559692703@oss.qualcomm.com> (raw)
In-Reply-To: <20250904-topic-cci_updates-v1-0-d38559692703@oss.qualcomm.com>
From: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
The CCI clock has voltage requirements, which need to be described
through an OPP table.
The 1 MHz FAST_PLUS mode requires the CCI core clock runs at 37,5 MHz
(which is a value common across all SoCs), since it's not possible to
reach the required timings with the default 19.2 MHz rate.
Address both issues by introducing an OPP table and using it to vote
for the faster rate.
Signed-off-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
---
drivers/i2c/busses/i2c-qcom-cci.c | 33 +++++++++++++++++++++++++++++++++
1 file changed, 33 insertions(+)
diff --git a/drivers/i2c/busses/i2c-qcom-cci.c b/drivers/i2c/busses/i2c-qcom-cci.c
index 74fedfdec3ae4e034ec4d946179e963c783b5923..d6192e2a5e3bc4d908cba594d1910a41f3a41e9c 100644
--- a/drivers/i2c/busses/i2c-qcom-cci.c
+++ b/drivers/i2c/busses/i2c-qcom-cci.c
@@ -10,6 +10,7 @@
#include <linux/module.h>
#include <linux/of.h>
#include <linux/platform_device.h>
+#include <linux/pm_opp.h>
#include <linux/pm_runtime.h>
#define CCI_HW_VERSION 0x0
@@ -121,6 +122,7 @@ struct cci_data {
struct i2c_adapter_quirks quirks;
u16 queue_size[NUM_QUEUES];
struct hw_params params[3];
+ bool fast_mode_plus_supported;
};
struct cci {
@@ -466,9 +468,22 @@ static const struct i2c_algorithm cci_algo = {
.functionality = cci_func,
};
+static unsigned long cci_desired_clk_rate(struct cci *cci)
+{
+ if (cci->data->fast_mode_plus_supported)
+ return 37500000ULL;
+
+ return 19200000ULL;
+}
+
static int __maybe_unused cci_suspend_runtime(struct device *dev)
{
struct cci *cci = dev_get_drvdata(dev);
+ int ret;
+
+ ret = dev_pm_opp_set_rate(dev, 0);
+ if (ret)
+ return ret;
clk_bulk_disable_unprepare(cci->nclocks, cci->clocks);
@@ -484,6 +499,10 @@ static int __maybe_unused cci_resume_runtime(struct device *dev)
if (ret)
return ret;
+ ret = dev_pm_opp_set_rate(dev, cci_desired_clk_rate(cci));
+ if (ret)
+ return ret;
+
cci_init(cci);
return 0;
@@ -588,6 +607,19 @@ static int cci_probe(struct platform_device *pdev)
if (ret < 0)
return ret;
+ ret = devm_pm_opp_set_clkname(dev, "cci");
+ if (ret)
+ return ret;
+
+ /* OPP table is optional */
+ ret = devm_pm_opp_of_add_table(dev);
+ if (ret && ret != -ENODEV)
+ return dev_err_probe(dev, ret, "invalid OPP table in device tree\n");
+
+ ret = dev_pm_opp_set_rate(dev, cci_desired_clk_rate(cci));
+ if (ret)
+ return ret;
+
/* Interrupt */
ret = platform_get_irq(pdev, 0);
@@ -775,6 +807,7 @@ static const struct cci_data cci_v2_data = {
.trdhld = 3,
.tsp = 3
},
+ .fast_mode_plus_supported = true,
};
static const struct of_device_id cci_dt_match[] = {
--
2.51.0
next prev parent reply other threads:[~2025-09-04 14:31 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-04 14:31 [PATCH 0/5] Qualcomm CCI I2C clock requirements enforcement Konrad Dybcio
2025-09-04 14:31 ` [PATCH 1/5] arm64: dts: qcom: sc8280xp: Fix CCI3 interrupt Konrad Dybcio
2025-09-04 14:35 ` Bryan O'Donoghue
2025-09-04 14:31 ` [PATCH 2/5] dt-bindings: i2c: qcom-cci: Allow operating-points-v2 Konrad Dybcio
2025-09-04 14:50 ` Bryan O'Donoghue
2025-09-05 18:03 ` Rob Herring (Arm)
2025-09-04 14:31 ` [PATCH 3/5] i2c: qcom-cci: Drop single-line wrappers Konrad Dybcio
2025-09-04 14:52 ` Bryan O'Donoghue
2025-09-05 7:40 ` Loic Poulain
2025-09-04 14:31 ` Konrad Dybcio [this message]
2025-09-04 14:50 ` [PATCH 4/5] i2c: qcom-cci: Add OPP table support and enforce FAST_PLUS requirements Konrad Dybcio
2025-09-04 14:55 ` Bryan O'Donoghue
2025-09-08 8:36 ` Stephan Gerhold
2025-09-08 8:43 ` Konrad Dybcio
2025-09-08 8:46 ` Stephan Gerhold
2025-09-08 9:49 ` Konrad Dybcio
2025-09-08 9:57 ` Stephan Gerhold
2025-09-08 10:00 ` Konrad Dybcio
2025-09-08 10:09 ` Stephan Gerhold
2025-09-09 8:39 ` Konrad Dybcio
2025-09-10 10:57 ` Mukesh Savaliya
2025-09-04 14:31 ` [PATCH 5/5] arm64: dts: qcom: sc8280xp: Add OPP table for CCI hosts Konrad Dybcio
2025-09-04 14:56 ` Bryan O'Donoghue
2025-09-10 10:57 ` [PATCH 0/5] Qualcomm CCI I2C clock requirements enforcement Mukesh Savaliya
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=20250904-topic-cci_updates-v1-4-d38559692703@oss.qualcomm.com \
--to=konradybcio@kernel.org \
--cc=andersson@kernel.org \
--cc=andi.shyti@kernel.org \
--cc=bryan.odonoghue@linaro.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=konrad.dybcio@oss.qualcomm.com \
--cc=krzk+dt@kernel.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=loic.poulain@oss.qualcomm.com \
--cc=marijn.suijten@somainline.org \
--cc=rfoss@kernel.org \
--cc=robh@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;
as well as URLs for NNTP newsgroup(s).