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