Re: [RFC 5/7] iio: inv_mpu6050: Add support for auxiliary I2C master

From: Peter Rosin
Date: Mon May 02 2016 - 11:32:08 EST


On 2016-04-29 21:02, Crestez Dan Leonard wrote:
> The MPU has an auxiliary I2C bus for connecting external
> sensors. This bus has two operating modes:
> * pass-through, which connects the primary and auxiliary busses
> together. This is already supported via an i2c mux.
> * I2C master mode, where the mpu60x0 acts as a master to any external
> connected sensors. This is implemented by this patch.
>
> This I2C master mode also works when the MPU itself is connected via
> SPI.
>
> I2C master supports up to 5 slaves. Slaves 0-3 have a common operating
> mode while slave 4 is different. This patch implements an i2c adapter
> using slave 4 because it has a cleaner interface and it has an
> interrupt that signals when data from slave to master arrived.
>
> Signed-off-by: Crestez Dan Leonard <leonard.crestez@xxxxxxxxx>
> ---
> .../devicetree/bindings/iio/imu/inv_mpu6050.txt | 61 +++++-
> drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 239 ++++++++++++++++++++-
> drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h | 46 ++++
> drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c | 8 -
> 4 files changed, 341 insertions(+), 13 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt b/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt
> index a9fc11e..aaf12b4 100644
> --- a/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt
> +++ b/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt
> @@ -1,16 +1,27 @@
> InvenSense MPU-6050 Six-Axis (Gyro + Accelerometer) MEMS MotionTracking Device
>
> -http://www.invensense.com/mems/gyro/mpu6050.html
> -
> Required properties:
> - - compatible : should be "invensense,mpu6050"
> - - reg : the I2C address of the sensor
> + - compatible : should be "invensense,mpuXXXX"
> + - reg : the I2C or SPI address of the sensor
> - interrupt-parent : should be the phandle for the interrupt controller
> - interrupts : interrupt mapping for GPIO IRQ
>
> Optional properties:
> - mount-matrix: an optional 3x3 mounting rotation matrix
> + - inv,i2c-aux-master: operate aux i2c in "master mode" (default is mux).

I've looked a bit more into this, and I don't think you need
this property...

> +
> +Valid compatible strings:
> + - mpu6000
> + - mpu6050
> + - mpu6500
> + - mpu9150
> +
> +It is possible to attach auxiliary sensors to the MPU and have them be handled
> +by linux. Those auxiliary sensors are described as an i2c bus.
> +
> +Devices connected in "bypass" mode must be listed behind i2c@0 with the address 0
>
> +Devices connected in "master" mode must be listed behind i2c@1 with the address 1

...and just condition the new stuff on the name i2c-master
instead. If there is no i2c-master child, then fall back
to the mux code. Does that work?

> Example:
> mpu6050@68 {
> @@ -28,3 +39,45 @@ Example:
> "0", /* y2 */
> "0.984807753012208"; /* z2 */
> };
> +
> +Example describing mpu9150 (which includes an ak9875 on chip):
> + mpu9150@68 {
> + compatible = "invensense,mpu9150";
> + reg = <0x68>;
> + interrupt-parent = <&gpio1>;
> + interrupts = <18 1>;
> +
> + #address-cells = <1>;
> + #size-cells = <0>;
> + i2c@0 {
> + reg = <0>;
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + ak8975@0c {
> + compatible = "ak,ak8975";
> + reg = <0x0c>;
> + };
> + };
> + };
> +
> +Example describing a mpu6500 via SPI with an hmc5883l on auxiliary i2c:
> + mpu6500@0 {
> + compatible = "inv,mpu6500";
> + reg = <0x0>;
> + spi-max-frequency = <1000000>;
> + interrupt-parent = <&gpio1>;
> + interrupts = <31 1>;
> +
> + inv,i2c-aux-master

If you keep the below as i2c@1, including the @, I think you also need
#address-cells = <1>;
#size-cells = <0>;

As always, I'm not a device tree expert, but I'd be glad to lose
these extra lines and change i2c@1 into i2c-master.

> + i2c@1 {
> + reg = <1>;
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + hmc5883l@1e {
> + compatible = "honeywell,hmc5883l";
> + reg = <0x1e>;
> + };
> + };
> + };

*snip*

Cheers,
Peter