Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit afa08974 authored by Jean Delvare's avatar Jean Delvare
Browse files

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: default avatarJean Delvare <khali@linux-fr.org>
Acked-by: default avatarBen Hutchings <bhutchings@solarflare.com>
parent 3806e94b
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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, &reg, GPIO_CTL_REG_KER);
	msleep(1);

	mutex_unlock(&efx->i2c_adap.bus_lock);
	i2c_unlock_adapter(&efx->i2c_adap);

	ssleep(1);
	return 0;
+18 −0
Original line number Diff line number Diff line
@@ -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 */