1
2
3
4
5
6#ifndef _LINUX_WM97XX_H
7#define _LINUX_WM97XX_H
8
9#include <sound/core.h>
10#include <sound/pcm.h>
11#include <sound/ac97_codec.h>
12#include <sound/initval.h>
13#include <linux/types.h>
14#include <linux/list.h>
15#include <linux/input.h>
16#include <linux/platform_device.h>
17
18
19
20
21#define WM97xx_GENERIC 0x0000
22#define WM97xx_WM1613 0x1613
23
24
25
26
27#define AC97_WM97XX_DIGITISER1 0x76
28#define AC97_WM97XX_DIGITISER2 0x78
29#define AC97_WM97XX_DIGITISER_RD 0x7a
30#define AC97_WM9713_DIG1 0x74
31#define AC97_WM9713_DIG2 AC97_WM97XX_DIGITISER1
32#define AC97_WM9713_DIG3 AC97_WM97XX_DIGITISER2
33
34
35
36
37#define WM97XX_POLL 0x8000
38#define WM97XX_ADCSEL_X 0x1000
39#define WM97XX_ADCSEL_Y 0x2000
40#define WM97XX_ADCSEL_PRES 0x3000
41#define WM97XX_ADCSEL_MASK 0x7000
42#define WM97XX_COO 0x0800
43#define WM97XX_CTC 0x0400
44#define WM97XX_CM_RATE_93 0x0000
45#define WM97XX_CM_RATE_187 0x0100
46#define WM97XX_CM_RATE_375 0x0200
47#define WM97XX_CM_RATE_750 0x0300
48#define WM97XX_CM_RATE_8K 0x00f0
49#define WM97XX_CM_RATE_12K 0x01f0
50#define WM97XX_CM_RATE_24K 0x02f0
51#define WM97XX_CM_RATE_48K 0x03f0
52#define WM97XX_CM_RATE_MASK 0x03f0
53#define WM97XX_RATE(i) (((i & 3) << 8) | ((i & 4) ? 0xf0 : 0))
54#define WM97XX_DELAY(i) ((i << 4) & 0x00f0)
55#define WM97XX_DELAY_MASK 0x00f0
56#define WM97XX_SLEN 0x0008
57#define WM97XX_SLT(i) ((i - 5) & 0x7)
58#define WM97XX_SLT_MASK 0x0007
59#define WM97XX_PRP_DETW 0x4000
60#define WM97XX_PRP_DET 0x8000
61#define WM97XX_PRP_DET_DIG 0xc000
62#define WM97XX_RPR 0x2000
63#define WM97XX_PEN_DOWN 0x8000
64#define WM97XX_ADCSRC_MASK 0x7000
65
66#define WM97XX_AUX_ID1 0x8001
67#define WM97XX_AUX_ID2 0x8002
68#define WM97XX_AUX_ID3 0x8003
69#define WM97XX_AUX_ID4 0x8004
70
71
72
73#define WM9712_45W 0x1000
74#define WM9712_PDEN 0x0800
75#define WM9712_WAIT 0x0200
76#define WM9712_PIL 0x0100
77#define WM9712_MASK_HI 0x0040
78#define WM9712_MASK_EDGE 0x0080
79#define WM9712_MASK_SYNC 0x00c0
80#define WM9712_RPU(i) (i&0x3f)
81#define WM9712_PD(i) (0x1 << i)
82
83
84#define AC97_WM9712_POWER 0x24
85#define AC97_WM9712_REV 0x58
86
87
88#define WM9705_PDEN 0x1000
89#define WM9705_PINV 0x0800
90#define WM9705_BSEN 0x0400
91#define WM9705_BINV 0x0200
92#define WM9705_WAIT 0x0100
93#define WM9705_PIL 0x0080
94#define WM9705_PHIZ 0x0040
95#define WM9705_MASK_HI 0x0010
96#define WM9705_MASK_EDGE 0x0020
97#define WM9705_MASK_SYNC 0x0030
98#define WM9705_PDD(i) (i & 0x000f)
99
100
101
102#define WM9713_PDPOL 0x0400
103#define WM9713_POLL 0x0200
104#define WM9713_CTC 0x0100
105#define WM9713_ADCSEL_X 0x0002
106#define WM9713_ADCSEL_Y 0x0004
107#define WM9713_ADCSEL_PRES 0x0008
108#define WM9713_COO 0x0001
109#define WM9713_45W 0x1000
110#define WM9713_PDEN 0x0800
111#define WM9713_ADCSEL_MASK 0x00fe
112#define WM9713_WAIT 0x0200
113
114
115#define TS_COMP1 0x0
116#define TS_COMP2 0x1
117#define TS_BMON 0x2
118#define TS_WIPER 0x3
119
120
121#define WM97XX_ID1 0x574d
122#define WM9712_ID2 0x4c12
123#define WM9705_ID2 0x4c05
124#define WM9713_ID2 0x4c13
125
126
127#define WM97XX_MAX_GPIO 16
128#define WM97XX_GPIO_1 (1 << 1)
129#define WM97XX_GPIO_2 (1 << 2)
130#define WM97XX_GPIO_3 (1 << 3)
131#define WM97XX_GPIO_4 (1 << 4)
132#define WM97XX_GPIO_5 (1 << 5)
133#define WM97XX_GPIO_6 (1 << 6)
134#define WM97XX_GPIO_7 (1 << 7)
135#define WM97XX_GPIO_8 (1 << 8)
136#define WM97XX_GPIO_9 (1 << 9)
137#define WM97XX_GPIO_10 (1 << 10)
138#define WM97XX_GPIO_11 (1 << 11)
139#define WM97XX_GPIO_12 (1 << 12)
140#define WM97XX_GPIO_13 (1 << 13)
141#define WM97XX_GPIO_14 (1 << 14)
142#define WM97XX_GPIO_15 (1 << 15)
143
144
145#define AC97_LINK_FRAME 21
146
147
148
149
150
151#define RC_AGAIN 0x00000001
152
153#define RC_VALID 0x00000002
154
155#define RC_PENUP 0x00000004
156
157
158
159#define RC_PENDOWN 0x00000008
160
161
162
163
164
165
166
167struct wm97xx_data {
168 int x;
169 int y;
170 int p;
171};
172
173
174
175
176enum wm97xx_gpio_status {
177 WM97XX_GPIO_HIGH,
178 WM97XX_GPIO_LOW
179};
180
181
182
183
184enum wm97xx_gpio_dir {
185 WM97XX_GPIO_IN,
186 WM97XX_GPIO_OUT
187};
188
189
190
191
192enum wm97xx_gpio_pol {
193 WM97XX_GPIO_POL_HIGH,
194 WM97XX_GPIO_POL_LOW
195};
196
197
198
199
200enum wm97xx_gpio_sticky {
201 WM97XX_GPIO_STICKY,
202 WM97XX_GPIO_NOTSTICKY
203};
204
205
206
207
208enum wm97xx_gpio_wake {
209 WM97XX_GPIO_WAKE,
210 WM97XX_GPIO_NOWAKE
211};
212
213
214
215
216#define WM97XX_DIG_START 0x1
217#define WM97XX_DIG_STOP 0x2
218#define WM97XX_PHY_INIT 0x3
219#define WM97XX_AUX_PREPARE 0x4
220#define WM97XX_DIG_RESTORE 0x5
221
222struct wm97xx;
223
224extern struct wm97xx_codec_drv wm9705_codec;
225extern struct wm97xx_codec_drv wm9712_codec;
226extern struct wm97xx_codec_drv wm9713_codec;
227
228
229
230
231struct wm97xx_codec_drv {
232 u16 id;
233 char *name;
234
235
236 int (*poll_sample) (struct wm97xx *, int adcsel, int *sample);
237
238
239 int (*poll_touch) (struct wm97xx *, struct wm97xx_data *);
240
241 int (*acc_enable) (struct wm97xx *, int enable);
242 void (*phy_init) (struct wm97xx *);
243 void (*dig_enable) (struct wm97xx *, int enable);
244 void (*dig_restore) (struct wm97xx *);
245 void (*aux_prepare) (struct wm97xx *);
246};
247
248
249
250struct wm97xx_mach_ops {
251
252
253 int acc_enabled;
254 void (*acc_pen_up) (struct wm97xx *);
255 int (*acc_pen_down) (struct wm97xx *);
256 int (*acc_startup) (struct wm97xx *);
257 void (*acc_shutdown) (struct wm97xx *);
258
259
260 void (*irq_enable) (struct wm97xx *, int enable);
261
262
263 int irq_gpio;
264
265
266 void (*pre_sample) (int);
267 void (*post_sample) (int);
268};
269
270struct wm97xx {
271 u16 dig[3], id, gpio[6], misc;
272 u16 dig_save[3];
273 struct wm97xx_codec_drv *codec;
274 struct input_dev *input_dev;
275 struct snd_ac97 *ac97;
276 struct device *dev;
277 struct platform_device *battery_dev;
278 struct platform_device *touch_dev;
279 struct wm97xx_mach_ops *mach_ops;
280 struct mutex codec_mutex;
281 struct delayed_work ts_reader;
282 unsigned long ts_reader_interval;
283 unsigned long ts_reader_min_interval;
284 unsigned int pen_irq;
285 struct workqueue_struct *ts_workq;
286 struct work_struct pen_event_work;
287 u16 acc_slot;
288 u16 acc_rate;
289 unsigned pen_is_down:1;
290 unsigned aux_waiting:1;
291 unsigned pen_probably_down:1;
292 u16 variant;
293 u16 suspend_mode;
294};
295
296struct wm97xx_batt_pdata {
297 int batt_aux;
298 int temp_aux;
299 int charge_gpio;
300 int min_voltage;
301 int max_voltage;
302 int batt_div;
303 int batt_mult;
304 int temp_div;
305 int temp_mult;
306 int batt_tech;
307 char *batt_name;
308};
309
310struct wm97xx_pdata {
311 struct wm97xx_batt_pdata *batt_pdata;
312};
313
314
315
316
317
318enum wm97xx_gpio_status wm97xx_get_gpio(struct wm97xx *wm, u32 gpio);
319void wm97xx_set_gpio(struct wm97xx *wm, u32 gpio,
320 enum wm97xx_gpio_status status);
321void wm97xx_config_gpio(struct wm97xx *wm, u32 gpio,
322 enum wm97xx_gpio_dir dir,
323 enum wm97xx_gpio_pol pol,
324 enum wm97xx_gpio_sticky sticky,
325 enum wm97xx_gpio_wake wake);
326
327void wm97xx_set_suspend_mode(struct wm97xx *wm, u16 mode);
328
329
330int wm97xx_reg_read(struct wm97xx *wm, u16 reg);
331void wm97xx_reg_write(struct wm97xx *wm, u16 reg, u16 val);
332
333
334int wm97xx_read_aux_adc(struct wm97xx *wm, u16 adcsel);
335
336
337int wm97xx_register_mach_ops(struct wm97xx *, struct wm97xx_mach_ops *);
338void wm97xx_unregister_mach_ops(struct wm97xx *);
339
340#endif
341