1 // SPDX-License-Identifier: GPL-2.0+
3 * AD7816 digital temperature sensor driver supporting AD7816/7/8
5 * Copyright 2010 Analog Devices Inc.
8 #include <linux/interrupt.h>
9 #include <linux/gpio/consumer.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/spi/spi.h>
16 #include <linux/module.h>
18 #include <linux/iio/iio.h>
19 #include <linux/iio/sysfs.h>
20 #include <linux/iio/events.h>
25 #define AD7816_FULL 0x1
27 #define AD7816_CS_MASK 0x7
28 #define AD7816_CS_MAX 0x4
31 * AD7816 temperature masks
33 #define AD7816_VALUE_OFFSET 6
34 #define AD7816_BOUND_VALUE_BASE 0x8
35 #define AD7816_BOUND_VALUE_MIN -95
36 #define AD7816_BOUND_VALUE_MAX 152
37 #define AD7816_TEMP_FLOAT_OFFSET 2
38 #define AD7816_TEMP_FLOAT_MASK 0x3
41 * struct ad7816_chip_info - chip specific information
44 struct ad7816_chip_info {
46 struct spi_device *spi_dev;
47 struct gpio_desc *rdwr_pin;
48 struct gpio_desc *convert_pin;
49 struct gpio_desc *busy_pin;
50 u8 oti_data[AD7816_CS_MAX + 1];
51 u8 channel_id; /* 0 always be temperature */
62 * ad7816 data access by SPI
64 static int ad7816_spi_read(struct ad7816_chip_info *chip, u16 *data)
66 struct spi_device *spi_dev = chip->spi_dev;
70 gpiod_set_value(chip->rdwr_pin, 1);
71 gpiod_set_value(chip->rdwr_pin, 0);
72 ret = spi_write(spi_dev, &chip->channel_id, sizeof(chip->channel_id));
74 dev_err(&spi_dev->dev, "SPI channel setting error\n");
77 gpiod_set_value(chip->rdwr_pin, 1);
79 if (chip->mode == AD7816_PD) { /* operating mode 2 */
80 gpiod_set_value(chip->convert_pin, 1);
81 gpiod_set_value(chip->convert_pin, 0);
82 } else { /* operating mode 1 */
83 gpiod_set_value(chip->convert_pin, 0);
84 gpiod_set_value(chip->convert_pin, 1);
87 if (chip->id == ID_AD7816 || chip->id == ID_AD7817) {
88 while (gpiod_get_value(chip->busy_pin))
92 gpiod_set_value(chip->rdwr_pin, 0);
93 gpiod_set_value(chip->rdwr_pin, 1);
94 ret = spi_read(spi_dev, &buf, sizeof(*data));
96 dev_err(&spi_dev->dev, "SPI data read error\n");
100 *data = be16_to_cpu(buf);
105 static int ad7816_spi_write(struct ad7816_chip_info *chip, u8 data)
107 struct spi_device *spi_dev = chip->spi_dev;
110 gpiod_set_value(chip->rdwr_pin, 1);
111 gpiod_set_value(chip->rdwr_pin, 0);
112 ret = spi_write(spi_dev, &data, sizeof(data));
114 dev_err(&spi_dev->dev, "SPI oti data write error\n");
119 static ssize_t ad7816_show_mode(struct device *dev,
120 struct device_attribute *attr,
123 struct iio_dev *indio_dev = dev_to_iio_dev(dev);
124 struct ad7816_chip_info *chip = iio_priv(indio_dev);
127 return sprintf(buf, "power-save\n");
128 return sprintf(buf, "full\n");
131 static ssize_t ad7816_store_mode(struct device *dev,
132 struct device_attribute *attr,
136 struct iio_dev *indio_dev = dev_to_iio_dev(dev);
137 struct ad7816_chip_info *chip = iio_priv(indio_dev);
139 if (strcmp(buf, "full")) {
140 gpiod_set_value(chip->rdwr_pin, 1);
141 chip->mode = AD7816_FULL;
143 gpiod_set_value(chip->rdwr_pin, 0);
144 chip->mode = AD7816_PD;
150 static IIO_DEVICE_ATTR(mode, 0644,
155 static ssize_t ad7816_show_available_modes(struct device *dev,
156 struct device_attribute *attr,
159 return sprintf(buf, "full\npower-save\n");
162 static IIO_DEVICE_ATTR(available_modes, 0444, ad7816_show_available_modes,
165 static ssize_t ad7816_show_channel(struct device *dev,
166 struct device_attribute *attr,
169 struct iio_dev *indio_dev = dev_to_iio_dev(dev);
170 struct ad7816_chip_info *chip = iio_priv(indio_dev);
172 return sprintf(buf, "%d\n", chip->channel_id);
175 static ssize_t ad7816_store_channel(struct device *dev,
176 struct device_attribute *attr,
180 struct iio_dev *indio_dev = dev_to_iio_dev(dev);
181 struct ad7816_chip_info *chip = iio_priv(indio_dev);
185 ret = kstrtoul(buf, 10, &data);
189 if (data > AD7816_CS_MAX && data != AD7816_CS_MASK) {
190 dev_err(&chip->spi_dev->dev, "Invalid channel id %lu for %s.\n",
191 data, indio_dev->name);
193 } else if (strcmp(indio_dev->name, "ad7818") == 0 && data > 1) {
194 dev_err(&chip->spi_dev->dev,
195 "Invalid channel id %lu for ad7818.\n", data);
197 } else if (strcmp(indio_dev->name, "ad7816") == 0 && data > 0) {
198 dev_err(&chip->spi_dev->dev,
199 "Invalid channel id %lu for ad7816.\n", data);
203 chip->channel_id = data;
208 static IIO_DEVICE_ATTR(channel, 0644,
210 ad7816_store_channel,
213 static ssize_t ad7816_show_value(struct device *dev,
214 struct device_attribute *attr,
217 struct iio_dev *indio_dev = dev_to_iio_dev(dev);
218 struct ad7816_chip_info *chip = iio_priv(indio_dev);
223 ret = ad7816_spi_read(chip, &data);
227 data >>= AD7816_VALUE_OFFSET;
229 if (chip->channel_id == 0) {
230 value = (s8)((data >> AD7816_TEMP_FLOAT_OFFSET) - 103);
231 data &= AD7816_TEMP_FLOAT_MASK;
233 data = BIT(AD7816_TEMP_FLOAT_OFFSET) - data;
234 return sprintf(buf, "%d.%.2d\n", value, data * 25);
236 return sprintf(buf, "%u\n", data);
239 static IIO_DEVICE_ATTR(value, 0444, ad7816_show_value, NULL, 0);
241 static struct attribute *ad7816_attributes[] = {
242 &iio_dev_attr_available_modes.dev_attr.attr,
243 &iio_dev_attr_mode.dev_attr.attr,
244 &iio_dev_attr_channel.dev_attr.attr,
245 &iio_dev_attr_value.dev_attr.attr,
249 static const struct attribute_group ad7816_attribute_group = {
250 .attrs = ad7816_attributes,
254 * temperature bound events
257 #define IIO_EVENT_CODE_AD7816_OTI IIO_UNMOD_EVENT_CODE(IIO_TEMP, \
259 IIO_EV_TYPE_THRESH, \
262 static irqreturn_t ad7816_event_handler(int irq, void *private)
264 iio_push_event(private, IIO_EVENT_CODE_AD7816_OTI,
265 iio_get_time_ns(private));
269 static ssize_t ad7816_show_oti(struct device *dev,
270 struct device_attribute *attr,
273 struct iio_dev *indio_dev = dev_to_iio_dev(dev);
274 struct ad7816_chip_info *chip = iio_priv(indio_dev);
277 if (chip->channel_id > AD7816_CS_MAX) {
278 dev_err(dev, "Invalid oti channel id %d.\n", chip->channel_id);
280 } else if (chip->channel_id == 0) {
281 value = AD7816_BOUND_VALUE_MIN +
282 (chip->oti_data[chip->channel_id] -
283 AD7816_BOUND_VALUE_BASE);
284 return sprintf(buf, "%d\n", value);
286 return sprintf(buf, "%u\n", chip->oti_data[chip->channel_id]);
289 static inline ssize_t ad7816_set_oti(struct device *dev,
290 struct device_attribute *attr,
294 struct iio_dev *indio_dev = dev_to_iio_dev(dev);
295 struct ad7816_chip_info *chip = iio_priv(indio_dev);
300 ret = kstrtol(buf, 10, &value);
304 if (chip->channel_id > AD7816_CS_MAX) {
305 dev_err(dev, "Invalid oti channel id %d.\n", chip->channel_id);
307 } else if (chip->channel_id == 0) {
308 if (value < AD7816_BOUND_VALUE_MIN ||
309 value > AD7816_BOUND_VALUE_MAX)
312 data = (u8)(value - AD7816_BOUND_VALUE_MIN +
313 AD7816_BOUND_VALUE_BASE);
315 if (value < AD7816_BOUND_VALUE_BASE || value > 255)
321 ret = ad7816_spi_write(chip, data);
325 chip->oti_data[chip->channel_id] = data;
330 static IIO_DEVICE_ATTR(oti, 0644,
331 ad7816_show_oti, ad7816_set_oti, 0);
333 static struct attribute *ad7816_event_attributes[] = {
334 &iio_dev_attr_oti.dev_attr.attr,
338 static const struct attribute_group ad7816_event_attribute_group = {
339 .attrs = ad7816_event_attributes,
343 static const struct iio_info ad7816_info = {
344 .attrs = &ad7816_attribute_group,
345 .event_attrs = &ad7816_event_attribute_group,
349 * device probe and remove
352 static int ad7816_probe(struct spi_device *spi_dev)
354 struct ad7816_chip_info *chip;
355 struct iio_dev *indio_dev;
358 indio_dev = devm_iio_device_alloc(&spi_dev->dev, sizeof(*chip));
361 chip = iio_priv(indio_dev);
362 /* this is only used for device removal purposes */
363 dev_set_drvdata(&spi_dev->dev, indio_dev);
365 chip->spi_dev = spi_dev;
366 for (i = 0; i <= AD7816_CS_MAX; i++)
367 chip->oti_data[i] = 203;
369 chip->id = spi_get_device_id(spi_dev)->driver_data;
370 chip->rdwr_pin = devm_gpiod_get(&spi_dev->dev, "rdwr", GPIOD_OUT_HIGH);
371 if (IS_ERR(chip->rdwr_pin)) {
372 ret = PTR_ERR(chip->rdwr_pin);
373 dev_err(&spi_dev->dev, "Failed to request rdwr GPIO: %d\n",
377 chip->convert_pin = devm_gpiod_get(&spi_dev->dev, "convert",
379 if (IS_ERR(chip->convert_pin)) {
380 ret = PTR_ERR(chip->convert_pin);
381 dev_err(&spi_dev->dev, "Failed to request convert GPIO: %d\n",
385 if (chip->id == ID_AD7816 || chip->id == ID_AD7817) {
386 chip->busy_pin = devm_gpiod_get(&spi_dev->dev, "busy",
388 if (IS_ERR(chip->busy_pin)) {
389 ret = PTR_ERR(chip->busy_pin);
390 dev_err(&spi_dev->dev, "Failed to request busy GPIO: %d\n",
396 indio_dev->name = spi_get_device_id(spi_dev)->name;
397 indio_dev->info = &ad7816_info;
398 indio_dev->modes = INDIO_DIRECT_MODE;
401 /* Only low trigger is supported in ad7816/7/8 */
402 ret = devm_request_threaded_irq(&spi_dev->dev, spi_dev->irq,
404 &ad7816_event_handler,
405 IRQF_TRIGGER_LOW | IRQF_ONESHOT,
412 ret = devm_iio_device_register(&spi_dev->dev, indio_dev);
416 dev_info(&spi_dev->dev, "%s temperature sensor and ADC registered.\n",
422 static const struct of_device_id ad7816_of_match[] = {
423 { .compatible = "adi,ad7816", },
424 { .compatible = "adi,ad7817", },
425 { .compatible = "adi,ad7818", },
428 MODULE_DEVICE_TABLE(of, ad7816_of_match);
430 static const struct spi_device_id ad7816_id[] = {
431 { "ad7816", ID_AD7816 },
432 { "ad7817", ID_AD7817 },
433 { "ad7818", ID_AD7818 },
437 MODULE_DEVICE_TABLE(spi, ad7816_id);
439 static struct spi_driver ad7816_driver = {
442 .of_match_table = ad7816_of_match,
444 .probe = ad7816_probe,
445 .id_table = ad7816_id,
447 module_spi_driver(ad7816_driver);
450 MODULE_DESCRIPTION("Analog Devices AD7816/7/8 digital temperature sensor driver");
451 MODULE_LICENSE("GPL v2");