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