2
0
mirror of https://github.com/lm-sensors/lm-sensors synced 2025-08-30 05:48:07 +00:00

Add LM86, MAX6657 and MAX6658 support to the lm90 driver.

git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@2633 7894878c-1315-0410-8ee3-d5d059ff63e0
This commit is contained in:
Jean Delvare 2004-07-04 19:12:18 +00:00
parent ddd96c7499
commit d282a5f3be
8 changed files with 91 additions and 40 deletions

View File

@ -139,9 +139,13 @@ lm87
lm90 lm90
lm90 2 - - - yes no lm90 2 - - - yes no
lm99 2 - - - yes no lm99 2 - - - yes no
lm86 2 - - - yes no
adm1032 2 - - - yes no adm1032 2 - - - yes no
max6657 2 - - - yes no
(lm89 is detected as an lm99) (lm89 is detected as an lm99)
lm89 2 - - - yes no lm89 2 - - - yes no
(max6658 is detected as a max6657)
max6658 2 - - - yes no
lm92 lm92
(all are reported as an "lm92") (all are reported as an "lm92")

View File

@ -19,11 +19,26 @@ Supported chips:
Addresses scanned: I2C 0x4c and 0x4d Addresses scanned: I2C 0x4c and 0x4d
Datasheet: Publicly available at the National Semiconductor website Datasheet: Publicly available at the National Semiconductor website
http://www.national.com/pf/LM/LM99.html http://www.national.com/pf/LM/LM99.html
* National Semiconductor LM86
Prefix: `lm86'
Addresses scanned: I2C 0x4c
Datasheet: Publicly available at the National Semiconductor website
http://www.national.com/pf/LM/LM86.html
* Analog Devices ADM1032 * Analog Devices ADM1032
Prefix: `adm1032' Prefix: `adm1032'
Addresses scanned: I2C 0x4c Addresses scanned: I2C 0x4c
Datasheet: Publicly available at the Analog Devices website Datasheet: Publicly available at the Analog Devices website
http://products.analog.com/products/info.asp?product=ADM1032 http://products.analog.com/products/info.asp?product=ADM1032
* Maxim MAX6657
Prefix: `max6657'
Addresses scanned: I2C 0x4c
Datasheet: Publicly available at the Maxim website
http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2578
* Maxim MAX6658
Prefix: `max6657'
Addresses scanned: I2C 0x4c
Datasheet: Publicly available at the Maxim website
http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2578
Author: Jean Delvare <khali@linux-fr.org> Author: Jean Delvare <khali@linux-fr.org>
@ -45,6 +60,12 @@ Module Parameters
* force_lm99: short array (min = 1, max = 48) * force_lm99: short array (min = 1, max = 48)
List of adapter,address pairs which are unquestionably assumed to contain List of adapter,address pairs which are unquestionably assumed to contain
a `lm99' chip a `lm99' chip
* force_lm86: short array (min = 1, max = 48)
List of adapter,address pairs which are unquestionably assumed to contain
a `lm86' chip
* force_max6657: short array (min = 1, max = 48)
List of adapter,address pairs which are unquestionably assumed to contain
a `max6657' chip
* probe: short array (min = 1, max = 48) * probe: short array (min = 1, max = 48)
List of adapter,address pairs to scan additionally List of adapter,address pairs to scan additionally
* probe_range: short array (min = 1, max = 48) * probe_range: short array (min = 1, max = 48)
@ -61,8 +82,7 @@ Description
The LM90 is a digital temperature sensor. It senses its own temperature as The LM90 is a digital temperature sensor. It senses its own temperature as
well as the temperature of up to one external diode. It is compatible well as the temperature of up to one external diode. It is compatible
with many other devices such as the LM86, the LM89, the LM99, the ADM1032, with many other devices such as the LM86, the LM89, the LM99, the ADM1032,
the MAX6657 and the MAX6658. Of these, only the ADM1032, LM89 and LM99 are the MAX6657 and the MAX6658, all of which are supported by this driver.
supported for now, but the others can be forced (and later added).
The specificity of this family of chipsets over the ADM1021/LM84 The specificity of this family of chipsets over the ADM1021/LM84
family is that it features critical limits with hysteresis, and an family is that it features critical limits with hysteresis, and an
@ -77,7 +97,7 @@ LM90:
* Filter and alert configuration register at 0xBF. * Filter and alert configuration register at 0xBF.
* ALERT is triggered by temperatures over critical limits. * ALERT is triggered by temperatures over critical limits.
LM89: LM86 and LM89:
* Same as LM90 * Same as LM90
* Better external channel accuracy * Better external channel accuracy
@ -91,6 +111,9 @@ ADM1032:
* Up to 64 conversions/s. * Up to 64 conversions/s.
* ALERT is triggered by open remote sensor. * ALERT is triggered by open remote sensor.
MAX6657 and MAX6658:
* Remote sensor type selecion
All temperature values are given in degrees Celcius. Resolution All temperature values are given in degrees Celcius. Resolution
is 1.0 degree for the local temperature, 0.125 degree for the remote is 1.0 degree for the local temperature, 0.125 degree for the remote
temperature. temperature.
@ -110,7 +133,7 @@ other second; reading them more often will do no harm, but will return
Chip Features Chip Features
------------- -------------
Chips 'lm90', adm1032' and 'lm99' Chips 'lm90', adm1032', 'lm99', 'lm86' and 'max6657'
LABEL LABEL CLASS COMPUTE CLASS MODE MAGN LABEL LABEL CLASS COMPUTE CLASS MODE MAGN
temp1 - - R- 0 temp1 - - R- 0

View File

@ -1733,7 +1733,7 @@ chip "max1619-*"
set temp2_hyst 40 set temp2_hyst 40
chip "lm90-*" "adm1032-*" chip "lm90-*" "adm1032-*" "lm86-*" "max6657-*"
label temp1 "M/B Temp" label temp1 "M/B Temp"
label temp2 "CPU Temp" label temp2 "CPU Temp"

View File

@ -21,11 +21,26 @@
* http://www.national.com/pf/LM/LM99.html * http://www.national.com/pf/LM/LM99.html
* Note that there is no way to differenciate between both chips. * Note that there is no way to differenciate between both chips.
* *
* This driver also supports the LM86, another sensor chip made by
* National Semiconductor. It is exactly similar to the LM90 except it
* has a higher accuracy.
* Complete datasheet can be obtained from National's website at:
* http://www.national.com/pf/LM/LM86.html
*
* This driver also supports the ADM1032, a sensor chip made by Analog * This driver also supports the ADM1032, a sensor chip made by Analog
* Devices. That chip is similar to the LM90, with a few differences * Devices. That chip is similar to the LM90, with a few differences
* that are not handled by this driver. Complete datasheet can be * that are not handled by this driver. Complete datasheet can be
* obtained from Analog's website at: * obtained from Analog's website at:
* http://products.analog.com/products/info.asp?product=ADM1032 * http://products.analog.com/products/info.asp?product=ADM1032
* Among others, it has a higher accuracy than the LM90, much like the
* LM86 does.
*
* This driver also supports the MAX6657 and MAX6658, sensor chips made
* by Maxim. These chips are similar to the LM86. Complete datasheet
* can be obtained at Maxim's website at:
* http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2578
* Note that there is no way to differenciate between both chips (but
* no need either).
* *
* Since the LM90 was the first chipset supported by this driver, most * Since the LM90 was the first chipset supported by this driver, most
* comments will refer to this chipset, but are actually general and * comments will refer to this chipset, but are actually general and
@ -60,7 +75,7 @@
/* /*
* Addresses to scan * Addresses to scan
* Address is fully defined internally and cannot be changed. * Address is fully defined internally and cannot be changed.
* LM89, LM90, LM99 and ADM1032 have address 0x4c. * LM86, LM89, LM90, LM99, ADM1032, MAX6657 and MAX6658 have address 0x4c.
* LM89-1, and LM99-1 have address 0x4d. * LM89-1, and LM99-1 have address 0x4d.
*/ */
@ -73,7 +88,7 @@ static unsigned int normal_isa_range[] = { SENSORS_ISA_END };
* Insmod parameters * Insmod parameters
*/ */
SENSORS_INSMOD_3(lm90, adm1032, lm99); SENSORS_INSMOD_5(lm90, adm1032, lm99, lm86, max6657);
/* /*
* The LM90 registers * The LM90 registers
@ -260,7 +275,6 @@ static int lm90_detect(struct i2c_adapter *adapter, int address,
int err = 0; int err = 0;
const char *type_name = ""; const char *type_name = "";
const char *client_name = ""; const char *client_name = "";
u8 reg_config1=0, reg_convrate=0;
#ifdef DEBUG #ifdef DEBUG
if (i2c_is_isa_adapter(adapter)) if (i2c_is_isa_adapter(adapter))
@ -309,32 +323,22 @@ static int lm90_detect(struct i2c_adapter *adapter, int address,
* are skipped. * are skipped.
*/ */
if (kind < 0) /* detection */ /* Default to an LM90 if forced */
{ if (kind == 0)
reg_config1 = i2c_smbus_read_byte_data(new_client, kind = lm90;
LM90_REG_R_CONFIG1);
reg_convrate = i2c_smbus_read_byte_data(new_client,
LM90_REG_R_CONVRATE);
if ((reg_config1 & 0x2A) != 0x00 if (kind < 0) /* detection and identification */
|| reg_convrate > 0x0A)
{ {
#ifdef DEBUG u8 man_id, chip_id, reg_config1, reg_convrate;
printk(KERN_DEBUG "lm90.o: Detection failed at 0x%02x.\n",
address);
#endif
goto ERROR1;
}
}
if (kind <= 0) /* identification */
{
u8 man_id, chip_id;
man_id = i2c_smbus_read_byte_data(new_client, man_id = i2c_smbus_read_byte_data(new_client,
LM90_REG_R_MAN_ID); LM90_REG_R_MAN_ID);
chip_id = i2c_smbus_read_byte_data(new_client, chip_id = i2c_smbus_read_byte_data(new_client,
LM90_REG_R_CHIP_ID); LM90_REG_R_CHIP_ID);
reg_config1 = i2c_smbus_read_byte_data(new_client,
LM90_REG_R_CONFIG1);
reg_convrate = i2c_smbus_read_byte_data(new_client,
LM90_REG_R_CONVRATE);
if (man_id == 0x01) /* National Semiconductor */ if (man_id == 0x01) /* National Semiconductor */
{ {
@ -343,30 +347,34 @@ static int lm90_detect(struct i2c_adapter *adapter, int address,
reg_config2 = i2c_smbus_read_byte_data(new_client, reg_config2 = i2c_smbus_read_byte_data(new_client,
LM90_REG_R_CONFIG2); LM90_REG_R_CONFIG2);
if (kind == 0 /* skip detection */ if ((reg_config1 & 0x2A) == 0x00
|| ((reg_config2 & 0xF8) == 0x00 && (reg_config2 & 0xF8) == 0x00
&& reg_convrate <= 0x09)) && reg_convrate <= 0x09)
{ {
if (address == 0x4C if (address == 0x4C
&& (chip_id & 0xF0) == 0x20) /* LM90 */ && (chip_id & 0xF0) == 0x20) /* LM90 */
{
kind = lm90; kind = lm90;
}
else if ((chip_id & 0xF0) == 0x30) /* LM89/LM99 */ else if ((chip_id & 0xF0) == 0x30) /* LM89/LM99 */
{
kind = lm99; kind = lm99;
} else if (address == 0x4C
&& (chip_id & 0xF0) == 0x10) /* LM86 */
kind = lm99;
} }
} }
else if (man_id == 0x41) /* Analog Devices */ else if (man_id == 0x41) /* Analog Devices */
{ {
if (address == 0x4C if (address == 0x4C
&& (chip_id & 0xF0) == 0x40 /* ADM1032 */ && (chip_id & 0xF0) == 0x40 /* ADM1032 */
&& (kind == 0 /* skip detection */ && (reg_config1 & 0x3F) == 0x00
|| (reg_config1 & 0x3F) == 0x00)) && reg_convrate <= 0x0A)
{
kind = adm1032; kind = adm1032;
} }
else if (man_id == 0x4D) /* Maxim */
{
if (address == 0x4C
&& (reg_config1 & 0x1F) == 0
&& reg_convrate <= 0x09)
kind = max6657;
} }
} }
@ -391,6 +399,16 @@ static int lm90_detect(struct i2c_adapter *adapter, int address,
type_name = "lm99"; type_name = "lm99";
client_name = "LM99 chip"; client_name = "LM99 chip";
} }
else if (kind == lm86)
{
type_name = "lm86";
client_name = "LM86 chip";
}
else if (kind == max6657)
{
type_name = "max6657";
client_name = "MAX6657 chip";
}
else else
{ {
printk("lm90.o: Unknown kind %d.\n", kind); printk("lm90.o: Unknown kind %d.\n", kind);

View File

@ -5214,6 +5214,8 @@ sensors_chip_features sensors_chip_features_list[] =
{ SENSORS_LM90_PREFIX, lm90_features }, { SENSORS_LM90_PREFIX, lm90_features },
{ SENSORS_ADM1032_PREFIX, lm90_features }, { SENSORS_ADM1032_PREFIX, lm90_features },
{ SENSORS_LM99_PREFIX, lm90_features }, { SENSORS_LM99_PREFIX, lm90_features },
{ SENSORS_LM86_PREFIX, lm90_features },
{ SENSORS_MAX6657_PREFIX, lm90_features },
{ SENSORS_MAX1619_PREFIX, max1619_features }, { SENSORS_MAX1619_PREFIX, max1619_features },
{ SENSORS_XEONTEMP_PREFIX, xeontemp_features }, { SENSORS_XEONTEMP_PREFIX, xeontemp_features },
{ SENSORS_MAX6650_PREFIX, max6650_features }, { SENSORS_MAX6650_PREFIX, max6650_features },

View File

@ -475,11 +475,13 @@
#define SENSORS_LM85_ZONE3_RANGE 100 /* RW -- zone3_range */ #define SENSORS_LM85_ZONE3_RANGE 100 /* RW -- zone3_range */
#define SENSORS_LM85_ZONE3_SMOOTH 101 /* RW -- zone3_smooth */ #define SENSORS_LM85_ZONE3_SMOOTH 101 /* RW -- zone3_smooth */
/* LM89/LM90/LM99/ADM1032 chips */ /* LM86/LM89/LM90/LM99/ADM1032/MAX6657 chips */
#define SENSORS_LM90_PREFIX "lm90" #define SENSORS_LM90_PREFIX "lm90"
#define SENSORS_ADM1032_PREFIX "adm1032" #define SENSORS_ADM1032_PREFIX "adm1032"
#define SENSORS_LM99_PREFIX "lm99" #define SENSORS_LM99_PREFIX "lm99"
#define SENSORS_LM86_PREFIX "lm86"
#define SENSORS_MAX6657_PREFIX "max6657"
#define SENSORS_LM90_LOCAL_TEMP 51 /* R */ #define SENSORS_LM90_LOCAL_TEMP 51 /* R */
#define SENSORS_LM90_LOCAL_HIGH 52 /* RW */ #define SENSORS_LM90_LOCAL_HIGH 52 /* RW */

View File

@ -1218,7 +1218,7 @@ use subs qw(mtp008_detect lm78_detect lm78_isa_detect lm78_alias_detect
}, },
{ {
name => "Maxim MAX6657/MAX6658/MAX6659", name => "Maxim MAX6657/MAX6658/MAX6659",
driver => "to-be-written", driver => "lm90",
i2c_addrs => [0x4c], i2c_addrs => [0x4c],
i2c_detect => sub { lm90_detect 4, @_ }, i2c_detect => sub { lm90_detect 4, @_ },
}, },

View File

@ -424,6 +424,8 @@ struct match matches[] = {
{ "lm90", print_lm90 }, { "lm90", print_lm90 },
{ "adm1032", print_lm90 }, { "adm1032", print_lm90 },
{ "lm99", print_lm90 }, { "lm99", print_lm90 },
{ "lm86", print_lm90 },
{ "max6657", print_lm90 },
{ "xeontemp", print_xeontemp }, { "xeontemp", print_xeontemp },
{ "max6650", print_max6650 }, { "max6650", print_max6650 },
{ "asb100", print_asb100 }, { "asb100", print_asb100 },