[PATCH] lm83: Add LM82 support
Jordan Crouse [Thu, 23 Mar 2006 15:19:49 +0000 (16:19 +0100)]
Add LM82 temperature sensor support (similar to the LM83,
but less featureful).

Signed-off-by: Jordan Crouse <jordan.crouse@amd.com>
Signed-off-by: Jean Delvare <khali@linux-fr.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

Documentation/hwmon/lm83
drivers/hwmon/Kconfig
drivers/hwmon/lm83.c

index 061d9ed..74aa7ee 100644 (file)
@@ -7,6 +7,10 @@ Supported chips:
     Addresses scanned: I2C 0x18 - 0x1a, 0x29 - 0x2b, 0x4c - 0x4e
     Datasheet: Publicly available at the National Semiconductor website
                http://www.national.com/pf/LM/LM83.html
+  * National Semiconductor LM82
+    Addresses scanned: I2C 0x18 - 0x1a, 0x29 - 0x2b, 0x4c - 0x4e
+    Datasheet: Publicly available at the National Semiconductor website
+               http://www.national.com/pf/LM/LM82.html
 
 
 Author: Jean Delvare <khali@linux-fr.org>
@@ -15,10 +19,11 @@ Description
 -----------
 
 The LM83 is a digital temperature sensor. It senses its own temperature as
-well as the temperature of up to three external diodes. It is compatible
-with many other devices such as the LM84 and all other ADM1021 clones.
-The main difference between the LM83 and the LM84 in that the later can
-only sense the temperature of one external diode.
+well as the temperature of up to three external diodes. The LM82 is
+a stripped down version of the LM83 that only supports one external diode.
+Both are compatible with many other devices such as the LM84 and all
+other ADM1021 clones. The main difference between the LM83 and the LM84
+in that the later can only sense the temperature of one external diode.
 
 Using the adm1021 driver for a LM83 should work, but only two temperatures
 will be reported instead of four.
@@ -36,6 +41,9 @@ Unconfirmed motherboards:
     Iwill       MPX2
     Soltek      SL-75DRV5
 
+The LM82 is confirmed to have been found on most AMD Geode reference
+designs and test platforms.
+
 The driver has been successfully tested by Magnus Forsström, who I'd
 like to thank here. More testers will be of course welcome.
 
index 99cdc61..a6a8d66 100644 (file)
@@ -236,11 +236,11 @@ config SENSORS_LM80
          will be called lm80.
 
 config SENSORS_LM83
-       tristate "National Semiconductor LM83"
+       tristate "National Semiconductor LM83 and compatibles"
        depends on HWMON && I2C
        help
          If you say yes here you get support for National Semiconductor
-         LM83 sensor chips.
+         LM82 and LM83 sensor chips.
 
          This driver can also be built as a module.  If so, the module
          will be called lm83.
index aac4ec2..2137d78 100644 (file)
  * Since the datasheet omits to give the chip stepping code, I give it
  * here: 0x03 (at register 0xff).
  *
+ * Also supports the LM82 temp sensor, which is basically a stripped down
+ * model of the LM83.  Datasheet is here:
+ * http://www.national.com/pf/LM/LM82.html
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -52,7 +56,7 @@ static unsigned short normal_i2c[] = { 0x18, 0x19, 0x1a,
  * Insmod parameters
  */
 
-I2C_CLIENT_INSMOD_1(lm83);
+I2C_CLIENT_INSMOD_2(lm83, lm82);
 
 /*
  * The LM83 registers
@@ -283,6 +287,9 @@ static int lm83_detect(struct i2c_adapter *adapter, int address, int kind)
                if (man_id == 0x01) { /* National Semiconductor */
                        if (chip_id == 0x03) {
                                kind = lm83;
+                       } else
+                       if (chip_id == 0x01) {
+                               kind = lm82;
                        }
                }
 
@@ -296,6 +303,9 @@ static int lm83_detect(struct i2c_adapter *adapter, int address, int kind)
 
        if (kind == lm83) {
                name = "lm83";
+       } else
+       if (kind == lm82) {
+               name = "lm82";
        }
 
        /* We can fill in the remaining client fields */
@@ -319,32 +329,46 @@ static int lm83_detect(struct i2c_adapter *adapter, int address, int kind)
                goto exit_detach;
        }
 
+       /*
+        * The LM82 can only monitor one external diode which is
+        * at the same register as the LM83 temp3 entry - so we
+        * declare 1 and 3 common, and then 2 and 4 only for the LM83.
+        */
+
        device_create_file(&new_client->dev,
                           &sensor_dev_attr_temp1_input.dev_attr);
        device_create_file(&new_client->dev,
-                          &sensor_dev_attr_temp2_input.dev_attr);
-       device_create_file(&new_client->dev,
                           &sensor_dev_attr_temp3_input.dev_attr);
-       device_create_file(&new_client->dev,
-                          &sensor_dev_attr_temp4_input.dev_attr);
+
        device_create_file(&new_client->dev,
                           &sensor_dev_attr_temp1_max.dev_attr);
        device_create_file(&new_client->dev,
-                          &sensor_dev_attr_temp2_max.dev_attr);
-       device_create_file(&new_client->dev,
                           &sensor_dev_attr_temp3_max.dev_attr);
-       device_create_file(&new_client->dev,
-                          &sensor_dev_attr_temp4_max.dev_attr);
+
        device_create_file(&new_client->dev,
                           &sensor_dev_attr_temp1_crit.dev_attr);
        device_create_file(&new_client->dev,
-                          &sensor_dev_attr_temp2_crit.dev_attr);
-       device_create_file(&new_client->dev,
                           &sensor_dev_attr_temp3_crit.dev_attr);
-       device_create_file(&new_client->dev,
-                          &sensor_dev_attr_temp4_crit.dev_attr);
+
        device_create_file(&new_client->dev, &dev_attr_alarms);
 
+       if (kind == lm83) {
+               device_create_file(&new_client->dev,
+                                  &sensor_dev_attr_temp2_input.dev_attr);
+               device_create_file(&new_client->dev,
+                                  &sensor_dev_attr_temp4_input.dev_attr);
+
+               device_create_file(&new_client->dev,
+                                  &sensor_dev_attr_temp2_max.dev_attr);
+               device_create_file(&new_client->dev,
+                                  &sensor_dev_attr_temp4_max.dev_attr);
+
+               device_create_file(&new_client->dev,
+                                  &sensor_dev_attr_temp2_crit.dev_attr);
+               device_create_file(&new_client->dev,
+                                  &sensor_dev_attr_temp4_crit.dev_attr);
+       }
+
        return 0;
 
 exit_detach: