]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - drivers/hwmon/lm75.c
hwmon: (lm75) Add detection of the National Semiconductor LM75A
[mirror_ubuntu-artful-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>
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
05e82fe4
LS
235#define LM75A_ID 0xA1
236
8ff69eeb 237/* Return 0 if detection is successful, -ENODEV otherwise */
310ec792 238static int lm75_detect(struct i2c_client *new_client,
8ff69eeb 239 struct i2c_board_info *info)
1da177e4 240{
8ff69eeb 241 struct i2c_adapter *adapter = new_client->adapter;
1da177e4 242 int i;
52df6440 243 int cur, conf, hyst, os;
05e82fe4 244 bool is_lm75a = 0;
1da177e4 245
1da177e4
LT
246 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA |
247 I2C_FUNC_SMBUS_WORD_DATA))
8ff69eeb 248 return -ENODEV;
1da177e4
LT
249
250 /* Now, we do the remaining detection. There is no identification-
251 dedicated register so we have to rely on several tricks:
252 unused bits, registers cycling over 8-address boundaries,
253 addresses 0x04-0x07 returning the last read value.
254 The cycling+unused addresses combination is not tested,
255 since it would significantly slow the detection down and would
05e82fe4
LS
256 hardly add any value.
257
258 The National Semiconductor LM75A is different than earlier
259 LM75s. It has an ID byte of 0xaX (where X is the chip
260 revision, with 1 being the only revision in existence) in
261 register 7, and unused registers return 0xff rather than the
262 last read value. */
1da177e4 263
52df6440
JD
264 cur = i2c_smbus_read_word_data(new_client, 0);
265 conf = i2c_smbus_read_byte_data(new_client, 1);
05e82fe4
LS
266
267 /* First check for LM75A */
268 if (i2c_smbus_read_byte_data(new_client, 7) == LM75A_ID) {
269 /* LM75A returns 0xff on unused registers so
270 just to be sure we check for that too. */
271 if (i2c_smbus_read_byte_data(new_client, 4) != 0xff
272 || i2c_smbus_read_byte_data(new_client, 5) != 0xff
273 || i2c_smbus_read_byte_data(new_client, 6) != 0xff)
274 return -ENODEV;
275 is_lm75a = 1;
276 hyst = i2c_smbus_read_word_data(new_client, 2);
277 os = i2c_smbus_read_word_data(new_client, 3);
278 } else { /* Traditional style LM75 detection */
279 /* Unused addresses */
280 hyst = i2c_smbus_read_word_data(new_client, 2);
281 if (i2c_smbus_read_word_data(new_client, 4) != hyst
282 || i2c_smbus_read_word_data(new_client, 5) != hyst
283 || i2c_smbus_read_word_data(new_client, 6) != hyst
284 || i2c_smbus_read_word_data(new_client, 7) != hyst)
285 return -ENODEV;
286 os = i2c_smbus_read_word_data(new_client, 3);
287 if (i2c_smbus_read_word_data(new_client, 4) != os
288 || i2c_smbus_read_word_data(new_client, 5) != os
289 || i2c_smbus_read_word_data(new_client, 6) != os
290 || i2c_smbus_read_word_data(new_client, 7) != os)
291 return -ENODEV;
292 }
1da177e4 293
52df6440
JD
294 /* Unused bits */
295 if (conf & 0xe0)
296 return -ENODEV;
297
298 /* Addresses cycling */
299 for (i = 8; i < 0xff; i += 8) {
300 if (i2c_smbus_read_byte_data(new_client, i + 1) != conf
301 || i2c_smbus_read_word_data(new_client, i + 2) != hyst
302 || i2c_smbus_read_word_data(new_client, i + 3) != os)
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);