Title: [8481] trunk/drivers/staging/iio/adc/adt75.c: Task[#5912] Correct the algorithm to calculate temperature in adt75.
Revision
8481
Author
sonicz
Date
2010-03-17 06:41:55 -0400 (Wed, 17 Mar 2010)

Log Message

Task[#5912] Correct the algorithm to calculate temperature in adt75.

The negative value is in supplement format.

Modified Paths

Diff

Modified: trunk/drivers/staging/iio/adc/adt75.c (8480 => 8481)


--- trunk/drivers/staging/iio/adc/adt75.c	2010-03-17 09:40:04 UTC (rev 8480)
+++ trunk/drivers/staging/iio/adc/adt75.c	2010-03-17 10:41:55 UTC (rev 8481)
@@ -42,6 +42,7 @@
 /*
  * ADT75 masks
  */
+#define ADT75_VALUE_SIGN		12
 #define ADT75_VALUE_OFFSET		4
 #define ADT75_VALUE_MASK		0xF
 #define ADT75_VALUE_FLOAT_OFFSET	4
@@ -211,7 +212,7 @@
 	struct iio_dev *dev_info = dev_get_drvdata(dev);
 	struct adt75_chip_info *chip = dev_info->dev_data;
 	u16 data;
-	s16 value;
+	char sign = ' ';
 	int ret;
 
 	if (chip->config & ADT75_PD) {
@@ -230,11 +231,16 @@
 	if (ret)
 		return -EIO;
 
-	value = (s16)be16_to_cpu(data);
-	value >>= ADT75_VALUE_OFFSET;
+	data = "" >> ADT75_VALUE_OFFSET;
+	if (data & ADT75_VALUE_SIGN) {
+		/* convert supplement to positive value */
+		data = "" << ADT75_VALUE_SIGN) - data;
+		sign = '-';
+	}
 
-	return sprintf(buf, "%d.%.4d\n", (value >> ADT75_VALUE_FLOAT_OFFSET),
-		 (value & ADT75_VALUE_FLOAT_MASK) * 625);
+	return sprintf(buf, "%c%d.%.4d\n", sign,
+		(data >> ADT75_VALUE_FLOAT_OFFSET),
+		(data & ADT75_VALUE_FLOAT_MASK) * 625);
 }
 
 IIO_DEVICE_ATTR(value, S_IRUGO, adt75_show_value, NULL, 0);
@@ -448,18 +454,23 @@
 	struct iio_dev *dev_info = dev_get_drvdata(dev);
 	struct adt75_chip_info *chip = dev_info->dev_data;
 	u16 data;
-	s16 value;
+	char sign = ' ';
 	int ret;
 
 	ret = adt75_i2c_read(chip, bound_reg, (u8 *)&data);
 	if (ret)
 		return -EIO;
 
-	value = (s16)be16_to_cpu(data);
-	value >>= ADT75_VALUE_OFFSET;
+	data = "" >> ADT75_VALUE_OFFSET;
+	if (data & ADT75_VALUE_SIGN) {
+		/* convert supplement to positive value */
+		data = "" << ADT75_VALUE_SIGN) - data;
+		sign = '-';
+	}
 
-	return sprintf(buf, "%d.%.4d\n", (value >> ADT75_VALUE_FLOAT_OFFSET),
-		 (value & ADT75_VALUE_FLOAT_MASK) * 625);
+	return sprintf(buf, "%c%d.%.4d\n", sign,
+		(data >> ADT75_VALUE_FLOAT_OFFSET),
+		(data & ADT75_VALUE_FLOAT_MASK) * 625);
 }
 
 static inline ssize_t adt75_set_t_bound(struct device *dev,
@@ -470,8 +481,7 @@
 {
 	struct iio_dev *dev_info = dev_get_drvdata(dev);
 	struct adt75_chip_info *chip = dev_info->dev_data;
-	unsigned long tmp1, tmp2;
-	s16 value;
+	long tmp1, tmp2;
 	u16 data;
 	char *pos;
 	int ret;
@@ -485,8 +495,8 @@
 
 	if (pos) {
 		len = strlen(pos);
-		if (len > 4)
-			len = 4;
+		if (len > ADT75_VALUE_FLOAT_OFFSET)
+			len = ADT75_VALUE_FLOAT_OFFSET;
 		pos[len] = 0;
 		ret = strict_strtol(pos, 10, &tmp2);
 
@@ -494,10 +504,16 @@
 			tmp2 = (tmp2 / 625) * 625;
 	}
 
-	value = (s16)tmp1;
-	value = (value << ADT75_VALUE_FLOAT_OFFSET) | (tmp2 & ADT75_VALUE_MASK);
-	value <<= ADT75_VALUE_OFFSET;
-	data = ""
+	if (tmp1 < 0)
+		data = ""
+	else
+		data = ""
+	data = "" << ADT75_VALUE_FLOAT_OFFSET) | (tmp2 & ADT75_VALUE_MASK);
+	if (tmp1 < 0)
+		/* convert positive value to supplyment */
+		data = "" << ADT75_VALUE_SIGN) - data;
+	data <<= ADT75_VALUE_OFFSET;
+	data = ""
 
 	ret = adt75_i2c_write(chip, bound_reg, (u8)data);
 	if (ret)
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to