Modified: trunk/drivers/staging/iio/adc/ad7416.c (8488 => 8489)
--- trunk/drivers/staging/iio/adc/ad7416.c 2010-03-18 04:51:58 UTC (rev 8488)
+++ trunk/drivers/staging/iio/adc/ad7416.c 2010-03-18 06:13:12 UTC (rev 8489)
@@ -51,8 +51,9 @@
/*
* AD7416 masks
*/
-#define AD7416_VALUE_MASK 0xFFC0
+#define AD7416_VALUE_SIGN 0x200
#define AD7416_VALUE_OFFSET 6
+#define AD7416_BOUND_VALUE_SIGN 0x100
#define AD7416_TEMP_OFFSET 7
@@ -228,7 +229,7 @@
struct iio_dev *dev_info = dev_get_drvdata(dev);
struct ad7416_chip_info *chip = dev_info->dev_data;
u16 data;
- s16 value;
+ char sign = ' ';
int ret;
if (chip->mode) {
@@ -243,21 +244,24 @@
if (ret)
return -EIO;
- value = (s16)be16_to_cpu(data);
- value >>= AD7416_VALUE_OFFSET;
+ data = ""
+ data >>= AD7416_VALUE_OFFSET;
+ if (data & AD7416_VALUE_SIGN) {
+ data = "" << 1) - data;
+ sign = '-';
+ }
- return sprintf(buf, "%d.%.2d\n", (value >> 2),
- (value & 3) * 25);
+ return sprintf(buf, "%c%d.%.2d\n", sign, (data >> 2),
+ (data & 3) * 25);
} else {
ret = ad7416_i2c_read(chip, AD7416_ADC_VALUE, (u8 *)&data);
if (ret)
return -EIO;
- value = (s16)be16_to_cpu(data);
- value >>= AD7416_VALUE_OFFSET;
- value &= AD7416_VALUE_MASK;
+ data = ""
+ data >>= AD7416_VALUE_OFFSET;
- return sprintf(buf, "%d\n", value);
+ return sprintf(buf, "%u\n", data);
}
}
@@ -428,14 +432,26 @@
{
struct iio_dev *dev_info = dev_get_drvdata(dev);
struct ad7416_chip_info *chip = dev_info->dev_data;
- s8 value;
+ u16 data;
+ s16 value;
int ret;
- ret = ad7416_i2c_read(chip, bound_reg, &value);
+ ret = ad7416_i2c_read(chip, bound_reg, (u8 *)&data);
if (ret)
return -EIO;
- return sprintf(buf, "%d\n", value >> (AD7416_TEMP_OFFSET + 1));
+ data = ""
+ data >>= (AD7416_VALUE_OFFSET + 1);
+
+ if (chip->channel_id == 0) {
+ if (data & AD7416_BOUND_VALUE_SIGN) {
+ value = (s16)(data&(~AD7416_BOUND_VALUE_SIGN));
+ value = value - AD7416_BOUND_VALUE_SIGN;
+ }
+
+ return sprintf(buf, "%d\n", value >> 1),
+ } else
+ return sprintf(buf, "%u\n", data);
}
static inline ssize_t ad7416_set_t_bound(struct device *dev,
@@ -447,16 +463,28 @@
struct iio_dev *dev_info = dev_get_drvdata(dev);
struct ad7416_chip_info *chip = dev_info->dev_data;
long value;
- s16 data;
+ u16 data;
int ret;
- ret = strict_strtol(buf, 10, &value);
+ if (chip->channel_id == 0) {
+ ret = strict_strtol(buf, 10, &value);
- if (ret || value > 127 || value < -128)
- return -EINVAL;
- value <<= (AD7416_TEMP_OFFSET + 1);
- data = ""
+ if (ret || value < -128 || value > 127)
+ return -EINVAL;
+ if (value < 0)
+ value = (AD7416_BOUND_VALUE_SIGN + value) |
+ AD7416_BOUND_VALUE_SIGN;
+ data = "" << 1;
+ } else {
+ ret = strict_strtoul(buf, 10, &data);
+
+ if (ret || data > 511)
+ return -EINVAL;
+ }
+
+ data <<= (AD7416_BOUND_OFFSET + 1);
+ data = ""
ret = ad7416_i2c_write(chip, bound_reg, (u8)data);
if (ret)
return -EIO;