iio: imu: bmi160: add support for bmi120
authorDanila Tikhonov <danila@jiaxyga.com>
Sun, 5 May 2024 05:36:54 +0000 (07:36 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 27 May 2024 08:48:56 +0000 (09:48 +0100)
Add support for bmi120 low power variant of bmi160.
Relax failure to match ID to a warning rather than probe fail.
This allows for fallback compatibles, whilst retaining a useful
debugging message if they turn out not to be so compatible due to
badly behaved firmware.

Signed-off-by: Danila Tikhonov <danila@jiaxyga.com>
Co-developed-by: Barnabás Czémán <trabarni@gmail.com>
Signed-off-by: Barnabás Czémán <trabarni@gmail.com>
Link: https://lore.kernel.org/r/20240505-bmi120-v3-1-15cee3d0b2ef@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/imu/bmi160/bmi160_core.c
drivers/iio/imu/bmi160/bmi160_i2c.c
drivers/iio/imu/bmi160/bmi160_spi.c

index a77f1a8348ffcb49ed7adf18114d3e923fe0d7ae..90aa04d94da5425a14b5e415e6545c8281a97712 100644 (file)
@@ -26,6 +26,7 @@
 #include "bmi160.h"
 
 #define BMI160_REG_CHIP_ID     0x00
+#define BMI120_CHIP_ID_VAL     0xD3
 #define BMI160_CHIP_ID_VAL     0xD1
 
 #define BMI160_REG_PMU_STATUS  0x03
        .ext_info = bmi160_ext_info,                            \
 }
 
+static const u8 bmi_chip_ids[] = {
+       BMI120_CHIP_ID_VAL,
+       BMI160_CHIP_ID_VAL,
+};
+
 /* scan indexes follow DATA register order */
 enum bmi160_scan_axis {
        BMI160_SCAN_EXT_MAGN_X = 0,
@@ -704,6 +710,16 @@ static int bmi160_setup_irq(struct iio_dev *indio_dev, int irq,
        return bmi160_probe_trigger(indio_dev, irq, irq_type);
 }
 
+static int bmi160_check_chip_id(const u8 chip_id)
+{
+       for (int i = 0; i < ARRAY_SIZE(bmi_chip_ids); i++) {
+               if (chip_id == bmi_chip_ids[i])
+                       return 0;
+       }
+
+       return -ENODEV;
+}
+
 static int bmi160_chip_init(struct bmi160_data *data, bool use_spi)
 {
        int ret;
@@ -737,12 +753,10 @@ static int bmi160_chip_init(struct bmi160_data *data, bool use_spi)
                dev_err(dev, "Error reading chip id\n");
                goto disable_regulator;
        }
-       if (val != BMI160_CHIP_ID_VAL) {
-               dev_err(dev, "Wrong chip id, got %x expected %x\n",
-                       val, BMI160_CHIP_ID_VAL);
-               ret = -ENODEV;
-               goto disable_regulator;
-       }
+
+       ret = bmi160_check_chip_id(val);
+       if (ret)
+               dev_warn(dev, "Chip id not found: %x\n", val);
 
        ret = bmi160_set_mode(data, BMI160_ACCEL, true);
        if (ret)
index a081305254dbb5109d0700a9e6f3f3e9b338f048..d0ec5301ad9a71d62c41f908c54380ab8b71e86b 100644 (file)
@@ -37,6 +37,7 @@ static int bmi160_i2c_probe(struct i2c_client *client)
 }
 
 static const struct i2c_device_id bmi160_i2c_id[] = {
+       {"bmi120", 0},
        {"bmi160", 0},
        {}
 };
@@ -52,12 +53,14 @@ static const struct acpi_device_id bmi160_acpi_match[] = {
         * the affected devices are from 2021/2022.
         */
        {"10EC5280", 0},
+       {"BMI0120", 0},
        {"BMI0160", 0},
        { },
 };
 MODULE_DEVICE_TABLE(acpi, bmi160_acpi_match);
 
 static const struct of_device_id bmi160_of_match[] = {
+       { .compatible = "bosch,bmi120" },
        { .compatible = "bosch,bmi160" },
        { },
 };
index 8b573ea99af235591e229c53ccae0933fbe1fb92..9f40500132f7bec45b2fcf7bdd49604c5e9f2f49 100644 (file)
@@ -34,18 +34,21 @@ static int bmi160_spi_probe(struct spi_device *spi)
 }
 
 static const struct spi_device_id bmi160_spi_id[] = {
+       {"bmi120", 0},
        {"bmi160", 0},
        {}
 };
 MODULE_DEVICE_TABLE(spi, bmi160_spi_id);
 
 static const struct acpi_device_id bmi160_acpi_match[] = {
+       {"BMI0120", 0},
        {"BMI0160", 0},
        { },
 };
 MODULE_DEVICE_TABLE(acpi, bmi160_acpi_match);
 
 static const struct of_device_id bmi160_of_match[] = {
+       { .compatible = "bosch,bmi120" },
        { .compatible = "bosch,bmi160" },
        { },
 };