Rework detection to take benefits of the no-register addresses

returning the last read value. Should prevent about any
        misdetection.


git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@2627 7894878c-1315-0410-8ee3-d5d059ff63e0
This commit is contained in:
Jean Delvare committed 2004-07-03 09:01:09 +00:00
1 parent eb4300426a
commit d6d0d33352
1 file changed
+32 -12
+32 -12
View File
@@ -106,7 +106,7 @@ static int lm75_attach_adapter(struct i2c_adapter *adapter)
int lm75_detect(struct i2c_adapter *adapter, int address,
unsigned short flags, int kind)
{
int i, cur, conf, hyst, os;
int i;
struct i2c_client *new_client;
struct lm75_data *data;
int err = 0;
@@ -141,22 +141,42 @@ int lm75_detect(struct i2c_adapter *adapter, int address,
new_client->driver = &lm75_driver;
new_client->flags = 0;
/* Now, we do the remaining detection. It is lousy. */
/* Now, we do the remaining detection. There is no identification-
dedicated register so we have to rely on several tricks:
unused bits, registers cycling over 8-address boundaries,
addresses 0x04-0x07 returning the last read value.
The cycling+unused addresses combination is not tested,
since it would significantly slow the detection down and would
hardly add any value. */
if (kind < 0) {
int cur, conf, hyst, os;
/* Unused addresses */
cur = i2c_smbus_read_word_data(new_client, 0);
conf = i2c_smbus_read_byte_data(new_client, 1);
hyst = i2c_smbus_read_word_data(new_client, 2);
if (i2c_smbus_read_word_data(new_client, 4) != hyst
|| i2c_smbus_read_word_data(new_client, 5) != hyst
|| i2c_smbus_read_word_data(new_client, 6) != hyst
|| i2c_smbus_read_word_data(new_client, 7) != hyst)
goto error1;
os = i2c_smbus_read_word_data(new_client, 3);
for (i = 0; i <= 0x1f; i++)
if (
(i2c_smbus_read_byte_data
(new_client, i * 8 + 1) != conf)
||
(i2c_smbus_read_word_data
(new_client, i * 8 + 2) != hyst)
||
(i2c_smbus_read_word_data
(new_client, i * 8 + 3) != os))
if (i2c_smbus_read_word_data(new_client, 4) != os
|| i2c_smbus_read_word_data(new_client, 5) != os
|| i2c_smbus_read_word_data(new_client, 6) != os
|| i2c_smbus_read_word_data(new_client, 7) != os)
goto error1;
/* Unused bits */
if ((conf & 0xe0) || (cur & 0x7f00) || (hyst & 0x7f00)
|| (os & 0x7f00))
goto error1;
/* Addresses cycling */
for (i = 8; i < 0xff; i += 8)
if (i2c_smbus_read_byte_data(new_client, i + 1) != conf
|| i2c_smbus_read_word_data(new_client, i + 2) != hyst
|| i2c_smbus_read_word_data(new_client, i + 3) != os)
goto error1;
}