1// SPDX-License-Identifier: GPL-2.0+
2/*
3 * ADT7316 digital temperature sensor driver supporting ADT7316/7/8 ADT7516/7/9
4 *
5 * Copyright 2010 Analog Devices Inc.
6 */
7
8#include <linux/interrupt.h>
9#include <linux/gpio/consumer.h>
10#include <linux/irq.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>
19#include <linux/module.h>
20
21#include <linux/iio/iio.h>
22#include <linux/iio/events.h>
23#include <linux/iio/sysfs.h>
24#include "adt7316.h"
25
26/*
27 * ADT7316 registers definition
28 */
29#define ADT7316_INT_STAT1		0x0
30#define ADT7316_INT_STAT2		0x1
31#define ADT7316_LSB_IN_TEMP_VDD		0x3
32#define ADT7316_LSB_IN_TEMP_MASK	0x3
33#define ADT7316_LSB_VDD_MASK		0xC
34#define ADT7316_LSB_VDD_OFFSET		2
35#define ADT7316_LSB_EX_TEMP_AIN		0x4
36#define ADT7316_LSB_EX_TEMP_MASK	0x3
37#define ADT7516_LSB_AIN_SHIFT		2
38#define ADT7316_AD_MSB_DATA_BASE        0x6
39#define ADT7316_AD_MSB_DATA_REGS        3
40#define ADT7516_AD_MSB_DATA_REGS        6
41#define ADT7316_MSB_VDD			0x6
42#define ADT7316_MSB_IN_TEMP		0x7
43#define ADT7316_MSB_EX_TEMP		0x8
44#define ADT7516_MSB_AIN1		0x8
45#define ADT7516_MSB_AIN2		0x9
46#define ADT7516_MSB_AIN3		0xA
47#define ADT7516_MSB_AIN4		0xB
48#define ADT7316_DA_DATA_BASE		0x10
49#define ADT7316_DA_10_BIT_LSB_SHIFT	6
50#define ADT7316_DA_12_BIT_LSB_SHIFT	4
51#define ADT7316_DA_MSB_DATA_REGS	4
52#define ADT7316_LSB_DAC_A		0x10
53#define ADT7316_MSB_DAC_A		0x11
54#define ADT7316_LSB_DAC_B		0x12
55#define ADT7316_MSB_DAC_B		0x13
56#define ADT7316_LSB_DAC_C		0x14
57#define ADT7316_MSB_DAC_C		0x15
58#define ADT7316_LSB_DAC_D		0x16
59#define ADT7316_MSB_DAC_D		0x17
60#define ADT7316_CONFIG1			0x18
61#define ADT7316_CONFIG2			0x19
62#define ADT7316_CONFIG3			0x1A
63#define ADT7316_DAC_CONFIG		0x1B
64#define ADT7316_LDAC_CONFIG		0x1C
65#define ADT7316_INT_MASK1		0x1D
66#define ADT7316_INT_MASK2		0x1E
67#define ADT7316_IN_TEMP_OFFSET		0x1F
68#define ADT7316_EX_TEMP_OFFSET		0x20
69#define ADT7316_IN_ANALOG_TEMP_OFFSET	0x21
70#define ADT7316_EX_ANALOG_TEMP_OFFSET	0x22
71#define ADT7316_VDD_HIGH		0x23
72#define ADT7316_VDD_LOW			0x24
73#define ADT7316_IN_TEMP_HIGH		0x25
74#define ADT7316_IN_TEMP_LOW		0x26
75#define ADT7316_EX_TEMP_HIGH		0x27
76#define ADT7316_EX_TEMP_LOW		0x28
77#define ADT7516_AIN2_HIGH		0x2B
78#define ADT7516_AIN2_LOW		0x2C
79#define ADT7516_AIN3_HIGH		0x2D
80#define ADT7516_AIN3_LOW		0x2E
81#define ADT7516_AIN4_HIGH		0x2F
82#define ADT7516_AIN4_LOW		0x30
83#define ADT7316_DEVICE_ID		0x4D
84#define ADT7316_MANUFACTURE_ID		0x4E
85#define ADT7316_DEVICE_REV		0x4F
86#define ADT7316_SPI_LOCK_STAT		0x7F
87
88/*
89 * ADT7316 config1
90 */
91#define ADT7316_EN			0x1
92#define ADT7516_SEL_EX_TEMP		0x4
93#define ADT7516_SEL_AIN1_2_EX_TEMP_MASK	0x6
94#define ADT7516_SEL_AIN3		0x8
95#define ADT7316_INT_EN			0x20
96#define ADT7316_INT_POLARITY		0x40
97#define ADT7316_PD			0x80
98
99/*
100 * ADT7316 config2
101 */
102#define ADT7316_AD_SINGLE_CH_MASK	0x3
103#define ADT7516_AD_SINGLE_CH_MASK	0x7
104#define ADT7316_AD_SINGLE_CH_VDD	0
105#define ADT7316_AD_SINGLE_CH_IN		1
106#define ADT7316_AD_SINGLE_CH_EX		2
107#define ADT7516_AD_SINGLE_CH_AIN1	2
108#define ADT7516_AD_SINGLE_CH_AIN2	3
109#define ADT7516_AD_SINGLE_CH_AIN3	4
110#define ADT7516_AD_SINGLE_CH_AIN4	5
111#define ADT7316_AD_SINGLE_CH_MODE	0x10
112#define ADT7316_DISABLE_AVERAGING	0x20
113#define ADT7316_EN_SMBUS_TIMEOUT	0x40
114#define ADT7316_RESET			0x80
115
116/*
117 * ADT7316 config3
118 */
119#define ADT7316_ADCLK_22_5		0x1
120#define ADT7316_DA_HIGH_RESOLUTION	0x2
121#define ADT7316_DA_EN_VIA_DAC_LDAC	0x8
122#define ADT7516_AIN_IN_VREF		0x10
123#define ADT7316_EN_IN_TEMP_PROP_DACA	0x20
124#define ADT7316_EN_EX_TEMP_PROP_DACB	0x40
125
126/*
127 * ADT7316 DAC config
128 */
129#define ADT7316_DA_2VREF_CH_MASK	0xF
130#define ADT7316_DA_EN_MODE_MASK		0x30
131#define ADT7316_DA_EN_MODE_SHIFT	4
132#define ADT7316_DA_EN_MODE_SINGLE	0x00
133#define ADT7316_DA_EN_MODE_AB_CD	0x10
134#define ADT7316_DA_EN_MODE_ABCD		0x20
135#define ADT7316_DA_EN_MODE_LDAC		0x30
136#define ADT7316_VREF_BYPASS_DAC_AB	0x40
137#define ADT7316_VREF_BYPASS_DAC_CD	0x80
138
139/*
140 * ADT7316 LDAC config
141 */
142#define ADT7316_LDAC_EN_DA_MASK		0xF
143#define ADT7316_DAC_IN_VREF		0x10
144#define ADT7516_DAC_AB_IN_VREF		0x10
145#define ADT7516_DAC_CD_IN_VREF		0x20
146#define ADT7516_DAC_IN_VREF_OFFSET	4
147#define ADT7516_DAC_IN_VREF_MASK	0x30
148
149/*
150 * ADT7316 INT_MASK2
151 */
152#define ADT7316_INT_MASK2_VDD		0x10
153
154/*
155 * ADT7316 value masks
156 */
157#define ADT7316_VALUE_MASK		0xfff
158#define ADT7316_T_VALUE_SIGN		0x400
159#define ADT7316_T_VALUE_FLOAT_OFFSET	2
160#define ADT7316_T_VALUE_FLOAT_MASK	0x2
161
162/*
163 * Chip ID
164 */
165#define ID_ADT7316		0x1
166#define ID_ADT7317		0x2
167#define ID_ADT7318		0x3
168#define ID_ADT7516		0x11
169#define ID_ADT7517		0x12
170#define ID_ADT7519		0x14
171
172#define ID_FAMILY_MASK		0xF0
173#define ID_ADT73XX		0x0
174#define ID_ADT75XX		0x10
175
176/*
177 * struct adt7316_chip_info - chip specific information
178 */
179
180struct adt7316_chip_info {
181	struct adt7316_bus	bus;
182	struct gpio_desc	*ldac_pin;
183	u16			int_mask;	/* 0x2f */
184	u8			config1;
185	u8			config2;
186	u8			config3;
187	u8			dac_config;	/* DAC config */
188	u8			ldac_config;	/* LDAC config */
189	u8			dac_bits;	/* 8, 10, 12 */
190	u8			id;		/* chip id */
191};
192
193/*
194 * Logic interrupt mask for user application to enable
195 * interrupts.
196 */
197#define ADT7316_IN_TEMP_HIGH_INT_MASK	0x1
198#define ADT7316_IN_TEMP_LOW_INT_MASK	0x2
199#define ADT7316_EX_TEMP_HIGH_INT_MASK	0x4
200#define ADT7316_EX_TEMP_LOW_INT_MASK	0x8
201#define ADT7316_EX_TEMP_FAULT_INT_MASK	0x10
202#define ADT7516_AIN1_INT_MASK		0x4
203#define ADT7516_AIN2_INT_MASK		0x20
204#define ADT7516_AIN3_INT_MASK		0x40
205#define ADT7516_AIN4_INT_MASK		0x80
206#define ADT7316_VDD_INT_MASK		0x100
207#define ADT7316_TEMP_INT_MASK		0x1F
208#define ADT7516_AIN_INT_MASK		0xE0
209#define ADT7316_TEMP_AIN_INT_MASK	\
210	(ADT7316_TEMP_INT_MASK)
211
212/*
213 * struct adt7316_chip_info - chip specific information
214 */
215
216struct adt7316_limit_regs {
217	u16	data_high;
218	u16	data_low;
219};
220
221static ssize_t adt7316_show_enabled(struct device *dev,
222				    struct device_attribute *attr,
223				    char *buf)
224{
225	struct iio_dev *dev_info = dev_to_iio_dev(dev);
226	struct adt7316_chip_info *chip = iio_priv(dev_info);
227
228	return sprintf(buf, "%d\n", !!(chip->config1 & ADT7316_EN));
229}
230
231static ssize_t _adt7316_store_enabled(struct adt7316_chip_info *chip,
232				      int enable)
233{
234	u8 config1;
235	int ret;
236
237	if (enable)
238		config1 = chip->config1 | ADT7316_EN;
239	else
240		config1 = chip->config1 & ~ADT7316_EN;
241
242	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG1, config1);
243	if (ret)
244		return -EIO;
245
246	chip->config1 = config1;
247
248	return ret;
249}
250
251static ssize_t adt7316_store_enabled(struct device *dev,
252				     struct device_attribute *attr,
253				     const char *buf,
254				     size_t len)
255{
256	struct iio_dev *dev_info = dev_to_iio_dev(dev);
257	struct adt7316_chip_info *chip = iio_priv(dev_info);
258	int enable;
259
260	if (buf[0] == '1')
261		enable = 1;
262	else
263		enable = 0;
264
265	if (_adt7316_store_enabled(chip, enable) < 0)
266		return -EIO;
267
268	return len;
269}
270
271static IIO_DEVICE_ATTR(enabled, 0644,
272		adt7316_show_enabled,
273		adt7316_store_enabled,
274		0);
275
276static ssize_t adt7316_show_select_ex_temp(struct device *dev,
277					   struct device_attribute *attr,
278					   char *buf)
279{
280	struct iio_dev *dev_info = dev_to_iio_dev(dev);
281	struct adt7316_chip_info *chip = iio_priv(dev_info);
282
283	if ((chip->id & ID_FAMILY_MASK) != ID_ADT75XX)
284		return -EPERM;
285
286	return sprintf(buf, "%d\n", !!(chip->config1 & ADT7516_SEL_EX_TEMP));
287}
288
289static ssize_t adt7316_store_select_ex_temp(struct device *dev,
290					    struct device_attribute *attr,
291					    const char *buf,
292					    size_t len)
293{
294	struct iio_dev *dev_info = dev_to_iio_dev(dev);
295	struct adt7316_chip_info *chip = iio_priv(dev_info);
296	u8 config1;
297	int ret;
298
299	if ((chip->id & ID_FAMILY_MASK) != ID_ADT75XX)
300		return -EPERM;
301
302	config1 = chip->config1 & (~ADT7516_SEL_EX_TEMP);
303	if (buf[0] == '1')
304		config1 |= ADT7516_SEL_EX_TEMP;
305
306	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG1, config1);
307	if (ret)
308		return -EIO;
309
310	chip->config1 = config1;
311
312	return len;
313}
314
315static IIO_DEVICE_ATTR(select_ex_temp, 0644,
316		adt7316_show_select_ex_temp,
317		adt7316_store_select_ex_temp,
318		0);
319
320static ssize_t adt7316_show_mode(struct device *dev,
321				 struct device_attribute *attr,
322				 char *buf)
323{
324	struct iio_dev *dev_info = dev_to_iio_dev(dev);
325	struct adt7316_chip_info *chip = iio_priv(dev_info);
326
327	if (chip->config2 & ADT7316_AD_SINGLE_CH_MODE)
328		return sprintf(buf, "single_channel\n");
329
330	return sprintf(buf, "round_robin\n");
331}
332
333static ssize_t adt7316_store_mode(struct device *dev,
334				  struct device_attribute *attr,
335				  const char *buf,
336				  size_t len)
337{
338	struct iio_dev *dev_info = dev_to_iio_dev(dev);
339	struct adt7316_chip_info *chip = iio_priv(dev_info);
340	u8 config2;
341	int ret;
342
343	config2 = chip->config2 & (~ADT7316_AD_SINGLE_CH_MODE);
344	if (!memcmp(buf, "single_channel", 14))
345		config2 |= ADT7316_AD_SINGLE_CH_MODE;
346
347	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG2, config2);
348	if (ret)
349		return -EIO;
350
351	chip->config2 = config2;
352
353	return len;
354}
355
356static IIO_DEVICE_ATTR(mode, 0644,
357		adt7316_show_mode,
358		adt7316_store_mode,
359		0);
360
361static ssize_t adt7316_show_all_modes(struct device *dev,
362				      struct device_attribute *attr,
363				      char *buf)
364{
365	return sprintf(buf, "single_channel\nround_robin\n");
366}
367
368static IIO_DEVICE_ATTR(all_modes, 0444, adt7316_show_all_modes, NULL, 0);
369
370static ssize_t adt7316_show_ad_channel(struct device *dev,
371				       struct device_attribute *attr,
372				       char *buf)
373{
374	struct iio_dev *dev_info = dev_to_iio_dev(dev);
375	struct adt7316_chip_info *chip = iio_priv(dev_info);
376
377	if (!(chip->config2 & ADT7316_AD_SINGLE_CH_MODE))
378		return -EPERM;
379
380	switch (chip->config2 & ADT7516_AD_SINGLE_CH_MASK) {
381	case ADT7316_AD_SINGLE_CH_VDD:
382		return sprintf(buf, "0 - VDD\n");
383	case ADT7316_AD_SINGLE_CH_IN:
384		return sprintf(buf, "1 - Internal Temperature\n");
385	case ADT7316_AD_SINGLE_CH_EX:
386		if (((chip->id & ID_FAMILY_MASK) == ID_ADT75XX) &&
387		    (chip->config1 & ADT7516_SEL_AIN1_2_EX_TEMP_MASK) == 0)
388			return sprintf(buf, "2 - AIN1\n");
389
390		return sprintf(buf, "2 - External Temperature\n");
391	case ADT7516_AD_SINGLE_CH_AIN2:
392		if ((chip->config1 & ADT7516_SEL_AIN1_2_EX_TEMP_MASK) == 0)
393			return sprintf(buf, "3 - AIN2\n");
394
395		return sprintf(buf, "N/A\n");
396	case ADT7516_AD_SINGLE_CH_AIN3:
397		if (chip->config1 & ADT7516_SEL_AIN3)
398			return sprintf(buf, "4 - AIN3\n");
399
400		return sprintf(buf, "N/A\n");
401	case ADT7516_AD_SINGLE_CH_AIN4:
402		return sprintf(buf, "5 - AIN4\n");
403	default:
404		return sprintf(buf, "N/A\n");
405	}
406}
407
408static ssize_t adt7316_store_ad_channel(struct device *dev,
409					struct device_attribute *attr,
410					const char *buf,
411					size_t len)
412{
413	struct iio_dev *dev_info = dev_to_iio_dev(dev);
414	struct adt7316_chip_info *chip = iio_priv(dev_info);
415	u8 config2;
416	u8 data;
417	int ret;
418
419	if (!(chip->config2 & ADT7316_AD_SINGLE_CH_MODE))
420		return -EPERM;
421
422	ret = kstrtou8(buf, 10, &data);
423	if (ret)
424		return -EINVAL;
425
426	if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX) {
427		if (data > 5)
428			return -EINVAL;
429
430		config2 = chip->config2 & (~ADT7516_AD_SINGLE_CH_MASK);
431	} else {
432		if (data > 2)
433			return -EINVAL;
434
435		config2 = chip->config2 & (~ADT7316_AD_SINGLE_CH_MASK);
436	}
437
438	config2 |= data;
439
440	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG2, config2);
441	if (ret)
442		return -EIO;
443
444	chip->config2 = config2;
445
446	return len;
447}
448
449static IIO_DEVICE_ATTR(ad_channel, 0644,
450		adt7316_show_ad_channel,
451		adt7316_store_ad_channel,
452		0);
453
454static ssize_t adt7316_show_all_ad_channels(struct device *dev,
455					    struct device_attribute *attr,
456					    char *buf)
457{
458	struct iio_dev *dev_info = dev_to_iio_dev(dev);
459	struct adt7316_chip_info *chip = iio_priv(dev_info);
460
461	if (!(chip->config2 & ADT7316_AD_SINGLE_CH_MODE))
462		return -EPERM;
463
464	if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
465		return sprintf(buf, "0 - VDD\n1 - Internal Temperature\n"
466				"2 - External Temperature or AIN1\n"
467				"3 - AIN2\n4 - AIN3\n5 - AIN4\n");
468	return sprintf(buf, "0 - VDD\n1 - Internal Temperature\n"
469			"2 - External Temperature\n");
470}
471
472static IIO_DEVICE_ATTR(all_ad_channels, 0444,
473		adt7316_show_all_ad_channels, NULL, 0);
474
475static ssize_t adt7316_show_disable_averaging(struct device *dev,
476					      struct device_attribute *attr,
477					      char *buf)
478{
479	struct iio_dev *dev_info = dev_to_iio_dev(dev);
480	struct adt7316_chip_info *chip = iio_priv(dev_info);
481
482	return sprintf(buf, "%d\n",
483		!!(chip->config2 & ADT7316_DISABLE_AVERAGING));
484}
485
486static ssize_t adt7316_store_disable_averaging(struct device *dev,
487					       struct device_attribute *attr,
488					       const char *buf,
489					       size_t len)
490{
491	struct iio_dev *dev_info = dev_to_iio_dev(dev);
492	struct adt7316_chip_info *chip = iio_priv(dev_info);
493	u8 config2;
494	int ret;
495
496	config2 = chip->config2 & (~ADT7316_DISABLE_AVERAGING);
497	if (buf[0] == '1')
498		config2 |= ADT7316_DISABLE_AVERAGING;
499
500	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG2, config2);
501	if (ret)
502		return -EIO;
503
504	chip->config2 = config2;
505
506	return len;
507}
508
509static IIO_DEVICE_ATTR(disable_averaging, 0644,
510		adt7316_show_disable_averaging,
511		adt7316_store_disable_averaging,
512		0);
513
514static ssize_t adt7316_show_enable_smbus_timeout(struct device *dev,
515						 struct device_attribute *attr,
516						 char *buf)
517{
518	struct iio_dev *dev_info = dev_to_iio_dev(dev);
519	struct adt7316_chip_info *chip = iio_priv(dev_info);
520
521	return sprintf(buf, "%d\n",
522		!!(chip->config2 & ADT7316_EN_SMBUS_TIMEOUT));
523}
524
525static ssize_t adt7316_store_enable_smbus_timeout(struct device *dev,
526						  struct device_attribute *attr,
527						  const char *buf,
528						  size_t len)
529{
530	struct iio_dev *dev_info = dev_to_iio_dev(dev);
531	struct adt7316_chip_info *chip = iio_priv(dev_info);
532	u8 config2;
533	int ret;
534
535	config2 = chip->config2 & (~ADT7316_EN_SMBUS_TIMEOUT);
536	if (buf[0] == '1')
537		config2 |= ADT7316_EN_SMBUS_TIMEOUT;
538
539	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG2, config2);
540	if (ret)
541		return -EIO;
542
543	chip->config2 = config2;
544
545	return len;
546}
547
548static IIO_DEVICE_ATTR(enable_smbus_timeout, 0644,
549		adt7316_show_enable_smbus_timeout,
550		adt7316_store_enable_smbus_timeout,
551		0);
552
553static ssize_t adt7316_show_powerdown(struct device *dev,
554				      struct device_attribute *attr,
555				      char *buf)
556{
557	struct iio_dev *dev_info = dev_to_iio_dev(dev);
558	struct adt7316_chip_info *chip = iio_priv(dev_info);
559
560	return sprintf(buf, "%d\n", !!(chip->config1 & ADT7316_PD));
561}
562
563static ssize_t adt7316_store_powerdown(struct device *dev,
564				       struct device_attribute *attr,
565				       const char *buf,
566				       size_t len)
567{
568	struct iio_dev *dev_info = dev_to_iio_dev(dev);
569	struct adt7316_chip_info *chip = iio_priv(dev_info);
570	u8 config1;
571	int ret;
572
573	config1 = chip->config1 & (~ADT7316_PD);
574	if (buf[0] == '1')
575		config1 |= ADT7316_PD;
576
577	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG1, config1);
578	if (ret)
579		return -EIO;
580
581	chip->config1 = config1;
582
583	return len;
584}
585
586static IIO_DEVICE_ATTR(powerdown, 0644,
587		adt7316_show_powerdown,
588		adt7316_store_powerdown,
589		0);
590
591static ssize_t adt7316_show_fast_ad_clock(struct device *dev,
592					  struct device_attribute *attr,
593					  char *buf)
594{
595	struct iio_dev *dev_info = dev_to_iio_dev(dev);
596	struct adt7316_chip_info *chip = iio_priv(dev_info);
597
598	return sprintf(buf, "%d\n", !!(chip->config3 & ADT7316_ADCLK_22_5));
599}
600
601static ssize_t adt7316_store_fast_ad_clock(struct device *dev,
602					   struct device_attribute *attr,
603					   const char *buf,
604					   size_t len)
605{
606	struct iio_dev *dev_info = dev_to_iio_dev(dev);
607	struct adt7316_chip_info *chip = iio_priv(dev_info);
608	u8 config3;
609	int ret;
610
611	config3 = chip->config3 & (~ADT7316_ADCLK_22_5);
612	if (buf[0] == '1')
613		config3 |= ADT7316_ADCLK_22_5;
614
615	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, config3);
616	if (ret)
617		return -EIO;
618
619	chip->config3 = config3;
620
621	return len;
622}
623
624static IIO_DEVICE_ATTR(fast_ad_clock, 0644,
625		adt7316_show_fast_ad_clock,
626		adt7316_store_fast_ad_clock,
627		0);
628
629static ssize_t adt7316_show_da_high_resolution(struct device *dev,
630					       struct device_attribute *attr,
631					       char *buf)
632{
633	struct iio_dev *dev_info = dev_to_iio_dev(dev);
634	struct adt7316_chip_info *chip = iio_priv(dev_info);
635
636	if (chip->config3 & ADT7316_DA_HIGH_RESOLUTION) {
637		if (chip->id != ID_ADT7318 && chip->id != ID_ADT7519)
638			return sprintf(buf, "1 (10 bits)\n");
639	}
640
641	return sprintf(buf, "0 (8 bits)\n");
642}
643
644static ssize_t adt7316_store_da_high_resolution(struct device *dev,
645						struct device_attribute *attr,
646						const char *buf,
647						size_t len)
648{
649	struct iio_dev *dev_info = dev_to_iio_dev(dev);
650	struct adt7316_chip_info *chip = iio_priv(dev_info);
651	u8 config3;
652	int ret;
653
654	if (chip->id == ID_ADT7318 || chip->id == ID_ADT7519)
655		return -EPERM;
656
657	config3 = chip->config3 & (~ADT7316_DA_HIGH_RESOLUTION);
658	if (buf[0] == '1')
659		config3 |= ADT7316_DA_HIGH_RESOLUTION;
660
661	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, config3);
662	if (ret)
663		return -EIO;
664
665	chip->config3 = config3;
666
667	return len;
668}
669
670static IIO_DEVICE_ATTR(da_high_resolution, 0644,
671		adt7316_show_da_high_resolution,
672		adt7316_store_da_high_resolution,
673		0);
674
675static ssize_t adt7316_show_AIN_internal_Vref(struct device *dev,
676					      struct device_attribute *attr,
677					      char *buf)
678{
679	struct iio_dev *dev_info = dev_to_iio_dev(dev);
680	struct adt7316_chip_info *chip = iio_priv(dev_info);
681
682	if ((chip->id & ID_FAMILY_MASK) != ID_ADT75XX)
683		return -EPERM;
684
685	return sprintf(buf, "%d\n",
686		!!(chip->config3 & ADT7516_AIN_IN_VREF));
687}
688
689static ssize_t adt7316_store_AIN_internal_Vref(struct device *dev,
690					       struct device_attribute *attr,
691					       const char *buf,
692					       size_t len)
693{
694	struct iio_dev *dev_info = dev_to_iio_dev(dev);
695	struct adt7316_chip_info *chip = iio_priv(dev_info);
696	u8 config3;
697	int ret;
698
699	if ((chip->id & ID_FAMILY_MASK) != ID_ADT75XX)
700		return -EPERM;
701
702	if (buf[0] != '1')
703		config3 = chip->config3 & (~ADT7516_AIN_IN_VREF);
704	else
705		config3 = chip->config3 | ADT7516_AIN_IN_VREF;
706
707	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, config3);
708	if (ret)
709		return -EIO;
710
711	chip->config3 = config3;
712
713	return len;
714}
715
716static IIO_DEVICE_ATTR(AIN_internal_Vref, 0644,
717		adt7316_show_AIN_internal_Vref,
718		adt7316_store_AIN_internal_Vref,
719		0);
720
721static ssize_t adt7316_show_enable_prop_DACA(struct device *dev,
722					     struct device_attribute *attr,
723					     char *buf)
724{
725	struct iio_dev *dev_info = dev_to_iio_dev(dev);
726	struct adt7316_chip_info *chip = iio_priv(dev_info);
727
728	return sprintf(buf, "%d\n",
729		!!(chip->config3 & ADT7316_EN_IN_TEMP_PROP_DACA));
730}
731
732static ssize_t adt7316_store_enable_prop_DACA(struct device *dev,
733					      struct device_attribute *attr,
734					      const char *buf,
735					      size_t len)
736{
737	struct iio_dev *dev_info = dev_to_iio_dev(dev);
738	struct adt7316_chip_info *chip = iio_priv(dev_info);
739	u8 config3;
740	int ret;
741
742	config3 = chip->config3 & (~ADT7316_EN_IN_TEMP_PROP_DACA);
743	if (buf[0] == '1')
744		config3 |= ADT7316_EN_IN_TEMP_PROP_DACA;
745
746	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, config3);
747	if (ret)
748		return -EIO;
749
750	chip->config3 = config3;
751
752	return len;
753}
754
755static IIO_DEVICE_ATTR(enable_proportion_DACA, 0644,
756		       adt7316_show_enable_prop_DACA,
757		       adt7316_store_enable_prop_DACA,
758		       0);
759
760static ssize_t adt7316_show_enable_prop_DACB(struct device *dev,
761					     struct device_attribute *attr,
762					     char *buf)
763{
764	struct iio_dev *dev_info = dev_to_iio_dev(dev);
765	struct adt7316_chip_info *chip = iio_priv(dev_info);
766
767	return sprintf(buf, "%d\n",
768		!!(chip->config3 & ADT7316_EN_EX_TEMP_PROP_DACB));
769}
770
771static ssize_t adt7316_store_enable_prop_DACB(struct device *dev,
772					      struct device_attribute *attr,
773					      const char *buf,
774					      size_t len)
775{
776	struct iio_dev *dev_info = dev_to_iio_dev(dev);
777	struct adt7316_chip_info *chip = iio_priv(dev_info);
778	u8 config3;
779	int ret;
780
781	config3 = chip->config3 & (~ADT7316_EN_EX_TEMP_PROP_DACB);
782	if (buf[0] == '1')
783		config3 |= ADT7316_EN_EX_TEMP_PROP_DACB;
784
785	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, config3);
786	if (ret)
787		return -EIO;
788
789	chip->config3 = config3;
790
791	return len;
792}
793
794static IIO_DEVICE_ATTR(enable_proportion_DACB, 0644,
795		       adt7316_show_enable_prop_DACB,
796		       adt7316_store_enable_prop_DACB,
797		       0);
798
799static ssize_t adt7316_show_DAC_2Vref_ch_mask(struct device *dev,
800					      struct device_attribute *attr,
801					      char *buf)
802{
803	struct iio_dev *dev_info = dev_to_iio_dev(dev);
804	struct adt7316_chip_info *chip = iio_priv(dev_info);
805
806	return sprintf(buf, "0x%x\n",
807		chip->dac_config & ADT7316_DA_2VREF_CH_MASK);
808}
809
810static ssize_t adt7316_store_DAC_2Vref_ch_mask(struct device *dev,
811					       struct device_attribute *attr,
812					       const char *buf,
813					       size_t len)
814{
815	struct iio_dev *dev_info = dev_to_iio_dev(dev);
816	struct adt7316_chip_info *chip = iio_priv(dev_info);
817	u8 dac_config;
818	u8 data;
819	int ret;
820
821	ret = kstrtou8(buf, 16, &data);
822	if (ret || data > ADT7316_DA_2VREF_CH_MASK)
823		return -EINVAL;
824
825	dac_config = chip->dac_config & (~ADT7316_DA_2VREF_CH_MASK);
826	dac_config |= data;
827
828	ret = chip->bus.write(chip->bus.client, ADT7316_DAC_CONFIG, dac_config);
829	if (ret)
830		return -EIO;
831
832	chip->dac_config = dac_config;
833
834	return len;
835}
836
837static IIO_DEVICE_ATTR(DAC_2Vref_channels_mask, 0644,
838		       adt7316_show_DAC_2Vref_ch_mask,
839		       adt7316_store_DAC_2Vref_ch_mask,
840		       0);
841
842static ssize_t adt7316_show_DAC_update_mode(struct device *dev,
843					    struct device_attribute *attr,
844					    char *buf)
845{
846	struct iio_dev *dev_info = dev_to_iio_dev(dev);
847	struct adt7316_chip_info *chip = iio_priv(dev_info);
848
849	if (!(chip->config3 & ADT7316_DA_EN_VIA_DAC_LDAC))
850		return sprintf(buf, "manual\n");
851
852	switch (chip->dac_config & ADT7316_DA_EN_MODE_MASK) {
853	case ADT7316_DA_EN_MODE_SINGLE:
854		return sprintf(buf,
855			"0 - auto at any MSB DAC writing\n");
856	case ADT7316_DA_EN_MODE_AB_CD:
857		return sprintf(buf,
858			"1 - auto at MSB DAC AB and CD writing\n");
859	case ADT7316_DA_EN_MODE_ABCD:
860		return sprintf(buf,
861			"2 - auto at MSB DAC ABCD writing\n");
862	default: /* ADT7316_DA_EN_MODE_LDAC */
863		return sprintf(buf, "3 - manual\n");
864	}
865}
866
867static ssize_t adt7316_store_DAC_update_mode(struct device *dev,
868					     struct device_attribute *attr,
869					     const char *buf,
870					     size_t len)
871{
872	struct iio_dev *dev_info = dev_to_iio_dev(dev);
873	struct adt7316_chip_info *chip = iio_priv(dev_info);
874	u8 dac_config;
875	u8 data;
876	int ret;
877
878	if (!(chip->config3 & ADT7316_DA_EN_VIA_DAC_LDAC))
879		return -EPERM;
880
881	ret = kstrtou8(buf, 10, &data);
882	if (ret || data > (ADT7316_DA_EN_MODE_MASK >> ADT7316_DA_EN_MODE_SHIFT))
883		return -EINVAL;
884
885	dac_config = chip->dac_config & (~ADT7316_DA_EN_MODE_MASK);
886	dac_config |= data << ADT7316_DA_EN_MODE_SHIFT;
887
888	ret = chip->bus.write(chip->bus.client, ADT7316_DAC_CONFIG, dac_config);
889	if (ret)
890		return -EIO;
891
892	chip->dac_config = dac_config;
893
894	return len;
895}
896
897static IIO_DEVICE_ATTR(DAC_update_mode, 0644,
898		       adt7316_show_DAC_update_mode,
899		       adt7316_store_DAC_update_mode,
900		       0);
901
902static ssize_t adt7316_show_all_DAC_update_modes(struct device *dev,
903						 struct device_attribute *attr,
904						 char *buf)
905{
906	struct iio_dev *dev_info = dev_to_iio_dev(dev);
907	struct adt7316_chip_info *chip = iio_priv(dev_info);
908
909	if (chip->config3 & ADT7316_DA_EN_VIA_DAC_LDAC)
910		return sprintf(buf, "0 - auto at any MSB DAC writing\n"
911				"1 - auto at MSB DAC AB and CD writing\n"
912				"2 - auto at MSB DAC ABCD writing\n"
913				"3 - manual\n");
914	return sprintf(buf, "manual\n");
915}
916
917static IIO_DEVICE_ATTR(all_DAC_update_modes, 0444,
918		       adt7316_show_all_DAC_update_modes, NULL, 0);
919
920static ssize_t adt7316_store_update_DAC(struct device *dev,
921					struct device_attribute *attr,
922					const char *buf,
923					size_t len)
924{
925	struct iio_dev *dev_info = dev_to_iio_dev(dev);
926	struct adt7316_chip_info *chip = iio_priv(dev_info);
927	u8 ldac_config;
928	u8 data;
929	int ret;
930
931	if (chip->config3 & ADT7316_DA_EN_VIA_DAC_LDAC) {
932		if ((chip->dac_config & ADT7316_DA_EN_MODE_MASK) !=
933			ADT7316_DA_EN_MODE_LDAC)
934			return -EPERM;
935
936		ret = kstrtou8(buf, 16, &data);
937		if (ret || data > ADT7316_LDAC_EN_DA_MASK)
938			return -EINVAL;
939
940		ldac_config = chip->ldac_config & (~ADT7316_LDAC_EN_DA_MASK);
941		ldac_config |= data;
942
943		ret = chip->bus.write(chip->bus.client, ADT7316_LDAC_CONFIG,
944			ldac_config);
945		if (ret)
946			return -EIO;
947	} else {
948		gpiod_set_value(chip->ldac_pin, 0);
949		gpiod_set_value(chip->ldac_pin, 1);
950	}
951
952	return len;
953}
954
955static IIO_DEVICE_ATTR(update_DAC, 0644,
956		       NULL,
957		       adt7316_store_update_DAC,
958		       0);
959
960static ssize_t adt7316_show_DA_AB_Vref_bypass(struct device *dev,
961					      struct device_attribute *attr,
962					      char *buf)
963{
964	struct iio_dev *dev_info = dev_to_iio_dev(dev);
965	struct adt7316_chip_info *chip = iio_priv(dev_info);
966
967	return sprintf(buf, "%d\n",
968		!!(chip->dac_config & ADT7316_VREF_BYPASS_DAC_AB));
969}
970
971static ssize_t adt7316_store_DA_AB_Vref_bypass(struct device *dev,
972					       struct device_attribute *attr,
973					       const char *buf,
974					       size_t len)
975{
976	struct iio_dev *dev_info = dev_to_iio_dev(dev);
977	struct adt7316_chip_info *chip = iio_priv(dev_info);
978	u8 dac_config;
979	int ret;
980
981	dac_config = chip->dac_config & (~ADT7316_VREF_BYPASS_DAC_AB);
982	if (buf[0] == '1')
983		dac_config |= ADT7316_VREF_BYPASS_DAC_AB;
984
985	ret = chip->bus.write(chip->bus.client, ADT7316_DAC_CONFIG, dac_config);
986	if (ret)
987		return -EIO;
988
989	chip->dac_config = dac_config;
990
991	return len;
992}
993
994static IIO_DEVICE_ATTR(DA_AB_Vref_bypass, 0644,
995		       adt7316_show_DA_AB_Vref_bypass,
996		       adt7316_store_DA_AB_Vref_bypass,
997		       0);
998
999static ssize_t adt7316_show_DA_CD_Vref_bypass(struct device *dev,
1000					      struct device_attribute *attr,
1001					      char *buf)
1002{
1003	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1004	struct adt7316_chip_info *chip = iio_priv(dev_info);
1005
1006	return sprintf(buf, "%d\n",
1007		!!(chip->dac_config & ADT7316_VREF_BYPASS_DAC_CD));
1008}
1009
1010static ssize_t adt7316_store_DA_CD_Vref_bypass(struct device *dev,
1011					       struct device_attribute *attr,
1012					       const char *buf,
1013					       size_t len)
1014{
1015	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1016	struct adt7316_chip_info *chip = iio_priv(dev_info);
1017	u8 dac_config;
1018	int ret;
1019
1020	dac_config = chip->dac_config & (~ADT7316_VREF_BYPASS_DAC_CD);
1021	if (buf[0] == '1')
1022		dac_config |= ADT7316_VREF_BYPASS_DAC_CD;
1023
1024	ret = chip->bus.write(chip->bus.client, ADT7316_DAC_CONFIG, dac_config);
1025	if (ret)
1026		return -EIO;
1027
1028	chip->dac_config = dac_config;
1029
1030	return len;
1031}
1032
1033static IIO_DEVICE_ATTR(DA_CD_Vref_bypass, 0644,
1034		       adt7316_show_DA_CD_Vref_bypass,
1035		       adt7316_store_DA_CD_Vref_bypass,
1036		       0);
1037
1038static ssize_t adt7316_show_DAC_internal_Vref(struct device *dev,
1039					      struct device_attribute *attr,
1040					      char *buf)
1041{
1042	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1043	struct adt7316_chip_info *chip = iio_priv(dev_info);
1044
1045	if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
1046		return sprintf(buf, "0x%x\n",
1047			(chip->ldac_config & ADT7516_DAC_IN_VREF_MASK) >>
1048			ADT7516_DAC_IN_VREF_OFFSET);
1049	return sprintf(buf, "%d\n",
1050		       !!(chip->ldac_config & ADT7316_DAC_IN_VREF));
1051}
1052
1053static ssize_t adt7316_store_DAC_internal_Vref(struct device *dev,
1054					       struct device_attribute *attr,
1055					       const char *buf,
1056					       size_t len)
1057{
1058	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1059	struct adt7316_chip_info *chip = iio_priv(dev_info);
1060	u8 ldac_config;
1061	u8 data;
1062	int ret;
1063
1064	if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX) {
1065		ret = kstrtou8(buf, 16, &data);
1066		if (ret || data > 3)
1067			return -EINVAL;
1068
1069		ldac_config = chip->ldac_config & (~ADT7516_DAC_IN_VREF_MASK);
1070		if (data & 0x1)
1071			ldac_config |= ADT7516_DAC_AB_IN_VREF;
1072		if (data & 0x2)
1073			ldac_config |= ADT7516_DAC_CD_IN_VREF;
1074	} else {
1075		ret = kstrtou8(buf, 16, &data);
1076		if (ret)
1077			return -EINVAL;
1078
1079		ldac_config = chip->ldac_config & (~ADT7316_DAC_IN_VREF);
1080		if (data)
1081			ldac_config = chip->ldac_config | ADT7316_DAC_IN_VREF;
1082	}
1083
1084	ret = chip->bus.write(chip->bus.client, ADT7316_LDAC_CONFIG,
1085			ldac_config);
1086	if (ret)
1087		return -EIO;
1088
1089	chip->ldac_config = ldac_config;
1090
1091	return len;
1092}
1093
1094static IIO_DEVICE_ATTR(DAC_internal_Vref, 0644,
1095		       adt7316_show_DAC_internal_Vref,
1096		       adt7316_store_DAC_internal_Vref,
1097		       0);
1098
1099static ssize_t adt7316_show_ad(struct adt7316_chip_info *chip,
1100			       int channel, char *buf)
1101{
1102	u16 data;
1103	u8 msb, lsb;
1104	char sign = ' ';
1105	int ret;
1106
1107	if ((chip->config2 & ADT7316_AD_SINGLE_CH_MODE) &&
1108	    channel != (chip->config2 & ADT7516_AD_SINGLE_CH_MASK))
1109		return -EPERM;
1110
1111	switch (channel) {
1112	case ADT7316_AD_SINGLE_CH_IN:
1113		ret = chip->bus.read(chip->bus.client,
1114			ADT7316_LSB_IN_TEMP_VDD, &lsb);
1115		if (ret)
1116			return -EIO;
1117
1118		ret = chip->bus.read(chip->bus.client,
1119			ADT7316_AD_MSB_DATA_BASE + channel, &msb);
1120		if (ret)
1121			return -EIO;
1122
1123		data = msb << ADT7316_T_VALUE_FLOAT_OFFSET;
1124		data |= lsb & ADT7316_LSB_IN_TEMP_MASK;
1125		break;
1126	case ADT7316_AD_SINGLE_CH_VDD:
1127		ret = chip->bus.read(chip->bus.client,
1128			ADT7316_LSB_IN_TEMP_VDD, &lsb);
1129		if (ret)
1130			return -EIO;
1131
1132		ret = chip->bus.read(chip->bus.client,
1133
1134			ADT7316_AD_MSB_DATA_BASE + channel, &msb);
1135		if (ret)
1136			return -EIO;
1137
1138		data = msb << ADT7316_T_VALUE_FLOAT_OFFSET;
1139		data |= (lsb & ADT7316_LSB_VDD_MASK) >> ADT7316_LSB_VDD_OFFSET;
1140		return sprintf(buf, "%d\n", data);
1141	default: /* ex_temp and ain */
1142		ret = chip->bus.read(chip->bus.client,
1143			ADT7316_LSB_EX_TEMP_AIN, &lsb);
1144		if (ret)
1145			return -EIO;
1146
1147		ret = chip->bus.read(chip->bus.client,
1148			ADT7316_AD_MSB_DATA_BASE + channel, &msb);
1149		if (ret)
1150			return -EIO;
1151
1152		data = msb << ADT7316_T_VALUE_FLOAT_OFFSET;
1153		data |= lsb & (ADT7316_LSB_EX_TEMP_MASK <<
1154			(ADT7516_LSB_AIN_SHIFT * (channel -
1155			(ADT7316_MSB_EX_TEMP - ADT7316_AD_MSB_DATA_BASE))));
1156
1157		if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
1158			return sprintf(buf, "%d\n", data);
1159
1160		break;
1161	}
1162
1163	if (data & ADT7316_T_VALUE_SIGN) {
1164		/* convert supplement to positive value */
1165		data = (ADT7316_T_VALUE_SIGN << 1) - data;
1166		sign = '-';
1167	}
1168
1169	return sprintf(buf, "%c%d.%.2d\n", sign,
1170		(data >> ADT7316_T_VALUE_FLOAT_OFFSET),
1171		(data & ADT7316_T_VALUE_FLOAT_MASK) * 25);
1172}
1173
1174static ssize_t adt7316_show_VDD(struct device *dev,
1175				struct device_attribute *attr,
1176				char *buf)
1177{
1178	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1179	struct adt7316_chip_info *chip = iio_priv(dev_info);
1180
1181	return adt7316_show_ad(chip, ADT7316_AD_SINGLE_CH_VDD, buf);
1182}
1183static IIO_DEVICE_ATTR(VDD, 0444, adt7316_show_VDD, NULL, 0);
1184
1185static ssize_t adt7316_show_in_temp(struct device *dev,
1186				    struct device_attribute *attr,
1187				    char *buf)
1188{
1189	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1190	struct adt7316_chip_info *chip = iio_priv(dev_info);
1191
1192	return adt7316_show_ad(chip, ADT7316_AD_SINGLE_CH_IN, buf);
1193}
1194
1195static IIO_DEVICE_ATTR(in_temp, 0444, adt7316_show_in_temp, NULL, 0);
1196
1197static ssize_t adt7316_show_ex_temp_AIN1(struct device *dev,
1198					 struct device_attribute *attr,
1199					 char *buf)
1200{
1201	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1202	struct adt7316_chip_info *chip = iio_priv(dev_info);
1203
1204	return adt7316_show_ad(chip, ADT7316_AD_SINGLE_CH_EX, buf);
1205}
1206
1207static IIO_DEVICE_ATTR(ex_temp_AIN1, 0444, adt7316_show_ex_temp_AIN1,
1208		       NULL, 0);
1209static IIO_DEVICE_ATTR(ex_temp, 0444, adt7316_show_ex_temp_AIN1, NULL, 0);
1210
1211static ssize_t adt7316_show_AIN2(struct device *dev,
1212				 struct device_attribute *attr,
1213				 char *buf)
1214{
1215	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1216	struct adt7316_chip_info *chip = iio_priv(dev_info);
1217
1218	return adt7316_show_ad(chip, ADT7516_AD_SINGLE_CH_AIN2, buf);
1219}
1220static IIO_DEVICE_ATTR(AIN2, 0444, adt7316_show_AIN2, NULL, 0);
1221
1222static ssize_t adt7316_show_AIN3(struct device *dev,
1223				 struct device_attribute *attr,
1224				 char *buf)
1225{
1226	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1227	struct adt7316_chip_info *chip = iio_priv(dev_info);
1228
1229	return adt7316_show_ad(chip, ADT7516_AD_SINGLE_CH_AIN3, buf);
1230}
1231static IIO_DEVICE_ATTR(AIN3, 0444, adt7316_show_AIN3, NULL, 0);
1232
1233static ssize_t adt7316_show_AIN4(struct device *dev,
1234				 struct device_attribute *attr,
1235				 char *buf)
1236{
1237	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1238	struct adt7316_chip_info *chip = iio_priv(dev_info);
1239
1240	return adt7316_show_ad(chip, ADT7516_AD_SINGLE_CH_AIN4, buf);
1241}
1242static IIO_DEVICE_ATTR(AIN4, 0444, adt7316_show_AIN4, NULL, 0);
1243
1244static ssize_t adt7316_show_temp_offset(struct adt7316_chip_info *chip,
1245					int offset_addr, char *buf)
1246{
1247	int data;
1248	u8 val;
1249	int ret;
1250
1251	ret = chip->bus.read(chip->bus.client, offset_addr, &val);
1252	if (ret)
1253		return -EIO;
1254
1255	data = (int)val;
1256	if (val & 0x80)
1257		data -= 256;
1258
1259	return sprintf(buf, "%d\n", data);
1260}
1261
1262static ssize_t adt7316_store_temp_offset(struct adt7316_chip_info *chip,
1263					 int offset_addr,
1264					 const char *buf,
1265					 size_t len)
1266{
1267	int data;
1268	u8 val;
1269	int ret;
1270
1271	ret = kstrtoint(buf, 10, &data);
1272	if (ret || data > 127 || data < -128)
1273		return -EINVAL;
1274
1275	if (data < 0)
1276		data += 256;
1277
1278	val = (u8)data;
1279
1280	ret = chip->bus.write(chip->bus.client, offset_addr, val);
1281	if (ret)
1282		return -EIO;
1283
1284	return len;
1285}
1286
1287static ssize_t adt7316_show_in_temp_offset(struct device *dev,
1288					   struct device_attribute *attr,
1289					   char *buf)
1290{
1291	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1292	struct adt7316_chip_info *chip = iio_priv(dev_info);
1293
1294	return adt7316_show_temp_offset(chip, ADT7316_IN_TEMP_OFFSET, buf);
1295}
1296
1297static ssize_t adt7316_store_in_temp_offset(struct device *dev,
1298					    struct device_attribute *attr,
1299					    const char *buf,
1300					    size_t len)
1301{
1302	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1303	struct adt7316_chip_info *chip = iio_priv(dev_info);
1304
1305	return adt7316_store_temp_offset(chip, ADT7316_IN_TEMP_OFFSET, buf,
1306			len);
1307}
1308
1309static IIO_DEVICE_ATTR(in_temp_offset, 0644,
1310		       adt7316_show_in_temp_offset,
1311		       adt7316_store_in_temp_offset, 0);
1312
1313static ssize_t adt7316_show_ex_temp_offset(struct device *dev,
1314					   struct device_attribute *attr,
1315					   char *buf)
1316{
1317	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1318	struct adt7316_chip_info *chip = iio_priv(dev_info);
1319
1320	return adt7316_show_temp_offset(chip, ADT7316_EX_TEMP_OFFSET, buf);
1321}
1322
1323static ssize_t adt7316_store_ex_temp_offset(struct device *dev,
1324					    struct device_attribute *attr,
1325					    const char *buf,
1326					    size_t len)
1327{
1328	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1329	struct adt7316_chip_info *chip = iio_priv(dev_info);
1330
1331	return adt7316_store_temp_offset(chip, ADT7316_EX_TEMP_OFFSET, buf,
1332			len);
1333}
1334
1335static IIO_DEVICE_ATTR(ex_temp_offset, 0644,
1336		       adt7316_show_ex_temp_offset,
1337		       adt7316_store_ex_temp_offset, 0);
1338
1339static ssize_t adt7316_show_in_analog_temp_offset(struct device *dev,
1340						  struct device_attribute *attr,
1341						  char *buf)
1342{
1343	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1344	struct adt7316_chip_info *chip = iio_priv(dev_info);
1345
1346	return adt7316_show_temp_offset(chip,
1347			ADT7316_IN_ANALOG_TEMP_OFFSET, buf);
1348}
1349
1350static ssize_t adt7316_store_in_analog_temp_offset(struct device *dev,
1351						   struct device_attribute *attr,
1352						   const char *buf,
1353						   size_t len)
1354{
1355	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1356	struct adt7316_chip_info *chip = iio_priv(dev_info);
1357
1358	return adt7316_store_temp_offset(chip,
1359			ADT7316_IN_ANALOG_TEMP_OFFSET, buf, len);
1360}
1361
1362static IIO_DEVICE_ATTR(in_analog_temp_offset, 0644,
1363		       adt7316_show_in_analog_temp_offset,
1364		       adt7316_store_in_analog_temp_offset, 0);
1365
1366static ssize_t adt7316_show_ex_analog_temp_offset(struct device *dev,
1367						  struct device_attribute *attr,
1368						  char *buf)
1369{
1370	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1371	struct adt7316_chip_info *chip = iio_priv(dev_info);
1372
1373	return adt7316_show_temp_offset(chip,
1374			ADT7316_EX_ANALOG_TEMP_OFFSET, buf);
1375}
1376
1377static ssize_t adt7316_store_ex_analog_temp_offset(struct device *dev,
1378						   struct device_attribute *attr,
1379						   const char *buf,
1380						   size_t len)
1381{
1382	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1383	struct adt7316_chip_info *chip = iio_priv(dev_info);
1384
1385	return adt7316_store_temp_offset(chip,
1386			ADT7316_EX_ANALOG_TEMP_OFFSET, buf, len);
1387}
1388
1389static IIO_DEVICE_ATTR(ex_analog_temp_offset, 0644,
1390		       adt7316_show_ex_analog_temp_offset,
1391		       adt7316_store_ex_analog_temp_offset, 0);
1392
1393static ssize_t adt7316_show_DAC(struct adt7316_chip_info *chip,
1394				int channel, char *buf)
1395{
1396	u16 data = 0;
1397	u8 msb, lsb, offset;
1398	int ret;
1399
1400	if (channel >= ADT7316_DA_MSB_DATA_REGS ||
1401	    (channel == 0 &&
1402	    (chip->config3 & ADT7316_EN_IN_TEMP_PROP_DACA)) ||
1403	    (channel == 1 &&
1404	    (chip->config3 & ADT7316_EN_EX_TEMP_PROP_DACB)))
1405		return -EPERM;
1406
1407	offset = chip->dac_bits - 8;
1408
1409	if (chip->dac_bits > 8) {
1410		ret = chip->bus.read(chip->bus.client,
1411			ADT7316_DA_DATA_BASE + channel * 2, &lsb);
1412		if (ret)
1413			return -EIO;
1414	}
1415
1416	ret = chip->bus.read(chip->bus.client,
1417		ADT7316_DA_DATA_BASE + 1 + channel * 2, &msb);
1418	if (ret)
1419		return -EIO;
1420
1421	if (chip->dac_bits == 12)
1422		data = lsb >> ADT7316_DA_12_BIT_LSB_SHIFT;
1423	else if (chip->dac_bits == 10)
1424		data = lsb >> ADT7316_DA_10_BIT_LSB_SHIFT;
1425	data |= msb << offset;
1426
1427	return sprintf(buf, "%d\n", data);
1428}
1429
1430static ssize_t adt7316_store_DAC(struct adt7316_chip_info *chip,
1431				 int channel, const char *buf, size_t len)
1432{
1433	u8 msb, lsb, lsb_reg, offset;
1434	u16 data;
1435	int ret;
1436
1437	if (channel >= ADT7316_DA_MSB_DATA_REGS ||
1438	    (channel == 0 &&
1439	    (chip->config3 & ADT7316_EN_IN_TEMP_PROP_DACA)) ||
1440	    (channel == 1 &&
1441	    (chip->config3 & ADT7316_EN_EX_TEMP_PROP_DACB)))
1442		return -EPERM;
1443
1444	offset = chip->dac_bits - 8;
1445
1446	ret = kstrtou16(buf, 10, &data);
1447	if (ret || data >= (1 << chip->dac_bits))
1448		return -EINVAL;
1449
1450	if (chip->dac_bits > 8) {
1451		lsb = data & ((1 << offset) - 1);
1452		if (chip->dac_bits == 12)
1453			lsb_reg = lsb << ADT7316_DA_12_BIT_LSB_SHIFT;
1454		else
1455			lsb_reg = lsb << ADT7316_DA_10_BIT_LSB_SHIFT;
1456		ret = chip->bus.write(chip->bus.client,
1457			ADT7316_DA_DATA_BASE + channel * 2, lsb_reg);
1458		if (ret)
1459			return -EIO;
1460	}
1461
1462	msb = data >> offset;
1463	ret = chip->bus.write(chip->bus.client,
1464		ADT7316_DA_DATA_BASE + 1 + channel * 2, msb);
1465	if (ret)
1466		return -EIO;
1467
1468	return len;
1469}
1470
1471static ssize_t adt7316_show_DAC_A(struct device *dev,
1472				  struct device_attribute *attr,
1473				  char *buf)
1474{
1475	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1476	struct adt7316_chip_info *chip = iio_priv(dev_info);
1477
1478	return adt7316_show_DAC(chip, 0, buf);
1479}
1480
1481static ssize_t adt7316_store_DAC_A(struct device *dev,
1482				   struct device_attribute *attr,
1483				   const char *buf,
1484				   size_t len)
1485{
1486	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1487	struct adt7316_chip_info *chip = iio_priv(dev_info);
1488
1489	return adt7316_store_DAC(chip, 0, buf, len);
1490}
1491
1492static IIO_DEVICE_ATTR(DAC_A, 0644, adt7316_show_DAC_A,
1493		       adt7316_store_DAC_A, 0);
1494
1495static ssize_t adt7316_show_DAC_B(struct device *dev,
1496				  struct device_attribute *attr,
1497				  char *buf)
1498{
1499	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1500	struct adt7316_chip_info *chip = iio_priv(dev_info);
1501
1502	return adt7316_show_DAC(chip, 1, buf);
1503}
1504
1505static ssize_t adt7316_store_DAC_B(struct device *dev,
1506				   struct device_attribute *attr,
1507				   const char *buf,
1508				   size_t len)
1509{
1510	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1511	struct adt7316_chip_info *chip = iio_priv(dev_info);
1512
1513	return adt7316_store_DAC(chip, 1, buf, len);
1514}
1515
1516static IIO_DEVICE_ATTR(DAC_B, 0644, adt7316_show_DAC_B,
1517		       adt7316_store_DAC_B, 0);
1518
1519static ssize_t adt7316_show_DAC_C(struct device *dev,
1520				  struct device_attribute *attr,
1521				  char *buf)
1522{
1523	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1524	struct adt7316_chip_info *chip = iio_priv(dev_info);
1525
1526	return adt7316_show_DAC(chip, 2, buf);
1527}
1528
1529static ssize_t adt7316_store_DAC_C(struct device *dev,
1530				   struct device_attribute *attr,
1531				   const char *buf,
1532				   size_t len)
1533{
1534	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1535	struct adt7316_chip_info *chip = iio_priv(dev_info);
1536
1537	return adt7316_store_DAC(chip, 2, buf, len);
1538}
1539
1540static IIO_DEVICE_ATTR(DAC_C, 0644, adt7316_show_DAC_C,
1541		       adt7316_store_DAC_C, 0);
1542
1543static ssize_t adt7316_show_DAC_D(struct device *dev,
1544				  struct device_attribute *attr,
1545				  char *buf)
1546{
1547	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1548	struct adt7316_chip_info *chip = iio_priv(dev_info);
1549
1550	return adt7316_show_DAC(chip, 3, buf);
1551}
1552
1553static ssize_t adt7316_store_DAC_D(struct device *dev,
1554				   struct device_attribute *attr,
1555				   const char *buf,
1556				   size_t len)
1557{
1558	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1559	struct adt7316_chip_info *chip = iio_priv(dev_info);
1560
1561	return adt7316_store_DAC(chip, 3, buf, len);
1562}
1563
1564static IIO_DEVICE_ATTR(DAC_D, 0644, adt7316_show_DAC_D,
1565		       adt7316_store_DAC_D, 0);
1566
1567static ssize_t adt7316_show_device_id(struct device *dev,
1568				      struct device_attribute *attr,
1569				      char *buf)
1570{
1571	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1572	struct adt7316_chip_info *chip = iio_priv(dev_info);
1573	u8 id;
1574	int ret;
1575
1576	ret = chip->bus.read(chip->bus.client, ADT7316_DEVICE_ID, &id);
1577	if (ret)
1578		return -EIO;
1579
1580	return sprintf(buf, "%d\n", id);
1581}
1582
1583static IIO_DEVICE_ATTR(device_id, 0444, adt7316_show_device_id, NULL, 0);
1584
1585static ssize_t adt7316_show_manufactorer_id(struct device *dev,
1586					    struct device_attribute *attr,
1587					    char *buf)
1588{
1589	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1590	struct adt7316_chip_info *chip = iio_priv(dev_info);
1591	u8 id;
1592	int ret;
1593
1594	ret = chip->bus.read(chip->bus.client, ADT7316_MANUFACTURE_ID, &id);
1595	if (ret)
1596		return -EIO;
1597
1598	return sprintf(buf, "%d\n", id);
1599}
1600
1601static IIO_DEVICE_ATTR(manufactorer_id, 0444,
1602		       adt7316_show_manufactorer_id, NULL, 0);
1603
1604static ssize_t adt7316_show_device_rev(struct device *dev,
1605				       struct device_attribute *attr,
1606				       char *buf)
1607{
1608	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1609	struct adt7316_chip_info *chip = iio_priv(dev_info);
1610	u8 rev;
1611	int ret;
1612
1613	ret = chip->bus.read(chip->bus.client, ADT7316_DEVICE_REV, &rev);
1614	if (ret)
1615		return -EIO;
1616
1617	return sprintf(buf, "%d\n", rev);
1618}
1619
1620static IIO_DEVICE_ATTR(device_rev, 0444, adt7316_show_device_rev, NULL, 0);
1621
1622static ssize_t adt7316_show_bus_type(struct device *dev,
1623				     struct device_attribute *attr,
1624				     char *buf)
1625{
1626	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1627	struct adt7316_chip_info *chip = iio_priv(dev_info);
1628	u8 stat;
1629	int ret;
1630
1631	ret = chip->bus.read(chip->bus.client, ADT7316_SPI_LOCK_STAT, &stat);
1632	if (ret)
1633		return -EIO;
1634
1635	if (stat)
1636		return sprintf(buf, "spi\n");
1637
1638	return sprintf(buf, "i2c\n");
1639}
1640
1641static IIO_DEVICE_ATTR(bus_type, 0444, adt7316_show_bus_type, NULL, 0);
1642
1643static struct attribute *adt7316_attributes[] = {
1644	&iio_dev_attr_all_modes.dev_attr.attr,
1645	&iio_dev_attr_mode.dev_attr.attr,
1646	&iio_dev_attr_enabled.dev_attr.attr,
1647	&iio_dev_attr_ad_channel.dev_attr.attr,
1648	&iio_dev_attr_all_ad_channels.dev_attr.attr,
1649	&iio_dev_attr_disable_averaging.dev_attr.attr,
1650	&iio_dev_attr_enable_smbus_timeout.dev_attr.attr,
1651	&iio_dev_attr_powerdown.dev_attr.attr,
1652	&iio_dev_attr_fast_ad_clock.dev_attr.attr,
1653	&iio_dev_attr_da_high_resolution.dev_attr.attr,
1654	&iio_dev_attr_enable_proportion_DACA.dev_attr.attr,
1655	&iio_dev_attr_enable_proportion_DACB.dev_attr.attr,
1656	&iio_dev_attr_DAC_2Vref_channels_mask.dev_attr.attr,
1657	&iio_dev_attr_DAC_update_mode.dev_attr.attr,
1658	&iio_dev_attr_all_DAC_update_modes.dev_attr.attr,
1659	&iio_dev_attr_update_DAC.dev_attr.attr,
1660	&iio_dev_attr_DA_AB_Vref_bypass.dev_attr.attr,
1661	&iio_dev_attr_DA_CD_Vref_bypass.dev_attr.attr,
1662	&iio_dev_attr_DAC_internal_Vref.dev_attr.attr,
1663	&iio_dev_attr_VDD.dev_attr.attr,
1664	&iio_dev_attr_in_temp.dev_attr.attr,
1665	&iio_dev_attr_ex_temp.dev_attr.attr,
1666	&iio_dev_attr_in_temp_offset.dev_attr.attr,
1667	&iio_dev_attr_ex_temp_offset.dev_attr.attr,
1668	&iio_dev_attr_in_analog_temp_offset.dev_attr.attr,
1669	&iio_dev_attr_ex_analog_temp_offset.dev_attr.attr,
1670	&iio_dev_attr_DAC_A.dev_attr.attr,
1671	&iio_dev_attr_DAC_B.dev_attr.attr,
1672	&iio_dev_attr_DAC_C.dev_attr.attr,
1673	&iio_dev_attr_DAC_D.dev_attr.attr,
1674	&iio_dev_attr_device_id.dev_attr.attr,
1675	&iio_dev_attr_manufactorer_id.dev_attr.attr,
1676	&iio_dev_attr_device_rev.dev_attr.attr,
1677	&iio_dev_attr_bus_type.dev_attr.attr,
1678	NULL,
1679};
1680
1681static const struct attribute_group adt7316_attribute_group = {
1682	.attrs = adt7316_attributes,
1683};
1684
1685static struct attribute *adt7516_attributes[] = {
1686	&iio_dev_attr_all_modes.dev_attr.attr,
1687	&iio_dev_attr_mode.dev_attr.attr,
1688	&iio_dev_attr_select_ex_temp.dev_attr.attr,
1689	&iio_dev_attr_enabled.dev_attr.attr,
1690	&iio_dev_attr_ad_channel.dev_attr.attr,
1691	&iio_dev_attr_all_ad_channels.dev_attr.attr,
1692	&iio_dev_attr_disable_averaging.dev_attr.attr,
1693	&iio_dev_attr_enable_smbus_timeout.dev_attr.attr,
1694	&iio_dev_attr_powerdown.dev_attr.attr,
1695	&iio_dev_attr_fast_ad_clock.dev_attr.attr,
1696	&iio_dev_attr_AIN_internal_Vref.dev_attr.attr,
1697	&iio_dev_attr_da_high_resolution.dev_attr.attr,
1698	&iio_dev_attr_enable_proportion_DACA.dev_attr.attr,
1699	&iio_dev_attr_enable_proportion_DACB.dev_attr.attr,
1700	&iio_dev_attr_DAC_2Vref_channels_mask.dev_attr.attr,
1701	&iio_dev_attr_DAC_update_mode.dev_attr.attr,
1702	&iio_dev_attr_all_DAC_update_modes.dev_attr.attr,
1703	&iio_dev_attr_update_DAC.dev_attr.attr,
1704	&iio_dev_attr_DAC_internal_Vref.dev_attr.attr,
1705	&iio_dev_attr_VDD.dev_attr.attr,
1706	&iio_dev_attr_in_temp.dev_attr.attr,
1707	&iio_dev_attr_ex_temp_AIN1.dev_attr.attr,
1708	&iio_dev_attr_AIN2.dev_attr.attr,
1709	&iio_dev_attr_AIN3.dev_attr.attr,
1710	&iio_dev_attr_AIN4.dev_attr.attr,
1711	&iio_dev_attr_in_temp_offset.dev_attr.attr,
1712	&iio_dev_attr_ex_temp_offset.dev_attr.attr,
1713	&iio_dev_attr_in_analog_temp_offset.dev_attr.attr,
1714	&iio_dev_attr_ex_analog_temp_offset.dev_attr.attr,
1715	&iio_dev_attr_DAC_A.dev_attr.attr,
1716	&iio_dev_attr_DAC_B.dev_attr.attr,
1717	&iio_dev_attr_DAC_C.dev_attr.attr,
1718	&iio_dev_attr_DAC_D.dev_attr.attr,
1719	&iio_dev_attr_device_id.dev_attr.attr,
1720	&iio_dev_attr_manufactorer_id.dev_attr.attr,
1721	&iio_dev_attr_device_rev.dev_attr.attr,
1722	&iio_dev_attr_bus_type.dev_attr.attr,
1723	NULL,
1724};
1725
1726static const struct attribute_group adt7516_attribute_group = {
1727	.attrs = adt7516_attributes,
1728};
1729
1730static irqreturn_t adt7316_event_handler(int irq, void *private)
1731{
1732	struct iio_dev *indio_dev = private;
1733	struct adt7316_chip_info *chip = iio_priv(indio_dev);
1734	u8 stat1, stat2;
1735	int ret;
1736	s64 time;
1737
1738	ret = chip->bus.read(chip->bus.client, ADT7316_INT_STAT1, &stat1);
1739	if (!ret) {
1740		if ((chip->id & ID_FAMILY_MASK) != ID_ADT75XX)
1741			stat1 &= 0x1F;
1742
1743		time = iio_get_time_ns(indio_dev);
1744		if (stat1 & BIT(0))
1745			iio_push_event(indio_dev,
1746				       IIO_UNMOD_EVENT_CODE(IIO_TEMP, 0,
1747							    IIO_EV_TYPE_THRESH,
1748							    IIO_EV_DIR_RISING),
1749				       time);
1750		if (stat1 & BIT(1))
1751			iio_push_event(indio_dev,
1752				       IIO_UNMOD_EVENT_CODE(IIO_TEMP, 0,
1753							    IIO_EV_TYPE_THRESH,
1754							    IIO_EV_DIR_FALLING),
1755				       time);
1756		if (stat1 & BIT(2))
1757			iio_push_event(indio_dev,
1758				       IIO_UNMOD_EVENT_CODE(IIO_TEMP, 1,
1759							    IIO_EV_TYPE_THRESH,
1760							    IIO_EV_DIR_RISING),
1761				       time);
1762		if (stat1 & BIT(3))
1763			iio_push_event(indio_dev,
1764				       IIO_UNMOD_EVENT_CODE(IIO_TEMP, 1,
1765							    IIO_EV_TYPE_THRESH,
1766							    IIO_EV_DIR_FALLING),
1767				       time);
1768		if (stat1 & BIT(5))
1769			iio_push_event(indio_dev,
1770				       IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 1,
1771							    IIO_EV_TYPE_THRESH,
1772							    IIO_EV_DIR_EITHER),
1773				       time);
1774		if (stat1 & BIT(6))
1775			iio_push_event(indio_dev,
1776				       IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 2,
1777							    IIO_EV_TYPE_THRESH,
1778							    IIO_EV_DIR_EITHER),
1779				       time);
1780		if (stat1 & BIT(7))
1781			iio_push_event(indio_dev,
1782				       IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 3,
1783							    IIO_EV_TYPE_THRESH,
1784							    IIO_EV_DIR_EITHER),
1785				       time);
1786		}
1787	ret = chip->bus.read(chip->bus.client, ADT7316_INT_STAT2, &stat2);
1788	if (!ret) {
1789		if (stat2 & ADT7316_INT_MASK2_VDD)
1790			iio_push_event(indio_dev,
1791				       IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE,
1792							    0,
1793							    IIO_EV_TYPE_THRESH,
1794							    IIO_EV_DIR_RISING),
1795				       iio_get_time_ns(indio_dev));
1796	}
1797
1798	return IRQ_HANDLED;
1799}
1800
1801static int adt7316_setup_irq(struct iio_dev *indio_dev)
1802{
1803	struct adt7316_chip_info *chip = iio_priv(indio_dev);
1804	int irq_type, ret;
1805
1806	irq_type = irqd_get_trigger_type(irq_get_irq_data(chip->bus.irq));
1807
1808	switch (irq_type) {
1809	case IRQF_TRIGGER_HIGH:
1810	case IRQF_TRIGGER_RISING:
1811		break;
1812	case IRQF_TRIGGER_LOW:
1813	case IRQF_TRIGGER_FALLING:
1814		break;
1815	default:
1816		dev_info(&indio_dev->dev, "mode %d unsupported, using IRQF_TRIGGER_LOW\n",
1817			 irq_type);
1818		irq_type = IRQF_TRIGGER_LOW;
1819		break;
1820	}
1821
1822	ret = devm_request_threaded_irq(&indio_dev->dev, chip->bus.irq,
1823					NULL, adt7316_event_handler,
1824					irq_type | IRQF_ONESHOT,
1825					indio_dev->name, indio_dev);
1826	if (ret) {
1827		dev_err(&indio_dev->dev, "failed to request irq %d\n",
1828			chip->bus.irq);
1829		return ret;
1830	}
1831
1832	if (irq_type & IRQF_TRIGGER_HIGH)
1833		chip->config1 |= ADT7316_INT_POLARITY;
1834
1835	return 0;
1836}
1837
1838/*
1839 * Show mask of enabled interrupts in Hex.
1840 */
1841static ssize_t adt7316_show_int_mask(struct device *dev,
1842				     struct device_attribute *attr,
1843				     char *buf)
1844{
1845	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1846	struct adt7316_chip_info *chip = iio_priv(dev_info);
1847
1848	return sprintf(buf, "0x%x\n", chip->int_mask);
1849}
1850
1851/*
1852 * Set 1 to the mask in Hex to enabled interrupts.
1853 */
1854static ssize_t adt7316_set_int_mask(struct device *dev,
1855				    struct device_attribute *attr,
1856				    const char *buf,
1857				    size_t len)
1858{
1859	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1860	struct adt7316_chip_info *chip = iio_priv(dev_info);
1861	u16 data;
1862	int ret;
1863	u8 mask;
1864
1865	ret = kstrtou16(buf, 16, &data);
1866	if (ret || data >= ADT7316_VDD_INT_MASK + 1)
1867		return -EINVAL;
1868
1869	if (data & ADT7316_VDD_INT_MASK)
1870		mask = 0;			/* enable vdd int */
1871	else
1872		mask = ADT7316_INT_MASK2_VDD;	/* disable vdd int */
1873
1874	ret = chip->bus.write(chip->bus.client, ADT7316_INT_MASK2, mask);
1875	if (!ret) {
1876		chip->int_mask &= ~ADT7316_VDD_INT_MASK;
1877		chip->int_mask |= data & ADT7316_VDD_INT_MASK;
1878	}
1879
1880	if (data & ADT7316_TEMP_AIN_INT_MASK) {
1881		if ((chip->id & ID_FAMILY_MASK) == ID_ADT73XX)
1882			/* mask in reg is opposite, set 1 to disable */
1883			mask = (~data) & ADT7316_TEMP_INT_MASK;
1884		else
1885			/* mask in reg is opposite, set 1 to disable */
1886			mask = (~data) & ADT7316_TEMP_AIN_INT_MASK;
1887	}
1888	ret = chip->bus.write(chip->bus.client, ADT7316_INT_MASK1, mask);
1889
1890	chip->int_mask = mask;
1891
1892	return len;
1893}
1894
1895static inline ssize_t adt7316_show_ad_bound(struct device *dev,
1896					    struct device_attribute *attr,
1897					    char *buf)
1898{
1899	struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
1900	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1901	struct adt7316_chip_info *chip = iio_priv(dev_info);
1902	u8 val;
1903	int data;
1904	int ret;
1905
1906	if ((chip->id & ID_FAMILY_MASK) == ID_ADT73XX &&
1907	    this_attr->address > ADT7316_EX_TEMP_LOW)
1908		return -EPERM;
1909
1910	ret = chip->bus.read(chip->bus.client, this_attr->address, &val);
1911	if (ret)
1912		return -EIO;
1913
1914	data = (int)val;
1915
1916	if (!((chip->id & ID_FAMILY_MASK) == ID_ADT75XX &&
1917	      (chip->config1 & ADT7516_SEL_AIN1_2_EX_TEMP_MASK) == 0)) {
1918		if (data & 0x80)
1919			data -= 256;
1920	}
1921
1922	return sprintf(buf, "%d\n", data);
1923}
1924
1925static inline ssize_t adt7316_set_ad_bound(struct device *dev,
1926					   struct device_attribute *attr,
1927					   const char *buf,
1928					   size_t len)
1929{
1930	struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
1931	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1932	struct adt7316_chip_info *chip = iio_priv(dev_info);
1933	int data;
1934	u8 val;
1935	int ret;
1936
1937	if ((chip->id & ID_FAMILY_MASK) == ID_ADT73XX &&
1938	    this_attr->address > ADT7316_EX_TEMP_LOW)
1939		return -EPERM;
1940
1941	ret = kstrtoint(buf, 10, &data);
1942	if (ret)
1943		return -EINVAL;
1944
1945	if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX &&
1946	    (chip->config1 & ADT7516_SEL_AIN1_2_EX_TEMP_MASK) == 0) {
1947		if (data > 255 || data < 0)
1948			return -EINVAL;
1949	} else {
1950		if (data > 127 || data < -128)
1951			return -EINVAL;
1952
1953		if (data < 0)
1954			data += 256;
1955	}
1956
1957	val = (u8)data;
1958
1959	ret = chip->bus.write(chip->bus.client, this_attr->address, val);
1960	if (ret)
1961		return -EIO;
1962
1963	return len;
1964}
1965
1966static ssize_t adt7316_show_int_enabled(struct device *dev,
1967					struct device_attribute *attr,
1968					char *buf)
1969{
1970	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1971	struct adt7316_chip_info *chip = iio_priv(dev_info);
1972
1973	return sprintf(buf, "%d\n", !!(chip->config1 & ADT7316_INT_EN));
1974}
1975
1976static ssize_t adt7316_set_int_enabled(struct device *dev,
1977				       struct device_attribute *attr,
1978				       const char *buf,
1979				       size_t len)
1980{
1981	struct iio_dev *dev_info = dev_to_iio_dev(dev);
1982	struct adt7316_chip_info *chip = iio_priv(dev_info);
1983	u8 config1;
1984	int ret;
1985
1986	config1 = chip->config1 & (~ADT7316_INT_EN);
1987	if (buf[0] == '1')
1988		config1 |= ADT7316_INT_EN;
1989
1990	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG1, config1);
1991	if (ret)
1992		return -EIO;
1993
1994	chip->config1 = config1;
1995
1996	return len;
1997}
1998
1999static IIO_DEVICE_ATTR(int_mask,
2000		       0644,
2001		       adt7316_show_int_mask, adt7316_set_int_mask,
2002		       0);
2003static IIO_DEVICE_ATTR(in_temp_high_value,
2004		       0644,
2005		       adt7316_show_ad_bound, adt7316_set_ad_bound,
2006		       ADT7316_IN_TEMP_HIGH);
2007static IIO_DEVICE_ATTR(in_temp_low_value,
2008		       0644,
2009		       adt7316_show_ad_bound, adt7316_set_ad_bound,
2010		       ADT7316_IN_TEMP_LOW);
2011static IIO_DEVICE_ATTR(ex_temp_high_value,
2012		       0644,
2013		       adt7316_show_ad_bound, adt7316_set_ad_bound,
2014		       ADT7316_EX_TEMP_HIGH);
2015static IIO_DEVICE_ATTR(ex_temp_low_value,
2016		       0644,
2017		       adt7316_show_ad_bound, adt7316_set_ad_bound,
2018		       ADT7316_EX_TEMP_LOW);
2019
2020/* NASTY duplication to be fixed */
2021static IIO_DEVICE_ATTR(ex_temp_ain1_high_value,
2022		       0644,
2023		       adt7316_show_ad_bound, adt7316_set_ad_bound,
2024		       ADT7316_EX_TEMP_HIGH);
2025static IIO_DEVICE_ATTR(ex_temp_ain1_low_value,
2026		       0644,
2027		       adt7316_show_ad_bound, adt7316_set_ad_bound,
2028		       ADT7316_EX_TEMP_LOW);
2029static IIO_DEVICE_ATTR(ain2_high_value,
2030		       0644,
2031		       adt7316_show_ad_bound, adt7316_set_ad_bound,
2032		       ADT7516_AIN2_HIGH);
2033static IIO_DEVICE_ATTR(ain2_low_value,
2034		       0644,
2035		       adt7316_show_ad_bound, adt7316_set_ad_bound,
2036		       ADT7516_AIN2_LOW);
2037static IIO_DEVICE_ATTR(ain3_high_value,
2038		       0644,
2039		       adt7316_show_ad_bound, adt7316_set_ad_bound,
2040		       ADT7516_AIN3_HIGH);
2041static IIO_DEVICE_ATTR(ain3_low_value,
2042		       0644,
2043		       adt7316_show_ad_bound, adt7316_set_ad_bound,
2044		       ADT7516_AIN3_LOW);
2045static IIO_DEVICE_ATTR(ain4_high_value,
2046		       0644,
2047		       adt7316_show_ad_bound, adt7316_set_ad_bound,
2048		       ADT7516_AIN4_HIGH);
2049static IIO_DEVICE_ATTR(ain4_low_value,
2050		       0644,
2051		       adt7316_show_ad_bound, adt7316_set_ad_bound,
2052		       ADT7516_AIN4_LOW);
2053static IIO_DEVICE_ATTR(int_enabled,
2054		       0644,
2055		       adt7316_show_int_enabled,
2056		       adt7316_set_int_enabled, 0);
2057
2058static struct attribute *adt7316_event_attributes[] = {
2059	&iio_dev_attr_int_mask.dev_attr.attr,
2060	&iio_dev_attr_in_temp_high_value.dev_attr.attr,
2061	&iio_dev_attr_in_temp_low_value.dev_attr.attr,
2062	&iio_dev_attr_ex_temp_high_value.dev_attr.attr,
2063	&iio_dev_attr_ex_temp_low_value.dev_attr.attr,
2064	&iio_dev_attr_int_enabled.dev_attr.attr,
2065	NULL,
2066};
2067
2068static const struct attribute_group adt7316_event_attribute_group = {
2069	.attrs = adt7316_event_attributes,
2070	.name = "events",
2071};
2072
2073static struct attribute *adt7516_event_attributes[] = {
2074	&iio_dev_attr_int_mask.dev_attr.attr,
2075	&iio_dev_attr_in_temp_high_value.dev_attr.attr,
2076	&iio_dev_attr_in_temp_low_value.dev_attr.attr,
2077	&iio_dev_attr_ex_temp_ain1_high_value.dev_attr.attr,
2078	&iio_dev_attr_ex_temp_ain1_low_value.dev_attr.attr,
2079	&iio_dev_attr_ain2_high_value.dev_attr.attr,
2080	&iio_dev_attr_ain2_low_value.dev_attr.attr,
2081	&iio_dev_attr_ain3_high_value.dev_attr.attr,
2082	&iio_dev_attr_ain3_low_value.dev_attr.attr,
2083	&iio_dev_attr_ain4_high_value.dev_attr.attr,
2084	&iio_dev_attr_ain4_low_value.dev_attr.attr,
2085	&iio_dev_attr_int_enabled.dev_attr.attr,
2086	NULL,
2087};
2088
2089static const struct attribute_group adt7516_event_attribute_group = {
2090	.attrs = adt7516_event_attributes,
2091	.name = "events",
2092};
2093
2094#ifdef CONFIG_PM_SLEEP
2095static int adt7316_disable(struct device *dev)
2096{
2097	struct iio_dev *dev_info = dev_get_drvdata(dev);
2098	struct adt7316_chip_info *chip = iio_priv(dev_info);
2099
2100	return _adt7316_store_enabled(chip, 0);
2101}
2102
2103static int adt7316_enable(struct device *dev)
2104{
2105	struct iio_dev *dev_info = dev_get_drvdata(dev);
2106	struct adt7316_chip_info *chip = iio_priv(dev_info);
2107
2108	return _adt7316_store_enabled(chip, 1);
2109}
2110EXPORT_SYMBOL_GPL(adt7316_pm_ops);
2111SIMPLE_DEV_PM_OPS(adt7316_pm_ops, adt7316_disable, adt7316_enable);
2112#endif
2113
2114static const struct iio_info adt7316_info = {
2115	.attrs = &adt7316_attribute_group,
2116	.event_attrs = &adt7316_event_attribute_group,
2117};
2118
2119static const struct iio_info adt7516_info = {
2120	.attrs = &adt7516_attribute_group,
2121	.event_attrs = &adt7516_event_attribute_group,
2122};
2123
2124/*
2125 * device probe and remove
2126 */
2127int adt7316_probe(struct device *dev, struct adt7316_bus *bus,
2128		  const char *name)
2129{
2130	struct adt7316_chip_info *chip;
2131	struct iio_dev *indio_dev;
2132	int ret;
2133
2134	indio_dev = devm_iio_device_alloc(dev, sizeof(*chip));
2135	if (!indio_dev)
2136		return -ENOMEM;
2137	chip = iio_priv(indio_dev);
2138	/* this is only used for device removal purposes */
2139	dev_set_drvdata(dev, indio_dev);
2140
2141	chip->bus = *bus;
2142
2143	if (name[4] == '3')
2144		chip->id = ID_ADT7316 + (name[6] - '6');
2145	else if (name[4] == '5')
2146		chip->id = ID_ADT7516 + (name[6] - '6');
2147	else
2148		return -ENODEV;
2149
2150	if (chip->id == ID_ADT7316 || chip->id == ID_ADT7516)
2151		chip->dac_bits = 12;
2152	else if (chip->id == ID_ADT7317 || chip->id == ID_ADT7517)
2153		chip->dac_bits = 10;
2154	else
2155		chip->dac_bits = 8;
2156
2157	chip->ldac_pin = devm_gpiod_get_optional(dev, "adi,ldac",
2158						 GPIOD_OUT_LOW);
2159	if (IS_ERR(chip->ldac_pin)) {
2160		ret = PTR_ERR(chip->ldac_pin);
2161		dev_err(dev, "Failed to request ldac GPIO: %d\n", ret);
2162		return ret;
2163	}
2164
2165	if (!chip->ldac_pin) {
2166		chip->config3 |= ADT7316_DA_EN_VIA_DAC_LDAC;
2167		if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
2168			chip->config1 |= ADT7516_SEL_AIN3;
2169	}
2170	chip->int_mask = ADT7316_TEMP_INT_MASK | ADT7316_VDD_INT_MASK;
2171	if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
2172		chip->int_mask |= ADT7516_AIN_INT_MASK;
2173
2174	if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
2175		indio_dev->info = &adt7516_info;
2176	else
2177		indio_dev->info = &adt7316_info;
2178	indio_dev->name = name;
2179	indio_dev->modes = INDIO_DIRECT_MODE;
2180
2181	if (chip->bus.irq > 0) {
2182		ret = adt7316_setup_irq(indio_dev);
2183		if (ret)
2184			return ret;
2185	}
2186
2187	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG1, chip->config1);
2188	if (ret)
2189		return -EIO;
2190
2191	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, chip->config3);
2192	if (ret)
2193		return -EIO;
2194
2195	ret = devm_iio_device_register(dev, indio_dev);
2196	if (ret)
2197		return ret;
2198
2199	dev_info(dev, "%s temperature sensor, ADC and DAC registered.\n",
2200		 indio_dev->name);
2201
2202	return 0;
2203}
2204EXPORT_SYMBOL(adt7316_probe);
2205
2206MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>");
2207MODULE_DESCRIPTION("Analog Devices ADT7316/7/8 and ADT7516/7/9 digital temperature sensor, ADC and DAC driver");
2208MODULE_LICENSE("GPL v2");
2209