staging: IIO: ADC: New driver for the AD7780 / AD7781 24-bit Sigma-Delta ADC
[pandora-kernel.git] / drivers / staging / iio / adc / ad799x.h
1 /*
2  * Copyright (C) 2010 Michael Hennerich, Analog Devices Inc.
3  * Copyright (C) 2008-2010 Jonathan Cameron
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation.
8  *
9  * ad799x.h
10  */
11
12 #ifndef _AD799X_H_
13 #define  _AD799X_H_
14
15 #define AD799X_CHANNEL_SHIFT                    4
16 #define AD799X_STORAGEBITS                      16
17 /*
18  * AD7991, AD7995 and AD7999 defines
19  */
20
21 #define AD7991_REF_SEL                          0x08
22 #define AD7991_FLTR                             0x04
23 #define AD7991_BIT_TRIAL_DELAY                  0x02
24 #define AD7991_SAMPLE_DELAY                     0x01
25
26 /*
27  * AD7992, AD7993, AD7994, AD7997 and AD7998 defines
28  */
29
30 #define AD7998_FLTR                             0x08
31 #define AD7998_ALERT_EN                         0x04
32 #define AD7998_BUSY_ALERT                       0x02
33 #define AD7998_BUSY_ALERT_POL                   0x01
34
35 #define AD7998_CONV_RES_REG                     0x0
36 #define AD7998_ALERT_STAT_REG                   0x1
37 #define AD7998_CONF_REG                         0x2
38 #define AD7998_CYCLE_TMR_REG                    0x3
39 #define AD7998_DATALOW_CH1_REG                  0x4
40 #define AD7998_DATAHIGH_CH1_REG                 0x5
41 #define AD7998_HYST_CH1_REG                     0x6
42 #define AD7998_DATALOW_CH2_REG                  0x7
43 #define AD7998_DATAHIGH_CH2_REG                 0x8
44 #define AD7998_HYST_CH2_REG                     0x9
45 #define AD7998_DATALOW_CH3_REG                  0xA
46 #define AD7998_DATAHIGH_CH3_REG                 0xB
47 #define AD7998_HYST_CH3_REG                     0xC
48 #define AD7998_DATALOW_CH4_REG                  0xD
49 #define AD7998_DATAHIGH_CH4_REG                 0xE
50 #define AD7998_HYST_CH4_REG                     0xF
51
52 #define AD7998_CYC_MASK                         0x7
53 #define AD7998_CYC_DIS                          0x0
54 #define AD7998_CYC_TCONF_32                     0x1
55 #define AD7998_CYC_TCONF_64                     0x2
56 #define AD7998_CYC_TCONF_128                    0x3
57 #define AD7998_CYC_TCONF_256                    0x4
58 #define AD7998_CYC_TCONF_512                    0x5
59 #define AD7998_CYC_TCONF_1024                   0x6
60 #define AD7998_CYC_TCONF_2048                   0x7
61
62 #define AD7998_ALERT_STAT_CLEAR                 0xFF
63
64 /*
65  * AD7997 and AD7997 defines
66  */
67
68 #define AD7997_8_READ_SINGLE                    0x80
69 #define AD7997_8_READ_SEQUENCE                  0x70
70
71 enum {
72         ad7991,
73         ad7995,
74         ad7999,
75         ad7992,
76         ad7993,
77         ad7994,
78         ad7997,
79         ad7998
80 };
81
82 struct ad799x_state;
83
84 /**
85  * struct ad799x_chip_info - chip specifc information
86  * @num_inputs:         number of physical inputs on chip
87  * @bits:               accuracy of the adc in bits
88  * @int_vref_mv:        the internal reference voltage
89  * @monitor_mode:       whether the chip supports monitor interrupts
90  * @default_config:     device default configuration
91  * @dev_attrs:          pointer to the device attribute group
92  * @scan_attrs:         pointer to the scan element attribute group
93  * @event_attrs:        pointer to the monitor event attribute group
94  * @ad799x_set_scan_mode: function pointer to the device specific mode function
95
96  */
97 struct ad799x_chip_info {
98         u8                              num_inputs;
99         u8                              bits;
100         u8                              storagebits;
101         char                            sign;
102         u16                             int_vref_mv;
103         bool                            monitor_mode;
104         u16                             default_config;
105         struct attribute_group          *dev_attrs;
106         struct attribute_group          *scan_attrs;
107         struct attribute_group          *event_attrs;
108         int (*ad799x_set_scan_mode)     (struct ad799x_state *st,
109                                         unsigned mask);
110 };
111
112 struct ad799x_state {
113         struct iio_dev                  *indio_dev;
114         struct i2c_client               *client;
115         const struct ad799x_chip_info   *chip_info;
116         struct work_struct              poll_work;
117         struct work_struct              work_thresh;
118         atomic_t                        protect_ring;
119         size_t                          d_size;
120         struct iio_trigger              *trig;
121         struct regulator                *reg;
122         s64                             last_timestamp;
123         u16                             int_vref_mv;
124         unsigned                        id;
125         char                            *name;
126         u16                             config;
127 };
128
129 /*
130  * TODO: struct ad799x_platform_data needs to go into include/linux/iio
131  */
132
133 struct ad799x_platform_data {
134         u16                             vref_mv;
135 };
136
137 int ad799x_set_scan_mode(struct ad799x_state *st, unsigned mask);
138
139 #ifdef CONFIG_AD799X_RING_BUFFER
140 int ad799x_single_channel_from_ring(struct ad799x_state *st, long mask);
141 int ad799x_register_ring_funcs_and_init(struct iio_dev *indio_dev);
142 void ad799x_ring_cleanup(struct iio_dev *indio_dev);
143 #else /* CONFIG_AD799X_RING_BUFFER */
144 int ad799x_single_channel_from_ring(struct ad799x_state *st, long mask)
145 {
146         return -EINVAL;
147 }
148
149
150 static inline int
151 ad799x_register_ring_funcs_and_init(struct iio_dev *indio_dev)
152 {
153         return 0;
154 }
155
156 static inline void ad799x_ring_cleanup(struct iio_dev *indio_dev)
157 {
158 }
159 #endif /* CONFIG_AD799X_RING_BUFFER */
160 #endif /* _AD799X_H_ */