mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-09 23:00:21 +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'
|
Prefix: 'w83l771'
|
||||||
Addresses scanned: I2C 0x4c
|
Addresses scanned: I2C 0x4c
|
||||||
Datasheet: Not publicly available, can be requested from Nuvoton
|
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>
|
Author: Jean Delvare <khali@linux-fr.org>
|
||||||
|
|
||||||
@ -193,6 +197,9 @@ W83L771AWG/ASG
|
|||||||
* The AWG and ASG variants only differ in package format.
|
* The AWG and ASG variants only differ in package format.
|
||||||
* Diode ideality factor configuration (remote sensor) at 0xE3
|
* Diode ideality factor configuration (remote sensor) at 0xE3
|
||||||
|
|
||||||
|
SA56004X:
|
||||||
|
* Better local resolution
|
||||||
|
|
||||||
All temperature values are given in degrees Celsius. Resolution
|
All temperature values are given in degrees Celsius. Resolution
|
||||||
is 1.0 degree for the local temperature, 0.125 degree for the remote
|
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
|
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,
|
LM86, LM89 and LM99, Analog Devices ADM1032, ADT7461, and ADT7461A,
|
||||||
Maxim MAX6646, MAX6647, MAX6648, MAX6649, MAX6657, MAX6658, MAX6659,
|
Maxim MAX6646, MAX6647, MAX6648, MAX6649, MAX6657, MAX6658, MAX6659,
|
||||||
MAX6680, MAX6681, MAX6692, MAX6695, MAX6696, ON Semiconductor NCT1008,
|
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
|
This driver can also be built as a module. If so, the module
|
||||||
will be called lm90.
|
will be called lm90.
|
||||||
|
@ -54,6 +54,9 @@
|
|||||||
* and extended mode. They are mostly compatible with LM90 except for a data
|
* and extended mode. They are mostly compatible with LM90 except for a data
|
||||||
* format difference for the temperature value registers.
|
* 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
|
* Since the LM90 was the first chipset supported by this driver, most
|
||||||
* comments will refer to this chipset, but are actually general and
|
* comments will refer to this chipset, but are actually general and
|
||||||
* concern all supported chipsets, unless mentioned otherwise.
|
* concern all supported chipsets, unless mentioned otherwise.
|
||||||
@ -96,13 +99,15 @@
|
|||||||
* MAX6659 can have address 0x4c, 0x4d or 0x4e.
|
* MAX6659 can have address 0x4c, 0x4d or 0x4e.
|
||||||
* MAX6680 and MAX6681 can have address 0x18, 0x19, 0x1a, 0x29, 0x2a, 0x2b,
|
* MAX6680 and MAX6681 can have address 0x18, 0x19, 0x1a, 0x29, 0x2a, 0x2b,
|
||||||
* 0x4c, 0x4d or 0x4e.
|
* 0x4c, 0x4d or 0x4e.
|
||||||
|
* SA56004 can have address 0x48 through 0x4F.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static const unsigned short normal_i2c[] = {
|
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,
|
enum chips { lm90, adm1032, lm99, lm86, max6657, max6659, adt7461, max6680,
|
||||||
max6646, w83l771, max6696 };
|
max6646, w83l771, max6696, sa56004 };
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The LM90 registers
|
* 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_R_LOCAL_EMERG 0x17
|
||||||
#define MAX6659_REG_W_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_DEF_CONVRATE_RVAL 6 /* Def conversion rate register value */
|
||||||
#define LM90_MAX_CONVRATE_MS 16000 /* Maximum conversion rate in ms */
|
#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 },
|
{ "max6696", max6696 },
|
||||||
{ "nct1008", adt7461 },
|
{ "nct1008", adt7461 },
|
||||||
{ "w83l771", w83l771 },
|
{ "w83l771", w83l771 },
|
||||||
|
{ "sa56004", sa56004 },
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(i2c, lm90_id);
|
MODULE_DEVICE_TABLE(i2c, lm90_id);
|
||||||
@ -204,6 +214,8 @@ struct lm90_params {
|
|||||||
u16 alert_alarms; /* Which alarm bits trigger ALERT# */
|
u16 alert_alarms; /* Which alarm bits trigger ALERT# */
|
||||||
/* Upper 8 bits for max6695/96 */
|
/* Upper 8 bits for max6695/96 */
|
||||||
u8 max_convrate; /* Maximum conversion rate register value */
|
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[] = {
|
static const struct lm90_params lm90_params[] = {
|
||||||
@ -238,16 +250,19 @@ static const struct lm90_params lm90_params[] = {
|
|||||||
.flags = LM90_HAVE_LOCAL_EXT,
|
.flags = LM90_HAVE_LOCAL_EXT,
|
||||||
.alert_alarms = 0x7c,
|
.alert_alarms = 0x7c,
|
||||||
.max_convrate = 6,
|
.max_convrate = 6,
|
||||||
|
.reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL,
|
||||||
},
|
},
|
||||||
[max6657] = {
|
[max6657] = {
|
||||||
.flags = LM90_HAVE_LOCAL_EXT,
|
.flags = LM90_HAVE_LOCAL_EXT,
|
||||||
.alert_alarms = 0x7c,
|
.alert_alarms = 0x7c,
|
||||||
.max_convrate = 8,
|
.max_convrate = 8,
|
||||||
|
.reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL,
|
||||||
},
|
},
|
||||||
[max6659] = {
|
[max6659] = {
|
||||||
.flags = LM90_HAVE_LOCAL_EXT | LM90_HAVE_EMERGENCY,
|
.flags = LM90_HAVE_LOCAL_EXT | LM90_HAVE_EMERGENCY,
|
||||||
.alert_alarms = 0x7c,
|
.alert_alarms = 0x7c,
|
||||||
.max_convrate = 8,
|
.max_convrate = 8,
|
||||||
|
.reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL,
|
||||||
},
|
},
|
||||||
[max6680] = {
|
[max6680] = {
|
||||||
.flags = LM90_HAVE_OFFSET,
|
.flags = LM90_HAVE_OFFSET,
|
||||||
@ -259,12 +274,20 @@ static const struct lm90_params lm90_params[] = {
|
|||||||
| LM90_HAVE_EMERGENCY_ALARM | LM90_HAVE_TEMP3,
|
| LM90_HAVE_EMERGENCY_ALARM | LM90_HAVE_TEMP3,
|
||||||
.alert_alarms = 0x187c,
|
.alert_alarms = 0x187c,
|
||||||
.max_convrate = 6,
|
.max_convrate = 6,
|
||||||
|
.reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL,
|
||||||
},
|
},
|
||||||
[w83l771] = {
|
[w83l771] = {
|
||||||
.flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT,
|
.flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT,
|
||||||
.alert_alarms = 0x7c,
|
.alert_alarms = 0x7c,
|
||||||
.max_convrate = 8,
|
.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# */
|
u16 alert_alarms; /* Which alarm bits trigger ALERT# */
|
||||||
/* Upper 8 bits for max6695/96 */
|
/* Upper 8 bits for max6695/96 */
|
||||||
u8 max_convrate; /* Maximum conversion rate */
|
u8 max_convrate; /* Maximum conversion rate */
|
||||||
|
u8 reg_local_ext; /* local extension register offset */
|
||||||
|
|
||||||
/* registers values */
|
/* registers values */
|
||||||
s8 temp8[8]; /* 0: local low limit
|
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) {
|
if (data->flags & LM90_HAVE_LOCAL_EXT) {
|
||||||
lm90_read16(client, LM90_REG_R_LOCAL_TEMP,
|
lm90_read16(client, LM90_REG_R_LOCAL_TEMP,
|
||||||
MAX6657_REG_R_LOCAL_TEMPL,
|
data->reg_local_ext,
|
||||||
&data->temp11[4]);
|
&data->temp11[4]);
|
||||||
} else {
|
} else {
|
||||||
if (lm90_read_reg(client, LM90_REG_R_LOCAL_TEMP,
|
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";
|
name = "w83l771";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else
|
||||||
|
if (man_id == 0xA1) { /* NXP Semiconductor/Philips */
|
||||||
|
if (chip_id == 0x00 && address >= 0x48 && address <= 0x4F) {
|
||||||
|
name = "sa56004";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!name) { /* identification failed */
|
if (!name) { /* identification failed */
|
||||||
@ -1372,6 +1401,11 @@ static int lm90_probe(struct i2c_client *new_client,
|
|||||||
/* Set maximum conversion rate */
|
/* Set maximum conversion rate */
|
||||||
data->max_convrate = lm90_params[data->kind].max_convrate;
|
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 */
|
/* Initialize the LM90 chip */
|
||||||
lm90_init_client(new_client);
|
lm90_init_client(new_client);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user