Explorar el Código

mediatek: i2c: mt65xx: allow optional pmic clock

Using the I2C host controller on the MT7981 SoC requires 4 clocks to
be enabled. One of them, the pmic clk, is only enabled in case
'mediatek,have-pmic' is also set which has other consequences which
are not desired in this case.

Allow defining a pmic clk even in case the 'mediatek,have-pmic' propterty
is not present and the bus is not used to connect to a pmic, but may
still require to enable the pmic clock.

Signed-off-by: Daniel Golle <[email protected]>
Daniel Golle hace 2 años
padre
commit
2544dc34f2

+ 45 - 0
target/linux/mediatek/patches-5.15/855-i2c-mt65xx-allow-optional-pmic-clock.patch

@@ -0,0 +1,45 @@
+From 3bf827929a44c17bfb1bf1000b143c02ce26a929 Mon Sep 17 00:00:00 2001
+From: Daniel Golle <[email protected]>
+Date: Sat, 26 Aug 2023 21:56:51 +0100
+Subject: [PATCH] i2c: mt65xx: allow optional pmic clock
+
+Using the I2C host controller on the MT7981 SoC requires 4 clocks to
+be enabled. One of them, the pmic clk, is only enabled in case
+'mediatek,have-pmic' is also set which has other consequences which
+are not desired in this case.
+
+Allow defining a pmic clk even in case the 'mediatek,have-pmic' propterty
+is not present and the bus is not used to connect to a pmic, but may
+still require to enable the pmic clock.
+
+Signed-off-by: Daniel Golle <[email protected]>
+---
+ drivers/i2c/busses/i2c-mt65xx.c | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+--- a/drivers/i2c/busses/i2c-mt65xx.c
++++ b/drivers/i2c/busses/i2c-mt65xx.c
+@@ -1444,15 +1444,19 @@ static int mtk_i2c_probe(struct platform
+ 	if (IS_ERR(i2c->clocks[I2C_MT65XX_CLK_ARB].clk))
+ 		return PTR_ERR(i2c->clocks[I2C_MT65XX_CLK_ARB].clk);
+ 
++	i2c->clocks[I2C_MT65XX_CLK_PMIC].clk = devm_clk_get_optional(&pdev->dev, "pmic");
++	if (IS_ERR(i2c->clocks[I2C_MT65XX_CLK_PMIC].clk)) {
++		dev_err(&pdev->dev, "cannot get pmic clock\n");
++		return PTR_ERR(i2c->clocks[I2C_MT65XX_CLK_PMIC].clk);
++	}
++
+ 	if (i2c->have_pmic) {
+-		i2c->clocks[I2C_MT65XX_CLK_PMIC].clk = devm_clk_get(&pdev->dev, "pmic");
+-		if (IS_ERR(i2c->clocks[I2C_MT65XX_CLK_PMIC].clk)) {
++		if (!i2c->clocks[I2C_MT65XX_CLK_PMIC].clk) {
+ 			dev_err(&pdev->dev, "cannot get pmic clock\n");
+-			return PTR_ERR(i2c->clocks[I2C_MT65XX_CLK_PMIC].clk);
++			return -ENODEV;
+ 		}
+ 		speed_clk = I2C_MT65XX_CLK_PMIC;
+ 	} else {
+-		i2c->clocks[I2C_MT65XX_CLK_PMIC].clk = NULL;
+ 		speed_clk = I2C_MT65XX_CLK_MAIN;
+ 	}
+ 

+ 45 - 0
target/linux/mediatek/patches-6.1/855-i2c-mt65xx-allow-optional-pmic-clock.patch

@@ -0,0 +1,45 @@
+From 3bf827929a44c17bfb1bf1000b143c02ce26a929 Mon Sep 17 00:00:00 2001
+From: Daniel Golle <[email protected]>
+Date: Sat, 26 Aug 2023 21:56:51 +0100
+Subject: [PATCH] i2c: mt65xx: allow optional pmic clock
+
+Using the I2C host controller on the MT7981 SoC requires 4 clocks to
+be enabled. One of them, the pmic clk, is only enabled in case
+'mediatek,have-pmic' is also set which has other consequences which
+are not desired in this case.
+
+Allow defining a pmic clk even in case the 'mediatek,have-pmic' propterty
+is not present and the bus is not used to connect to a pmic, but may
+still require to enable the pmic clock.
+
+Signed-off-by: Daniel Golle <[email protected]>
+---
+ drivers/i2c/busses/i2c-mt65xx.c | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+--- a/drivers/i2c/busses/i2c-mt65xx.c
++++ b/drivers/i2c/busses/i2c-mt65xx.c
+@@ -1444,15 +1444,19 @@ static int mtk_i2c_probe(struct platform
+ 	if (IS_ERR(i2c->clocks[I2C_MT65XX_CLK_ARB].clk))
+ 		return PTR_ERR(i2c->clocks[I2C_MT65XX_CLK_ARB].clk);
+ 
++	i2c->clocks[I2C_MT65XX_CLK_PMIC].clk = devm_clk_get_optional(&pdev->dev, "pmic");
++	if (IS_ERR(i2c->clocks[I2C_MT65XX_CLK_PMIC].clk)) {
++		dev_err(&pdev->dev, "cannot get pmic clock\n");
++		return PTR_ERR(i2c->clocks[I2C_MT65XX_CLK_PMIC].clk);
++	}
++
+ 	if (i2c->have_pmic) {
+-		i2c->clocks[I2C_MT65XX_CLK_PMIC].clk = devm_clk_get(&pdev->dev, "pmic");
+-		if (IS_ERR(i2c->clocks[I2C_MT65XX_CLK_PMIC].clk)) {
++		if (!i2c->clocks[I2C_MT65XX_CLK_PMIC].clk) {
+ 			dev_err(&pdev->dev, "cannot get pmic clock\n");
+-			return PTR_ERR(i2c->clocks[I2C_MT65XX_CLK_PMIC].clk);
++			return -ENODEV;
+ 		}
+ 		speed_clk = I2C_MT65XX_CLK_PMIC;
+ 	} else {
+-		i2c->clocks[I2C_MT65XX_CLK_PMIC].clk = NULL;
+ 		speed_clk = I2C_MT65XX_CLK_MAIN;
+ 	}
+