From: Kathiravan Thirumoorthy <kathiravan.thirumoorthy@oss.qualcomm.com>
To: Mukesh Kumar Savaliya <mukesh.savaliya@oss.qualcomm.com>,
Viken Dadhaniya <viken.dadhaniya@oss.qualcomm.com>,
Andi Shyti <andi.shyti@kernel.org>,
Manikanta Mylavarapu <quic_mmanikan@quicinc.com>,
Bjorn Andersson <andersson@kernel.org>,
Konrad Dybcio <konradybcio@kernel.org>
Cc: Mukesh Kumar Savaliya <quic_msavaliy@quicinc.com>,
linux-i2c@vger.kernel.org, linux-arm-msm@vger.kernel.org,
linux-kernel@vger.kernel.org,
Kathiravan Thirumoorthy
<kathiravan.thirumoorthy@oss.qualcomm.com>
Subject: [PATCH v2 2/2] i2c: qcom-geni: add I2C frequency table for 32 MHz firmware-based SEs
Date: Wed, 12 Aug 2026 14:00:56 +0530 [thread overview]
Message-ID: <20260812-ipq5424_i2c_scl_updates-v2-2-e09cd39d01d7@oss.qualcomm.com> (raw)
In-Reply-To: <20260812-ipq5424_i2c_scl_updates-v2-0-e09cd39d01d7@oss.qualcomm.com>
On IPQ5424, the I2C controller can operate on both RTL-hardened SEs
and firmware-based SEs. As documented in commit 506bb2ab0075
("i2c: qcom-geni: Support systems with 32MHz serial engine clock"),
in IPQ5424 SEs use a 32 MHz source clock.
The existing frequency table does not provide the required SCL timing
parameters for firmware-based SEs. Add a dedicated frequency table
using the SCL counter values recommended by the hardware design team
and select it for firmware-based SEs to achieve the target bus
frequencies.
Move geni_i2c_clk_map_idx() from geni_i2c_resources_init() to
geni_i2c_init() to ensure SE_HW_PARAM_2 is accessed only after the
required clocks have been enabled.
Signed-off-by: Kathiravan Thirumoorthy <kathiravan.thirumoorthy@oss.qualcomm.com>
---
drivers/i2c/busses/i2c-qcom-geni.c | 25 ++++++++++++++++++-------
include/linux/soc/qcom/geni-se.h | 1 +
2 files changed, 19 insertions(+), 7 deletions(-)
diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c
index 00013b41a6f5..15835f10b062 100644
--- a/drivers/i2c/busses/i2c-qcom-geni.c
+++ b/drivers/i2c/busses/i2c-qcom-geni.c
@@ -187,19 +187,28 @@ static const struct geni_i2c_clk_fld geni_i2c_clk_map_19p2mhz[] = {
};
/* source_clock = 32 MHz */
-static const struct geni_i2c_clk_fld geni_i2c_clk_map_32mhz[] = {
+static const struct geni_i2c_clk_fld geni_i2c_clk_map_32mhz_minicore[] = {
{ I2C_MAX_STANDARD_MODE_FREQ, 12, 9, 10, 26 },
{ I2C_MAX_FAST_MODE_FREQ, 4, 3, 9, 19 },
{ I2C_MAX_FAST_MODE_PLUS_FREQ, 2, 3, 5, 15 },
{}
};
+static const struct geni_i2c_clk_fld geni_i2c_clk_map_32mhz_fwcore[] = {
+ { I2C_MAX_STANDARD_MODE_FREQ, 12, 9, 10, 25 },
+ { I2C_MAX_FAST_MODE_FREQ, 4, 3, 9, 18 },
+ { I2C_MAX_FAST_MODE_PLUS_FREQ, 1, 6, 15, 29 },
+ {}
+};
+
static int geni_i2c_clk_map_idx(struct geni_i2c_dev *gi2c)
{
const struct geni_i2c_clk_fld *itr;
+ bool is_minicore = FIELD_GET(GEN_USE_MINICORES,
+ readl_relaxed(gi2c->se.base + SE_HW_PARAM_2));
if (clk_get_rate(gi2c->se.clk) == 32 * HZ_PER_MHZ)
- itr = geni_i2c_clk_map_32mhz;
+ itr = is_minicore ? geni_i2c_clk_map_32mhz_minicore : geni_i2c_clk_map_32mhz_fwcore;
else
itr = geni_i2c_clk_map_19p2mhz;
@@ -1046,6 +1055,13 @@ static int geni_i2c_init(struct geni_i2c_dev *gi2c)
return ret;
}
+ ret = geni_i2c_clk_map_idx(gi2c);
+ if (ret) {
+ return dev_err_probe(gi2c->se.dev, ret, "Invalid clk frequency %d Hz\n",
+ gi2c->clk_freq_out);
+ goto err;
+ }
+
proto = geni_se_read_proto(&gi2c->se);
if (proto == GENI_SE_INVALID_PROTO) {
ret = geni_load_se_firmware(&gi2c->se, GENI_SE_I2C);
@@ -1109,11 +1125,6 @@ static int geni_i2c_resources_init(struct geni_se *se)
if (ret)
return ret;
- ret = geni_i2c_clk_map_idx(gi2c);
- if (ret)
- return dev_err_probe(gi2c->se.dev, ret, "Invalid clk frequency %d Hz\n",
- gi2c->clk_freq_out);
-
return geni_icc_set_bw_ab(&gi2c->se, GENI_DEFAULT_BW, GENI_DEFAULT_BW,
Bps_to_icc(gi2c->clk_freq_out));
}
diff --git a/include/linux/soc/qcom/geni-se.h b/include/linux/soc/qcom/geni-se.h
index 29a53bbc0dd4..7e8c0bb6d674 100644
--- a/include/linux/soc/qcom/geni-se.h
+++ b/include/linux/soc/qcom/geni-se.h
@@ -331,6 +331,7 @@ struct geni_se {
#define RX_FIFO_DEPTH_SHFT 16
/* SE_HW_PARAM_2 fields */
+#define GEN_USE_MINICORES BIT(12)
#define PROG_RAM_DEPTH_MSK GENMASK(10, 0)
#define HW_VER_MAJOR_MASK GENMASK(31, 28)
--
2.34.1
next prev parent reply other threads:[~2026-08-12 8:31 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-12 8:30 [PATCH v2 0/2] I2C SCL counter updates for Qualcomm IPQ5424 SoC Kathiravan Thirumoorthy
2026-08-12 8:30 ` [PATCH v2 1/2] i2c: qcom-geni: update frequency table to fix timing parameters Kathiravan Thirumoorthy
2026-08-12 17:45 ` Mukesh Savaliya
2026-08-17 13:55 ` Konrad Dybcio
2026-08-18 10:58 ` Kathiravan Thirumoorthy
2026-08-24 9:22 ` Konrad Dybcio
2026-08-28 0:31 ` Andi Shyti
2026-08-12 8:30 ` Kathiravan Thirumoorthy [this message]
2026-08-12 17:56 ` [PATCH v2 2/2] i2c: qcom-geni: add I2C frequency table for 32 MHz firmware-based SEs Mukesh Savaliya
2026-08-24 9:24 ` Konrad Dybcio
2026-08-26 16:57 ` Kathiravan Thirumoorthy
2026-08-25 17:20 ` Praveen Talari
2026-08-26 16:59 ` Kathiravan Thirumoorthy
2026-08-26 17:25 ` Praveen Talari
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=20260812-ipq5424_i2c_scl_updates-v2-2-e09cd39d01d7@oss.qualcomm.com \
--to=kathiravan.thirumoorthy@oss.qualcomm.com \
--cc=andersson@kernel.org \
--cc=andi.shyti@kernel.org \
--cc=konradybcio@kernel.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mukesh.savaliya@oss.qualcomm.com \
--cc=quic_mmanikan@quicinc.com \
--cc=quic_msavaliy@quicinc.com \
--cc=viken.dadhaniya@oss.qualcomm.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.