Skip to content

Commit

Permalink
i2c: riic: Call pm_runtime_get_sync() when need to access registers
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Claudiu Beznea authored and Andi Shyti committed Sep 9, 2024
1 parent b42ed9f commit a1ecb04
Showing 1 changed file with 5 additions and 9 deletions.
14 changes: 5 additions & 9 deletions drivers/i2c/busses/i2c-riic.c
Original file line number Diff line number Diff line change
Expand Up @@ -301,19 +301,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);
Expand Down Expand Up @@ -351,8 +347,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;
Expand Down Expand Up @@ -384,6 +379,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);
Expand All @@ -397,9 +394,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[] = {
Expand Down

0 comments on commit a1ecb04

Please sign in to comment.