diff --git a/drivers/hwmon/lm63.c b/drivers/hwmon/lm63.c index 03616e183a..2f1f3cfabf 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; @@ -116,6 +124,12 @@ static int _dtt_init(int sensor) if (dtt_write(sensor, DTT_TACHLIM_MSB, (val >> 8) & 0xff) != 0) return 1; + /* + * Make sure PWM Lookup-Table is writeable + */ + if (dtt_write(sensor, DTT_FAN_CONFIG, 0x20) != 0) + return 1; + /* * Setup PWM Lookup-Table */ @@ -123,8 +137,11 @@ static int _dtt_init(int sensor) 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; }