iio: accel: Add bma150/smb380 support to bma180
authorJonathan Bakker <xc-racer2@live.ca>
Thu, 14 May 2020 20:49:01 +0000 (13:49 -0700)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sat, 16 May 2020 15:06:00 +0000 (16:06 +0100)
The bma150/smb380 are very similar to the bma023 but have a temperature
channel as well.

Signed-off-by: Jonathan Bakker <xc-racer2@live.ca>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/accel/Kconfig
drivers/iio/accel/bma180.c

index 3fe7a74..1080637 100644 (file)
@@ -89,13 +89,13 @@ config ADXL372_I2C
          module will be called adxl372_i2c.
 
 config BMA180
-       tristate "Bosch BMA023/BMA180/BMA25x 3-Axis Accelerometer Driver"
+       tristate "Bosch BMA023/BMA1x0/BMA25x 3-Axis Accelerometer Driver"
        depends on I2C && INPUT_BMA150=n
        select IIO_BUFFER
        select IIO_TRIGGERED_BUFFER
        help
-         Say Y here if you want to build a driver for the Bosch BMA023, BMA180
-         or BMA25x triaxial acceleration sensor.
+         Say Y here if you want to build a driver for the Bosch BMA023, BMA150
+         BMA180, SMB380, or BMA25x triaxial acceleration sensor.
 
          To compile this driver as a module, choose M here: the
          module will be called bma180.
index 23da0a7..265722e 100644 (file)
@@ -7,7 +7,7 @@
  * Support for BMA250 (c) Peter Meerwald <pmeerw@pmeerw.net>
  *
  * SPI is not supported by driver
- * BMA023: 7-bit I2C slave address 0x38
+ * BMA023/BMA150/SMB380: 7-bit I2C slave address 0x38
  * BMA180: 7-bit I2C slave address 0x40 or 0x41
  * BMA250: 7-bit I2C slave address 0x18 or 0x19
  * BMA254: 7-bit I2C slave address 0x18 or 0x19
@@ -35,6 +35,7 @@
 
 enum chip_ids {
        BMA023,
+       BMA150,
        BMA180,
        BMA250,
        BMA254,
@@ -565,8 +566,12 @@ static int bma180_read_raw(struct iio_dev *indio_dev,
                iio_device_release_direct_mode(indio_dev);
                if (ret < 0)
                        return ret;
-               *val = sign_extend32(ret >> chan->scan_type.shift,
-                       chan->scan_type.realbits - 1);
+               if (chan->scan_type.sign == 's') {
+                       *val = sign_extend32(ret >> chan->scan_type.shift,
+                               chan->scan_type.realbits - 1);
+               } else {
+                       *val = ret;
+               }
                return IIO_VAL_INT;
        case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
                *val = data->bw;
@@ -691,6 +696,18 @@ static const struct iio_chan_spec_ext_info bma180_ext_info[] = {
        .ext_info = bma023_ext_info,                                    \
 }
 
+#define BMA150_TEMP_CHANNEL {                                          \
+       .type = IIO_TEMP,                                               \
+       .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |                  \
+               BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_OFFSET),   \
+       .scan_index = TEMP,                                             \
+       .scan_type = {                                                  \
+               .sign = 'u',                                            \
+               .realbits = 8,                                          \
+               .storagebits = 16,                                      \
+       },                                                              \
+}
+
 #define BMA180_ACC_CHANNEL(_axis, _bits) {                             \
        .type = IIO_ACCEL,                                              \
        .modified = 1,                                                  \
@@ -727,6 +744,14 @@ static const struct iio_chan_spec bma023_channels[] = {
        IIO_CHAN_SOFT_TIMESTAMP(4),
 };
 
+static const struct iio_chan_spec bma150_channels[] = {
+       BMA023_ACC_CHANNEL(X, 10),
+       BMA023_ACC_CHANNEL(Y, 10),
+       BMA023_ACC_CHANNEL(Z, 10),
+       BMA150_TEMP_CHANNEL,
+       IIO_CHAN_SOFT_TIMESTAMP(4),
+};
+
 static const struct iio_chan_spec bma180_channels[] = {
        BMA180_ACC_CHANNEL(X, 14),
        BMA180_ACC_CHANNEL(Y, 14),
@@ -781,6 +806,34 @@ static const struct bma180_part_info bma180_part_info[] = {
                .chip_config = bma023_chip_config,
                .chip_disable = bma023_chip_disable,
        },
+       [BMA150] = {
+               .chip_id = BMA023_ID_REG_VAL,
+               .channels = bma150_channels,
+               .num_channels = ARRAY_SIZE(bma150_channels),
+               .scale_table = bma023_scale_table,
+               .num_scales = ARRAY_SIZE(bma023_scale_table),
+               .bw_table = bma023_bw_table,
+               .num_bw = ARRAY_SIZE(bma023_bw_table),
+               .temp_offset = -60, /* 0 LSB @ -30 degree C */
+               .int_reset_reg = BMA023_CTRL_REG0,
+               .int_reset_mask = BMA023_INT_RESET_MASK,
+               .sleep_reg = BMA023_CTRL_REG0,
+               .sleep_mask = BMA023_SLEEP,
+               .bw_reg = BMA023_CTRL_REG2,
+               .bw_mask = BMA023_BW_MASK,
+               .scale_reg = BMA023_CTRL_REG2,
+               .scale_mask = BMA023_RANGE_MASK,
+               /* No power mode on bma150 */
+               .power_reg = 0,
+               .power_mask = 0,
+               .lowpower_val = 0,
+               .int_enable_reg = BMA023_CTRL_REG3,
+               .int_enable_mask = BMA023_NEW_DATA_INT,
+               .softreset_reg = BMA023_CTRL_REG0,
+               .softreset_val = BMA023_RESET_VAL,
+               .chip_config = bma023_chip_config,
+               .chip_disable = bma023_chip_disable,
+       },
        [BMA180] = {
                .chip_id = BMA180_ID_REG_VAL,
                .channels = bma180_channels,
@@ -1105,9 +1158,11 @@ static SIMPLE_DEV_PM_OPS(bma180_pm_ops, bma180_suspend, bma180_resume);
 
 static const struct i2c_device_id bma180_ids[] = {
        { "bma023", BMA023 },
+       { "bma150", BMA150 },
        { "bma180", BMA180 },
        { "bma250", BMA250 },
        { "bma254", BMA254 },
+       { "smb380", BMA150 },
        { }
 };
 
@@ -1119,6 +1174,10 @@ static const struct of_device_id bma180_of_match[] = {
                .data = (void *)BMA023
        },
        {
+               .compatible = "bosch,bma150",
+               .data = (void *)BMA150
+       },
+       {
                .compatible = "bosch,bma180",
                .data = (void *)BMA180
        },
@@ -1130,6 +1189,10 @@ static const struct of_device_id bma180_of_match[] = {
                .compatible = "bosch,bma254",
                .data = (void *)BMA254
        },
+       {
+               .compatible = "bosch,smb380",
+               .data = (void *)BMA150
+       },
        { }
 };
 MODULE_DEVICE_TABLE(of, bma180_of_match);
@@ -1149,5 +1212,5 @@ module_i2c_driver(bma180_driver);
 
 MODULE_AUTHOR("Kravchenko Oleksandr <x0199363@ti.com>");
 MODULE_AUTHOR("Texas Instruments, Inc.");
-MODULE_DESCRIPTION("Bosch BMA023/BMA180/BMA25x triaxial acceleration sensor");
+MODULE_DESCRIPTION("Bosch BMA023/BMA1x0/BMA25x triaxial acceleration sensor");
 MODULE_LICENSE("GPL");