forked from luck/tmp_suning_uos_patched
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. -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEEbilms4eEBlKRJoGxVIU0mcT0FogFAlzhFEARHGppYzIzQGtl cm5lbC5vcmcACgkQVIU0mcT0FojNMg//SCVSRt1KmsRDNdtCyUtgrs2BMISBQ5zP XpDvHajk9lPJvt/rbdKNJPC23N0qjV0fIfaMjsN1mTrbeL3JQE7r+17iCJ1EL+dj H2BFQlzMN9bPt9wx/VeQnTqPiTuwNpB5/eNb3mfGKGDkKmmfnL0+DDJEQycBgfK7 gRgX4XGsMYLmKPAJvrQdSvMvu0V8UTAkZNBdcMydhl9Jba9elXPqI5kYFi7pNajD 09fAGKhkeHd9whRNa2O6wKyRXh+c7regPAMtwjwlmv4dsmRHocYeLQOI05guuKf1 /+0I+ptOf8RRHGOFX8j7rXua9Q2B+SzXsmoH4RlJLb23Jcqz7/ZDfcAGGVPndlME R3vGsYsoSLkmbRkVQ9ygDrzRsNnFKw/pR+u+zKdi/DH3C9EUI5JmRAkJSloElmrr VE1ZC7HXxUiKjfZaBLFeuugt65QGfxsGp+UsuFIgg0WQGk7yVWdC8RL9SZUy3wEq xFcfiWfbJp/LnVjs6aUBAV8cROswBv/ebcQZgOSPC/j8HyU6xRzmXVt4urBVwKVd gr3G+w7JhxCyByXJp7vqFtOmYeHB1X1UY8GNzgxsz9q2A1wtlEsXGpIh/arDY4r9 toiSQAPAoVRBoLYfj+32EWgPR0iahjE81QZwWAqSzgBmompTQ1ByAyieOC4whgOe Lau/nLtAvGU= =nq1b -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
083a685c2e
|
@ -149,7 +149,7 @@ static int npcm_adc_read_raw(struct iio_dev *indio_dev,
|
|||
}
|
||||
return IIO_VAL_INT;
|
||||
case IIO_CHAN_INFO_SCALE:
|
||||
if (info->vref) {
|
||||
if (!IS_ERR(info->vref)) {
|
||||
vref_uv = regulator_get_voltage(info->vref);
|
||||
*val = vref_uv / 1000;
|
||||
} else {
|
||||
|
|
|
@ -202,7 +202,7 @@ static int ads124s_read(struct iio_dev *indio_dev, unsigned int chan)
|
|||
};
|
||||
|
||||
priv->data[0] = ADS124S08_CMD_RDATA;
|
||||
memset(&priv->data[1], ADS124S08_CMD_NOP, sizeof(priv->data));
|
||||
memset(&priv->data[1], ADS124S08_CMD_NOP, sizeof(priv->data) - 1);
|
||||
|
||||
ret = spi_sync_transfer(priv->spi, t, ARRAY_SIZE(t));
|
||||
if (ret < 0)
|
||||
|
|
|
@ -397,7 +397,7 @@ static irqreturn_t ads8688_trigger_handler(int irq, void *p)
|
|||
}
|
||||
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, buffer,
|
||||
pf->timestamp);
|
||||
iio_get_time_ns(indio_dev));
|
||||
|
||||
iio_trigger_notify_done(indio_dev->trig);
|
||||
|
||||
|
|
|
@ -166,7 +166,7 @@ static int ds4424_verify_chip(struct iio_dev *indio_dev)
|
|||
{
|
||||
int ret, val;
|
||||
|
||||
ret = ds4424_get_value(indio_dev, &val, DS4424_DAC_ADDR(0));
|
||||
ret = ds4424_get_value(indio_dev, &val, 0);
|
||||
if (ret < 0)
|
||||
dev_err(&indio_dev->dev,
|
||||
"%s failed. ret: %d\n", __func__, ret);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -208,6 +208,9 @@ struct inv_mpu6050_state {
|
|||
#define INV_MPU6050_BYTES_PER_3AXIS_SENSOR 6
|
||||
#define INV_MPU6050_FIFO_COUNT_BYTE 2
|
||||
|
||||
/* ICM20602 FIFO samples include temperature readings */
|
||||
#define INV_ICM20602_BYTES_PER_TEMP_SENSOR 2
|
||||
|
||||
/* mpu6500 registers */
|
||||
#define INV_MPU6500_REG_ACCEL_CONFIG_2 0x1D
|
||||
#define INV_MPU6500_REG_ACCEL_OFFSET 0x77
|
||||
|
@ -229,6 +232,9 @@ struct inv_mpu6050_state {
|
|||
#define INV_MPU6050_GYRO_CONFIG_FSR_SHIFT 3
|
||||
#define INV_MPU6050_ACCL_CONFIG_FSR_SHIFT 3
|
||||
|
||||
#define INV_ICM20602_TEMP_OFFSET 8170
|
||||
#define INV_ICM20602_TEMP_SCALE 3060
|
||||
|
||||
/* 6 + 6 round up and plus 8 */
|
||||
#define INV_MPU6050_OUTPUT_DATA_SIZE 24
|
||||
|
||||
|
@ -270,7 +276,7 @@ struct inv_mpu6050_state {
|
|||
#define INV_ICM20608_WHOAMI_VALUE 0xAF
|
||||
#define INV_ICM20602_WHOAMI_VALUE 0x12
|
||||
|
||||
/* scan element definition */
|
||||
/* scan element definition for generic MPU6xxx devices */
|
||||
enum inv_mpu6050_scan {
|
||||
INV_MPU6050_SCAN_ACCL_X,
|
||||
INV_MPU6050_SCAN_ACCL_Y,
|
||||
|
@ -281,6 +287,18 @@ enum inv_mpu6050_scan {
|
|||
INV_MPU6050_SCAN_TIMESTAMP,
|
||||
};
|
||||
|
||||
/* scan element definition for ICM20602, which includes temperature */
|
||||
enum inv_icm20602_scan {
|
||||
INV_ICM20602_SCAN_ACCL_X,
|
||||
INV_ICM20602_SCAN_ACCL_Y,
|
||||
INV_ICM20602_SCAN_ACCL_Z,
|
||||
INV_ICM20602_SCAN_TEMP,
|
||||
INV_ICM20602_SCAN_GYRO_X,
|
||||
INV_ICM20602_SCAN_GYRO_Y,
|
||||
INV_ICM20602_SCAN_GYRO_Z,
|
||||
INV_ICM20602_SCAN_TIMESTAMP,
|
||||
};
|
||||
|
||||
enum inv_mpu6050_filter_e {
|
||||
INV_MPU6050_FILTER_256HZ_NOLPF2 = 0,
|
||||
INV_MPU6050_FILTER_188HZ,
|
||||
|
|
|
@ -207,6 +207,9 @@ irqreturn_t inv_mpu6050_read_fifo(int irq, void *p)
|
|||
if (st->chip_config.gyro_fifo_enable)
|
||||
bytes_per_datum += INV_MPU6050_BYTES_PER_3AXIS_SENSOR;
|
||||
|
||||
if (st->chip_type == INV_ICM20602)
|
||||
bytes_per_datum += INV_ICM20602_BYTES_PER_TEMP_SENSOR;
|
||||
|
||||
/*
|
||||
* read fifo_count register to know how many bytes are inside the FIFO
|
||||
* right now
|
||||
|
|
Loading…
Reference in New Issue
Block a user