iio: imu: inv_mpu6050: fix temperature reporting using bad unit
commit5.4-rM2-2.2.x-imx-squashed53eaa9c27f
upstream. Temperature should be reported in milli-degrees, not degrees. Fix scale and offset values to use the correct unit. This is a fix for an issue that has been present for a long time. The fixes tag reflects the point at which the code last changed in a fashion that would make this fix patch no longer apply. Backports will be necessary to fix those elements that predate that patch. Fixes:1615fe41a1
("iio: imu: mpu6050: Fix FIFO layout for ICM20602") Cc: stable@vger.kernel.org Signed-off-by: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
parent
6e1536f5c5
commit
d314b89127
|
@ -115,6 +115,7 @@ static const struct inv_mpu6050_hw hw_info[] = {
|
|||
.reg = ®_set_6050,
|
||||
.config = &chip_config_6050,
|
||||
.fifo_size = 1024,
|
||||
.temp = {INV_MPU6050_TEMP_OFFSET, INV_MPU6050_TEMP_SCALE},
|
||||
},
|
||||
{
|
||||
.whoami = INV_MPU6500_WHOAMI_VALUE,
|
||||
|
@ -122,6 +123,7 @@ static const struct inv_mpu6050_hw hw_info[] = {
|
|||
.reg = ®_set_6500,
|
||||
.config = &chip_config_6050,
|
||||
.fifo_size = 512,
|
||||
.temp = {INV_MPU6500_TEMP_OFFSET, INV_MPU6500_TEMP_SCALE},
|
||||
},
|
||||
{
|
||||
.whoami = INV_MPU6515_WHOAMI_VALUE,
|
||||
|
@ -129,6 +131,7 @@ static const struct inv_mpu6050_hw hw_info[] = {
|
|||
.reg = ®_set_6500,
|
||||
.config = &chip_config_6050,
|
||||
.fifo_size = 512,
|
||||
.temp = {INV_MPU6500_TEMP_OFFSET, INV_MPU6500_TEMP_SCALE},
|
||||
},
|
||||
{
|
||||
.whoami = INV_MPU6000_WHOAMI_VALUE,
|
||||
|
@ -136,6 +139,7 @@ static const struct inv_mpu6050_hw hw_info[] = {
|
|||
.reg = ®_set_6050,
|
||||
.config = &chip_config_6050,
|
||||
.fifo_size = 1024,
|
||||
.temp = {INV_MPU6050_TEMP_OFFSET, INV_MPU6050_TEMP_SCALE},
|
||||
},
|
||||
{
|
||||
.whoami = INV_MPU9150_WHOAMI_VALUE,
|
||||
|
@ -143,6 +147,7 @@ static const struct inv_mpu6050_hw hw_info[] = {
|
|||
.reg = ®_set_6050,
|
||||
.config = &chip_config_6050,
|
||||
.fifo_size = 1024,
|
||||
.temp = {INV_MPU6050_TEMP_OFFSET, INV_MPU6050_TEMP_SCALE},
|
||||
},
|
||||
{
|
||||
.whoami = INV_MPU9250_WHOAMI_VALUE,
|
||||
|
@ -150,6 +155,7 @@ static const struct inv_mpu6050_hw hw_info[] = {
|
|||
.reg = ®_set_6500,
|
||||
.config = &chip_config_6050,
|
||||
.fifo_size = 512,
|
||||
.temp = {INV_MPU6500_TEMP_OFFSET, INV_MPU6500_TEMP_SCALE},
|
||||
},
|
||||
{
|
||||
.whoami = INV_MPU9255_WHOAMI_VALUE,
|
||||
|
@ -157,6 +163,7 @@ static const struct inv_mpu6050_hw hw_info[] = {
|
|||
.reg = ®_set_6500,
|
||||
.config = &chip_config_6050,
|
||||
.fifo_size = 512,
|
||||
.temp = {INV_MPU6500_TEMP_OFFSET, INV_MPU6500_TEMP_SCALE},
|
||||
},
|
||||
{
|
||||
.whoami = INV_ICM20608_WHOAMI_VALUE,
|
||||
|
@ -164,6 +171,7 @@ static const struct inv_mpu6050_hw hw_info[] = {
|
|||
.reg = ®_set_6500,
|
||||
.config = &chip_config_6050,
|
||||
.fifo_size = 512,
|
||||
.temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE},
|
||||
},
|
||||
{
|
||||
.whoami = INV_ICM20602_WHOAMI_VALUE,
|
||||
|
@ -171,6 +179,7 @@ static const struct inv_mpu6050_hw hw_info[] = {
|
|||
.reg = ®_set_icm20602,
|
||||
.config = &chip_config_6050,
|
||||
.fifo_size = 1008,
|
||||
.temp = {INV_ICM20608_TEMP_OFFSET, INV_ICM20608_TEMP_SCALE},
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -471,12 +480,8 @@ inv_mpu6050_read_raw(struct iio_dev *indio_dev,
|
|||
|
||||
return IIO_VAL_INT_PLUS_MICRO;
|
||||
case IIO_TEMP:
|
||||
*val = 0;
|
||||
if (st->chip_type == INV_ICM20602)
|
||||
*val2 = INV_ICM20602_TEMP_SCALE;
|
||||
else
|
||||
*val2 = INV_MPU6050_TEMP_SCALE;
|
||||
|
||||
*val = st->hw->temp.scale / 1000000;
|
||||
*val2 = st->hw->temp.scale % 1000000;
|
||||
return IIO_VAL_INT_PLUS_MICRO;
|
||||
default:
|
||||
return -EINVAL;
|
||||
|
@ -484,11 +489,7 @@ inv_mpu6050_read_raw(struct iio_dev *indio_dev,
|
|||
case IIO_CHAN_INFO_OFFSET:
|
||||
switch (chan->type) {
|
||||
case IIO_TEMP:
|
||||
if (st->chip_type == INV_ICM20602)
|
||||
*val = INV_ICM20602_TEMP_OFFSET;
|
||||
else
|
||||
*val = INV_MPU6050_TEMP_OFFSET;
|
||||
|
||||
*val = st->hw->temp.offset;
|
||||
return IIO_VAL_INT;
|
||||
default:
|
||||
return -EINVAL;
|
||||
|
|
|
@ -101,6 +101,7 @@ struct inv_mpu6050_chip_config {
|
|||
* @reg: register map of the chip.
|
||||
* @config: configuration of the chip.
|
||||
* @fifo_size: size of the FIFO in bytes.
|
||||
* @temp: offset and scale to apply to raw temperature.
|
||||
*/
|
||||
struct inv_mpu6050_hw {
|
||||
u8 whoami;
|
||||
|
@ -108,6 +109,10 @@ struct inv_mpu6050_hw {
|
|||
const struct inv_mpu6050_reg_map *reg;
|
||||
const struct inv_mpu6050_chip_config *config;
|
||||
size_t fifo_size;
|
||||
struct {
|
||||
int offset;
|
||||
int scale;
|
||||
} temp;
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -218,16 +223,19 @@ struct inv_mpu6050_state {
|
|||
#define INV_MPU6050_REG_UP_TIME_MIN 5000
|
||||
#define INV_MPU6050_REG_UP_TIME_MAX 10000
|
||||
|
||||
#define INV_MPU6050_TEMP_OFFSET 12421
|
||||
#define INV_MPU6050_TEMP_SCALE 2941
|
||||
#define INV_MPU6050_TEMP_OFFSET 12420
|
||||
#define INV_MPU6050_TEMP_SCALE 2941176
|
||||
#define INV_MPU6050_MAX_GYRO_FS_PARAM 3
|
||||
#define INV_MPU6050_MAX_ACCL_FS_PARAM 3
|
||||
#define INV_MPU6050_THREE_AXIS 3
|
||||
#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
|
||||
#define INV_MPU6500_TEMP_OFFSET 7011
|
||||
#define INV_MPU6500_TEMP_SCALE 2995178
|
||||
|
||||
#define INV_ICM20608_TEMP_OFFSET 8170
|
||||
#define INV_ICM20608_TEMP_SCALE 3059976
|
||||
|
||||
/* 6 + 6 round up and plus 8 */
|
||||
#define INV_MPU6050_OUTPUT_DATA_SIZE 24
|
||||
|
|
Loading…
Reference in New Issue