diff options
| author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2019-05-20 03:15:14 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2019-05-20 03:15:14 -0400 |
| commit | 083a685c2ee035dd6c47242ea2de6d9eed3bf929 (patch) | |
| tree | b50c0e89fa21c9bb3a23e1afa31c257d819117b6 | |
| parent | a188339ca5a396acc588e5851ed7e19f66b0ebd9 (diff) | |
| parent | e6d12298310fa1dc11f1d747e05b168016057fdd (diff) | |
Merge tag 'iio-fixes-for-5.2a' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-linus:
Jonathan writes:
First set of IIO fixes for the 5.2 cycle.
* ads124
- Avoid a buffer overrun when setting an array to 0.
* ads8688
- Don't use the pollfunc timestamp as it isn't set and would be wrong
anyway for a device that does sampling on demand.
* ds4422
- Fix masking on register used for chip verification. Wrong address
was being read.
* mpu6050
- Fix the fifo layout for ICM20602 to avoid underreading and hence failure
to move on to the next record in the fifo.
* NPCM ADC
- Make sure there is actually a valid regulator before reading its voltage.
* tag 'iio-fixes-for-5.2a' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio:
iio: adc: ti-ads8688: fix timestamp is not updated in buffer
iio: dac: ds4422/ds4424 fix chip verification
iio: imu: mpu6050: Fix FIFO layout for ICM20602
iio: adc: ads124: avoid buffer overflow
iio: adc: modify NPCM ADC read reference voltage
| -rw-r--r-- | drivers/iio/adc/npcm_adc.c | 2 | ||||
| -rw-r--r-- | drivers/iio/adc/ti-ads124s08.c | 2 | ||||
| -rw-r--r-- | drivers/iio/adc/ti-ads8688.c | 2 | ||||
| -rw-r--r-- | drivers/iio/dac/ds4424.c | 2 | ||||
| -rw-r--r-- | drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 46 | ||||
| -rw-r--r-- | drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h | 20 | ||||
| -rw-r--r-- | drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c | 3 |
7 files changed, 68 insertions, 9 deletions
diff --git a/drivers/iio/adc/npcm_adc.c b/drivers/iio/adc/npcm_adc.c index 9e25bbec9c70..193b3b81de4d 100644 --- a/drivers/iio/adc/npcm_adc.c +++ b/drivers/iio/adc/npcm_adc.c | |||
| @@ -149,7 +149,7 @@ static int npcm_adc_read_raw(struct iio_dev *indio_dev, | |||
| 149 | } | 149 | } |
| 150 | return IIO_VAL_INT; | 150 | return IIO_VAL_INT; |
| 151 | case IIO_CHAN_INFO_SCALE: | 151 | case IIO_CHAN_INFO_SCALE: |
| 152 | if (info->vref) { | 152 | if (!IS_ERR(info->vref)) { |
| 153 | vref_uv = regulator_get_voltage(info->vref); | 153 | vref_uv = regulator_get_voltage(info->vref); |
| 154 | *val = vref_uv / 1000; | 154 | *val = vref_uv / 1000; |
| 155 | } else { | 155 | } else { |
diff --git a/drivers/iio/adc/ti-ads124s08.c b/drivers/iio/adc/ti-ads124s08.c index 53f17e4f2f23..552c2be8d87a 100644 --- a/drivers/iio/adc/ti-ads124s08.c +++ b/drivers/iio/adc/ti-ads124s08.c | |||
| @@ -202,7 +202,7 @@ static int ads124s_read(struct iio_dev *indio_dev, unsigned int chan) | |||
| 202 | }; | 202 | }; |
| 203 | 203 | ||
| 204 | priv->data[0] = ADS124S08_CMD_RDATA; | 204 | priv->data[0] = ADS124S08_CMD_RDATA; |
| 205 | memset(&priv->data[1], ADS124S08_CMD_NOP, sizeof(priv->data)); | 205 | memset(&priv->data[1], ADS124S08_CMD_NOP, sizeof(priv->data) - 1); |
| 206 | 206 | ||
| 207 | ret = spi_sync_transfer(priv->spi, t, ARRAY_SIZE(t)); | 207 | ret = spi_sync_transfer(priv->spi, t, ARRAY_SIZE(t)); |
| 208 | if (ret < 0) | 208 | if (ret < 0) |
diff --git a/drivers/iio/adc/ti-ads8688.c b/drivers/iio/adc/ti-ads8688.c index f9461070a74a..8cb7a2034982 100644 --- a/drivers/iio/adc/ti-ads8688.c +++ b/drivers/iio/adc/ti-ads8688.c | |||
| @@ -397,7 +397,7 @@ static irqreturn_t ads8688_trigger_handler(int irq, void *p) | |||
| 397 | } | 397 | } |
| 398 | 398 | ||
| 399 | iio_push_to_buffers_with_timestamp(indio_dev, buffer, | 399 | iio_push_to_buffers_with_timestamp(indio_dev, buffer, |
| 400 | pf->timestamp); | 400 | iio_get_time_ns(indio_dev)); |
| 401 | 401 | ||
| 402 | iio_trigger_notify_done(indio_dev->trig); | 402 | iio_trigger_notify_done(indio_dev->trig); |
| 403 | 403 | ||
diff --git a/drivers/iio/dac/ds4424.c b/drivers/iio/dac/ds4424.c index 883a47562055..714a97f91319 100644 --- a/drivers/iio/dac/ds4424.c +++ b/drivers/iio/dac/ds4424.c | |||
| @@ -166,7 +166,7 @@ static int ds4424_verify_chip(struct iio_dev *indio_dev) | |||
| 166 | { | 166 | { |
| 167 | int ret, val; | 167 | int ret, val; |
| 168 | 168 | ||
| 169 | ret = ds4424_get_value(indio_dev, &val, DS4424_DAC_ADDR(0)); | 169 | ret = ds4424_get_value(indio_dev, &val, 0); |
| 170 | if (ret < 0) | 170 | if (ret < 0) |
| 171 | dev_err(&indio_dev->dev, | 171 | dev_err(&indio_dev->dev, |
| 172 | "%s failed. ret: %d\n", __func__, ret); | 172 | "%s failed. ret: %d\n", __func__, ret); |
diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c index 6138a6d86afb..c2916d2d552c 100644 --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | |||
| @@ -471,7 +471,10 @@ inv_mpu6050_read_raw(struct iio_dev *indio_dev, | |||
| 471 | return IIO_VAL_INT_PLUS_MICRO; | 471 | return IIO_VAL_INT_PLUS_MICRO; |
| 472 | case IIO_TEMP: | 472 | case IIO_TEMP: |
| 473 | *val = 0; | 473 | *val = 0; |
| 474 | *val2 = INV_MPU6050_TEMP_SCALE; | 474 | if (st->chip_type == INV_ICM20602) |
| 475 | *val2 = INV_ICM20602_TEMP_SCALE; | ||
| 476 | else | ||
| 477 | *val2 = INV_MPU6050_TEMP_SCALE; | ||
| 475 | 478 | ||
| 476 | return IIO_VAL_INT_PLUS_MICRO; | 479 | return IIO_VAL_INT_PLUS_MICRO; |
| 477 | default: | 480 | default: |
| @@ -480,7 +483,10 @@ inv_mpu6050_read_raw(struct iio_dev *indio_dev, | |||
| 480 | case IIO_CHAN_INFO_OFFSET: | 483 | case IIO_CHAN_INFO_OFFSET: |
| 481 | switch (chan->type) { | 484 | switch (chan->type) { |
| 482 | case IIO_TEMP: | 485 | case IIO_TEMP: |
| 483 | *val = INV_MPU6050_TEMP_OFFSET; | 486 | if (st->chip_type == INV_ICM20602) |
| 487 | *val = INV_ICM20602_TEMP_OFFSET; | ||
| 488 | else | ||
| 489 | *val = INV_MPU6050_TEMP_OFFSET; | ||
| 484 | 490 | ||
| 485 | return IIO_VAL_INT; | 491 | return IIO_VAL_INT; |
| 486 | default: | 492 | default: |
| @@ -847,6 +853,32 @@ static const struct iio_chan_spec inv_mpu_channels[] = { | |||
| 847 | INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Z, INV_MPU6050_SCAN_ACCL_Z), | 853 | INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Z, INV_MPU6050_SCAN_ACCL_Z), |
| 848 | }; | 854 | }; |
| 849 | 855 | ||
| 856 | static const struct iio_chan_spec inv_icm20602_channels[] = { | ||
| 857 | IIO_CHAN_SOFT_TIMESTAMP(INV_ICM20602_SCAN_TIMESTAMP), | ||
| 858 | { | ||
| 859 | .type = IIO_TEMP, | ||
| 860 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | ||
| 861 | | BIT(IIO_CHAN_INFO_OFFSET) | ||
| 862 | | BIT(IIO_CHAN_INFO_SCALE), | ||
| 863 | .scan_index = INV_ICM20602_SCAN_TEMP, | ||
| 864 | .scan_type = { | ||
| 865 | .sign = 's', | ||
| 866 | .realbits = 16, | ||
| 867 | .storagebits = 16, | ||
| 868 | .shift = 0, | ||
| 869 | .endianness = IIO_BE, | ||
| 870 | }, | ||
| 871 | }, | ||
| 872 | |||
| 873 | INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_X, INV_ICM20602_SCAN_GYRO_X), | ||
| 874 | INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Y, INV_ICM20602_SCAN_GYRO_Y), | ||
| 875 | INV_MPU6050_CHAN(IIO_ANGL_VEL, IIO_MOD_Z, INV_ICM20602_SCAN_GYRO_Z), | ||
| 876 | |||
| 877 | INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Y, INV_ICM20602_SCAN_ACCL_Y), | ||
| 878 | INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_X, INV_ICM20602_SCAN_ACCL_X), | ||
| 879 | INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Z, INV_ICM20602_SCAN_ACCL_Z), | ||
| 880 | }; | ||
| 881 | |||
| 850 | /* | 882 | /* |
| 851 | * The user can choose any frequency between INV_MPU6050_MIN_FIFO_RATE and | 883 | * The user can choose any frequency between INV_MPU6050_MIN_FIFO_RATE and |
| 852 | * INV_MPU6050_MAX_FIFO_RATE, but only these frequencies are matched by the | 884 | * 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, | |||
| 1102 | indio_dev->name = name; | 1134 | indio_dev->name = name; |
| 1103 | else | 1135 | else |
| 1104 | indio_dev->name = dev_name(dev); | 1136 | indio_dev->name = dev_name(dev); |
| 1105 | indio_dev->channels = inv_mpu_channels; | 1137 | |
| 1106 | indio_dev->num_channels = ARRAY_SIZE(inv_mpu_channels); | 1138 | if (chip_type == INV_ICM20602) { |
| 1139 | indio_dev->channels = inv_icm20602_channels; | ||
| 1140 | indio_dev->num_channels = ARRAY_SIZE(inv_icm20602_channels); | ||
| 1141 | } else { | ||
| 1142 | indio_dev->channels = inv_mpu_channels; | ||
| 1143 | indio_dev->num_channels = ARRAY_SIZE(inv_mpu_channels); | ||
| 1144 | } | ||
| 1107 | 1145 | ||
| 1108 | indio_dev->info = &mpu_info; | 1146 | indio_dev->info = &mpu_info; |
| 1109 | indio_dev->modes = INDIO_BUFFER_TRIGGERED; | 1147 | indio_dev->modes = INDIO_BUFFER_TRIGGERED; |
diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h b/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h index 325afd9f5f61..3d5fe4474378 100644 --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h | |||
| @@ -208,6 +208,9 @@ struct inv_mpu6050_state { | |||
| 208 | #define INV_MPU6050_BYTES_PER_3AXIS_SENSOR 6 | 208 | #define INV_MPU6050_BYTES_PER_3AXIS_SENSOR 6 |
| 209 | #define INV_MPU6050_FIFO_COUNT_BYTE 2 | 209 | #define INV_MPU6050_FIFO_COUNT_BYTE 2 |
| 210 | 210 | ||
| 211 | /* ICM20602 FIFO samples include temperature readings */ | ||
| 212 | #define INV_ICM20602_BYTES_PER_TEMP_SENSOR 2 | ||
| 213 | |||
| 211 | /* mpu6500 registers */ | 214 | /* mpu6500 registers */ |
| 212 | #define INV_MPU6500_REG_ACCEL_CONFIG_2 0x1D | 215 | #define INV_MPU6500_REG_ACCEL_CONFIG_2 0x1D |
| 213 | #define INV_MPU6500_REG_ACCEL_OFFSET 0x77 | 216 | #define INV_MPU6500_REG_ACCEL_OFFSET 0x77 |
| @@ -229,6 +232,9 @@ struct inv_mpu6050_state { | |||
| 229 | #define INV_MPU6050_GYRO_CONFIG_FSR_SHIFT 3 | 232 | #define INV_MPU6050_GYRO_CONFIG_FSR_SHIFT 3 |
| 230 | #define INV_MPU6050_ACCL_CONFIG_FSR_SHIFT 3 | 233 | #define INV_MPU6050_ACCL_CONFIG_FSR_SHIFT 3 |
| 231 | 234 | ||
| 235 | #define INV_ICM20602_TEMP_OFFSET 8170 | ||
| 236 | #define INV_ICM20602_TEMP_SCALE 3060 | ||
| 237 | |||
| 232 | /* 6 + 6 round up and plus 8 */ | 238 | /* 6 + 6 round up and plus 8 */ |
| 233 | #define INV_MPU6050_OUTPUT_DATA_SIZE 24 | 239 | #define INV_MPU6050_OUTPUT_DATA_SIZE 24 |
| 234 | 240 | ||
| @@ -270,7 +276,7 @@ struct inv_mpu6050_state { | |||
| 270 | #define INV_ICM20608_WHOAMI_VALUE 0xAF | 276 | #define INV_ICM20608_WHOAMI_VALUE 0xAF |
| 271 | #define INV_ICM20602_WHOAMI_VALUE 0x12 | 277 | #define INV_ICM20602_WHOAMI_VALUE 0x12 |
| 272 | 278 | ||
| 273 | /* scan element definition */ | 279 | /* scan element definition for generic MPU6xxx devices */ |
| 274 | enum inv_mpu6050_scan { | 280 | enum inv_mpu6050_scan { |
| 275 | INV_MPU6050_SCAN_ACCL_X, | 281 | INV_MPU6050_SCAN_ACCL_X, |
| 276 | INV_MPU6050_SCAN_ACCL_Y, | 282 | INV_MPU6050_SCAN_ACCL_Y, |
| @@ -281,6 +287,18 @@ enum inv_mpu6050_scan { | |||
| 281 | INV_MPU6050_SCAN_TIMESTAMP, | 287 | INV_MPU6050_SCAN_TIMESTAMP, |
| 282 | }; | 288 | }; |
| 283 | 289 | ||
| 290 | /* scan element definition for ICM20602, which includes temperature */ | ||
| 291 | enum inv_icm20602_scan { | ||
| 292 | INV_ICM20602_SCAN_ACCL_X, | ||
| 293 | INV_ICM20602_SCAN_ACCL_Y, | ||
| 294 | INV_ICM20602_SCAN_ACCL_Z, | ||
| 295 | INV_ICM20602_SCAN_TEMP, | ||
| 296 | INV_ICM20602_SCAN_GYRO_X, | ||
| 297 | INV_ICM20602_SCAN_GYRO_Y, | ||
| 298 | INV_ICM20602_SCAN_GYRO_Z, | ||
| 299 | INV_ICM20602_SCAN_TIMESTAMP, | ||
| 300 | }; | ||
| 301 | |||
| 284 | enum inv_mpu6050_filter_e { | 302 | enum inv_mpu6050_filter_e { |
| 285 | INV_MPU6050_FILTER_256HZ_NOLPF2 = 0, | 303 | INV_MPU6050_FILTER_256HZ_NOLPF2 = 0, |
| 286 | INV_MPU6050_FILTER_188HZ, | 304 | INV_MPU6050_FILTER_188HZ, |
diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c index 548e042f7b5b..57bd11bde56b 100644 --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c | |||
| @@ -207,6 +207,9 @@ irqreturn_t inv_mpu6050_read_fifo(int irq, void *p) | |||
| 207 | if (st->chip_config.gyro_fifo_enable) | 207 | if (st->chip_config.gyro_fifo_enable) |
| 208 | bytes_per_datum += INV_MPU6050_BYTES_PER_3AXIS_SENSOR; | 208 | bytes_per_datum += INV_MPU6050_BYTES_PER_3AXIS_SENSOR; |
| 209 | 209 | ||
| 210 | if (st->chip_type == INV_ICM20602) | ||
| 211 | bytes_per_datum += INV_ICM20602_BYTES_PER_TEMP_SENSOR; | ||
| 212 | |||
| 210 | /* | 213 | /* |
| 211 | * read fifo_count register to know how many bytes are inside the FIFO | 214 | * read fifo_count register to know how many bytes are inside the FIFO |
| 212 | * right now | 215 | * right now |
