2 * ADT75 digital temperature sensor driver supporting ADT75
4 * Copyright 2010 Analog Devices Inc.
6 * Licensed under the GPL-2 or later.
9 #include <linux/interrupt.h>
10 #include <linux/device.h>
11 #include <linux/kernel.h>
12 #include <linux/slab.h>
13 #include <linux/sysfs.h>
14 #include <linux/i2c.h>
15 #include <linux/module.h>
21 * ADT75 registers definition
24 #define ADT75_TEMPERATURE 0
25 #define ADT75_CONFIG 1
26 #define ADT75_T_HYST 2
28 #define ADT75_ONESHOT 4
34 #define ADT75_OS_INT 0x2
35 #define ADT75_OS_POLARITY 0x4
36 #define ADT75_FAULT_QUEUE_MASK 0x18
37 #define ADT75_FAULT_QUEUE_OFFSET 3
38 #define ADT75_SMBUS_ALART 0x8
43 #define ADT75_VALUE_SIGN 0x800
44 #define ADT75_VALUE_OFFSET 4
45 #define ADT75_VALUE_FLOAT_OFFSET 4
46 #define ADT75_VALUE_FLOAT_MASK 0xF
50 * struct adt75_chip_info - chip specifc information
53 struct adt75_chip_info {
54 struct i2c_client *client;
59 * adt75 register access by I2C
62 static int adt75_i2c_read(struct iio_dev *dev_info, u8 reg, u8 *data)
64 struct adt75_chip_info *chip = iio_priv(dev_info);
65 struct i2c_client *client = chip->client;
68 ret = i2c_smbus_write_byte(client, reg);
70 dev_err(&client->dev, "I2C read register address error\n");
74 if (reg == ADT75_CONFIG || reg == ADT75_ONESHOT)
79 ret = i2c_master_recv(client, data, len);
81 dev_err(&client->dev, "I2C read error\n");
88 static int adt75_i2c_write(struct iio_dev *dev_info, u8 reg, u8 data)
90 struct adt75_chip_info *chip = iio_priv(dev_info);
91 struct i2c_client *client = chip->client;
94 if (reg == ADT75_CONFIG || reg == ADT75_ONESHOT)
95 ret = i2c_smbus_write_byte_data(client, reg, data);
97 ret = i2c_smbus_write_word_data(client, reg, data);
100 dev_err(&client->dev, "I2C write error\n");
105 static ssize_t adt75_show_mode(struct device *dev,
106 struct device_attribute *attr,
109 struct adt75_chip_info *chip = iio_priv(dev_get_drvdata(dev));
111 if (chip->config & ADT75_PD)
112 return sprintf(buf, "power-save\n");
114 return sprintf(buf, "full\n");
117 static ssize_t adt75_store_mode(struct device *dev,
118 struct device_attribute *attr,
122 struct iio_dev *dev_info = dev_get_drvdata(dev);
123 struct adt75_chip_info *chip = iio_priv(dev_info);
127 ret = adt75_i2c_read(dev_info, ADT75_CONFIG, &chip->config);
131 config = chip->config & ~ADT75_PD;
132 if (!strcmp(buf, "full"))
135 ret = adt75_i2c_write(dev_info, ADT75_CONFIG, config);
139 chip->config = config;
144 static IIO_DEVICE_ATTR(mode, S_IRUGO | S_IWUSR,
149 static ssize_t adt75_show_available_modes(struct device *dev,
150 struct device_attribute *attr,
153 return sprintf(buf, "full\npower-down\n");
156 static IIO_DEVICE_ATTR(available_modes, S_IRUGO, adt75_show_available_modes, NULL, 0);
158 static ssize_t adt75_show_oneshot(struct device *dev,
159 struct device_attribute *attr,
162 struct adt75_chip_info *chip = iio_priv(dev_get_drvdata(dev));
164 return sprintf(buf, "%d\n", !!(chip->config & ADT75_ONESHOT));
167 static ssize_t adt75_store_oneshot(struct device *dev,
168 struct device_attribute *attr,
172 struct iio_dev *dev_info = dev_get_drvdata(dev);
173 struct adt75_chip_info *chip = iio_priv(dev_info);
174 unsigned long data = 0;
178 ret = strict_strtoul(buf, 10, &data);
183 ret = adt75_i2c_read(dev_info, ADT75_CONFIG, &chip->config);
187 config = chip->config & ~ADT75_ONESHOT;
189 config |= ADT75_ONESHOT;
191 ret = adt75_i2c_write(dev_info, ADT75_CONFIG, config);
195 chip->config = config;
200 static IIO_DEVICE_ATTR(oneshot, S_IRUGO | S_IWUSR,
205 static ssize_t adt75_show_value(struct device *dev,
206 struct device_attribute *attr,
209 struct iio_dev *dev_info = dev_get_drvdata(dev);
210 struct adt75_chip_info *chip = iio_priv(dev_info);
215 if (chip->config & ADT75_PD) {
216 dev_err(dev, "Can't read value in power-down mode.\n");
220 if (chip->config & ADT75_ONESHOT) {
221 /* write to active converter */
222 ret = i2c_smbus_write_byte(chip->client, ADT75_ONESHOT);
227 ret = adt75_i2c_read(dev_info, ADT75_TEMPERATURE, (u8 *)&data);
231 data = swab16(data) >> ADT75_VALUE_OFFSET;
232 if (data & ADT75_VALUE_SIGN) {
233 /* convert supplement to positive value */
234 data = (ADT75_VALUE_SIGN << 1) - data;
238 return sprintf(buf, "%c%d.%.4d\n", sign,
239 (data >> ADT75_VALUE_FLOAT_OFFSET),
240 (data & ADT75_VALUE_FLOAT_MASK) * 625);
243 static IIO_DEVICE_ATTR(value, S_IRUGO, adt75_show_value, NULL, 0);
245 static struct attribute *adt75_attributes[] = {
246 &iio_dev_attr_available_modes.dev_attr.attr,
247 &iio_dev_attr_mode.dev_attr.attr,
248 &iio_dev_attr_oneshot.dev_attr.attr,
249 &iio_dev_attr_value.dev_attr.attr,
253 static const struct attribute_group adt75_attribute_group = {
254 .attrs = adt75_attributes,
258 * temperature bound events
261 #define IIO_EVENT_CODE_ADT75_OTI IIO_UNMOD_EVENT_CODE(IIO_TEMP, \
263 IIO_EV_TYPE_THRESH, \
266 static irqreturn_t adt75_event_handler(int irq, void *private)
268 iio_push_event(private,
269 IIO_EVENT_CODE_ADT75_OTI,
275 static ssize_t adt75_show_oti_mode(struct device *dev,
276 struct device_attribute *attr,
279 struct iio_dev *dev_info = dev_get_drvdata(dev);
280 struct adt75_chip_info *chip = iio_priv(dev_info);
283 /* retrive ALART status */
284 ret = adt75_i2c_read(dev_info, ADT75_CONFIG, &chip->config);
288 if (chip->config & ADT75_OS_INT)
289 return sprintf(buf, "interrupt\n");
291 return sprintf(buf, "comparator\n");
294 static ssize_t adt75_set_oti_mode(struct device *dev,
295 struct device_attribute *attr,
299 struct iio_dev *dev_info = dev_get_drvdata(dev);
300 struct adt75_chip_info *chip = iio_priv(dev_info);
304 /* retrive ALART status */
305 ret = adt75_i2c_read(dev_info, ADT75_CONFIG, &chip->config);
309 config = chip->config & ~ADT75_OS_INT;
310 if (strcmp(buf, "comparator") != 0)
311 config |= ADT75_OS_INT;
313 ret = adt75_i2c_write(dev_info, ADT75_CONFIG, config);
317 chip->config = config;
322 static ssize_t adt75_show_available_oti_modes(struct device *dev,
323 struct device_attribute *attr,
326 return sprintf(buf, "comparator\ninterrupt\n");
329 static ssize_t adt75_show_smbus_alart(struct device *dev,
330 struct device_attribute *attr,
333 struct iio_dev *dev_info = dev_get_drvdata(dev);
334 struct adt75_chip_info *chip = iio_priv(dev_info);
337 /* retrive ALART status */
338 ret = adt75_i2c_read(dev_info, ADT75_CONFIG, &chip->config);
342 return sprintf(buf, "%d\n", !!(chip->config & ADT75_SMBUS_ALART));
345 static ssize_t adt75_set_smbus_alart(struct device *dev,
346 struct device_attribute *attr,
350 struct iio_dev *dev_info = dev_get_drvdata(dev);
351 struct adt75_chip_info *chip = iio_priv(dev_info);
352 unsigned long data = 0;
356 ret = strict_strtoul(buf, 10, &data);
360 /* retrive ALART status */
361 ret = adt75_i2c_read(dev_info, ADT75_CONFIG, &chip->config);
365 config = chip->config & ~ADT75_SMBUS_ALART;
367 config |= ADT75_SMBUS_ALART;
369 ret = adt75_i2c_write(dev_info, ADT75_CONFIG, config);
373 chip->config = config;
378 static ssize_t adt75_show_fault_queue(struct device *dev,
379 struct device_attribute *attr,
382 struct iio_dev *dev_info = dev_get_drvdata(dev);
383 struct adt75_chip_info *chip = iio_priv(dev_info);
386 /* retrive ALART status */
387 ret = adt75_i2c_read(dev_info, ADT75_CONFIG, &chip->config);
391 return sprintf(buf, "%d\n", (chip->config & ADT75_FAULT_QUEUE_MASK) >>
392 ADT75_FAULT_QUEUE_OFFSET);
395 static ssize_t adt75_set_fault_queue(struct device *dev,
396 struct device_attribute *attr,
400 struct iio_dev *dev_info = dev_get_drvdata(dev);
401 struct adt75_chip_info *chip = iio_priv(dev_info);
406 ret = strict_strtoul(buf, 10, &data);
410 /* retrive ALART status */
411 ret = adt75_i2c_read(dev_info, ADT75_CONFIG, &chip->config);
415 config = chip->config & ~ADT75_FAULT_QUEUE_MASK;
416 config |= (data << ADT75_FAULT_QUEUE_OFFSET);
417 ret = adt75_i2c_write(dev_info, ADT75_CONFIG, config);
421 chip->config = config;
425 static inline ssize_t adt75_show_t_bound(struct device *dev,
426 struct device_attribute *attr,
429 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
430 struct iio_dev *dev_info = dev_get_drvdata(dev);
435 ret = adt75_i2c_read(dev_info, this_attr->address, (u8 *)&data);
439 data = swab16(data) >> ADT75_VALUE_OFFSET;
440 if (data & ADT75_VALUE_SIGN) {
441 /* convert supplement to positive value */
442 data = (ADT75_VALUE_SIGN << 1) - data;
446 return sprintf(buf, "%c%d.%.4d\n", sign,
447 (data >> ADT75_VALUE_FLOAT_OFFSET),
448 (data & ADT75_VALUE_FLOAT_MASK) * 625);
451 static inline ssize_t adt75_set_t_bound(struct device *dev,
452 struct device_attribute *attr,
456 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
457 struct iio_dev *dev_info = dev_get_drvdata(dev);
463 pos = strchr(buf, '.');
465 ret = strict_strtol(buf, 10, &tmp1);
467 if (ret || tmp1 > 127 || tmp1 < -128)
472 if (len > ADT75_VALUE_FLOAT_OFFSET)
473 len = ADT75_VALUE_FLOAT_OFFSET;
475 ret = strict_strtol(pos, 10, &tmp2);
478 tmp2 = (tmp2 / 625) * 625;
485 data = (data << ADT75_VALUE_FLOAT_OFFSET) | (tmp2 & ADT75_VALUE_FLOAT_MASK);
487 /* convert positive value to supplyment */
488 data = (ADT75_VALUE_SIGN << 1) - data;
489 data <<= ADT75_VALUE_OFFSET;
492 ret = adt75_i2c_write(dev_info, this_attr->address, (u8)data);
500 static IIO_DEVICE_ATTR(oti_mode,
502 adt75_show_oti_mode, adt75_set_oti_mode, 0);
503 static IIO_DEVICE_ATTR(available_oti_modes,
505 adt75_show_available_oti_modes, NULL, 0);
506 static IIO_DEVICE_ATTR(smbus_alart,
508 adt75_show_smbus_alart, adt75_set_smbus_alart, 0);
509 static IIO_DEVICE_ATTR(fault_queue,
511 adt75_show_fault_queue, adt75_set_fault_queue, 0);
512 static IIO_DEVICE_ATTR(t_os_value,
514 adt75_show_t_bound, adt75_set_t_bound,
516 static IIO_DEVICE_ATTR(t_hyst_value,
518 adt75_show_t_bound, adt75_set_t_bound,
521 static struct attribute *adt75_event_attributes[] = {
522 &iio_dev_attr_oti_mode.dev_attr.attr,
523 &iio_dev_attr_available_oti_modes.dev_attr.attr,
524 &iio_dev_attr_smbus_alart.dev_attr.attr,
525 &iio_dev_attr_fault_queue.dev_attr.attr,
526 &iio_dev_attr_t_os_value.dev_attr.attr,
527 &iio_dev_attr_t_hyst_value.dev_attr.attr,
531 static struct attribute_group adt75_event_attribute_group = {
532 .attrs = adt75_event_attributes,
536 static const struct iio_info adt75_info = {
537 .attrs = &adt75_attribute_group,
538 .event_attrs = &adt75_event_attribute_group,
539 .driver_module = THIS_MODULE,
543 * device probe and remove
546 static int __devinit adt75_probe(struct i2c_client *client,
547 const struct i2c_device_id *id)
549 struct adt75_chip_info *chip;
550 struct iio_dev *indio_dev;
553 indio_dev = iio_allocate_device(sizeof(*chip));
554 if (indio_dev == NULL) {
558 chip = iio_priv(indio_dev);
560 /* this is only used for device removal purposes */
561 i2c_set_clientdata(client, indio_dev);
563 chip->client = client;
565 indio_dev->name = id->name;
566 indio_dev->dev.parent = &client->dev;
567 indio_dev->info = &adt75_info;
568 indio_dev->modes = INDIO_DIRECT_MODE;
570 ret = iio_device_register(indio_dev);
574 if (client->irq > 0) {
575 ret = request_threaded_irq(client->irq,
577 &adt75_event_handler,
582 goto error_unreg_dev;
584 ret = adt75_i2c_read(indio_dev, ADT75_CONFIG, &chip->config);
587 goto error_unreg_irq;
590 /* set irq polarity low level */
591 chip->config &= ~ADT75_OS_POLARITY;
593 ret = adt75_i2c_write(indio_dev, ADT75_CONFIG, chip->config);
596 goto error_unreg_irq;
600 dev_info(&client->dev, "%s temperature sensor registered.\n",
605 free_irq(client->irq, indio_dev);
607 iio_device_unregister(indio_dev);
609 iio_free_device(indio_dev);
614 static int __devexit adt75_remove(struct i2c_client *client)
616 struct iio_dev *indio_dev = i2c_get_clientdata(client);
619 free_irq(client->irq, indio_dev);
620 iio_device_unregister(indio_dev);
621 iio_free_device(indio_dev);
626 static const struct i2c_device_id adt75_id[] = {
631 MODULE_DEVICE_TABLE(i2c, adt75_id);
633 static struct i2c_driver adt75_driver = {
637 .probe = adt75_probe,
638 .remove = __devexit_p(adt75_remove),
639 .id_table = adt75_id,
642 static __init int adt75_init(void)
644 return i2c_add_driver(&adt75_driver);
647 static __exit void adt75_exit(void)
649 i2c_del_driver(&adt75_driver);
652 MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>");
653 MODULE_DESCRIPTION("Analog Devices ADT75 digital"
654 " temperature sensor driver");
655 MODULE_LICENSE("GPL v2");
657 module_init(adt75_init);
658 module_exit(adt75_exit);