[PATCH] lm83: Add LM82 support

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>
This commit is contained in:
Jordan Crouse 2006-03-23 16:19:49 +01:00 committed by Greg Kroah-Hartman
parent 52ab3f3dc7
commit 43cb7ebee2
3 changed files with 51 additions and 19 deletions

View File

@ -7,6 +7,10 @@ Supported chips:
Addresses scanned: I2C 0x18 - 0x1a, 0x29 - 0x2b, 0x4c - 0x4e Addresses scanned: I2C 0x18 - 0x1a, 0x29 - 0x2b, 0x4c - 0x4e
Datasheet: Publicly available at the National Semiconductor website Datasheet: Publicly available at the National Semiconductor website
http://www.national.com/pf/LM/LM83.html 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> 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 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 well as the temperature of up to three external diodes. The LM82 is
with many other devices such as the LM84 and all other ADM1021 clones. a stripped down version of the LM83 that only supports one external diode.
The main difference between the LM83 and the LM84 in that the later can Both are compatible with many other devices such as the LM84 and all
only sense the temperature of one external diode. 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 Using the adm1021 driver for a LM83 should work, but only two temperatures
will be reported instead of four. will be reported instead of four.
@ -36,6 +41,9 @@ Unconfirmed motherboards:
Iwill MPX2 Iwill MPX2
Soltek SL-75DRV5 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 The driver has been successfully tested by Magnus Forsström, who I'd
like to thank here. More testers will be of course welcome. like to thank here. More testers will be of course welcome.

View File

@ -236,11 +236,11 @@ config SENSORS_LM80
will be called lm80. will be called lm80.
config SENSORS_LM83 config SENSORS_LM83
tristate "National Semiconductor LM83" tristate "National Semiconductor LM83 and compatibles"
depends on HWMON && I2C depends on HWMON && I2C
help help
If you say yes here you get support for National Semiconductor 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 This driver can also be built as a module. If so, the module
will be called lm83. will be called lm83.

View File

@ -12,6 +12,10 @@
* Since the datasheet omits to give the chip stepping code, I give it * Since the datasheet omits to give the chip stepping code, I give it
* here: 0x03 (at register 0xff). * 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 * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or * 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 * Insmod parameters
*/ */
I2C_CLIENT_INSMOD_1(lm83); I2C_CLIENT_INSMOD_2(lm83, lm82);
/* /*
* The LM83 registers * 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 (man_id == 0x01) { /* National Semiconductor */
if (chip_id == 0x03) { if (chip_id == 0x03) {
kind = lm83; 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) { if (kind == lm83) {
name = "lm83"; name = "lm83";
} else
if (kind == lm82) {
name = "lm82";
} }
/* We can fill in the remaining client fields */ /* We can fill in the remaining client fields */
@ -319,31 +329,45 @@ static int lm83_detect(struct i2c_adapter *adapter, int address, int kind)
goto exit_detach; 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, device_create_file(&new_client->dev,
&sensor_dev_attr_temp1_input.dev_attr); &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, device_create_file(&new_client->dev,
&sensor_dev_attr_temp3_input.dev_attr); &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, device_create_file(&new_client->dev,
&sensor_dev_attr_temp1_max.dev_attr); &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, device_create_file(&new_client->dev,
&sensor_dev_attr_temp3_max.dev_attr); &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, device_create_file(&new_client->dev,
&sensor_dev_attr_temp1_crit.dev_attr); &sensor_dev_attr_temp1_crit.dev_attr);
device_create_file(&new_client->dev,
&sensor_dev_attr_temp3_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, device_create_file(&new_client->dev,
&sensor_dev_attr_temp2_crit.dev_attr); &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, device_create_file(&new_client->dev,
&sensor_dev_attr_temp4_crit.dev_attr); &sensor_dev_attr_temp4_crit.dev_attr);
device_create_file(&new_client->dev, &dev_attr_alarms); }
return 0; return 0;