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/gpio.h>
11 #include <linux/workqueue.h>
12 #include <linux/device.h>
13 #include <linux/kernel.h>
14 #include <linux/slab.h>
15 #include <linux/sysfs.h>
16 #include <linux/list.h>
17 #include <linux/i2c.h>
18 #include <linux/rtc.h>
24 * ADT75 registers definition
27 #define ADT75_TEMPERATURE 0
28 #define ADT75_CONFIG 1
29 #define ADT75_T_HYST 2
31 #define ADT75_ONESHOT 4
37 #define ADT75_OS_INT 0x2
38 #define ADT75_OS_POLARITY 0x4
39 #define ADT75_FAULT_QUEUE_MASK 0x18
40 #define ADT75_FAULT_QUEUE_OFFSET 3
41 #define ADT75_SMBUS_ALART 0x8
46 #define ADT75_VALUE_SIGN 0x800
47 #define ADT75_VALUE_OFFSET 4
48 #define ADT75_VALUE_FLOAT_OFFSET 4
49 #define ADT75_VALUE_FLOAT_MASK 0xF
53 * struct adt75_chip_info - chip specifc information
56 struct adt75_chip_info {
58 struct i2c_client *client;
59 struct iio_dev *indio_dev;
60 struct work_struct thresh_work;
66 * adt75 register access by I2C
69 static int adt75_i2c_read(struct adt75_chip_info *chip, u8 reg, u8 *data)
71 struct i2c_client *client = chip->client;
74 ret = i2c_smbus_write_byte(client, reg);
76 dev_err(&client->dev, "I2C read register address error\n");
80 if (reg == ADT75_CONFIG || reg == ADT75_ONESHOT)
85 ret = i2c_master_recv(client, data, len);
87 dev_err(&client->dev, "I2C read error\n");
94 static int adt75_i2c_write(struct adt75_chip_info *chip, u8 reg, u8 data)
96 struct i2c_client *client = chip->client;
99 if (reg == ADT75_CONFIG || reg == ADT75_ONESHOT)
100 ret = i2c_smbus_write_byte_data(client, reg, data);
102 ret = i2c_smbus_write_word_data(client, reg, data);
105 dev_err(&client->dev, "I2C write error\n");
110 static ssize_t adt75_show_mode(struct device *dev,
111 struct device_attribute *attr,
114 struct iio_dev *dev_info = dev_get_drvdata(dev);
115 struct adt75_chip_info *chip = dev_info->dev_data;
117 if (chip->config & ADT75_PD)
118 return sprintf(buf, "power-save\n");
120 return sprintf(buf, "full\n");
123 static ssize_t adt75_store_mode(struct device *dev,
124 struct device_attribute *attr,
128 struct iio_dev *dev_info = dev_get_drvdata(dev);
129 struct adt75_chip_info *chip = dev_info->dev_data;
133 ret = adt75_i2c_read(chip, ADT75_CONFIG, &chip->config);
137 config = chip->config & ~ADT75_PD;
138 if (!strcmp(buf, "full"))
141 ret = adt75_i2c_write(chip, ADT75_CONFIG, config);
145 chip->config = config;
150 static IIO_DEVICE_ATTR(mode, S_IRUGO | S_IWUSR,
155 static ssize_t adt75_show_available_modes(struct device *dev,
156 struct device_attribute *attr,
159 return sprintf(buf, "full\npower-down\n");
162 static IIO_DEVICE_ATTR(available_modes, S_IRUGO, adt75_show_available_modes, NULL, 0);
164 static ssize_t adt75_show_oneshot(struct device *dev,
165 struct device_attribute *attr,
168 struct iio_dev *dev_info = dev_get_drvdata(dev);
169 struct adt75_chip_info *chip = dev_info->dev_data;
171 return sprintf(buf, "%d\n", !!(chip->config & ADT75_ONESHOT));
174 static ssize_t adt75_store_oneshot(struct device *dev,
175 struct device_attribute *attr,
179 struct iio_dev *dev_info = dev_get_drvdata(dev);
180 struct adt75_chip_info *chip = dev_info->dev_data;
181 unsigned long data = 0;
185 ret = strict_strtoul(buf, 10, &data);
190 ret = adt75_i2c_read(chip, ADT75_CONFIG, &chip->config);
194 config = chip->config & ~ADT75_ONESHOT;
196 config |= ADT75_ONESHOT;
198 ret = adt75_i2c_write(chip, ADT75_CONFIG, config);
202 chip->config = config;
207 static IIO_DEVICE_ATTR(oneshot, S_IRUGO | S_IWUSR,
212 static ssize_t adt75_show_value(struct device *dev,
213 struct device_attribute *attr,
216 struct iio_dev *dev_info = dev_get_drvdata(dev);
217 struct adt75_chip_info *chip = dev_info->dev_data;
222 if (chip->config & ADT75_PD) {
223 dev_err(dev, "Can't read value in power-down mode.\n");
227 if (chip->config & ADT75_ONESHOT) {
228 /* write to active converter */
229 ret = i2c_smbus_write_byte(chip->client, ADT75_ONESHOT);
234 ret = adt75_i2c_read(chip, ADT75_TEMPERATURE, (u8 *)&data);
238 data = swab16(data) >> ADT75_VALUE_OFFSET;
239 if (data & ADT75_VALUE_SIGN) {
240 /* convert supplement to positive value */
241 data = (ADT75_VALUE_SIGN << 1) - data;
245 return sprintf(buf, "%c%d.%.4d\n", sign,
246 (data >> ADT75_VALUE_FLOAT_OFFSET),
247 (data & ADT75_VALUE_FLOAT_MASK) * 625);
250 static IIO_DEVICE_ATTR(value, S_IRUGO, adt75_show_value, NULL, 0);
252 static ssize_t adt75_show_name(struct device *dev,
253 struct device_attribute *attr,
256 struct iio_dev *dev_info = dev_get_drvdata(dev);
257 struct adt75_chip_info *chip = dev_info->dev_data;
258 return sprintf(buf, "%s\n", chip->name);
261 static IIO_DEVICE_ATTR(name, S_IRUGO, adt75_show_name, NULL, 0);
263 static struct attribute *adt75_attributes[] = {
264 &iio_dev_attr_available_modes.dev_attr.attr,
265 &iio_dev_attr_mode.dev_attr.attr,
266 &iio_dev_attr_oneshot.dev_attr.attr,
267 &iio_dev_attr_value.dev_attr.attr,
268 &iio_dev_attr_name.dev_attr.attr,
272 static const struct attribute_group adt75_attribute_group = {
273 .attrs = adt75_attributes,
277 * temperature bound events
280 #define IIO_EVENT_CODE_ADT75_OTI IIO_BUFFER_EVENT_CODE(0)
282 static void adt75_interrupt_bh(struct work_struct *work_s)
284 struct adt75_chip_info *chip =
285 container_of(work_s, struct adt75_chip_info, thresh_work);
287 enable_irq(chip->client->irq);
289 iio_push_event(chip->indio_dev, 0,
290 IIO_EVENT_CODE_ADT75_OTI,
291 chip->last_timestamp);
294 static int adt75_interrupt(struct iio_dev *dev_info,
299 struct adt75_chip_info *chip = dev_info->dev_data;
301 chip->last_timestamp = timestamp;
302 schedule_work(&chip->thresh_work);
307 IIO_EVENT_SH(adt75, &adt75_interrupt);
309 static ssize_t adt75_show_oti_mode(struct device *dev,
310 struct device_attribute *attr,
313 struct iio_dev *dev_info = dev_get_drvdata(dev);
314 struct adt75_chip_info *chip = dev_info->dev_data;
317 /* retrive ALART status */
318 ret = adt75_i2c_read(chip, ADT75_CONFIG, &chip->config);
322 if (chip->config & ADT75_OS_INT)
323 return sprintf(buf, "interrupt\n");
325 return sprintf(buf, "comparator\n");
328 static ssize_t adt75_set_oti_mode(struct device *dev,
329 struct device_attribute *attr,
333 struct iio_dev *dev_info = dev_get_drvdata(dev);
334 struct adt75_chip_info *chip = dev_info->dev_data;
338 /* retrive ALART status */
339 ret = adt75_i2c_read(chip, ADT75_CONFIG, &chip->config);
343 config = chip->config & ~ADT75_OS_INT;
344 if (strcmp(buf, "comparator") != 0)
345 config |= ADT75_OS_INT;
347 ret = adt75_i2c_write(chip, ADT75_CONFIG, config);
351 chip->config = config;
356 static ssize_t adt75_show_available_oti_modes(struct device *dev,
357 struct device_attribute *attr,
360 return sprintf(buf, "comparator\ninterrupt\n");
363 static ssize_t adt75_show_smbus_alart(struct device *dev,
364 struct device_attribute *attr,
367 struct iio_dev *dev_info = dev_get_drvdata(dev);
368 struct adt75_chip_info *chip = dev_info->dev_data;
371 /* retrive ALART status */
372 ret = adt75_i2c_read(chip, ADT75_CONFIG, &chip->config);
376 return sprintf(buf, "%d\n", !!(chip->config & ADT75_SMBUS_ALART));
379 static ssize_t adt75_set_smbus_alart(struct device *dev,
380 struct device_attribute *attr,
384 struct iio_dev *dev_info = dev_get_drvdata(dev);
385 struct adt75_chip_info *chip = dev_info->dev_data;
386 unsigned long data = 0;
390 ret = strict_strtoul(buf, 10, &data);
394 /* retrive ALART status */
395 ret = adt75_i2c_read(chip, ADT75_CONFIG, &chip->config);
399 config = chip->config & ~ADT75_SMBUS_ALART;
401 config |= ADT75_SMBUS_ALART;
403 ret = adt75_i2c_write(chip, ADT75_CONFIG, config);
407 chip->config = config;
412 static ssize_t adt75_show_fault_queue(struct device *dev,
413 struct device_attribute *attr,
416 struct iio_dev *dev_info = dev_get_drvdata(dev);
417 struct adt75_chip_info *chip = dev_info->dev_data;
420 /* retrive ALART status */
421 ret = adt75_i2c_read(chip, ADT75_CONFIG, &chip->config);
425 return sprintf(buf, "%d\n", (chip->config & ADT75_FAULT_QUEUE_MASK) >>
426 ADT75_FAULT_QUEUE_OFFSET);
429 static ssize_t adt75_set_fault_queue(struct device *dev,
430 struct device_attribute *attr,
434 struct iio_dev *dev_info = dev_get_drvdata(dev);
435 struct adt75_chip_info *chip = dev_info->dev_data;
440 ret = strict_strtoul(buf, 10, &data);
444 /* retrive ALART status */
445 ret = adt75_i2c_read(chip, ADT75_CONFIG, &chip->config);
449 config = chip->config & ~ADT75_FAULT_QUEUE_MASK;
450 config |= (data << ADT75_FAULT_QUEUE_OFFSET);
451 ret = adt75_i2c_write(chip, ADT75_CONFIG, config);
455 chip->config = config;
459 static inline ssize_t adt75_show_t_bound(struct device *dev,
460 struct device_attribute *attr,
464 struct iio_dev *dev_info = dev_get_drvdata(dev);
465 struct adt75_chip_info *chip = dev_info->dev_data;
470 ret = adt75_i2c_read(chip, bound_reg, (u8 *)&data);
474 data = swab16(data) >> ADT75_VALUE_OFFSET;
475 if (data & ADT75_VALUE_SIGN) {
476 /* convert supplement to positive value */
477 data = (ADT75_VALUE_SIGN << 1) - data;
481 return sprintf(buf, "%c%d.%.4d\n", sign,
482 (data >> ADT75_VALUE_FLOAT_OFFSET),
483 (data & ADT75_VALUE_FLOAT_MASK) * 625);
486 static inline ssize_t adt75_set_t_bound(struct device *dev,
487 struct device_attribute *attr,
492 struct iio_dev *dev_info = dev_get_drvdata(dev);
493 struct adt75_chip_info *chip = dev_info->dev_data;
499 pos = strchr(buf, '.');
501 ret = strict_strtol(buf, 10, &tmp1);
503 if (ret || tmp1 > 127 || tmp1 < -128)
508 if (len > ADT75_VALUE_FLOAT_OFFSET)
509 len = ADT75_VALUE_FLOAT_OFFSET;
511 ret = strict_strtol(pos, 10, &tmp2);
514 tmp2 = (tmp2 / 625) * 625;
521 data = (data << ADT75_VALUE_FLOAT_OFFSET) | (tmp2 & ADT75_VALUE_FLOAT_MASK);
523 /* convert positive value to supplyment */
524 data = (ADT75_VALUE_SIGN << 1) - data;
525 data <<= ADT75_VALUE_OFFSET;
528 ret = adt75_i2c_write(chip, bound_reg, (u8)data);
535 static ssize_t adt75_show_t_os(struct device *dev,
536 struct device_attribute *attr,
539 return adt75_show_t_bound(dev, attr,
543 static inline ssize_t adt75_set_t_os(struct device *dev,
544 struct device_attribute *attr,
548 return adt75_set_t_bound(dev, attr,
549 ADT75_T_OS, buf, len);
552 static ssize_t adt75_show_t_hyst(struct device *dev,
553 struct device_attribute *attr,
556 return adt75_show_t_bound(dev, attr,
560 static inline ssize_t adt75_set_t_hyst(struct device *dev,
561 struct device_attribute *attr,
565 return adt75_set_t_bound(dev, attr,
566 ADT75_T_HYST, buf, len);
569 IIO_EVENT_ATTR_SH(oti_mode, iio_event_adt75,
570 adt75_show_oti_mode, adt75_set_oti_mode, 0);
571 IIO_EVENT_ATTR_SH(available_oti_modes, iio_event_adt75,
572 adt75_show_available_oti_modes, NULL, 0);
573 IIO_EVENT_ATTR_SH(smbus_alart, iio_event_adt75,
574 adt75_show_smbus_alart, adt75_set_smbus_alart, 0);
575 IIO_EVENT_ATTR_SH(fault_queue, iio_event_adt75,
576 adt75_show_fault_queue, adt75_set_fault_queue, 0);
577 IIO_EVENT_ATTR_SH(t_os, iio_event_adt75,
578 adt75_show_t_os, adt75_set_t_os, 0);
579 IIO_EVENT_ATTR_SH(t_hyst, iio_event_adt75,
580 adt75_show_t_hyst, adt75_set_t_hyst, 0);
582 static struct attribute *adt75_event_attributes[] = {
583 &iio_event_attr_oti_mode.dev_attr.attr,
584 &iio_event_attr_available_oti_modes.dev_attr.attr,
585 &iio_event_attr_smbus_alart.dev_attr.attr,
586 &iio_event_attr_fault_queue.dev_attr.attr,
587 &iio_event_attr_t_os.dev_attr.attr,
588 &iio_event_attr_t_hyst.dev_attr.attr,
592 static struct attribute_group adt75_event_attribute_group = {
593 .attrs = adt75_event_attributes,
597 * device probe and remove
600 static int __devinit adt75_probe(struct i2c_client *client,
601 const struct i2c_device_id *id)
603 struct adt75_chip_info *chip;
606 chip = kzalloc(sizeof(struct adt75_chip_info), GFP_KERNEL);
611 /* this is only used for device removal purposes */
612 i2c_set_clientdata(client, chip);
614 chip->client = client;
615 chip->name = id->name;
617 chip->indio_dev = iio_allocate_device();
618 if (chip->indio_dev == NULL) {
620 goto error_free_chip;
623 chip->indio_dev->dev.parent = &client->dev;
624 chip->indio_dev->attrs = &adt75_attribute_group;
625 chip->indio_dev->event_attrs = &adt75_event_attribute_group;
626 chip->indio_dev->dev_data = (void *)chip;
627 chip->indio_dev->driver_module = THIS_MODULE;
628 chip->indio_dev->num_interrupt_lines = 1;
629 chip->indio_dev->modes = INDIO_DIRECT_MODE;
631 ret = iio_device_register(chip->indio_dev);
635 if (client->irq > 0) {
636 ret = iio_register_interrupt_line(client->irq,
642 goto error_unreg_dev;
645 * The event handler list element refer to iio_event_adt75.
646 * All event attributes bind to the same event handler.
647 * So, only register event handler once.
649 iio_add_event_to_list(&iio_event_adt75,
650 &chip->indio_dev->interrupts[0]->ev_list);
652 INIT_WORK(&chip->thresh_work, adt75_interrupt_bh);
654 ret = adt75_i2c_read(chip, ADT75_CONFIG, &chip->config);
657 goto error_unreg_irq;
660 /* set irq polarity low level */
661 chip->config &= ~ADT75_OS_POLARITY;
663 ret = adt75_i2c_write(chip, ADT75_CONFIG, chip->config);
666 goto error_unreg_irq;
670 dev_info(&client->dev, "%s temperature sensor registered.\n",
675 iio_unregister_interrupt_line(chip->indio_dev, 0);
677 iio_device_unregister(chip->indio_dev);
679 iio_free_device(chip->indio_dev);
686 static int __devexit adt75_remove(struct i2c_client *client)
688 struct adt75_chip_info *chip = i2c_get_clientdata(client);
689 struct iio_dev *indio_dev = chip->indio_dev;
692 iio_unregister_interrupt_line(indio_dev, 0);
693 iio_device_unregister(indio_dev);
694 iio_free_device(chip->indio_dev);
700 static const struct i2c_device_id adt75_id[] = {
705 MODULE_DEVICE_TABLE(i2c, adt75_id);
707 static struct i2c_driver adt75_driver = {
711 .probe = adt75_probe,
712 .remove = __devexit_p(adt75_remove),
713 .id_table = adt75_id,
716 static __init int adt75_init(void)
718 return i2c_add_driver(&adt75_driver);
721 static __exit void adt75_exit(void)
723 i2c_del_driver(&adt75_driver);
727 MODULE_DESCRIPTION("Analog Devices ADT75 digital"
728 " temperature sensor driver");
729 MODULE_LICENSE("GPL v2");
731 module_init(adt75_init);
732 module_exit(adt75_exit);