staging:iio: rework of attribute registration.
[deliverable/linux.git] / drivers / staging / iio / addac / adt7316.c
CommitLineData
35f6b6b8
SZ
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>
99c97852 20#include <linux/module.h>
35f6b6b8
SZ
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
177struct adt7316_chip_info {
35f6b6b8
SZ
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 \
8df32238 207 (ADT7316_TEMP_INT_MASK)
35f6b6b8
SZ
208
209/*
210 * struct adt7316_chip_info - chip specifc information
211 */
212
213struct adt7316_limit_regs {
214 u16 data_high;
215 u16 data_low;
216};
217
218static 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);
70be4291 223 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
224
225 return sprintf(buf, "%d\n", !!(chip->config1 & ADT7316_EN));
226}
227
228static 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
249static 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);
70be4291 255 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
269static IIO_DEVICE_ATTR(enabled, S_IRUGO | S_IWUSR,
270 adt7316_show_enabled,
271 adt7316_store_enabled,
272 0);
273
274static 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);
70be4291 279 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
287static 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);
70be4291 293 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
313static 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
318static 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);
70be4291 323 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
331static 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);
70be4291 337 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
354static IIO_DEVICE_ATTR(mode, S_IRUGO | S_IWUSR,
355 adt7316_show_mode,
356 adt7316_store_mode,
357 0);
358
359static 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
366static IIO_DEVICE_ATTR(all_modes, S_IRUGO, adt7316_show_all_modes, NULL, 0);
367
368static 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);
70be4291 373 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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");
95cd17c9 403 }
35f6b6b8
SZ
404}
405
406static 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);
70be4291 412 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
448static IIO_DEVICE_ATTR(ad_channel, S_IRUGO | S_IWUSR,
449 adt7316_show_ad_channel,
450 adt7316_store_ad_channel,
451 0);
452
453static 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);
70be4291 458 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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"
383f650f 465 "2 - External Temperature or AIN1\n"
35f6b6b8
SZ
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
472static IIO_DEVICE_ATTR(all_ad_channels, S_IRUGO,
473 adt7316_show_all_ad_channels, NULL, 0);
474
475static 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);
70be4291 480 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
481
482 return sprintf(buf, "%d\n",
483 !!(chip->config2 & ADT7316_DISABLE_AVERAGING));
484}
485
486static 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);
70be4291 492 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
509static IIO_DEVICE_ATTR(disable_averaging, S_IRUGO | S_IWUSR,
510 adt7316_show_disable_averaging,
511 adt7316_store_disable_averaging,
512 0);
513
514static 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);
70be4291 519 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
520
521 return sprintf(buf, "%d\n",
522 !!(chip->config2 & ADT7316_EN_SMBUS_TIMEOUT));
523}
524
525static 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);
70be4291 531 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
548static 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
554static 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);
70be4291 560 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
573static IIO_DEVICE_ATTR(reset, S_IWUSR,
574 NULL,
575 adt7316_store_reset,
576 0);
577
578static 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);
70be4291 583 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
584
585 return sprintf(buf, "%d\n", !!(chip->config1 & ADT7316_PD));
586}
587
588static 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);
70be4291 594 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
611static IIO_DEVICE_ATTR(powerdown, S_IRUGO | S_IWUSR,
612 adt7316_show_powerdown,
613 adt7316_store_powerdown,
614 0);
615
616static 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);
70be4291 621 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
622
623 return sprintf(buf, "%d\n", !!(chip->config3 & ADT7316_ADCLK_22_5));
624}
625
626static 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);
70be4291 632 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
649static 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
654static 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);
70be4291 659 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
671static 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);
70be4291 677 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
701static 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
706static 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);
70be4291 711 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
720static 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);
70be4291 726 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
747static 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
753static 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);
70be4291 758 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
759
760 return sprintf(buf, "%d\n",
761 !!(chip->config3 & ADT7316_EN_IN_TEMP_PROP_DACA));
762}
763
764static 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);
70be4291 770 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
787static 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
792static 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);
70be4291 797 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
798
799 return sprintf(buf, "%d\n",
800 !!(chip->config3 & ADT7316_EN_EX_TEMP_PROP_DACB));
801}
802
803static 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);
70be4291 809 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
826static 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
831static 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);
70be4291 836 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
837
838 return sprintf(buf, "0x%x\n",
839 chip->dac_config & ADT7316_DA_2VREF_CH_MASK);
840}
841
842static 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);
70be4291 848 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
869static 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
874static 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);
70be4291 879 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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");
95cd17c9 893 }
35f6b6b8
SZ
894 }
895}
896
897static 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);
70be4291 903 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
927static 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
932static 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);
70be4291 937 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
948static IIO_DEVICE_ATTR(all_DAC_update_modes, S_IRUGO,
949 adt7316_show_all_DAC_update_modes, NULL, 0);
950
951
952static 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);
70be4291 958 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
987static IIO_DEVICE_ATTR(update_DAC, S_IRUGO | S_IWUSR,
988 NULL,
989 adt7316_store_update_DAC,
990 0);
991
992static 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);
70be4291 997 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
1006static 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);
70be4291 1012 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
1032static 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
1037static 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);
70be4291 1042 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
1051static 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);
70be4291 1057 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
1077static 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
1082static 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);
70be4291 1087 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
1098static 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);
70be4291 1104 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
1138static 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
1143static 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;
95cd17c9 1205 }
35f6b6b8
SZ
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
1218static 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);
70be4291 1223 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
1224
1225 return adt7316_show_ad(chip, ADT7316_AD_SINGLE_CH_VDD, buf);
1226}
1227static IIO_DEVICE_ATTR(VDD, S_IRUGO, adt7316_show_VDD, NULL, 0);
1228
1229static 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);
70be4291 1234 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
1235
1236 return adt7316_show_ad(chip, ADT7316_AD_SINGLE_CH_IN, buf);
1237}
1238
1239static IIO_DEVICE_ATTR(in_temp, S_IRUGO, adt7316_show_in_temp, NULL, 0);
1240
1241static 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);
70be4291 1246 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
1247
1248 return adt7316_show_ad(chip, ADT7316_AD_SINGLE_CH_EX, buf);
1249}
1250
1251static IIO_DEVICE_ATTR(ex_temp_AIN1, S_IRUGO, adt7316_show_ex_temp_AIN1, NULL, 0);
1252static IIO_DEVICE_ATTR(ex_temp, S_IRUGO, adt7316_show_ex_temp_AIN1, NULL, 0);
1253
1254static 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);
70be4291 1259 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
1260
1261 return adt7316_show_ad(chip, ADT7516_AD_SINGLE_CH_AIN2, buf);
1262}
1263static IIO_DEVICE_ATTR(AIN2, S_IRUGO, adt7316_show_AIN2, NULL, 0);
1264
1265static 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);
70be4291 1270 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
1271
1272 return adt7316_show_ad(chip, ADT7516_AD_SINGLE_CH_AIN3, buf);
1273}
1274static IIO_DEVICE_ATTR(AIN3, S_IRUGO, adt7316_show_AIN3, NULL, 0);
1275
1276static 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);
70be4291 1281 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
1282
1283 return adt7316_show_ad(chip, ADT7516_AD_SINGLE_CH_AIN4, buf);
1284}
1285static IIO_DEVICE_ATTR(AIN4, S_IRUGO, adt7316_show_AIN4, NULL, 0);
1286
1287static 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
1305static 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
1328static 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);
70be4291 1333 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
1334
1335 return adt7316_show_temp_offset(chip, ADT7316_IN_TEMP_OFFSET, buf);
1336}
1337
1338static 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);
70be4291 1344 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
1345
1346 return adt7316_store_temp_offset(chip, ADT7316_IN_TEMP_OFFSET, buf, len);
1347}
1348
1349static IIO_DEVICE_ATTR(in_temp_offset, S_IRUGO | S_IWUSR,
1350 adt7316_show_in_temp_offset,
1351 adt7316_store_in_temp_offset, 0);
1352
1353static 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);
70be4291 1358 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
1359
1360 return adt7316_show_temp_offset(chip, ADT7316_EX_TEMP_OFFSET, buf);
1361}
1362
1363static 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);
70be4291 1369 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
1370
1371 return adt7316_store_temp_offset(chip, ADT7316_EX_TEMP_OFFSET, buf, len);
1372}
1373
1374static IIO_DEVICE_ATTR(ex_temp_offset, S_IRUGO | S_IWUSR,
1375 adt7316_show_ex_temp_offset,
1376 adt7316_store_ex_temp_offset, 0);
1377
1378static 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);
70be4291 1383 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
1384
1385 return adt7316_show_temp_offset(chip,
1386 ADT7316_IN_ANALOG_TEMP_OFFSET, buf);
1387}
1388
1389static 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);
70be4291 1395 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
1396
1397 return adt7316_store_temp_offset(chip,
1398 ADT7316_IN_ANALOG_TEMP_OFFSET, buf, len);
1399}
1400
1401static 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
1405static 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);
70be4291 1410 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
1411
1412 return adt7316_show_temp_offset(chip,
1413 ADT7316_EX_ANALOG_TEMP_OFFSET, buf);
1414}
1415
1416static 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);
70be4291 1422 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
1423
1424 return adt7316_store_temp_offset(chip,
1425 ADT7316_EX_ANALOG_TEMP_OFFSET, buf, len);
1426}
1427
1428static 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
1432static 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
1465static 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
1502static 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);
70be4291 1507 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
1508
1509 return adt7316_show_DAC(chip, 0, buf);
1510}
1511
1512static 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);
70be4291 1518 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
1519
1520 return adt7316_store_DAC(chip, 0, buf, len);
1521}
1522
1523static IIO_DEVICE_ATTR(DAC_A, S_IRUGO | S_IWUSR, adt7316_show_DAC_A,
1524 adt7316_store_DAC_A, 0);
1525
1526static 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);
70be4291 1531 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
1532
1533 return adt7316_show_DAC(chip, 1, buf);
1534}
1535
1536static 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);
70be4291 1542 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
1543
1544 return adt7316_store_DAC(chip, 1, buf, len);
1545}
1546
1547static IIO_DEVICE_ATTR(DAC_B, S_IRUGO | S_IWUSR, adt7316_show_DAC_B,
1548 adt7316_store_DAC_B, 0);
1549
1550static 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);
70be4291 1555 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
1556
1557 return adt7316_show_DAC(chip, 2, buf);
1558}
1559
1560static 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);
70be4291 1566 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
1567
1568 return adt7316_store_DAC(chip, 2, buf, len);
1569}
1570
1571static IIO_DEVICE_ATTR(DAC_C, S_IRUGO | S_IWUSR, adt7316_show_DAC_C,
1572 adt7316_store_DAC_C, 0);
1573
1574static 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);
70be4291 1579 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
1580
1581 return adt7316_show_DAC(chip, 3, buf);
1582}
1583
1584static 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);
70be4291 1590 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
1591
1592 return adt7316_store_DAC(chip, 3, buf, len);
1593}
1594
1595static IIO_DEVICE_ATTR(DAC_D, S_IRUGO | S_IWUSR, adt7316_show_DAC_D,
1596 adt7316_store_DAC_D, 0);
1597
1598static 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);
70be4291 1603 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
1614static IIO_DEVICE_ATTR(device_id, S_IRUGO, adt7316_show_device_id, NULL, 0);
1615
1616static 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);
70be4291 1621 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
1632static IIO_DEVICE_ATTR(manufactorer_id, S_IRUGO,
1633 adt7316_show_manufactorer_id, NULL, 0);
1634
1635static 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);
70be4291 1640 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
1651static IIO_DEVICE_ATTR(device_rev, S_IRUGO, adt7316_show_device_rev, NULL, 0);
1652
1653static 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);
70be4291 1658 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
1672static IIO_DEVICE_ATTR(bus_type, S_IRUGO, adt7316_show_bus_type, NULL, 0);
1673
35f6b6b8
SZ
1674static 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,
35f6b6b8
SZ
1710 NULL,
1711};
1712
1713static const struct attribute_group adt7316_attribute_group = {
1714 .attrs = adt7316_attributes,
1715};
1716
1717static 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,
35f6b6b8
SZ
1758 NULL,
1759};
1760
1761static const struct attribute_group adt7516_attribute_group = {
1762 .attrs = adt7516_attributes,
1763};
1764
90f79e76 1765static irqreturn_t adt7316_event_handler(int irq, void *private)
35f6b6b8 1766{
90f79e76 1767 struct iio_dev *indio_dev = private;
70be4291 1768 struct adt7316_chip_info *chip = iio_priv(indio_dev);
35f6b6b8 1769 u8 stat1, stat2;
383f650f
JC
1770 int ret;
1771 s64 time;
35f6b6b8
SZ
1772
1773 ret = chip->bus.read(chip->bus.client, ADT7316_INT_STAT1, &stat1);
1774 if (!ret) {
383f650f
JC
1775 if ((chip->id & ID_FAMILY_MASK) != ID_ADT75XX)
1776 stat1 &= 0x1F;
35f6b6b8 1777
383f650f
JC
1778 time = iio_get_time_ns();
1779 if (stat1 & (1 << 0))
5aa96188 1780 iio_push_event(indio_dev,
383f650f
JC
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))
5aa96188 1786 iio_push_event(indio_dev,
383f650f
JC
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))
5aa96188 1792 iio_push_event(indio_dev,
383f650f
JC
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))
5aa96188 1798 iio_push_event(indio_dev,
383f650f
JC
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))
5aa96188 1804 iio_push_event(indio_dev,
383f650f
JC
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))
5aa96188 1810 iio_push_event(indio_dev,
383f650f
JC
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))
5aa96188 1816 iio_push_event(indio_dev,
383f650f
JC
1817 IIO_UNMOD_EVENT_CODE(IIO_IN, 3,
1818 IIO_EV_TYPE_THRESH,
1819 IIO_EV_DIR_EITHER),
1820 time);
35f6b6b8 1821 }
35f6b6b8
SZ
1822 ret = chip->bus.read(chip->bus.client, ADT7316_INT_STAT2, &stat2);
1823 if (!ret) {
1824 if (stat2 & ADT7316_INT_MASK2_VDD)
5aa96188 1825 iio_push_event(indio_dev,
383f650f
JC
1826 IIO_UNMOD_EVENT_CODE(IIO_IN,
1827 0,
1828 IIO_EV_TYPE_THRESH,
1829 IIO_EV_DIR_RISING),
90f79e76 1830 iio_get_time_ns());
35f6b6b8
SZ
1831 }
1832
90f79e76 1833 return IRQ_HANDLED;
35f6b6b8
SZ
1834}
1835
35f6b6b8
SZ
1836/*
1837 * Show mask of enabled interrupts in Hex.
1838 */
1839static 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);
70be4291 1844 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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 */
1852static 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);
70be4291 1858 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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}
1892static inline ssize_t adt7316_show_ad_bound(struct device *dev,
1893 struct device_attribute *attr,
35f6b6b8
SZ
1894 char *buf)
1895{
90f79e76 1896 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
35f6b6b8 1897 struct iio_dev *dev_info = dev_get_drvdata(dev);
70be4291 1898 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
1899 u8 val;
1900 int data;
1901 int ret;
1902
1903 if ((chip->id & ID_FAMILY_MASK) == ID_ADT73XX &&
90f79e76 1904 this_attr->address > ADT7316_EX_TEMP_LOW)
35f6b6b8
SZ
1905 return -EPERM;
1906
90f79e76 1907 ret = chip->bus.read(chip->bus.client, this_attr->address, &val);
35f6b6b8
SZ
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
1922static inline ssize_t adt7316_set_ad_bound(struct device *dev,
1923 struct device_attribute *attr,
35f6b6b8
SZ
1924 const char *buf,
1925 size_t len)
1926{
90f79e76 1927 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
35f6b6b8 1928 struct iio_dev *dev_info = dev_get_drvdata(dev);
70be4291 1929 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
1930 long data;
1931 u8 val;
1932 int ret;
1933
1934 if ((chip->id & ID_FAMILY_MASK) == ID_ADT73XX &&
90f79e76 1935 this_attr->address > ADT7316_EX_TEMP_LOW)
35f6b6b8
SZ
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
90f79e76 1956 ret = chip->bus.write(chip->bus.client, this_attr->address, val);
35f6b6b8
SZ
1957 if (ret)
1958 return -EIO;
1959
1960 return len;
1961}
1962
35f6b6b8
SZ
1963static 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);
70be4291 1968 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
1969
1970 return sprintf(buf, "%d\n", !!(chip->config1 & ADT7316_INT_EN));
1971}
1972
1973static 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);
70be4291 1979 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
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
90f79e76
JC
1996static IIO_DEVICE_ATTR(int_mask,
1997 S_IRUGO | S_IWUSR,
1998 adt7316_show_int_mask, adt7316_set_int_mask,
1999 0);
2000static 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);
2004static 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);
2008static 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);
2012static 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 */
2018static 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);
2022static 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);
2026static IIO_DEVICE_ATTR(ain2_high_value,
2027 S_IRUGO | S_IWUSR,
2028 adt7316_show_ad_bound, adt7316_set_ad_bound,
2029 ADT7516_AIN2_HIGH);
2030static IIO_DEVICE_ATTR(ain2_low_value,
2031 S_IRUGO | S_IWUSR,
2032 adt7316_show_ad_bound, adt7316_set_ad_bound,
2033 ADT7516_AIN2_LOW);
2034static IIO_DEVICE_ATTR(ain3_high_value,
2035 S_IRUGO | S_IWUSR,
2036 adt7316_show_ad_bound, adt7316_set_ad_bound,
2037 ADT7516_AIN3_HIGH);
2038static IIO_DEVICE_ATTR(ain3_low_value,
2039 S_IRUGO | S_IWUSR,
2040 adt7316_show_ad_bound, adt7316_set_ad_bound,
2041 ADT7516_AIN3_LOW);
2042static IIO_DEVICE_ATTR(ain4_high_value,
2043 S_IRUGO | S_IWUSR,
2044 adt7316_show_ad_bound, adt7316_set_ad_bound,
2045 ADT7516_AIN4_HIGH);
2046static IIO_DEVICE_ATTR(ain4_low_value,
2047 S_IRUGO | S_IWUSR,
2048 adt7316_show_ad_bound, adt7316_set_ad_bound,
2049 ADT7516_AIN4_LOW);
2050static IIO_DEVICE_ATTR(int_enabled,
2051 S_IRUGO | S_IWUSR,
2052 adt7316_show_int_enabled,
2053 adt7316_set_int_enabled, 0);
35f6b6b8
SZ
2054
2055static struct attribute *adt7316_event_attributes[] = {
90f79e76
JC
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,
35f6b6b8
SZ
2062 NULL,
2063};
2064
2065static struct attribute_group adt7316_event_attribute_group = {
2066 .attrs = adt7316_event_attributes,
8e7d9672 2067 .name = "events",
35f6b6b8
SZ
2068};
2069
2070static struct attribute *adt7516_event_attributes[] = {
90f79e76
JC
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,
35f6b6b8
SZ
2083 NULL,
2084};
2085
2086static struct attribute_group adt7516_event_attribute_group = {
2087 .attrs = adt7516_event_attributes,
8e7d9672 2088 .name = "events",
35f6b6b8
SZ
2089};
2090
2091#ifdef CONFIG_PM
2092int adt7316_disable(struct device *dev)
2093{
2094 struct iio_dev *dev_info = dev_get_drvdata(dev);
70be4291 2095 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
2096
2097 return _adt7316_store_enabled(chip, 0);
2098}
2099EXPORT_SYMBOL(adt7316_disable);
2100
2101int adt7316_enable(struct device *dev)
2102{
2103 struct iio_dev *dev_info = dev_get_drvdata(dev);
70be4291 2104 struct adt7316_chip_info *chip = iio_priv(dev_info);
35f6b6b8
SZ
2105
2106 return _adt7316_store_enabled(chip, 1);
2107}
2108EXPORT_SYMBOL(adt7316_enable);
2109#endif
2110
6fe8135f
JC
2111static const struct iio_info adt7316_info = {
2112 .attrs = &adt7316_attribute_group,
6fe8135f
JC
2113 .event_attrs = &adt7316_event_attribute_group,
2114 .driver_module = THIS_MODULE,
2115};
2116
2117static const struct iio_info adt7516_info = {
2118 .attrs = &adt7516_attribute_group,
6fe8135f
JC
2119 .event_attrs = &adt7516_event_attribute_group,
2120 .driver_module = THIS_MODULE,
2121};
2122
35f6b6b8
SZ
2123/*
2124 * device probe and remove
2125 */
2126int __devinit adt7316_probe(struct device *dev, struct adt7316_bus *bus,
2127 const char *name)
2128{
2129 struct adt7316_chip_info *chip;
70be4291 2130 struct iio_dev *indio_dev;
35f6b6b8
SZ
2131 unsigned short *adt7316_platform_data = dev->platform_data;
2132 int ret = 0;
2133
70be4291
JC
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);
35f6b6b8 2140 /* this is only used for device removal purposes */
70be4291 2141 dev_set_drvdata(dev, indio_dev);
35f6b6b8
SZ
2142
2143 chip->bus = *bus;
35f6b6b8
SZ
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
70be4291 2162 indio_dev->dev.parent = dev;
6fe8135f 2163 if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
70be4291 2164 indio_dev->info = &adt7516_info;
6fe8135f 2165 else
70be4291
JC
2166 indio_dev->info = &adt7316_info;
2167 indio_dev->name = name;
2168 indio_dev->modes = INDIO_DIRECT_MODE;
35f6b6b8 2169
35f6b6b8
SZ
2170 if (chip->bus.irq > 0) {
2171 if (adt7316_platform_data[0])
2172 chip->bus.irq_flags = adt7316_platform_data[0];
2173
90f79e76
JC
2174 ret = request_threaded_irq(chip->bus.irq,
2175 NULL,
2176 &adt7316_event_handler,
2177 chip->bus.irq_flags | IRQF_ONESHOT,
70be4291
JC
2178 indio_dev->name,
2179 indio_dev);
35f6b6b8 2180 if (ret)
26d25ae3 2181 goto error_free_dev;
35f6b6b8 2182
35f6b6b8
SZ
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
26d25ae3
JC
2199 ret = iio_device_register(indio_dev);
2200 if (ret)
2201 goto error_unreg_irq;
2202
35f6b6b8 2203 dev_info(dev, "%s temperature sensor, ADC and DAC registered.\n",
70be4291 2204 indio_dev->name);
35f6b6b8
SZ
2205
2206 return 0;
2207
2208error_unreg_irq:
70be4291 2209 free_irq(chip->bus.irq, indio_dev);
35f6b6b8 2210error_free_dev:
70be4291
JC
2211 iio_free_device(indio_dev);
2212error_ret:
35f6b6b8
SZ
2213 return ret;
2214}
2215EXPORT_SYMBOL(adt7316_probe);
2216
2217int __devexit adt7316_remove(struct device *dev)
2218{
70be4291
JC
2219 struct iio_dev *indio_dev = dev_get_drvdata(dev);
2220 struct adt7316_chip_info *chip = iio_priv(indio_dev);
35f6b6b8 2221
35f6b6b8 2222 if (chip->bus.irq)
70be4291
JC
2223 free_irq(chip->bus.irq, indio_dev);
2224 iio_device_unregister(indio_dev);
35f6b6b8
SZ
2225
2226 return 0;
2227}
2228EXPORT_SYMBOL(adt7316_remove);
2229
2230MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>");
2231MODULE_DESCRIPTION("Analog Devices ADT7316/7/8 and ADT7516/7/9 digital"
2232 " temperature sensor, ADC and DAC driver");
2233MODULE_LICENSE("GPL v2");
This page took 0.25185 seconds and 5 git commands to generate.