Browse Source

iio: Fix two mpl3115 issues in measurement conversion

(i) pressure is 20-bit unsigned, not signed; the buffer description
is incorrect; for raw reads, this is just cosmetic

(ii) temperature is 12-bit signed, not 16-bit; this affects
readout of temperatures below zero as the sign bit is incorrectly
processed

reported via private mail

Cc: stable@vger.kernel.org
Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
Reported-by: Robert Deliën <robert@delien.nl>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Peter Meerwald 11 years ago
parent
commit
d29f592929
1 changed files with 3 additions and 3 deletions
  1. 3 3
      drivers/iio/pressure/mpl3115.c

+ 3 - 3
drivers/iio/pressure/mpl3115.c

@@ -98,7 +98,7 @@ static int mpl3115_read_raw(struct iio_dev *indio_dev,
 			mutex_unlock(&data->lock);
 			mutex_unlock(&data->lock);
 			if (ret < 0)
 			if (ret < 0)
 				return ret;
 				return ret;
-			*val = sign_extend32(be32_to_cpu(tmp) >> 12, 23);
+			*val = be32_to_cpu(tmp) >> 12;
 			return IIO_VAL_INT;
 			return IIO_VAL_INT;
 		case IIO_TEMP: /* in 0.0625 celsius / LSB */
 		case IIO_TEMP: /* in 0.0625 celsius / LSB */
 			mutex_lock(&data->lock);
 			mutex_lock(&data->lock);
@@ -112,7 +112,7 @@ static int mpl3115_read_raw(struct iio_dev *indio_dev,
 			mutex_unlock(&data->lock);
 			mutex_unlock(&data->lock);
 			if (ret < 0)
 			if (ret < 0)
 				return ret;
 				return ret;
-			*val = sign_extend32(be32_to_cpu(tmp) >> 20, 15);
+			*val = sign_extend32(be32_to_cpu(tmp) >> 20, 11);
 			return IIO_VAL_INT;
 			return IIO_VAL_INT;
 		default:
 		default:
 			return -EINVAL;
 			return -EINVAL;
@@ -185,7 +185,7 @@ static const struct iio_chan_spec mpl3115_channels[] = {
 			BIT(IIO_CHAN_INFO_SCALE),
 			BIT(IIO_CHAN_INFO_SCALE),
 		.scan_index = 0,
 		.scan_index = 0,
 		.scan_type = {
 		.scan_type = {
-			.sign = 's',
+			.sign = 'u',
 			.realbits = 20,
 			.realbits = 20,
 			.storagebits = 32,
 			.storagebits = 32,
 			.shift = 12,
 			.shift = 12,