|
@@ -24,45 +24,16 @@ static const struct regmap_config inv_mpu_regmap_config = {
|
|
|
.val_bits = 8,
|
|
|
};
|
|
|
|
|
|
-/*
|
|
|
- * The i2c read/write needs to happen in unlocked mode. As the parent
|
|
|
- * adapter is common. If we use locked versions, it will fail as
|
|
|
- * the mux adapter will lock the parent i2c adapter, while calling
|
|
|
- * select/deselect functions.
|
|
|
- */
|
|
|
-static int inv_mpu6050_write_reg_unlocked(struct i2c_client *client,
|
|
|
- u8 reg, u8 d)
|
|
|
-{
|
|
|
- int ret;
|
|
|
- u8 buf[2] = {reg, d};
|
|
|
- struct i2c_msg msg[1] = {
|
|
|
- {
|
|
|
- .addr = client->addr,
|
|
|
- .flags = 0,
|
|
|
- .len = sizeof(buf),
|
|
|
- .buf = buf,
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- ret = __i2c_transfer(client->adapter, msg, 1);
|
|
|
- if (ret != 1)
|
|
|
- return ret;
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
static int inv_mpu6050_select_bypass(struct i2c_mux_core *muxc, u32 chan_id)
|
|
|
{
|
|
|
- struct i2c_client *client = i2c_mux_priv(muxc);
|
|
|
- struct iio_dev *indio_dev = dev_get_drvdata(&client->dev);
|
|
|
+ struct iio_dev *indio_dev = i2c_mux_priv(muxc);
|
|
|
struct inv_mpu6050_state *st = iio_priv(indio_dev);
|
|
|
int ret = 0;
|
|
|
|
|
|
/* Use the same mutex which was used everywhere to protect power-op */
|
|
|
mutex_lock(&indio_dev->mlock);
|
|
|
if (!st->powerup_count) {
|
|
|
- ret = inv_mpu6050_write_reg_unlocked(client,
|
|
|
- st->reg->pwr_mgmt_1, 0);
|
|
|
+ ret = regmap_write(st->map, st->reg->pwr_mgmt_1, 0);
|
|
|
if (ret)
|
|
|
goto write_error;
|
|
|
|
|
@@ -71,10 +42,9 @@ static int inv_mpu6050_select_bypass(struct i2c_mux_core *muxc, u32 chan_id)
|
|
|
}
|
|
|
if (!ret) {
|
|
|
st->powerup_count++;
|
|
|
- ret = inv_mpu6050_write_reg_unlocked(client,
|
|
|
- st->reg->int_pin_cfg,
|
|
|
- INV_MPU6050_INT_PIN_CFG |
|
|
|
- INV_MPU6050_BIT_BYPASS_EN);
|
|
|
+ ret = regmap_write(st->map, st->reg->int_pin_cfg,
|
|
|
+ INV_MPU6050_INT_PIN_CFG |
|
|
|
+ INV_MPU6050_BIT_BYPASS_EN);
|
|
|
}
|
|
|
write_error:
|
|
|
mutex_unlock(&indio_dev->mlock);
|
|
@@ -84,18 +54,16 @@ write_error:
|
|
|
|
|
|
static int inv_mpu6050_deselect_bypass(struct i2c_mux_core *muxc, u32 chan_id)
|
|
|
{
|
|
|
- struct i2c_client *client = i2c_mux_priv(muxc);
|
|
|
- struct iio_dev *indio_dev = dev_get_drvdata(&client->dev);
|
|
|
+ struct iio_dev *indio_dev = i2c_mux_priv(muxc);
|
|
|
struct inv_mpu6050_state *st = iio_priv(indio_dev);
|
|
|
|
|
|
mutex_lock(&indio_dev->mlock);
|
|
|
/* It doesn't really mattter, if any of the calls fails */
|
|
|
- inv_mpu6050_write_reg_unlocked(client, st->reg->int_pin_cfg,
|
|
|
- INV_MPU6050_INT_PIN_CFG);
|
|
|
+ regmap_write(st->map, st->reg->int_pin_cfg, INV_MPU6050_INT_PIN_CFG);
|
|
|
st->powerup_count--;
|
|
|
if (!st->powerup_count)
|
|
|
- inv_mpu6050_write_reg_unlocked(client, st->reg->pwr_mgmt_1,
|
|
|
- INV_MPU6050_BIT_SLEEP);
|
|
|
+ regmap_write(st->map, st->reg->pwr_mgmt_1,
|
|
|
+ INV_MPU6050_BIT_SLEEP);
|
|
|
mutex_unlock(&indio_dev->mlock);
|
|
|
|
|
|
return 0;
|
|
@@ -134,7 +102,7 @@ static int inv_mpu_probe(struct i2c_client *client,
|
|
|
|
|
|
st = iio_priv(dev_get_drvdata(&client->dev));
|
|
|
st->muxc = i2c_mux_alloc(client->adapter, &client->dev,
|
|
|
- 1, 0, 0,
|
|
|
+ 1, 0, I2C_MUX_LOCKED,
|
|
|
inv_mpu6050_select_bypass,
|
|
|
inv_mpu6050_deselect_bypass);
|
|
|
if (!st->muxc) {
|