* [PATCH 0/2] i2c: mt7621: add Airoha AN7589 support
@ 2026-11-11 9:39 John Crispin
2026-11-11 9:39 ` [PATCH 1/2] dt-bindings: i2c: mt7621: add Airoha AN7589 John Crispin
2026-11-11 9:39 ` [PATCH 2/2] i2c: mt7621: add support for " John Crispin
0 siblings, 2 replies; 3+ messages in thread
From: John Crispin @ 2026-11-11 9:39 UTC (permalink / raw)
To: Stefan Roese, Andi Shyti, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Matthias Brugger, AngeloGioacchino Del Regno
Cc: Christian Marangi, devicetree, lei.dong, Linqi.zhang,
linux-arm-kernel, linux-i2c, linux-kernel, linux-mediatek,
Rajeev.kumar, upstream, Weifeng.xu, zhengping.zhang
The Airoha AN7589 carries the MT7621 I2C controller with a second
control register that holds a 16 bit clock divider, and it runs without
SCL stretching.
Patch 1 adds the compatible. Patch 2 describes the variants as match
data.
The series applies to next-20261105 and has no dependencies.
John Crispin (2):
dt-bindings: i2c: mt7621: add Airoha AN7589
i2c: mt7621: add support for Airoha AN7589
.../bindings/i2c/mediatek,mt7621-i2c.yaml | 8 ++-
drivers/i2c/busses/i2c-mt7621.c | 58 ++++++++++++++++---
2 files changed, 57 insertions(+), 9 deletions(-)
base-commit: ddfe51b0a0f5dc9e415cc2c8ad8db17532dd426b
--
2.34.1
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 1/2] dt-bindings: i2c: mt7621: add Airoha AN7589
2026-11-11 9:39 [PATCH 0/2] i2c: mt7621: add Airoha AN7589 support John Crispin
@ 2026-11-11 9:39 ` John Crispin
2026-11-11 9:39 ` [PATCH 2/2] i2c: mt7621: add support for " John Crispin
1 sibling, 0 replies; 3+ messages in thread
From: John Crispin @ 2026-11-11 9:39 UTC (permalink / raw)
To: Stefan Roese, Andi Shyti, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Matthias Brugger, AngeloGioacchino Del Regno
Cc: Christian Marangi, devicetree, lei.dong, Linqi.zhang,
linux-arm-kernel, linux-i2c, linux-kernel, linux-mediatek,
Rajeev.kumar, upstream, Weifeng.xu, zhengping.zhang
The Airoha AN7589 carries the MT7621 I2C controller with a second
control register holding a wider clock divider. Give it a compatible of
its own so the driver can tell the variants apart.
Signed-off-by: John Crispin <john@phrozen.org>
---
.../devicetree/bindings/i2c/mediatek,mt7621-i2c.yaml | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/i2c/mediatek,mt7621-i2c.yaml b/Documentation/devicetree/bindings/i2c/mediatek,mt7621-i2c.yaml
index 118ec00fc190..28659bdd72f5 100644
--- a/Documentation/devicetree/bindings/i2c/mediatek,mt7621-i2c.yaml
+++ b/Documentation/devicetree/bindings/i2c/mediatek,mt7621-i2c.yaml
@@ -9,12 +9,18 @@ maintainers:
title: Mediatek MT7621/MT7628 I2C master controller
+description:
+ The same controller is used on Airoha SoCs. The AN7589 variant adds a
+ second control register with a wider clock divider.
+
allOf:
- $ref: /schemas/i2c/i2c-controller.yaml#
properties:
compatible:
- const: mediatek,mt7621-i2c
+ enum:
+ - airoha,an7589-i2c
+ - mediatek,mt7621-i2c
reg:
maxItems: 1
--
2.34.1
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 2/2] i2c: mt7621: add support for Airoha AN7589
2026-11-11 9:39 [PATCH 0/2] i2c: mt7621: add Airoha AN7589 support John Crispin
2026-11-11 9:39 ` [PATCH 1/2] dt-bindings: i2c: mt7621: add Airoha AN7589 John Crispin
@ 2026-11-11 9:39 ` John Crispin
1 sibling, 0 replies; 3+ messages in thread
From: John Crispin @ 2026-11-11 9:39 UTC (permalink / raw)
To: Stefan Roese, Andi Shyti, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Matthias Brugger, AngeloGioacchino Del Regno
Cc: Christian Marangi, devicetree, lei.dong, Linqi.zhang,
linux-arm-kernel, linux-i2c, linux-kernel, linux-mediatek,
Rajeev.kumar, upstream, Weifeng.xu, zhengping.zhang
The Airoha AN7589 carries this controller with a second control
register at 0x68. It holds a 16 bit clock divider selected by
SM0CTL2_SCL_DIV_SEL, wider than the 11 bit field in SM0CTL0, and SDA
wait control. The AN7589 also runs without SCL stretching.
Describe the variants as match data: whether to set SCL_STRETCH, and
whether to program the extended divider. With the extended divider the
bus frequency is clamped to the range from standard mode to fast mode
plus instead of the fixed divider bounds of the MT7621.
Signed-off-by: John Crispin <john@phrozen.org>
---
drivers/i2c/busses/i2c-mt7621.c | 58 ++++++++++++++++++++++++++++-----
1 file changed, 50 insertions(+), 8 deletions(-)
diff --git a/drivers/i2c/busses/i2c-mt7621.c b/drivers/i2c/busses/i2c-mt7621.c
index 9ea5e3f9a763..37524bae1f8b 100644
--- a/drivers/i2c/busses/i2c-mt7621.c
+++ b/drivers/i2c/busses/i2c-mt7621.c
@@ -10,6 +10,7 @@
* (C) 2014 Sittisak <sittisaks@hotmail.com>
*/
+#include <linux/bitfield.h>
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/i2c.h>
@@ -18,6 +19,7 @@
#include <linux/module.h>
#include <linux/of.h>
#include <linux/platform_device.h>
+#include <linux/property.h>
#include <linux/reset.h>
#define REG_SM0CFG2_REG 0x28
@@ -28,6 +30,7 @@
#define REG_PINTEN_REG 0x5c
#define REG_PINTST_REG 0x60
#define REG_PINTCL_REG 0x64
+#define REG_SM0CTL2_REG 0x68
/* REG_SM0CFG2_REG */
#define SM0CFG2_IS_AUTOMODE BIT(0)
@@ -54,13 +57,25 @@
#define SM0CTL1_MODE_MASK (0x7 << 4)
#define SM0CTL1_TRI BIT(0)
+/* REG_SM0CTL2_REG */
+#define SM0CTL2_DATA_WAIT_SDA BIT(18)
+#define SM0CTL2_INIT_WAIT_SDA BIT(17)
+#define SM0CTL2_SCL_DIV_SEL BIT(16)
+#define SM0CTL2_CLK_DIV_EXT GENMASK(15, 0)
+
/* timeout waiting for I2C devices to respond */
#define TIMEOUT_MS 1000
+struct mtk_i2c_soc_data {
+ bool scl_stretch;
+ bool ext_clk_div;
+};
+
struct mtk_i2c {
void __iomem *base;
struct device *dev;
struct i2c_adapter adap;
+ const struct mtk_i2c_soc_data *soc;
u32 bus_freq;
u32 clk_div;
u32 flags;
@@ -83,6 +98,7 @@ static int mtk_i2c_wait_idle(struct mtk_i2c *i2c)
static void mtk_i2c_reset(struct mtk_i2c *i2c)
{
+ u32 ctl0;
int ret;
ret = device_reset(i2c->adap.dev.parent);
@@ -93,8 +109,16 @@ static void mtk_i2c_reset(struct mtk_i2c *i2c)
* Don't set SM0CTL0_ODRAIN as its bit meaning is inverted. To
* configure open-drain mode, this bit needs to be cleared.
*/
- iowrite32(((i2c->clk_div << 16) & SM0CTL0_CLK_DIV_MASK) | SM0CTL0_EN |
- SM0CTL0_SCL_STRETCH, i2c->base + REG_SM0CTL0_REG);
+ ctl0 = ((i2c->clk_div << 16) & SM0CTL0_CLK_DIV_MASK) | SM0CTL0_EN;
+ if (i2c->soc->scl_stretch)
+ ctl0 |= SM0CTL0_SCL_STRETCH;
+ iowrite32(ctl0, i2c->base + REG_SM0CTL0_REG);
+
+ if (i2c->soc->ext_clk_div)
+ iowrite32(SM0CTL2_SCL_DIV_SEL | SM0CTL2_DATA_WAIT_SDA |
+ FIELD_PREP(SM0CTL2_CLK_DIV_EXT, i2c->clk_div),
+ i2c->base + REG_SM0CTL2_REG);
+
iowrite32(0, i2c->base + REG_SM0CFG2_REG);
}
@@ -250,8 +274,17 @@ static const struct i2c_algorithm mtk_i2c_algo = {
.functionality = mtk_i2c_func,
};
+static const struct mtk_i2c_soc_data mt7621_i2c_soc_data = {
+ .scl_stretch = true,
+};
+
+static const struct mtk_i2c_soc_data an7589_i2c_soc_data = {
+ .ext_clk_div = true,
+};
+
static const struct of_device_id i2c_mtk_dt_ids[] = {
- { .compatible = "mediatek,mt7621-i2c" },
+ { .compatible = "mediatek,mt7621-i2c", .data = &mt7621_i2c_soc_data },
+ { .compatible = "airoha,an7589-i2c", .data = &an7589_i2c_soc_data },
{ /* sentinel */ }
};
@@ -259,11 +292,16 @@ MODULE_DEVICE_TABLE(of, i2c_mtk_dt_ids);
static void mtk_i2c_init(struct mtk_i2c *i2c)
{
- i2c->clk_div = clk_get_rate(i2c->clk) / i2c->bus_freq - 1;
- if (i2c->clk_div < 99)
- i2c->clk_div = 99;
- if (i2c->clk_div > SM0CTL0_CLK_DIV_MAX)
- i2c->clk_div = SM0CTL0_CLK_DIV_MAX;
+ unsigned long rate = clk_get_rate(i2c->clk);
+ unsigned long div_min = 99;
+ unsigned long div_max = SM0CTL0_CLK_DIV_MAX;
+
+ if (i2c->soc->ext_clk_div) {
+ div_min = rate / I2C_MAX_FAST_MODE_PLUS_FREQ - 1;
+ div_max = rate / I2C_MAX_STANDARD_MODE_FREQ - 1;
+ }
+
+ i2c->clk_div = clamp(rate / i2c->bus_freq - 1, div_min, div_max);
mtk_i2c_reset(i2c);
}
@@ -278,6 +316,10 @@ static int mtk_i2c_probe(struct platform_device *pdev)
if (!i2c)
return -ENOMEM;
+ i2c->soc = device_get_match_data(&pdev->dev);
+ if (!i2c->soc)
+ return -EINVAL;
+
i2c->base = devm_platform_get_and_ioremap_resource(pdev, 0, NULL);
if (IS_ERR(i2c->base))
return PTR_ERR(i2c->base);
--
2.34.1
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-11-11 9:39 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-11-11 9:39 [PATCH 0/2] i2c: mt7621: add Airoha AN7589 support John Crispin
2026-11-11 9:39 ` [PATCH 1/2] dt-bindings: i2c: mt7621: add Airoha AN7589 John Crispin
2026-11-11 9:39 ` [PATCH 2/2] i2c: mt7621: add support for " John Crispin
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®