X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=drivers%2Fhwmon%2Flm63.c;h=f3adf6485997e5fde82a8c14ad0806527a0118b3;hb=1ca56202532395f26fc59a87e62c9cab1541f9f3;hp=03616e183a22072e6ef00a81f1c5cb92a3fa5d80;hpb=1c6fe6eac75d695fde677af8330c0dbe75fb6a2b;p=u-boot diff --git a/drivers/hwmon/lm63.c b/drivers/hwmon/lm63.c index 03616e183a..f3adf64859 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,7 +96,12 @@ int dtt_write(int sensor, int reg, int val) return 0; } /* dtt_write() */ -static int _dtt_init(int sensor) +static int is_lm64(int sensor) +{ + return sensor && (sensor != DTT_I2C_LM63_ADDR); +} + +int dtt_init_one(int sensor) { int i; int val; @@ -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,23 +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; } - -int dtt_init(void) -{ - int i; - unsigned char sensors[] = CONFIG_DTT_SENSORS; - const char *const header = "DTT: "; - - for (i = 0; i < sizeof(sensors); i++) { - if (_dtt_init(sensors[i]) != 0) - printf("%s%d FAILED INIT\n", header, i + 1); - else - printf("%s%d is %i C\n", header, i + 1, - dtt_get_temp(sensors[i])); - } - - return 0; -}