2023-09-26 20:44:10

by Andreas Kemnade

[permalink] [raw]
Subject: [PATCH v2 0/3] ARM: omap: omap4-embt2ws: Add IMU on control unit

Contrary to the IMU at the head, a bit needs to be set to
make probe of the magnetometer successful.

Changes in V2:

- add types in binding doc
- more description / comments in binding doc
- limit register change to imu9150
- correct node name in device tree (- vs _)

Andreas Kemnade (3):
dt-bindings: iio: imu: mpu6050: Add level shifter
iio: imu: mpu6050: add level shifter flag
ARM: dts: omap: omap4-embt2ws: Add IMU at control unit

.../bindings/iio/imu/invensense,mpu6050.yaml | 5 +++++
.../boot/dts/ti/omap/omap4-epson-embt2ws.dts | 17 ++++++++++++++++-
drivers/iio/imu/inv_mpu6050/inv_mpu_aux.c | 10 ++++++++++
drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 3 +++
drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h | 1 +
5 files changed, 35 insertions(+), 1 deletion(-)

--
2.39.2


2023-09-26 20:49:13

by Andreas Kemnade

[permalink] [raw]
Subject: [PATCH v2 2/3] iio: imu: mpu6050: add level shifter flag

Some boards fail in magnetometer probe if level shifter flag is not set,
definition was found in a 3.0 vendor kernel.

Signed-off-by: Andreas Kemnade <[email protected]>
---
drivers/iio/imu/inv_mpu6050/inv_mpu_aux.c | 10 ++++++++++
drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 3 +++
drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h | 1 +
3 files changed, 14 insertions(+)

diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_aux.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_aux.c
index 7327e5723f961..1d30360f1d482 100644
--- a/drivers/iio/imu/inv_mpu6050/inv_mpu_aux.c
+++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_aux.c
@@ -71,6 +71,16 @@ int inv_mpu_aux_init(const struct inv_mpu6050_state *st)
unsigned int val;
int ret;

+ /* code based on a 3.0 vendor kernel, the exact meaning is unknown */
+ if (st->chip_type == INV_MPU9150) {
+ unsigned int mask = BIT(7);
+
+ val = st->level_shifter ? mask : 0;
+ ret = regmap_update_bits(st->map, 0x1, mask, val);
+ if (ret)
+ return ret;
+ }
+
/* configure i2c master */
val = INV_MPU6050_BITS_I2C_MST_CLK_400KHZ |
INV_MPU6050_BIT_WAIT_FOR_ES;
diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
index 29f906c884bd8..3fbeef1a70186 100644
--- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
+++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
@@ -17,6 +17,7 @@
#include <linux/regulator/consumer.h>
#include <linux/pm.h>
#include <linux/pm_runtime.h>
+#include <linux/property.h>

#include <linux/iio/common/inv_sensors_timestamp.h>
#include <linux/iio/iio.h>
@@ -1495,6 +1496,8 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,
st->irq = irq;
st->map = regmap;

+ st->level_shifter = device_property_read_bool(dev,
+ "invensense,level-shifter");
pdata = dev_get_platdata(dev);
if (!pdata) {
result = iio_read_mount_matrix(dev, &st->orientation);
diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h b/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h
index ed5a96e78df05..7eba1439c8093 100644
--- a/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h
+++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h
@@ -203,6 +203,7 @@ struct inv_mpu6050_state {
s32 magn_raw_to_gauss[3];
struct iio_mount_matrix magn_orient;
unsigned int suspended_sensors;
+ bool level_shifter;
u8 *data;
};

--
2.39.2

2023-09-26 20:50:15

by Andreas Kemnade

[permalink] [raw]
Subject: [PATCH v2 1/3] dt-bindings: iio: imu: mpu6050: Add level shifter

Add a level shifter flag as found in ancient platform data struct:
level_shifter: 0: VLogic, 1: VDD

Signed-off-by: Andreas Kemnade <[email protected]>
---
.../devicetree/bindings/iio/imu/invensense,mpu6050.yaml | 5 +++++
1 file changed, 5 insertions(+)

diff --git a/Documentation/devicetree/bindings/iio/imu/invensense,mpu6050.yaml b/Documentation/devicetree/bindings/iio/imu/invensense,mpu6050.yaml
index 1db6952ddca5e..297b8a1a7ffbc 100644
--- a/Documentation/devicetree/bindings/iio/imu/invensense,mpu6050.yaml
+++ b/Documentation/devicetree/bindings/iio/imu/invensense,mpu6050.yaml
@@ -48,6 +48,11 @@ properties:

mount-matrix: true

+ invensense,level-shifter:
+ type: boolean
+ description: |
+ From ancient platform data struct: false: VLogic, true: VDD
+
i2c-gate:
$ref: /schemas/i2c/i2c-controller.yaml
unevaluatedProperties: false
--
2.39.2

2023-09-26 20:50:47

by Andreas Kemnade

[permalink] [raw]
Subject: [PATCH v2 3/3] ARM: dts: omap: omap4-embt2ws: Add IMU at control unit

Add also the level-shifter flag to avoid probe failure in magnetometer
probe.

Signed-off-by: Andreas Kemnade <[email protected]>
---
.../boot/dts/ti/omap/omap4-epson-embt2ws.dts | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/arch/arm/boot/dts/ti/omap/omap4-epson-embt2ws.dts b/arch/arm/boot/dts/ti/omap/omap4-epson-embt2ws.dts
index cd4f858d846ab..0cc66e158a8d5 100644
--- a/arch/arm/boot/dts/ti/omap/omap4-epson-embt2ws.dts
+++ b/arch/arm/boot/dts/ti/omap/omap4-epson-embt2ws.dts
@@ -391,7 +391,16 @@ tlv320aic3x: codec@18 {
reset-gpios = <&gpio2 23 GPIO_ACTIVE_LOW>;
};

- /* TODO: mpu9150 at control unit, seems to require quirks */
+ mpu9150: imu@68 {
+ compatible = "invensense,mpu9150";
+ reg = <0x68>;
+
+ pinctrl-names = "default";
+ pinctrl-0 = <&mpu9150_pins>;
+ interrupt-parent = <&gpio2>;
+ interrupt = <7 IRQ_TYPE_LEVEL_HIGH>;
+ invensense,level-shifter;
+ };
};

&keypad {
@@ -530,6 +539,12 @@ OMAP4_IOPAD(0x0fc, PIN_INPUT | MUX_MODE0) /* abe_mcbsp2_fsx */
>;
};

+ mpu9150_pins: pinmux_mpu9150-pins {
+ pinctrl-single,pins = <
+ OMAP4_IOPAD(0x5e, PIN_INPUT_PULLUP | MUX_MODE3)
+ >;
+ };
+
mpu9150h_pins: pinmux-mpu9150h-pins {
pinctrl-single,pins = <
OMAP4_IOPAD(0x76, PIN_INPUT_PULLUP | MUX_MODE3)
--
2.39.2

2023-09-27 15:00:19

by Krzysztof Kozlowski

[permalink] [raw]
Subject: Re: [PATCH v2 3/3] ARM: dts: omap: omap4-embt2ws: Add IMU at control unit

On 26/09/2023 22:37, Andreas Kemnade wrote:
> Add also the level-shifter flag to avoid probe failure in magnetometer
> probe.
>
> Signed-off-by: Andreas Kemnade <[email protected]>
> ---
> .../boot/dts/ti/omap/omap4-epson-embt2ws.dts | 17 ++++++++++++++++-
> 1 file changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm/boot/dts/ti/omap/omap4-epson-embt2ws.dts b/arch/arm/boot/dts/ti/omap/omap4-epson-embt2ws.dts
> index cd4f858d846ab..0cc66e158a8d5 100644
> --- a/arch/arm/boot/dts/ti/omap/omap4-epson-embt2ws.dts
> +++ b/arch/arm/boot/dts/ti/omap/omap4-epson-embt2ws.dts
> @@ -391,7 +391,16 @@ tlv320aic3x: codec@18 {
> reset-gpios = <&gpio2 23 GPIO_ACTIVE_LOW>;
> };
>
> - /* TODO: mpu9150 at control unit, seems to require quirks */
> + mpu9150: imu@68 {
> + compatible = "invensense,mpu9150";
> + reg = <0x68>;
> +
> + pinctrl-names = "default";
> + pinctrl-0 = <&mpu9150_pins>;
> + interrupt-parent = <&gpio2>;
> + interrupt = <7 IRQ_TYPE_LEVEL_HIGH>;
> + invensense,level-shifter;
> + };
> };
>
> &keypad {
> @@ -530,6 +539,12 @@ OMAP4_IOPAD(0x0fc, PIN_INPUT | MUX_MODE0) /* abe_mcbsp2_fsx */
> >;
> };
>
> + mpu9150_pins: pinmux_mpu9150-pins {

Not much improved.

Best regards,
Krzysztof

2023-09-27 20:13:49

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH v2 2/3] iio: imu: mpu6050: add level shifter flag

On Tue, Sep 26, 2023 at 11:38 PM Andreas Kemnade <[email protected]> wrote:
>
> Some boards fail in magnetometer probe if level shifter flag is not set,
> definition was found in a 3.0 vendor kernel.

I would rather use the more standard (IIUC the versioning here)
"...in the vendor Linux kernel v3.0." (also note article change).

Same for all cases below.

I believe Jonathan can update this when applying, otherwise the code looks fine,
Reviewed-by: Andy Shevchenko <[email protected]>

--
With Best Regards,
Andy Shevchenko