Message ID | 20180615101506.8012-3-peda@axentia.se (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, Jun 15, 2018 at 12:14:57PM +0200, Peter Rosin wrote: > Locking the root adapter for __i2c_transfer will deadlock if the > device sits behind a mux-locked I2C mux. Switch to the finer-grained > i2c_lock_segment. If the device does not sit behind a mux-locked mux, > the two locking variants are equivalent. > > Signed-off-by: Peter Rosin <peda@axentia.se> Can you quickly explain (or give a reference) the difference with these functions? Not an expert in this area. Thanks. /Jarkko
On 2018-06-19 14:56, Jarkko Sakkinen wrote: > On Fri, Jun 15, 2018 at 12:14:57PM +0200, Peter Rosin wrote: >> Locking the root adapter for __i2c_transfer will deadlock if the >> device sits behind a mux-locked I2C mux. Switch to the finer-grained >> i2c_lock_segment. If the device does not sit behind a mux-locked mux, >> the two locking variants are equivalent. >> >> Signed-off-by: Peter Rosin <peda@axentia.se> > > Can you quickly explain (or give a reference) the difference with these > functions? Not an expert in this area. Thanks. There are some words in the cover letter. If you need more, there's always Documentation/i2c/i2c-topology. Hope that helps, otherwise I'll try to explain better... Cheers, Peter
diff --git a/drivers/char/tpm/tpm_i2c_infineon.c b/drivers/char/tpm/tpm_i2c_infineon.c index 6116cd05e228..b2889405b4fa 100644 --- a/drivers/char/tpm/tpm_i2c_infineon.c +++ b/drivers/char/tpm/tpm_i2c_infineon.c @@ -117,7 +117,7 @@ static int iic_tpm_read(u8 addr, u8 *buffer, size_t len) /* Lock the adapter for the duration of the whole sequence. */ if (!tpm_dev.client->adapter->algo->master_xfer) return -EOPNOTSUPP; - i2c_lock_adapter(tpm_dev.client->adapter); + i2c_lock_segment(tpm_dev.client->adapter); if (tpm_dev.chip_type == SLB9645) { /* use a combined read for newer chips @@ -192,7 +192,7 @@ static int iic_tpm_read(u8 addr, u8 *buffer, size_t len) } out: - i2c_unlock_adapter(tpm_dev.client->adapter); + i2c_unlock_segment(tpm_dev.client->adapter); /* take care of 'guard time' */ usleep_range(SLEEP_DURATION_LOW, SLEEP_DURATION_HI); @@ -224,7 +224,7 @@ static int iic_tpm_write_generic(u8 addr, u8 *buffer, size_t len, if (!tpm_dev.client->adapter->algo->master_xfer) return -EOPNOTSUPP; - i2c_lock_adapter(tpm_dev.client->adapter); + i2c_lock_segment(tpm_dev.client->adapter); /* prepend the 'register address' to the buffer */ tpm_dev.buf[0] = addr; @@ -243,7 +243,7 @@ static int iic_tpm_write_generic(u8 addr, u8 *buffer, size_t len, usleep_range(sleep_low, sleep_hi); } - i2c_unlock_adapter(tpm_dev.client->adapter); + i2c_unlock_segment(tpm_dev.client->adapter); /* take care of 'guard time' */ usleep_range(SLEEP_DURATION_LOW, SLEEP_DURATION_HI);
Locking the root adapter for __i2c_transfer will deadlock if the device sits behind a mux-locked I2C mux. Switch to the finer-grained i2c_lock_segment. If the device does not sit behind a mux-locked mux, the two locking variants are equivalent. Signed-off-by: Peter Rosin <peda@axentia.se> --- drivers/char/tpm/tpm_i2c_infineon.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)