aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon
diff options
context:
space:
mode:
authorStijn Devriendt <sdevrien@cisco.com>2011-06-06 06:40:45 -0400
committerGuenter Roeck <guenter.roeck@ericsson.com>2011-07-28 03:17:34 -0400
commit2ef017935d698b1c7c7421a7ebe20579d8f904dd (patch)
tree5e7f4f2caefd14fd719c284bc2e901d73e88f99c /drivers/hwmon
parentf22aaaa70d8c24e5dc7d23a219c4beace8354b65 (diff)
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>
Diffstat (limited to 'drivers/hwmon')
-rw-r--r--drivers/hwmon/Kconfig2
-rw-r--r--drivers/hwmon/lm90.c40
2 files changed, 38 insertions, 4 deletions
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
index 770fc8195627..1396290a31a4 100644
--- a/drivers/hwmon/Kconfig
+++ b/drivers/hwmon/Kconfig
@@ -623,7 +623,7 @@ config SENSORS_LM90
623 LM86, LM89 and LM99, Analog Devices ADM1032, ADT7461, and ADT7461A, 623 LM86, LM89 and LM99, Analog Devices ADM1032, ADT7461, and ADT7461A,
624 Maxim MAX6646, MAX6647, MAX6648, MAX6649, MAX6657, MAX6658, MAX6659, 624 Maxim MAX6646, MAX6647, MAX6648, MAX6649, MAX6657, MAX6658, MAX6659,
625 MAX6680, MAX6681, MAX6692, MAX6695, MAX6696, ON Semiconductor NCT1008, 625 MAX6680, MAX6681, MAX6692, MAX6695, MAX6696, ON Semiconductor NCT1008,
626 and Winbond/Nuvoton W83L771W/G/AWG/ASG sensor chips. 626 Winbond/Nuvoton W83L771W/G/AWG/ASG and Philips SA56004 sensor chips.
627 627
628 This driver can also be built as a module. If so, the module 628 This driver can also be built as a module. If so, the module
629 will be called lm90. 629 will be called lm90.
diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
index 2f94f9504804..708bf0e7e4ac 100644
--- a/drivers/hwmon/lm90.c
+++ b/drivers/hwmon/lm90.c
@@ -54,6 +54,9 @@
54 * and extended mode. They are mostly compatible with LM90 except for a data 54 * and extended mode. They are mostly compatible with LM90 except for a data
55 * format difference for the temperature value registers. 55 * format difference for the temperature value registers.
56 * 56 *
57 * This driver also supports the SA56004 from Philips. This device is
58 * pin-compatible with the LM86, the ED/EDP parts are also address-compatible.
59 *
57 * Since the LM90 was the first chipset supported by this driver, most 60 * Since the LM90 was the first chipset supported by this driver, most
58 * comments will refer to this chipset, but are actually general and 61 * comments will refer to this chipset, but are actually general and
59 * concern all supported chipsets, unless mentioned otherwise. 62 * concern all supported chipsets, unless mentioned otherwise.
@@ -96,13 +99,15 @@
96 * MAX6659 can have address 0x4c, 0x4d or 0x4e. 99 * MAX6659 can have address 0x4c, 0x4d or 0x4e.
97 * MAX6680 and MAX6681 can have address 0x18, 0x19, 0x1a, 0x29, 0x2a, 0x2b, 100 * MAX6680 and MAX6681 can have address 0x18, 0x19, 0x1a, 0x29, 0x2a, 0x2b,
98 * 0x4c, 0x4d or 0x4e. 101 * 0x4c, 0x4d or 0x4e.
102 * SA56004 can have address 0x48 through 0x4F.
99 */ 103 */
100 104
101static const unsigned short normal_i2c[] = { 105static const unsigned short normal_i2c[] = {
102 0x18, 0x19, 0x1a, 0x29, 0x2a, 0x2b, 0x4c, 0x4d, 0x4e, I2C_CLIENT_END }; 106 0x18, 0x19, 0x1a, 0x29, 0x2a, 0x2b, 0x48, 0x49, 0x4a, 0x4b, 0x4c,
107 0x4d, 0x4e, 0x4f, I2C_CLIENT_END };
103 108
104enum chips { lm90, adm1032, lm99, lm86, max6657, max6659, adt7461, max6680, 109enum chips { lm90, adm1032, lm99, lm86, max6657, max6659, adt7461, max6680,
105 max6646, w83l771, max6696 }; 110 max6646, w83l771, max6696, sa56004 };
106 111
107/* 112/*
108 * The LM90 registers 113 * The LM90 registers
@@ -152,6 +157,10 @@ enum chips { lm90, adm1032, lm99, lm86, max6657, max6659, adt7461, max6680,
152#define MAX6659_REG_R_LOCAL_EMERG 0x17 157#define MAX6659_REG_R_LOCAL_EMERG 0x17
153#define MAX6659_REG_W_LOCAL_EMERG 0x17 158#define MAX6659_REG_W_LOCAL_EMERG 0x17
154 159
160/* SA56004 registers */
161
162#define SA56004_REG_R_LOCAL_TEMPL 0x22
163
155#define LM90_DEF_CONVRATE_RVAL 6 /* Def conversion rate register value */ 164#define LM90_DEF_CONVRATE_RVAL 6 /* Def conversion rate register value */
156#define LM90_MAX_CONVRATE_MS 16000 /* Maximum conversion rate in ms */ 165#define LM90_MAX_CONVRATE_MS 16000 /* Maximum conversion rate in ms */
157 166
@@ -192,6 +201,7 @@ static const struct i2c_device_id lm90_id[] = {
192 { "max6696", max6696 }, 201 { "max6696", max6696 },
193 { "nct1008", adt7461 }, 202 { "nct1008", adt7461 },
194 { "w83l771", w83l771 }, 203 { "w83l771", w83l771 },
204 { "sa56004", sa56004 },
195 { } 205 { }
196}; 206};
197MODULE_DEVICE_TABLE(i2c, lm90_id); 207MODULE_DEVICE_TABLE(i2c, lm90_id);
@@ -204,6 +214,8 @@ struct lm90_params {
204 u16 alert_alarms; /* Which alarm bits trigger ALERT# */ 214 u16 alert_alarms; /* Which alarm bits trigger ALERT# */
205 /* Upper 8 bits for max6695/96 */ 215 /* Upper 8 bits for max6695/96 */
206 u8 max_convrate; /* Maximum conversion rate register value */ 216 u8 max_convrate; /* Maximum conversion rate register value */
217 u8 reg_local_ext; /* Local extension register if
218 LM90_HAVE_LOCAL_EXT is set*/
207}; 219};
208 220
209static const struct lm90_params lm90_params[] = { 221static const struct lm90_params lm90_params[] = {
@@ -238,16 +250,19 @@ static const struct lm90_params lm90_params[] = {
238 .flags = LM90_HAVE_LOCAL_EXT, 250 .flags = LM90_HAVE_LOCAL_EXT,
239 .alert_alarms = 0x7c, 251 .alert_alarms = 0x7c,
240 .max_convrate = 6, 252 .max_convrate = 6,
253 .reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL,
241 }, 254 },
242 [max6657] = { 255 [max6657] = {
243 .flags = LM90_HAVE_LOCAL_EXT, 256 .flags = LM90_HAVE_LOCAL_EXT,
244 .alert_alarms = 0x7c, 257 .alert_alarms = 0x7c,
245 .max_convrate = 8, 258 .max_convrate = 8,
259 .reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL,
246 }, 260 },
247 [max6659] = { 261 [max6659] = {
248 .flags = LM90_HAVE_LOCAL_EXT | LM90_HAVE_EMERGENCY, 262 .flags = LM90_HAVE_LOCAL_EXT | LM90_HAVE_EMERGENCY,
249 .alert_alarms = 0x7c, 263 .alert_alarms = 0x7c,
250 .max_convrate = 8, 264 .max_convrate = 8,
265 .reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL,
251 }, 266 },
252 [max6680] = { 267 [max6680] = {
253 .flags = LM90_HAVE_OFFSET, 268 .flags = LM90_HAVE_OFFSET,
@@ -259,12 +274,20 @@ static const struct lm90_params lm90_params[] = {
259 | LM90_HAVE_EMERGENCY_ALARM | LM90_HAVE_TEMP3, 274 | LM90_HAVE_EMERGENCY_ALARM | LM90_HAVE_TEMP3,
260 .alert_alarms = 0x187c, 275 .alert_alarms = 0x187c,
261 .max_convrate = 6, 276 .max_convrate = 6,
277 .reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL,
262 }, 278 },
263 [w83l771] = { 279 [w83l771] = {
264 .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT, 280 .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT,
265 .alert_alarms = 0x7c, 281 .alert_alarms = 0x7c,
266 .max_convrate = 8, 282 .max_convrate = 8,
267 }, 283 },
284 [sa56004] = {
285 .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT
286 | LM90_HAVE_LOCAL_EXT,
287 .alert_alarms = 0x7b,
288 .max_convrate = 9,
289 .reg_local_ext = SA56004_REG_R_LOCAL_TEMPL,
290 },
268}; 291};
269 292
270/* 293/*
@@ -286,6 +309,7 @@ struct lm90_data {
286 u16 alert_alarms; /* Which alarm bits trigger ALERT# */ 309 u16 alert_alarms; /* Which alarm bits trigger ALERT# */
287 /* Upper 8 bits for max6695/96 */ 310 /* Upper 8 bits for max6695/96 */
288 u8 max_convrate; /* Maximum conversion rate */ 311 u8 max_convrate; /* Maximum conversion rate */
312 u8 reg_local_ext; /* local extension register offset */
289 313
290 /* registers values */ 314 /* registers values */
291 s8 temp8[8]; /* 0: local low limit 315 s8 temp8[8]; /* 0: local low limit
@@ -454,7 +478,7 @@ static struct lm90_data *lm90_update_device(struct device *dev)
454 478
455 if (data->flags & LM90_HAVE_LOCAL_EXT) { 479 if (data->flags & LM90_HAVE_LOCAL_EXT) {
456 lm90_read16(client, LM90_REG_R_LOCAL_TEMP, 480 lm90_read16(client, LM90_REG_R_LOCAL_TEMP,
457 MAX6657_REG_R_LOCAL_TEMPL, 481 data->reg_local_ext,
458 &data->temp11[4]); 482 &data->temp11[4]);
459 } else { 483 } else {
460 if (lm90_read_reg(client, LM90_REG_R_LOCAL_TEMP, 484 if (lm90_read_reg(client, LM90_REG_R_LOCAL_TEMP,
@@ -1263,6 +1287,11 @@ static int lm90_detect(struct i2c_client *new_client,
1263 name = "w83l771"; 1287 name = "w83l771";
1264 } 1288 }
1265 } 1289 }
1290 } else
1291 if (man_id == 0xA1) { /* NXP Semiconductor/Philips */
1292 if (chip_id == 0x00 && address >= 0x48 && address <= 0x4F) {
1293 name = "sa56004";
1294 }
1266 } 1295 }
1267 1296
1268 if (!name) { /* identification failed */ 1297 if (!name) { /* identification failed */
@@ -1372,6 +1401,11 @@ static int lm90_probe(struct i2c_client *new_client,
1372 /* Set maximum conversion rate */ 1401 /* Set maximum conversion rate */
1373 data->max_convrate = lm90_params[data->kind].max_convrate; 1402 data->max_convrate = lm90_params[data->kind].max_convrate;
1374 1403
1404 if (data->flags & LM90_HAVE_LOCAL_EXT) {
1405 data->reg_local_ext = lm90_params[data->kind].reg_local_ext;
1406 WARN_ON(data->reg_local_ext == 0);
1407 }
1408
1375 /* Initialize the LM90 chip */ 1409 /* Initialize the LM90 chip */
1376 lm90_init_client(new_client); 1410 lm90_init_client(new_client);
1377 1411