Commit c7bf71c5 authored by Guenter Roeck's avatar Guenter Roeck

hwmon: (lm93) Add support for LM94

This patch adds basic support for LM94 to the LM93 driver. LM94 specific
sensors and features are not supported.
Signed-off-by: default avatarGuenter Roeck <guenter.roeck@ericsson.com>
Acked-by: default avatarJean Delvare <khali@linux-fr.org>
parent a25cecce
...@@ -6,6 +6,10 @@ Supported chips: ...@@ -6,6 +6,10 @@ Supported chips:
Prefix 'lm93' Prefix 'lm93'
Addresses scanned: I2C 0x2c-0x2e Addresses scanned: I2C 0x2c-0x2e
Datasheet: http://www.national.com/ds.cgi/LM/LM93.pdf Datasheet: http://www.national.com/ds.cgi/LM/LM93.pdf
* National Semiconductor LM94
Prefix 'lm94'
Addresses scanned: I2C 0x2c-0x2e
Datasheet: http://www.national.com/ds.cgi/LM/LM94.pdf
Authors: Authors:
Mark M. Hoffman <mhoffman@lightlink.com> Mark M. Hoffman <mhoffman@lightlink.com>
...@@ -56,6 +60,9 @@ previous motherboard management ASICs and uses some of the LM85's features ...@@ -56,6 +60,9 @@ previous motherboard management ASICs and uses some of the LM85's features
for dynamic Vccp monitoring and PROCHOT. It is designed to monitor a dual for dynamic Vccp monitoring and PROCHOT. It is designed to monitor a dual
processor Xeon class motherboard with a minimum of external components. processor Xeon class motherboard with a minimum of external components.
LM94 is also supported in LM93 compatible mode. Extra sensors and features of
LM94 are not supported.
User Interface User Interface
-------------- --------------
......
...@@ -618,8 +618,8 @@ config SENSORS_LM93 ...@@ -618,8 +618,8 @@ config SENSORS_LM93
depends on I2C depends on I2C
select HWMON_VID select HWMON_VID
help help
If you say yes here you get support for National Semiconductor LM93 If you say yes here you get support for National Semiconductor LM93,
sensor chips. LM94, and compatible sensor chips.
This driver can also be built as a module. If so, the module This driver can also be built as a module. If so, the module
will be called lm93. will be called lm93.
......
...@@ -135,6 +135,11 @@ ...@@ -135,6 +135,11 @@
#define LM93_MFR_ID 0x73 #define LM93_MFR_ID 0x73
#define LM93_MFR_ID_PROTOTYPE 0x72 #define LM93_MFR_ID_PROTOTYPE 0x72
/* LM94 REGISTER VALUES */
#define LM94_MFR_ID_2 0x7a
#define LM94_MFR_ID 0x79
#define LM94_MFR_ID_PROTOTYPE 0x78
/* SMBus capabilities */ /* SMBus capabilities */
#define LM93_SMBUS_FUNC_FULL (I2C_FUNC_SMBUS_BYTE_DATA | \ #define LM93_SMBUS_FUNC_FULL (I2C_FUNC_SMBUS_BYTE_DATA | \
I2C_FUNC_SMBUS_WORD_DATA | I2C_FUNC_SMBUS_BLOCK_DATA) I2C_FUNC_SMBUS_WORD_DATA | I2C_FUNC_SMBUS_BLOCK_DATA)
...@@ -2504,6 +2509,7 @@ static int lm93_detect(struct i2c_client *client, struct i2c_board_info *info) ...@@ -2504,6 +2509,7 @@ static int lm93_detect(struct i2c_client *client, struct i2c_board_info *info)
{ {
struct i2c_adapter *adapter = client->adapter; struct i2c_adapter *adapter = client->adapter;
int mfr, ver; int mfr, ver;
const char *name;
if (!i2c_check_functionality(adapter, LM93_SMBUS_FUNC_MIN)) if (!i2c_check_functionality(adapter, LM93_SMBUS_FUNC_MIN))
return -ENODEV; return -ENODEV;
...@@ -2517,13 +2523,23 @@ static int lm93_detect(struct i2c_client *client, struct i2c_board_info *info) ...@@ -2517,13 +2523,23 @@ static int lm93_detect(struct i2c_client *client, struct i2c_board_info *info)
} }
ver = lm93_read_byte(client, LM93_REG_VER); ver = lm93_read_byte(client, LM93_REG_VER);
if (ver != LM93_MFR_ID && ver != LM93_MFR_ID_PROTOTYPE) { switch (ver) {
case LM93_MFR_ID:
case LM93_MFR_ID_PROTOTYPE:
name = "lm93";
break;
case LM94_MFR_ID_2:
case LM94_MFR_ID:
case LM94_MFR_ID_PROTOTYPE:
name = "lm94";
break;
default:
dev_dbg(&adapter->dev, dev_dbg(&adapter->dev,
"detect failed, bad version id 0x%02x!\n", ver); "detect failed, bad version id 0x%02x!\n", ver);
return -ENODEV; return -ENODEV;
} }
strlcpy(info->type, "lm93", I2C_NAME_SIZE); strlcpy(info->type, name, I2C_NAME_SIZE);
dev_dbg(&adapter->dev,"loading %s at %d,0x%02x\n", dev_dbg(&adapter->dev,"loading %s at %d,0x%02x\n",
client->name, i2c_adapter_id(client->adapter), client->name, i2c_adapter_id(client->adapter),
client->addr); client->addr);
...@@ -2602,6 +2618,7 @@ static int lm93_remove(struct i2c_client *client) ...@@ -2602,6 +2618,7 @@ static int lm93_remove(struct i2c_client *client)
static const struct i2c_device_id lm93_id[] = { static const struct i2c_device_id lm93_id[] = {
{ "lm93", 0 }, { "lm93", 0 },
{ "lm94", 0 },
{ } { }
}; };
MODULE_DEVICE_TABLE(i2c, lm93_id); MODULE_DEVICE_TABLE(i2c, lm93_id);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment