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