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