Skip to content

Commit

Permalink
hwmon: (lm90) Add support for ADM1021, ADM1021A, and ADM1023
Browse files Browse the repository at this point in the history
Both chips are quite similar to other chips of this series, so add
support for them to the lm90 driver. Also mention ON Semiconductor NCT210,
which is pin and register compatible to ADM1021A.

None of the chips support the secondary manufacturer and chip ID registers
at 0x3e and 0x3f, but return 0 when reading from those registers.
Use that information to improve the accuracy of chip detection code.

Devicetree nodes are not added for the added chips since it is quite
unlikely that such old chips will ever be used in a devicetree based
system. They can be added later if needed.

Signed-off-by: Guenter Roeck <linux@roeck-us.net>
  • Loading branch information
groeck committed Jul 13, 2022
1 parent c09472f commit 0c6bffd
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 8 deletions.
23 changes: 22 additions & 1 deletion Documentation/hwmon/lm90.rst
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,22 @@ Supported chips:

http://www.national.com/mpf/LM/LM86.html

* Analog Devices ADM1021

Prefix: 'adm1021'

Addresses scanned: I2C 0x18 - 0x1a, 0x29 - 0x2b, 0x4c - 0x4e

Datasheet: Publicly available at the Analog Devices website

* Analog Devices ADM1021A/ADM1023

Prefix: 'adm1023'

Addresses scanned: I2C 0x18 - 0x1a, 0x29 - 0x2b, 0x4c - 0x4e

Datasheet: Publicly available at the Analog Devices website

* Analog Devices ADM1032

Prefix: 'adm1032'
Expand Down Expand Up @@ -369,10 +385,15 @@ features:
LM84:
* 8 bit sensor resolution

MAX1617:
ADM1021, MAX1617:
* 8 bit sensor resolution
* Low temperature limits

ADM1021A, ADM1023:
* Temperature offset register for remote temperature sensor
* 11 bit resolution for remote temperature sensor
* Low temperature limits

LM90:
* 11 bit resolution for remote temperature sensor
* Temperature offset register for remote temperature sensor
Expand Down
4 changes: 2 additions & 2 deletions drivers/hwmon/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -1359,8 +1359,8 @@ config SENSORS_LM90
depends on I2C
help
If you say yes here you get support for National Semiconductor LM84,
LM90, LM86, LM89 and LM99, Analog Devices ADM1032, ADT7461, ADT7461A,
ADT7481, ADT7482, and ADT7483A,
LM90, LM86, LM89 and LM99, Analog Devices ADM2021, ADM1021A, ADM1023,
ADM1032, ADT7461, ADT7461A, ADT7481, ADT7482, and ADT7483A,
Maxim MAX1617, MAX6642, MAX6646, MAX6647, MAX6648, MAX6649, MAX6654,
MAX6657, MAX6658, MAX6659, MAX6680, MAX6681, MAX6692, MAX6695,
MAX6696,
Expand Down
47 changes: 42 additions & 5 deletions drivers/hwmon/lm90.c
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,8 @@ static const unsigned short normal_i2c[] = {
0x18, 0x19, 0x1a, 0x29, 0x2a, 0x2b, 0x48, 0x49, 0x4a, 0x4b, 0x4c,
0x4d, 0x4e, 0x4f, I2C_CLIENT_END };

enum chips { adm1032, adt7461, adt7461a, adt7481, g781, lm84, lm86, lm90, lm99,
enum chips { adm1023, adm1032, adt7461, adt7461a, adt7481,
g781, lm84, lm86, lm90, lm99,
max1617, max6642, max6646, max6648, max6654, max6657, max6659, max6680, max6696,
sa56004, tmp451, tmp461, w83l771,
};
Expand Down Expand Up @@ -223,6 +224,8 @@ enum chips { adm1032, adt7461, adt7461a, adt7481, g781, lm84, lm86, lm90, lm99,
*/

static const struct i2c_device_id lm90_id[] = {
{ "adm1021", max1617 },
{ "adm1023", adm1023 },
{ "adm1032", adm1032 },
{ "adt7461", adt7461 },
{ "adt7461a", adt7461a },
Expand Down Expand Up @@ -375,6 +378,14 @@ struct lm90_params {
};

static const struct lm90_params lm90_params[] = {
[adm1023] = {
.flags = LM90_HAVE_ALARMS | LM90_HAVE_OFFSET | LM90_HAVE_BROKEN_ALERT
| LM90_HAVE_REM_LIMIT_EXT | LM90_HAVE_LOW | LM90_HAVE_CONVRATE
| LM90_HAVE_REMOTE_EXT,
.alert_alarms = 0x7c,
.resolution = 8,
.max_convrate = 7,
},
[adm1032] = {
.flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT
| LM90_HAVE_BROKEN_ALERT | LM90_HAVE_CRIT
Expand Down Expand Up @@ -1742,19 +1753,43 @@ static const char *lm90_detect_national(struct i2c_client *client, int chip_id,
return name;
}

static const char *lm90_detect_analog(struct i2c_client *client, int chip_id,
int config1, int convrate)
static const char *lm90_detect_analog(struct i2c_client *client, bool common_address,
int chip_id, int config1, int convrate)
{
int status = i2c_smbus_read_byte_data(client, LM90_REG_STATUS);
int config2 = i2c_smbus_read_byte_data(client, ADT7481_REG_CONFIG2);
int man_id2 = i2c_smbus_read_byte_data(client, ADT7481_REG_MAN_ID);
int chip_id2 = i2c_smbus_read_byte_data(client, ADT7481_REG_CHIP_ID);
int address = client->addr;
const char *name = NULL;

if (config2 < 0 || man_id2 < 0 || chip_id2 < 0)
if (status < 0 || config2 < 0 || man_id2 < 0 || chip_id2 < 0)
return NULL;

switch (chip_id) {
case 0x00 ... 0x0f: /* ADM1021, undocumented */
if (man_id2 == 0x00 && chip_id2 == 0x00 && common_address &&
!(status & 0x03) && !(config1 & 0x3f) && !(convrate & 0xf8))
name = "adm1021";
break;
case 0x30 ... 0x3f: /* ADM1021A, ADM1023 */
/*
* ADM1021A and compatible chips will be mis-detected as
* ADM1023. Chips labeled 'ADM1021A' and 'ADM1023' were both
* found to have a Chip ID of 0x3c.
* ADM1021A does not officially support low byte registers
* (0x12 .. 0x14), but a chip labeled ADM1021A does support it.
* Official support for the temperature offset high byte
* register (0x11) was added to revision F of the ADM1021A
* datasheet.
* It is currently unknown if there is a means to distinguish
* ADM1021A from ADM1023, and/or if revisions of ADM1021A exist
* which differ in functionality from ADM1023.
*/
if (man_id2 == 0x00 && chip_id2 == 0x00 && common_address &&
!(status & 0x03) && !(config1 & 0x3f) && !(convrate & 0xf8))
name = "adm1023";
break;
case 0x40 ... 0x4f: /* ADM1032 */
if (man_id2 == 0x00 && chip_id2 == 0x00 &&
(address == 0x4c || address == 0x4d) && !(config1 & 0x3f) &&
Expand Down Expand Up @@ -1795,6 +1830,7 @@ static const char *lm90_detect_analog(struct i2c_client *client, int chip_id,
break;
case 0x94: /* ADT7483 */
if (man_id2 == 0x41 && chip_id2 == 0x83 &&
common_address &&
((address >= 0x18 && address <= 0x1a) ||
(address >= 0x29 && address <= 0x2b) ||
(address >= 0x4c && address <= 0x4e)) &&
Expand Down Expand Up @@ -2175,7 +2211,8 @@ static int lm90_detect(struct i2c_client *client, struct i2c_board_info *info)
name = lm90_detect_national(client, chip_id, config1, convrate);
break;
case 0x41: /* Analog Devices */
name = lm90_detect_analog(client, chip_id, config1, convrate);
name = lm90_detect_analog(client, common_address, chip_id, config1,
convrate);
break;
case 0x47: /* GMT */
name = lm90_detect_gmt(client, chip_id, config1, convrate);
Expand Down

0 comments on commit 0c6bffd

Please sign in to comment.