Commit 8048ab5e authored by Dmitry Bazhenov's avatar Dmitry Bazhenov Committed by Kleber Sacilotto de Souza

i2c: octeon: Avoid sending STOP during recovery

BugLink: https://bugs.launchpad.net/bugs/1688132

Due to a bug in the ThunderX I2C hardware sending STOP during
a recovery attempt could lock up the hardware. To work around
this problem do not send STOP at the beginning of the recovery
but use the override registers to bring the TWSI including
the high-level controller out of the bad state.
Signed-off-by: default avatarDmitry Bazhenov <dmitry.bazhenov@auriga.com>
Signed-off-by: default avatarJan Glauber <jglauber@cavium.com>
[Changed commit message]
Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>

(cherry picked from commit de919ff6)
Signed-off-by: default avatardann frazier <dann.frazier@canonical.com>
Acked-by: default avatarColin King <colin.king@canonical.com>
Acked-by: default avatarStefan Bader <stefan.bader@canonical.com>
Signed-off-by: default avatarThadeu Lima de Souza Cascardo <cascardo@canonical.com>
parent 20b8882b
......@@ -783,13 +783,14 @@ static void octeon_i2c_prepare_recovery(struct i2c_adapter *adap)
{
struct octeon_i2c *i2c = i2c_get_adapdata(adap);
octeon_i2c_hlc_disable(i2c);
/*
* The stop resets the state machine, does not _transmit_ STOP unless
* engine was active.
* Bring control register to a good state regardless
* of HLC state.
*/
octeon_i2c_stop(i2c);
octeon_i2c_ctl_write(i2c, TWSI_CTL_ENAB);
octeon_i2c_hlc_disable(i2c);
octeon_i2c_write_int(i2c, 0);
}
......@@ -797,6 +798,15 @@ static void octeon_i2c_unprepare_recovery(struct i2c_adapter *adap)
{
struct octeon_i2c *i2c = i2c_get_adapdata(adap);
/*
* Generate STOP to finish the unfinished transaction.
* Can't generate STOP via the TWSI CTL register
* since it could bring the TWSI controller into an inoperable state.
*/
octeon_i2c_write_int(i2c, TWSI_INT_SDA_OVR | TWSI_INT_SCL_OVR);
udelay(5);
octeon_i2c_write_int(i2c, TWSI_INT_SDA_OVR);
udelay(5);
octeon_i2c_write_int(i2c, 0);
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment