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