diff options
Diffstat (limited to 'drivers/hwmon/lm63.c')
| -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 03616e183..2f1f3cfab 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;  } |