i2c: Add an interface to lock/unlock an I2C bus segment
Some drivers need to be able to prevent access to an I2C bus segment for a specific period of time. Add an interface for them to do so without twiddling with i2c-core internals. Signed-off-by: Jean Delvare <khali@linux-fr.org> Acked-by: Ben Hutchings <bhutchings@solarflare.com>
This commit is contained in:
parent
3806e94b01
commit
afa08974fe
|
@ -188,7 +188,7 @@ static int sfn4111t_reset(struct efx_nic *efx)
|
|||
efx_oword_t reg;
|
||||
|
||||
/* GPIO 3 and the GPIO register are shared with I2C, so block that */
|
||||
mutex_lock(&efx->i2c_adap.bus_lock);
|
||||
i2c_lock_adapter(&efx->i2c_adap);
|
||||
|
||||
/* Pull RST_N (GPIO 2) low then let it up again, setting the
|
||||
* FLASH_CFG_1 strap (GPIO 3) appropriately. Only change the
|
||||
|
@ -204,7 +204,7 @@ static int sfn4111t_reset(struct efx_nic *efx)
|
|||
falcon_write(efx, ®, GPIO_CTL_REG_KER);
|
||||
msleep(1);
|
||||
|
||||
mutex_unlock(&efx->i2c_adap.bus_lock);
|
||||
i2c_unlock_adapter(&efx->i2c_adap);
|
||||
|
||||
ssleep(1);
|
||||
return 0;
|
||||
|
|
|
@ -361,6 +361,24 @@ static inline void i2c_set_adapdata(struct i2c_adapter *dev, void *data)
|
|||
dev_set_drvdata(&dev->dev, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* i2c_lock_adapter - Prevent access to an I2C bus segment
|
||||
* @adapter: Target I2C bus segment
|
||||
*/
|
||||
static inline void i2c_lock_adapter(struct i2c_adapter *adapter)
|
||||
{
|
||||
mutex_lock(&adapter->bus_lock);
|
||||
}
|
||||
|
||||
/**
|
||||
* i2c_unlock_adapter - Reauthorize access to an I2C bus segment
|
||||
* @adapter: Target I2C bus segment
|
||||
*/
|
||||
static inline void i2c_unlock_adapter(struct i2c_adapter *adapter)
|
||||
{
|
||||
mutex_unlock(&adapter->bus_lock);
|
||||
}
|
||||
|
||||
/*flags for the client struct: */
|
||||
#define I2C_CLIENT_PEC 0x04 /* Use Packet Error Checking */
|
||||
#define I2C_CLIENT_TEN 0x10 /* we have a ten bit chip address */
|
||||
|
|
Loading…
Reference in New Issue