hwmon: (lm75) added error handling
[deliverable/linux.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>
1da177e4
LT
30#include "lm75.h"
31
32
01a52397
DB
33/*
34 * This driver handles the LM75 and compatible digital temperature sensors.
01a52397
DB
35 */
36
9ebd3d82 37enum lm75_type { /* keep sorted in alphabetical order */
e96f9d89 38 adt75,
1f86df49 39 ds1775,
9ebd3d82 40 ds75,
1f86df49 41 lm75,
9ebd3d82
DB
42 lm75a,
43 max6625,
44 max6626,
45 mcp980x,
46 stds75,
47 tcn75,
48 tmp100,
49 tmp101,
6d034059 50 tmp105,
9ebd3d82
DB
51 tmp175,
52 tmp275,
53 tmp75,
54};
55
8ff69eeb 56/* Addresses scanned */
25e9c86d 57static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4b, 0x4c,
1da177e4 58 0x4d, 0x4e, 0x4f, I2C_CLIENT_END };
1da177e4 59
1da177e4
LT
60
61/* The LM75 registers */
1da177e4 62#define LM75_REG_CONF 0x01
9ca8e40c
JD
63static const u8 LM75_REG_TEMP[3] = {
64 0x00, /* input */
65 0x03, /* max */
66 0x02, /* hyst */
67};
1da177e4
LT
68
69/* Each client has this additional data */
70struct lm75_data {
01a52397 71 struct device *hwmon_dev;
9a61bf63 72 struct mutex update_lock;
9ebd3d82 73 u8 orig_conf;
01a52397 74 char valid; /* !=0 if registers are valid */
1da177e4 75 unsigned long last_updated; /* In jiffies */
9ca8e40c
JD
76 u16 temp[3]; /* Register values,
77 0 = input
78 1 = max
79 2 = hyst */
1da177e4
LT
80};
81
1da177e4
LT
82static int lm75_read_value(struct i2c_client *client, u8 reg);
83static int lm75_write_value(struct i2c_client *client, u8 reg, u16 value);
84static struct lm75_data *lm75_update_device(struct device *dev);
85
86
01a52397
DB
87/*-----------------------------------------------------------------------*/
88
89/* sysfs attributes for hwmon */
1da177e4 90
9ca8e40c
JD
91static ssize_t show_temp(struct device *dev, struct device_attribute *da,
92 char *buf)
93{
94 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
95 struct lm75_data *data = lm75_update_device(dev);
1f962f36
FM
96
97 if (IS_ERR(data))
98 return PTR_ERR(data);
99
9ca8e40c
JD
100 return sprintf(buf, "%d\n",
101 LM75_TEMP_FROM_REG(data->temp[attr->index]));
1da177e4 102}
9ca8e40c
JD
103
104static ssize_t set_temp(struct device *dev, struct device_attribute *da,
105 const char *buf, size_t count)
106{
107 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
108 struct i2c_client *client = to_i2c_client(dev);
109 struct lm75_data *data = i2c_get_clientdata(client);
110 int nr = attr->index;
e3cd9528
S
111 long temp;
112 int error;
113
114 error = strict_strtol(buf, 10, &temp);
115 if (error)
116 return error;
9ca8e40c
JD
117
118 mutex_lock(&data->update_lock);
119 data->temp[nr] = LM75_TEMP_TO_REG(temp);
120 lm75_write_value(client, LM75_REG_TEMP[nr], data->temp[nr]);
121 mutex_unlock(&data->update_lock);
122 return count;
1da177e4 123}
1da177e4 124
9ca8e40c
JD
125static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO,
126 show_temp, set_temp, 1);
127static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IWUSR | S_IRUGO,
128 show_temp, set_temp, 2);
129static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0);
1da177e4 130
c1685f61 131static struct attribute *lm75_attributes[] = {
9ca8e40c
JD
132 &sensor_dev_attr_temp1_input.dev_attr.attr,
133 &sensor_dev_attr_temp1_max.dev_attr.attr,
134 &sensor_dev_attr_temp1_max_hyst.dev_attr.attr,
c1685f61
MH
135
136 NULL
137};
138
139static const struct attribute_group lm75_group = {
140 .attrs = lm75_attributes,
141};
142
01a52397
DB
143/*-----------------------------------------------------------------------*/
144
8ff69eeb 145/* device probe and removal */
9ebd3d82
DB
146
147static int
148lm75_probe(struct i2c_client *client, const struct i2c_device_id *id)
149{
150 struct lm75_data *data;
151 int status;
152 u8 set_mask, clr_mask;
153 int new;
154
155 if (!i2c_check_functionality(client->adapter,
156 I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA))
157 return -EIO;
158
159 data = kzalloc(sizeof(struct lm75_data), GFP_KERNEL);
160 if (!data)
161 return -ENOMEM;
162
163 i2c_set_clientdata(client, data);
9ebd3d82
DB
164 mutex_init(&data->update_lock);
165
166 /* Set to LM75 resolution (9 bits, 1/2 degree C) and range.
167 * Then tweak to be more precise when appropriate.
168 */
169 set_mask = 0;
170 clr_mask = (1 << 0) /* continuous conversions */
171 | (1 << 6) | (1 << 5); /* 9-bit mode */
172
173 /* configure as specified */
174 status = lm75_read_value(client, LM75_REG_CONF);
175 if (status < 0) {
176 dev_dbg(&client->dev, "Can't read config? %d\n", status);
177 goto exit_free;
178 }
179 data->orig_conf = status;
180 new = status & ~clr_mask;
181 new |= set_mask;
182 if (status != new)
183 lm75_write_value(client, LM75_REG_CONF, new);
184 dev_dbg(&client->dev, "Config %02x\n", new);
185
186 /* Register sysfs hooks */
187 status = sysfs_create_group(&client->dev.kobj, &lm75_group);
188 if (status)
189 goto exit_free;
190
191 data->hwmon_dev = hwmon_device_register(&client->dev);
192 if (IS_ERR(data->hwmon_dev)) {
193 status = PTR_ERR(data->hwmon_dev);
194 goto exit_remove;
195 }
196
197 dev_info(&client->dev, "%s: sensor '%s'\n",
739cf3a2 198 dev_name(data->hwmon_dev), client->name);
9ebd3d82
DB
199
200 return 0;
201
202exit_remove:
203 sysfs_remove_group(&client->dev.kobj, &lm75_group);
204exit_free:
9ebd3d82
DB
205 kfree(data);
206 return status;
207}
208
209static int lm75_remove(struct i2c_client *client)
210{
211 struct lm75_data *data = i2c_get_clientdata(client);
212
213 hwmon_device_unregister(data->hwmon_dev);
214 sysfs_remove_group(&client->dev.kobj, &lm75_group);
215 lm75_write_value(client, LM75_REG_CONF, data->orig_conf);
9ebd3d82
DB
216 kfree(data);
217 return 0;
218}
219
220static const struct i2c_device_id lm75_ids[] = {
e96f9d89 221 { "adt75", adt75, },
9ebd3d82
DB
222 { "ds1775", ds1775, },
223 { "ds75", ds75, },
224 { "lm75", lm75, },
225 { "lm75a", lm75a, },
226 { "max6625", max6625, },
227 { "max6626", max6626, },
228 { "mcp980x", mcp980x, },
229 { "stds75", stds75, },
230 { "tcn75", tcn75, },
231 { "tmp100", tmp100, },
232 { "tmp101", tmp101, },
6d034059 233 { "tmp105", tmp105, },
9ebd3d82
DB
234 { "tmp175", tmp175, },
235 { "tmp275", tmp275, },
236 { "tmp75", tmp75, },
237 { /* LIST END */ }
238};
239MODULE_DEVICE_TABLE(i2c, lm75_ids);
240
05e82fe4
LS
241#define LM75A_ID 0xA1
242
8ff69eeb 243/* Return 0 if detection is successful, -ENODEV otherwise */
310ec792 244static int lm75_detect(struct i2c_client *new_client,
8ff69eeb 245 struct i2c_board_info *info)
1da177e4 246{
8ff69eeb 247 struct i2c_adapter *adapter = new_client->adapter;
1da177e4 248 int i;
e76f67b5 249 int conf, hyst, os;
05e82fe4 250 bool is_lm75a = 0;
1da177e4 251
1da177e4
LT
252 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA |
253 I2C_FUNC_SMBUS_WORD_DATA))
8ff69eeb 254 return -ENODEV;
1da177e4 255
426343ef
JD
256 /*
257 * Now, we do the remaining detection. There is no identification-
258 * dedicated register so we have to rely on several tricks:
259 * unused bits, registers cycling over 8-address boundaries,
260 * addresses 0x04-0x07 returning the last read value.
261 * The cycling+unused addresses combination is not tested,
262 * since it would significantly slow the detection down and would
263 * hardly add any value.
264 *
265 * The National Semiconductor LM75A is different than earlier
266 * LM75s. It has an ID byte of 0xaX (where X is the chip
267 * revision, with 1 being the only revision in existence) in
268 * register 7, and unused registers return 0xff rather than the
269 * last read value.
270 *
271 * Note that this function only detects the original National
272 * Semiconductor LM75 and the LM75A. Clones from other vendors
273 * aren't detected, on purpose, because they are typically never
274 * found on PC hardware. They are found on embedded designs where
275 * they can be instantiated explicitly so detection is not needed.
276 * The absence of identification registers on all these clones
277 * would make their exhaustive detection very difficult and weak,
278 * and odds are that the driver would bind to unsupported devices.
279 */
1da177e4 280
e76f67b5 281 /* Unused bits */
52df6440 282 conf = i2c_smbus_read_byte_data(new_client, 1);
e76f67b5
JD
283 if (conf & 0xe0)
284 return -ENODEV;
05e82fe4
LS
285
286 /* First check for LM75A */
287 if (i2c_smbus_read_byte_data(new_client, 7) == LM75A_ID) {
288 /* LM75A returns 0xff on unused registers so
289 just to be sure we check for that too. */
290 if (i2c_smbus_read_byte_data(new_client, 4) != 0xff
291 || i2c_smbus_read_byte_data(new_client, 5) != 0xff
292 || i2c_smbus_read_byte_data(new_client, 6) != 0xff)
293 return -ENODEV;
294 is_lm75a = 1;
e76f67b5
JD
295 hyst = i2c_smbus_read_byte_data(new_client, 2);
296 os = i2c_smbus_read_byte_data(new_client, 3);
05e82fe4
LS
297 } else { /* Traditional style LM75 detection */
298 /* Unused addresses */
e76f67b5
JD
299 hyst = i2c_smbus_read_byte_data(new_client, 2);
300 if (i2c_smbus_read_byte_data(new_client, 4) != hyst
301 || i2c_smbus_read_byte_data(new_client, 5) != hyst
302 || i2c_smbus_read_byte_data(new_client, 6) != hyst
303 || i2c_smbus_read_byte_data(new_client, 7) != hyst)
05e82fe4 304 return -ENODEV;
e76f67b5
JD
305 os = i2c_smbus_read_byte_data(new_client, 3);
306 if (i2c_smbus_read_byte_data(new_client, 4) != os
307 || i2c_smbus_read_byte_data(new_client, 5) != os
308 || i2c_smbus_read_byte_data(new_client, 6) != os
309 || i2c_smbus_read_byte_data(new_client, 7) != os)
05e82fe4
LS
310 return -ENODEV;
311 }
1da177e4 312
52df6440 313 /* Addresses cycling */
e76f67b5 314 for (i = 8; i <= 248; i += 40) {
52df6440 315 if (i2c_smbus_read_byte_data(new_client, i + 1) != conf
e76f67b5
JD
316 || i2c_smbus_read_byte_data(new_client, i + 2) != hyst
317 || i2c_smbus_read_byte_data(new_client, i + 3) != os)
52df6440 318 return -ENODEV;
05e82fe4
LS
319 if (is_lm75a && i2c_smbus_read_byte_data(new_client, i + 7)
320 != LM75A_ID)
321 return -ENODEV;
1da177e4
LT
322 }
323
05e82fe4 324 strlcpy(info->type, is_lm75a ? "lm75a" : "lm75", I2C_NAME_SIZE);
c1685f61 325
1da177e4 326 return 0;
01a52397
DB
327}
328
9914518e
SD
329#ifdef CONFIG_PM
330static int lm75_suspend(struct device *dev)
331{
332 int status;
333 struct i2c_client *client = to_i2c_client(dev);
334 status = lm75_read_value(client, LM75_REG_CONF);
335 if (status < 0) {
336 dev_dbg(&client->dev, "Can't read config? %d\n", status);
337 return status;
338 }
339 status = status | LM75_SHUTDOWN;
340 lm75_write_value(client, LM75_REG_CONF, status);
341 return 0;
342}
343
344static int lm75_resume(struct device *dev)
345{
346 int status;
347 struct i2c_client *client = to_i2c_client(dev);
348 status = lm75_read_value(client, LM75_REG_CONF);
349 if (status < 0) {
350 dev_dbg(&client->dev, "Can't read config? %d\n", status);
351 return status;
352 }
353 status = status & ~LM75_SHUTDOWN;
354 lm75_write_value(client, LM75_REG_CONF, status);
355 return 0;
356}
357
358static const struct dev_pm_ops lm75_dev_pm_ops = {
359 .suspend = lm75_suspend,
360 .resume = lm75_resume,
361};
362#define LM75_DEV_PM_OPS (&lm75_dev_pm_ops)
363#else
364#define LM75_DEV_PM_OPS NULL
365#endif /* CONFIG_PM */
366
8ff69eeb
JD
367static struct i2c_driver lm75_driver = {
368 .class = I2C_CLASS_HWMON,
01a52397 369 .driver = {
8ff69eeb 370 .name = "lm75",
9914518e 371 .pm = LM75_DEV_PM_OPS,
01a52397 372 },
8ff69eeb
JD
373 .probe = lm75_probe,
374 .remove = lm75_remove,
375 .id_table = lm75_ids,
376 .detect = lm75_detect,
c3813d6a 377 .address_list = normal_i2c,
01a52397
DB
378};
379
380/*-----------------------------------------------------------------------*/
381
382/* register access */
383
caaa0f36
S
384/*
385 * All registers are word-sized, except for the configuration register.
386 * LM75 uses a high-byte first convention, which is exactly opposite to
387 * the SMBus standard.
388 */
1da177e4
LT
389static int lm75_read_value(struct i2c_client *client, u8 reg)
390{
391 if (reg == LM75_REG_CONF)
392 return i2c_smbus_read_byte_data(client, reg);
90f4102c
JD
393 else
394 return i2c_smbus_read_word_swapped(client, reg);
1da177e4
LT
395}
396
1da177e4
LT
397static int lm75_write_value(struct i2c_client *client, u8 reg, u16 value)
398{
399 if (reg == LM75_REG_CONF)
400 return i2c_smbus_write_byte_data(client, reg, value);
401 else
90f4102c 402 return i2c_smbus_write_word_swapped(client, reg, value);
1da177e4
LT
403}
404
1da177e4
LT
405static struct lm75_data *lm75_update_device(struct device *dev)
406{
407 struct i2c_client *client = to_i2c_client(dev);
408 struct lm75_data *data = i2c_get_clientdata(client);
1f962f36 409 struct lm75_data *ret = data;
1da177e4 410
9a61bf63 411 mutex_lock(&data->update_lock);
1da177e4
LT
412
413 if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
414 || !data->valid) {
9ca8e40c 415 int i;
1da177e4
LT
416 dev_dbg(&client->dev, "Starting lm75 update\n");
417
bcccc3a2
DB
418 for (i = 0; i < ARRAY_SIZE(data->temp); i++) {
419 int status;
420
421 status = lm75_read_value(client, LM75_REG_TEMP[i]);
1f962f36
FM
422 if (unlikely(status < 0)) {
423 dev_dbg(dev,
424 "LM75: Failed to read value: reg %d, error %d\n",
425 LM75_REG_TEMP[i], status);
426 ret = ERR_PTR(status);
427 data->valid = 0;
428 goto abort;
429 }
430 data->temp[i] = status;
bcccc3a2 431 }
1da177e4
LT
432 data->last_updated = jiffies;
433 data->valid = 1;
434 }
435
1f962f36 436abort:
9a61bf63 437 mutex_unlock(&data->update_lock);
1f962f36 438 return ret;
1da177e4
LT
439}
440
01a52397
DB
441/*-----------------------------------------------------------------------*/
442
443/* module glue */
444
1da177e4
LT
445static int __init sensors_lm75_init(void)
446{
8ff69eeb 447 return i2c_add_driver(&lm75_driver);
1da177e4
LT
448}
449
450static void __exit sensors_lm75_exit(void)
451{
452 i2c_del_driver(&lm75_driver);
453}
454
455MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>");
456MODULE_DESCRIPTION("LM75 driver");
457MODULE_LICENSE("GPL");
458
459module_init(sensors_lm75_init);
460module_exit(sensors_lm75_exit);
This page took 1.381391 seconds and 5 git commands to generate.