diff options
author | Dirk Eibach | 2011-04-18 10:43:14 +0200 |
---|---|---|
committer | Wolfgang Denk | 2011-05-12 23:01:34 +0200 |
commit | 31c1bdd93d0c7a6f2c242573761724f75e2647bc (patch) | |
tree | 7f62e73efdd244b3a01e801cc35b6cf838fdd738 /drivers | |
parent | bbc6353c740064c8e0741b772376a1a67a1c3f01 (diff) |
hwmon: Extend lm63.c to support LM64
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@gdsys.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | 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 03616e183a2..2f1f3cfabf2 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; } |