Merge tag 'iio-fixes-for-5.2a' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23...
[platform/kernel/linux-rpi.git] / drivers / iio / imu / inv_mpu6050 / inv_mpu_core.c
index 6138a6d..c2916d2 100644 (file)
@@ -471,7 +471,10 @@ inv_mpu6050_read_raw(struct iio_dev *indio_dev,
                        return IIO_VAL_INT_PLUS_MICRO;
                case IIO_TEMP:
                        *val = 0;
-                       *val2 = INV_MPU6050_TEMP_SCALE;
+                       if (st->chip_type == INV_ICM20602)
+                               *val2 = INV_ICM20602_TEMP_SCALE;
+                       else
+                               *val2 = INV_MPU6050_TEMP_SCALE;
 
                        return IIO_VAL_INT_PLUS_MICRO;
                default:
@@ -480,7 +483,10 @@ inv_mpu6050_read_raw(struct iio_dev *indio_dev,
        case IIO_CHAN_INFO_OFFSET:
                switch (chan->type) {
                case IIO_TEMP:
-                       *val = INV_MPU6050_TEMP_OFFSET;
+                       if (st->chip_type == INV_ICM20602)
+                               *val = INV_ICM20602_TEMP_OFFSET;
+                       else
+                               *val = INV_MPU6050_TEMP_OFFSET;
 
                        return IIO_VAL_INT;
                default:
@@ -847,6 +853,32 @@ static const struct iio_chan_spec inv_mpu_channels[] = {
        INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Z, INV_MPU6050_SCAN_ACCL_Z),
 };
 
+static const struct iio_chan_spec inv_icm20602_channels[] = {
+       IIO_CHAN_SOFT_TIMESTAMP(INV_ICM20602_SCAN_TIMESTAMP),
+       {
+               .type = IIO_TEMP,
+               .info_mask_separate = BIT(IIO_CHAN_INFO_RAW)
+                               | BIT(IIO_CHAN_INFO_OFFSET)
+                               | BIT(IIO_CHAN_INFO_SCALE),
+               .scan_index = INV_ICM20602_SCAN_TEMP,
+               .scan_type = {
+                               .sign = 's',
+                               .realbits = 16,
+                               .storagebits = 16,
+                               .shift = 0,
+                               .endianness = IIO_BE,
+                            },
+       },
+
+       INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_X, INV_ICM20602_SCAN_GYRO_X),
+       INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Y, INV_ICM20602_SCAN_GYRO_Y),
+       INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Z, INV_ICM20602_SCAN_GYRO_Z),
+
+       INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Y, INV_ICM20602_SCAN_ACCL_Y),
+       INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_X, INV_ICM20602_SCAN_ACCL_X),
+       INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Z, INV_ICM20602_SCAN_ACCL_Z),
+};
+
 /*
  * The user can choose any frequency between INV_MPU6050_MIN_FIFO_RATE and
  * INV_MPU6050_MAX_FIFO_RATE, but only these frequencies are matched by the
@@ -1102,8 +1134,14 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,
                indio_dev->name = name;
        else
                indio_dev->name = dev_name(dev);
-       indio_dev->channels = inv_mpu_channels;
-       indio_dev->num_channels = ARRAY_SIZE(inv_mpu_channels);
+
+       if (chip_type == INV_ICM20602) {
+               indio_dev->channels = inv_icm20602_channels;
+               indio_dev->num_channels = ARRAY_SIZE(inv_icm20602_channels);
+       } else {
+               indio_dev->channels = inv_mpu_channels;
+               indio_dev->num_channels = ARRAY_SIZE(inv_mpu_channels);
+       }
 
        indio_dev->info = &mpu_info;
        indio_dev->modes = INDIO_BUFFER_TRIGGERED;