From 31c1bdd93d0c7a6f2c242573761724f75e2647bc Mon Sep 17 00:00:00 2001 From: Dirk Eibach Date: Mon, 18 Apr 2011 10:43:14 +0200 Subject: hwmon: Extend lm63.c to support LM64 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- drivers/hwmon/lm63.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) (limited to 'drivers/hwmon/lm63.c') 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 #include #include -#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; } -- cgit v1.1