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;
|
efx_oword_t reg;
|
||||||
|
|
||||||
/* GPIO 3 and the GPIO register are shared with I2C, so block that */
|
/* 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
|
/* Pull RST_N (GPIO 2) low then let it up again, setting the
|
||||||
* FLASH_CFG_1 strap (GPIO 3) appropriately. Only change 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);
|
falcon_write(efx, ®, GPIO_CTL_REG_KER);
|
||||||
msleep(1);
|
msleep(1);
|
||||||
|
|
||||||
mutex_unlock(&efx->i2c_adap.bus_lock);
|
i2c_unlock_adapter(&efx->i2c_adap);
|
||||||
|
|
||||||
ssleep(1);
|
ssleep(1);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -361,6 +361,24 @@ static inline void i2c_set_adapdata(struct i2c_adapter *dev, void *data)
|
||||||
dev_set_drvdata(&dev->dev, 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: */
|
/*flags for the client struct: */
|
||||||
#define I2C_CLIENT_PEC 0x04 /* Use Packet Error Checking */
|
#define I2C_CLIENT_PEC 0x04 /* Use Packet Error Checking */
|
||||||
#define I2C_CLIENT_TEN 0x10 /* we have a ten bit chip address */
|
#define I2C_CLIENT_TEN 0x10 /* we have a ten bit chip address */
|
||||||
|
|
Loading…
Reference in New Issue