Commit ca4a6496 authored by Jean-Baptiste Maneyrol's avatar Jean-Baptiste Maneyrol Committed by Jonathan Cameron

iio: imu: inv_mpu6050: disable i2c mux for MPU925x

Disable i2c mux for supported 9xxx chips. This is a
pre-requesite for controling 9xxx magnetometer using the
i2c master of the chip.

Check in device-tree that there is no i2c-gate device declared
for ensuring backward compatibility with existing setups.
Signed-off-by: default avatarJean-Baptiste Maneyrol <jmaneyrol@invensense.com>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 348eb0b2
...@@ -1156,9 +1156,6 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name, ...@@ -1156,9 +1156,6 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,
return result; return result;
} }
if (inv_mpu_bus_setup)
inv_mpu_bus_setup(indio_dev);
dev_set_drvdata(dev, indio_dev); dev_set_drvdata(dev, indio_dev);
indio_dev->dev.parent = dev; indio_dev->dev.parent = dev;
/* name will be NULL when enumerated via ACPI */ /* name will be NULL when enumerated via ACPI */
...@@ -1167,6 +1164,10 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name, ...@@ -1167,6 +1164,10 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,
else else
indio_dev->name = dev_name(dev); indio_dev->name = dev_name(dev);
/* requires parent device set in indio_dev */
if (inv_mpu_bus_setup)
inv_mpu_bus_setup(indio_dev);
if (chip_type == INV_ICM20602) { if (chip_type == INV_ICM20602) {
indio_dev->channels = inv_icm20602_channels; indio_dev->channels = inv_icm20602_channels;
indio_dev->num_channels = ARRAY_SIZE(inv_icm20602_channels); indio_dev->num_channels = ARRAY_SIZE(inv_icm20602_channels);
......
...@@ -68,6 +68,56 @@ static const char *inv_mpu_match_acpi_device(struct device *dev, ...@@ -68,6 +68,56 @@ static const char *inv_mpu_match_acpi_device(struct device *dev,
return dev_name(dev); return dev_name(dev);
} }
static bool inv_mpu_i2c_aux_bus(struct device *dev)
{
struct inv_mpu6050_state *st = iio_priv(dev_get_drvdata(dev));
switch (st->chip_type) {
case INV_ICM20608:
case INV_ICM20602:
/* no i2c auxiliary bus on the chip */
return false;
case INV_MPU9250:
case INV_MPU9255:
if (st->magn_disabled)
return true;
else
return false;
default:
return true;
}
}
/*
* MPU9xxx magnetometer support requires to disable i2c auxiliary bus support.
* To ensure backward compatibility with existing setups, do not disable
* i2c auxiliary bus if it used.
* Check for i2c-gate node in devicetree and set magnetometer disabled.
* Only MPU6500 is supported by ACPI, no need to check.
*/
static int inv_mpu_magn_disable(struct iio_dev *indio_dev)
{
struct inv_mpu6050_state *st = iio_priv(indio_dev);
struct device *dev = indio_dev->dev.parent;
struct device_node *mux_node;
switch (st->chip_type) {
case INV_MPU9250:
case INV_MPU9255:
mux_node = of_get_child_by_name(dev->of_node, "i2c-gate");
if (mux_node != NULL) {
st->magn_disabled = true;
dev_warn(dev, "disable internal use of magnetometer\n");
}
of_node_put(mux_node);
break;
default:
break;
}
return 0;
}
/** /**
* inv_mpu_probe() - probe function. * inv_mpu_probe() - probe function.
* @client: i2c client. * @client: i2c client.
...@@ -112,17 +162,12 @@ static int inv_mpu_probe(struct i2c_client *client, ...@@ -112,17 +162,12 @@ static int inv_mpu_probe(struct i2c_client *client,
} }
result = inv_mpu_core_probe(regmap, client->irq, name, result = inv_mpu_core_probe(regmap, client->irq, name,
NULL, chip_type); inv_mpu_magn_disable, chip_type);
if (result < 0) if (result < 0)
return result; return result;
st = iio_priv(dev_get_drvdata(&client->dev)); st = iio_priv(dev_get_drvdata(&client->dev));
switch (st->chip_type) { if (inv_mpu_i2c_aux_bus(&client->dev)) {
case INV_ICM20608:
case INV_ICM20602:
/* no i2c auxiliary bus on the chip */
break;
default:
/* declare i2c auxiliary bus */ /* declare i2c auxiliary bus */
st->muxc = i2c_mux_alloc(client->adapter, &client->dev, st->muxc = i2c_mux_alloc(client->adapter, &client->dev,
1, 0, I2C_MUX_LOCKED | I2C_MUX_GATE, 1, 0, I2C_MUX_LOCKED | I2C_MUX_GATE,
...@@ -137,7 +182,6 @@ static int inv_mpu_probe(struct i2c_client *client, ...@@ -137,7 +182,6 @@ static int inv_mpu_probe(struct i2c_client *client,
result = inv_mpu_acpi_create_mux_client(client); result = inv_mpu_acpi_create_mux_client(client);
if (result) if (result)
goto out_del_mux; goto out_del_mux;
break;
} }
return 0; return 0;
......
...@@ -125,6 +125,7 @@ struct inv_mpu6050_hw { ...@@ -125,6 +125,7 @@ struct inv_mpu6050_hw {
* @it_timestamp: timestamp from previous interrupt. * @it_timestamp: timestamp from previous interrupt.
* @data_timestamp: timestamp for next data sample. * @data_timestamp: timestamp for next data sample.
* @vddio_supply voltage regulator for the chip. * @vddio_supply voltage regulator for the chip.
* @magn_disabled: magnetometer disabled for backward compatibility reason.
*/ */
struct inv_mpu6050_state { struct inv_mpu6050_state {
struct mutex lock; struct mutex lock;
...@@ -146,6 +147,7 @@ struct inv_mpu6050_state { ...@@ -146,6 +147,7 @@ struct inv_mpu6050_state {
s64 it_timestamp; s64 it_timestamp;
s64 data_timestamp; s64 data_timestamp;
struct regulator *vddio_supply; struct regulator *vddio_supply;
bool magn_disabled;
}; };
/*register and associated bit definition*/ /*register and associated bit definition*/
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment