drivers: mfd: Add support for TI aic3262 driver
[linux-2.6.git] / include / linux / mfd / tlv320aic3262-core.h
1 #ifndef __MFD_AIC3262_CORE_H__
2 #define __MFD_AIC3262_CORE_H__
3
4 #include <linux/interrupt.h>
5 #include <linux/mfd/core.h>
6 enum aic3262_type {
7         TLV320AIC3262 = 0,
8 };
9
10 #define AIC3262_IRQ_HEADSET_DETECT      0
11 #define AIC3262_IRQ_BUTTON_PRESS        1
12 #define AIC3262_IRQ_DAC_DRC             2
13 #define AIC3262_IRQ_AGC_NOISE           3
14 #define AIC3262_IRQ_OVER_CURRENT        4
15 #define AIC3262_IRQ_OVERFLOW_EVENT      5
16 #define AIC3262_IRQ_SPEAKER_OVER_TEMP   6
17
18 #define AIC3262_GPIO1                   7
19 #define AIC3262_GPIO2                   8
20 #define AIC3262_GPI1                    9
21 #define AIC3262_GPI2                    10
22 #define AIC3262_GPO1                    11
23
24 union aic326x_reg_union {
25         struct aic326x_reg {
26                 u8 offset;
27                 u8 page;
28                 u8 book;
29                 u8 reserved;
30         } aic326x_register;
31         unsigned int aic326x_register_int;
32 };
33
34 /****************************             ************************************/
35
36 /*
37  *****************************************************************************
38  * Structures Definitions
39  *****************************************************************************
40  */
41 /*
42  *----------------------------------------------------------------------------
43  * @struct  aic3262_setup_data |
44  *          i2c specific data setup for AIC3262.
45  * @field   unsigned short |i2c_address |
46  *          Unsigned short for i2c address.
47  *----------------------------------------------------------------------------
48  */
49 struct aic3262_setup_data {
50         unsigned short i2c_address;
51 };
52
53 /* GPIO API */
54 #define AIC3262_NUM_GPIO 5      /* include 2 GPI and 1 GPO pins */
55 enum {
56         AIC3262_GPIO1_FUNC_DISABLED =           0,
57         AIC3262_GPIO1_FUNC_INPUT =              1,
58         AIC3262_GPIO1_FUNC_OUTPUT =             3,
59         AIC3262_GPIO1_FUNC_CLOCK_OUTPUT =       4,
60         AIC3262_GPIO1_FUNC_INT1_OUTPUT =        5,
61         AIC3262_GPIO1_FUNC_INT2_OUTPUT =        6,
62         AIC3262_GPIO1_FUNC_ADC_MOD_CLK_OUTPUT = 10,
63         AIC3262_GPIO1_FUNC_SAR_ADC_INTERRUPT =  12,
64         AIC3262_GPIO1_FUNC_ASI1_DATA_OUTPUT =   15,
65         AIC3262_GPIO1_FUNC_ASI1_WCLK =          16,
66         AIC3262_GPIO1_FUNC_ASI1_BCLK =          17,
67         AIC3262_GPIO1_FUNC_ASI2_WCLK =          18,
68         AIC3262_GPIO1_FUNC_ASI2_BCLK =          19,
69         AIC3262_GPIO1_FUNC_ASI3_WCLK =          20,
70         AIC3262_GPIO1_FUNC_ASI3_BCLK =          21
71 };
72
73 enum {
74         AIC3262_GPIO2_FUNC_DISABLED =           0,
75         AIC3262_GPIO2_FUNC_INPUT =              1,
76         AIC3262_GPIO2_FUNC_OUTPUT =             3,
77         AIC3262_GPIO2_FUNC_CLOCK_OUTPUT =       4,
78         AIC3262_GPIO2_FUNC_INT1_OUTPUT =        5,
79         AIC3262_GPIO2_FUNC_INT2_OUTPUT =        6,
80         AIC3262_GPIO2_FUNC_ADC_MOD_CLK_OUTPUT = 10,
81         AIC3262_GPIO2_FUNC_SAR_ADC_INTERRUPT =  12,
82         AIC3262_GPIO2_FUNC_ASI1_DATA_OUTPUT =   15,
83         AIC3262_GPIO2_FUNC_ASI1_WCLK =          16,
84         AIC3262_GPIO2_FUNC_ASI1_BCLK =          17,
85         AIC3262_GPIO2_FUNC_ASI2_WCLK =          18,
86         AIC3262_GPIO2_FUNC_ASI2_BCLK =          19,
87         AIC3262_GPIO2_FUNC_ASI3_WCLK =          20,
88         AIC3262_GPIO2_FUNC_ASI3_BCLK =          21
89 };
90 enum {
91         AIC3262_GPO1_FUNC_DISABLED =            0,
92         AIC3262_GPO1_FUNC_MSO_OUTPUT_FOR_SPI =  1,
93         AIC3262_GPO1_FUNC_GENERAL_PURPOSE_OUTPUT = 2,
94         AIC3262_GPO1_FUNC_CLOCK_OUTPUT =        3,
95         AIC3262_GPO1_FUNC_INT1_OUTPUT = 4,
96         AIC3262_GPO1_FUNC_INT2_OUTPUT = 5,
97         AIC3262_GPO1_FUNC_ADC_MOD_CLK_OUTPUT =  7,
98         AIC3262_GPO1_FUNC_SAR_ADC_INTERRUPT =   12,
99         AIC3262_GPO1_FUNC_ASI1_DATA_OUTPUT =    15,
100 };
101 /*
102  *----------------------------------------------------------------------------
103  * @struct  aic3262_configs |
104  *          AIC3262 initialization data which has register offset and register
105  *          value.
106  * @field   u8 | book_no |
107  *          AIC3262 Book Number Offsets required for initialization..
108  * @field   u16 | reg_offset |
109  *          AIC3262 Register offsets required for initialization..
110  * @field   u8 | reg_val |
111  *          value to set the AIC3262 register to initialize the AIC3262.
112  *---------------------------------------------------------------------------
113  */
114 struct aic3262_configs {
115         u8 book_no;
116         u16 reg_offset;
117         u8 reg_val;
118 };
119
120 /*
121  *----------------------------------------------------------------------------
122  * @struct  aic3262_rate_divs |
123  *          Setting up the values to get different freqencies
124  *
125  * @field   u32 | mclk |
126  *          Master clock
127  * @field   u32 | rate |
128  *          sample rate
129  * @field   u8 | p_val |
130  *          value of p in PLL
131  * @field   u32 | pll_j |
132  *          value for pll_j
133  * @field   u32 | pll_d |
134  *          value for pll_d
135  * @field   u32 | dosr |
136  *          value to store dosr
137  * @field   u32 | ndac |
138  *          value for ndac
139  * @field   u32 | mdac |
140  *          value for mdac
141  * @field   u32 | aosr |
142  *          value for aosr
143  * @field   u32 | nadc |
144  *          value for nadc
145  * @field   u32 | madc |
146  *          value for madc
147  * @field   u32 | blck_N |
148  *          value for block N
149  */
150 struct aic3262 {
151         struct mutex io_lock;
152         struct mutex irq_lock;
153         enum aic3262_type type;
154         struct device *dev;
155         int (*read_dev)(struct aic3262 *aic3262, unsigned int reg,
156                         int bytes, void *dest);
157         int (*write_dev)(struct aic3262 *aic3262, unsigned int reg,
158                          int bytes, const void *src);
159
160         void *control_data;
161         unsigned int irq;
162         unsigned int irq_base;
163         u8 irq_masks_cur;
164         u8 irq_masks_cache;
165         /* Used over suspend/resume */
166         bool suspended;
167         u8 book_no;
168         u8 page_no;
169 };
170
171 struct aic3262_gpio_setup {
172         u8 used;                /* GPIO, GPI and GPO is used in the board, */
173                                 /* used = 1 else 0 */
174         u8 in;                  /* GPIO is used as input, in = 1 else in = 0 */
175                                 /* GPI in = 1, GPO in = 0 */
176         unsigned int in_reg;    /* if GPIO is input,
177                                         register to write the mask. */
178         u8 in_reg_bitmask;      /* bitmask for 'value' to be
179                                         written into in_reg */
180         u8 in_reg_shift;        /* bits to shift to write 'value'
181                                         into in_reg */
182         u8 value;               /* value to be written
183                                         gpio_control_reg if GPIO */
184                                 /* is output, in_reg if its input */
185 };
186
187 struct aic3262_pdata {
188         unsigned int audio_mclk1;
189         unsigned int audio_mclk2;
190         unsigned int gpio_irq;  /* whether AIC3262 interrupts the host AP on */
191                                 /* a GPIO pin of AP */
192         unsigned int gpio_reset;/* is the codec being reset by a gpio*/
193                                 /* [host] pin, if yes provide the number. */
194         struct aic3262_gpio_setup *gpio;/* all gpio configuration */
195         int naudint_irq;        /* audio interrupt */
196         unsigned int irq_base;
197 };
198
199 static inline int aic3262_request_irq(struct aic3262 *aic3262, int irq,
200                                       irq_handler_t handler,
201                                       unsigned long irqflags, const char *name,
202                                       void *data)
203 {
204         if (!aic3262->irq_base)
205                 return -EINVAL;
206
207         return request_threaded_irq(aic3262->irq_base + irq, NULL, handler,
208                                     irqflags, name, data);
209 }
210
211 static inline int aic3262_free_irq(struct aic3262 *aic3262, int irq, void *data)
212 {
213         if (!aic3262->irq_base)
214                 return -EINVAL;
215
216         free_irq(aic3262->irq_base + irq, data);
217         return 0;
218 }
219
220 /* Device I/O API */
221 int aic3262_reg_read(struct aic3262 *aic3262, unsigned int reg);
222 int aic3262_reg_write(struct aic3262 *aic3262, unsigned int reg,
223                       unsigned char val);
224 int aic3262_set_bits(struct aic3262 *aic3262, unsigned int reg,
225                      unsigned char mask, unsigned char val);
226 int aic3262_bulk_read(struct aic3262 *aic3262, unsigned int reg,
227                       int count, u8 *buf);
228 int aic3262_bulk_write(struct aic3262 *aic3262, unsigned int reg,
229                        int count, const u8 *buf);
230 int aic3262_wait_bits(struct aic3262 *aic3262, unsigned int reg,
231                       unsigned char mask, unsigned char val, int delay,
232                       int counter);
233
234 int aic3262_irq_init(struct aic3262 *aic3262);
235 void aic3262_irq_exit(struct aic3262 *aic3262);
236
237 #endif /* End of __MFD_AIC3262_CORE_H__ */