]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blame - drivers/hwmon/lm75.c
hwmon: (lm75) Add support for the NXP LM75B
[mirror_ubuntu-zesty-kernel.git] / drivers / hwmon / lm75.c
CommitLineData
1da177e4 1/*
caaa0f36
S
2 * lm75.c - Part of lm_sensors, Linux kernel modules for hardware
3 * monitoring
4 * Copyright (c) 1998, 1999 Frodo Looijaard <frodol@dds.nl>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 */
1da177e4 20
1da177e4
LT
21#include <linux/module.h>
22#include <linux/init.h>
23#include <linux/slab.h>
24#include <linux/jiffies.h>
25#include <linux/i2c.h>
943b0830 26#include <linux/hwmon.h>
9ca8e40c 27#include <linux/hwmon-sysfs.h>
943b0830 28#include <linux/err.h>
9a61bf63 29#include <linux/mutex.h>
22e73183
EV
30#include <linux/of.h>
31#include <linux/thermal.h>
1da177e4
LT
32#include "lm75.h"
33
34
01a52397
DB
35/*
36 * This driver handles the LM75 and compatible digital temperature sensors.
01a52397
DB
37 */
38
9ebd3d82 39enum lm75_type { /* keep sorted in alphabetical order */
e96f9d89 40 adt75,
1f86df49 41 ds1775,
9ebd3d82 42 ds75,
3fbc81e3 43 ds7505,
c98d6c65 44 g751,
1f86df49 45 lm75,
9ebd3d82 46 lm75a,
799fc602 47 lm75b,
9ebd3d82
DB
48 max6625,
49 max6626,
50 mcp980x,
51 stds75,
52 tcn75,
53 tmp100,
54 tmp101,
6d034059 55 tmp105,
c83959f8 56 tmp112,
9ebd3d82
DB
57 tmp175,
58 tmp275,
59 tmp75,
60};
61
8ff69eeb 62/* Addresses scanned */
25e9c86d 63static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4b, 0x4c,
1da177e4 64 0x4d, 0x4e, 0x4f, I2C_CLIENT_END };
1da177e4 65
1da177e4
LT
66
67/* The LM75 registers */
1da177e4 68#define LM75_REG_CONF 0x01
9ca8e40c
JD
69static const u8 LM75_REG_TEMP[3] = {
70 0x00, /* input */
71 0x03, /* max */
72 0x02, /* hyst */
73};
1da177e4
LT
74
75/* Each client has this additional data */
76struct lm75_data {
d663ec49 77 struct i2c_client *client;
01a52397 78 struct device *hwmon_dev;
22e73183 79 struct thermal_zone_device *tz;
9a61bf63 80 struct mutex update_lock;
9ebd3d82 81 u8 orig_conf;
87d0621a
JD
82 u8 resolution; /* In bits, between 9 and 12 */
83 u8 resolution_limits;
01a52397 84 char valid; /* !=0 if registers are valid */
1da177e4 85 unsigned long last_updated; /* In jiffies */
87d0621a
JD
86 unsigned long sample_time; /* In jiffies */
87 s16 temp[3]; /* Register values,
9ca8e40c
JD
88 0 = input
89 1 = max
90 2 = hyst */
1da177e4
LT
91};
92
1da177e4
LT
93static int lm75_read_value(struct i2c_client *client, u8 reg);
94static int lm75_write_value(struct i2c_client *client, u8 reg, u16 value);
95static struct lm75_data *lm75_update_device(struct device *dev);
96
97
01a52397
DB
98/*-----------------------------------------------------------------------*/
99
22e73183
EV
100static inline long lm75_reg_to_mc(s16 temp, u8 resolution)
101{
102 return ((temp >> (16 - resolution)) * 1000) >> (resolution - 8);
103}
104
01a52397 105/* sysfs attributes for hwmon */
1da177e4 106
22e73183
EV
107static int lm75_read_temp(void *dev, long *temp)
108{
109 struct lm75_data *data = lm75_update_device(dev);
110
111 if (IS_ERR(data))
112 return PTR_ERR(data);
113
114 *temp = lm75_reg_to_mc(data->temp[0], data->resolution);
115
116 return 0;
117}
118
9ca8e40c
JD
119static ssize_t show_temp(struct device *dev, struct device_attribute *da,
120 char *buf)
121{
122 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
123 struct lm75_data *data = lm75_update_device(dev);
1f962f36
FM
124
125 if (IS_ERR(data))
126 return PTR_ERR(data);
127
22e73183
EV
128 return sprintf(buf, "%ld\n", lm75_reg_to_mc(data->temp[attr->index],
129 data->resolution));
1da177e4 130}
9ca8e40c
JD
131
132static ssize_t set_temp(struct device *dev, struct device_attribute *da,
133 const char *buf, size_t count)
134{
135 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
d663ec49
GR
136 struct lm75_data *data = dev_get_drvdata(dev);
137 struct i2c_client *client = data->client;
9ca8e40c 138 int nr = attr->index;
e3cd9528
S
139 long temp;
140 int error;
87d0621a 141 u8 resolution;
e3cd9528 142
24edc0a7 143 error = kstrtol(buf, 10, &temp);
e3cd9528
S
144 if (error)
145 return error;
9ca8e40c 146
87d0621a
JD
147 /*
148 * Resolution of limit registers is assumed to be the same as the
149 * temperature input register resolution unless given explicitly.
150 */
151 if (attr->index && data->resolution_limits)
152 resolution = data->resolution_limits;
153 else
154 resolution = data->resolution;
155
9ca8e40c 156 mutex_lock(&data->update_lock);
87d0621a
JD
157 temp = clamp_val(temp, LM75_TEMP_MIN, LM75_TEMP_MAX);
158 data->temp[nr] = DIV_ROUND_CLOSEST(temp << (resolution - 8),
159 1000) << (16 - resolution);
9ca8e40c
JD
160 lm75_write_value(client, LM75_REG_TEMP[nr], data->temp[nr]);
161 mutex_unlock(&data->update_lock);
162 return count;
1da177e4 163}
1da177e4 164
9ca8e40c
JD
165static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO,
166 show_temp, set_temp, 1);
167static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IWUSR | S_IRUGO,
168 show_temp, set_temp, 2);
169static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0);
1da177e4 170
d663ec49 171static struct attribute *lm75_attrs[] = {
9ca8e40c
JD
172 &sensor_dev_attr_temp1_input.dev_attr.attr,
173 &sensor_dev_attr_temp1_max.dev_attr.attr,
174 &sensor_dev_attr_temp1_max_hyst.dev_attr.attr,
c1685f61
MH
175
176 NULL
177};
d663ec49 178ATTRIBUTE_GROUPS(lm75);
c1685f61 179
01a52397
DB
180/*-----------------------------------------------------------------------*/
181
8ff69eeb 182/* device probe and removal */
9ebd3d82
DB
183
184static int
185lm75_probe(struct i2c_client *client, const struct i2c_device_id *id)
186{
d663ec49 187 struct device *dev = &client->dev;
9ebd3d82
DB
188 struct lm75_data *data;
189 int status;
190 u8 set_mask, clr_mask;
191 int new;
0cd2c72d 192 enum lm75_type kind = id->driver_data;
9ebd3d82
DB
193
194 if (!i2c_check_functionality(client->adapter,
195 I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA))
196 return -EIO;
197
d663ec49 198 data = devm_kzalloc(dev, sizeof(struct lm75_data), GFP_KERNEL);
9ebd3d82
DB
199 if (!data)
200 return -ENOMEM;
201
d663ec49 202 data->client = client;
9ebd3d82 203 i2c_set_clientdata(client, data);
9ebd3d82
DB
204 mutex_init(&data->update_lock);
205
206 /* Set to LM75 resolution (9 bits, 1/2 degree C) and range.
207 * Then tweak to be more precise when appropriate.
208 */
209 set_mask = 0;
8a5c5cc6
JD
210 clr_mask = LM75_SHUTDOWN; /* continuous conversions */
211
0cd2c72d 212 switch (kind) {
8a5c5cc6
JD
213 case adt75:
214 clr_mask |= 1 << 5; /* not one-shot mode */
0cd2c72d
JD
215 data->resolution = 12;
216 data->sample_time = HZ / 8;
8a5c5cc6
JD
217 break;
218 case ds1775:
219 case ds75:
220 case stds75:
0cd2c72d
JD
221 clr_mask |= 3 << 5;
222 set_mask |= 2 << 5; /* 11-bit mode */
223 data->resolution = 11;
224 data->sample_time = HZ;
225 break;
3fbc81e3
JD
226 case ds7505:
227 set_mask |= 3 << 5; /* 12-bit mode */
228 data->resolution = 12;
229 data->sample_time = HZ / 4;
230 break;
c98d6c65 231 case g751:
0cd2c72d
JD
232 case lm75:
233 case lm75a:
234 data->resolution = 9;
235 data->sample_time = HZ / 2;
236 break;
799fc602
MT
237 case lm75b:
238 data->resolution = 11;
239 data->sample_time = HZ / 4;
240 break;
0cd2c72d
JD
241 case max6625:
242 data->resolution = 9;
243 data->sample_time = HZ / 4;
244 break;
245 case max6626:
246 data->resolution = 12;
247 data->resolution_limits = 9;
248 data->sample_time = HZ / 4;
249 break;
250 case tcn75:
251 data->resolution = 9;
252 data->sample_time = HZ / 8;
8a5c5cc6
JD
253 break;
254 case mcp980x:
0cd2c72d
JD
255 data->resolution_limits = 9;
256 /* fall through */
8a5c5cc6
JD
257 case tmp100:
258 case tmp101:
0cd2c72d
JD
259 set_mask |= 3 << 5; /* 12-bit mode */
260 data->resolution = 12;
261 data->sample_time = HZ;
262 clr_mask |= 1 << 7; /* not one-shot mode */
263 break;
c83959f8
FK
264 case tmp112:
265 set_mask |= 3 << 5; /* 12-bit mode */
266 clr_mask |= 1 << 7; /* not one-shot mode */
267 data->resolution = 12;
268 data->sample_time = HZ / 4;
269 break;
8a5c5cc6
JD
270 case tmp105:
271 case tmp175:
272 case tmp275:
273 case tmp75:
0cd2c72d 274 set_mask |= 3 << 5; /* 12-bit mode */
8a5c5cc6 275 clr_mask |= 1 << 7; /* not one-shot mode */
0cd2c72d
JD
276 data->resolution = 12;
277 data->sample_time = HZ / 2;
8a5c5cc6
JD
278 break;
279 }
9ebd3d82
DB
280
281 /* configure as specified */
282 status = lm75_read_value(client, LM75_REG_CONF);
283 if (status < 0) {
d663ec49 284 dev_dbg(dev, "Can't read config? %d\n", status);
13ac7a01 285 return status;
9ebd3d82
DB
286 }
287 data->orig_conf = status;
288 new = status & ~clr_mask;
289 new |= set_mask;
290 if (status != new)
291 lm75_write_value(client, LM75_REG_CONF, new);
d663ec49 292 dev_dbg(dev, "Config %02x\n", new);
9ebd3d82 293
d663ec49
GR
294 data->hwmon_dev = hwmon_device_register_with_groups(dev, client->name,
295 data, lm75_groups);
296 if (IS_ERR(data->hwmon_dev))
297 return PTR_ERR(data->hwmon_dev);
9ebd3d82 298
d663ec49 299 data->tz = thermal_zone_of_sensor_register(data->hwmon_dev,
22e73183 300 0,
d663ec49 301 data->hwmon_dev,
22e73183
EV
302 lm75_read_temp, NULL);
303 if (IS_ERR(data->tz))
304 data->tz = NULL;
305
d663ec49 306 dev_info(dev, "%s: sensor '%s'\n",
739cf3a2 307 dev_name(data->hwmon_dev), client->name);
9ebd3d82
DB
308
309 return 0;
9ebd3d82
DB
310}
311
312static int lm75_remove(struct i2c_client *client)
313{
314 struct lm75_data *data = i2c_get_clientdata(client);
315
d663ec49 316 thermal_zone_of_sensor_unregister(data->hwmon_dev, data->tz);
9ebd3d82 317 hwmon_device_unregister(data->hwmon_dev);
9ebd3d82 318 lm75_write_value(client, LM75_REG_CONF, data->orig_conf);
9ebd3d82
DB
319 return 0;
320}
321
322static const struct i2c_device_id lm75_ids[] = {
e96f9d89 323 { "adt75", adt75, },
9ebd3d82
DB
324 { "ds1775", ds1775, },
325 { "ds75", ds75, },
3fbc81e3 326 { "ds7505", ds7505, },
c98d6c65 327 { "g751", g751, },
9ebd3d82
DB
328 { "lm75", lm75, },
329 { "lm75a", lm75a, },
799fc602 330 { "lm75b", lm75b, },
9ebd3d82
DB
331 { "max6625", max6625, },
332 { "max6626", max6626, },
333 { "mcp980x", mcp980x, },
334 { "stds75", stds75, },
335 { "tcn75", tcn75, },
336 { "tmp100", tmp100, },
337 { "tmp101", tmp101, },
6d034059 338 { "tmp105", tmp105, },
c83959f8 339 { "tmp112", tmp112, },
9ebd3d82
DB
340 { "tmp175", tmp175, },
341 { "tmp275", tmp275, },
342 { "tmp75", tmp75, },
343 { /* LIST END */ }
344};
345MODULE_DEVICE_TABLE(i2c, lm75_ids);
346
05e82fe4
LS
347#define LM75A_ID 0xA1
348
8ff69eeb 349/* Return 0 if detection is successful, -ENODEV otherwise */
310ec792 350static int lm75_detect(struct i2c_client *new_client,
8ff69eeb 351 struct i2c_board_info *info)
1da177e4 352{
8ff69eeb 353 struct i2c_adapter *adapter = new_client->adapter;
1da177e4 354 int i;
e76f67b5 355 int conf, hyst, os;
05e82fe4 356 bool is_lm75a = 0;
1da177e4 357
1da177e4
LT
358 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA |
359 I2C_FUNC_SMBUS_WORD_DATA))
8ff69eeb 360 return -ENODEV;
1da177e4 361
426343ef
JD
362 /*
363 * Now, we do the remaining detection. There is no identification-
364 * dedicated register so we have to rely on several tricks:
365 * unused bits, registers cycling over 8-address boundaries,
366 * addresses 0x04-0x07 returning the last read value.
367 * The cycling+unused addresses combination is not tested,
368 * since it would significantly slow the detection down and would
369 * hardly add any value.
370 *
371 * The National Semiconductor LM75A is different than earlier
372 * LM75s. It has an ID byte of 0xaX (where X is the chip
373 * revision, with 1 being the only revision in existence) in
374 * register 7, and unused registers return 0xff rather than the
375 * last read value.
376 *
377 * Note that this function only detects the original National
378 * Semiconductor LM75 and the LM75A. Clones from other vendors
379 * aren't detected, on purpose, because they are typically never
380 * found on PC hardware. They are found on embedded designs where
381 * they can be instantiated explicitly so detection is not needed.
382 * The absence of identification registers on all these clones
383 * would make their exhaustive detection very difficult and weak,
384 * and odds are that the driver would bind to unsupported devices.
385 */
1da177e4 386
e76f67b5 387 /* Unused bits */
52df6440 388 conf = i2c_smbus_read_byte_data(new_client, 1);
e76f67b5
JD
389 if (conf & 0xe0)
390 return -ENODEV;
05e82fe4
LS
391
392 /* First check for LM75A */
393 if (i2c_smbus_read_byte_data(new_client, 7) == LM75A_ID) {
394 /* LM75A returns 0xff on unused registers so
395 just to be sure we check for that too. */
396 if (i2c_smbus_read_byte_data(new_client, 4) != 0xff
397 || i2c_smbus_read_byte_data(new_client, 5) != 0xff
398 || i2c_smbus_read_byte_data(new_client, 6) != 0xff)
399 return -ENODEV;
400 is_lm75a = 1;
e76f67b5
JD
401 hyst = i2c_smbus_read_byte_data(new_client, 2);
402 os = i2c_smbus_read_byte_data(new_client, 3);
05e82fe4
LS
403 } else { /* Traditional style LM75 detection */
404 /* Unused addresses */
e76f67b5
JD
405 hyst = i2c_smbus_read_byte_data(new_client, 2);
406 if (i2c_smbus_read_byte_data(new_client, 4) != hyst
407 || i2c_smbus_read_byte_data(new_client, 5) != hyst
408 || i2c_smbus_read_byte_data(new_client, 6) != hyst
409 || i2c_smbus_read_byte_data(new_client, 7) != hyst)
05e82fe4 410 return -ENODEV;
e76f67b5
JD
411 os = i2c_smbus_read_byte_data(new_client, 3);
412 if (i2c_smbus_read_byte_data(new_client, 4) != os
413 || i2c_smbus_read_byte_data(new_client, 5) != os
414 || i2c_smbus_read_byte_data(new_client, 6) != os
415 || i2c_smbus_read_byte_data(new_client, 7) != os)
05e82fe4
LS
416 return -ENODEV;
417 }
1da177e4 418
52df6440 419 /* Addresses cycling */
e76f67b5 420 for (i = 8; i <= 248; i += 40) {
52df6440 421 if (i2c_smbus_read_byte_data(new_client, i + 1) != conf
e76f67b5
JD
422 || i2c_smbus_read_byte_data(new_client, i + 2) != hyst
423 || i2c_smbus_read_byte_data(new_client, i + 3) != os)
52df6440 424 return -ENODEV;
05e82fe4
LS
425 if (is_lm75a && i2c_smbus_read_byte_data(new_client, i + 7)
426 != LM75A_ID)
427 return -ENODEV;
1da177e4
LT
428 }
429
05e82fe4 430 strlcpy(info->type, is_lm75a ? "lm75a" : "lm75", I2C_NAME_SIZE);
c1685f61 431
1da177e4 432 return 0;
01a52397
DB
433}
434
9914518e
SD
435#ifdef CONFIG_PM
436static int lm75_suspend(struct device *dev)
437{
438 int status;
439 struct i2c_client *client = to_i2c_client(dev);
440 status = lm75_read_value(client, LM75_REG_CONF);
441 if (status < 0) {
442 dev_dbg(&client->dev, "Can't read config? %d\n", status);
443 return status;
444 }
445 status = status | LM75_SHUTDOWN;
446 lm75_write_value(client, LM75_REG_CONF, status);
447 return 0;
448}
449
450static int lm75_resume(struct device *dev)
451{
452 int status;
453 struct i2c_client *client = to_i2c_client(dev);
454 status = lm75_read_value(client, LM75_REG_CONF);
455 if (status < 0) {
456 dev_dbg(&client->dev, "Can't read config? %d\n", status);
457 return status;
458 }
459 status = status & ~LM75_SHUTDOWN;
460 lm75_write_value(client, LM75_REG_CONF, status);
461 return 0;
462}
463
464static const struct dev_pm_ops lm75_dev_pm_ops = {
465 .suspend = lm75_suspend,
466 .resume = lm75_resume,
467};
468#define LM75_DEV_PM_OPS (&lm75_dev_pm_ops)
469#else
470#define LM75_DEV_PM_OPS NULL
471#endif /* CONFIG_PM */
472
8ff69eeb
JD
473static struct i2c_driver lm75_driver = {
474 .class = I2C_CLASS_HWMON,
01a52397 475 .driver = {
8ff69eeb 476 .name = "lm75",
9914518e 477 .pm = LM75_DEV_PM_OPS,
01a52397 478 },
8ff69eeb
JD
479 .probe = lm75_probe,
480 .remove = lm75_remove,
481 .id_table = lm75_ids,
482 .detect = lm75_detect,
c3813d6a 483 .address_list = normal_i2c,
01a52397
DB
484};
485
486/*-----------------------------------------------------------------------*/
487
488/* register access */
489
caaa0f36
S
490/*
491 * All registers are word-sized, except for the configuration register.
492 * LM75 uses a high-byte first convention, which is exactly opposite to
493 * the SMBus standard.
494 */
1da177e4
LT
495static int lm75_read_value(struct i2c_client *client, u8 reg)
496{
497 if (reg == LM75_REG_CONF)
498 return i2c_smbus_read_byte_data(client, reg);
90f4102c
JD
499 else
500 return i2c_smbus_read_word_swapped(client, reg);
1da177e4
LT
501}
502
1da177e4
LT
503static int lm75_write_value(struct i2c_client *client, u8 reg, u16 value)
504{
505 if (reg == LM75_REG_CONF)
506 return i2c_smbus_write_byte_data(client, reg, value);
507 else
90f4102c 508 return i2c_smbus_write_word_swapped(client, reg, value);
1da177e4
LT
509}
510
1da177e4
LT
511static struct lm75_data *lm75_update_device(struct device *dev)
512{
d663ec49
GR
513 struct lm75_data *data = dev_get_drvdata(dev);
514 struct i2c_client *client = data->client;
1f962f36 515 struct lm75_data *ret = data;
1da177e4 516
9a61bf63 517 mutex_lock(&data->update_lock);
1da177e4 518
87d0621a 519 if (time_after(jiffies, data->last_updated + data->sample_time)
1da177e4 520 || !data->valid) {
9ca8e40c 521 int i;
1da177e4
LT
522 dev_dbg(&client->dev, "Starting lm75 update\n");
523
bcccc3a2
DB
524 for (i = 0; i < ARRAY_SIZE(data->temp); i++) {
525 int status;
526
527 status = lm75_read_value(client, LM75_REG_TEMP[i]);
1f962f36
FM
528 if (unlikely(status < 0)) {
529 dev_dbg(dev,
530 "LM75: Failed to read value: reg %d, error %d\n",
531 LM75_REG_TEMP[i], status);
532 ret = ERR_PTR(status);
533 data->valid = 0;
534 goto abort;
535 }
536 data->temp[i] = status;
bcccc3a2 537 }
1da177e4
LT
538 data->last_updated = jiffies;
539 data->valid = 1;
540 }
541
1f962f36 542abort:
9a61bf63 543 mutex_unlock(&data->update_lock);
1f962f36 544 return ret;
1da177e4
LT
545}
546
f0967eea 547module_i2c_driver(lm75_driver);
1da177e4
LT
548
549MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>");
550MODULE_DESCRIPTION("LM75 driver");
551MODULE_LICENSE("GPL");