summaryrefslogtreecommitdiffstats
path: root/drivers/iio
diff options
context:
space:
mode:
authorHartmut Knaack <knaack.h@gmx.de>2014-10-31 01:22:00 +0000
committerJonathan Cameron <jic23@kernel.org>2014-11-05 15:58:35 +0000
commit81ebe850a019ccb8bf0a429fb463d9bfc15ec298 (patch)
tree7235e3aa02eebe7c6289f8b89c1e1c8d2cff16dd /drivers/iio
parentc1b501564c98a94b48f4ed936737403108dc7300 (diff)
downloadlinux-stable-81ebe850a019ccb8bf0a429fb463d9bfc15ec298.tar.gz
linux-stable-81ebe850a019ccb8bf0a429fb463d9bfc15ec298.tar.bz2
linux-stable-81ebe850a019ccb8bf0a429fb463d9bfc15ec298.zip
iio:pressure:bmp280: fix pressure calculation
According to the datasheet and as defined in struct bmp280_comp_press, dig_p1 is of type u16, while dig_p2 to dig_p9 are of type s16. In bmp280_read_compensation_press(), values read from the device were treated as the wrong type. In bmp280_read_press() the fractional part of the measured pressure is calculated wrong. A better way is to use *val for the raw pressure and *val2 for the quotient and let the core do the proper conversion using IIO_VAL_FRACTIONAL. Signed-off-by: Hartmut Knaack <knaack.h@gmx.de> Acked-by: Vlad Dogaru <vlad.dogaru@intel.com> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Diffstat (limited to 'drivers/iio')
-rw-r--r--drivers/iio/pressure/bmp280.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/drivers/iio/pressure/bmp280.c b/drivers/iio/pressure/bmp280.c
index ce29ff91bce7..75038dacfff1 100644
--- a/drivers/iio/pressure/bmp280.c
+++ b/drivers/iio/pressure/bmp280.c
@@ -176,15 +176,15 @@ static int bmp280_read_compensation_press(struct bmp280_data *data,
return ret;
}
- comp->dig_p1 = (s16) le16_to_cpu(buf[0]);
- comp->dig_p2 = (u16) le16_to_cpu(buf[1]);
- comp->dig_p3 = (u16) le16_to_cpu(buf[2]);
- comp->dig_p4 = (u16) le16_to_cpu(buf[3]);
- comp->dig_p5 = (u16) le16_to_cpu(buf[4]);
- comp->dig_p6 = (u16) le16_to_cpu(buf[5]);
- comp->dig_p7 = (u16) le16_to_cpu(buf[6]);
- comp->dig_p8 = (u16) le16_to_cpu(buf[7]);
- comp->dig_p9 = (u16) le16_to_cpu(buf[8]);
+ comp->dig_p1 = (u16) le16_to_cpu(buf[0]);
+ comp->dig_p2 = (s16) le16_to_cpu(buf[1]);
+ comp->dig_p3 = (s16) le16_to_cpu(buf[2]);
+ comp->dig_p4 = (s16) le16_to_cpu(buf[3]);
+ comp->dig_p5 = (s16) le16_to_cpu(buf[4]);
+ comp->dig_p6 = (s16) le16_to_cpu(buf[5]);
+ comp->dig_p7 = (s16) le16_to_cpu(buf[6]);
+ comp->dig_p8 = (s16) le16_to_cpu(buf[7]);
+ comp->dig_p9 = (s16) le16_to_cpu(buf[8]);
return 0;
}
@@ -309,10 +309,10 @@ static int bmp280_read_press(struct bmp280_data *data,
adc_press = be32_to_cpu(tmp) >> 12;
comp_press = bmp280_compensate_press(data, &comp, adc_press);
- *val = comp_press / 256000;
- *val2 = comp_press * 1000000 / 256000;
+ *val = comp_press;
+ *val2 = 256000;
- return IIO_VAL_INT_PLUS_MICRO;
+ return IIO_VAL_FRACTIONAL;
}
static int bmp280_read_raw(struct iio_dev *indio_dev,