aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon
diff options
context:
space:
mode:
authorJean Delvare <khali@linux-fr.org>2008-10-26 17:04:40 +0100
committerJean Delvare <khali@linux-fr.org>2008-10-26 17:04:40 +0100
commitbe821b78af9de886571e3565515a59f966d66f42 (patch)
tree2fd43589b6673700b65c0c30efb4ffaecab690ea /drivers/hwmon
parent97ae60bb38279e1941c738b1037a57e6b14efeaf (diff)
downloadkernel_samsung_tuna-be821b78af9de886571e3565515a59f966d66f42.zip
kernel_samsung_tuna-be821b78af9de886571e3565515a59f966d66f42.tar.gz
kernel_samsung_tuna-be821b78af9de886571e3565515a59f966d66f42.tar.bz2
hwmon: (adt7473) Fix voltage conversion routines
Fix voltage conversion routines. Based on an earlier patch from Paulius Zaleckas. According to the datasheet voltage is scaled with resistors and value 192 is nominal voltage. 0 is 0V. Signed-off-by: Jean Delvare <khali@linux-fr.org> Cc: Paulius Zaleckas <paulius.zaleckas@teltonika.lt> Cc: Darrick J. Wong <djwong@us.ibm.com>
Diffstat (limited to 'drivers/hwmon')
-rw-r--r--drivers/hwmon/adt7473.c29
1 files changed, 9 insertions, 20 deletions
diff --git a/drivers/hwmon/adt7473.c b/drivers/hwmon/adt7473.c
index 3a0b631..b9a8ea3 100644
--- a/drivers/hwmon/adt7473.c
+++ b/drivers/hwmon/adt7473.c
@@ -319,35 +319,24 @@ out:
}
/*
- * On this chip, voltages are given as a count of steps between a minimum
- * and maximum voltage, not a direct voltage.
+ * Conversions
*/
-static const int volt_convert_table[][2] = {
- {2997, 3},
- {4395, 4},
+
+/* IN are scaled acording to built-in resistors */
+static const int adt7473_scaling[] = { /* .001 Volts */
+ 2250, 3300
};
+#define SCALE(val, from, to) (((val) * (to) + ((from) / 2)) / (from))
static int decode_volt(int volt_index, u8 raw)
{
- int cmax = volt_convert_table[volt_index][0];
- int cmin = volt_convert_table[volt_index][1];
- return ((raw * (cmax - cmin)) / 255) + cmin;
+ return SCALE(raw, 192, adt7473_scaling[volt_index]);
}
static u8 encode_volt(int volt_index, int cooked)
{
- int cmax = volt_convert_table[volt_index][0];
- int cmin = volt_convert_table[volt_index][1];
- u8 x;
-
- if (cooked > cmax)
- cooked = cmax;
- else if (cooked < cmin)
- cooked = cmin;
-
- x = ((cooked - cmin) * 255) / (cmax - cmin);
-
- return x;
+ int raw = SCALE(cooked, adt7473_scaling[volt_index], 192);
+ return SENSORS_LIMIT(raw, 0, 255);
}
static ssize_t show_volt_min(struct device *dev,