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