hwmon: (lm95241) Add support for LM95231
authorGuenter Roeck <guenter.roeck@ericsson.com>
Tue, 5 Jul 2011 20:31:48 +0000 (13:31 -0700)
committerGuenter Roeck <guenter.roeck@ericsson.com>
Thu, 28 Jul 2011 07:17:35 +0000 (00:17 -0700)
LM95231 is fully compatible to LM95241; only necessary change is to add
chip detection.

Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Acked-by: Jean Delvare <khali@linux-fr.org>
drivers/hwmon/Kconfig
drivers/hwmon/lm95241.c

index 166889b..38c2adb 100644 (file)
@@ -694,10 +694,11 @@ config SENSORS_LTC4261
          be called ltc4261.
 
 config SENSORS_LM95241
-       tristate "National Semiconductor LM95241 sensor chip"
+       tristate "National Semiconductor LM95241 and compatibles"
        depends on I2C
        help
-         If you say yes here you get support for LM95241 sensor chip.
+         If you say yes here you get support for LM95231 and LM95241 sensor
+         chips.
 
          This driver can also be built as a module.  If so, the module
          will be called lm95241.
index d3b464b..513901d 100644 (file)
@@ -74,8 +74,9 @@ static const unsigned short normal_i2c[] = {
 #define TT_OFF 0
 #define TT_ON 1
 #define TT_MASK 7
-#define MANUFACTURER_ID 0x01
-#define DEFAULT_REVISION 0xA4
+#define NATSEMI_MAN_ID 0x01
+#define LM95231_CHIP_ID        0xA1
+#define LM95241_CHIP_ID        0xA4
 
 static const u8 lm95241_reg_address[] = {
        LM95241_REG_R_LOCAL_TEMPH,
@@ -338,20 +339,25 @@ static int lm95241_detect(struct i2c_client *new_client,
                          struct i2c_board_info *info)
 {
        struct i2c_adapter *adapter = new_client->adapter;
-       int address = new_client->addr;
        const char *name;
+       int mfg_id, chip_id;
 
        if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
                return -ENODEV;
 
-       if ((i2c_smbus_read_byte_data(new_client, LM95241_REG_R_MAN_ID)
-            == MANUFACTURER_ID)
-           && (i2c_smbus_read_byte_data(new_client, LM95241_REG_R_CHIP_ID)
-               == DEFAULT_REVISION)) {
-               name = DEVNAME;
-       } else {
-               dev_dbg(&adapter->dev, "LM95241 detection failed at 0x%02x\n",
-                       address);
+       mfg_id = i2c_smbus_read_byte_data(new_client, LM95241_REG_R_MAN_ID);
+       if (mfg_id != NATSEMI_MAN_ID)
+               return -ENODEV;
+
+       chip_id = i2c_smbus_read_byte_data(new_client, LM95241_REG_R_CHIP_ID);
+       switch (chip_id) {
+       case LM95231_CHIP_ID:
+               name = "lm95231";
+               break;
+       case LM95241_CHIP_ID:
+               name = "lm95241";
+               break;
+       default:
                return -ENODEV;
        }
 
@@ -431,7 +437,8 @@ static int lm95241_remove(struct i2c_client *client)
 
 /* Driver data (common to all clients) */
 static const struct i2c_device_id lm95241_id[] = {
-       { DEVNAME, 0 },
+       { "lm95231", 0 },
+       { "lm95241", 0 },
        { }
 };
 MODULE_DEVICE_TABLE(i2c, lm95241_id);