public inbox for cip-dev@lists.cip-project.org
 help / color / mirror / Atom feed
* [PATCH 6.12.y-cip 0/8] i2c: riic: miscellaneous code cleanup and improvements
@ 2025-04-23 21:04 Lad Prabhakar
  2025-04-23 21:04 ` [PATCH 6.12.y-cip 1/8] i2c: riic: Introduce a separate variable for IRQ Lad Prabhakar
                   ` (9 more replies)
  0 siblings, 10 replies; 11+ messages in thread
From: Lad Prabhakar @ 2025-04-23 21:04 UTC (permalink / raw)
  To: cip-dev, Nobuhiro Iwamatsu, Pavel Machek; +Cc: Biju Das, Fabrizio Castro

Hi All,

This patch series includes miscellaneous code cleanup and
improvements to RIIC driver used by Renesas RZ SoCs.

Note, all the patches have been cherry-picked from v6.15-rc3.

Cheers,
Prabhakar

Lad Prabhakar (8):
  i2c: riic: Introduce a separate variable for IRQ
  i2c: riic: Use dev_err_probe in probe and riic_init_hw functions
  i2c: riic: Use local `dev` pointer in `dev_err_probe()`
  i2c: riic: Use BIT macro consistently
  i2c: riic: Use GENMASK() macro for bitmask definitions
  i2c: riic: Mark riic_irqs array as const
  i2c: riic: Use predefined macro and simplify clock tick calculation
  i2c: riic: Add `riic_bus_barrier()` to check bus availability

 drivers/i2c/busses/i2c-riic.c | 117 ++++++++++++++++++++--------------
 1 file changed, 70 insertions(+), 47 deletions(-)

-- 
2.43.0



^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 6.12.y-cip 1/8] i2c: riic: Introduce a separate variable for IRQ
  2025-04-23 21:04 [PATCH 6.12.y-cip 0/8] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
@ 2025-04-23 21:04 ` Lad Prabhakar
  2025-04-23 21:04 ` [PATCH 6.12.y-cip 2/8] i2c: riic: Use dev_err_probe in probe and riic_init_hw functions Lad Prabhakar
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Lad Prabhakar @ 2025-04-23 21:04 UTC (permalink / raw)
  To: cip-dev, Nobuhiro Iwamatsu, Pavel Machek; +Cc: Biju Das, Fabrizio Castro

commit 76dc16296124ec478ec9ac011f0b9b52462c88d5 upstream.

Refactor the IRQ handling in riic_i2c_probe by introducing a local variable
`irq` to store IRQ numbers instead of assigning them to `ret`. This change
improves code readability and clarity.

Suggested-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Tested-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
---
 drivers/i2c/busses/i2c-riic.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/i2c/busses/i2c-riic.c b/drivers/i2c/busses/i2c-riic.c
index 2c982199782f..0df5a024140b 100644
--- a/drivers/i2c/busses/i2c-riic.c
+++ b/drivers/i2c/busses/i2c-riic.c
@@ -464,11 +464,13 @@ static int riic_i2c_probe(struct platform_device *pdev)
 		return ret;
 
 	for (i = 0; i < ARRAY_SIZE(riic_irqs); i++) {
-		ret = platform_get_irq(pdev, riic_irqs[i].res_num);
-		if (ret < 0)
-			return ret;
+		int irq;
+
+		irq = platform_get_irq(pdev, riic_irqs[i].res_num);
+		if (irq < 0)
+			return irq;
 
-		ret = devm_request_irq(dev, ret, riic_irqs[i].isr,
+		ret = devm_request_irq(dev, irq, riic_irqs[i].isr,
 				       0, riic_irqs[i].name, riic);
 		if (ret) {
 			dev_err(dev, "failed to request irq %s\n", riic_irqs[i].name);
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 6.12.y-cip 2/8] i2c: riic: Use dev_err_probe in probe and riic_init_hw functions
  2025-04-23 21:04 [PATCH 6.12.y-cip 0/8] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
  2025-04-23 21:04 ` [PATCH 6.12.y-cip 1/8] i2c: riic: Introduce a separate variable for IRQ Lad Prabhakar
@ 2025-04-23 21:04 ` Lad Prabhakar
  2025-04-23 21:04 ` [PATCH 6.12.y-cip 3/8] i2c: riic: Use local `dev` pointer in `dev_err_probe()` Lad Prabhakar
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Lad Prabhakar @ 2025-04-23 21:04 UTC (permalink / raw)
  To: cip-dev, Nobuhiro Iwamatsu, Pavel Machek; +Cc: Biju Das, Fabrizio Castro

commit e2aa2502e8067527e36dd7a3cad81b2004614a6c upstream.

Refactor error handling in the riic_i2c_probe() and riic_init_hw()
functions by replacing multiple dev_err() calls with dev_err_probe().

Additionally, update the riic_init_hw() function to use a local `dev`
pointer instead of `riic->adapter.dev` for dev_err_probe(), as the I2C
adapter is not initialized at this stage. Drop the cast to (unsigned long)
in the riic_init_hw() function when printing the bus frequency, and update
the error message to display the frequency in Hz, improving clarity.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Tested-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Tested-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Reviewed-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
---
 drivers/i2c/busses/i2c-riic.c | 22 +++++++++-------------
 1 file changed, 9 insertions(+), 13 deletions(-)

diff --git a/drivers/i2c/busses/i2c-riic.c b/drivers/i2c/busses/i2c-riic.c
index 0df5a024140b..552ad6bb151b 100644
--- a/drivers/i2c/busses/i2c-riic.c
+++ b/drivers/i2c/busses/i2c-riic.c
@@ -356,11 +356,9 @@ static int riic_init_hw(struct riic_dev *riic)
 		rate /= 2;
 	}
 
-	if (brl > (0x1F + 3)) {
-		dev_err(&riic->adapter.dev, "invalid speed (%lu). Too slow.\n",
-			(unsigned long)t->bus_freq_hz);
-		return -EINVAL;
-	}
+	if (brl > (0x1F + 3))
+		return dev_err_probe(dev, -EINVAL, "invalid speed (%uHz). Too slow.\n",
+				     t->bus_freq_hz);
 
 	brh = total_ticks - brl;
 
@@ -445,10 +443,9 @@ static int riic_i2c_probe(struct platform_device *pdev)
 		return PTR_ERR(riic->base);
 
 	riic->clk = devm_clk_get(dev, NULL);
-	if (IS_ERR(riic->clk)) {
-		dev_err(dev, "missing controller clock");
-		return PTR_ERR(riic->clk);
-	}
+	if (IS_ERR(riic->clk))
+		return dev_err_probe(dev, PTR_ERR(riic->clk),
+				     "missing controller clock");
 
 	riic->rstc = devm_reset_control_get_optional_exclusive(dev, NULL);
 	if (IS_ERR(riic->rstc))
@@ -472,10 +469,9 @@ static int riic_i2c_probe(struct platform_device *pdev)
 
 		ret = devm_request_irq(dev, irq, riic_irqs[i].isr,
 				       0, riic_irqs[i].name, riic);
-		if (ret) {
-			dev_err(dev, "failed to request irq %s\n", riic_irqs[i].name);
-			return ret;
-		}
+		if (ret)
+			return dev_err_probe(dev, ret, "failed to request irq %s\n",
+					     riic_irqs[i].name);
 	}
 
 	riic->info = of_device_get_match_data(dev);
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 6.12.y-cip 3/8] i2c: riic: Use local `dev` pointer in `dev_err_probe()`
  2025-04-23 21:04 [PATCH 6.12.y-cip 0/8] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
  2025-04-23 21:04 ` [PATCH 6.12.y-cip 1/8] i2c: riic: Introduce a separate variable for IRQ Lad Prabhakar
  2025-04-23 21:04 ` [PATCH 6.12.y-cip 2/8] i2c: riic: Use dev_err_probe in probe and riic_init_hw functions Lad Prabhakar
@ 2025-04-23 21:04 ` Lad Prabhakar
  2025-04-23 21:04 ` [PATCH 6.12.y-cip 4/8] i2c: riic: Use BIT macro consistently Lad Prabhakar
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Lad Prabhakar @ 2025-04-23 21:04 UTC (permalink / raw)
  To: cip-dev, Nobuhiro Iwamatsu, Pavel Machek; +Cc: Biju Das, Fabrizio Castro

commit 279c83db24552e83caa09347358473e633e56617 upstream.

Update the `riic_init_hw()` function to use the local `dev` pointer in
calls to `dev_err_probe()`. Previously, `riic_init_hw()` used
`riic->adapter.dev` in error reporting. Since this function is invoked
during the probe phase, the I2C adapter is not yet initialized, leading to
`(null) ...` being printed in error messages. This patch fixes the issue
by consistently using the local `dev` pointer, which points to
`riic->adapter.dev.parent`.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Tested-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Tested-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Reviewed-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
---
 drivers/i2c/busses/i2c-riic.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/i2c/busses/i2c-riic.c b/drivers/i2c/busses/i2c-riic.c
index 552ad6bb151b..0fcb0814846b 100644
--- a/drivers/i2c/busses/i2c-riic.c
+++ b/drivers/i2c/busses/i2c-riic.c
@@ -320,7 +320,7 @@ static int riic_init_hw(struct riic_dev *riic)
 				      : I2C_MAX_FAST_MODE_FREQ;
 
 	if (t->bus_freq_hz > max_freq)
-		return dev_err_probe(&riic->adapter.dev, -EINVAL,
+		return dev_err_probe(dev, -EINVAL,
 				     "unsupported bus speed %uHz (%u max)\n",
 				     t->bus_freq_hz, max_freq);
 
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 6.12.y-cip 4/8] i2c: riic: Use BIT macro consistently
  2025-04-23 21:04 [PATCH 6.12.y-cip 0/8] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
                   ` (2 preceding siblings ...)
  2025-04-23 21:04 ` [PATCH 6.12.y-cip 3/8] i2c: riic: Use local `dev` pointer in `dev_err_probe()` Lad Prabhakar
@ 2025-04-23 21:04 ` Lad Prabhakar
  2025-04-23 21:04 ` [PATCH 6.12.y-cip 5/8] i2c: riic: Use GENMASK() macro for bitmask definitions Lad Prabhakar
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Lad Prabhakar @ 2025-04-23 21:04 UTC (permalink / raw)
  To: cip-dev, Nobuhiro Iwamatsu, Pavel Machek; +Cc: Biju Das, Fabrizio Castro

commit 0094d6b70d6b4eb5084e3b7dd99ebfc94d3ca58d upstream.

Easier to read and ensures proper types.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Tested-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Tested-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Reviewed-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
---
 drivers/i2c/busses/i2c-riic.c | 37 ++++++++++++++++++-----------------
 1 file changed, 19 insertions(+), 18 deletions(-)

diff --git a/drivers/i2c/busses/i2c-riic.c b/drivers/i2c/busses/i2c-riic.c
index 0fcb0814846b..fb7067a6953b 100644
--- a/drivers/i2c/busses/i2c-riic.c
+++ b/drivers/i2c/busses/i2c-riic.c
@@ -34,6 +34,7 @@
  * Also check the comments in the interrupt routines for some gory details.
  */
 
+#include <linux/bits.h>
 #include <linux/clk.h>
 #include <linux/completion.h>
 #include <linux/err.h>
@@ -46,32 +47,32 @@
 #include <linux/pm_runtime.h>
 #include <linux/reset.h>
 
-#define ICCR1_ICE	0x80
-#define ICCR1_IICRST	0x40
-#define ICCR1_SOWP	0x10
+#define ICCR1_ICE	BIT(7)
+#define ICCR1_IICRST	BIT(6)
+#define ICCR1_SOWP	BIT(4)
 
-#define ICCR2_BBSY	0x80
-#define ICCR2_SP	0x08
-#define ICCR2_RS	0x04
-#define ICCR2_ST	0x02
+#define ICCR2_BBSY	BIT(7)
+#define ICCR2_SP	BIT(3)
+#define ICCR2_RS	BIT(2)
+#define ICCR2_ST	BIT(1)
 
 #define ICMR1_CKS_MASK	0x70
-#define ICMR1_BCWP	0x08
+#define ICMR1_BCWP	BIT(3)
 #define ICMR1_CKS(_x)	((((_x) << 4) & ICMR1_CKS_MASK) | ICMR1_BCWP)
 
-#define ICMR3_RDRFS	0x20
-#define ICMR3_ACKWP	0x10
-#define ICMR3_ACKBT	0x08
+#define ICMR3_RDRFS	BIT(5)
+#define ICMR3_ACKWP	BIT(4)
+#define ICMR3_ACKBT	BIT(3)
 
-#define ICFER_FMPE	0x80
+#define ICFER_FMPE	BIT(7)
 
-#define ICIER_TIE	0x80
-#define ICIER_TEIE	0x40
-#define ICIER_RIE	0x20
-#define ICIER_NAKIE	0x10
-#define ICIER_SPIE	0x08
+#define ICIER_TIE	BIT(7)
+#define ICIER_TEIE	BIT(6)
+#define ICIER_RIE	BIT(5)
+#define ICIER_NAKIE	BIT(4)
+#define ICIER_SPIE	BIT(3)
 
-#define ICSR2_NACKF	0x10
+#define ICSR2_NACKF	BIT(4)
 
 #define ICBR_RESERVED	0xe0 /* Should be 1 on writes */
 
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 6.12.y-cip 5/8] i2c: riic: Use GENMASK() macro for bitmask definitions
  2025-04-23 21:04 [PATCH 6.12.y-cip 0/8] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
                   ` (3 preceding siblings ...)
  2025-04-23 21:04 ` [PATCH 6.12.y-cip 4/8] i2c: riic: Use BIT macro consistently Lad Prabhakar
@ 2025-04-23 21:04 ` Lad Prabhakar
  2025-04-23 21:04 ` [PATCH 6.12.y-cip 6/8] i2c: riic: Mark riic_irqs array as const Lad Prabhakar
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Lad Prabhakar @ 2025-04-23 21:04 UTC (permalink / raw)
  To: cip-dev, Nobuhiro Iwamatsu, Pavel Machek; +Cc: Biju Das, Fabrizio Castro

commit 72252162258c8a0b19d5bd0bb49fe20495898d6d upstream.

Replace raw bitmask values with the `GENMASK()` macro in the `i2c-riic`
driver to improve readability and maintain consistency.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Tested-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Tested-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Reviewed-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
---
 drivers/i2c/busses/i2c-riic.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/i2c/busses/i2c-riic.c b/drivers/i2c/busses/i2c-riic.c
index fb7067a6953b..0fc935722354 100644
--- a/drivers/i2c/busses/i2c-riic.c
+++ b/drivers/i2c/busses/i2c-riic.c
@@ -56,7 +56,7 @@
 #define ICCR2_RS	BIT(2)
 #define ICCR2_ST	BIT(1)
 
-#define ICMR1_CKS_MASK	0x70
+#define ICMR1_CKS_MASK	GENMASK(6, 4)
 #define ICMR1_BCWP	BIT(3)
 #define ICMR1_CKS(_x)	((((_x) << 4) & ICMR1_CKS_MASK) | ICMR1_BCWP)
 
@@ -74,7 +74,7 @@
 
 #define ICSR2_NACKF	BIT(4)
 
-#define ICBR_RESERVED	0xe0 /* Should be 1 on writes */
+#define ICBR_RESERVED	GENMASK(7, 5) /* Should be 1 on writes */
 
 #define RIIC_INIT_MSG	-1
 
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 6.12.y-cip 6/8] i2c: riic: Mark riic_irqs array as const
  2025-04-23 21:04 [PATCH 6.12.y-cip 0/8] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
                   ` (4 preceding siblings ...)
  2025-04-23 21:04 ` [PATCH 6.12.y-cip 5/8] i2c: riic: Use GENMASK() macro for bitmask definitions Lad Prabhakar
@ 2025-04-23 21:04 ` Lad Prabhakar
  2025-04-23 21:04 ` [PATCH 6.12.y-cip 7/8] i2c: riic: Use predefined macro and simplify clock tick calculation Lad Prabhakar
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Lad Prabhakar @ 2025-04-23 21:04 UTC (permalink / raw)
  To: cip-dev, Nobuhiro Iwamatsu, Pavel Machek; +Cc: Biju Das, Fabrizio Castro

commit 9ae0e7f77cfb638c3cd4198ad1ce7a3bce9a5c2a upstream.

The riic_irqs array describes the supported IRQs by the RIIC driver and
does not change at runtime.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Tested-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Tested-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Reviewed-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
---
 drivers/i2c/busses/i2c-riic.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/i2c/busses/i2c-riic.c b/drivers/i2c/busses/i2c-riic.c
index 0fc935722354..8538a4de1b43 100644
--- a/drivers/i2c/busses/i2c-riic.c
+++ b/drivers/i2c/busses/i2c-riic.c
@@ -415,7 +415,7 @@ static int riic_init_hw(struct riic_dev *riic)
 	return 0;
 }
 
-static struct riic_irq_desc riic_irqs[] = {
+static const struct riic_irq_desc riic_irqs[] = {
 	{ .res_num = 0, .isr = riic_tend_isr, .name = "riic-tend" },
 	{ .res_num = 1, .isr = riic_rdrf_isr, .name = "riic-rdrf" },
 	{ .res_num = 2, .isr = riic_tdre_isr, .name = "riic-tdre" },
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 6.12.y-cip 7/8] i2c: riic: Use predefined macro and simplify clock tick calculation
  2025-04-23 21:04 [PATCH 6.12.y-cip 0/8] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
                   ` (5 preceding siblings ...)
  2025-04-23 21:04 ` [PATCH 6.12.y-cip 6/8] i2c: riic: Mark riic_irqs array as const Lad Prabhakar
@ 2025-04-23 21:04 ` Lad Prabhakar
  2025-04-23 21:04 ` [PATCH 6.12.y-cip 8/8] i2c: riic: Add `riic_bus_barrier()` to check bus availability Lad Prabhakar
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Lad Prabhakar @ 2025-04-23 21:04 UTC (permalink / raw)
  To: cip-dev, Nobuhiro Iwamatsu, Pavel Machek; +Cc: Biju Das, Fabrizio Castro

commit 385bb1c2678b59db201831255b524a6d7f7a25ff upstream.

Replace the hardcoded `1000000000` with the predefined `NSEC_PER_SEC`
macro for clarity. Simplify the code by introducing a `ns_per_tick`
variable to store `NSEC_PER_SEC / rate`, reducing redundancy and
improving readability.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Tested-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
---
 drivers/i2c/busses/i2c-riic.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/i2c/busses/i2c-riic.c b/drivers/i2c/busses/i2c-riic.c
index 8538a4de1b43..506b21423e75 100644
--- a/drivers/i2c/busses/i2c-riic.c
+++ b/drivers/i2c/busses/i2c-riic.c
@@ -46,6 +46,7 @@
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/reset.h>
+#include <linux/time.h>
 
 #define ICCR1_ICE	BIT(7)
 #define ICCR1_IICRST	BIT(6)
@@ -313,6 +314,7 @@ static int riic_init_hw(struct riic_dev *riic)
 {
 	int ret;
 	unsigned long rate;
+	unsigned long ns_per_tick;
 	int total_ticks, cks, brl, brh;
 	struct i2c_timings *t = &riic->i2c_t;
 	struct device *dev = riic->adapter.dev.parent;
@@ -376,8 +378,9 @@ static int riic_init_hw(struct riic_dev *riic)
 	 * Remove clock ticks for rise and fall times. Convert ns to clock
 	 * ticks.
 	 */
-	brl -= t->scl_fall_ns / (1000000000 / rate);
-	brh -= t->scl_rise_ns / (1000000000 / rate);
+	ns_per_tick = NSEC_PER_SEC / rate;
+	brl -= t->scl_fall_ns / ns_per_tick;
+	brh -= t->scl_rise_ns / ns_per_tick;
 
 	/* Adjust for min register values for when SCLE=1 and NFE=1 */
 	if (brl < 1)
@@ -387,8 +390,7 @@ static int riic_init_hw(struct riic_dev *riic)
 
 	pr_debug("i2c-riic: freq=%lu, duty=%d, fall=%lu, rise=%lu, cks=%d, brl=%d, brh=%d\n",
 		 rate / total_ticks, ((brl + 3) * 100) / (brl + brh + 6),
-		 t->scl_fall_ns / (1000000000 / rate),
-		 t->scl_rise_ns / (1000000000 / rate), cks, brl, brh);
+		 t->scl_fall_ns / ns_per_tick, t->scl_rise_ns / ns_per_tick, cks, brl, brh);
 
 	ret = pm_runtime_resume_and_get(dev);
 	if (ret)
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 6.12.y-cip 8/8] i2c: riic: Add `riic_bus_barrier()` to check bus availability
  2025-04-23 21:04 [PATCH 6.12.y-cip 0/8] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
                   ` (6 preceding siblings ...)
  2025-04-23 21:04 ` [PATCH 6.12.y-cip 7/8] i2c: riic: Use predefined macro and simplify clock tick calculation Lad Prabhakar
@ 2025-04-23 21:04 ` Lad Prabhakar
  2025-04-24 10:38 ` [cip-dev] [PATCH 6.12.y-cip 0/8] i2c: riic: miscellaneous code cleanup and improvements Pavel Machek
  2025-04-25  8:46 ` Pavel Machek
  9 siblings, 0 replies; 11+ messages in thread
From: Lad Prabhakar @ 2025-04-23 21:04 UTC (permalink / raw)
  To: cip-dev, Nobuhiro Iwamatsu, Pavel Machek; +Cc: Biju Das, Fabrizio Castro

commit b31addf2a08bc5c16dfd6eae8785546f3eea92b8 upstream.

Introduce a new `riic_bus_barrier()` function to verify bus availability
before initiating an I2C transfer. This function enhances the bus
arbitration check by ensuring that the SDA and SCL lines are not held low,
in addition to checking the BBSY flag using `readb_poll_timeout()`.

Previously, only the BBSY flag was checked to determine bus availability.
However, it is possible for the SDA line to remain low even when BBSY = 0.
This new implementation performs an additional check on the SDA and SCL
lines to avoid potential bus contention issues.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Tested-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Tested-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Reviewed-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
---
 drivers/i2c/busses/i2c-riic.c | 30 ++++++++++++++++++++++++++----
 1 file changed, 26 insertions(+), 4 deletions(-)

diff --git a/drivers/i2c/busses/i2c-riic.c b/drivers/i2c/busses/i2c-riic.c
index 506b21423e75..79540179fbd8 100644
--- a/drivers/i2c/busses/i2c-riic.c
+++ b/drivers/i2c/busses/i2c-riic.c
@@ -41,6 +41,7 @@
 #include <linux/i2c.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
+#include <linux/iopoll.h>
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/platform_device.h>
@@ -51,6 +52,8 @@
 #define ICCR1_ICE	BIT(7)
 #define ICCR1_IICRST	BIT(6)
 #define ICCR1_SOWP	BIT(4)
+#define ICCR1_SCLI	BIT(1)
+#define ICCR1_SDAI	BIT(0)
 
 #define ICCR2_BBSY	BIT(7)
 #define ICCR2_SP	BIT(3)
@@ -136,6 +139,27 @@ static inline void riic_clear_set_bit(struct riic_dev *riic, u8 clear, u8 set, u
 	riic_writeb(riic, (riic_readb(riic, reg) & ~clear) | set, reg);
 }
 
+static int riic_bus_barrier(struct riic_dev *riic)
+{
+	int ret;
+	u8 val;
+
+	/*
+	 * The SDA line can still be low even when BBSY = 0. Therefore, after checking
+	 * the BBSY flag, also verify that the SDA and SCL lines are not being held low.
+	 */
+	ret = readb_poll_timeout(riic->base + riic->info->regs[RIIC_ICCR2], val,
+				 !(val & ICCR2_BBSY), 10, riic->adapter.timeout);
+	if (ret)
+		return ret;
+
+	if ((riic_readb(riic, RIIC_ICCR1) & (ICCR1_SDAI | ICCR1_SCLI)) !=
+	     (ICCR1_SDAI | ICCR1_SCLI))
+		return -EBUSY;
+
+	return 0;
+}
+
 static int riic_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
 {
 	struct riic_dev *riic = i2c_get_adapdata(adap);
@@ -148,13 +172,11 @@ static int riic_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
 	if (ret)
 		return ret;
 
-	if (riic_readb(riic, RIIC_ICCR2) & ICCR2_BBSY) {
-		riic->err = -EBUSY;
+	riic->err = riic_bus_barrier(riic);
+	if (riic->err)
 		goto out;
-	}
 
 	reinit_completion(&riic->msg_done);
-	riic->err = 0;
 
 	riic_writeb(riic, 0, RIIC_ICSR2);
 
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [cip-dev] [PATCH 6.12.y-cip 0/8] i2c: riic: miscellaneous code cleanup and improvements
  2025-04-23 21:04 [PATCH 6.12.y-cip 0/8] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
                   ` (7 preceding siblings ...)
  2025-04-23 21:04 ` [PATCH 6.12.y-cip 8/8] i2c: riic: Add `riic_bus_barrier()` to check bus availability Lad Prabhakar
@ 2025-04-24 10:38 ` Pavel Machek
  2025-04-25  8:46 ` Pavel Machek
  9 siblings, 0 replies; 11+ messages in thread
From: Pavel Machek @ 2025-04-24 10:38 UTC (permalink / raw)
  To: prabhakar.mahadev-lad.rj
  Cc: cip-dev, Nobuhiro Iwamatsu, Biju Das, Fabrizio Castro

[-- Attachment #1: Type: text/plain, Size: 474 bytes --]

Hi!

> This patch series includes miscellaneous code cleanup and
> improvements to RIIC driver used by Renesas RZ SoCs.
> 
> Note, all the patches have been cherry-picked from v6.15-rc3.

Thank you, looks okay to me. I can apply it if passes testing and if
there are no other comments.

Best regards,
								Pavel
-- 
DENX Software Engineering GmbH,        Managing Director: Erika Unter
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [cip-dev] [PATCH 6.12.y-cip 0/8] i2c: riic: miscellaneous code cleanup and improvements
  2025-04-23 21:04 [PATCH 6.12.y-cip 0/8] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
                   ` (8 preceding siblings ...)
  2025-04-24 10:38 ` [cip-dev] [PATCH 6.12.y-cip 0/8] i2c: riic: miscellaneous code cleanup and improvements Pavel Machek
@ 2025-04-25  8:46 ` Pavel Machek
  9 siblings, 0 replies; 11+ messages in thread
From: Pavel Machek @ 2025-04-25  8:46 UTC (permalink / raw)
  To: prabhakar.mahadev-lad.rj
  Cc: cip-dev, Nobuhiro Iwamatsu, Biju Das, Fabrizio Castro

[-- Attachment #1: Type: text/plain, Size: 395 bytes --]

Hi!

> This patch series includes miscellaneous code cleanup and
> improvements to RIIC driver used by Renesas RZ SoCs.
> 
> Note, all the patches have been cherry-picked from v6.15-rc3.

Thank you, applied.

Best regards,
								Pavel
-- 
DENX Software Engineering GmbH,        Managing Director: Erika Unter
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2025-04-25  8:46 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-23 21:04 [PATCH 6.12.y-cip 0/8] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
2025-04-23 21:04 ` [PATCH 6.12.y-cip 1/8] i2c: riic: Introduce a separate variable for IRQ Lad Prabhakar
2025-04-23 21:04 ` [PATCH 6.12.y-cip 2/8] i2c: riic: Use dev_err_probe in probe and riic_init_hw functions Lad Prabhakar
2025-04-23 21:04 ` [PATCH 6.12.y-cip 3/8] i2c: riic: Use local `dev` pointer in `dev_err_probe()` Lad Prabhakar
2025-04-23 21:04 ` [PATCH 6.12.y-cip 4/8] i2c: riic: Use BIT macro consistently Lad Prabhakar
2025-04-23 21:04 ` [PATCH 6.12.y-cip 5/8] i2c: riic: Use GENMASK() macro for bitmask definitions Lad Prabhakar
2025-04-23 21:04 ` [PATCH 6.12.y-cip 6/8] i2c: riic: Mark riic_irqs array as const Lad Prabhakar
2025-04-23 21:04 ` [PATCH 6.12.y-cip 7/8] i2c: riic: Use predefined macro and simplify clock tick calculation Lad Prabhakar
2025-04-23 21:04 ` [PATCH 6.12.y-cip 8/8] i2c: riic: Add `riic_bus_barrier()` to check bus availability Lad Prabhakar
2025-04-24 10:38 ` [cip-dev] [PATCH 6.12.y-cip 0/8] i2c: riic: miscellaneous code cleanup and improvements Pavel Machek
2025-04-25  8:46 ` Pavel Machek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox