2
0
mirror of https://github.com/lm-sensors/lm-sensors synced 2025-09-02 23:35:57 +00:00

Support MAX6633, MAX6634, MAX6635 and LM76.

git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@2440 7894878c-1315-0410-8ee3-d5d059ff63e0
This commit is contained in:
Jean Delvare
2004-04-14 18:29:24 +00:00
parent 8756685f86
commit c7a33c464f
3 changed files with 59 additions and 6 deletions

View File

@@ -135,7 +135,13 @@ lm90
adm1032 2 - - - yes no adm1032 2 - - - yes no
lm92 lm92
(all are reported as an "lm92")
lm92 1 - - - yes no lm92 1 - - - yes no
max6633 1 - - - yes no
max6634 1 - - - yes no
max6635 1 - - - yes no
(lm76 needs force parameter)
lm76 1 - - - yes no
maxilife maxilife
maxilife-as 5 4 3 - yes no maxilife-as 5 4 3 - yes no

View File

@@ -7,6 +7,13 @@ Supported chips:
* National Semiconductors LM92 * National Semiconductors LM92
Prefix `lm92' Prefix `lm92'
Addresses scanned: I2C 0x48 - 0x4b (inclusive) Addresses scanned: I2C 0x48 - 0x4b (inclusive)
* National Semiconductors LM76
Prefix `lm92'
Addresses scanned: none, force parameter needed
* Maxim MAX6633/MAX6634/MAX6635
Prefix `lm92'
Addresses scanned: I2C 0x48 - 0x4f (inclusive)
MAX6633 with address in 0x40 - 0x47 needs force parameter
Author: Abraham van der Merwe <abraham@2d3d.co.za> Author: Abraham van der Merwe <abraham@2d3d.co.za>
@@ -46,6 +53,10 @@ control the thresholds for resetting alarms.
At the moment the driver controls these sensors in comparator mode and the At the moment the driver controls these sensors in comparator mode and the
interrupt pins (INT, T_CRIT_A) are ignored. interrupt pins (INT, T_CRIT_A) are ignored.
Support was added later for the LM76 and Maxim MAX6633/MAX6634/MAX6635,
which are mostly compatible. They have not all been tested, so you
may need to use the force parameter.
Hardware Configurations Hardware Configurations
----------------------- -----------------------

View File

@@ -107,7 +107,7 @@ static DECLARE_MUTEX (mutex);
/* addresses to scan */ /* addresses to scan */
static unsigned short normal_i2c[] = { SENSORS_I2C_END }; static unsigned short normal_i2c[] = { SENSORS_I2C_END };
static unsigned short normal_i2c_range[] = { 0x48, 0x4b, SENSORS_I2C_END }; static unsigned short normal_i2c_range[] = { 0x48, 0x4f, SENSORS_I2C_END };
static unsigned int normal_isa[] = { SENSORS_ISA_END }; static unsigned int normal_isa[] = { SENSORS_ISA_END };
static unsigned int normal_isa_range[] = { SENSORS_ISA_END }; static unsigned int normal_isa_range[] = { SENSORS_ISA_END };
@@ -231,6 +231,35 @@ static void lm92_alarms (struct i2c_client *client,int operation,int ctl_name,in
} }
} }
static int max6635_check(struct i2c_client *client)
{
int i;
u16 temp_low, temp_high, temp_hyst, temp_crit;
u8 conf;
temp_low = i2c_smbus_read_word_data(client, LM92_REG_TRIP_LOW);
temp_high = i2c_smbus_read_word_data(client, LM92_REG_TRIP_HIGH);
temp_hyst = i2c_smbus_read_word_data(client, LM92_REG_TRIP_HYSTERESIS);
temp_crit = i2c_smbus_read_word_data(client, LM92_REG_TRIP_CRITICAL);
if ((temp_low & 0x7f00) || (temp_high & 0x7f00)
|| (temp_hyst & 0x7f00) || (temp_crit & 0x7f00))
return 0;
conf = i2c_smbus_read_byte_data(client, LM92_REG_CONFIGURATION);
for (i=0; i<128; i+=16) {
if (temp_low != i2c_smbus_read_word_data(client, LM92_REG_TRIP_LOW + i)
|| temp_high != i2c_smbus_read_word_data(client, LM92_REG_TRIP_HIGH + i)
|| temp_hyst != i2c_smbus_read_word_data(client, LM92_REG_TRIP_HYSTERESIS + i)
|| temp_crit != i2c_smbus_read_word_data(client, LM92_REG_TRIP_CRITICAL + i)
|| conf != i2c_smbus_read_byte_data(client, LM92_REG_CONFIGURATION + i))
return 0;
}
return 1;
}
static int lm92_init_client (struct i2c_client *client) static int lm92_init_client (struct i2c_client *client)
{ {
lm92_t *data = (lm92_t *) client->data; lm92_t *data = (lm92_t *) client->data;
@@ -294,11 +323,18 @@ static int lm92_detect (struct i2c_adapter *adapter,int address,unsigned short f
return (-ERESTARTSYS); return (-ERESTARTSYS);
} }
if ((kind < 0 && lm92_read16 (client,LM92_REG_MANUFACTURER,&manufacturer) < 0) || if (kind < 0) {
manufacturer != LM92_MANUFACTURER_ID) { /* Is it an lm92? */
kfree (client); if (address < 0x4c
up (&mutex); && (lm92_read16(client,LM92_REG_MANUFACTURER,&manufacturer) < 0
return (-ENODEV); || manufacturer != LM92_MANUFACTURER_ID)) {
/* Is it a MAX6635/MAX6635/MAX6635? */
if (!max6635_check(client)) {
kfree (client);
up (&mutex);
return (-ENODEV);
}
}
} }
if ((result = i2c_attach_client (client))) { if ((result = i2c_attach_client (client))) {