mirror of
https://github.com/torvalds/linux.git
synced 2024-11-15 00:21:59 +00:00
iio: imu: inv_mpu6050: fix temperature reporting using bad unit
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>
This commit is contained in:
parent
342a6928bd
commit
53eaa9c27f
@ -117,6 +117,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,
|
||||
@ -124,6 +125,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,
|
||||
@ -131,6 +133,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,
|
||||
@ -138,6 +141,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,
|
||||
@ -145,6 +149,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,
|
||||
@ -152,6 +157,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,
|
||||
@ -159,6 +165,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,
|
||||
@ -166,6 +173,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,
|
||||
@ -173,6 +181,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},
|
||||
},
|
||||
};
|
||||
|
||||
@ -481,12 +490,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;
|
||||
case IIO_MAGN:
|
||||
return inv_mpu_magn_get_scale(st, chan, val, val2);
|
||||
@ -496,11 +501,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;
|
||||
|
@ -107,6 +107,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;
|
||||
@ -114,6 +115,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;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -279,16 +284,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 + 7 (for MPU9x50) = 19 round up to 24 and plus 8 */
|
||||
#define INV_MPU6050_OUTPUT_DATA_SIZE 32
|
||||
|
Loading…
Reference in New Issue
Block a user