mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-16 05:50:19 +00:00
hwmon: (lm90) Add support for Philips SA56004
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>
This commit is contained in:
parent
f22aaaa70d
commit
2ef017935d
@ -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>
|
||||
|
||||
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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.
|
||||
@ -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
|
||||
@ -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 */
|
||||
|
||||
@ -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);
|
||||
@ -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[] = {
|
||||
@ -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,
|
||||
@ -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,
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
@ -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
|
||||
@ -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,
|
||||
@ -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 */
|
||||
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user