2023-04-21 07:17:13

by Hermes Zhang

[permalink] [raw]
Subject: [PATCH 0/2] Add support for the ICM 20600 IMU

The Invensense ICM-20600 is a 6-axis MotionTracking device that combines a
3-axis gyroscope and an 3-axis accelerometer. It is very similar to the
ICM20602 imu which is already supported by the mpu6050 driver. The main
difference is that the ICM-20600 has a different WHOAMI value.

Hermes Zhang (2):
iio: imu: mpu6050: Add support for the ICM 20600 IMU
dt-bindings: iio: imu: mpu6050: Add icm20600 bindings to mpu6050

.../bindings/iio/imu/invensense,mpu6050.yaml | 1 +
drivers/iio/imu/inv_mpu6050/Kconfig | 4 ++--
drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 10 ++++++++++
drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c | 6 ++++++
drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h | 2 ++
drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c | 5 +++++
6 files changed, 26 insertions(+), 2 deletions(-)

--
2.30.2


2023-04-21 07:18:51

by Hermes Zhang

[permalink] [raw]
Subject: [PATCH 1/2] iio: imu: mpu6050: Add support for the ICM 20600 IMU

The Invensense ICM-20600 is a 6-axis MotionTracking device that combines a
3-axis gyroscope and an 3-axis accelerometer. It is very similar to the
ICM20602 imu which is already supported by the mpu6050 driver. The main
difference is that the ICM-20600 has a different WHOAMI value.

Signed-off-by: Hermes Zhang <[email protected]>
---
drivers/iio/imu/inv_mpu6050/Kconfig | 4 ++--
drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 10 ++++++++++
drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c | 6 ++++++
drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h | 2 ++
drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c | 5 +++++
5 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/drivers/iio/imu/inv_mpu6050/Kconfig b/drivers/iio/imu/inv_mpu6050/Kconfig
index 3636b1bc90f1..64dd73dcc4ba 100644
--- a/drivers/iio/imu/inv_mpu6050/Kconfig
+++ b/drivers/iio/imu/inv_mpu6050/Kconfig
@@ -16,7 +16,7 @@ config INV_MPU6050_I2C
select REGMAP_I2C
help
This driver supports the Invensense MPU6050/9150,
- MPU6500/6515/6880/9250/9255, ICM20608(D)/20609/20689, ICM20602/ICM20690
+ MPU6500/6515/6880/9250/9255, ICM20608(D)/20609/20689, ICM20600/20602/20690
and IAM20680 motion tracking devices over I2C.
This driver can be built as a module. The module will be called
inv-mpu6050-i2c.
@@ -28,7 +28,7 @@ config INV_MPU6050_SPI
select REGMAP_SPI
help
This driver supports the Invensense MPU6000,
- MPU6500/6515/6880/9250/9255, ICM20608(D)/20609/20689, ICM20602/ICM20690
+ MPU6500/6515/6880/9250/9255, ICM20608(D)/20609/20689, ICM20600/20602/20690
and IAM20680 motion tracking devices over SPI.
This driver can be built as a module. The module will be called
inv-mpu6050-spi.
diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
index 8a129120b73d..592a6e60b413 100644
--- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
+++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
@@ -244,6 +244,15 @@ static const struct inv_mpu6050_hw hw_info[] = {
.temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE},
.startup_time = {INV_MPU6500_GYRO_STARTUP_TIME, INV_MPU6500_ACCEL_STARTUP_TIME},
},
+ {
+ .whoami = INV_ICM20600_WHOAMI_VALUE,
+ .name = "ICM20600",
+ .reg = &reg_set_icm20602,
+ .config = &chip_config_6500,
+ .fifo_size = 1008,
+ .temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE},
+ .startup_time = {INV_ICM20602_GYRO_STARTUP_TIME, INV_ICM20602_ACCEL_STARTUP_TIME},
+ },
{
.whoami = INV_ICM20602_WHOAMI_VALUE,
.name = "ICM20602",
@@ -1597,6 +1606,7 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,
indio_dev->num_channels = ARRAY_SIZE(inv_mpu9250_channels);
indio_dev->available_scan_masks = inv_mpu9x50_scan_masks;
break;
+ case INV_ICM20600:
case INV_ICM20602:
indio_dev->channels = inv_mpu_channels;
indio_dev->num_channels = ARRAY_SIZE(inv_mpu_channels);
diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c
index 2f2da4cb7321..0e39877678df 100644
--- a/drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c
+++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c
@@ -32,6 +32,7 @@ static bool inv_mpu_i2c_aux_bus(struct device *dev)
case INV_ICM20608D:
case INV_ICM20609:
case INV_ICM20689:
+ case INV_ICM20600:
case INV_ICM20602:
case INV_IAM20680:
/* no i2c auxiliary bus on the chip */
@@ -183,6 +184,7 @@ static const struct i2c_device_id inv_mpu_id[] = {
{"icm20608d", INV_ICM20608D},
{"icm20609", INV_ICM20609},
{"icm20689", INV_ICM20689},
+ {"icm20600", INV_ICM20600},
{"icm20602", INV_ICM20602},
{"icm20690", INV_ICM20690},
{"iam20680", INV_IAM20680},
@@ -236,6 +238,10 @@ static const struct of_device_id inv_of_match[] = {
.compatible = "invensense,icm20689",
.data = (void *)INV_ICM20689
},
+ {
+ .compatible = "invensense,icm20600",
+ .data = (void *)INV_ICM20600
+ },
{
.compatible = "invensense,icm20602",
.data = (void *)INV_ICM20602
diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h b/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h
index 94b54c501ec0..b4ab2c397d0f 100644
--- a/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h
+++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h
@@ -79,6 +79,7 @@ enum inv_devices {
INV_ICM20608D,
INV_ICM20609,
INV_ICM20689,
+ INV_ICM20600,
INV_ICM20602,
INV_ICM20690,
INV_IAM20680,
@@ -398,6 +399,7 @@ struct inv_mpu6050_state {
#define INV_ICM20608D_WHOAMI_VALUE 0xAE
#define INV_ICM20609_WHOAMI_VALUE 0xA6
#define INV_ICM20689_WHOAMI_VALUE 0x98
+#define INV_ICM20600_WHOAMI_VALUE 0x11
#define INV_ICM20602_WHOAMI_VALUE 0x12
#define INV_ICM20690_WHOAMI_VALUE 0x20
#define INV_IAM20680_WHOAMI_VALUE 0xA9
diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c
index 89f46c2f213d..05451ca1580b 100644
--- a/drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c
+++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c
@@ -76,6 +76,7 @@ static const struct spi_device_id inv_mpu_id[] = {
{"icm20608d", INV_ICM20608D},
{"icm20609", INV_ICM20609},
{"icm20689", INV_ICM20689},
+ {"icm20600", INV_ICM20600},
{"icm20602", INV_ICM20602},
{"icm20690", INV_ICM20690},
{"iam20680", INV_IAM20680},
@@ -125,6 +126,10 @@ static const struct of_device_id inv_of_match[] = {
.compatible = "invensense,icm20689",
.data = (void *)INV_ICM20689
},
+ {
+ .compatible = "invensense,icm20600",
+ .data = (void *)INV_ICM20600
+ },
{
.compatible = "invensense,icm20602",
.data = (void *)INV_ICM20602
--
2.30.2

2023-04-21 07:19:07

by Hermes Zhang

[permalink] [raw]
Subject: [PATCH 2/2] dt-bindings: iio: imu: mpu6050: Add icm20600 bindings to mpu6050

Adding the invensense ICM-20600 to the compatible list of the mpu6050
driver

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

diff --git a/Documentation/devicetree/bindings/iio/imu/invensense,mpu6050.yaml b/Documentation/devicetree/bindings/iio/imu/invensense,mpu6050.yaml
index ec64d7877fe5..67711bc0ee6c 100644
--- a/Documentation/devicetree/bindings/iio/imu/invensense,mpu6050.yaml
+++ b/Documentation/devicetree/bindings/iio/imu/invensense,mpu6050.yaml
@@ -20,6 +20,7 @@ properties:
- invensense,icm20608
- invensense,icm20609
- invensense,icm20689
+ - invensense,icm20600
- invensense,icm20602
- invensense,icm20690
- invensense,mpu6000
--
2.30.2

2023-04-21 08:30:33

by Krzysztof Kozlowski

[permalink] [raw]
Subject: Re: [PATCH 2/2] dt-bindings: iio: imu: mpu6050: Add icm20600 bindings to mpu6050

On 21/04/2023 09:16, Hermes Zhang wrote:
> Adding the invensense ICM-20600 to the compatible list of the mpu6050
> driver
>
> Signed-off-by: Hermes Zhang <[email protected]>
> ---
> .../devicetree/bindings/iio/imu/invensense,mpu6050.yaml | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/Documentation/devicetree/bindings/iio/imu/invensense,mpu6050.yaml b/Documentation/devicetree/bindings/iio/imu/invensense,mpu6050.yaml
> index ec64d7877fe5..67711bc0ee6c 100644
> --- a/Documentation/devicetree/bindings/iio/imu/invensense,mpu6050.yaml
> +++ b/Documentation/devicetree/bindings/iio/imu/invensense,mpu6050.yaml
> @@ -20,6 +20,7 @@ properties:
> - invensense,icm20608
> - invensense,icm20609
> - invensense,icm20689
> + - invensense,icm20600
> - invensense,icm20602

Didn't we start switching to compatible groups of devices? This looks
compatible with 20602.

Best regards,
Krzysztof

2023-04-22 14:52:07

by Hermes Zhang

[permalink] [raw]
Subject: Re: [PATCH 2/2] dt-bindings: iio: imu: mpu6050: Add icm20600 bindings to mpu6050


在 2023/4/21 16:23, Krzysztof Kozlowski 写道:
> Didn't we start switching to compatible groups of devices? This looks
> compatible with 20602.

Hi Krzysztof,

Sorry, I may not aware of this. Could you give some more info about the
compatible groups? Yes, the icm20602 is quite similar as icm20600.

Thanks & Best Regards,

Hermes

2023-04-22 17:05:20

by Jonathan Cameron

[permalink] [raw]
Subject: Re: [PATCH 2/2] dt-bindings: iio: imu: mpu6050: Add icm20600 bindings to mpu6050

On Sat, 22 Apr 2023 14:14:49 +0800
Hermes Zhang <[email protected]> wrote:

> 在 2023/4/21 16:23, Krzysztof Kozlowski 写道:
> > Didn't we start switching to compatible groups of devices? This looks
> > compatible with 20602.
>
> Hi Krzysztof,
>
> Sorry, I may not aware of this. Could you give some more info about the
> compatible groups? Yes, the icm20602 is quite similar as icm20600.

If it's compatible enough that a device tree that lists
compatible = "invensense,icm20600", "invensense,icm20602"
would work correctly with an old kernel by first checking for invensense,icm20600
then falling back to invense,icm20602 then it should be listed with that fallback.

See the existing block that covers the fallback form icm20608d to icm20608


- items:
- const: invensense,icm20608d
- const: invensense,icm20608

Note it is fine if the driver 'warns' that it's found a WHOAMI value it doesn't
know as long as it then goes on and works correctly. Thus there can't be
any incompatibilities between the two parts when we consider the functionality the
driver implements today. If we add features in future that aren't compatible, that's
fine because we will be matching against the more specific compatible you are
adding here.

Jonathan



>
> Thanks & Best Regards,
>
> Hermes
>

2023-04-22 17:21:06

by Jonathan Cameron

[permalink] [raw]
Subject: Re: [PATCH 1/2] iio: imu: mpu6050: Add support for the ICM 20600 IMU

On Fri, 21 Apr 2023 15:16:29 +0800
Hermes Zhang <[email protected]> wrote:

> The Invensense ICM-20600 is a 6-axis MotionTracking device that combines a
> 3-axis gyroscope and an 3-axis accelerometer. It is very similar to the
> ICM20602 imu which is already supported by the mpu6050 driver. The main
> difference is that the ICM-20600 has a different WHOAMI value.
>
> Signed-off-by: Hermes Zhang <[email protected]>
FWIW the driver changes look good to me and the binding discussion
will have no impact on this patch.

Thanks,

Jonathan


> ---
> drivers/iio/imu/inv_mpu6050/Kconfig | 4 ++--
> drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 10 ++++++++++
> drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c | 6 ++++++
> drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h | 2 ++
> drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c | 5 +++++
> 5 files changed, 25 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/iio/imu/inv_mpu6050/Kconfig b/drivers/iio/imu/inv_mpu6050/Kconfig
> index 3636b1bc90f1..64dd73dcc4ba 100644
> --- a/drivers/iio/imu/inv_mpu6050/Kconfig
> +++ b/drivers/iio/imu/inv_mpu6050/Kconfig
> @@ -16,7 +16,7 @@ config INV_MPU6050_I2C
> select REGMAP_I2C
> help
> This driver supports the Invensense MPU6050/9150,
> - MPU6500/6515/6880/9250/9255, ICM20608(D)/20609/20689, ICM20602/ICM20690
> + MPU6500/6515/6880/9250/9255, ICM20608(D)/20609/20689, ICM20600/20602/20690
> and IAM20680 motion tracking devices over I2C.
> This driver can be built as a module. The module will be called
> inv-mpu6050-i2c.
> @@ -28,7 +28,7 @@ config INV_MPU6050_SPI
> select REGMAP_SPI
> help
> This driver supports the Invensense MPU6000,
> - MPU6500/6515/6880/9250/9255, ICM20608(D)/20609/20689, ICM20602/ICM20690
> + MPU6500/6515/6880/9250/9255, ICM20608(D)/20609/20689, ICM20600/20602/20690
> and IAM20680 motion tracking devices over SPI.
> This driver can be built as a module. The module will be called
> inv-mpu6050-spi.
> diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
> index 8a129120b73d..592a6e60b413 100644
> --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
> +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
> @@ -244,6 +244,15 @@ static const struct inv_mpu6050_hw hw_info[] = {
> .temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE},
> .startup_time = {INV_MPU6500_GYRO_STARTUP_TIME, INV_MPU6500_ACCEL_STARTUP_TIME},
> },
> + {
> + .whoami = INV_ICM20600_WHOAMI_VALUE,
> + .name = "ICM20600",
> + .reg = &reg_set_icm20602,
> + .config = &chip_config_6500,
> + .fifo_size = 1008,
> + .temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE},
> + .startup_time = {INV_ICM20602_GYRO_STARTUP_TIME, INV_ICM20602_ACCEL_STARTUP_TIME},
> + },
> {
> .whoami = INV_ICM20602_WHOAMI_VALUE,
> .name = "ICM20602",
> @@ -1597,6 +1606,7 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,
> indio_dev->num_channels = ARRAY_SIZE(inv_mpu9250_channels);
> indio_dev->available_scan_masks = inv_mpu9x50_scan_masks;
> break;
> + case INV_ICM20600:
> case INV_ICM20602:
> indio_dev->channels = inv_mpu_channels;
> indio_dev->num_channels = ARRAY_SIZE(inv_mpu_channels);
> diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c
> index 2f2da4cb7321..0e39877678df 100644
> --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c
> +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c
> @@ -32,6 +32,7 @@ static bool inv_mpu_i2c_aux_bus(struct device *dev)
> case INV_ICM20608D:
> case INV_ICM20609:
> case INV_ICM20689:
> + case INV_ICM20600:
> case INV_ICM20602:
> case INV_IAM20680:
> /* no i2c auxiliary bus on the chip */
> @@ -183,6 +184,7 @@ static const struct i2c_device_id inv_mpu_id[] = {
> {"icm20608d", INV_ICM20608D},
> {"icm20609", INV_ICM20609},
> {"icm20689", INV_ICM20689},
> + {"icm20600", INV_ICM20600},
> {"icm20602", INV_ICM20602},
> {"icm20690", INV_ICM20690},
> {"iam20680", INV_IAM20680},
> @@ -236,6 +238,10 @@ static const struct of_device_id inv_of_match[] = {
> .compatible = "invensense,icm20689",
> .data = (void *)INV_ICM20689
> },
> + {
> + .compatible = "invensense,icm20600",
> + .data = (void *)INV_ICM20600
> + },
> {
> .compatible = "invensense,icm20602",
> .data = (void *)INV_ICM20602
> diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h b/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h
> index 94b54c501ec0..b4ab2c397d0f 100644
> --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h
> +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h
> @@ -79,6 +79,7 @@ enum inv_devices {
> INV_ICM20608D,
> INV_ICM20609,
> INV_ICM20689,
> + INV_ICM20600,
> INV_ICM20602,
> INV_ICM20690,
> INV_IAM20680,
> @@ -398,6 +399,7 @@ struct inv_mpu6050_state {
> #define INV_ICM20608D_WHOAMI_VALUE 0xAE
> #define INV_ICM20609_WHOAMI_VALUE 0xA6
> #define INV_ICM20689_WHOAMI_VALUE 0x98
> +#define INV_ICM20600_WHOAMI_VALUE 0x11
> #define INV_ICM20602_WHOAMI_VALUE 0x12
> #define INV_ICM20690_WHOAMI_VALUE 0x20
> #define INV_IAM20680_WHOAMI_VALUE 0xA9
> diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c
> index 89f46c2f213d..05451ca1580b 100644
> --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c
> +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c
> @@ -76,6 +76,7 @@ static const struct spi_device_id inv_mpu_id[] = {
> {"icm20608d", INV_ICM20608D},
> {"icm20609", INV_ICM20609},
> {"icm20689", INV_ICM20689},
> + {"icm20600", INV_ICM20600},
> {"icm20602", INV_ICM20602},
> {"icm20690", INV_ICM20690},
> {"iam20680", INV_IAM20680},
> @@ -125,6 +126,10 @@ static const struct of_device_id inv_of_match[] = {
> .compatible = "invensense,icm20689",
> .data = (void *)INV_ICM20689
> },
> + {
> + .compatible = "invensense,icm20600",
> + .data = (void *)INV_ICM20600
> + },
> {
> .compatible = "invensense,icm20602",
> .data = (void *)INV_ICM20602