2 * ADT7410 digital temperature sensor driver supporting ADT7310/ADT7410
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/list.h>
15 #include <linux/i2c.h>
16 #include <linux/spi/spi.h>
17 #include <linux/module.h>
19 #include <linux/iio/iio.h>
20 #include <linux/iio/sysfs.h>
21 #include <linux/iio/events.h>
24 * ADT7410 registers definition
27 #define ADT7410_TEMPERATURE 0
28 #define ADT7410_STATUS 2
29 #define ADT7410_CONFIG 3
30 #define ADT7410_T_ALARM_HIGH 4
31 #define ADT7410_T_ALARM_LOW 6
32 #define ADT7410_T_CRIT 8
33 #define ADT7410_T_HYST 0xA
34 #define ADT7410_ID 0xB
35 #define ADT7410_RESET 0x2F
38 * ADT7310 registers definition
41 #define ADT7310_STATUS 0
42 #define ADT7310_CONFIG 1
43 #define ADT7310_TEMPERATURE 2
45 #define ADT7310_T_CRIT 4
46 #define ADT7310_T_HYST 5
47 #define ADT7310_T_ALARM_HIGH 6
48 #define ADT7310_T_ALARM_LOW 7
53 #define ADT7410_STAT_T_LOW 0x10
54 #define ADT7410_STAT_T_HIGH 0x20
55 #define ADT7410_STAT_T_CRIT 0x40
56 #define ADT7410_STAT_NOT_RDY 0x80
61 #define ADT7410_FAULT_QUEUE_MASK 0x3
62 #define ADT7410_CT_POLARITY 0x4
63 #define ADT7410_INT_POLARITY 0x8
64 #define ADT7410_EVENT_MODE 0x10
65 #define ADT7410_MODE_MASK 0x60
66 #define ADT7410_ONESHOT 0x20
67 #define ADT7410_SPS 0x40
68 #define ADT7410_PD 0x60
69 #define ADT7410_RESOLUTION 0x80
74 #define ADT7410_T16_VALUE_SIGN 0x8000
75 #define ADT7410_T16_VALUE_FLOAT_OFFSET 7
76 #define ADT7410_T16_VALUE_FLOAT_MASK 0x7F
77 #define ADT7410_T13_VALUE_SIGN 0x1000
78 #define ADT7410_T13_VALUE_OFFSET 3
79 #define ADT7410_T13_VALUE_FLOAT_OFFSET 4
80 #define ADT7410_T13_VALUE_FLOAT_MASK 0xF
81 #define ADT7410_T_HYST_MASK 0xF
82 #define ADT7410_DEVICE_ID_MASK 0xF
83 #define ADT7410_MANUFACTORY_ID_MASK 0xF0
84 #define ADT7410_MANUFACTORY_ID_OFFSET 4
87 #define ADT7310_CMD_REG_MASK 0x28
88 #define ADT7310_CMD_REG_OFFSET 3
89 #define ADT7310_CMD_READ 0x40
90 #define ADT7310_CMD_CON_READ 0x4
92 #define ADT7410_IRQS 2
95 * struct adt7410_chip_info - chip specifc information
98 struct adt7410_chip_info;
101 int (*read_word)(struct adt7410_chip_info *, u8 reg, u16 *data);
102 int (*write_word)(struct adt7410_chip_info *, u8 reg, u16 data);
103 int (*read_byte)(struct adt7410_chip_info *, u8 reg, u8 *data);
104 int (*write_byte)(struct adt7410_chip_info *, u8 reg, u8 data);
107 struct adt7410_chip_info {
111 const struct adt7410_ops *ops;
114 static int adt7410_read_word(struct adt7410_chip_info *chip, u8 reg, u16 *data)
116 return chip->ops->read_word(chip, reg, data);
119 static int adt7410_write_word(struct adt7410_chip_info *chip, u8 reg, u16 data)
121 return chip->ops->write_word(chip, reg, data);
124 static int adt7410_read_byte(struct adt7410_chip_info *chip, u8 reg, u8 *data)
126 return chip->ops->read_byte(chip, reg, data);
129 static int adt7410_write_byte(struct adt7410_chip_info *chip, u8 reg, u8 data)
131 return chip->ops->write_byte(chip, reg, data);
134 static ssize_t adt7410_show_mode(struct device *dev,
135 struct device_attribute *attr,
138 struct iio_dev *dev_info = dev_to_iio_dev(dev);
139 struct adt7410_chip_info *chip = iio_priv(dev_info);
142 config = chip->config & ADT7410_MODE_MASK;
146 return sprintf(buf, "power-down\n");
147 case ADT7410_ONESHOT:
148 return sprintf(buf, "one-shot\n");
150 return sprintf(buf, "sps\n");
152 return sprintf(buf, "full\n");
156 static ssize_t adt7410_store_mode(struct device *dev,
157 struct device_attribute *attr,
161 struct iio_dev *dev_info = dev_to_iio_dev(dev);
162 struct adt7410_chip_info *chip = iio_priv(dev_info);
166 ret = adt7410_read_byte(chip, ADT7410_CONFIG, &chip->config);
170 config = chip->config & (~ADT7410_MODE_MASK);
171 if (strcmp(buf, "power-down"))
172 config |= ADT7410_PD;
173 else if (strcmp(buf, "one-shot"))
174 config |= ADT7410_ONESHOT;
175 else if (strcmp(buf, "sps"))
176 config |= ADT7410_SPS;
178 ret = adt7410_write_byte(chip, ADT7410_CONFIG, config);
182 chip->config = config;
187 static IIO_DEVICE_ATTR(mode, S_IRUGO | S_IWUSR,
192 static ssize_t adt7410_show_available_modes(struct device *dev,
193 struct device_attribute *attr,
196 return sprintf(buf, "full\none-shot\nsps\npower-down\n");
199 static IIO_DEVICE_ATTR(available_modes, S_IRUGO, adt7410_show_available_modes, NULL, 0);
201 static ssize_t adt7410_show_resolution(struct device *dev,
202 struct device_attribute *attr,
205 struct iio_dev *dev_info = dev_to_iio_dev(dev);
206 struct adt7410_chip_info *chip = iio_priv(dev_info);
210 ret = adt7410_read_byte(chip, ADT7410_CONFIG, &chip->config);
214 if (chip->config & ADT7410_RESOLUTION)
219 return sprintf(buf, "%d bits\n", bits);
222 static ssize_t adt7410_store_resolution(struct device *dev,
223 struct device_attribute *attr,
227 struct iio_dev *dev_info = dev_to_iio_dev(dev);
228 struct adt7410_chip_info *chip = iio_priv(dev_info);
233 ret = strict_strtoul(buf, 10, &data);
237 ret = adt7410_read_byte(chip, ADT7410_CONFIG, &chip->config);
241 config = chip->config & (~ADT7410_RESOLUTION);
243 config |= ADT7410_RESOLUTION;
245 ret = adt7410_write_byte(chip, ADT7410_CONFIG, config);
249 chip->config = config;
254 static IIO_DEVICE_ATTR(resolution, S_IRUGO | S_IWUSR,
255 adt7410_show_resolution,
256 adt7410_store_resolution,
259 static ssize_t adt7410_show_id(struct device *dev,
260 struct device_attribute *attr,
263 struct iio_dev *dev_info = dev_to_iio_dev(dev);
264 struct adt7410_chip_info *chip = iio_priv(dev_info);
268 ret = adt7410_read_byte(chip, ADT7410_ID, &id);
272 return sprintf(buf, "device id: 0x%x\nmanufactory id: 0x%x\n",
273 id & ADT7410_DEVICE_ID_MASK,
274 (id & ADT7410_MANUFACTORY_ID_MASK) >> ADT7410_MANUFACTORY_ID_OFFSET);
277 static IIO_DEVICE_ATTR(id, S_IRUGO | S_IWUSR,
282 static ssize_t adt7410_convert_temperature(struct adt7410_chip_info *chip,
287 if (!(chip->config & ADT7410_RESOLUTION))
290 if (data & ADT7410_T16_VALUE_SIGN) {
291 /* convert supplement to positive value */
292 data = (u16)((ADT7410_T16_VALUE_SIGN << 1) - (u32)data);
295 return sprintf(buf, "%c%d.%.7d\n", sign,
296 (data >> ADT7410_T16_VALUE_FLOAT_OFFSET),
297 (data & ADT7410_T16_VALUE_FLOAT_MASK) * 78125);
300 static ssize_t adt7410_show_value(struct device *dev,
301 struct device_attribute *attr,
304 struct iio_dev *dev_info = dev_to_iio_dev(dev);
305 struct adt7410_chip_info *chip = iio_priv(dev_info);
311 ret = adt7410_read_byte(chip, ADT7410_STATUS, &status);
317 } while (status & ADT7410_STAT_NOT_RDY);
319 ret = adt7410_read_word(chip, ADT7410_TEMPERATURE, &data);
323 return adt7410_convert_temperature(chip, data, buf);
326 static IIO_DEVICE_ATTR(value, S_IRUGO, adt7410_show_value, NULL, 0);
328 static struct attribute *adt7410_attributes[] = {
329 &iio_dev_attr_available_modes.dev_attr.attr,
330 &iio_dev_attr_mode.dev_attr.attr,
331 &iio_dev_attr_resolution.dev_attr.attr,
332 &iio_dev_attr_id.dev_attr.attr,
333 &iio_dev_attr_value.dev_attr.attr,
337 static const struct attribute_group adt7410_attribute_group = {
338 .attrs = adt7410_attributes,
341 static irqreturn_t adt7410_event_handler(int irq, void *private)
343 struct iio_dev *indio_dev = private;
344 struct adt7410_chip_info *chip = iio_priv(indio_dev);
345 s64 timestamp = iio_get_time_ns();
348 if (adt7410_read_byte(chip, ADT7410_STATUS, &status))
351 if (status & ADT7410_STAT_T_HIGH)
352 iio_push_event(indio_dev,
353 IIO_UNMOD_EVENT_CODE(IIO_TEMP, 0,
357 if (status & ADT7410_STAT_T_LOW)
358 iio_push_event(indio_dev,
359 IIO_UNMOD_EVENT_CODE(IIO_TEMP, 0,
363 if (status & ADT7410_STAT_T_CRIT)
364 iio_push_event(indio_dev,
365 IIO_UNMOD_EVENT_CODE(IIO_TEMP, 0,
373 static ssize_t adt7410_show_event_mode(struct device *dev,
374 struct device_attribute *attr,
377 struct iio_dev *dev_info = dev_to_iio_dev(dev);
378 struct adt7410_chip_info *chip = iio_priv(dev_info);
381 ret = adt7410_read_byte(chip, ADT7410_CONFIG, &chip->config);
385 if (chip->config & ADT7410_EVENT_MODE)
386 return sprintf(buf, "interrupt\n");
388 return sprintf(buf, "comparator\n");
391 static ssize_t adt7410_set_event_mode(struct device *dev,
392 struct device_attribute *attr,
396 struct iio_dev *dev_info = dev_to_iio_dev(dev);
397 struct adt7410_chip_info *chip = iio_priv(dev_info);
401 ret = adt7410_read_byte(chip, ADT7410_CONFIG, &chip->config);
405 config = chip->config &= ~ADT7410_EVENT_MODE;
406 if (strcmp(buf, "comparator") != 0)
407 config |= ADT7410_EVENT_MODE;
409 ret = adt7410_write_byte(chip, ADT7410_CONFIG, config);
413 chip->config = config;
418 static ssize_t adt7410_show_available_event_modes(struct device *dev,
419 struct device_attribute *attr,
422 return sprintf(buf, "comparator\ninterrupt\n");
425 static ssize_t adt7410_show_fault_queue(struct device *dev,
426 struct device_attribute *attr,
429 struct iio_dev *dev_info = dev_to_iio_dev(dev);
430 struct adt7410_chip_info *chip = iio_priv(dev_info);
433 ret = adt7410_read_byte(chip, ADT7410_CONFIG, &chip->config);
437 return sprintf(buf, "%d\n", chip->config & ADT7410_FAULT_QUEUE_MASK);
440 static ssize_t adt7410_set_fault_queue(struct device *dev,
441 struct device_attribute *attr,
445 struct iio_dev *dev_info = dev_to_iio_dev(dev);
446 struct adt7410_chip_info *chip = iio_priv(dev_info);
451 ret = strict_strtoul(buf, 10, &data);
455 ret = adt7410_read_byte(chip, ADT7410_CONFIG, &chip->config);
459 config = chip->config & ~ADT7410_FAULT_QUEUE_MASK;
461 ret = adt7410_write_byte(chip, ADT7410_CONFIG, config);
465 chip->config = config;
470 static inline ssize_t adt7410_show_t_bound(struct device *dev,
471 struct device_attribute *attr,
475 struct iio_dev *dev_info = dev_to_iio_dev(dev);
476 struct adt7410_chip_info *chip = iio_priv(dev_info);
480 ret = adt7410_read_word(chip, bound_reg, &data);
484 return adt7410_convert_temperature(chip, data, buf);
487 static inline ssize_t adt7410_set_t_bound(struct device *dev,
488 struct device_attribute *attr,
493 struct iio_dev *dev_info = dev_to_iio_dev(dev);
494 struct adt7410_chip_info *chip = iio_priv(dev_info);
500 pos = strchr(buf, '.');
502 ret = strict_strtol(buf, 10, &tmp1);
504 if (ret || tmp1 > 127 || tmp1 < -128)
510 if (chip->config & ADT7410_RESOLUTION) {
511 if (len > ADT7410_T16_VALUE_FLOAT_OFFSET)
512 len = ADT7410_T16_VALUE_FLOAT_OFFSET;
514 ret = strict_strtol(pos, 10, &tmp2);
517 tmp2 = (tmp2 / 78125) * 78125;
519 if (len > ADT7410_T13_VALUE_FLOAT_OFFSET)
520 len = ADT7410_T13_VALUE_FLOAT_OFFSET;
522 ret = strict_strtol(pos, 10, &tmp2);
525 tmp2 = (tmp2 / 625) * 625;
534 if (chip->config & ADT7410_RESOLUTION) {
535 data = (data << ADT7410_T16_VALUE_FLOAT_OFFSET) |
536 (tmp2 & ADT7410_T16_VALUE_FLOAT_MASK);
539 /* convert positive value to supplyment */
540 data = (u16)((ADT7410_T16_VALUE_SIGN << 1) - (u32)data);
542 data = (data << ADT7410_T13_VALUE_FLOAT_OFFSET) |
543 (tmp2 & ADT7410_T13_VALUE_FLOAT_MASK);
546 /* convert positive value to supplyment */
547 data = (ADT7410_T13_VALUE_SIGN << 1) - data;
548 data <<= ADT7410_T13_VALUE_OFFSET;
551 ret = adt7410_write_word(chip, bound_reg, data);
558 static ssize_t adt7410_show_t_alarm_high(struct device *dev,
559 struct device_attribute *attr,
562 return adt7410_show_t_bound(dev, attr,
563 ADT7410_T_ALARM_HIGH, buf);
566 static inline ssize_t adt7410_set_t_alarm_high(struct device *dev,
567 struct device_attribute *attr,
571 return adt7410_set_t_bound(dev, attr,
572 ADT7410_T_ALARM_HIGH, buf, len);
575 static ssize_t adt7410_show_t_alarm_low(struct device *dev,
576 struct device_attribute *attr,
579 return adt7410_show_t_bound(dev, attr,
580 ADT7410_T_ALARM_LOW, buf);
583 static inline ssize_t adt7410_set_t_alarm_low(struct device *dev,
584 struct device_attribute *attr,
588 return adt7410_set_t_bound(dev, attr,
589 ADT7410_T_ALARM_LOW, buf, len);
592 static ssize_t adt7410_show_t_crit(struct device *dev,
593 struct device_attribute *attr,
596 return adt7410_show_t_bound(dev, attr,
597 ADT7410_T_CRIT, buf);
600 static inline ssize_t adt7410_set_t_crit(struct device *dev,
601 struct device_attribute *attr,
605 return adt7410_set_t_bound(dev, attr,
606 ADT7410_T_CRIT, buf, len);
609 static ssize_t adt7410_show_t_hyst(struct device *dev,
610 struct device_attribute *attr,
613 struct iio_dev *dev_info = dev_to_iio_dev(dev);
614 struct adt7410_chip_info *chip = iio_priv(dev_info);
618 ret = adt7410_read_byte(chip, ADT7410_T_HYST, &t_hyst);
622 return sprintf(buf, "%d\n", t_hyst & ADT7410_T_HYST_MASK);
625 static inline ssize_t adt7410_set_t_hyst(struct device *dev,
626 struct device_attribute *attr,
630 struct iio_dev *dev_info = dev_to_iio_dev(dev);
631 struct adt7410_chip_info *chip = iio_priv(dev_info);
636 ret = strict_strtol(buf, 10, &data);
638 if (ret || data > ADT7410_T_HYST_MASK)
643 ret = adt7410_write_byte(chip, ADT7410_T_HYST, t_hyst);
650 static IIO_DEVICE_ATTR(event_mode,
652 adt7410_show_event_mode, adt7410_set_event_mode, 0);
653 static IIO_DEVICE_ATTR(available_event_modes,
655 adt7410_show_available_event_modes, NULL, 0);
656 static IIO_DEVICE_ATTR(fault_queue,
658 adt7410_show_fault_queue, adt7410_set_fault_queue, 0);
659 static IIO_DEVICE_ATTR(t_alarm_high,
661 adt7410_show_t_alarm_high, adt7410_set_t_alarm_high, 0);
662 static IIO_DEVICE_ATTR(t_alarm_low,
664 adt7410_show_t_alarm_low, adt7410_set_t_alarm_low, 0);
665 static IIO_DEVICE_ATTR(t_crit,
667 adt7410_show_t_crit, adt7410_set_t_crit, 0);
668 static IIO_DEVICE_ATTR(t_hyst,
670 adt7410_show_t_hyst, adt7410_set_t_hyst, 0);
672 static struct attribute *adt7410_event_int_attributes[] = {
673 &iio_dev_attr_event_mode.dev_attr.attr,
674 &iio_dev_attr_available_event_modes.dev_attr.attr,
675 &iio_dev_attr_fault_queue.dev_attr.attr,
676 &iio_dev_attr_t_alarm_high.dev_attr.attr,
677 &iio_dev_attr_t_alarm_low.dev_attr.attr,
678 &iio_dev_attr_t_crit.dev_attr.attr,
679 &iio_dev_attr_t_hyst.dev_attr.attr,
683 static struct attribute_group adt7410_event_attribute_group = {
684 .attrs = adt7410_event_int_attributes,
688 static const struct iio_info adt7410_info = {
689 .attrs = &adt7410_attribute_group,
690 .event_attrs = &adt7410_event_attribute_group,
691 .driver_module = THIS_MODULE,
695 * device probe and remove
698 static int adt7410_probe(struct device *dev, int irq,
699 const char *name, const struct adt7410_ops *ops)
701 unsigned long *adt7410_platform_data = dev->platform_data;
702 unsigned long local_pdata[] = {0, 0};
703 struct adt7410_chip_info *chip;
704 struct iio_dev *indio_dev;
707 indio_dev = iio_device_alloc(sizeof(*chip));
708 if (indio_dev == NULL) {
712 chip = iio_priv(indio_dev);
713 /* this is only used for device removal purposes */
714 dev_set_drvdata(dev, indio_dev);
719 indio_dev->name = name;
720 indio_dev->dev.parent = dev;
721 indio_dev->info = &adt7410_info;
722 indio_dev->modes = INDIO_DIRECT_MODE;
724 if (!adt7410_platform_data)
725 adt7410_platform_data = local_pdata;
727 /* CT critcal temperature event. line 0 */
729 ret = request_threaded_irq(irq,
731 &adt7410_event_handler,
732 IRQF_TRIGGER_LOW | IRQF_ONESHOT,
739 /* INT bound temperature alarm event. line 1 */
740 if (adt7410_platform_data[0]) {
741 ret = request_threaded_irq(adt7410_platform_data[0],
743 &adt7410_event_handler,
744 adt7410_platform_data[1] |
749 goto error_unreg_ct_irq;
752 ret = adt7410_read_byte(chip, ADT7410_CONFIG, &chip->config);
755 goto error_unreg_int_irq;
758 chip->config |= ADT7410_RESOLUTION;
760 if (irq && adt7410_platform_data[0]) {
762 /* set irq polarity low level */
763 chip->config &= ~ADT7410_CT_POLARITY;
765 if (adt7410_platform_data[1] & IRQF_TRIGGER_HIGH)
766 chip->config |= ADT7410_INT_POLARITY;
768 chip->config &= ~ADT7410_INT_POLARITY;
771 ret = adt7410_write_byte(chip, ADT7410_CONFIG, chip->config);
774 goto error_unreg_int_irq;
776 ret = iio_device_register(indio_dev);
778 goto error_unreg_int_irq;
780 dev_info(dev, "%s temperature sensor registered.\n",
786 free_irq(adt7410_platform_data[0], indio_dev);
788 free_irq(irq, indio_dev);
790 iio_device_free(indio_dev);
795 static int adt7410_remove(struct device *dev, int irq)
797 struct iio_dev *indio_dev = dev_get_drvdata(dev);
798 unsigned long *adt7410_platform_data = dev->platform_data;
800 iio_device_unregister(indio_dev);
801 if (adt7410_platform_data[0])
802 free_irq(adt7410_platform_data[0], indio_dev);
804 free_irq(irq, indio_dev);
805 iio_device_free(indio_dev);
810 #if IS_ENABLED(CONFIG_I2C)
812 static int adt7410_i2c_read_word(struct adt7410_chip_info *chip, u8 reg,
815 struct i2c_client *client = to_i2c_client(chip->dev);
818 ret = i2c_smbus_read_word_data(client, reg);
820 dev_err(&client->dev, "I2C read error\n");
824 *data = swab16((u16)ret);
829 static int adt7410_i2c_write_word(struct adt7410_chip_info *chip, u8 reg,
832 struct i2c_client *client = to_i2c_client(chip->dev);
835 ret = i2c_smbus_write_word_data(client, reg, swab16(data));
837 dev_err(&client->dev, "I2C write error\n");
842 static int adt7410_i2c_read_byte(struct adt7410_chip_info *chip, u8 reg,
845 struct i2c_client *client = to_i2c_client(chip->dev);
848 ret = i2c_smbus_read_byte_data(client, reg);
850 dev_err(&client->dev, "I2C read error\n");
859 static int adt7410_i2c_write_byte(struct adt7410_chip_info *chip, u8 reg,
862 struct i2c_client *client = to_i2c_client(chip->dev);
865 ret = i2c_smbus_write_byte_data(client, reg, data);
867 dev_err(&client->dev, "I2C write error\n");
872 static const struct adt7410_ops adt7410_i2c_ops = {
873 .read_word = adt7410_i2c_read_word,
874 .write_word = adt7410_i2c_write_word,
875 .read_byte = adt7410_i2c_read_byte,
876 .write_byte = adt7410_i2c_write_byte,
879 static int adt7410_i2c_probe(struct i2c_client *client,
880 const struct i2c_device_id *id)
882 return adt7410_probe(&client->dev, client->irq, id->name,
886 static int adt7410_i2c_remove(struct i2c_client *client)
888 return adt7410_remove(&client->dev, client->irq);
891 static const struct i2c_device_id adt7410_id[] = {
896 MODULE_DEVICE_TABLE(i2c, adt7410_id);
898 static struct i2c_driver adt7410_driver = {
902 .probe = adt7410_i2c_probe,
903 .remove = adt7410_i2c_remove,
904 .id_table = adt7410_id,
907 static int __init adt7410_i2c_init(void)
909 return i2c_add_driver(&adt7410_driver);
912 static void __exit adt7410_i2c_exit(void)
914 i2c_del_driver(&adt7410_driver);
919 static int __init adt7410_i2c_init(void) { return 0; };
920 static void __exit adt7410_i2c_exit(void) {};
924 #if IS_ENABLED(CONFIG_SPI_MASTER)
926 static const u8 adt7371_reg_table[] = {
927 [ADT7410_TEMPERATURE] = ADT7310_TEMPERATURE,
928 [ADT7410_STATUS] = ADT7310_STATUS,
929 [ADT7410_CONFIG] = ADT7310_CONFIG,
930 [ADT7410_T_ALARM_HIGH] = ADT7310_T_ALARM_HIGH,
931 [ADT7410_T_ALARM_LOW] = ADT7310_T_ALARM_LOW,
932 [ADT7410_T_CRIT] = ADT7310_T_CRIT,
933 [ADT7410_T_HYST] = ADT7310_T_HYST,
934 [ADT7410_ID] = ADT7310_ID,
937 #define AD7310_COMMAND(reg) (adt7371_reg_table[(reg)] << ADT7310_CMD_REG_OFFSET)
939 static int adt7310_spi_read_word(struct adt7410_chip_info *chip,
942 struct spi_device *spi = to_spi_device(chip->dev);
943 u8 command = AD7310_COMMAND(reg);
946 command |= ADT7310_CMD_READ;
947 ret = spi_write(spi, &command, sizeof(command));
949 dev_err(&spi->dev, "SPI write command error\n");
953 ret = spi_read(spi, (u8 *)data, sizeof(*data));
955 dev_err(&spi->dev, "SPI read word error\n");
959 *data = be16_to_cpu(*data);
964 static int adt7310_spi_write_word(struct adt7410_chip_info *chip, u8 reg,
967 struct spi_device *spi = to_spi_device(chip->dev);
971 buf[0] = AD7310_COMMAND(reg);
972 buf[1] = (u8)(data >> 8);
973 buf[2] = (u8)(data & 0xFF);
975 ret = spi_write(spi, buf, 3);
977 dev_err(&spi->dev, "SPI write word error\n");
984 static int adt7310_spi_read_byte(struct adt7410_chip_info *chip, u8 reg,
987 struct spi_device *spi = to_spi_device(chip->dev);
988 u8 command = AD7310_COMMAND(reg);
991 command |= ADT7310_CMD_READ;
992 ret = spi_write(spi, &command, sizeof(command));
994 dev_err(&spi->dev, "SPI write command error\n");
998 ret = spi_read(spi, data, sizeof(*data));
1000 dev_err(&spi->dev, "SPI read byte error\n");
1007 static int adt7310_spi_write_byte(struct adt7410_chip_info *chip, u8 reg,
1010 struct spi_device *spi = to_spi_device(chip->dev);
1014 buf[0] = AD7310_COMMAND(reg);
1017 ret = spi_write(spi, buf, 2);
1019 dev_err(&spi->dev, "SPI write byte error\n");
1026 static const struct adt7410_ops adt7310_spi_ops = {
1027 .read_word = adt7310_spi_read_word,
1028 .write_word = adt7310_spi_write_word,
1029 .read_byte = adt7310_spi_read_byte,
1030 .write_byte = adt7310_spi_write_byte,
1033 static int adt7310_spi_probe(struct spi_device *spi)
1035 return adt7410_probe(&spi->dev, spi->irq,
1036 spi_get_device_id(spi)->name, &adt7310_spi_ops);
1039 static int adt7310_spi_remove(struct spi_device *spi)
1041 return adt7410_remove(&spi->dev, spi->irq);
1044 static const struct spi_device_id adt7310_id[] = {
1048 MODULE_DEVICE_TABLE(spi, adt7310_id);
1050 static struct spi_driver adt7310_driver = {
1053 .owner = THIS_MODULE,
1055 .probe = adt7310_spi_probe,
1056 .remove = adt7310_spi_remove,
1057 .id_table = adt7310_id,
1060 static int __init adt7310_spi_init(void)
1062 return spi_register_driver(&adt7310_driver);
1065 static void adt7310_spi_exit(void)
1067 spi_unregister_driver(&adt7310_driver);
1072 static int __init adt7310_spi_init(void) { return 0; };
1073 static void adt7310_spi_exit(void) {};
1077 static int __init adt7410_init(void)
1081 ret = adt7310_spi_init();
1085 ret = adt7410_i2c_init();
1091 module_init(adt7410_init);
1093 static void __exit adt7410_exit(void)
1098 module_exit(adt7410_exit);
1100 MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>");
1101 MODULE_DESCRIPTION("Analog Devices ADT7310/ADT7410 digital temperature sensor driver");
1102 MODULE_LICENSE("GPL v2");