staging:iio: use the new central name attribute creation code
[GitHub/mt8127/android_kernel_alcatel_ttab.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>
20
21#include "../iio.h"
22#include "../sysfs.h"
23#include "adt7316.h"
24
25/*
26 * ADT7316 registers definition
27 */
28#define ADT7316_INT_STAT1 0x0
29#define ADT7316_INT_STAT2 0x1
30#define ADT7316_LSB_IN_TEMP_VDD 0x3
31#define ADT7316_LSB_IN_TEMP_MASK 0x3
32#define ADT7316_LSB_VDD_MASK 0xC
33#define ADT7316_LSB_VDD_OFFSET 2
34#define ADT7316_LSB_EX_TEMP_AIN 0x4
35#define ADT7316_LSB_EX_TEMP_MASK 0x3
36#define ADT7516_LSB_AIN_SHIFT 2
37#define ADT7316_AD_MSB_DATA_BASE 0x6
38#define ADT7316_AD_MSB_DATA_REGS 3
39#define ADT7516_AD_MSB_DATA_REGS 6
40#define ADT7316_MSB_VDD 0x6
41#define ADT7316_MSB_IN_TEMP 0x7
42#define ADT7316_MSB_EX_TEMP 0x8
43#define ADT7516_MSB_AIN1 0x8
44#define ADT7516_MSB_AIN2 0x9
45#define ADT7516_MSB_AIN3 0xA
46#define ADT7516_MSB_AIN4 0xB
47#define ADT7316_DA_DATA_BASE 0x10
48#define ADT7316_DA_MSB_DATA_REGS 4
49#define ADT7316_LSB_DAC_A 0x10
50#define ADT7316_MSB_DAC_A 0x11
51#define ADT7316_LSB_DAC_B 0x12
52#define ADT7316_MSB_DAC_B 0x13
53#define ADT7316_LSB_DAC_C 0x14
54#define ADT7316_MSB_DAC_C 0x15
55#define ADT7316_LSB_DAC_D 0x16
56#define ADT7316_MSB_DAC_D 0x17
57#define ADT7316_CONFIG1 0x18
58#define ADT7316_CONFIG2 0x19
59#define ADT7316_CONFIG3 0x1A
60#define ADT7316_LDAC_CONFIG 0x1B
61#define ADT7316_DAC_CONFIG 0x1C
62#define ADT7316_INT_MASK1 0x1D
63#define ADT7316_INT_MASK2 0x1E
64#define ADT7316_IN_TEMP_OFFSET 0x1F
65#define ADT7316_EX_TEMP_OFFSET 0x20
66#define ADT7316_IN_ANALOG_TEMP_OFFSET 0x21
67#define ADT7316_EX_ANALOG_TEMP_OFFSET 0x22
68#define ADT7316_VDD_HIGH 0x23
69#define ADT7316_VDD_LOW 0x24
70#define ADT7316_IN_TEMP_HIGH 0x25
71#define ADT7316_IN_TEMP_LOW 0x26
72#define ADT7316_EX_TEMP_HIGH 0x27
73#define ADT7316_EX_TEMP_LOW 0x28
74#define ADT7516_AIN2_HIGH 0x2B
75#define ADT7516_AIN2_LOW 0x2C
76#define ADT7516_AIN3_HIGH 0x2D
77#define ADT7516_AIN3_LOW 0x2E
78#define ADT7516_AIN4_HIGH 0x2F
79#define ADT7516_AIN4_LOW 0x30
80#define ADT7316_DEVICE_ID 0x4D
81#define ADT7316_MANUFACTURE_ID 0x4E
82#define ADT7316_DEVICE_REV 0x4F
83#define ADT7316_SPI_LOCK_STAT 0x7F
84
85/*
86 * ADT7316 config1
87 */
88#define ADT7316_EN 0x1
89#define ADT7516_SEL_EX_TEMP 0x4
90#define ADT7516_SEL_AIN1_2_EX_TEMP_MASK 0x6
91#define ADT7516_SEL_AIN3 0x8
92#define ADT7316_INT_EN 0x20
93#define ADT7316_INT_POLARITY 0x40
94#define ADT7316_PD 0x80
95
96/*
97 * ADT7316 config2
98 */
99#define ADT7316_AD_SINGLE_CH_MASK 0x3
100#define ADT7516_AD_SINGLE_CH_MASK 0x7
101#define ADT7316_AD_SINGLE_CH_VDD 0
102#define ADT7316_AD_SINGLE_CH_IN 1
103#define ADT7316_AD_SINGLE_CH_EX 2
104#define ADT7516_AD_SINGLE_CH_AIN1 2
105#define ADT7516_AD_SINGLE_CH_AIN2 3
106#define ADT7516_AD_SINGLE_CH_AIN3 4
107#define ADT7516_AD_SINGLE_CH_AIN4 5
108#define ADT7316_AD_SINGLE_CH_MODE 0x10
109#define ADT7316_DISABLE_AVERAGING 0x20
110#define ADT7316_EN_SMBUS_TIMEOUT 0x40
111#define ADT7316_RESET 0x80
112
113/*
114 * ADT7316 config3
115 */
116#define ADT7316_ADCLK_22_5 0x1
117#define ADT7316_DA_HIGH_RESOLUTION 0x2
118#define ADT7316_DA_EN_VIA_DAC_LDCA 0x4
119#define ADT7516_AIN_IN_VREF 0x10
120#define ADT7316_EN_IN_TEMP_PROP_DACA 0x20
121#define ADT7316_EN_EX_TEMP_PROP_DACB 0x40
122
123/*
124 * ADT7316 DAC config
125 */
126#define ADT7316_DA_2VREF_CH_MASK 0xF
127#define ADT7316_DA_EN_MODE_MASK 0x30
128#define ADT7316_DA_EN_MODE_SINGLE 0x00
129#define ADT7316_DA_EN_MODE_AB_CD 0x10
130#define ADT7316_DA_EN_MODE_ABCD 0x20
131#define ADT7316_DA_EN_MODE_LDAC 0x30
132#define ADT7316_VREF_BYPASS_DAC_AB 0x40
133#define ADT7316_VREF_BYPASS_DAC_CD 0x80
134
135/*
136 * ADT7316 LDAC config
137 */
138#define ADT7316_LDAC_EN_DA_MASK 0xF
139#define ADT7316_DAC_IN_VREF 0x10
140#define ADT7516_DAC_AB_IN_VREF 0x10
141#define ADT7516_DAC_CD_IN_VREF 0x20
142#define ADT7516_DAC_IN_VREF_OFFSET 4
143#define ADT7516_DAC_IN_VREF_MASK 0x30
144
145/*
146 * ADT7316 INT_MASK2
147 */
148#define ADT7316_INT_MASK2_VDD 0x10
149
150/*
151 * ADT7316 value masks
152 */
153#define ADT7316_VALUE_MASK 0xfff
154#define ADT7316_T_VALUE_SIGN 0x400
155#define ADT7316_T_VALUE_FLOAT_OFFSET 2
156#define ADT7316_T_VALUE_FLOAT_MASK 0x2
157
158/*
159 * Chip ID
160 */
161#define ID_ADT7316 0x1
162#define ID_ADT7317 0x2
163#define ID_ADT7318 0x3
164#define ID_ADT7516 0x11
165#define ID_ADT7517 0x12
166#define ID_ADT7519 0x14
167
168#define ID_FAMILY_MASK 0xF0
169#define ID_ADT73XX 0x0
170#define ID_ADT75XX 0x10
171
172/*
173 * struct adt7316_chip_info - chip specifc information
174 */
175
176struct adt7316_chip_info {
35f6b6b8 177 struct iio_dev *indio_dev;
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 \
207 (ADT7316_TEMP_INT_MASK | ADT7316_TEMP_INT_MASK)
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);
223 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
255 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
279 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
293 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
323 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
337 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
373 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
412 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
458 struct adt7316_chip_info *chip = dev_info->dev_data;
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 AIN2\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
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);
480 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
492 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
519 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
531 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
560 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
583 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
594 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
621 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
632 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
659 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
677 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
711 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
726 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
758 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
770 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
797 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
809 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
836 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
848 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
879 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
903 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
937 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
958 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
997 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1012 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1042 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1057 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1087 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1104 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1223 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1234 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1246 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1259 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1270 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1281 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1333 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1344 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1358 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1369 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1383 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1395 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1410 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1422 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1507 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1518 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1531 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1542 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1555 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1566 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1579 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1590 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1603 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1621 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1640 struct adt7316_chip_info *chip = dev_info->dev_data;
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);
1658 struct adt7316_chip_info *chip = dev_info->dev_data;
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
1765
1766/*
1767 * temperature bound events
1768 */
1769
1770#define IIO_EVENT_CODE_ADT7316_IN_TEMP_HIGH IIO_BUFFER_EVENT_CODE(0)
1771#define IIO_EVENT_CODE_ADT7316_IN_TEMP_LOW IIO_BUFFER_EVENT_CODE(1)
1772#define IIO_EVENT_CODE_ADT7316_EX_TEMP_HIGH IIO_BUFFER_EVENT_CODE(2)
1773#define IIO_EVENT_CODE_ADT7316_EX_TEMP_LOW IIO_BUFFER_EVENT_CODE(3)
1774#define IIO_EVENT_CODE_ADT7316_EX_TEMP_FAULT IIO_BUFFER_EVENT_CODE(4)
1775#define IIO_EVENT_CODE_ADT7516_AIN1 IIO_BUFFER_EVENT_CODE(5)
1776#define IIO_EVENT_CODE_ADT7516_AIN2 IIO_BUFFER_EVENT_CODE(6)
1777#define IIO_EVENT_CODE_ADT7516_AIN3 IIO_BUFFER_EVENT_CODE(7)
1778#define IIO_EVENT_CODE_ADT7516_AIN4 IIO_BUFFER_EVENT_CODE(8)
1779#define IIO_EVENT_CODE_ADT7316_VDD IIO_BUFFER_EVENT_CODE(9)
1780
90f79e76 1781static irqreturn_t adt7316_event_handler(int irq, void *private)
35f6b6b8 1782{
90f79e76
JC
1783 struct iio_dev *indio_dev = private;
1784 struct adt7316_chip_info *chip = iio_dev_get_devdata(indio_dev);
35f6b6b8
SZ
1785 u8 stat1, stat2;
1786 int i, ret, count;
1787
1788 ret = chip->bus.read(chip->bus.client, ADT7316_INT_STAT1, &stat1);
1789 if (!ret) {
1790 if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
1791 count = 8;
1792 else
1793 count = 5;
1794
1795 for (i = 0; i < count; i++) {
1796 if (stat1 & (1 << i))
1797 iio_push_event(chip->indio_dev, 0,
1798 IIO_EVENT_CODE_ADT7316_IN_TEMP_HIGH + i,
90f79e76 1799 iio_get_time_ns());
35f6b6b8
SZ
1800 }
1801 }
1802
1803 ret = chip->bus.read(chip->bus.client, ADT7316_INT_STAT2, &stat2);
1804 if (!ret) {
1805 if (stat2 & ADT7316_INT_MASK2_VDD)
1806 iio_push_event(chip->indio_dev, 0,
1807 IIO_EVENT_CODE_ADT7316_VDD,
90f79e76 1808 iio_get_time_ns());
35f6b6b8
SZ
1809 }
1810
90f79e76 1811 return IRQ_HANDLED;
35f6b6b8
SZ
1812}
1813
35f6b6b8
SZ
1814/*
1815 * Show mask of enabled interrupts in Hex.
1816 */
1817static ssize_t adt7316_show_int_mask(struct device *dev,
1818 struct device_attribute *attr,
1819 char *buf)
1820{
1821 struct iio_dev *dev_info = dev_get_drvdata(dev);
1822 struct adt7316_chip_info *chip = dev_info->dev_data;
1823
1824 return sprintf(buf, "0x%x\n", chip->int_mask);
1825}
1826
1827/*
1828 * Set 1 to the mask in Hex to enabled interrupts.
1829 */
1830static ssize_t adt7316_set_int_mask(struct device *dev,
1831 struct device_attribute *attr,
1832 const char *buf,
1833 size_t len)
1834{
1835 struct iio_dev *dev_info = dev_get_drvdata(dev);
1836 struct adt7316_chip_info *chip = dev_info->dev_data;
1837 unsigned long data;
1838 int ret;
1839 u8 mask;
1840
1841 ret = strict_strtoul(buf, 16, &data);
1842 if (ret || data >= ADT7316_VDD_INT_MASK + 1)
1843 return -EINVAL;
1844
1845 if (data & ADT7316_VDD_INT_MASK)
1846 mask = 0; /* enable vdd int */
1847 else
1848 mask = ADT7316_INT_MASK2_VDD; /* disable vdd int */
1849
1850 ret = chip->bus.write(chip->bus.client, ADT7316_INT_MASK2, mask);
1851 if (!ret) {
1852 chip->int_mask &= ~ADT7316_VDD_INT_MASK;
1853 chip->int_mask |= data & ADT7316_VDD_INT_MASK;
1854 }
1855
1856 if (data & ADT7316_TEMP_AIN_INT_MASK) {
1857 if ((chip->id & ID_FAMILY_MASK) == ID_ADT73XX)
1858 /* mask in reg is opposite, set 1 to disable */
1859 mask = (~data) & ADT7316_TEMP_INT_MASK;
1860 else
1861 /* mask in reg is opposite, set 1 to disable */
1862 mask = (~data) & ADT7316_TEMP_AIN_INT_MASK;
1863 }
1864 ret = chip->bus.write(chip->bus.client, ADT7316_INT_MASK1, mask);
1865
1866 chip->int_mask = mask;
1867
1868 return len;
1869}
1870static inline ssize_t adt7316_show_ad_bound(struct device *dev,
1871 struct device_attribute *attr,
35f6b6b8
SZ
1872 char *buf)
1873{
90f79e76 1874 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
35f6b6b8
SZ
1875 struct iio_dev *dev_info = dev_get_drvdata(dev);
1876 struct adt7316_chip_info *chip = dev_info->dev_data;
1877 u8 val;
1878 int data;
1879 int ret;
1880
1881 if ((chip->id & ID_FAMILY_MASK) == ID_ADT73XX &&
90f79e76 1882 this_attr->address > ADT7316_EX_TEMP_LOW)
35f6b6b8
SZ
1883 return -EPERM;
1884
90f79e76 1885 ret = chip->bus.read(chip->bus.client, this_attr->address, &val);
35f6b6b8
SZ
1886 if (ret)
1887 return -EIO;
1888
1889 data = (int)val;
1890
1891 if (!((chip->id & ID_FAMILY_MASK) == ID_ADT75XX &&
1892 (chip->config1 & ADT7516_SEL_AIN1_2_EX_TEMP_MASK) == 0)) {
1893 if (data & 0x80)
1894 data -= 256;
1895 }
1896
1897 return sprintf(buf, "%d\n", data);
1898}
1899
1900static inline ssize_t adt7316_set_ad_bound(struct device *dev,
1901 struct device_attribute *attr,
35f6b6b8
SZ
1902 const char *buf,
1903 size_t len)
1904{
90f79e76 1905 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
35f6b6b8
SZ
1906 struct iio_dev *dev_info = dev_get_drvdata(dev);
1907 struct adt7316_chip_info *chip = dev_info->dev_data;
1908 long data;
1909 u8 val;
1910 int ret;
1911
1912 if ((chip->id & ID_FAMILY_MASK) == ID_ADT73XX &&
90f79e76 1913 this_attr->address > ADT7316_EX_TEMP_LOW)
35f6b6b8
SZ
1914 return -EPERM;
1915
1916 ret = strict_strtol(buf, 10, &data);
1917 if (ret)
1918 return -EINVAL;
1919
1920 if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX &&
1921 (chip->config1 & ADT7516_SEL_AIN1_2_EX_TEMP_MASK) == 0) {
1922 if (data > 255 || data < 0)
1923 return -EINVAL;
1924 } else {
1925 if (data > 127 || data < -128)
1926 return -EINVAL;
1927
1928 if (data < 0)
1929 data += 256;
1930 }
1931
1932 val = (u8)data;
1933
90f79e76 1934 ret = chip->bus.write(chip->bus.client, this_attr->address, val);
35f6b6b8
SZ
1935 if (ret)
1936 return -EIO;
1937
1938 return len;
1939}
1940
35f6b6b8
SZ
1941static ssize_t adt7316_show_int_enabled(struct device *dev,
1942 struct device_attribute *attr,
1943 char *buf)
1944{
1945 struct iio_dev *dev_info = dev_get_drvdata(dev);
1946 struct adt7316_chip_info *chip = dev_info->dev_data;
1947
1948 return sprintf(buf, "%d\n", !!(chip->config1 & ADT7316_INT_EN));
1949}
1950
1951static ssize_t adt7316_set_int_enabled(struct device *dev,
1952 struct device_attribute *attr,
1953 const char *buf,
1954 size_t len)
1955{
1956 struct iio_dev *dev_info = dev_get_drvdata(dev);
1957 struct adt7316_chip_info *chip = dev_info->dev_data;
1958 u8 config1;
1959 int ret;
1960
1961 config1 = chip->config1 & (~ADT7316_INT_EN);
1962 if (!memcmp(buf, "1", 1))
1963 config1 |= ADT7316_INT_EN;
1964
1965 ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG1, config1);
1966 if (ret)
1967 return -EIO;
1968
1969 chip->config1 = config1;
1970
1971 return len;
1972}
1973
90f79e76
JC
1974static IIO_DEVICE_ATTR(int_mask,
1975 S_IRUGO | S_IWUSR,
1976 adt7316_show_int_mask, adt7316_set_int_mask,
1977 0);
1978static IIO_DEVICE_ATTR(in_temp_high_value,
1979 S_IRUGO | S_IWUSR,
1980 adt7316_show_ad_bound, adt7316_set_ad_bound,
1981 ADT7316_IN_TEMP_HIGH);
1982static IIO_DEVICE_ATTR(in_temp_low_value,
1983 S_IRUGO | S_IWUSR,
1984 adt7316_show_ad_bound, adt7316_set_ad_bound,
1985 ADT7316_IN_TEMP_LOW);
1986static IIO_DEVICE_ATTR(ex_temp_high_value,
1987 S_IRUGO | S_IWUSR,
1988 adt7316_show_ad_bound, adt7316_set_ad_bound,
1989 ADT7316_EX_TEMP_HIGH);
1990static IIO_DEVICE_ATTR(ex_temp_low_value,
1991 S_IRUGO | S_IWUSR,
1992 adt7316_show_ad_bound, adt7316_set_ad_bound,
1993 ADT7316_EX_TEMP_LOW);
1994
1995/* NASTY duplication to be fixed */
1996static IIO_DEVICE_ATTR(ex_temp_ain1_high_value,
1997 S_IRUGO | S_IWUSR,
1998 adt7316_show_ad_bound, adt7316_set_ad_bound,
1999 ADT7316_EX_TEMP_HIGH);
2000static IIO_DEVICE_ATTR(ex_temp_ain1_low_value,
2001 S_IRUGO | S_IWUSR,
2002 adt7316_show_ad_bound, adt7316_set_ad_bound,
2003 ADT7316_EX_TEMP_LOW);
2004static IIO_DEVICE_ATTR(ain2_high_value,
2005 S_IRUGO | S_IWUSR,
2006 adt7316_show_ad_bound, adt7316_set_ad_bound,
2007 ADT7516_AIN2_HIGH);
2008static IIO_DEVICE_ATTR(ain2_low_value,
2009 S_IRUGO | S_IWUSR,
2010 adt7316_show_ad_bound, adt7316_set_ad_bound,
2011 ADT7516_AIN2_LOW);
2012static IIO_DEVICE_ATTR(ain3_high_value,
2013 S_IRUGO | S_IWUSR,
2014 adt7316_show_ad_bound, adt7316_set_ad_bound,
2015 ADT7516_AIN3_HIGH);
2016static IIO_DEVICE_ATTR(ain3_low_value,
2017 S_IRUGO | S_IWUSR,
2018 adt7316_show_ad_bound, adt7316_set_ad_bound,
2019 ADT7516_AIN3_LOW);
2020static IIO_DEVICE_ATTR(ain4_high_value,
2021 S_IRUGO | S_IWUSR,
2022 adt7316_show_ad_bound, adt7316_set_ad_bound,
2023 ADT7516_AIN4_HIGH);
2024static IIO_DEVICE_ATTR(ain4_low_value,
2025 S_IRUGO | S_IWUSR,
2026 adt7316_show_ad_bound, adt7316_set_ad_bound,
2027 ADT7516_AIN4_LOW);
2028static IIO_DEVICE_ATTR(int_enabled,
2029 S_IRUGO | S_IWUSR,
2030 adt7316_show_int_enabled,
2031 adt7316_set_int_enabled, 0);
35f6b6b8
SZ
2032
2033static struct attribute *adt7316_event_attributes[] = {
90f79e76
JC
2034 &iio_dev_attr_int_mask.dev_attr.attr,
2035 &iio_dev_attr_in_temp_high_value.dev_attr.attr,
2036 &iio_dev_attr_in_temp_low_value.dev_attr.attr,
2037 &iio_dev_attr_ex_temp_high_value.dev_attr.attr,
2038 &iio_dev_attr_ex_temp_low_value.dev_attr.attr,
2039 &iio_dev_attr_int_enabled.dev_attr.attr,
35f6b6b8
SZ
2040 NULL,
2041};
2042
2043static struct attribute_group adt7316_event_attribute_group = {
2044 .attrs = adt7316_event_attributes,
2045};
2046
2047static struct attribute *adt7516_event_attributes[] = {
90f79e76
JC
2048 &iio_dev_attr_int_mask.dev_attr.attr,
2049 &iio_dev_attr_in_temp_high_value.dev_attr.attr,
2050 &iio_dev_attr_in_temp_low_value.dev_attr.attr,
2051 &iio_dev_attr_ex_temp_ain1_high_value.dev_attr.attr,
2052 &iio_dev_attr_ex_temp_ain1_low_value.dev_attr.attr,
2053 &iio_dev_attr_ain2_high_value.dev_attr.attr,
2054 &iio_dev_attr_ain2_low_value.dev_attr.attr,
2055 &iio_dev_attr_ain3_high_value.dev_attr.attr,
2056 &iio_dev_attr_ain3_low_value.dev_attr.attr,
2057 &iio_dev_attr_ain4_high_value.dev_attr.attr,
2058 &iio_dev_attr_ain4_low_value.dev_attr.attr,
2059 &iio_dev_attr_int_enabled.dev_attr.attr,
35f6b6b8
SZ
2060 NULL,
2061};
2062
2063static struct attribute_group adt7516_event_attribute_group = {
2064 .attrs = adt7516_event_attributes,
2065};
2066
2067#ifdef CONFIG_PM
2068int adt7316_disable(struct device *dev)
2069{
2070 struct iio_dev *dev_info = dev_get_drvdata(dev);
2071 struct adt7316_chip_info *chip = dev_info->dev_data;
2072
2073 return _adt7316_store_enabled(chip, 0);
2074}
2075EXPORT_SYMBOL(adt7316_disable);
2076
2077int adt7316_enable(struct device *dev)
2078{
2079 struct iio_dev *dev_info = dev_get_drvdata(dev);
2080 struct adt7316_chip_info *chip = dev_info->dev_data;
2081
2082 return _adt7316_store_enabled(chip, 1);
2083}
2084EXPORT_SYMBOL(adt7316_enable);
2085#endif
2086
2087/*
2088 * device probe and remove
2089 */
2090int __devinit adt7316_probe(struct device *dev, struct adt7316_bus *bus,
2091 const char *name)
2092{
2093 struct adt7316_chip_info *chip;
2094 unsigned short *adt7316_platform_data = dev->platform_data;
2095 int ret = 0;
2096
2097 chip = kzalloc(sizeof(struct adt7316_chip_info), GFP_KERNEL);
2098
2099 if (chip == NULL)
2100 return -ENOMEM;
2101
2102 /* this is only used for device removal purposes */
2103 dev_set_drvdata(dev, chip);
2104
2105 chip->bus = *bus;
35f6b6b8
SZ
2106
2107 if (name[4] == '3')
2108 chip->id = ID_ADT7316 + (name[6] - '6');
2109 else if (name[4] == '5')
2110 chip->id = ID_ADT7516 + (name[6] - '6');
2111 else
2112 return -ENODEV;
2113
2114 chip->ldac_pin = adt7316_platform_data[1];
2115 if (chip->ldac_pin) {
2116 chip->config3 |= ADT7316_DA_EN_VIA_DAC_LDCA;
2117 if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
2118 chip->config1 |= ADT7516_SEL_AIN3;
2119 }
2120 chip->int_mask = ADT7316_TEMP_INT_MASK | ADT7316_VDD_INT_MASK;
2121 if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
2122 chip->int_mask |= ADT7516_AIN_INT_MASK;
2123
6f7c8ee5 2124 chip->indio_dev = iio_allocate_device(0);
35f6b6b8
SZ
2125 if (chip->indio_dev == NULL) {
2126 ret = -ENOMEM;
2127 goto error_free_chip;
2128 }
2129
2130 chip->indio_dev->dev.parent = dev;
2131 if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX) {
2132 chip->indio_dev->attrs = &adt7516_attribute_group;
2133 chip->indio_dev->event_attrs = &adt7516_event_attribute_group;
2134 } else {
2135 chip->indio_dev->attrs = &adt7316_attribute_group;
2136 chip->indio_dev->event_attrs = &adt7316_event_attribute_group;
2137 }
845bd12a 2138 chip->indio_dev->name = name;
35f6b6b8
SZ
2139 chip->indio_dev->dev_data = (void *)chip;
2140 chip->indio_dev->driver_module = THIS_MODULE;
2141 chip->indio_dev->num_interrupt_lines = 1;
2142 chip->indio_dev->modes = INDIO_DIRECT_MODE;
2143
2144 ret = iio_device_register(chip->indio_dev);
2145 if (ret)
2146 goto error_free_dev;
2147
2148 if (chip->bus.irq > 0) {
2149 if (adt7316_platform_data[0])
2150 chip->bus.irq_flags = adt7316_platform_data[0];
2151
90f79e76
JC
2152 ret = request_threaded_irq(chip->bus.irq,
2153 NULL,
2154 &adt7316_event_handler,
2155 chip->bus.irq_flags | IRQF_ONESHOT,
845bd12a 2156 chip->indio_dev->name,
90f79e76 2157 chip->indio_dev);
35f6b6b8
SZ
2158 if (ret)
2159 goto error_unreg_dev;
2160
35f6b6b8
SZ
2161 if (chip->bus.irq_flags & IRQF_TRIGGER_HIGH)
2162 chip->config1 |= ADT7316_INT_POLARITY;
2163 }
2164
2165 ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG1, chip->config1);
2166 if (ret) {
2167 ret = -EIO;
2168 goto error_unreg_irq;
2169 }
2170
2171 ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, chip->config3);
2172 if (ret) {
2173 ret = -EIO;
2174 goto error_unreg_irq;
2175 }
2176
2177 dev_info(dev, "%s temperature sensor, ADC and DAC registered.\n",
845bd12a 2178 chip->indio_dev->name);
35f6b6b8
SZ
2179
2180 return 0;
2181
2182error_unreg_irq:
90f79e76 2183 free_irq(chip->bus.irq, chip->indio_dev);
35f6b6b8
SZ
2184error_unreg_dev:
2185 iio_device_unregister(chip->indio_dev);
2186error_free_dev:
2187 iio_free_device(chip->indio_dev);
2188error_free_chip:
2189 kfree(chip);
2190
2191 return ret;
2192}
2193EXPORT_SYMBOL(adt7316_probe);
2194
2195int __devexit adt7316_remove(struct device *dev)
2196{
2197
2198 struct iio_dev *dev_info = dev_get_drvdata(dev);
2199 struct adt7316_chip_info *chip = dev_info->dev_data;
35f6b6b8
SZ
2200
2201 dev_set_drvdata(dev, NULL);
2202 if (chip->bus.irq)
90f79e76
JC
2203 free_irq(chip->bus.irq, chip->indio_dev);
2204 iio_device_unregister(chip->indio_dev);
35f6b6b8
SZ
2205 iio_free_device(chip->indio_dev);
2206 kfree(chip);
2207
2208 return 0;
2209}
2210EXPORT_SYMBOL(adt7316_remove);
2211
2212MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>");
2213MODULE_DESCRIPTION("Analog Devices ADT7316/7/8 and ADT7516/7/9 digital"
2214 " temperature sensor, ADC and DAC driver");
2215MODULE_LICENSE("GPL v2");