hwmon: (lm73) Make detection less problematic
Word reads can cause trouble with some I2C devices, so do as much detection as we can using only byte reads, and only use a word read in the end to confirm the positive match. Also properly handle read errors. Signed-off-by: Jean Delvare <khali@linux-fr.org> Acked-by: Guenter Roeck <guenter.roeck@ericsson.com> Cc: Robert Casanova <robertcasanova@nanometrics.ca>
This commit is contained in:
parent
746cdfbf01
commit
24d6e2a89a
@ -150,17 +150,31 @@ static int lm73_detect(struct i2c_client *new_client,
|
|||||||
struct i2c_board_info *info)
|
struct i2c_board_info *info)
|
||||||
{
|
{
|
||||||
struct i2c_adapter *adapter = new_client->adapter;
|
struct i2c_adapter *adapter = new_client->adapter;
|
||||||
u16 id;
|
int id, ctrl, conf;
|
||||||
u8 ctrl;
|
|
||||||
|
|
||||||
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA |
|
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA |
|
||||||
I2C_FUNC_SMBUS_WORD_DATA))
|
I2C_FUNC_SMBUS_WORD_DATA))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Do as much detection as possible with byte reads first, as word
|
||||||
|
* reads can confuse other devices.
|
||||||
|
*/
|
||||||
|
ctrl = i2c_smbus_read_byte_data(new_client, LM73_REG_CTRL);
|
||||||
|
if (ctrl < 0 || (ctrl & 0x10))
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
conf = i2c_smbus_read_byte_data(new_client, LM73_REG_CONF);
|
||||||
|
if (conf < 0 || (conf & 0x0c))
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
id = i2c_smbus_read_byte_data(new_client, LM73_REG_ID);
|
||||||
|
if (id < 0 || id != (LM73_ID & 0xff))
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
/* Check device ID */
|
/* Check device ID */
|
||||||
id = i2c_smbus_read_word_data(new_client, LM73_REG_ID);
|
id = i2c_smbus_read_word_data(new_client, LM73_REG_ID);
|
||||||
ctrl = i2c_smbus_read_byte_data(new_client, LM73_REG_CTRL);
|
if (id < 0 || id != LM73_ID)
|
||||||
if ((id != LM73_ID) || (ctrl & 0x10))
|
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
strlcpy(info->type, "lm73", I2C_NAME_SIZE);
|
strlcpy(info->type, "lm73", I2C_NAME_SIZE);
|
||||||
|
Loading…
Reference in New Issue
Block a user