diff --git a/README b/README index b019b3c4..9c3cf419 100644 --- a/README +++ b/README @@ -35,7 +35,7 @@ At least the following SMBus adapters are supported: Apple Hydra (used on some PPC machines) At least the following hardware sensor chips are supported: - National Semicoductor LM75, LM78, LM78-J, LM79. LM80, and LM81 + National Semicoductor LM75, LM78, LM78-J, LM79. LM80, LM81, and LM84 Winbond W83781D, W83782D, W83783S, and W83627HF Genesys Logic GL518SM (several revisions) Analog Devices ADM1021, ADM1022, and ADM9240 diff --git a/doc/chips/SUMMARY b/doc/chips/SUMMARY index 7bd59c38..d0042c3f 100644 --- a/doc/chips/SUMMARY +++ b/doc/chips/SUMMARY @@ -37,6 +37,7 @@ Driver Chips #temp #vin #fanin pwm/dac i2c ISA --------------------------------------------------------------------- adm1021 adm1021 2 - - - yes no + lm84 2 - - - yes no max1617 2 - - - yes no max1617a 2 - - - yes no thmc10 2 - - - yes no @@ -120,6 +121,7 @@ Many SMBus chips have a company ID at location 0x3E or 0xFE. Here is a partial list. This may help identify a chip after doing a 'i2cdump [bus] [address] b'. +0x00 National 0x01 National 0x23 AMD 0x41 AMD diff --git a/kernel/chips/adm1021.c b/kernel/chips/adm1021.c index e47ac74f..09cd5914 100644 --- a/kernel/chips/adm1021.c +++ b/kernel/chips/adm1021.c @@ -42,7 +42,7 @@ static unsigned int normal_isa[] = {SENSORS_ISA_END}; static unsigned int normal_isa_range[] = {SENSORS_ISA_END}; /* Insmod parameters */ -SENSORS_INSMOD_4(adm1021,max1617,max1617a,thmc10); +SENSORS_INSMOD_5(adm1021,max1617,max1617a,thmc10,lm84); /* adm1021 constants specified below */ @@ -248,6 +248,8 @@ static int adm1021_detect(struct i2c_adapter *adapter, int address, kind = adm1021; else if (i == 0x49) kind = thmc10; + else if (i == 0x00) + kind = lm84; else if ((i== 0x4d) && (adm1021_read_value(new_client,ADM1021_REG_DEV_ID) == 0x01)) kind = max1617a; diff --git a/kernel/include/sensors.h b/kernel/include/sensors.h index 8e4314c0..42e69a11 100644 --- a/kernel/include/sensors.h +++ b/kernel/include/sensors.h @@ -280,6 +280,25 @@ struct sensors_address_data { {NULL}}; \ SENSORS_INSMOD +#define SENSORS_INSMOD_5(chip1,chip2,chip3,chip4,chip5) \ + enum chips { any_chip, chip1, chip2, chip3, chip4, chip5 }; \ + SENSORS_MODULE_PARM(force, \ + "List of adapter,address pairs to boldly assume " \ + "to be present"); \ + SENSORS_MODULE_PARM_FORCE(chip1); \ + SENSORS_MODULE_PARM_FORCE(chip2); \ + SENSORS_MODULE_PARM_FORCE(chip3); \ + SENSORS_MODULE_PARM_FORCE(chip4); \ + SENSORS_MODULE_PARM_FORCE(chip5); \ + static struct sensors_force_data forces[] = {{force,any_chip}, \ + {force_ ## chip1,chip1}, \ + {force_ ## chip2,chip2}, \ + {force_ ## chip3,chip3}, \ + {force_ ## chip4,chip4}, \ + {force_ ## chip5,chip5}, \ + {NULL}}; \ + SENSORS_INSMOD + typedef int sensors_found_addr_proc (struct i2c_adapter *adapter, int addr, unsigned short flags, int kind); diff --git a/prog/detect/sensors-detect b/prog/detect/sensors-detect index 097d4cf8..840dfd0f 100755 --- a/prog/detect/sensors-detect +++ b/prog/detect/sensors-detect @@ -290,6 +290,12 @@ use subs qw(lm78_detect lm78_isa_detect lm78_alias_detect lm75_detect i2c_addrs => [0x18..0x1a,0x29..0x2b,0x4c..0x4e], i2c_detect => sub { adm1021_detect 3, @_ }, }, + { + name => "National Semiconductor LM84" + driver => "adm1021", + i2c_addrs => [0x18..0x1a,0x29..0x2b,0x4c..0x4e], + i2c_detect => sub { adm1021_detect 4, @_ }, + }, { name => "Analog Devices ADM1022", driver => "thmc50", @@ -1419,7 +1425,8 @@ sub adm1022_detect return (8); } -# $_[0]: Chip to detect (0 = ADM1021, 1 = MAX1617, 2 = MAX1617A, 3 = THMC10) +# $_[0]: Chip to detect +# (0 = ADM1021, 1 = MAX1617, 2 = MAX1617A, 3 = THMC10, 4 = LM84) # $_[1]: A reference to the file descriptor to access this chip. # We may assume an i2c_set_slave_addr was already done. # $_[2]: Address @@ -1435,6 +1442,7 @@ sub adm1021_detect my ($chip, $file,$addr) = @_; return if $chip == 0 and i2c_smbus_read_byte_data($file,0xfe) != 0x41; return if $chip == 3 and i2c_smbus_read_byte_data($file,0xfe) != 0x49; + return if $chip == 4 and i2c_smbus_read_byte_data($file,0xfe) != 0x00; return if $chip == 2 and i2c_smbus_read_byte_data($file,0xfe) != 0x4d and i2c_smbus_read_byte_data($file,0xff) != 0x01; # The remaining things are flaky at best. Perhaps something can be done