[U-Boot] [PATCH] hwmon: Extend lm63.c to support LM64

Dirk Eibach eibach at gdsys.de
Mon Apr 18 10:43:14 CEST 2011


This patch adds support for the National LM64 temperature
sensor with integrated fan control to lm63.c.
Main difference between LM63 and LM64 is 16°C offset in sensor
readings.

Signed-off-by: Dirk Eibach <eibach at gdsys.de>
---
 drivers/hwmon/lm63.c |   28 ++++++++++++++++++++++++----
 1 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/drivers/hwmon/lm63.c b/drivers/hwmon/lm63.c
index 03616e1..2f1f3cf 100644
--- a/drivers/hwmon/lm63.c
+++ b/drivers/hwmon/lm63.c
@@ -23,14 +23,15 @@
  */
 
 /*
- * National LM63 Temperature Sensor
+ * National LM63/LM64 Temperature Sensor
+ * Main difference: LM 64 has -16 Kelvin temperature offset
  */
 
 #include <common.h>
 #include <i2c.h>
 #include <dtt.h>
 
-#define DTT_I2C_DEV_CODE 0x4C	/* National LM63 device */
+#define DTT_I2C_LM63_ADDR	0x4C	/* National LM63 device */
 
 #define DTT_READ_TEMP_RMT_MSB	0x01
 #define DTT_CONFIG		0x03
@@ -58,7 +59,8 @@ int dtt_read(int sensor, int reg)
 	/*
 	 * Calculate sensor address and register.
 	 */
-	sensor = DTT_I2C_DEV_CODE;	/* address of lm63 is not adjustable */
+	if (!sensor)
+		sensor = DTT_I2C_LM63_ADDR;	/* legacy config */
 
 	dlen = 1;
 
@@ -79,7 +81,8 @@ int dtt_write(int sensor, int reg, int val)
 	/*
 	 * Calculate sensor address and register.
 	 */
-	sensor = DTT_I2C_DEV_CODE;	/* address of lm63 is not adjustable */
+	if (!sensor)
+		sensor = DTT_I2C_LM63_ADDR;	/* legacy config */
 
 	dlen = 1;
 	data[0] = (char)(val & 0xff);
@@ -93,6 +96,11 @@ int dtt_write(int sensor, int reg, int val)
 	return 0;
 }				/* dtt_write() */
 
+static int is_lm64(int sensor)
+{
+	return sensor && (sensor != DTT_I2C_LM63_ADDR);
+}
+
 static int _dtt_init(int sensor)
 {
 	int i;
@@ -117,14 +125,23 @@ static int _dtt_init(int sensor)
 		return 1;
 
 	/*
+	 * Make sure PWM Lookup-Table is writeable
+	 */
+	if (dtt_write(sensor, DTT_FAN_CONFIG, 0x20) != 0)
+		return 1;
+
+	/*
 	 * Setup PWM Lookup-Table
 	 */
 	for (i = 0; i < sizeof(pwm_lookup) / sizeof(struct pwm_lookup_entry);
 	     i++) {
 		int address = DTT_PWM_LOOKUP_BASE + 2 * i;
 		val = pwm_lookup[i].temp;
+		if (is_lm64(sensor))
+			val -= 16;
 		if (dtt_write(sensor, address, val) != 0)
 			return 1;
+		val = dtt_read(sensor, address);
 		val = pwm_lookup[i].pwm;
 		if (dtt_write(sensor, address + 1, val) != 0)
 			return 1;
@@ -152,6 +169,9 @@ int dtt_get_temp(int sensor)
 	s16 temp = (dtt_read(sensor, DTT_READ_TEMP_RMT_MSB) << 8)
 	    | (dtt_read(sensor, DTT_READ_TEMP_RMT_LSB));
 
+	if (is_lm64(sensor))
+		temp += 16 << 8;
+
 	/* Ignore LSB for now, U-Boot only prints natural numbers */
 	return temp >> 8;
 }
-- 
1.5.6.5



More information about the U-Boot mailing list