diff options
author | Jun Chen | 2019-06-05 15:23:16 +0800 |
---|---|---|
committer | Heiko Schocher | 2019-07-09 07:02:10 +0200 |
commit | e3b93dcee88ff2c782790f8ad556d12f142efc4e (patch) | |
tree | 28293d2b31048a5b18aa5f9cf785f10efe1ec0f3 /drivers | |
parent | e5aee22e4be75e75a854ab64503fc80598bc2004 (diff) |
i2c: designware_i2c: Restore enable state after set speed
Before calling __dw_i2c_set_bus_speed(),
the I2C could already be set as ether enable or disable,
we should restore the original setting instead of enable i2c anyway.
This patch fix a bug happened in init function:
__dw_i2c_init(){
/* Disable i2c */
...
__dw_i2c_set_bus_speed(i2c_base, NULL, speed);
writel(slaveaddr, &i2c_base->ic_sar);
/* Enable i2c */
}
In this case, enable i2c inside __dw_i2c_set_bus_speed() function
will cause ic_sar write fail.
Signed-off-by: Jun Chen <ptchentw@gmail.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/i2c/designware_i2c.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/i2c/designware_i2c.c b/drivers/i2c/designware_i2c.c index 9ccc2411a62..d11d47d246e 100644 --- a/drivers/i2c/designware_i2c.c +++ b/drivers/i2c/designware_i2c.c @@ -82,6 +82,7 @@ static unsigned int __dw_i2c_set_bus_speed(struct i2c_regs *i2c_base, { unsigned int cntl; unsigned int hcnt, lcnt; + unsigned int ena; int i2c_spd; if (speed >= I2C_MAX_SPEED) @@ -91,6 +92,9 @@ static unsigned int __dw_i2c_set_bus_speed(struct i2c_regs *i2c_base, else i2c_spd = IC_SPEED_MODE_STANDARD; + /* Get enable setting for restore later */ + ena = readl(&i2c_base->ic_enable) & IC_ENABLE_0B; + /* to set speed cltr must be disabled */ dw_i2c_enable(i2c_base, false); @@ -146,8 +150,9 @@ static unsigned int __dw_i2c_set_bus_speed(struct i2c_regs *i2c_base, if (scl_sda_cfg) writel(scl_sda_cfg->sda_hold, &i2c_base->ic_sda_hold); - /* Enable back i2c now speed set */ - dw_i2c_enable(i2c_base, true); + /* Restore back i2c now speed set */ + if (ena == IC_ENABLE_0B) + dw_i2c_enable(i2c_base, true); return 0; } |