X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=sidebyside;f=drivers%2Fi2c%2Fchips%2Flm90.c;h=c3dd521c4303966edc1bd4d078c41ffd22312477;hb=9bf4aaab3e101692164d49b7ca357651eb691cb6;hp=f28b6679fe6d98c600b924034b1a5f8748659d06;hpb=db216c3d5e4c040e557a50f8f5d35d5c415e8c1c;p=linux-2.6.git diff --git a/drivers/i2c/chips/lm90.c b/drivers/i2c/chips/lm90.c index f28b6679f..c3dd521c4 100644 --- a/drivers/i2c/chips/lm90.c +++ b/drivers/i2c/chips/lm90.c @@ -21,11 +21,26 @@ * http://www.national.com/pf/LM/LM99.html * 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 * Devices. That chip is similar to the LM90, with a few differences * that are not handled by this driver. Complete datasheet can be * obtained from Analog's website at: * 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 * comments will refer to this chipset, but are actually general and @@ -56,7 +71,7 @@ /* * Addresses to scan * 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. */ @@ -69,7 +84,7 @@ static unsigned int normal_isa_range[] = { I2C_CLIENT_ISA_END }; * Insmod parameters */ -SENSORS_INSMOD_3(lm90, adm1032, lm99); +SENSORS_INSMOD_5(lm90, adm1032, lm99, lm86, max6657); /* * The LM90 registers @@ -289,7 +304,6 @@ static int lm90_detect(struct i2c_adapter *adapter, int address, int kind) struct lm90_data *data; int err = 0; const char *name = ""; - u8 reg_config1=0, reg_convrate=0; if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) goto exit; @@ -319,28 +333,22 @@ static int lm90_detect(struct i2c_adapter *adapter, int address, int kind) * requested, so both the detection and the identification steps * are skipped. */ - if (kind < 0) { /* detection */ - 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 ((reg_config1 & 0x2A) != 0x00 - || reg_convrate > 0x0A) { - dev_dbg(&adapter->dev, - "LM90 detection failed at 0x%02x.\n", - address); - goto exit_free; - } - } + /* Default to an LM90 if forced */ + if (kind == 0) + kind = lm90; - if (kind <= 0) { /* identification */ - u8 man_id, chip_id; + if (kind < 0) { /* detection and identification */ + u8 man_id, chip_id, reg_config1, reg_convrate; man_id = i2c_smbus_read_byte_data(new_client, LM90_REG_R_MAN_ID); chip_id = i2c_smbus_read_byte_data(new_client, 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 */ u8 reg_config2; @@ -348,25 +356,36 @@ static int lm90_detect(struct i2c_adapter *adapter, int address, int kind) reg_config2 = i2c_smbus_read_byte_data(new_client, LM90_REG_R_CONFIG2); - if (kind == 0 /* skip detection */ - || ((reg_config2 & 0xF8) == 0x00 - && reg_convrate <= 0x09)) { + if ((reg_config1 & 0x2A) == 0x00 + && (reg_config2 & 0xF8) == 0x00 + && reg_convrate <= 0x09) { if (address == 0x4C && (chip_id & 0xF0) == 0x20) { /* LM90 */ kind = lm90; } else if ((chip_id & 0xF0) == 0x30) { /* LM89/LM99 */ kind = lm99; + } else + if (address == 0x4C + && (chip_id & 0xF0) == 0x10) { /* LM86 */ + kind = lm86; } } } else if (man_id == 0x41) { /* Analog Devices */ if (address == 0x4C && (chip_id & 0xF0) == 0x40 /* ADM1032 */ - && (kind == 0 /* skip detection */ - || (reg_config1 & 0x3F) == 0x00)) { + && (reg_config1 & 0x3F) == 0x00 + && reg_convrate <= 0x0A) { kind = adm1032; } + } else + if (man_id == 0x4D) { /* Maxim */ + if (address == 0x4C + && (reg_config1 & 0x1F) == 0 + && reg_convrate <= 0x09) { + kind = max6657; + } } if (kind <= 0) { /* identification failed */ @@ -383,6 +402,10 @@ static int lm90_detect(struct i2c_adapter *adapter, int address, int kind) name = "adm1032"; } else if (kind == lm99) { name = "lm99"; + } else if (kind == lm86) { + name = "lm86"; + } else if (kind == max6657) { + name = "max6657"; } /* We can fill in the remaining client fields */