* [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements
@ 2025-04-25 9:10 Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 01/15] i2c: riic: Use temporary variable for struct device Lad Prabhakar
` (15 more replies)
0 siblings, 16 replies; 20+ messages in thread
From: Lad Prabhakar @ 2025-04-25 9:10 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. Below are the features which
are backported:
- Runtime PM support
- Suspend/Resume support
- Fast Mode Plus
Note,
- Patches 9-15 have been recently posted to 6.12-cip
- All the patches have been cherry-picked from v6.15-rc3.
Cheers,
Prabhakar
Claudiu Beznea (7):
i2c: riic: Use temporary variable for struct device
i2c: riic: Call pm_runtime_get_sync() when need to access registers
i2c: riic: Use pm_runtime_resume_and_get()
i2c: riic: Enable runtime PM autosuspend support
i2c: riic: Add suspend/resume support
i2c: riic: Define individual arrays to describe the register offsets
i2c: riic: Add support for fast mode plus
Geert Uytterhoeven (1):
i2c: riic: Simplify unsupported bus speed handling
Lad Prabhakar (7):
i2c: riic: Introduce a separate variable for IRQ
i2c: riic: Use dev_err_probe in probe and riic_init_hw functions
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 | 333 ++++++++++++++++++++++------------
1 file changed, 221 insertions(+), 112 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 6.1.y-cip 01/15] i2c: riic: Use temporary variable for struct device
2025-04-25 9:10 [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
@ 2025-04-25 9:10 ` Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 02/15] i2c: riic: Call pm_runtime_get_sync() when need to access registers Lad Prabhakar
` (14 subsequent siblings)
15 siblings, 0 replies; 20+ messages in thread
From: Lad Prabhakar @ 2025-04-25 9:10 UTC (permalink / raw)
To: cip-dev, Nobuhiro Iwamatsu, Pavel Machek; +Cc: Biju Das, Fabrizio Castro
From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
commit b42ed9fd6cd111a312e4ef35d9a417756f581bef upstream.
Use a temporary variable for the struct device pointers to avoid
dereferencing.
Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
[PL: manually applied the changes in remove]
Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
---
drivers/i2c/busses/i2c-riic.c | 49 +++++++++++++++++++----------------
1 file changed, 26 insertions(+), 23 deletions(-)
diff --git a/drivers/i2c/busses/i2c-riic.c b/drivers/i2c/busses/i2c-riic.c
index 9df80c4c2b5bf..ea2c894600d52 100644
--- a/drivers/i2c/busses/i2c-riic.c
+++ b/drivers/i2c/busses/i2c-riic.c
@@ -132,11 +132,12 @@ static inline void riic_clear_set_bit(struct riic_dev *riic, u8 clear, u8 set, u
static int riic_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
{
struct riic_dev *riic = i2c_get_adapdata(adap);
+ struct device *dev = adap->dev.parent;
unsigned long time_left;
int i;
u8 start_bit;
- pm_runtime_get_sync(adap->dev.parent);
+ pm_runtime_get_sync(dev);
if (riic_readb(riic, RIIC_ICCR2) & ICCR2_BBSY) {
riic->err = -EBUSY;
@@ -169,7 +170,7 @@ static int riic_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
}
out:
- pm_runtime_put(adap->dev.parent);
+ pm_runtime_put(dev);
return riic->err ?: num;
}
@@ -304,8 +305,9 @@ static int riic_init_hw(struct riic_dev *riic, struct i2c_timings *t)
int ret = 0;
unsigned long rate;
int total_ticks, cks, brl, brh;
+ struct device *dev = riic->adapter.dev.parent;
- pm_runtime_get_sync(riic->adapter.dev.parent);
+ pm_runtime_get_sync(dev);
if (t->bus_freq_hz > I2C_MAX_FAST_MODE_FREQ) {
dev_err(&riic->adapter.dev,
@@ -397,7 +399,7 @@ static int riic_init_hw(struct riic_dev *riic, struct i2c_timings *t)
riic_clear_set_bit(riic, ICCR1_IICRST, 0, RIIC_ICCR1);
out:
- pm_runtime_put(riic->adapter.dev.parent);
+ pm_runtime_put(dev);
return ret;
}
@@ -416,13 +418,14 @@ static void riic_reset_control_assert(void *data)
static int riic_i2c_probe(struct platform_device *pdev)
{
+ struct device *dev = &pdev->dev;
struct riic_dev *riic;
struct i2c_adapter *adap;
struct i2c_timings i2c_t;
struct reset_control *rstc;
int i, ret;
- riic = devm_kzalloc(&pdev->dev, sizeof(*riic), GFP_KERNEL);
+ riic = devm_kzalloc(dev, sizeof(*riic), GFP_KERNEL);
if (!riic)
return -ENOMEM;
@@ -430,22 +433,22 @@ static int riic_i2c_probe(struct platform_device *pdev)
if (IS_ERR(riic->base))
return PTR_ERR(riic->base);
- riic->clk = devm_clk_get(&pdev->dev, NULL);
+ riic->clk = devm_clk_get(dev, NULL);
if (IS_ERR(riic->clk)) {
- dev_err(&pdev->dev, "missing controller clock");
+ dev_err(dev, "missing controller clock");
return PTR_ERR(riic->clk);
}
- rstc = devm_reset_control_get_optional_exclusive(&pdev->dev, NULL);
+ rstc = devm_reset_control_get_optional_exclusive(dev, NULL);
if (IS_ERR(rstc))
- return dev_err_probe(&pdev->dev, PTR_ERR(rstc),
+ return dev_err_probe(dev, PTR_ERR(rstc),
"Error: missing reset ctrl\n");
ret = reset_control_deassert(rstc);
if (ret)
return ret;
- ret = devm_add_action_or_reset(&pdev->dev, riic_reset_control_assert, rstc);
+ ret = devm_add_action_or_reset(dev, riic_reset_control_assert, rstc);
if (ret)
return ret;
@@ -454,29 +457,29 @@ static int riic_i2c_probe(struct platform_device *pdev)
if (ret < 0)
return ret;
- ret = devm_request_irq(&pdev->dev, ret, riic_irqs[i].isr,
+ ret = devm_request_irq(dev, ret, riic_irqs[i].isr,
0, riic_irqs[i].name, riic);
if (ret) {
- dev_err(&pdev->dev, "failed to request irq %s\n", riic_irqs[i].name);
+ dev_err(dev, "failed to request irq %s\n", riic_irqs[i].name);
return ret;
}
}
- riic->info = of_device_get_match_data(&pdev->dev);
+ riic->info = of_device_get_match_data(dev);
adap = &riic->adapter;
i2c_set_adapdata(adap, riic);
strscpy(adap->name, "Renesas RIIC adapter", sizeof(adap->name));
adap->owner = THIS_MODULE;
adap->algo = &riic_algo;
- adap->dev.parent = &pdev->dev;
- adap->dev.of_node = pdev->dev.of_node;
+ adap->dev.parent = dev;
+ adap->dev.of_node = dev->of_node;
init_completion(&riic->msg_done);
- i2c_parse_fw_timings(&pdev->dev, &i2c_t, true);
+ i2c_parse_fw_timings(dev, &i2c_t, true);
- pm_runtime_enable(&pdev->dev);
+ pm_runtime_enable(dev);
ret = riic_init_hw(riic, &i2c_t);
if (ret)
@@ -488,24 +491,24 @@ static int riic_i2c_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, riic);
- dev_info(&pdev->dev, "registered with %dHz bus speed\n",
- i2c_t.bus_freq_hz);
+ dev_info(dev, "registered with %dHz bus speed\n", i2c_t.bus_freq_hz);
return 0;
out:
- pm_runtime_disable(&pdev->dev);
+ pm_runtime_disable(dev);
return ret;
}
static int riic_i2c_remove(struct platform_device *pdev)
{
struct riic_dev *riic = platform_get_drvdata(pdev);
+ struct device *dev = &pdev->dev;
- pm_runtime_get_sync(&pdev->dev);
+ pm_runtime_get_sync(dev);
riic_writeb(riic, 0, RIIC_ICIER);
- pm_runtime_put(&pdev->dev);
+ pm_runtime_put(dev);
i2c_del_adapter(&riic->adapter);
- pm_runtime_disable(&pdev->dev);
+ pm_runtime_disable(dev);
return 0;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 6.1.y-cip 02/15] i2c: riic: Call pm_runtime_get_sync() when need to access registers
2025-04-25 9:10 [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 01/15] i2c: riic: Use temporary variable for struct device Lad Prabhakar
@ 2025-04-25 9:10 ` Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 03/15] i2c: riic: Use pm_runtime_resume_and_get() Lad Prabhakar
` (13 subsequent siblings)
15 siblings, 0 replies; 20+ messages in thread
From: Lad Prabhakar @ 2025-04-25 9:10 UTC (permalink / raw)
To: cip-dev, Nobuhiro Iwamatsu, Pavel Machek; +Cc: Biju Das, Fabrizio Castro
From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
commit a1ecb041589017ce4e03d92f3b9a92a2a8a37ceb upstream.
There is no need to runtime resume the device as long as the IP registers
are not accessed. Calling pm_runtime_get_sync() at the register access
time leads to a simpler error path.
Reviewed-by: Andi Shyti <andi.shyti@kernel.org>
Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
---
drivers/i2c/busses/i2c-riic.c | 14 +++++---------
1 file changed, 5 insertions(+), 9 deletions(-)
diff --git a/drivers/i2c/busses/i2c-riic.c b/drivers/i2c/busses/i2c-riic.c
index ea2c894600d52..531210f55abac 100644
--- a/drivers/i2c/busses/i2c-riic.c
+++ b/drivers/i2c/busses/i2c-riic.c
@@ -302,19 +302,15 @@ static const struct i2c_algorithm riic_algo = {
static int riic_init_hw(struct riic_dev *riic, struct i2c_timings *t)
{
- int ret = 0;
unsigned long rate;
int total_ticks, cks, brl, brh;
struct device *dev = riic->adapter.dev.parent;
- pm_runtime_get_sync(dev);
-
if (t->bus_freq_hz > I2C_MAX_FAST_MODE_FREQ) {
dev_err(&riic->adapter.dev,
"unsupported bus speed (%dHz). %d max\n",
t->bus_freq_hz, I2C_MAX_FAST_MODE_FREQ);
- ret = -EINVAL;
- goto out;
+ return -EINVAL;
}
rate = clk_get_rate(riic->clk);
@@ -352,8 +348,7 @@ static int riic_init_hw(struct riic_dev *riic, struct i2c_timings *t)
if (brl > (0x1F + 3)) {
dev_err(&riic->adapter.dev, "invalid speed (%lu). Too slow.\n",
(unsigned long)t->bus_freq_hz);
- ret = -EINVAL;
- goto out;
+ return -EINVAL;
}
brh = total_ticks - brl;
@@ -385,6 +380,8 @@ static int riic_init_hw(struct riic_dev *riic, struct i2c_timings *t)
t->scl_fall_ns / (1000000000 / rate),
t->scl_rise_ns / (1000000000 / rate), cks, brl, brh);
+ pm_runtime_get_sync(dev);
+
/* Changing the order of accessing IICRST and ICE may break things! */
riic_writeb(riic, ICCR1_IICRST | ICCR1_SOWP, RIIC_ICCR1);
riic_clear_set_bit(riic, 0, ICCR1_ICE, RIIC_ICCR1);
@@ -398,9 +395,8 @@ static int riic_init_hw(struct riic_dev *riic, struct i2c_timings *t)
riic_clear_set_bit(riic, ICCR1_IICRST, 0, RIIC_ICCR1);
-out:
pm_runtime_put(dev);
- return ret;
+ return 0;
}
static struct riic_irq_desc riic_irqs[] = {
--
2.43.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 6.1.y-cip 03/15] i2c: riic: Use pm_runtime_resume_and_get()
2025-04-25 9:10 [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 01/15] i2c: riic: Use temporary variable for struct device Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 02/15] i2c: riic: Call pm_runtime_get_sync() when need to access registers Lad Prabhakar
@ 2025-04-25 9:10 ` Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 04/15] i2c: riic: Enable runtime PM autosuspend support Lad Prabhakar
` (12 subsequent siblings)
15 siblings, 0 replies; 20+ messages in thread
From: Lad Prabhakar @ 2025-04-25 9:10 UTC (permalink / raw)
To: cip-dev, Nobuhiro Iwamatsu, Pavel Machek; +Cc: Biju Das, Fabrizio Castro
From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
commit 3149a9cf36cf17411e8564e22ec698b5aa2175c5 upstream.
pm_runtime_get_sync() may return with error. In case it returns with error
dev->power.usage_count needs to be decremented. pm_runtime_resume_and_get()
takes care of this. Thus use it.
Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
---
drivers/i2c/busses/i2c-riic.c | 20 ++++++++++++++------
1 file changed, 14 insertions(+), 6 deletions(-)
diff --git a/drivers/i2c/busses/i2c-riic.c b/drivers/i2c/busses/i2c-riic.c
index 531210f55abac..84f831635cd9d 100644
--- a/drivers/i2c/busses/i2c-riic.c
+++ b/drivers/i2c/busses/i2c-riic.c
@@ -134,10 +134,12 @@ static int riic_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
struct riic_dev *riic = i2c_get_adapdata(adap);
struct device *dev = adap->dev.parent;
unsigned long time_left;
- int i;
+ int i, ret;
u8 start_bit;
- pm_runtime_get_sync(dev);
+ ret = pm_runtime_resume_and_get(dev);
+ if (ret)
+ return ret;
if (riic_readb(riic, RIIC_ICCR2) & ICCR2_BBSY) {
riic->err = -EBUSY;
@@ -302,6 +304,7 @@ static const struct i2c_algorithm riic_algo = {
static int riic_init_hw(struct riic_dev *riic, struct i2c_timings *t)
{
+ int ret;
unsigned long rate;
int total_ticks, cks, brl, brh;
struct device *dev = riic->adapter.dev.parent;
@@ -380,7 +383,9 @@ static int riic_init_hw(struct riic_dev *riic, struct i2c_timings *t)
t->scl_fall_ns / (1000000000 / rate),
t->scl_rise_ns / (1000000000 / rate), cks, brl, brh);
- pm_runtime_get_sync(dev);
+ ret = pm_runtime_resume_and_get(dev);
+ if (ret)
+ return ret;
/* Changing the order of accessing IICRST and ICE may break things! */
riic_writeb(riic, ICCR1_IICRST | ICCR1_SOWP, RIIC_ICCR1);
@@ -499,10 +504,13 @@ static int riic_i2c_remove(struct platform_device *pdev)
{
struct riic_dev *riic = platform_get_drvdata(pdev);
struct device *dev = &pdev->dev;
+ int ret;
- pm_runtime_get_sync(dev);
- riic_writeb(riic, 0, RIIC_ICIER);
- pm_runtime_put(dev);
+ ret = pm_runtime_resume_and_get(dev);
+ if (!ret) {
+ riic_writeb(riic, 0, RIIC_ICIER);
+ pm_runtime_put(dev);
+ }
i2c_del_adapter(&riic->adapter);
pm_runtime_disable(dev);
--
2.43.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 6.1.y-cip 04/15] i2c: riic: Enable runtime PM autosuspend support
2025-04-25 9:10 [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
` (2 preceding siblings ...)
2025-04-25 9:10 ` [PATCH 6.1.y-cip 03/15] i2c: riic: Use pm_runtime_resume_and_get() Lad Prabhakar
@ 2025-04-25 9:10 ` Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 05/15] i2c: riic: Add suspend/resume support Lad Prabhakar
` (11 subsequent siblings)
15 siblings, 0 replies; 20+ messages in thread
From: Lad Prabhakar @ 2025-04-25 9:10 UTC (permalink / raw)
To: cip-dev, Nobuhiro Iwamatsu, Pavel Machek; +Cc: Biju Das, Fabrizio Castro
From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
commit 10d5c8845d36ca71212f588849532c5f484111e4 upstream.
Enable runtime PM autosuspend support for the RIIC driver. With this, in
case there are consecutive xfer requests the device wouldn't be runtime
enabled/disabled after each consecutive xfer but after the
the delay configured by user. With this, we can avoid touching hardware
registers involved in runtime PM suspend/resume saving in this way some
cycles. The default chosen autosuspend delay is zero to keep the
previous driver behavior.
Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
[PL: manually applied changes in remove func]
Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
---
drivers/i2c/busses/i2c-riic.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/drivers/i2c/busses/i2c-riic.c b/drivers/i2c/busses/i2c-riic.c
index 84f831635cd9d..d3c17891970ab 100644
--- a/drivers/i2c/busses/i2c-riic.c
+++ b/drivers/i2c/busses/i2c-riic.c
@@ -172,7 +172,8 @@ static int riic_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
}
out:
- pm_runtime_put(dev);
+ pm_runtime_mark_last_busy(dev);
+ pm_runtime_put_autosuspend(dev);
return riic->err ?: num;
}
@@ -400,7 +401,8 @@ static int riic_init_hw(struct riic_dev *riic, struct i2c_timings *t)
riic_clear_set_bit(riic, ICCR1_IICRST, 0, RIIC_ICCR1);
- pm_runtime_put(dev);
+ pm_runtime_mark_last_busy(dev);
+ pm_runtime_put_autosuspend(dev);
return 0;
}
@@ -480,6 +482,9 @@ static int riic_i2c_probe(struct platform_device *pdev)
i2c_parse_fw_timings(dev, &i2c_t, true);
+ /* Default 0 to save power. Can be overridden via sysfs for lower latency. */
+ pm_runtime_set_autosuspend_delay(dev, 0);
+ pm_runtime_use_autosuspend(dev);
pm_runtime_enable(dev);
ret = riic_init_hw(riic, &i2c_t);
@@ -497,6 +502,7 @@ static int riic_i2c_probe(struct platform_device *pdev)
out:
pm_runtime_disable(dev);
+ pm_runtime_dont_use_autosuspend(dev);
return ret;
}
@@ -513,6 +519,7 @@ static int riic_i2c_remove(struct platform_device *pdev)
}
i2c_del_adapter(&riic->adapter);
pm_runtime_disable(dev);
+ pm_runtime_dont_use_autosuspend(dev);
return 0;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 6.1.y-cip 05/15] i2c: riic: Add suspend/resume support
2025-04-25 9:10 [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
` (3 preceding siblings ...)
2025-04-25 9:10 ` [PATCH 6.1.y-cip 04/15] i2c: riic: Enable runtime PM autosuspend support Lad Prabhakar
@ 2025-04-25 9:10 ` Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 06/15] i2c: riic: Define individual arrays to describe the register offsets Lad Prabhakar
` (10 subsequent siblings)
15 siblings, 0 replies; 20+ messages in thread
From: Lad Prabhakar @ 2025-04-25 9:10 UTC (permalink / raw)
To: cip-dev, Nobuhiro Iwamatsu, Pavel Machek; +Cc: Biju Das, Fabrizio Castro
From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
commit 53326135d0e041ebe7d08bf22f82529ae69a096e upstream.
Add suspend/resume support for the RIIC driver. This is necessary for the
Renesas RZ/G3S SoC which support suspend to deep sleep state where power
to most of the SoC components is turned off. As a result the I2C controller
needs to be reconfigured after suspend/resume. For this, the reset line
was stored in the driver private data structure as well as i2c timings.
The reset line and I2C timings are necessary to re-initialize the
controller after resume.
Reviewed-by: Andi Shyti <andi.shyti@kernel.org>
Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
---
drivers/i2c/busses/i2c-riic.c | 73 +++++++++++++++++++++++++++++------
1 file changed, 62 insertions(+), 11 deletions(-)
diff --git a/drivers/i2c/busses/i2c-riic.c b/drivers/i2c/busses/i2c-riic.c
index d3c17891970ab..f46d8b21f6379 100644
--- a/drivers/i2c/busses/i2c-riic.c
+++ b/drivers/i2c/busses/i2c-riic.c
@@ -106,6 +106,8 @@ struct riic_dev {
struct completion msg_done;
struct i2c_adapter adapter;
struct clk *clk;
+ struct reset_control *rstc;
+ struct i2c_timings i2c_t;
};
struct riic_irq_desc {
@@ -303,11 +305,12 @@ static const struct i2c_algorithm riic_algo = {
.functionality = riic_func,
};
-static int riic_init_hw(struct riic_dev *riic, struct i2c_timings *t)
+static int riic_init_hw(struct riic_dev *riic)
{
int ret;
unsigned long rate;
int total_ticks, cks, brl, brh;
+ struct i2c_timings *t = &riic->i2c_t;
struct device *dev = riic->adapter.dev.parent;
if (t->bus_freq_hz > I2C_MAX_FAST_MODE_FREQ) {
@@ -424,8 +427,6 @@ static int riic_i2c_probe(struct platform_device *pdev)
struct device *dev = &pdev->dev;
struct riic_dev *riic;
struct i2c_adapter *adap;
- struct i2c_timings i2c_t;
- struct reset_control *rstc;
int i, ret;
riic = devm_kzalloc(dev, sizeof(*riic), GFP_KERNEL);
@@ -442,16 +443,16 @@ static int riic_i2c_probe(struct platform_device *pdev)
return PTR_ERR(riic->clk);
}
- rstc = devm_reset_control_get_optional_exclusive(dev, NULL);
- if (IS_ERR(rstc))
- return dev_err_probe(dev, PTR_ERR(rstc),
+ riic->rstc = devm_reset_control_get_optional_exclusive(dev, NULL);
+ if (IS_ERR(riic->rstc))
+ return dev_err_probe(dev, PTR_ERR(riic->rstc),
"Error: missing reset ctrl\n");
- ret = reset_control_deassert(rstc);
+ ret = reset_control_deassert(riic->rstc);
if (ret)
return ret;
- ret = devm_add_action_or_reset(dev, riic_reset_control_assert, rstc);
+ ret = devm_add_action_or_reset(dev, riic_reset_control_assert, riic->rstc);
if (ret)
return ret;
@@ -480,14 +481,14 @@ static int riic_i2c_probe(struct platform_device *pdev)
init_completion(&riic->msg_done);
- i2c_parse_fw_timings(dev, &i2c_t, true);
+ i2c_parse_fw_timings(dev, &riic->i2c_t, true);
/* Default 0 to save power. Can be overridden via sysfs for lower latency. */
pm_runtime_set_autosuspend_delay(dev, 0);
pm_runtime_use_autosuspend(dev);
pm_runtime_enable(dev);
- ret = riic_init_hw(riic, &i2c_t);
+ ret = riic_init_hw(riic);
if (ret)
goto out;
@@ -497,7 +498,7 @@ static int riic_i2c_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, riic);
- dev_info(dev, "registered with %dHz bus speed\n", i2c_t.bus_freq_hz);
+ dev_info(dev, "registered with %dHz bus speed\n", riic->i2c_t.bus_freq_hz);
return 0;
out:
@@ -556,6 +557,55 @@ static const struct riic_of_data riic_rz_v2h_info = {
},
};
+static int riic_i2c_suspend(struct device *dev)
+{
+ struct riic_dev *riic = dev_get_drvdata(dev);
+ int ret;
+
+ ret = pm_runtime_resume_and_get(dev);
+ if (ret)
+ return ret;
+
+ i2c_mark_adapter_suspended(&riic->adapter);
+
+ /* Disable output on SDA, SCL pins. */
+ riic_clear_set_bit(riic, ICCR1_ICE, 0, RIIC_ICCR1);
+
+ pm_runtime_mark_last_busy(dev);
+ pm_runtime_put_sync(dev);
+
+ return reset_control_assert(riic->rstc);
+}
+
+static int riic_i2c_resume(struct device *dev)
+{
+ struct riic_dev *riic = dev_get_drvdata(dev);
+ int ret;
+
+ ret = reset_control_deassert(riic->rstc);
+ if (ret)
+ return ret;
+
+ ret = riic_init_hw(riic);
+ if (ret) {
+ /*
+ * In case this happens there is no way to recover from this
+ * state. The driver will remain loaded. We want to avoid
+ * keeping the reset line de-asserted for no reason.
+ */
+ reset_control_assert(riic->rstc);
+ return ret;
+ }
+
+ i2c_mark_adapter_resumed(&riic->adapter);
+
+ return 0;
+}
+
+static const struct dev_pm_ops riic_i2c_pm_ops = {
+ SYSTEM_SLEEP_PM_OPS(riic_i2c_suspend, riic_i2c_resume)
+};
+
static const struct of_device_id riic_i2c_dt_ids[] = {
{ .compatible = "renesas,riic-rz", .data = &riic_rz_a_info },
{ .compatible = "renesas,riic-r9a09g057", .data = &riic_rz_v2h_info },
@@ -568,6 +618,7 @@ static struct platform_driver riic_i2c_driver = {
.driver = {
.name = "i2c-riic",
.of_match_table = riic_i2c_dt_ids,
+ .pm = pm_ptr(&riic_i2c_pm_ops),
},
};
--
2.43.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 6.1.y-cip 06/15] i2c: riic: Define individual arrays to describe the register offsets
2025-04-25 9:10 [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
` (4 preceding siblings ...)
2025-04-25 9:10 ` [PATCH 6.1.y-cip 05/15] i2c: riic: Add suspend/resume support Lad Prabhakar
@ 2025-04-25 9:10 ` Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 07/15] i2c: riic: Add support for fast mode plus Lad Prabhakar
` (9 subsequent siblings)
15 siblings, 0 replies; 20+ messages in thread
From: Lad Prabhakar @ 2025-04-25 9:10 UTC (permalink / raw)
To: cip-dev, Nobuhiro Iwamatsu, Pavel Machek; +Cc: Biju Das, Fabrizio Castro
From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
commit 88c5cf45927bb43328b869b0bda7276e47896c44 upstream.
Define individual arrays to describe the register offsets. In this way
we can describe different IP variants that share the same register offsets
but have differences in other characteristics. Commit prepares for the
addition of fast mode plus.
Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
---
drivers/i2c/busses/i2c-riic.c | 58 +++++++++++++++++++----------------
1 file changed, 31 insertions(+), 27 deletions(-)
diff --git a/drivers/i2c/busses/i2c-riic.c b/drivers/i2c/busses/i2c-riic.c
index f46d8b21f6379..580201befae32 100644
--- a/drivers/i2c/busses/i2c-riic.c
+++ b/drivers/i2c/busses/i2c-riic.c
@@ -92,7 +92,7 @@ enum riic_reg_list {
};
struct riic_of_data {
- u8 regs[RIIC_REG_END];
+ const u8 *regs;
};
struct riic_dev {
@@ -525,36 +525,40 @@ static int riic_i2c_remove(struct platform_device *pdev)
return 0;
}
+static const u8 riic_rz_a_regs[RIIC_REG_END] = {
+ [RIIC_ICCR1] = 0x00,
+ [RIIC_ICCR2] = 0x04,
+ [RIIC_ICMR1] = 0x08,
+ [RIIC_ICMR3] = 0x10,
+ [RIIC_ICSER] = 0x18,
+ [RIIC_ICIER] = 0x1c,
+ [RIIC_ICSR2] = 0x24,
+ [RIIC_ICBRL] = 0x34,
+ [RIIC_ICBRH] = 0x38,
+ [RIIC_ICDRT] = 0x3c,
+ [RIIC_ICDRR] = 0x40,
+};
+
static const struct riic_of_data riic_rz_a_info = {
- .regs = {
- [RIIC_ICCR1] = 0x00,
- [RIIC_ICCR2] = 0x04,
- [RIIC_ICMR1] = 0x08,
- [RIIC_ICMR3] = 0x10,
- [RIIC_ICSER] = 0x18,
- [RIIC_ICIER] = 0x1c,
- [RIIC_ICSR2] = 0x24,
- [RIIC_ICBRL] = 0x34,
- [RIIC_ICBRH] = 0x38,
- [RIIC_ICDRT] = 0x3c,
- [RIIC_ICDRR] = 0x40,
- },
+ .regs = riic_rz_a_regs,
+};
+
+static const u8 riic_rz_v2h_regs[RIIC_REG_END] = {
+ [RIIC_ICCR1] = 0x00,
+ [RIIC_ICCR2] = 0x01,
+ [RIIC_ICMR1] = 0x02,
+ [RIIC_ICMR3] = 0x04,
+ [RIIC_ICSER] = 0x06,
+ [RIIC_ICIER] = 0x07,
+ [RIIC_ICSR2] = 0x09,
+ [RIIC_ICBRL] = 0x10,
+ [RIIC_ICBRH] = 0x11,
+ [RIIC_ICDRT] = 0x12,
+ [RIIC_ICDRR] = 0x13,
};
static const struct riic_of_data riic_rz_v2h_info = {
- .regs = {
- [RIIC_ICCR1] = 0x00,
- [RIIC_ICCR2] = 0x01,
- [RIIC_ICMR1] = 0x02,
- [RIIC_ICMR3] = 0x04,
- [RIIC_ICSER] = 0x06,
- [RIIC_ICIER] = 0x07,
- [RIIC_ICSR2] = 0x09,
- [RIIC_ICBRL] = 0x10,
- [RIIC_ICBRH] = 0x11,
- [RIIC_ICDRT] = 0x12,
- [RIIC_ICDRR] = 0x13,
- },
+ .regs = riic_rz_v2h_regs,
};
static int riic_i2c_suspend(struct device *dev)
--
2.43.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 6.1.y-cip 07/15] i2c: riic: Add support for fast mode plus
2025-04-25 9:10 [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
` (5 preceding siblings ...)
2025-04-25 9:10 ` [PATCH 6.1.y-cip 06/15] i2c: riic: Define individual arrays to describe the register offsets Lad Prabhakar
@ 2025-04-25 9:10 ` Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 08/15] i2c: riic: Simplify unsupported bus speed handling Lad Prabhakar
` (8 subsequent siblings)
15 siblings, 0 replies; 20+ messages in thread
From: Lad Prabhakar @ 2025-04-25 9:10 UTC (permalink / raw)
To: cip-dev, Nobuhiro Iwamatsu, Pavel Machek; +Cc: Biju Das, Fabrizio Castro
From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
commit 3e3c9bea659a48388a7444b6c2c41e967b263a24 upstream.
Fast mode plus is available on most of the IP variants that RIIC driver
is working with. The exception is (according to HW manuals of the SoCs
where this IP is available) the Renesas RZ/A1H. For this, patch
introduces the struct riic_of_data::fast_mode_plus.
Fast mode plus was tested on RZ/G3S, RZ/G2{L,UL,LC}, RZ/Five by
instantiating the RIIC frequency to 1MHz and issuing i2c reads on the
fast mode plus capable devices (and the i2c clock frequency was checked on
RZ/G3S).
Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
---
drivers/i2c/busses/i2c-riic.c | 24 ++++++++++++++++++++++--
1 file changed, 22 insertions(+), 2 deletions(-)
diff --git a/drivers/i2c/busses/i2c-riic.c b/drivers/i2c/busses/i2c-riic.c
index 580201befae32..b4e9a6aae7ca0 100644
--- a/drivers/i2c/busses/i2c-riic.c
+++ b/drivers/i2c/busses/i2c-riic.c
@@ -64,6 +64,8 @@
#define ICMR3_ACKWP 0x10
#define ICMR3_ACKBT 0x08
+#define ICFER_FMPE 0x80
+
#define ICIER_TIE 0x80
#define ICIER_TEIE 0x40
#define ICIER_RIE 0x20
@@ -81,6 +83,7 @@ enum riic_reg_list {
RIIC_ICCR2,
RIIC_ICMR1,
RIIC_ICMR3,
+ RIIC_ICFER,
RIIC_ICSER,
RIIC_ICIER,
RIIC_ICSR2,
@@ -93,6 +96,7 @@ enum riic_reg_list {
struct riic_of_data {
const u8 *regs;
+ bool fast_mode_plus;
};
struct riic_dev {
@@ -312,11 +316,15 @@ static int riic_init_hw(struct riic_dev *riic)
int total_ticks, cks, brl, brh;
struct i2c_timings *t = &riic->i2c_t;
struct device *dev = riic->adapter.dev.parent;
+ bool fast_mode_plus = riic->info->fast_mode_plus;
- if (t->bus_freq_hz > I2C_MAX_FAST_MODE_FREQ) {
+ if ((!fast_mode_plus && t->bus_freq_hz > I2C_MAX_FAST_MODE_FREQ) ||
+ (fast_mode_plus && t->bus_freq_hz > I2C_MAX_FAST_MODE_PLUS_FREQ)) {
dev_err(&riic->adapter.dev,
"unsupported bus speed (%dHz). %d max\n",
- t->bus_freq_hz, I2C_MAX_FAST_MODE_FREQ);
+ t->bus_freq_hz,
+ fast_mode_plus ? I2C_MAX_FAST_MODE_PLUS_FREQ :
+ I2C_MAX_FAST_MODE_FREQ);
return -EINVAL;
}
@@ -402,6 +410,9 @@ static int riic_init_hw(struct riic_dev *riic)
riic_writeb(riic, 0, RIIC_ICSER);
riic_writeb(riic, ICMR3_ACKWP | ICMR3_RDRFS, RIIC_ICMR3);
+ if (fast_mode_plus && t->bus_freq_hz > I2C_MAX_FAST_MODE_FREQ)
+ riic_clear_set_bit(riic, 0, ICFER_FMPE, RIIC_ICFER);
+
riic_clear_set_bit(riic, ICCR1_IICRST, 0, RIIC_ICCR1);
pm_runtime_mark_last_busy(dev);
@@ -530,6 +541,7 @@ static const u8 riic_rz_a_regs[RIIC_REG_END] = {
[RIIC_ICCR2] = 0x04,
[RIIC_ICMR1] = 0x08,
[RIIC_ICMR3] = 0x10,
+ [RIIC_ICFER] = 0x14,
[RIIC_ICSER] = 0x18,
[RIIC_ICIER] = 0x1c,
[RIIC_ICSR2] = 0x24,
@@ -541,6 +553,11 @@ static const u8 riic_rz_a_regs[RIIC_REG_END] = {
static const struct riic_of_data riic_rz_a_info = {
.regs = riic_rz_a_regs,
+ .fast_mode_plus = true,
+};
+
+static const struct riic_of_data riic_rz_a1h_info = {
+ .regs = riic_rz_a_regs,
};
static const u8 riic_rz_v2h_regs[RIIC_REG_END] = {
@@ -548,6 +565,7 @@ static const u8 riic_rz_v2h_regs[RIIC_REG_END] = {
[RIIC_ICCR2] = 0x01,
[RIIC_ICMR1] = 0x02,
[RIIC_ICMR3] = 0x04,
+ [RIIC_ICFER] = 0x05,
[RIIC_ICSER] = 0x06,
[RIIC_ICIER] = 0x07,
[RIIC_ICSR2] = 0x09,
@@ -559,6 +577,7 @@ static const u8 riic_rz_v2h_regs[RIIC_REG_END] = {
static const struct riic_of_data riic_rz_v2h_info = {
.regs = riic_rz_v2h_regs,
+ .fast_mode_plus = true,
};
static int riic_i2c_suspend(struct device *dev)
@@ -612,6 +631,7 @@ static const struct dev_pm_ops riic_i2c_pm_ops = {
static const struct of_device_id riic_i2c_dt_ids[] = {
{ .compatible = "renesas,riic-rz", .data = &riic_rz_a_info },
+ { .compatible = "renesas,riic-r7s72100", .data = &riic_rz_a1h_info, },
{ .compatible = "renesas,riic-r9a09g057", .data = &riic_rz_v2h_info },
{ /* Sentinel */ },
};
--
2.43.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 6.1.y-cip 08/15] i2c: riic: Simplify unsupported bus speed handling
2025-04-25 9:10 [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
` (6 preceding siblings ...)
2025-04-25 9:10 ` [PATCH 6.1.y-cip 07/15] i2c: riic: Add support for fast mode plus Lad Prabhakar
@ 2025-04-25 9:10 ` Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 09/15] i2c: riic: Introduce a separate variable for IRQ Lad Prabhakar
` (7 subsequent siblings)
15 siblings, 0 replies; 20+ messages in thread
From: Lad Prabhakar @ 2025-04-25 9:10 UTC (permalink / raw)
To: cip-dev, Nobuhiro Iwamatsu, Pavel Machek; +Cc: Biju Das, Fabrizio Castro
From: Geert Uytterhoeven <geert+renesas@glider.be>
commit 71dacb2565ed9d2839adb8e2a80ef30185c29035 upstream.
Simplify checking for unsupported bus speeds and reporting errors by
factoring out the calculation of the maximum bus speed, and by using the
dev_err_probe() helper.
While at it, use "%u" for u32, and improve the error message.
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Tested-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
---
drivers/i2c/busses/i2c-riic.c | 15 ++++++---------
1 file changed, 6 insertions(+), 9 deletions(-)
diff --git a/drivers/i2c/busses/i2c-riic.c b/drivers/i2c/busses/i2c-riic.c
index b4e9a6aae7ca0..a6cfc195baf80 100644
--- a/drivers/i2c/busses/i2c-riic.c
+++ b/drivers/i2c/busses/i2c-riic.c
@@ -317,16 +317,13 @@ static int riic_init_hw(struct riic_dev *riic)
struct i2c_timings *t = &riic->i2c_t;
struct device *dev = riic->adapter.dev.parent;
bool fast_mode_plus = riic->info->fast_mode_plus;
+ u32 max_freq = fast_mode_plus ? I2C_MAX_FAST_MODE_PLUS_FREQ
+ : I2C_MAX_FAST_MODE_FREQ;
- if ((!fast_mode_plus && t->bus_freq_hz > I2C_MAX_FAST_MODE_FREQ) ||
- (fast_mode_plus && t->bus_freq_hz > I2C_MAX_FAST_MODE_PLUS_FREQ)) {
- dev_err(&riic->adapter.dev,
- "unsupported bus speed (%dHz). %d max\n",
- t->bus_freq_hz,
- fast_mode_plus ? I2C_MAX_FAST_MODE_PLUS_FREQ :
- I2C_MAX_FAST_MODE_FREQ);
- return -EINVAL;
- }
+ if (t->bus_freq_hz > max_freq)
+ return dev_err_probe(&riic->adapter.dev, -EINVAL,
+ "unsupported bus speed %uHz (%u max)\n",
+ t->bus_freq_hz, max_freq);
rate = clk_get_rate(riic->clk);
--
2.43.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 6.1.y-cip 09/15] i2c: riic: Introduce a separate variable for IRQ
2025-04-25 9:10 [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
` (7 preceding siblings ...)
2025-04-25 9:10 ` [PATCH 6.1.y-cip 08/15] i2c: riic: Simplify unsupported bus speed handling Lad Prabhakar
@ 2025-04-25 9:10 ` Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 10/15] i2c: riic: Use dev_err_probe in probe and riic_init_hw functions Lad Prabhakar
` (6 subsequent siblings)
15 siblings, 0 replies; 20+ messages in thread
From: Lad Prabhakar @ 2025-04-25 9:10 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 a6cfc195baf80..4fb910e0b3df3 100644
--- a/drivers/i2c/busses/i2c-riic.c
+++ b/drivers/i2c/busses/i2c-riic.c
@@ -465,11 +465,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] 20+ messages in thread
* [PATCH 6.1.y-cip 10/15] i2c: riic: Use dev_err_probe in probe and riic_init_hw functions
2025-04-25 9:10 [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
` (8 preceding siblings ...)
2025-04-25 9:10 ` [PATCH 6.1.y-cip 09/15] i2c: riic: Introduce a separate variable for IRQ Lad Prabhakar
@ 2025-04-25 9:10 ` Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 11/15] i2c: riic: Use BIT macro consistently Lad Prabhakar
` (5 subsequent siblings)
15 siblings, 0 replies; 20+ messages in thread
From: Lad Prabhakar @ 2025-04-25 9:10 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 4fb910e0b3df3..ee48ec2f54cce 100644
--- a/drivers/i2c/busses/i2c-riic.c
+++ b/drivers/i2c/busses/i2c-riic.c
@@ -357,11 +357,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;
@@ -446,10 +444,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))
@@ -473,10 +470,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] 20+ messages in thread
* [PATCH 6.1.y-cip 11/15] i2c: riic: Use BIT macro consistently
2025-04-25 9:10 [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
` (9 preceding siblings ...)
2025-04-25 9:10 ` [PATCH 6.1.y-cip 10/15] i2c: riic: Use dev_err_probe in probe and riic_init_hw functions Lad Prabhakar
@ 2025-04-25 9:10 ` Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 12/15] i2c: riic: Use GENMASK() macro for bitmask definitions Lad Prabhakar
` (4 subsequent siblings)
15 siblings, 0 replies; 20+ messages in thread
From: Lad Prabhakar @ 2025-04-25 9:10 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 ee48ec2f54cce..5f67891cf4695 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>
@@ -47,32 +48,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] 20+ messages in thread
* [PATCH 6.1.y-cip 12/15] i2c: riic: Use GENMASK() macro for bitmask definitions
2025-04-25 9:10 [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
` (10 preceding siblings ...)
2025-04-25 9:10 ` [PATCH 6.1.y-cip 11/15] i2c: riic: Use BIT macro consistently Lad Prabhakar
@ 2025-04-25 9:10 ` Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 13/15] i2c: riic: Mark riic_irqs array as const Lad Prabhakar
` (3 subsequent siblings)
15 siblings, 0 replies; 20+ messages in thread
From: Lad Prabhakar @ 2025-04-25 9:10 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 5f67891cf4695..7fa5827b74662 100644
--- a/drivers/i2c/busses/i2c-riic.c
+++ b/drivers/i2c/busses/i2c-riic.c
@@ -57,7 +57,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)
@@ -75,7 +75,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] 20+ messages in thread
* [PATCH 6.1.y-cip 13/15] i2c: riic: Mark riic_irqs array as const
2025-04-25 9:10 [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
` (11 preceding siblings ...)
2025-04-25 9:10 ` [PATCH 6.1.y-cip 12/15] i2c: riic: Use GENMASK() macro for bitmask definitions Lad Prabhakar
@ 2025-04-25 9:10 ` Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 14/15] i2c: riic: Use predefined macro and simplify clock tick calculation Lad Prabhakar
` (2 subsequent siblings)
15 siblings, 0 replies; 20+ messages in thread
From: Lad Prabhakar @ 2025-04-25 9:10 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 7fa5827b74662..0dc2de0a14416 100644
--- a/drivers/i2c/busses/i2c-riic.c
+++ b/drivers/i2c/busses/i2c-riic.c
@@ -416,7 +416,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] 20+ messages in thread
* [PATCH 6.1.y-cip 14/15] i2c: riic: Use predefined macro and simplify clock tick calculation
2025-04-25 9:10 [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
` (12 preceding siblings ...)
2025-04-25 9:10 ` [PATCH 6.1.y-cip 13/15] i2c: riic: Mark riic_irqs array as const Lad Prabhakar
@ 2025-04-25 9:10 ` Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 15/15] i2c: riic: Add `riic_bus_barrier()` to check bus availability Lad Prabhakar
2025-04-25 10:24 ` [cip-dev] [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements Pavel Machek
15 siblings, 0 replies; 20+ messages in thread
From: Lad Prabhakar @ 2025-04-25 9:10 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 0dc2de0a14416..51a3faea13e0a 100644
--- a/drivers/i2c/busses/i2c-riic.c
+++ b/drivers/i2c/busses/i2c-riic.c
@@ -47,6 +47,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)
@@ -314,6 +315,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;
@@ -377,8 +379,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)
@@ -388,8 +391,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] 20+ messages in thread
* [PATCH 6.1.y-cip 15/15] i2c: riic: Add `riic_bus_barrier()` to check bus availability
2025-04-25 9:10 [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
` (13 preceding siblings ...)
2025-04-25 9:10 ` [PATCH 6.1.y-cip 14/15] i2c: riic: Use predefined macro and simplify clock tick calculation Lad Prabhakar
@ 2025-04-25 9:10 ` Lad Prabhakar
2025-04-25 10:24 ` [cip-dev] [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements Pavel Machek
15 siblings, 0 replies; 20+ messages in thread
From: Lad Prabhakar @ 2025-04-25 9:10 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 51a3faea13e0a..26975f44c999c 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/of_device.h>
@@ -52,6 +53,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)
@@ -137,6 +140,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);
@@ -149,13 +173,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] 20+ messages in thread
* Re: [cip-dev] [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements
2025-04-25 9:10 [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
` (14 preceding siblings ...)
2025-04-25 9:10 ` [PATCH 6.1.y-cip 15/15] i2c: riic: Add `riic_bus_barrier()` to check bus availability Lad Prabhakar
@ 2025-04-25 10:24 ` Pavel Machek
2025-04-25 10:26 ` Prabhakar Mahadev Lad
2025-04-25 22:06 ` Nobuhiro Iwamatsu
15 siblings, 2 replies; 20+ messages in thread
From: Pavel Machek @ 2025-04-25 10:24 UTC (permalink / raw)
To: prabhakar.mahadev-lad.rj
Cc: cip-dev, Nobuhiro Iwamatsu, Biju Das, Fabrizio Castro
[-- Attachment #1: Type: text/plain, Size: 656 bytes --]
Hi!
> This patch series includes miscellaneous code cleanup and improvements
> to RIIC driver used by Renesas RZ SoCs. Below are the features which
> are backported:
> - Runtime PM support
> - Suspend/Resume support
> - Fast Mode Plus
>
> Note,
> - Patches 9-15 have been recently posted to 6.12-cip
> - All the patches have been cherry-picked from v6.15-rc3.
Thank you, these look good. I can apply them if they pass testing and
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] 20+ messages in thread
* RE: [cip-dev] [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements
2025-04-25 10:24 ` [cip-dev] [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements Pavel Machek
@ 2025-04-25 10:26 ` Prabhakar Mahadev Lad
2025-04-25 22:06 ` Nobuhiro Iwamatsu
1 sibling, 0 replies; 20+ messages in thread
From: Prabhakar Mahadev Lad @ 2025-04-25 10:26 UTC (permalink / raw)
To: Pavel Machek
Cc: cip-dev@lists.cip-project.org, Nobuhiro Iwamatsu, Biju Das,
Fabrizio Castro
Hi,
> Subject: Re: [cip-dev] [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous
> code cleanup and improvements
>
> Hi!
>
> > This patch series includes miscellaneous code cleanup and improvements
> > to RIIC driver used by Renesas RZ SoCs. Below are the features which
> > are backported:
> > - Runtime PM support
> > - Suspend/Resume support
> > - Fast Mode Plus
> >
> > Note,
> > - Patches 9-15 have been recently posted to 6.12-cip
> > - All the patches have been cherry-picked from v6.15-rc3.
>
> Thank you, these look good. I can apply them if they pass testing and
> there are no other comments.
>
Thanks Pavel, for the quick review.
Cheers,
Prabhakar
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [cip-dev] [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements
2025-04-25 10:24 ` [cip-dev] [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements Pavel Machek
2025-04-25 10:26 ` Prabhakar Mahadev Lad
@ 2025-04-25 22:06 ` Nobuhiro Iwamatsu
2025-04-26 7:59 ` Pavel Machek
1 sibling, 1 reply; 20+ messages in thread
From: Nobuhiro Iwamatsu @ 2025-04-25 22:06 UTC (permalink / raw)
To: pavel
Cc: prabhakar.mahadev-lad.rj, cip-dev, Nobuhiro Iwamatsu, Biju Das,
Fabrizio Castro
Hi all,
2025年4月25日(金) 19:24 Pavel Machek via lists.cip-project.org
<pavel=denx.de@lists.cip-project.org>:
>
> Hi!
>
> > This patch series includes miscellaneous code cleanup and improvements
> > to RIIC driver used by Renesas RZ SoCs. Below are the features which
> > are backported:
> > - Runtime PM support
> > - Suspend/Resume support
> > - Fast Mode Plus
> >
> > Note,
> > - Patches 9-15 have been recently posted to 6.12-cip
> > - All the patches have been cherry-picked from v6.15-rc3.
>
> Thank you, these look good. I can apply them if they pass testing and
> there are no other comments.
I reviewed this series, looks good to me, too.
Reviewed-by: Nobuhiro Iwamatsu <nobuhiro1.iwamatsu@toshiba.co.jp>
Best regards,
Nobuhiro
--
Nobuhiro Iwamatsu
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [cip-dev] [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements
2025-04-25 22:06 ` Nobuhiro Iwamatsu
@ 2025-04-26 7:59 ` Pavel Machek
0 siblings, 0 replies; 20+ messages in thread
From: Pavel Machek @ 2025-04-26 7:59 UTC (permalink / raw)
To: Nobuhiro Iwamatsu
Cc: prabhakar.mahadev-lad.rj, cip-dev, Nobuhiro Iwamatsu, Biju Das,
Fabrizio Castro
[-- Attachment #1: Type: text/plain, Size: 900 bytes --]
Hi!
> > > This patch series includes miscellaneous code cleanup and improvements
> > > to RIIC driver used by Renesas RZ SoCs. Below are the features which
> > > are backported:
> > > - Runtime PM support
> > > - Suspend/Resume support
> > > - Fast Mode Plus
> > >
> > > Note,
> > > - Patches 9-15 have been recently posted to 6.12-cip
> > > - All the patches have been cherry-picked from v6.15-rc3.
> >
> > Thank you, these look good. I can apply them if they pass testing and
> > there are no other comments.
>
> I reviewed this series, looks good to me, too.
>
> Reviewed-by: Nobuhiro Iwamatsu <nobuhiro1.iwamatsu@toshiba.co.jp>
Thank you, I added your reviewed-by tag and applied the series.
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] 20+ messages in thread
end of thread, other threads:[~2025-04-26 7:59 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-25 9:10 [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 01/15] i2c: riic: Use temporary variable for struct device Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 02/15] i2c: riic: Call pm_runtime_get_sync() when need to access registers Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 03/15] i2c: riic: Use pm_runtime_resume_and_get() Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 04/15] i2c: riic: Enable runtime PM autosuspend support Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 05/15] i2c: riic: Add suspend/resume support Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 06/15] i2c: riic: Define individual arrays to describe the register offsets Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 07/15] i2c: riic: Add support for fast mode plus Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 08/15] i2c: riic: Simplify unsupported bus speed handling Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 09/15] i2c: riic: Introduce a separate variable for IRQ Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 10/15] i2c: riic: Use dev_err_probe in probe and riic_init_hw functions Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 11/15] i2c: riic: Use BIT macro consistently Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 12/15] i2c: riic: Use GENMASK() macro for bitmask definitions Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 13/15] i2c: riic: Mark riic_irqs array as const Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 14/15] i2c: riic: Use predefined macro and simplify clock tick calculation Lad Prabhakar
2025-04-25 9:10 ` [PATCH 6.1.y-cip 15/15] i2c: riic: Add `riic_bus_barrier()` to check bus availability Lad Prabhakar
2025-04-25 10:24 ` [cip-dev] [PATCH 6.1.y-cip 00/15] i2c: riic: miscellaneous code cleanup and improvements Pavel Machek
2025-04-25 10:26 ` Prabhakar Mahadev Lad
2025-04-25 22:06 ` Nobuhiro Iwamatsu
2025-04-26 7:59 ` Pavel Machek
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox