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