On 07/03/2012 11:41 AM, Zhang, Sonic wrote: > Acked-by: Sonic Zhang <sonic.zhang@xxxxxxxxxx> merged to fixes. > >> -----Original Message----- >> From: Sascha Hauer [mailto:s.hauer@xxxxxxxxxxxxxx] >> Sent: Tuesday, July 03, 2012 5:21 PM >> To: linux-iio@xxxxxxxxxxxxxxx >> Cc: Jonathan Cameron; Zhang, Sonic; Sascha Hauer >> Subject: [PATCH 2/3] staging iio adt7410: fix 13bit mode >> >> The driver assumes that in 13bit mode the 16bit value has >> to be shifted to the right by 3 bits. This is not true, in >> both 16bit and 13bit mode the MSB is at the same position. >> Currently the driver returns a temperature of 194 degrees >> Celsius in 13bit mode and 24 degrees Celsius in 16bit mode. >> Fix this by using the same algorithm for 16bit and 13bit >> mode and by just masking out the lower three bits in 13bit >> mode. >> >> Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> >> --- >> drivers/staging/iio/adc/adt7410.c | 29 ++++++++++------------------- >> 1 file changed, 10 insertions(+), 19 deletions(-) >> >> diff --git a/drivers/staging/iio/adc/adt7410.c b/drivers/staging/iio/adc/adt7410.c >> index fa54a40..f9188e5 100644 >> --- a/drivers/staging/iio/adc/adt7410.c >> +++ b/drivers/staging/iio/adc/adt7410.c >> @@ -293,26 +293,17 @@ static ssize_t adt7410_convert_temperature(struct >> adt7410_chip_info *chip, >> { >> char sign = ' '; >> >> - if (chip->config & ADT7410_RESOLUTION) { >> - if (data & ADT7410_T16_VALUE_SIGN) { >> - /* convert supplement to positive value */ >> - data = (u16)((ADT7410_T16_VALUE_SIGN << 1) - >> (u32)data); >> - sign = '-'; >> - } >> - return sprintf(buf, "%c%d.%.7d\n", sign, >> - (data >> ADT7410_T16_VALUE_FLOAT_OFFSET), >> - (data & ADT7410_T16_VALUE_FLOAT_MASK) * >> 78125); >> - } else { >> - if (data & ADT7410_T13_VALUE_SIGN) { >> - /* convert supplement to positive value */ >> - data >>= ADT7410_T13_VALUE_OFFSET; >> - data = (ADT7410_T13_VALUE_SIGN << 1) - data; >> - sign = '-'; >> - } >> - return sprintf(buf, "%c%d.%.4d\n", sign, >> - (data >> ADT7410_T13_VALUE_FLOAT_OFFSET), >> - (data & ADT7410_T13_VALUE_FLOAT_MASK) * >> 625); >> + if (!(chip->config & ADT7410_RESOLUTION)) >> + data &= ~0x7; >> + >> + if (data & ADT7410_T16_VALUE_SIGN) { >> + /* convert supplement to positive value */ >> + data = (u16)((ADT7410_T16_VALUE_SIGN << 1) - (u32)data); >> + sign = '-'; >> } >> + return sprintf(buf, "%c%d.%.7d\n", sign, >> + (data >> ADT7410_T16_VALUE_FLOAT_OFFSET), >> + (data & ADT7410_T16_VALUE_FLOAT_MASK) * 78125); >> } >> >> static ssize_t adt7410_show_value(struct device *dev, >> -- >> 1.7.10 >> > > -- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html