aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-05-20 03:15:14 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-05-20 03:15:14 -0400
commit083a685c2ee035dd6c47242ea2de6d9eed3bf929 (patch)
treeb50c0e89fa21c9bb3a23e1afa31c257d819117b6
parenta188339ca5a396acc588e5851ed7e19f66b0ebd9 (diff)
parente6d12298310fa1dc11f1d747e05b168016057fdd (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.c2
-rw-r--r--drivers/iio/adc/ti-ads124s08.c2
-rw-r--r--drivers/iio/adc/ti-ads8688.c2
-rw-r--r--drivers/iio/dac/ds4424.c2
-rw-r--r--drivers/iio/imu/inv_mpu6050/inv_mpu_core.c46
-rw-r--r--drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h20
-rw-r--r--drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c3
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
856static 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 */
274enum inv_mpu6050_scan { 280enum 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 */
291enum 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
284enum inv_mpu6050_filter_e { 302enum 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