Skip to content

Commit

Permalink
hwmon: (lm90) Add support for Philips SA56004
Browse files Browse the repository at this point in the history
Add support for Philips SA56004, an LM86 compatible temperature sensor.

Signed-off-by: Stijn Devriendt <sdevrien@cisco.com>
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
  • Loading branch information
Stijn Devriendt authored and Guenter Roeck committed Jul 28, 2011
1 parent f22aaaa commit 2ef0179
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 5 deletions.
9 changes: 8 additions & 1 deletion Documentation/hwmon/lm90
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,11 @@ Supported chips:
Prefix: 'w83l771'
Addresses scanned: I2C 0x4c
Datasheet: Not publicly available, can be requested from Nuvoton

* Philips/NXP SA56004X
Prefix: 'sa56004'
Addresses scanned: I2C 0x48 through 0x4F
Datasheet: Publicly available at NXP website
http://ics.nxp.com/products/interface/datasheet/sa56004x.pdf

Author: Jean Delvare <khali@linux-fr.org>

Expand Down Expand Up @@ -193,6 +197,9 @@ W83L771AWG/ASG
* The AWG and ASG variants only differ in package format.
* Diode ideality factor configuration (remote sensor) at 0xE3

SA56004X:
* Better local resolution

All temperature values are given in degrees Celsius. Resolution
is 1.0 degree for the local temperature, 0.125 degree for the remote
temperature, except for the MAX6657, MAX6658 and MAX6659 which have a
Expand Down
2 changes: 1 addition & 1 deletion drivers/hwmon/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -623,7 +623,7 @@ config SENSORS_LM90
LM86, LM89 and LM99, Analog Devices ADM1032, ADT7461, and ADT7461A,
Maxim MAX6646, MAX6647, MAX6648, MAX6649, MAX6657, MAX6658, MAX6659,
MAX6680, MAX6681, MAX6692, MAX6695, MAX6696, ON Semiconductor NCT1008,
and Winbond/Nuvoton W83L771W/G/AWG/ASG sensor chips.
Winbond/Nuvoton W83L771W/G/AWG/ASG and Philips SA56004 sensor chips.

This driver can also be built as a module. If so, the module
will be called lm90.
Expand Down
40 changes: 37 additions & 3 deletions drivers/hwmon/lm90.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@
* and extended mode. They are mostly compatible with LM90 except for a data
* format difference for the temperature value registers.
*
* This driver also supports the SA56004 from Philips. This device is
* pin-compatible with the LM86, the ED/EDP parts are also address-compatible.
*
* Since the LM90 was the first chipset supported by this driver, most
* comments will refer to this chipset, but are actually general and
* concern all supported chipsets, unless mentioned otherwise.
Expand Down Expand Up @@ -96,13 +99,15 @@
* MAX6659 can have address 0x4c, 0x4d or 0x4e.
* MAX6680 and MAX6681 can have address 0x18, 0x19, 0x1a, 0x29, 0x2a, 0x2b,
* 0x4c, 0x4d or 0x4e.
* SA56004 can have address 0x48 through 0x4F.
*/

static const unsigned short normal_i2c[] = {
0x18, 0x19, 0x1a, 0x29, 0x2a, 0x2b, 0x4c, 0x4d, 0x4e, I2C_CLIENT_END };
0x18, 0x19, 0x1a, 0x29, 0x2a, 0x2b, 0x48, 0x49, 0x4a, 0x4b, 0x4c,
0x4d, 0x4e, 0x4f, I2C_CLIENT_END };

enum chips { lm90, adm1032, lm99, lm86, max6657, max6659, adt7461, max6680,
max6646, w83l771, max6696 };
max6646, w83l771, max6696, sa56004 };

/*
* The LM90 registers
Expand Down Expand Up @@ -152,6 +157,10 @@ enum chips { lm90, adm1032, lm99, lm86, max6657, max6659, adt7461, max6680,
#define MAX6659_REG_R_LOCAL_EMERG 0x17
#define MAX6659_REG_W_LOCAL_EMERG 0x17

/* SA56004 registers */

#define SA56004_REG_R_LOCAL_TEMPL 0x22

#define LM90_DEF_CONVRATE_RVAL 6 /* Def conversion rate register value */
#define LM90_MAX_CONVRATE_MS 16000 /* Maximum conversion rate in ms */

Expand Down Expand Up @@ -192,6 +201,7 @@ static const struct i2c_device_id lm90_id[] = {
{ "max6696", max6696 },
{ "nct1008", adt7461 },
{ "w83l771", w83l771 },
{ "sa56004", sa56004 },
{ }
};
MODULE_DEVICE_TABLE(i2c, lm90_id);
Expand All @@ -204,6 +214,8 @@ struct lm90_params {
u16 alert_alarms; /* Which alarm bits trigger ALERT# */
/* Upper 8 bits for max6695/96 */
u8 max_convrate; /* Maximum conversion rate register value */
u8 reg_local_ext; /* Local extension register if
LM90_HAVE_LOCAL_EXT is set*/
};

static const struct lm90_params lm90_params[] = {
Expand Down Expand Up @@ -238,16 +250,19 @@ static const struct lm90_params lm90_params[] = {
.flags = LM90_HAVE_LOCAL_EXT,
.alert_alarms = 0x7c,
.max_convrate = 6,
.reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL,
},
[max6657] = {
.flags = LM90_HAVE_LOCAL_EXT,
.alert_alarms = 0x7c,
.max_convrate = 8,
.reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL,
},
[max6659] = {
.flags = LM90_HAVE_LOCAL_EXT | LM90_HAVE_EMERGENCY,
.alert_alarms = 0x7c,
.max_convrate = 8,
.reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL,
},
[max6680] = {
.flags = LM90_HAVE_OFFSET,
Expand All @@ -259,12 +274,20 @@ static const struct lm90_params lm90_params[] = {
| LM90_HAVE_EMERGENCY_ALARM | LM90_HAVE_TEMP3,
.alert_alarms = 0x187c,
.max_convrate = 6,
.reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL,
},
[w83l771] = {
.flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT,
.alert_alarms = 0x7c,
.max_convrate = 8,
},
[sa56004] = {
.flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT
| LM90_HAVE_LOCAL_EXT,
.alert_alarms = 0x7b,
.max_convrate = 9,
.reg_local_ext = SA56004_REG_R_LOCAL_TEMPL,
},
};

/*
Expand All @@ -286,6 +309,7 @@ struct lm90_data {
u16 alert_alarms; /* Which alarm bits trigger ALERT# */
/* Upper 8 bits for max6695/96 */
u8 max_convrate; /* Maximum conversion rate */
u8 reg_local_ext; /* local extension register offset */

/* registers values */
s8 temp8[8]; /* 0: local low limit
Expand Down Expand Up @@ -454,7 +478,7 @@ static struct lm90_data *lm90_update_device(struct device *dev)

if (data->flags & LM90_HAVE_LOCAL_EXT) {
lm90_read16(client, LM90_REG_R_LOCAL_TEMP,
MAX6657_REG_R_LOCAL_TEMPL,
data->reg_local_ext,
&data->temp11[4]);
} else {
if (lm90_read_reg(client, LM90_REG_R_LOCAL_TEMP,
Expand Down Expand Up @@ -1263,6 +1287,11 @@ static int lm90_detect(struct i2c_client *new_client,
name = "w83l771";
}
}
} else
if (man_id == 0xA1) { /* NXP Semiconductor/Philips */
if (chip_id == 0x00 && address >= 0x48 && address <= 0x4F) {
name = "sa56004";
}
}

if (!name) { /* identification failed */
Expand Down Expand Up @@ -1372,6 +1401,11 @@ static int lm90_probe(struct i2c_client *new_client,
/* Set maximum conversion rate */
data->max_convrate = lm90_params[data->kind].max_convrate;

if (data->flags & LM90_HAVE_LOCAL_EXT) {
data->reg_local_ext = lm90_params[data->kind].reg_local_ext;
WARN_ON(data->reg_local_ext == 0);
}

/* Initialize the LM90 chip */
lm90_init_client(new_client);

Expand Down

0 comments on commit 2ef0179

Please sign in to comment.