Merge tag 'gpio-for-linus' of git://git.secretlab.ca/git/linux-2.6
[deliverable/linux.git] / sound / soc / codecs / wm5100.c
1 /*
2 * wm5100.c -- WM5100 ALSA SoC Audio driver
3 *
4 * Copyright 2011 Wolfson Microelectronics plc
5 *
6 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 */
12
13 #include <linux/module.h>
14 #include <linux/moduleparam.h>
15 #include <linux/init.h>
16 #include <linux/delay.h>
17 #include <linux/pm.h>
18 #include <linux/gcd.h>
19 #include <linux/gpio.h>
20 #include <linux/i2c.h>
21 #include <linux/pm_runtime.h>
22 #include <linux/regulator/consumer.h>
23 #include <linux/regulator/fixed.h>
24 #include <linux/slab.h>
25 #include <sound/core.h>
26 #include <sound/pcm.h>
27 #include <sound/pcm_params.h>
28 #include <sound/soc.h>
29 #include <sound/jack.h>
30 #include <sound/initval.h>
31 #include <sound/tlv.h>
32 #include <sound/wm5100.h>
33
34 #include "wm5100.h"
35
36 #define WM5100_NUM_CORE_SUPPLIES 2
37 static const char *wm5100_core_supply_names[WM5100_NUM_CORE_SUPPLIES] = {
38 "DBVDD1",
39 "LDOVDD", /* If DCVDD is supplied externally specify as LDOVDD */
40 };
41
42 #define WM5100_AIFS 3
43 #define WM5100_SYNC_SRS 3
44
45 struct wm5100_fll {
46 int fref;
47 int fout;
48 int src;
49 struct completion lock;
50 };
51
52 /* codec private data */
53 struct wm5100_priv {
54 struct device *dev;
55 struct regmap *regmap;
56 struct snd_soc_codec *codec;
57
58 struct regulator_bulk_data core_supplies[WM5100_NUM_CORE_SUPPLIES];
59
60 int rev;
61
62 int sysclk;
63 int asyncclk;
64
65 bool aif_async[WM5100_AIFS];
66 bool aif_symmetric[WM5100_AIFS];
67 int sr_ref[WM5100_SYNC_SRS];
68
69 bool out_ena[2];
70
71 struct snd_soc_jack *jack;
72 bool jack_detecting;
73 bool jack_mic;
74 int jack_mode;
75 int jack_flips;
76
77 struct wm5100_fll fll[2];
78
79 struct wm5100_pdata pdata;
80
81 #ifdef CONFIG_GPIOLIB
82 struct gpio_chip gpio_chip;
83 #endif
84 };
85
86 static int wm5100_sr_code[] = {
87 0,
88 12000,
89 24000,
90 48000,
91 96000,
92 192000,
93 384000,
94 768000,
95 0,
96 11025,
97 22050,
98 44100,
99 88200,
100 176400,
101 352800,
102 705600,
103 4000,
104 8000,
105 16000,
106 32000,
107 64000,
108 128000,
109 256000,
110 512000,
111 };
112
113 static int wm5100_sr_regs[WM5100_SYNC_SRS] = {
114 WM5100_CLOCKING_4,
115 WM5100_CLOCKING_5,
116 WM5100_CLOCKING_6,
117 };
118
119 static int wm5100_alloc_sr(struct snd_soc_codec *codec, int rate)
120 {
121 struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec);
122 int sr_code, sr_free, i;
123
124 for (i = 0; i < ARRAY_SIZE(wm5100_sr_code); i++)
125 if (wm5100_sr_code[i] == rate)
126 break;
127 if (i == ARRAY_SIZE(wm5100_sr_code)) {
128 dev_err(codec->dev, "Unsupported sample rate: %dHz\n", rate);
129 return -EINVAL;
130 }
131 sr_code = i;
132
133 if ((wm5100->sysclk % rate) == 0) {
134 /* Is this rate already in use? */
135 sr_free = -1;
136 for (i = 0; i < ARRAY_SIZE(wm5100_sr_regs); i++) {
137 if (!wm5100->sr_ref[i] && sr_free == -1) {
138 sr_free = i;
139 continue;
140 }
141 if ((snd_soc_read(codec, wm5100_sr_regs[i]) &
142 WM5100_SAMPLE_RATE_1_MASK) == sr_code)
143 break;
144 }
145
146 if (i < ARRAY_SIZE(wm5100_sr_regs)) {
147 wm5100->sr_ref[i]++;
148 dev_dbg(codec->dev, "SR %dHz, slot %d, ref %d\n",
149 rate, i, wm5100->sr_ref[i]);
150 return i;
151 }
152
153 if (sr_free == -1) {
154 dev_err(codec->dev, "All SR slots already in use\n");
155 return -EBUSY;
156 }
157
158 dev_dbg(codec->dev, "Allocating SR slot %d for %dHz\n",
159 sr_free, rate);
160 wm5100->sr_ref[sr_free]++;
161 snd_soc_update_bits(codec, wm5100_sr_regs[sr_free],
162 WM5100_SAMPLE_RATE_1_MASK,
163 sr_code);
164
165 return sr_free;
166
167 } else {
168 dev_err(codec->dev,
169 "SR %dHz incompatible with %dHz SYSCLK and %dHz ASYNCCLK\n",
170 rate, wm5100->sysclk, wm5100->asyncclk);
171 return -EINVAL;
172 }
173 }
174
175 static void wm5100_free_sr(struct snd_soc_codec *codec, int rate)
176 {
177 struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec);
178 int i, sr_code;
179
180 for (i = 0; i < ARRAY_SIZE(wm5100_sr_code); i++)
181 if (wm5100_sr_code[i] == rate)
182 break;
183 if (i == ARRAY_SIZE(wm5100_sr_code)) {
184 dev_err(codec->dev, "Unsupported sample rate: %dHz\n", rate);
185 return;
186 }
187 sr_code = wm5100_sr_code[i];
188
189 for (i = 0; i < ARRAY_SIZE(wm5100_sr_regs); i++) {
190 if (!wm5100->sr_ref[i])
191 continue;
192
193 if ((snd_soc_read(codec, wm5100_sr_regs[i]) &
194 WM5100_SAMPLE_RATE_1_MASK) == sr_code)
195 break;
196 }
197 if (i < ARRAY_SIZE(wm5100_sr_regs)) {
198 wm5100->sr_ref[i]--;
199 dev_dbg(codec->dev, "Dereference SR %dHz, count now %d\n",
200 rate, wm5100->sr_ref[i]);
201 } else {
202 dev_warn(codec->dev, "Freeing unreferenced sample rate %dHz\n",
203 rate);
204 }
205 }
206
207 static int wm5100_reset(struct wm5100_priv *wm5100)
208 {
209 if (wm5100->pdata.reset) {
210 gpio_set_value_cansleep(wm5100->pdata.reset, 0);
211 gpio_set_value_cansleep(wm5100->pdata.reset, 1);
212
213 return 0;
214 } else {
215 return regmap_write(wm5100->regmap, WM5100_SOFTWARE_RESET, 0);
216 }
217 }
218
219 static DECLARE_TLV_DB_SCALE(in_tlv, -6300, 100, 0);
220 static DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0);
221 static DECLARE_TLV_DB_SCALE(mixer_tlv, -3200, 100, 0);
222 static DECLARE_TLV_DB_SCALE(out_tlv, -6400, 100, 0);
223 static DECLARE_TLV_DB_SCALE(digital_tlv, -6400, 50, 0);
224
225 static const char *wm5100_mixer_texts[] = {
226 "None",
227 "Tone Generator 1",
228 "Tone Generator 2",
229 "AEC loopback",
230 "IN1L",
231 "IN1R",
232 "IN2L",
233 "IN2R",
234 "IN3L",
235 "IN3R",
236 "IN4L",
237 "IN4R",
238 "AIF1RX1",
239 "AIF1RX2",
240 "AIF1RX3",
241 "AIF1RX4",
242 "AIF1RX5",
243 "AIF1RX6",
244 "AIF1RX7",
245 "AIF1RX8",
246 "AIF2RX1",
247 "AIF2RX2",
248 "AIF3RX1",
249 "AIF3RX2",
250 "EQ1",
251 "EQ2",
252 "EQ3",
253 "EQ4",
254 "DRC1L",
255 "DRC1R",
256 "LHPF1",
257 "LHPF2",
258 "LHPF3",
259 "LHPF4",
260 "DSP1.1",
261 "DSP1.2",
262 "DSP1.3",
263 "DSP1.4",
264 "DSP1.5",
265 "DSP1.6",
266 "DSP2.1",
267 "DSP2.2",
268 "DSP2.3",
269 "DSP2.4",
270 "DSP2.5",
271 "DSP2.6",
272 "DSP3.1",
273 "DSP3.2",
274 "DSP3.3",
275 "DSP3.4",
276 "DSP3.5",
277 "DSP3.6",
278 "ASRC1L",
279 "ASRC1R",
280 "ASRC2L",
281 "ASRC2R",
282 "ISRC1INT1",
283 "ISRC1INT2",
284 "ISRC1INT3",
285 "ISRC1INT4",
286 "ISRC2INT1",
287 "ISRC2INT2",
288 "ISRC2INT3",
289 "ISRC2INT4",
290 "ISRC1DEC1",
291 "ISRC1DEC2",
292 "ISRC1DEC3",
293 "ISRC1DEC4",
294 "ISRC2DEC1",
295 "ISRC2DEC2",
296 "ISRC2DEC3",
297 "ISRC2DEC4",
298 };
299
300 static int wm5100_mixer_values[] = {
301 0x00,
302 0x04, /* Tone */
303 0x05,
304 0x08, /* AEC */
305 0x10, /* Input */
306 0x11,
307 0x12,
308 0x13,
309 0x14,
310 0x15,
311 0x16,
312 0x17,
313 0x20, /* AIF */
314 0x21,
315 0x22,
316 0x23,
317 0x24,
318 0x25,
319 0x26,
320 0x27,
321 0x28,
322 0x29,
323 0x30, /* AIF3 - check */
324 0x31,
325 0x50, /* EQ */
326 0x51,
327 0x52,
328 0x53,
329 0x54,
330 0x58, /* DRC */
331 0x59,
332 0x60, /* LHPF1 */
333 0x61, /* LHPF2 */
334 0x62, /* LHPF3 */
335 0x63, /* LHPF4 */
336 0x68, /* DSP1 */
337 0x69,
338 0x6a,
339 0x6b,
340 0x6c,
341 0x6d,
342 0x70, /* DSP2 */
343 0x71,
344 0x72,
345 0x73,
346 0x74,
347 0x75,
348 0x78, /* DSP3 */
349 0x79,
350 0x7a,
351 0x7b,
352 0x7c,
353 0x7d,
354 0x90, /* ASRC1 */
355 0x91,
356 0x92, /* ASRC2 */
357 0x93,
358 0xa0, /* ISRC1DEC1 */
359 0xa1,
360 0xa2,
361 0xa3,
362 0xa4, /* ISRC1INT1 */
363 0xa5,
364 0xa6,
365 0xa7,
366 0xa8, /* ISRC2DEC1 */
367 0xa9,
368 0xaa,
369 0xab,
370 0xac, /* ISRC2INT1 */
371 0xad,
372 0xae,
373 0xaf,
374 };
375
376 #define WM5100_MIXER_CONTROLS(name, base) \
377 SOC_SINGLE_TLV(name " Input 1 Volume", base + 1 , \
378 WM5100_MIXER_VOL_SHIFT, 80, 0, mixer_tlv), \
379 SOC_SINGLE_TLV(name " Input 2 Volume", base + 3 , \
380 WM5100_MIXER_VOL_SHIFT, 80, 0, mixer_tlv), \
381 SOC_SINGLE_TLV(name " Input 3 Volume", base + 5 , \
382 WM5100_MIXER_VOL_SHIFT, 80, 0, mixer_tlv), \
383 SOC_SINGLE_TLV(name " Input 4 Volume", base + 7 , \
384 WM5100_MIXER_VOL_SHIFT, 80, 0, mixer_tlv)
385
386 #define WM5100_MUX_ENUM_DECL(name, reg) \
387 SOC_VALUE_ENUM_SINGLE_DECL(name, reg, 0, 0xff, \
388 wm5100_mixer_texts, wm5100_mixer_values)
389
390 #define WM5100_MUX_CTL_DECL(name) \
391 const struct snd_kcontrol_new name##_mux = \
392 SOC_DAPM_VALUE_ENUM("Route", name##_enum)
393
394 #define WM5100_MIXER_ENUMS(name, base_reg) \
395 static WM5100_MUX_ENUM_DECL(name##_in1_enum, base_reg); \
396 static WM5100_MUX_ENUM_DECL(name##_in2_enum, base_reg + 2); \
397 static WM5100_MUX_ENUM_DECL(name##_in3_enum, base_reg + 4); \
398 static WM5100_MUX_ENUM_DECL(name##_in4_enum, base_reg + 6); \
399 static WM5100_MUX_CTL_DECL(name##_in1); \
400 static WM5100_MUX_CTL_DECL(name##_in2); \
401 static WM5100_MUX_CTL_DECL(name##_in3); \
402 static WM5100_MUX_CTL_DECL(name##_in4)
403
404 WM5100_MIXER_ENUMS(HPOUT1L, WM5100_OUT1LMIX_INPUT_1_SOURCE);
405 WM5100_MIXER_ENUMS(HPOUT1R, WM5100_OUT1RMIX_INPUT_1_SOURCE);
406 WM5100_MIXER_ENUMS(HPOUT2L, WM5100_OUT2LMIX_INPUT_1_SOURCE);
407 WM5100_MIXER_ENUMS(HPOUT2R, WM5100_OUT2RMIX_INPUT_1_SOURCE);
408 WM5100_MIXER_ENUMS(HPOUT3L, WM5100_OUT3LMIX_INPUT_1_SOURCE);
409 WM5100_MIXER_ENUMS(HPOUT3R, WM5100_OUT3RMIX_INPUT_1_SOURCE);
410
411 WM5100_MIXER_ENUMS(SPKOUTL, WM5100_OUT4LMIX_INPUT_1_SOURCE);
412 WM5100_MIXER_ENUMS(SPKOUTR, WM5100_OUT4RMIX_INPUT_1_SOURCE);
413 WM5100_MIXER_ENUMS(SPKDAT1L, WM5100_OUT5LMIX_INPUT_1_SOURCE);
414 WM5100_MIXER_ENUMS(SPKDAT1R, WM5100_OUT5RMIX_INPUT_1_SOURCE);
415 WM5100_MIXER_ENUMS(SPKDAT2L, WM5100_OUT6LMIX_INPUT_1_SOURCE);
416 WM5100_MIXER_ENUMS(SPKDAT2R, WM5100_OUT6RMIX_INPUT_1_SOURCE);
417
418 WM5100_MIXER_ENUMS(PWM1, WM5100_PWM1MIX_INPUT_1_SOURCE);
419 WM5100_MIXER_ENUMS(PWM2, WM5100_PWM1MIX_INPUT_1_SOURCE);
420
421 WM5100_MIXER_ENUMS(AIF1TX1, WM5100_AIF1TX1MIX_INPUT_1_SOURCE);
422 WM5100_MIXER_ENUMS(AIF1TX2, WM5100_AIF1TX2MIX_INPUT_1_SOURCE);
423 WM5100_MIXER_ENUMS(AIF1TX3, WM5100_AIF1TX3MIX_INPUT_1_SOURCE);
424 WM5100_MIXER_ENUMS(AIF1TX4, WM5100_AIF1TX4MIX_INPUT_1_SOURCE);
425 WM5100_MIXER_ENUMS(AIF1TX5, WM5100_AIF1TX5MIX_INPUT_1_SOURCE);
426 WM5100_MIXER_ENUMS(AIF1TX6, WM5100_AIF1TX6MIX_INPUT_1_SOURCE);
427 WM5100_MIXER_ENUMS(AIF1TX7, WM5100_AIF1TX7MIX_INPUT_1_SOURCE);
428 WM5100_MIXER_ENUMS(AIF1TX8, WM5100_AIF1TX8MIX_INPUT_1_SOURCE);
429
430 WM5100_MIXER_ENUMS(AIF2TX1, WM5100_AIF2TX1MIX_INPUT_1_SOURCE);
431 WM5100_MIXER_ENUMS(AIF2TX2, WM5100_AIF2TX2MIX_INPUT_1_SOURCE);
432
433 WM5100_MIXER_ENUMS(AIF3TX1, WM5100_AIF1TX1MIX_INPUT_1_SOURCE);
434 WM5100_MIXER_ENUMS(AIF3TX2, WM5100_AIF1TX2MIX_INPUT_1_SOURCE);
435
436 WM5100_MIXER_ENUMS(EQ1, WM5100_EQ1MIX_INPUT_1_SOURCE);
437 WM5100_MIXER_ENUMS(EQ2, WM5100_EQ2MIX_INPUT_1_SOURCE);
438 WM5100_MIXER_ENUMS(EQ3, WM5100_EQ3MIX_INPUT_1_SOURCE);
439 WM5100_MIXER_ENUMS(EQ4, WM5100_EQ4MIX_INPUT_1_SOURCE);
440
441 WM5100_MIXER_ENUMS(DRC1L, WM5100_DRC1LMIX_INPUT_1_SOURCE);
442 WM5100_MIXER_ENUMS(DRC1R, WM5100_DRC1RMIX_INPUT_1_SOURCE);
443
444 WM5100_MIXER_ENUMS(LHPF1, WM5100_HPLP1MIX_INPUT_1_SOURCE);
445 WM5100_MIXER_ENUMS(LHPF2, WM5100_HPLP2MIX_INPUT_1_SOURCE);
446 WM5100_MIXER_ENUMS(LHPF3, WM5100_HPLP3MIX_INPUT_1_SOURCE);
447 WM5100_MIXER_ENUMS(LHPF4, WM5100_HPLP4MIX_INPUT_1_SOURCE);
448
449 #define WM5100_MUX(name, ctrl) \
450 SND_SOC_DAPM_VALUE_MUX(name, SND_SOC_NOPM, 0, 0, ctrl)
451
452 #define WM5100_MIXER_WIDGETS(name, name_str) \
453 WM5100_MUX(name_str " Input 1", &name##_in1_mux), \
454 WM5100_MUX(name_str " Input 2", &name##_in2_mux), \
455 WM5100_MUX(name_str " Input 3", &name##_in3_mux), \
456 WM5100_MUX(name_str " Input 4", &name##_in4_mux), \
457 SND_SOC_DAPM_MIXER(name_str " Mixer", SND_SOC_NOPM, 0, 0, NULL, 0)
458
459 #define WM5100_MIXER_INPUT_ROUTES(name) \
460 { name, "Tone Generator 1", "Tone Generator 1" }, \
461 { name, "Tone Generator 2", "Tone Generator 2" }, \
462 { name, "IN1L", "IN1L PGA" }, \
463 { name, "IN1R", "IN1R PGA" }, \
464 { name, "IN2L", "IN2L PGA" }, \
465 { name, "IN2R", "IN2R PGA" }, \
466 { name, "IN3L", "IN3L PGA" }, \
467 { name, "IN3R", "IN3R PGA" }, \
468 { name, "IN4L", "IN4L PGA" }, \
469 { name, "IN4R", "IN4R PGA" }, \
470 { name, "AIF1RX1", "AIF1RX1" }, \
471 { name, "AIF1RX2", "AIF1RX2" }, \
472 { name, "AIF1RX3", "AIF1RX3" }, \
473 { name, "AIF1RX4", "AIF1RX4" }, \
474 { name, "AIF1RX5", "AIF1RX5" }, \
475 { name, "AIF1RX6", "AIF1RX6" }, \
476 { name, "AIF1RX7", "AIF1RX7" }, \
477 { name, "AIF1RX8", "AIF1RX8" }, \
478 { name, "AIF2RX1", "AIF2RX1" }, \
479 { name, "AIF2RX2", "AIF2RX2" }, \
480 { name, "AIF3RX1", "AIF3RX1" }, \
481 { name, "AIF3RX2", "AIF3RX2" }, \
482 { name, "EQ1", "EQ1" }, \
483 { name, "EQ2", "EQ2" }, \
484 { name, "EQ3", "EQ3" }, \
485 { name, "EQ4", "EQ4" }, \
486 { name, "DRC1L", "DRC1L" }, \
487 { name, "DRC1R", "DRC1R" }, \
488 { name, "LHPF1", "LHPF1" }, \
489 { name, "LHPF2", "LHPF2" }, \
490 { name, "LHPF3", "LHPF3" }, \
491 { name, "LHPF4", "LHPF4" }
492
493 #define WM5100_MIXER_ROUTES(widget, name) \
494 { widget, NULL, name " Mixer" }, \
495 { name " Mixer", NULL, name " Input 1" }, \
496 { name " Mixer", NULL, name " Input 2" }, \
497 { name " Mixer", NULL, name " Input 3" }, \
498 { name " Mixer", NULL, name " Input 4" }, \
499 WM5100_MIXER_INPUT_ROUTES(name " Input 1"), \
500 WM5100_MIXER_INPUT_ROUTES(name " Input 2"), \
501 WM5100_MIXER_INPUT_ROUTES(name " Input 3"), \
502 WM5100_MIXER_INPUT_ROUTES(name " Input 4")
503
504 static const char *wm5100_lhpf_mode_text[] = {
505 "Low-pass", "High-pass"
506 };
507
508 static const struct soc_enum wm5100_lhpf1_mode =
509 SOC_ENUM_SINGLE(WM5100_HPLPF1_1, WM5100_LHPF1_MODE_SHIFT, 2,
510 wm5100_lhpf_mode_text);
511
512 static const struct soc_enum wm5100_lhpf2_mode =
513 SOC_ENUM_SINGLE(WM5100_HPLPF2_1, WM5100_LHPF2_MODE_SHIFT, 2,
514 wm5100_lhpf_mode_text);
515
516 static const struct soc_enum wm5100_lhpf3_mode =
517 SOC_ENUM_SINGLE(WM5100_HPLPF3_1, WM5100_LHPF3_MODE_SHIFT, 2,
518 wm5100_lhpf_mode_text);
519
520 static const struct soc_enum wm5100_lhpf4_mode =
521 SOC_ENUM_SINGLE(WM5100_HPLPF4_1, WM5100_LHPF4_MODE_SHIFT, 2,
522 wm5100_lhpf_mode_text);
523
524 static const struct snd_kcontrol_new wm5100_snd_controls[] = {
525 SOC_SINGLE("IN1 High Performance Switch", WM5100_IN1L_CONTROL,
526 WM5100_IN1_OSR_SHIFT, 1, 0),
527 SOC_SINGLE("IN2 High Performance Switch", WM5100_IN2L_CONTROL,
528 WM5100_IN2_OSR_SHIFT, 1, 0),
529 SOC_SINGLE("IN3 High Performance Switch", WM5100_IN3L_CONTROL,
530 WM5100_IN3_OSR_SHIFT, 1, 0),
531 SOC_SINGLE("IN4 High Performance Switch", WM5100_IN4L_CONTROL,
532 WM5100_IN4_OSR_SHIFT, 1, 0),
533
534 /* Only applicable for analogue inputs */
535 SOC_DOUBLE_R_TLV("IN1 Volume", WM5100_IN1L_CONTROL, WM5100_IN1R_CONTROL,
536 WM5100_IN1L_PGA_VOL_SHIFT, 94, 0, in_tlv),
537 SOC_DOUBLE_R_TLV("IN2 Volume", WM5100_IN2L_CONTROL, WM5100_IN2R_CONTROL,
538 WM5100_IN2L_PGA_VOL_SHIFT, 94, 0, in_tlv),
539 SOC_DOUBLE_R_TLV("IN3 Volume", WM5100_IN3L_CONTROL, WM5100_IN3R_CONTROL,
540 WM5100_IN3L_PGA_VOL_SHIFT, 94, 0, in_tlv),
541 SOC_DOUBLE_R_TLV("IN4 Volume", WM5100_IN4L_CONTROL, WM5100_IN4R_CONTROL,
542 WM5100_IN4L_PGA_VOL_SHIFT, 94, 0, in_tlv),
543
544 SOC_DOUBLE_R_TLV("IN1 Digital Volume", WM5100_ADC_DIGITAL_VOLUME_1L,
545 WM5100_ADC_DIGITAL_VOLUME_1R, WM5100_IN1L_VOL_SHIFT, 191,
546 0, digital_tlv),
547 SOC_DOUBLE_R_TLV("IN2 Digital Volume", WM5100_ADC_DIGITAL_VOLUME_2L,
548 WM5100_ADC_DIGITAL_VOLUME_2R, WM5100_IN2L_VOL_SHIFT, 191,
549 0, digital_tlv),
550 SOC_DOUBLE_R_TLV("IN3 Digital Volume", WM5100_ADC_DIGITAL_VOLUME_3L,
551 WM5100_ADC_DIGITAL_VOLUME_3R, WM5100_IN3L_VOL_SHIFT, 191,
552 0, digital_tlv),
553 SOC_DOUBLE_R_TLV("IN4 Digital Volume", WM5100_ADC_DIGITAL_VOLUME_4L,
554 WM5100_ADC_DIGITAL_VOLUME_4R, WM5100_IN4L_VOL_SHIFT, 191,
555 0, digital_tlv),
556
557 SOC_DOUBLE_R("IN1 Switch", WM5100_ADC_DIGITAL_VOLUME_1L,
558 WM5100_ADC_DIGITAL_VOLUME_1R, WM5100_IN1L_MUTE_SHIFT, 1, 1),
559 SOC_DOUBLE_R("IN2 Switch", WM5100_ADC_DIGITAL_VOLUME_2L,
560 WM5100_ADC_DIGITAL_VOLUME_2R, WM5100_IN2L_MUTE_SHIFT, 1, 1),
561 SOC_DOUBLE_R("IN3 Switch", WM5100_ADC_DIGITAL_VOLUME_3L,
562 WM5100_ADC_DIGITAL_VOLUME_3R, WM5100_IN3L_MUTE_SHIFT, 1, 1),
563 SOC_DOUBLE_R("IN4 Switch", WM5100_ADC_DIGITAL_VOLUME_4L,
564 WM5100_ADC_DIGITAL_VOLUME_4R, WM5100_IN4L_MUTE_SHIFT, 1, 1),
565
566 SOC_SINGLE("HPOUT1 High Performance Switch", WM5100_OUT_VOLUME_1L,
567 WM5100_OUT1_OSR_SHIFT, 1, 0),
568 SOC_SINGLE("HPOUT2 High Performance Switch", WM5100_OUT_VOLUME_2L,
569 WM5100_OUT2_OSR_SHIFT, 1, 0),
570 SOC_SINGLE("HPOUT3 High Performance Switch", WM5100_OUT_VOLUME_3L,
571 WM5100_OUT3_OSR_SHIFT, 1, 0),
572 SOC_SINGLE("SPKOUT High Performance Switch", WM5100_OUT_VOLUME_4L,
573 WM5100_OUT4_OSR_SHIFT, 1, 0),
574 SOC_SINGLE("SPKDAT1 High Performance Switch", WM5100_DAC_VOLUME_LIMIT_5L,
575 WM5100_OUT5_OSR_SHIFT, 1, 0),
576 SOC_SINGLE("SPKDAT2 High Performance Switch", WM5100_DAC_VOLUME_LIMIT_6L,
577 WM5100_OUT6_OSR_SHIFT, 1, 0),
578
579 SOC_DOUBLE_R_TLV("HPOUT1 Digital Volume", WM5100_DAC_DIGITAL_VOLUME_1L,
580 WM5100_DAC_DIGITAL_VOLUME_1R, WM5100_OUT1L_VOL_SHIFT, 159, 0,
581 digital_tlv),
582 SOC_DOUBLE_R_TLV("HPOUT2 Digital Volume", WM5100_DAC_DIGITAL_VOLUME_2L,
583 WM5100_DAC_DIGITAL_VOLUME_2R, WM5100_OUT2L_VOL_SHIFT, 159, 0,
584 digital_tlv),
585 SOC_DOUBLE_R_TLV("HPOUT3 Digital Volume", WM5100_DAC_DIGITAL_VOLUME_3L,
586 WM5100_DAC_DIGITAL_VOLUME_3R, WM5100_OUT3L_VOL_SHIFT, 159, 0,
587 digital_tlv),
588 SOC_DOUBLE_R_TLV("SPKOUT Digital Volume", WM5100_DAC_DIGITAL_VOLUME_4L,
589 WM5100_DAC_DIGITAL_VOLUME_4R, WM5100_OUT4L_VOL_SHIFT, 159, 0,
590 digital_tlv),
591 SOC_DOUBLE_R_TLV("SPKDAT1 Digital Volume", WM5100_DAC_DIGITAL_VOLUME_5L,
592 WM5100_DAC_DIGITAL_VOLUME_5R, WM5100_OUT5L_VOL_SHIFT, 159, 0,
593 digital_tlv),
594 SOC_DOUBLE_R_TLV("SPKDAT2 Digital Volume", WM5100_DAC_DIGITAL_VOLUME_6L,
595 WM5100_DAC_DIGITAL_VOLUME_6R, WM5100_OUT6L_VOL_SHIFT, 159, 0,
596 digital_tlv),
597
598 SOC_DOUBLE_R("HPOUT1 Digital Switch", WM5100_DAC_DIGITAL_VOLUME_1L,
599 WM5100_DAC_DIGITAL_VOLUME_1R, WM5100_OUT1L_MUTE_SHIFT, 1, 1),
600 SOC_DOUBLE_R("HPOUT2 Digital Switch", WM5100_DAC_DIGITAL_VOLUME_2L,
601 WM5100_DAC_DIGITAL_VOLUME_2R, WM5100_OUT2L_MUTE_SHIFT, 1, 1),
602 SOC_DOUBLE_R("HPOUT3 Digital Switch", WM5100_DAC_DIGITAL_VOLUME_3L,
603 WM5100_DAC_DIGITAL_VOLUME_3R, WM5100_OUT3L_MUTE_SHIFT, 1, 1),
604 SOC_DOUBLE_R("SPKOUT Digital Switch", WM5100_DAC_DIGITAL_VOLUME_4L,
605 WM5100_DAC_DIGITAL_VOLUME_4R, WM5100_OUT4L_MUTE_SHIFT, 1, 1),
606 SOC_DOUBLE_R("SPKDAT1 Digital Switch", WM5100_DAC_DIGITAL_VOLUME_5L,
607 WM5100_DAC_DIGITAL_VOLUME_5R, WM5100_OUT5L_MUTE_SHIFT, 1, 1),
608 SOC_DOUBLE_R("SPKDAT2 Digital Switch", WM5100_DAC_DIGITAL_VOLUME_6L,
609 WM5100_DAC_DIGITAL_VOLUME_6R, WM5100_OUT6L_MUTE_SHIFT, 1, 1),
610
611 /* FIXME: Only valid from -12dB to 0dB (52-64) */
612 SOC_DOUBLE_R_TLV("HPOUT1 Volume", WM5100_OUT_VOLUME_1L, WM5100_OUT_VOLUME_1R,
613 WM5100_OUT1L_PGA_VOL_SHIFT, 64, 0, out_tlv),
614 SOC_DOUBLE_R_TLV("HPOUT2 Volume", WM5100_OUT_VOLUME_2L, WM5100_OUT_VOLUME_2R,
615 WM5100_OUT2L_PGA_VOL_SHIFT, 64, 0, out_tlv),
616 SOC_DOUBLE_R_TLV("HPOUT3 Volume", WM5100_OUT_VOLUME_3L, WM5100_OUT_VOLUME_3R,
617 WM5100_OUT2L_PGA_VOL_SHIFT, 64, 0, out_tlv),
618
619 SOC_DOUBLE("SPKDAT1 Switch", WM5100_PDM_SPK1_CTRL_1, WM5100_SPK1L_MUTE_SHIFT,
620 WM5100_SPK1R_MUTE_SHIFT, 1, 1),
621 SOC_DOUBLE("SPKDAT2 Switch", WM5100_PDM_SPK2_CTRL_1, WM5100_SPK2L_MUTE_SHIFT,
622 WM5100_SPK2R_MUTE_SHIFT, 1, 1),
623
624 SOC_SINGLE_TLV("EQ1 Band 1 Volume", WM5100_EQ1_1, WM5100_EQ1_B1_GAIN_SHIFT,
625 24, 0, eq_tlv),
626 SOC_SINGLE_TLV("EQ1 Band 2 Volume", WM5100_EQ1_1, WM5100_EQ1_B2_GAIN_SHIFT,
627 24, 0, eq_tlv),
628 SOC_SINGLE_TLV("EQ1 Band 3 Volume", WM5100_EQ1_1, WM5100_EQ1_B3_GAIN_SHIFT,
629 24, 0, eq_tlv),
630 SOC_SINGLE_TLV("EQ1 Band 4 Volume", WM5100_EQ1_2, WM5100_EQ1_B4_GAIN_SHIFT,
631 24, 0, eq_tlv),
632 SOC_SINGLE_TLV("EQ1 Band 5 Volume", WM5100_EQ1_2, WM5100_EQ1_B5_GAIN_SHIFT,
633 24, 0, eq_tlv),
634
635 SOC_SINGLE_TLV("EQ2 Band 1 Volume", WM5100_EQ2_1, WM5100_EQ2_B1_GAIN_SHIFT,
636 24, 0, eq_tlv),
637 SOC_SINGLE_TLV("EQ2 Band 2 Volume", WM5100_EQ2_1, WM5100_EQ2_B2_GAIN_SHIFT,
638 24, 0, eq_tlv),
639 SOC_SINGLE_TLV("EQ2 Band 3 Volume", WM5100_EQ2_1, WM5100_EQ2_B3_GAIN_SHIFT,
640 24, 0, eq_tlv),
641 SOC_SINGLE_TLV("EQ2 Band 4 Volume", WM5100_EQ2_2, WM5100_EQ2_B4_GAIN_SHIFT,
642 24, 0, eq_tlv),
643 SOC_SINGLE_TLV("EQ2 Band 5 Volume", WM5100_EQ2_2, WM5100_EQ2_B5_GAIN_SHIFT,
644 24, 0, eq_tlv),
645
646 SOC_SINGLE_TLV("EQ3 Band 1 Volume", WM5100_EQ1_1, WM5100_EQ3_B1_GAIN_SHIFT,
647 24, 0, eq_tlv),
648 SOC_SINGLE_TLV("EQ3 Band 2 Volume", WM5100_EQ3_1, WM5100_EQ3_B2_GAIN_SHIFT,
649 24, 0, eq_tlv),
650 SOC_SINGLE_TLV("EQ3 Band 3 Volume", WM5100_EQ3_1, WM5100_EQ3_B3_GAIN_SHIFT,
651 24, 0, eq_tlv),
652 SOC_SINGLE_TLV("EQ3 Band 4 Volume", WM5100_EQ3_2, WM5100_EQ3_B4_GAIN_SHIFT,
653 24, 0, eq_tlv),
654 SOC_SINGLE_TLV("EQ3 Band 5 Volume", WM5100_EQ3_2, WM5100_EQ3_B5_GAIN_SHIFT,
655 24, 0, eq_tlv),
656
657 SOC_SINGLE_TLV("EQ4 Band 1 Volume", WM5100_EQ4_1, WM5100_EQ4_B1_GAIN_SHIFT,
658 24, 0, eq_tlv),
659 SOC_SINGLE_TLV("EQ4 Band 2 Volume", WM5100_EQ4_1, WM5100_EQ4_B2_GAIN_SHIFT,
660 24, 0, eq_tlv),
661 SOC_SINGLE_TLV("EQ4 Band 3 Volume", WM5100_EQ4_1, WM5100_EQ4_B3_GAIN_SHIFT,
662 24, 0, eq_tlv),
663 SOC_SINGLE_TLV("EQ4 Band 4 Volume", WM5100_EQ4_2, WM5100_EQ4_B4_GAIN_SHIFT,
664 24, 0, eq_tlv),
665 SOC_SINGLE_TLV("EQ4 Band 5 Volume", WM5100_EQ4_2, WM5100_EQ4_B5_GAIN_SHIFT,
666 24, 0, eq_tlv),
667
668 SOC_ENUM("LHPF1 Mode", wm5100_lhpf1_mode),
669 SOC_ENUM("LHPF2 Mode", wm5100_lhpf2_mode),
670 SOC_ENUM("LHPF3 Mode", wm5100_lhpf3_mode),
671 SOC_ENUM("LHPF4 Mode", wm5100_lhpf4_mode),
672
673 WM5100_MIXER_CONTROLS("HPOUT1L", WM5100_OUT1LMIX_INPUT_1_SOURCE),
674 WM5100_MIXER_CONTROLS("HPOUT1R", WM5100_OUT1RMIX_INPUT_1_SOURCE),
675 WM5100_MIXER_CONTROLS("HPOUT2L", WM5100_OUT2LMIX_INPUT_1_SOURCE),
676 WM5100_MIXER_CONTROLS("HPOUT2R", WM5100_OUT2RMIX_INPUT_1_SOURCE),
677 WM5100_MIXER_CONTROLS("HPOUT3L", WM5100_OUT3LMIX_INPUT_1_SOURCE),
678 WM5100_MIXER_CONTROLS("HPOUT3R", WM5100_OUT3RMIX_INPUT_1_SOURCE),
679
680 WM5100_MIXER_CONTROLS("SPKOUTL", WM5100_OUT4LMIX_INPUT_1_SOURCE),
681 WM5100_MIXER_CONTROLS("SPKOUTR", WM5100_OUT4RMIX_INPUT_1_SOURCE),
682 WM5100_MIXER_CONTROLS("SPKDAT1L", WM5100_OUT5LMIX_INPUT_1_SOURCE),
683 WM5100_MIXER_CONTROLS("SPKDAT1R", WM5100_OUT5RMIX_INPUT_1_SOURCE),
684 WM5100_MIXER_CONTROLS("SPKDAT2L", WM5100_OUT6LMIX_INPUT_1_SOURCE),
685 WM5100_MIXER_CONTROLS("SPKDAT2R", WM5100_OUT6RMIX_INPUT_1_SOURCE),
686
687 WM5100_MIXER_CONTROLS("PWM1", WM5100_PWM1MIX_INPUT_1_SOURCE),
688 WM5100_MIXER_CONTROLS("PWM2", WM5100_PWM2MIX_INPUT_1_SOURCE),
689
690 WM5100_MIXER_CONTROLS("AIF1TX1", WM5100_AIF1TX1MIX_INPUT_1_SOURCE),
691 WM5100_MIXER_CONTROLS("AIF1TX2", WM5100_AIF1TX2MIX_INPUT_1_SOURCE),
692 WM5100_MIXER_CONTROLS("AIF1TX3", WM5100_AIF1TX3MIX_INPUT_1_SOURCE),
693 WM5100_MIXER_CONTROLS("AIF1TX4", WM5100_AIF1TX4MIX_INPUT_1_SOURCE),
694 WM5100_MIXER_CONTROLS("AIF1TX5", WM5100_AIF1TX5MIX_INPUT_1_SOURCE),
695 WM5100_MIXER_CONTROLS("AIF1TX6", WM5100_AIF1TX6MIX_INPUT_1_SOURCE),
696 WM5100_MIXER_CONTROLS("AIF1TX7", WM5100_AIF1TX7MIX_INPUT_1_SOURCE),
697 WM5100_MIXER_CONTROLS("AIF1TX8", WM5100_AIF1TX8MIX_INPUT_1_SOURCE),
698
699 WM5100_MIXER_CONTROLS("AIF2TX1", WM5100_AIF2TX1MIX_INPUT_1_SOURCE),
700 WM5100_MIXER_CONTROLS("AIF2TX2", WM5100_AIF2TX2MIX_INPUT_1_SOURCE),
701
702 WM5100_MIXER_CONTROLS("AIF3TX1", WM5100_AIF3TX1MIX_INPUT_1_SOURCE),
703 WM5100_MIXER_CONTROLS("AIF3TX2", WM5100_AIF3TX2MIX_INPUT_1_SOURCE),
704
705 WM5100_MIXER_CONTROLS("EQ1", WM5100_EQ1MIX_INPUT_1_SOURCE),
706 WM5100_MIXER_CONTROLS("EQ2", WM5100_EQ2MIX_INPUT_1_SOURCE),
707 WM5100_MIXER_CONTROLS("EQ3", WM5100_EQ3MIX_INPUT_1_SOURCE),
708 WM5100_MIXER_CONTROLS("EQ4", WM5100_EQ4MIX_INPUT_1_SOURCE),
709
710 WM5100_MIXER_CONTROLS("DRC1L", WM5100_DRC1LMIX_INPUT_1_SOURCE),
711 WM5100_MIXER_CONTROLS("DRC1R", WM5100_DRC1RMIX_INPUT_1_SOURCE),
712 SND_SOC_BYTES_MASK("DRC", WM5100_DRC1_CTRL1, 5,
713 WM5100_DRCL_ENA | WM5100_DRCR_ENA),
714
715 WM5100_MIXER_CONTROLS("LHPF1", WM5100_HPLP1MIX_INPUT_1_SOURCE),
716 WM5100_MIXER_CONTROLS("LHPF2", WM5100_HPLP2MIX_INPUT_1_SOURCE),
717 WM5100_MIXER_CONTROLS("LHPF3", WM5100_HPLP3MIX_INPUT_1_SOURCE),
718 WM5100_MIXER_CONTROLS("LHPF4", WM5100_HPLP4MIX_INPUT_1_SOURCE),
719 };
720
721 static void wm5100_seq_notifier(struct snd_soc_dapm_context *dapm,
722 enum snd_soc_dapm_type event, int subseq)
723 {
724 struct snd_soc_codec *codec = container_of(dapm,
725 struct snd_soc_codec, dapm);
726 struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec);
727 u16 val, expect, i;
728
729 /* Wait for the outputs to flag themselves as enabled */
730 if (wm5100->out_ena[0]) {
731 expect = snd_soc_read(codec, WM5100_CHANNEL_ENABLES_1);
732 for (i = 0; i < 200; i++) {
733 val = snd_soc_read(codec, WM5100_OUTPUT_STATUS_1);
734 if (val == expect) {
735 wm5100->out_ena[0] = false;
736 break;
737 }
738 }
739 if (i == 200) {
740 dev_err(codec->dev, "Timeout waiting for OUTPUT1 %x\n",
741 expect);
742 }
743 }
744
745 if (wm5100->out_ena[1]) {
746 expect = snd_soc_read(codec, WM5100_OUTPUT_ENABLES_2);
747 for (i = 0; i < 200; i++) {
748 val = snd_soc_read(codec, WM5100_OUTPUT_STATUS_2);
749 if (val == expect) {
750 wm5100->out_ena[1] = false;
751 break;
752 }
753 }
754 if (i == 200) {
755 dev_err(codec->dev, "Timeout waiting for OUTPUT2 %x\n",
756 expect);
757 }
758 }
759 }
760
761 static int wm5100_out_ev(struct snd_soc_dapm_widget *w,
762 struct snd_kcontrol *kcontrol,
763 int event)
764 {
765 struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(w->codec);
766
767 switch (w->reg) {
768 case WM5100_CHANNEL_ENABLES_1:
769 wm5100->out_ena[0] = true;
770 break;
771 case WM5100_OUTPUT_ENABLES_2:
772 wm5100->out_ena[0] = true;
773 break;
774 default:
775 break;
776 }
777
778 return 0;
779 }
780
781 static void wm5100_log_status3(struct wm5100_priv *wm5100, int val)
782 {
783 if (val & WM5100_SPK_SHUTDOWN_WARN_EINT)
784 dev_crit(wm5100->dev, "Speaker shutdown warning\n");
785 if (val & WM5100_SPK_SHUTDOWN_EINT)
786 dev_crit(wm5100->dev, "Speaker shutdown\n");
787 if (val & WM5100_CLKGEN_ERR_EINT)
788 dev_crit(wm5100->dev, "SYSCLK underclocked\n");
789 if (val & WM5100_CLKGEN_ERR_ASYNC_EINT)
790 dev_crit(wm5100->dev, "ASYNCCLK underclocked\n");
791 }
792
793 static void wm5100_log_status4(struct wm5100_priv *wm5100, int val)
794 {
795 if (val & WM5100_AIF3_ERR_EINT)
796 dev_err(wm5100->dev, "AIF3 configuration error\n");
797 if (val & WM5100_AIF2_ERR_EINT)
798 dev_err(wm5100->dev, "AIF2 configuration error\n");
799 if (val & WM5100_AIF1_ERR_EINT)
800 dev_err(wm5100->dev, "AIF1 configuration error\n");
801 if (val & WM5100_CTRLIF_ERR_EINT)
802 dev_err(wm5100->dev, "Control interface error\n");
803 if (val & WM5100_ISRC2_UNDERCLOCKED_EINT)
804 dev_err(wm5100->dev, "ISRC2 underclocked\n");
805 if (val & WM5100_ISRC1_UNDERCLOCKED_EINT)
806 dev_err(wm5100->dev, "ISRC1 underclocked\n");
807 if (val & WM5100_FX_UNDERCLOCKED_EINT)
808 dev_err(wm5100->dev, "FX underclocked\n");
809 if (val & WM5100_AIF3_UNDERCLOCKED_EINT)
810 dev_err(wm5100->dev, "AIF3 underclocked\n");
811 if (val & WM5100_AIF2_UNDERCLOCKED_EINT)
812 dev_err(wm5100->dev, "AIF2 underclocked\n");
813 if (val & WM5100_AIF1_UNDERCLOCKED_EINT)
814 dev_err(wm5100->dev, "AIF1 underclocked\n");
815 if (val & WM5100_ASRC_UNDERCLOCKED_EINT)
816 dev_err(wm5100->dev, "ASRC underclocked\n");
817 if (val & WM5100_DAC_UNDERCLOCKED_EINT)
818 dev_err(wm5100->dev, "DAC underclocked\n");
819 if (val & WM5100_ADC_UNDERCLOCKED_EINT)
820 dev_err(wm5100->dev, "ADC underclocked\n");
821 if (val & WM5100_MIXER_UNDERCLOCKED_EINT)
822 dev_err(wm5100->dev, "Mixer underclocked\n");
823 }
824
825 static int wm5100_post_ev(struct snd_soc_dapm_widget *w,
826 struct snd_kcontrol *kcontrol,
827 int event)
828 {
829 struct snd_soc_codec *codec = w->codec;
830 struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec);
831 int ret;
832
833 ret = snd_soc_read(codec, WM5100_INTERRUPT_RAW_STATUS_3);
834 ret &= WM5100_SPK_SHUTDOWN_WARN_STS |
835 WM5100_SPK_SHUTDOWN_STS | WM5100_CLKGEN_ERR_STS |
836 WM5100_CLKGEN_ERR_ASYNC_STS;
837 wm5100_log_status3(wm5100, ret);
838
839 ret = snd_soc_read(codec, WM5100_INTERRUPT_RAW_STATUS_4);
840 wm5100_log_status4(wm5100, ret);
841
842 return 0;
843 }
844
845 static const struct snd_soc_dapm_widget wm5100_dapm_widgets[] = {
846 SND_SOC_DAPM_SUPPLY("SYSCLK", WM5100_CLOCKING_3, WM5100_SYSCLK_ENA_SHIFT, 0,
847 NULL, 0),
848 SND_SOC_DAPM_SUPPLY("ASYNCCLK", WM5100_CLOCKING_6, WM5100_ASYNC_CLK_ENA_SHIFT,
849 0, NULL, 0),
850
851 SND_SOC_DAPM_REGULATOR_SUPPLY("CPVDD", 20),
852 SND_SOC_DAPM_REGULATOR_SUPPLY("DBVDD2", 0),
853 SND_SOC_DAPM_REGULATOR_SUPPLY("DBVDD3", 0),
854
855 SND_SOC_DAPM_SUPPLY("CP1", WM5100_HP_CHARGE_PUMP_1, WM5100_CP1_ENA_SHIFT, 0,
856 NULL, 0),
857 SND_SOC_DAPM_SUPPLY("CP2", WM5100_MIC_CHARGE_PUMP_1, WM5100_CP2_ENA_SHIFT, 0,
858 NULL, 0),
859 SND_SOC_DAPM_SUPPLY("CP2 Active", WM5100_MIC_CHARGE_PUMP_1,
860 WM5100_CP2_BYPASS_SHIFT, 1, NULL, 0),
861
862 SND_SOC_DAPM_SUPPLY("MICBIAS1", WM5100_MIC_BIAS_CTRL_1, WM5100_MICB1_ENA_SHIFT,
863 0, NULL, 0),
864 SND_SOC_DAPM_SUPPLY("MICBIAS2", WM5100_MIC_BIAS_CTRL_2, WM5100_MICB2_ENA_SHIFT,
865 0, NULL, 0),
866 SND_SOC_DAPM_SUPPLY("MICBIAS3", WM5100_MIC_BIAS_CTRL_3, WM5100_MICB3_ENA_SHIFT,
867 0, NULL, 0),
868
869 SND_SOC_DAPM_INPUT("IN1L"),
870 SND_SOC_DAPM_INPUT("IN1R"),
871 SND_SOC_DAPM_INPUT("IN2L"),
872 SND_SOC_DAPM_INPUT("IN2R"),
873 SND_SOC_DAPM_INPUT("IN3L"),
874 SND_SOC_DAPM_INPUT("IN3R"),
875 SND_SOC_DAPM_INPUT("IN4L"),
876 SND_SOC_DAPM_INPUT("IN4R"),
877 SND_SOC_DAPM_SIGGEN("TONE"),
878
879 SND_SOC_DAPM_PGA_E("IN1L PGA", WM5100_INPUT_ENABLES, WM5100_IN1L_ENA_SHIFT, 0,
880 NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
881 SND_SOC_DAPM_PGA_E("IN1R PGA", WM5100_INPUT_ENABLES, WM5100_IN1R_ENA_SHIFT, 0,
882 NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
883 SND_SOC_DAPM_PGA_E("IN2L PGA", WM5100_INPUT_ENABLES, WM5100_IN2L_ENA_SHIFT, 0,
884 NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
885 SND_SOC_DAPM_PGA_E("IN2R PGA", WM5100_INPUT_ENABLES, WM5100_IN2R_ENA_SHIFT, 0,
886 NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
887 SND_SOC_DAPM_PGA_E("IN3L PGA", WM5100_INPUT_ENABLES, WM5100_IN3L_ENA_SHIFT, 0,
888 NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
889 SND_SOC_DAPM_PGA_E("IN3R PGA", WM5100_INPUT_ENABLES, WM5100_IN3R_ENA_SHIFT, 0,
890 NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
891 SND_SOC_DAPM_PGA_E("IN4L PGA", WM5100_INPUT_ENABLES, WM5100_IN4L_ENA_SHIFT, 0,
892 NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
893 SND_SOC_DAPM_PGA_E("IN4R PGA", WM5100_INPUT_ENABLES, WM5100_IN4R_ENA_SHIFT, 0,
894 NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
895
896 SND_SOC_DAPM_PGA("Tone Generator 1", WM5100_TONE_GENERATOR_1,
897 WM5100_TONE1_ENA_SHIFT, 0, NULL, 0),
898 SND_SOC_DAPM_PGA("Tone Generator 2", WM5100_TONE_GENERATOR_1,
899 WM5100_TONE2_ENA_SHIFT, 0, NULL, 0),
900
901 SND_SOC_DAPM_AIF_IN("AIF1RX1", "AIF1 Playback", 0,
902 WM5100_AUDIO_IF_1_27, WM5100_AIF1RX1_ENA_SHIFT, 0),
903 SND_SOC_DAPM_AIF_IN("AIF1RX2", "AIF1 Playback", 1,
904 WM5100_AUDIO_IF_1_27, WM5100_AIF1RX2_ENA_SHIFT, 0),
905 SND_SOC_DAPM_AIF_IN("AIF1RX3", "AIF1 Playback", 2,
906 WM5100_AUDIO_IF_1_27, WM5100_AIF1RX3_ENA_SHIFT, 0),
907 SND_SOC_DAPM_AIF_IN("AIF1RX4", "AIF1 Playback", 3,
908 WM5100_AUDIO_IF_1_27, WM5100_AIF1RX4_ENA_SHIFT, 0),
909 SND_SOC_DAPM_AIF_IN("AIF1RX5", "AIF1 Playback", 4,
910 WM5100_AUDIO_IF_1_27, WM5100_AIF1RX5_ENA_SHIFT, 0),
911 SND_SOC_DAPM_AIF_IN("AIF1RX6", "AIF1 Playback", 5,
912 WM5100_AUDIO_IF_1_27, WM5100_AIF1RX6_ENA_SHIFT, 0),
913 SND_SOC_DAPM_AIF_IN("AIF1RX7", "AIF1 Playback", 6,
914 WM5100_AUDIO_IF_1_27, WM5100_AIF1RX7_ENA_SHIFT, 0),
915 SND_SOC_DAPM_AIF_IN("AIF1RX8", "AIF1 Playback", 7,
916 WM5100_AUDIO_IF_1_27, WM5100_AIF1RX8_ENA_SHIFT, 0),
917
918 SND_SOC_DAPM_AIF_IN("AIF2RX1", "AIF2 Playback", 0,
919 WM5100_AUDIO_IF_2_27, WM5100_AIF2RX1_ENA_SHIFT, 0),
920 SND_SOC_DAPM_AIF_IN("AIF2RX2", "AIF2 Playback", 1,
921 WM5100_AUDIO_IF_2_27, WM5100_AIF2RX2_ENA_SHIFT, 0),
922
923 SND_SOC_DAPM_AIF_IN("AIF3RX1", "AIF3 Playback", 0,
924 WM5100_AUDIO_IF_3_27, WM5100_AIF3RX1_ENA_SHIFT, 0),
925 SND_SOC_DAPM_AIF_IN("AIF3RX2", "AIF3 Playback", 1,
926 WM5100_AUDIO_IF_3_27, WM5100_AIF3RX2_ENA_SHIFT, 0),
927
928 SND_SOC_DAPM_AIF_OUT("AIF1TX1", "AIF1 Capture", 0,
929 WM5100_AUDIO_IF_1_26, WM5100_AIF1TX1_ENA_SHIFT, 0),
930 SND_SOC_DAPM_AIF_OUT("AIF1TX2", "AIF1 Capture", 1,
931 WM5100_AUDIO_IF_1_26, WM5100_AIF1TX2_ENA_SHIFT, 0),
932 SND_SOC_DAPM_AIF_OUT("AIF1TX3", "AIF1 Capture", 2,
933 WM5100_AUDIO_IF_1_26, WM5100_AIF1TX3_ENA_SHIFT, 0),
934 SND_SOC_DAPM_AIF_OUT("AIF1TX4", "AIF1 Capture", 3,
935 WM5100_AUDIO_IF_1_26, WM5100_AIF1TX4_ENA_SHIFT, 0),
936 SND_SOC_DAPM_AIF_OUT("AIF1TX5", "AIF1 Capture", 4,
937 WM5100_AUDIO_IF_1_26, WM5100_AIF1TX5_ENA_SHIFT, 0),
938 SND_SOC_DAPM_AIF_OUT("AIF1TX6", "AIF1 Capture", 5,
939 WM5100_AUDIO_IF_1_26, WM5100_AIF1TX6_ENA_SHIFT, 0),
940 SND_SOC_DAPM_AIF_OUT("AIF1TX7", "AIF1 Capture", 6,
941 WM5100_AUDIO_IF_1_26, WM5100_AIF1TX7_ENA_SHIFT, 0),
942 SND_SOC_DAPM_AIF_OUT("AIF1TX8", "AIF1 Capture", 7,
943 WM5100_AUDIO_IF_1_26, WM5100_AIF1TX8_ENA_SHIFT, 0),
944
945 SND_SOC_DAPM_AIF_OUT("AIF2TX1", "AIF2 Capture", 0,
946 WM5100_AUDIO_IF_2_26, WM5100_AIF2TX1_ENA_SHIFT, 0),
947 SND_SOC_DAPM_AIF_OUT("AIF2TX2", "AIF2 Capture", 1,
948 WM5100_AUDIO_IF_2_26, WM5100_AIF2TX2_ENA_SHIFT, 0),
949
950 SND_SOC_DAPM_AIF_OUT("AIF3TX1", "AIF3 Capture", 0,
951 WM5100_AUDIO_IF_3_26, WM5100_AIF3TX1_ENA_SHIFT, 0),
952 SND_SOC_DAPM_AIF_OUT("AIF3TX2", "AIF3 Capture", 1,
953 WM5100_AUDIO_IF_3_26, WM5100_AIF3TX2_ENA_SHIFT, 0),
954
955 SND_SOC_DAPM_PGA_E("OUT6L", WM5100_OUTPUT_ENABLES_2, WM5100_OUT6L_ENA_SHIFT, 0,
956 NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
957 SND_SOC_DAPM_PGA_E("OUT6R", WM5100_OUTPUT_ENABLES_2, WM5100_OUT6R_ENA_SHIFT, 0,
958 NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
959 SND_SOC_DAPM_PGA_E("OUT5L", WM5100_OUTPUT_ENABLES_2, WM5100_OUT5L_ENA_SHIFT, 0,
960 NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
961 SND_SOC_DAPM_PGA_E("OUT5R", WM5100_OUTPUT_ENABLES_2, WM5100_OUT5R_ENA_SHIFT, 0,
962 NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
963 SND_SOC_DAPM_PGA_E("OUT4L", WM5100_OUTPUT_ENABLES_2, WM5100_OUT4L_ENA_SHIFT, 0,
964 NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
965 SND_SOC_DAPM_PGA_E("OUT4R", WM5100_OUTPUT_ENABLES_2, WM5100_OUT4R_ENA_SHIFT, 0,
966 NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
967 SND_SOC_DAPM_PGA_E("OUT3L", WM5100_CHANNEL_ENABLES_1, WM5100_HP3L_ENA_SHIFT, 0,
968 NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
969 SND_SOC_DAPM_PGA_E("OUT3R", WM5100_CHANNEL_ENABLES_1, WM5100_HP3R_ENA_SHIFT, 0,
970 NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
971 SND_SOC_DAPM_PGA_E("OUT2L", WM5100_CHANNEL_ENABLES_1, WM5100_HP2L_ENA_SHIFT, 0,
972 NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
973 SND_SOC_DAPM_PGA_E("OUT2R", WM5100_CHANNEL_ENABLES_1, WM5100_HP2R_ENA_SHIFT, 0,
974 NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
975 SND_SOC_DAPM_PGA_E("OUT1L", WM5100_CHANNEL_ENABLES_1, WM5100_HP1L_ENA_SHIFT, 0,
976 NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
977 SND_SOC_DAPM_PGA_E("OUT1R", WM5100_CHANNEL_ENABLES_1, WM5100_HP1R_ENA_SHIFT, 0,
978 NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
979 SND_SOC_DAPM_PGA_E("PWM1 Driver", WM5100_PWM_DRIVE_1, WM5100_PWM1_ENA_SHIFT, 0,
980 NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
981 SND_SOC_DAPM_PGA_E("PWM2 Driver", WM5100_PWM_DRIVE_1, WM5100_PWM2_ENA_SHIFT, 0,
982 NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
983
984 SND_SOC_DAPM_PGA("EQ1", WM5100_EQ1_1, WM5100_EQ1_ENA_SHIFT, 0, NULL, 0),
985 SND_SOC_DAPM_PGA("EQ2", WM5100_EQ2_1, WM5100_EQ2_ENA_SHIFT, 0, NULL, 0),
986 SND_SOC_DAPM_PGA("EQ3", WM5100_EQ3_1, WM5100_EQ3_ENA_SHIFT, 0, NULL, 0),
987 SND_SOC_DAPM_PGA("EQ4", WM5100_EQ4_1, WM5100_EQ4_ENA_SHIFT, 0, NULL, 0),
988
989 SND_SOC_DAPM_PGA("DRC1L", WM5100_DRC1_CTRL1, WM5100_DRCL_ENA_SHIFT, 0,
990 NULL, 0),
991 SND_SOC_DAPM_PGA("DRC1R", WM5100_DRC1_CTRL1, WM5100_DRCR_ENA_SHIFT, 0,
992 NULL, 0),
993
994 SND_SOC_DAPM_PGA("LHPF1", WM5100_HPLPF1_1, WM5100_LHPF1_ENA_SHIFT, 0,
995 NULL, 0),
996 SND_SOC_DAPM_PGA("LHPF2", WM5100_HPLPF2_1, WM5100_LHPF2_ENA_SHIFT, 0,
997 NULL, 0),
998 SND_SOC_DAPM_PGA("LHPF3", WM5100_HPLPF3_1, WM5100_LHPF3_ENA_SHIFT, 0,
999 NULL, 0),
1000 SND_SOC_DAPM_PGA("LHPF4", WM5100_HPLPF4_1, WM5100_LHPF4_ENA_SHIFT, 0,
1001 NULL, 0),
1002
1003 WM5100_MIXER_WIDGETS(EQ1, "EQ1"),
1004 WM5100_MIXER_WIDGETS(EQ2, "EQ2"),
1005 WM5100_MIXER_WIDGETS(EQ3, "EQ3"),
1006 WM5100_MIXER_WIDGETS(EQ4, "EQ4"),
1007
1008 WM5100_MIXER_WIDGETS(DRC1L, "DRC1L"),
1009 WM5100_MIXER_WIDGETS(DRC1R, "DRC1R"),
1010
1011 WM5100_MIXER_WIDGETS(LHPF1, "LHPF1"),
1012 WM5100_MIXER_WIDGETS(LHPF2, "LHPF2"),
1013 WM5100_MIXER_WIDGETS(LHPF3, "LHPF3"),
1014 WM5100_MIXER_WIDGETS(LHPF4, "LHPF4"),
1015
1016 WM5100_MIXER_WIDGETS(AIF1TX1, "AIF1TX1"),
1017 WM5100_MIXER_WIDGETS(AIF1TX2, "AIF1TX2"),
1018 WM5100_MIXER_WIDGETS(AIF1TX3, "AIF1TX3"),
1019 WM5100_MIXER_WIDGETS(AIF1TX4, "AIF1TX4"),
1020 WM5100_MIXER_WIDGETS(AIF1TX5, "AIF1TX5"),
1021 WM5100_MIXER_WIDGETS(AIF1TX6, "AIF1TX6"),
1022 WM5100_MIXER_WIDGETS(AIF1TX7, "AIF1TX7"),
1023 WM5100_MIXER_WIDGETS(AIF1TX8, "AIF1TX8"),
1024
1025 WM5100_MIXER_WIDGETS(AIF2TX1, "AIF2TX1"),
1026 WM5100_MIXER_WIDGETS(AIF2TX2, "AIF2TX2"),
1027
1028 WM5100_MIXER_WIDGETS(AIF3TX1, "AIF3TX1"),
1029 WM5100_MIXER_WIDGETS(AIF3TX2, "AIF3TX2"),
1030
1031 WM5100_MIXER_WIDGETS(HPOUT1L, "HPOUT1L"),
1032 WM5100_MIXER_WIDGETS(HPOUT1R, "HPOUT1R"),
1033 WM5100_MIXER_WIDGETS(HPOUT2L, "HPOUT2L"),
1034 WM5100_MIXER_WIDGETS(HPOUT2R, "HPOUT2R"),
1035 WM5100_MIXER_WIDGETS(HPOUT3L, "HPOUT3L"),
1036 WM5100_MIXER_WIDGETS(HPOUT3R, "HPOUT3R"),
1037
1038 WM5100_MIXER_WIDGETS(SPKOUTL, "SPKOUTL"),
1039 WM5100_MIXER_WIDGETS(SPKOUTR, "SPKOUTR"),
1040 WM5100_MIXER_WIDGETS(SPKDAT1L, "SPKDAT1L"),
1041 WM5100_MIXER_WIDGETS(SPKDAT1R, "SPKDAT1R"),
1042 WM5100_MIXER_WIDGETS(SPKDAT2L, "SPKDAT2L"),
1043 WM5100_MIXER_WIDGETS(SPKDAT2R, "SPKDAT2R"),
1044
1045 WM5100_MIXER_WIDGETS(PWM1, "PWM1"),
1046 WM5100_MIXER_WIDGETS(PWM2, "PWM2"),
1047
1048 SND_SOC_DAPM_OUTPUT("HPOUT1L"),
1049 SND_SOC_DAPM_OUTPUT("HPOUT1R"),
1050 SND_SOC_DAPM_OUTPUT("HPOUT2L"),
1051 SND_SOC_DAPM_OUTPUT("HPOUT2R"),
1052 SND_SOC_DAPM_OUTPUT("HPOUT3L"),
1053 SND_SOC_DAPM_OUTPUT("HPOUT3R"),
1054 SND_SOC_DAPM_OUTPUT("SPKOUTL"),
1055 SND_SOC_DAPM_OUTPUT("SPKOUTR"),
1056 SND_SOC_DAPM_OUTPUT("SPKDAT1"),
1057 SND_SOC_DAPM_OUTPUT("SPKDAT2"),
1058 SND_SOC_DAPM_OUTPUT("PWM1"),
1059 SND_SOC_DAPM_OUTPUT("PWM2"),
1060 };
1061
1062 /* We register a _POST event if we don't have IRQ support so we can
1063 * look at the error status from the CODEC - if we've got the IRQ
1064 * hooked up then we will get prompted to look by an interrupt.
1065 */
1066 static const struct snd_soc_dapm_widget wm5100_dapm_widgets_noirq[] = {
1067 SND_SOC_DAPM_POST("Post", wm5100_post_ev),
1068 };
1069
1070 static const struct snd_soc_dapm_route wm5100_dapm_routes[] = {
1071 { "CP1", NULL, "CPVDD" },
1072 { "CP2 Active", NULL, "CPVDD" },
1073
1074 { "IN1L", NULL, "SYSCLK" },
1075 { "IN1R", NULL, "SYSCLK" },
1076 { "IN2L", NULL, "SYSCLK" },
1077 { "IN2R", NULL, "SYSCLK" },
1078 { "IN3L", NULL, "SYSCLK" },
1079 { "IN3R", NULL, "SYSCLK" },
1080 { "IN4L", NULL, "SYSCLK" },
1081 { "IN4R", NULL, "SYSCLK" },
1082
1083 { "OUT1L", NULL, "SYSCLK" },
1084 { "OUT1R", NULL, "SYSCLK" },
1085 { "OUT2L", NULL, "SYSCLK" },
1086 { "OUT2R", NULL, "SYSCLK" },
1087 { "OUT3L", NULL, "SYSCLK" },
1088 { "OUT3R", NULL, "SYSCLK" },
1089 { "OUT4L", NULL, "SYSCLK" },
1090 { "OUT4R", NULL, "SYSCLK" },
1091 { "OUT5L", NULL, "SYSCLK" },
1092 { "OUT5R", NULL, "SYSCLK" },
1093 { "OUT6L", NULL, "SYSCLK" },
1094 { "OUT6R", NULL, "SYSCLK" },
1095
1096 { "AIF1RX1", NULL, "SYSCLK" },
1097 { "AIF1RX2", NULL, "SYSCLK" },
1098 { "AIF1RX3", NULL, "SYSCLK" },
1099 { "AIF1RX4", NULL, "SYSCLK" },
1100 { "AIF1RX5", NULL, "SYSCLK" },
1101 { "AIF1RX6", NULL, "SYSCLK" },
1102 { "AIF1RX7", NULL, "SYSCLK" },
1103 { "AIF1RX8", NULL, "SYSCLK" },
1104
1105 { "AIF2RX1", NULL, "SYSCLK" },
1106 { "AIF2RX1", NULL, "DBVDD2" },
1107 { "AIF2RX2", NULL, "SYSCLK" },
1108 { "AIF2RX2", NULL, "DBVDD2" },
1109
1110 { "AIF3RX1", NULL, "SYSCLK" },
1111 { "AIF3RX1", NULL, "DBVDD3" },
1112 { "AIF3RX2", NULL, "SYSCLK" },
1113 { "AIF3RX2", NULL, "DBVDD3" },
1114
1115 { "AIF1TX1", NULL, "SYSCLK" },
1116 { "AIF1TX2", NULL, "SYSCLK" },
1117 { "AIF1TX3", NULL, "SYSCLK" },
1118 { "AIF1TX4", NULL, "SYSCLK" },
1119 { "AIF1TX5", NULL, "SYSCLK" },
1120 { "AIF1TX6", NULL, "SYSCLK" },
1121 { "AIF1TX7", NULL, "SYSCLK" },
1122 { "AIF1TX8", NULL, "SYSCLK" },
1123
1124 { "AIF2TX1", NULL, "SYSCLK" },
1125 { "AIF2TX1", NULL, "DBVDD2" },
1126 { "AIF2TX2", NULL, "SYSCLK" },
1127 { "AIF2TX2", NULL, "DBVDD2" },
1128
1129 { "AIF3TX1", NULL, "SYSCLK" },
1130 { "AIF3TX1", NULL, "DBVDD3" },
1131 { "AIF3TX2", NULL, "SYSCLK" },
1132 { "AIF3TX2", NULL, "DBVDD3" },
1133
1134 { "MICBIAS1", NULL, "CP2" },
1135 { "MICBIAS2", NULL, "CP2" },
1136 { "MICBIAS3", NULL, "CP2" },
1137
1138 { "IN1L PGA", NULL, "CP2" },
1139 { "IN1R PGA", NULL, "CP2" },
1140 { "IN2L PGA", NULL, "CP2" },
1141 { "IN2R PGA", NULL, "CP2" },
1142 { "IN3L PGA", NULL, "CP2" },
1143 { "IN3R PGA", NULL, "CP2" },
1144 { "IN4L PGA", NULL, "CP2" },
1145 { "IN4R PGA", NULL, "CP2" },
1146
1147 { "IN1L PGA", NULL, "CP2 Active" },
1148 { "IN1R PGA", NULL, "CP2 Active" },
1149 { "IN2L PGA", NULL, "CP2 Active" },
1150 { "IN2R PGA", NULL, "CP2 Active" },
1151 { "IN3L PGA", NULL, "CP2 Active" },
1152 { "IN3R PGA", NULL, "CP2 Active" },
1153 { "IN4L PGA", NULL, "CP2 Active" },
1154 { "IN4R PGA", NULL, "CP2 Active" },
1155
1156 { "OUT1L", NULL, "CP1" },
1157 { "OUT1R", NULL, "CP1" },
1158 { "OUT2L", NULL, "CP1" },
1159 { "OUT2R", NULL, "CP1" },
1160 { "OUT3L", NULL, "CP1" },
1161 { "OUT3R", NULL, "CP1" },
1162
1163 { "Tone Generator 1", NULL, "TONE" },
1164 { "Tone Generator 2", NULL, "TONE" },
1165
1166 { "IN1L PGA", NULL, "IN1L" },
1167 { "IN1R PGA", NULL, "IN1R" },
1168 { "IN2L PGA", NULL, "IN2L" },
1169 { "IN2R PGA", NULL, "IN2R" },
1170 { "IN3L PGA", NULL, "IN3L" },
1171 { "IN3R PGA", NULL, "IN3R" },
1172 { "IN4L PGA", NULL, "IN4L" },
1173 { "IN4R PGA", NULL, "IN4R" },
1174
1175 WM5100_MIXER_ROUTES("OUT1L", "HPOUT1L"),
1176 WM5100_MIXER_ROUTES("OUT1R", "HPOUT1R"),
1177 WM5100_MIXER_ROUTES("OUT2L", "HPOUT2L"),
1178 WM5100_MIXER_ROUTES("OUT2R", "HPOUT2R"),
1179 WM5100_MIXER_ROUTES("OUT3L", "HPOUT3L"),
1180 WM5100_MIXER_ROUTES("OUT3R", "HPOUT3R"),
1181
1182 WM5100_MIXER_ROUTES("OUT4L", "SPKOUTL"),
1183 WM5100_MIXER_ROUTES("OUT4R", "SPKOUTR"),
1184 WM5100_MIXER_ROUTES("OUT5L", "SPKDAT1L"),
1185 WM5100_MIXER_ROUTES("OUT5R", "SPKDAT1R"),
1186 WM5100_MIXER_ROUTES("OUT6L", "SPKDAT2L"),
1187 WM5100_MIXER_ROUTES("OUT6R", "SPKDAT2R"),
1188
1189 WM5100_MIXER_ROUTES("PWM1 Driver", "PWM1"),
1190 WM5100_MIXER_ROUTES("PWM2 Driver", "PWM2"),
1191
1192 WM5100_MIXER_ROUTES("AIF1TX1", "AIF1TX1"),
1193 WM5100_MIXER_ROUTES("AIF1TX2", "AIF1TX2"),
1194 WM5100_MIXER_ROUTES("AIF1TX3", "AIF1TX3"),
1195 WM5100_MIXER_ROUTES("AIF1TX4", "AIF1TX4"),
1196 WM5100_MIXER_ROUTES("AIF1TX5", "AIF1TX5"),
1197 WM5100_MIXER_ROUTES("AIF1TX6", "AIF1TX6"),
1198 WM5100_MIXER_ROUTES("AIF1TX7", "AIF1TX7"),
1199 WM5100_MIXER_ROUTES("AIF1TX8", "AIF1TX8"),
1200
1201 WM5100_MIXER_ROUTES("AIF2TX1", "AIF2TX1"),
1202 WM5100_MIXER_ROUTES("AIF2TX2", "AIF2TX2"),
1203
1204 WM5100_MIXER_ROUTES("AIF3TX1", "AIF3TX1"),
1205 WM5100_MIXER_ROUTES("AIF3TX2", "AIF3TX2"),
1206
1207 WM5100_MIXER_ROUTES("EQ1", "EQ1"),
1208 WM5100_MIXER_ROUTES("EQ2", "EQ2"),
1209 WM5100_MIXER_ROUTES("EQ3", "EQ3"),
1210 WM5100_MIXER_ROUTES("EQ4", "EQ4"),
1211
1212 WM5100_MIXER_ROUTES("DRC1L", "DRC1L"),
1213 WM5100_MIXER_ROUTES("DRC1R", "DRC1R"),
1214
1215 WM5100_MIXER_ROUTES("LHPF1", "LHPF1"),
1216 WM5100_MIXER_ROUTES("LHPF2", "LHPF2"),
1217 WM5100_MIXER_ROUTES("LHPF3", "LHPF3"),
1218 WM5100_MIXER_ROUTES("LHPF4", "LHPF4"),
1219
1220 { "HPOUT1L", NULL, "OUT1L" },
1221 { "HPOUT1R", NULL, "OUT1R" },
1222 { "HPOUT2L", NULL, "OUT2L" },
1223 { "HPOUT2R", NULL, "OUT2R" },
1224 { "HPOUT3L", NULL, "OUT3L" },
1225 { "HPOUT3R", NULL, "OUT3R" },
1226 { "SPKOUTL", NULL, "OUT4L" },
1227 { "SPKOUTR", NULL, "OUT4R" },
1228 { "SPKDAT1", NULL, "OUT5L" },
1229 { "SPKDAT1", NULL, "OUT5R" },
1230 { "SPKDAT2", NULL, "OUT6L" },
1231 { "SPKDAT2", NULL, "OUT6R" },
1232 { "PWM1", NULL, "PWM1 Driver" },
1233 { "PWM2", NULL, "PWM2 Driver" },
1234 };
1235
1236 static const __devinitdata struct reg_default wm5100_reva_patches[] = {
1237 { WM5100_AUDIO_IF_1_10, 0 },
1238 { WM5100_AUDIO_IF_1_11, 1 },
1239 { WM5100_AUDIO_IF_1_12, 2 },
1240 { WM5100_AUDIO_IF_1_13, 3 },
1241 { WM5100_AUDIO_IF_1_14, 4 },
1242 { WM5100_AUDIO_IF_1_15, 5 },
1243 { WM5100_AUDIO_IF_1_16, 6 },
1244 { WM5100_AUDIO_IF_1_17, 7 },
1245
1246 { WM5100_AUDIO_IF_1_18, 0 },
1247 { WM5100_AUDIO_IF_1_19, 1 },
1248 { WM5100_AUDIO_IF_1_20, 2 },
1249 { WM5100_AUDIO_IF_1_21, 3 },
1250 { WM5100_AUDIO_IF_1_22, 4 },
1251 { WM5100_AUDIO_IF_1_23, 5 },
1252 { WM5100_AUDIO_IF_1_24, 6 },
1253 { WM5100_AUDIO_IF_1_25, 7 },
1254
1255 { WM5100_AUDIO_IF_2_10, 0 },
1256 { WM5100_AUDIO_IF_2_11, 1 },
1257
1258 { WM5100_AUDIO_IF_2_18, 0 },
1259 { WM5100_AUDIO_IF_2_19, 1 },
1260
1261 { WM5100_AUDIO_IF_3_10, 0 },
1262 { WM5100_AUDIO_IF_3_11, 1 },
1263
1264 { WM5100_AUDIO_IF_3_18, 0 },
1265 { WM5100_AUDIO_IF_3_19, 1 },
1266 };
1267
1268 static int wm5100_dai_to_base(struct snd_soc_dai *dai)
1269 {
1270 switch (dai->id) {
1271 case 0:
1272 return WM5100_AUDIO_IF_1_1 - 1;
1273 case 1:
1274 return WM5100_AUDIO_IF_2_1 - 1;
1275 case 2:
1276 return WM5100_AUDIO_IF_3_1 - 1;
1277 default:
1278 BUG();
1279 return -EINVAL;
1280 }
1281 }
1282
1283 static int wm5100_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
1284 {
1285 struct snd_soc_codec *codec = dai->codec;
1286 int lrclk, bclk, mask, base;
1287
1288 base = wm5100_dai_to_base(dai);
1289 if (base < 0)
1290 return base;
1291
1292 lrclk = 0;
1293 bclk = 0;
1294
1295 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
1296 case SND_SOC_DAIFMT_DSP_A:
1297 mask = 0;
1298 break;
1299 case SND_SOC_DAIFMT_DSP_B:
1300 mask = 1;
1301 break;
1302 case SND_SOC_DAIFMT_I2S:
1303 mask = 2;
1304 break;
1305 case SND_SOC_DAIFMT_LEFT_J:
1306 mask = 3;
1307 break;
1308 default:
1309 dev_err(codec->dev, "Unsupported DAI format %d\n",
1310 fmt & SND_SOC_DAIFMT_FORMAT_MASK);
1311 return -EINVAL;
1312 }
1313
1314 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
1315 case SND_SOC_DAIFMT_CBS_CFS:
1316 break;
1317 case SND_SOC_DAIFMT_CBS_CFM:
1318 lrclk |= WM5100_AIF1TX_LRCLK_MSTR;
1319 break;
1320 case SND_SOC_DAIFMT_CBM_CFS:
1321 bclk |= WM5100_AIF1_BCLK_MSTR;
1322 break;
1323 case SND_SOC_DAIFMT_CBM_CFM:
1324 lrclk |= WM5100_AIF1TX_LRCLK_MSTR;
1325 bclk |= WM5100_AIF1_BCLK_MSTR;
1326 break;
1327 default:
1328 dev_err(codec->dev, "Unsupported master mode %d\n",
1329 fmt & SND_SOC_DAIFMT_MASTER_MASK);
1330 return -EINVAL;
1331 }
1332
1333 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
1334 case SND_SOC_DAIFMT_NB_NF:
1335 break;
1336 case SND_SOC_DAIFMT_IB_IF:
1337 bclk |= WM5100_AIF1_BCLK_INV;
1338 lrclk |= WM5100_AIF1TX_LRCLK_INV;
1339 break;
1340 case SND_SOC_DAIFMT_IB_NF:
1341 bclk |= WM5100_AIF1_BCLK_INV;
1342 break;
1343 case SND_SOC_DAIFMT_NB_IF:
1344 lrclk |= WM5100_AIF1TX_LRCLK_INV;
1345 break;
1346 default:
1347 return -EINVAL;
1348 }
1349
1350 snd_soc_update_bits(codec, base + 1, WM5100_AIF1_BCLK_MSTR |
1351 WM5100_AIF1_BCLK_INV, bclk);
1352 snd_soc_update_bits(codec, base + 2, WM5100_AIF1TX_LRCLK_MSTR |
1353 WM5100_AIF1TX_LRCLK_INV, lrclk);
1354 snd_soc_update_bits(codec, base + 3, WM5100_AIF1TX_LRCLK_MSTR |
1355 WM5100_AIF1TX_LRCLK_INV, lrclk);
1356 snd_soc_update_bits(codec, base + 5, WM5100_AIF1_FMT_MASK, mask);
1357
1358 return 0;
1359 }
1360
1361 #define WM5100_NUM_BCLK_RATES 19
1362
1363 static int wm5100_bclk_rates_dat[WM5100_NUM_BCLK_RATES] = {
1364 32000,
1365 48000,
1366 64000,
1367 96000,
1368 128000,
1369 192000,
1370 256000,
1371 384000,
1372 512000,
1373 768000,
1374 1024000,
1375 1536000,
1376 2048000,
1377 3072000,
1378 4096000,
1379 6144000,
1380 8192000,
1381 12288000,
1382 24576000,
1383 };
1384
1385 static int wm5100_bclk_rates_cd[WM5100_NUM_BCLK_RATES] = {
1386 29400,
1387 44100,
1388 58800,
1389 88200,
1390 117600,
1391 176400,
1392 235200,
1393 352800,
1394 470400,
1395 705600,
1396 940800,
1397 1411200,
1398 1881600,
1399 2882400,
1400 3763200,
1401 5644800,
1402 7526400,
1403 11289600,
1404 22579600,
1405 };
1406
1407 static int wm5100_hw_params(struct snd_pcm_substream *substream,
1408 struct snd_pcm_hw_params *params,
1409 struct snd_soc_dai *dai)
1410 {
1411 struct snd_soc_codec *codec = dai->codec;
1412 struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec);
1413 bool async = wm5100->aif_async[dai->id];
1414 int i, base, bclk, aif_rate, lrclk, wl, fl, sr;
1415 int *bclk_rates;
1416
1417 base = wm5100_dai_to_base(dai);
1418 if (base < 0)
1419 return base;
1420
1421 /* Data sizes if not using TDM */
1422 wl = snd_pcm_format_width(params_format(params));
1423 if (wl < 0)
1424 return wl;
1425 fl = snd_soc_params_to_frame_size(params);
1426 if (fl < 0)
1427 return fl;
1428
1429 dev_dbg(codec->dev, "Word length %d bits, frame length %d bits\n",
1430 wl, fl);
1431
1432 /* Target BCLK rate */
1433 bclk = snd_soc_params_to_bclk(params);
1434 if (bclk < 0)
1435 return bclk;
1436
1437 /* Root for BCLK depends on SYS/ASYNCCLK */
1438 if (!async) {
1439 aif_rate = wm5100->sysclk;
1440 sr = wm5100_alloc_sr(codec, params_rate(params));
1441 if (sr < 0)
1442 return sr;
1443 } else {
1444 /* If we're in ASYNCCLK set the ASYNC sample rate */
1445 aif_rate = wm5100->asyncclk;
1446 sr = 3;
1447
1448 for (i = 0; i < ARRAY_SIZE(wm5100_sr_code); i++)
1449 if (params_rate(params) == wm5100_sr_code[i])
1450 break;
1451 if (i == ARRAY_SIZE(wm5100_sr_code)) {
1452 dev_err(codec->dev, "Invalid rate %dHzn",
1453 params_rate(params));
1454 return -EINVAL;
1455 }
1456
1457 /* TODO: We should really check for symmetry */
1458 snd_soc_update_bits(codec, WM5100_CLOCKING_8,
1459 WM5100_ASYNC_SAMPLE_RATE_MASK, i);
1460 }
1461
1462 if (!aif_rate) {
1463 dev_err(codec->dev, "%s has no rate set\n",
1464 async ? "ASYNCCLK" : "SYSCLK");
1465 return -EINVAL;
1466 }
1467
1468 dev_dbg(codec->dev, "Target BCLK is %dHz, using %dHz %s\n",
1469 bclk, aif_rate, async ? "ASYNCCLK" : "SYSCLK");
1470
1471 if (aif_rate % 4000)
1472 bclk_rates = wm5100_bclk_rates_cd;
1473 else
1474 bclk_rates = wm5100_bclk_rates_dat;
1475
1476 for (i = 0; i < WM5100_NUM_BCLK_RATES; i++)
1477 if (bclk_rates[i] >= bclk && (bclk_rates[i] % bclk == 0))
1478 break;
1479 if (i == WM5100_NUM_BCLK_RATES) {
1480 dev_err(codec->dev,
1481 "No valid BCLK for %dHz found from %dHz %s\n",
1482 bclk, aif_rate, async ? "ASYNCCLK" : "SYSCLK");
1483 return -EINVAL;
1484 }
1485
1486 bclk = i;
1487 dev_dbg(codec->dev, "Setting %dHz BCLK\n", bclk_rates[bclk]);
1488 snd_soc_update_bits(codec, base + 1, WM5100_AIF1_BCLK_FREQ_MASK, bclk);
1489
1490 lrclk = bclk_rates[bclk] / params_rate(params);
1491 dev_dbg(codec->dev, "Setting %dHz LRCLK\n", bclk_rates[bclk] / lrclk);
1492 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK ||
1493 wm5100->aif_symmetric[dai->id])
1494 snd_soc_update_bits(codec, base + 7,
1495 WM5100_AIF1RX_BCPF_MASK, lrclk);
1496 else
1497 snd_soc_update_bits(codec, base + 6,
1498 WM5100_AIF1TX_BCPF_MASK, lrclk);
1499
1500 i = (wl << WM5100_AIF1TX_WL_SHIFT) | fl;
1501 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
1502 snd_soc_update_bits(codec, base + 9,
1503 WM5100_AIF1RX_WL_MASK |
1504 WM5100_AIF1RX_SLOT_LEN_MASK, i);
1505 else
1506 snd_soc_update_bits(codec, base + 8,
1507 WM5100_AIF1TX_WL_MASK |
1508 WM5100_AIF1TX_SLOT_LEN_MASK, i);
1509
1510 snd_soc_update_bits(codec, base + 4, WM5100_AIF1_RATE_MASK, sr);
1511
1512 return 0;
1513 }
1514
1515 static const struct snd_soc_dai_ops wm5100_dai_ops = {
1516 .set_fmt = wm5100_set_fmt,
1517 .hw_params = wm5100_hw_params,
1518 };
1519
1520 static int wm5100_set_sysclk(struct snd_soc_codec *codec, int clk_id,
1521 int source, unsigned int freq, int dir)
1522 {
1523 struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec);
1524 int *rate_store;
1525 int fval, audio_rate, ret, reg;
1526
1527 switch (clk_id) {
1528 case WM5100_CLK_SYSCLK:
1529 reg = WM5100_CLOCKING_3;
1530 rate_store = &wm5100->sysclk;
1531 break;
1532 case WM5100_CLK_ASYNCCLK:
1533 reg = WM5100_CLOCKING_7;
1534 rate_store = &wm5100->asyncclk;
1535 break;
1536 case WM5100_CLK_32KHZ:
1537 /* The 32kHz clock is slightly different to the others */
1538 switch (source) {
1539 case WM5100_CLKSRC_MCLK1:
1540 case WM5100_CLKSRC_MCLK2:
1541 case WM5100_CLKSRC_SYSCLK:
1542 snd_soc_update_bits(codec, WM5100_CLOCKING_1,
1543 WM5100_CLK_32K_SRC_MASK,
1544 source);
1545 break;
1546 default:
1547 return -EINVAL;
1548 }
1549 return 0;
1550
1551 case WM5100_CLK_AIF1:
1552 case WM5100_CLK_AIF2:
1553 case WM5100_CLK_AIF3:
1554 /* Not real clocks, record which clock domain they're in */
1555 switch (source) {
1556 case WM5100_CLKSRC_SYSCLK:
1557 wm5100->aif_async[clk_id - 1] = false;
1558 break;
1559 case WM5100_CLKSRC_ASYNCCLK:
1560 wm5100->aif_async[clk_id - 1] = true;
1561 break;
1562 default:
1563 dev_err(codec->dev, "Invalid source %d\n", source);
1564 return -EINVAL;
1565 }
1566 return 0;
1567
1568 case WM5100_CLK_OPCLK:
1569 switch (freq) {
1570 case 5644800:
1571 case 6144000:
1572 snd_soc_update_bits(codec, WM5100_MISC_GPIO_1,
1573 WM5100_OPCLK_SEL_MASK, 0);
1574 break;
1575 case 11289600:
1576 case 12288000:
1577 snd_soc_update_bits(codec, WM5100_MISC_GPIO_1,
1578 WM5100_OPCLK_SEL_MASK, 0);
1579 break;
1580 case 22579200:
1581 case 24576000:
1582 snd_soc_update_bits(codec, WM5100_MISC_GPIO_1,
1583 WM5100_OPCLK_SEL_MASK, 0);
1584 break;
1585 default:
1586 dev_err(codec->dev, "Unsupported OPCLK %dHz\n",
1587 freq);
1588 return -EINVAL;
1589 }
1590 return 0;
1591
1592 default:
1593 dev_err(codec->dev, "Unknown clock %d\n", clk_id);
1594 return -EINVAL;
1595 }
1596
1597 switch (source) {
1598 case WM5100_CLKSRC_SYSCLK:
1599 case WM5100_CLKSRC_ASYNCCLK:
1600 dev_err(codec->dev, "Invalid source %d\n", source);
1601 return -EINVAL;
1602 }
1603
1604 switch (freq) {
1605 case 5644800:
1606 case 6144000:
1607 fval = 0;
1608 break;
1609 case 11289600:
1610 case 12288000:
1611 fval = 1;
1612 break;
1613 case 22579200:
1614 case 24576000:
1615 fval = 2;
1616 break;
1617 default:
1618 dev_err(codec->dev, "Invalid clock rate: %d\n", freq);
1619 return -EINVAL;
1620 }
1621
1622 switch (freq) {
1623 case 5644800:
1624 case 11289600:
1625 case 22579200:
1626 audio_rate = 44100;
1627 break;
1628
1629 case 6144000:
1630 case 12288000:
1631 case 24576000:
1632 audio_rate = 48000;
1633 break;
1634
1635 default:
1636 BUG();
1637 audio_rate = 0;
1638 break;
1639 }
1640
1641 /* TODO: Check if MCLKs are in use and enable/disable pulls to
1642 * match.
1643 */
1644
1645 snd_soc_update_bits(codec, reg, WM5100_SYSCLK_FREQ_MASK |
1646 WM5100_SYSCLK_SRC_MASK,
1647 fval << WM5100_SYSCLK_FREQ_SHIFT | source);
1648
1649 /* If this is SYSCLK then configure the clock rate for the
1650 * internal audio functions to the natural sample rate for
1651 * this clock rate.
1652 */
1653 if (clk_id == WM5100_CLK_SYSCLK) {
1654 dev_dbg(codec->dev, "Setting primary audio rate to %dHz",
1655 audio_rate);
1656 if (0 && *rate_store)
1657 wm5100_free_sr(codec, audio_rate);
1658 ret = wm5100_alloc_sr(codec, audio_rate);
1659 if (ret != 0)
1660 dev_warn(codec->dev, "Primary audio slot is %d\n",
1661 ret);
1662 }
1663
1664 *rate_store = freq;
1665
1666 return 0;
1667 }
1668
1669 struct _fll_div {
1670 u16 fll_fratio;
1671 u16 fll_outdiv;
1672 u16 fll_refclk_div;
1673 u16 n;
1674 u16 theta;
1675 u16 lambda;
1676 };
1677
1678 static struct {
1679 unsigned int min;
1680 unsigned int max;
1681 u16 fll_fratio;
1682 int ratio;
1683 } fll_fratios[] = {
1684 { 0, 64000, 4, 16 },
1685 { 64000, 128000, 3, 8 },
1686 { 128000, 256000, 2, 4 },
1687 { 256000, 1000000, 1, 2 },
1688 { 1000000, 13500000, 0, 1 },
1689 };
1690
1691 static int fll_factors(struct _fll_div *fll_div, unsigned int Fref,
1692 unsigned int Fout)
1693 {
1694 unsigned int target;
1695 unsigned int div;
1696 unsigned int fratio, gcd_fll;
1697 int i;
1698
1699 /* Fref must be <=13.5MHz */
1700 div = 1;
1701 fll_div->fll_refclk_div = 0;
1702 while ((Fref / div) > 13500000) {
1703 div *= 2;
1704 fll_div->fll_refclk_div++;
1705
1706 if (div > 8) {
1707 pr_err("Can't scale %dMHz input down to <=13.5MHz\n",
1708 Fref);
1709 return -EINVAL;
1710 }
1711 }
1712
1713 pr_debug("FLL Fref=%u Fout=%u\n", Fref, Fout);
1714
1715 /* Apply the division for our remaining calculations */
1716 Fref /= div;
1717
1718 /* Fvco should be 90-100MHz; don't check the upper bound */
1719 div = 2;
1720 while (Fout * div < 90000000) {
1721 div++;
1722 if (div > 64) {
1723 pr_err("Unable to find FLL_OUTDIV for Fout=%uHz\n",
1724 Fout);
1725 return -EINVAL;
1726 }
1727 }
1728 target = Fout * div;
1729 fll_div->fll_outdiv = div - 1;
1730
1731 pr_debug("FLL Fvco=%dHz\n", target);
1732
1733 /* Find an appropraite FLL_FRATIO and factor it out of the target */
1734 for (i = 0; i < ARRAY_SIZE(fll_fratios); i++) {
1735 if (fll_fratios[i].min <= Fref && Fref <= fll_fratios[i].max) {
1736 fll_div->fll_fratio = fll_fratios[i].fll_fratio;
1737 fratio = fll_fratios[i].ratio;
1738 break;
1739 }
1740 }
1741 if (i == ARRAY_SIZE(fll_fratios)) {
1742 pr_err("Unable to find FLL_FRATIO for Fref=%uHz\n", Fref);
1743 return -EINVAL;
1744 }
1745
1746 fll_div->n = target / (fratio * Fref);
1747
1748 if (target % Fref == 0) {
1749 fll_div->theta = 0;
1750 fll_div->lambda = 0;
1751 } else {
1752 gcd_fll = gcd(target, fratio * Fref);
1753
1754 fll_div->theta = (target - (fll_div->n * fratio * Fref))
1755 / gcd_fll;
1756 fll_div->lambda = (fratio * Fref) / gcd_fll;
1757 }
1758
1759 pr_debug("FLL N=%x THETA=%x LAMBDA=%x\n",
1760 fll_div->n, fll_div->theta, fll_div->lambda);
1761 pr_debug("FLL_FRATIO=%x(%d) FLL_OUTDIV=%x FLL_REFCLK_DIV=%x\n",
1762 fll_div->fll_fratio, fratio, fll_div->fll_outdiv,
1763 fll_div->fll_refclk_div);
1764
1765 return 0;
1766 }
1767
1768 static int wm5100_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
1769 unsigned int Fref, unsigned int Fout)
1770 {
1771 struct i2c_client *i2c = to_i2c_client(codec->dev);
1772 struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec);
1773 struct _fll_div factors;
1774 struct wm5100_fll *fll;
1775 int ret, base, lock, i, timeout;
1776
1777 switch (fll_id) {
1778 case WM5100_FLL1:
1779 fll = &wm5100->fll[0];
1780 base = WM5100_FLL1_CONTROL_1 - 1;
1781 lock = WM5100_FLL1_LOCK_STS;
1782 break;
1783 case WM5100_FLL2:
1784 fll = &wm5100->fll[1];
1785 base = WM5100_FLL2_CONTROL_2 - 1;
1786 lock = WM5100_FLL2_LOCK_STS;
1787 break;
1788 default:
1789 dev_err(codec->dev, "Unknown FLL %d\n",fll_id);
1790 return -EINVAL;
1791 }
1792
1793 if (!Fout) {
1794 dev_dbg(codec->dev, "FLL%d disabled", fll_id);
1795 if (fll->fout)
1796 pm_runtime_put(codec->dev);
1797 fll->fout = 0;
1798 snd_soc_update_bits(codec, base + 1, WM5100_FLL1_ENA, 0);
1799 return 0;
1800 }
1801
1802 switch (source) {
1803 case WM5100_FLL_SRC_MCLK1:
1804 case WM5100_FLL_SRC_MCLK2:
1805 case WM5100_FLL_SRC_FLL1:
1806 case WM5100_FLL_SRC_FLL2:
1807 case WM5100_FLL_SRC_AIF1BCLK:
1808 case WM5100_FLL_SRC_AIF2BCLK:
1809 case WM5100_FLL_SRC_AIF3BCLK:
1810 break;
1811 default:
1812 dev_err(codec->dev, "Invalid FLL source %d\n", source);
1813 return -EINVAL;
1814 }
1815
1816 ret = fll_factors(&factors, Fref, Fout);
1817 if (ret < 0)
1818 return ret;
1819
1820 /* Disable the FLL while we reconfigure */
1821 snd_soc_update_bits(codec, base + 1, WM5100_FLL1_ENA, 0);
1822
1823 snd_soc_update_bits(codec, base + 2,
1824 WM5100_FLL1_OUTDIV_MASK | WM5100_FLL1_FRATIO_MASK,
1825 (factors.fll_outdiv << WM5100_FLL1_OUTDIV_SHIFT) |
1826 factors.fll_fratio);
1827 snd_soc_update_bits(codec, base + 3, WM5100_FLL1_THETA_MASK,
1828 factors.theta);
1829 snd_soc_update_bits(codec, base + 5, WM5100_FLL1_N_MASK, factors.n);
1830 snd_soc_update_bits(codec, base + 6,
1831 WM5100_FLL1_REFCLK_DIV_MASK |
1832 WM5100_FLL1_REFCLK_SRC_MASK,
1833 (factors.fll_refclk_div
1834 << WM5100_FLL1_REFCLK_DIV_SHIFT) | source);
1835 snd_soc_update_bits(codec, base + 7, WM5100_FLL1_LAMBDA_MASK,
1836 factors.lambda);
1837
1838 /* Clear any pending completions */
1839 try_wait_for_completion(&fll->lock);
1840
1841 pm_runtime_get_sync(codec->dev);
1842
1843 snd_soc_update_bits(codec, base + 1, WM5100_FLL1_ENA, WM5100_FLL1_ENA);
1844
1845 if (i2c->irq)
1846 timeout = 2;
1847 else
1848 timeout = 50;
1849
1850 snd_soc_update_bits(codec, WM5100_CLOCKING_3, WM5100_SYSCLK_ENA,
1851 WM5100_SYSCLK_ENA);
1852
1853 /* Poll for the lock; will use interrupt when we can test */
1854 for (i = 0; i < timeout; i++) {
1855 if (i2c->irq) {
1856 ret = wait_for_completion_timeout(&fll->lock,
1857 msecs_to_jiffies(25));
1858 if (ret > 0)
1859 break;
1860 } else {
1861 msleep(1);
1862 }
1863
1864 ret = snd_soc_read(codec,
1865 WM5100_INTERRUPT_RAW_STATUS_3);
1866 if (ret < 0) {
1867 dev_err(codec->dev,
1868 "Failed to read FLL status: %d\n",
1869 ret);
1870 continue;
1871 }
1872 if (ret & lock)
1873 break;
1874 }
1875 if (i == timeout) {
1876 dev_err(codec->dev, "FLL%d lock timed out\n", fll_id);
1877 pm_runtime_put(codec->dev);
1878 return -ETIMEDOUT;
1879 }
1880
1881 fll->src = source;
1882 fll->fref = Fref;
1883 fll->fout = Fout;
1884
1885 dev_dbg(codec->dev, "FLL%d running %dHz->%dHz\n", fll_id,
1886 Fref, Fout);
1887
1888 return 0;
1889 }
1890
1891 /* Actually go much higher */
1892 #define WM5100_RATES SNDRV_PCM_RATE_8000_192000
1893
1894 #define WM5100_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
1895 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
1896
1897 static struct snd_soc_dai_driver wm5100_dai[] = {
1898 {
1899 .name = "wm5100-aif1",
1900 .playback = {
1901 .stream_name = "AIF1 Playback",
1902 .channels_min = 2,
1903 .channels_max = 2,
1904 .rates = WM5100_RATES,
1905 .formats = WM5100_FORMATS,
1906 },
1907 .capture = {
1908 .stream_name = "AIF1 Capture",
1909 .channels_min = 2,
1910 .channels_max = 2,
1911 .rates = WM5100_RATES,
1912 .formats = WM5100_FORMATS,
1913 },
1914 .ops = &wm5100_dai_ops,
1915 },
1916 {
1917 .name = "wm5100-aif2",
1918 .id = 1,
1919 .playback = {
1920 .stream_name = "AIF2 Playback",
1921 .channels_min = 2,
1922 .channels_max = 2,
1923 .rates = WM5100_RATES,
1924 .formats = WM5100_FORMATS,
1925 },
1926 .capture = {
1927 .stream_name = "AIF2 Capture",
1928 .channels_min = 2,
1929 .channels_max = 2,
1930 .rates = WM5100_RATES,
1931 .formats = WM5100_FORMATS,
1932 },
1933 .ops = &wm5100_dai_ops,
1934 },
1935 {
1936 .name = "wm5100-aif3",
1937 .id = 2,
1938 .playback = {
1939 .stream_name = "AIF3 Playback",
1940 .channels_min = 2,
1941 .channels_max = 2,
1942 .rates = WM5100_RATES,
1943 .formats = WM5100_FORMATS,
1944 },
1945 .capture = {
1946 .stream_name = "AIF3 Capture",
1947 .channels_min = 2,
1948 .channels_max = 2,
1949 .rates = WM5100_RATES,
1950 .formats = WM5100_FORMATS,
1951 },
1952 .ops = &wm5100_dai_ops,
1953 },
1954 };
1955
1956 static int wm5100_dig_vu[] = {
1957 WM5100_ADC_DIGITAL_VOLUME_1L,
1958 WM5100_ADC_DIGITAL_VOLUME_1R,
1959 WM5100_ADC_DIGITAL_VOLUME_2L,
1960 WM5100_ADC_DIGITAL_VOLUME_2R,
1961 WM5100_ADC_DIGITAL_VOLUME_3L,
1962 WM5100_ADC_DIGITAL_VOLUME_3R,
1963 WM5100_ADC_DIGITAL_VOLUME_4L,
1964 WM5100_ADC_DIGITAL_VOLUME_4R,
1965
1966 WM5100_DAC_DIGITAL_VOLUME_1L,
1967 WM5100_DAC_DIGITAL_VOLUME_1R,
1968 WM5100_DAC_DIGITAL_VOLUME_2L,
1969 WM5100_DAC_DIGITAL_VOLUME_2R,
1970 WM5100_DAC_DIGITAL_VOLUME_3L,
1971 WM5100_DAC_DIGITAL_VOLUME_3R,
1972 WM5100_DAC_DIGITAL_VOLUME_4L,
1973 WM5100_DAC_DIGITAL_VOLUME_4R,
1974 WM5100_DAC_DIGITAL_VOLUME_5L,
1975 WM5100_DAC_DIGITAL_VOLUME_5R,
1976 WM5100_DAC_DIGITAL_VOLUME_6L,
1977 WM5100_DAC_DIGITAL_VOLUME_6R,
1978 };
1979
1980 static void wm5100_set_detect_mode(struct wm5100_priv *wm5100, int the_mode)
1981 {
1982 struct wm5100_jack_mode *mode = &wm5100->pdata.jack_modes[the_mode];
1983
1984 BUG_ON(the_mode >= ARRAY_SIZE(wm5100->pdata.jack_modes));
1985
1986 gpio_set_value_cansleep(wm5100->pdata.hp_pol, mode->hp_pol);
1987 regmap_update_bits(wm5100->regmap, WM5100_ACCESSORY_DETECT_MODE_1,
1988 WM5100_ACCDET_BIAS_SRC_MASK |
1989 WM5100_ACCDET_SRC,
1990 (mode->bias << WM5100_ACCDET_BIAS_SRC_SHIFT) |
1991 mode->micd_src << WM5100_ACCDET_SRC_SHIFT);
1992 regmap_update_bits(wm5100->regmap, WM5100_MISC_CONTROL,
1993 WM5100_HPCOM_SRC,
1994 mode->micd_src << WM5100_HPCOM_SRC_SHIFT);
1995
1996 wm5100->jack_mode = the_mode;
1997
1998 dev_dbg(wm5100->dev, "Set microphone polarity to %d\n",
1999 wm5100->jack_mode);
2000 }
2001
2002 static void wm5100_report_headphone(struct wm5100_priv *wm5100)
2003 {
2004 dev_dbg(wm5100->dev, "Headphone detected\n");
2005 wm5100->jack_detecting = false;
2006 snd_soc_jack_report(wm5100->jack, SND_JACK_HEADPHONE,
2007 SND_JACK_HEADPHONE);
2008
2009 /* Increase the detection rate a bit for responsiveness. */
2010 regmap_update_bits(wm5100->regmap, WM5100_MIC_DETECT_1,
2011 WM5100_ACCDET_RATE_MASK,
2012 7 << WM5100_ACCDET_RATE_SHIFT);
2013 }
2014
2015 static void wm5100_micd_irq(struct wm5100_priv *wm5100)
2016 {
2017 unsigned int val;
2018 int ret;
2019
2020 ret = regmap_read(wm5100->regmap, WM5100_MIC_DETECT_3, &val);
2021 if (ret != 0) {
2022 dev_err(wm5100->dev, "Failed to read micropone status: %d\n",
2023 ret);
2024 return;
2025 }
2026
2027 dev_dbg(wm5100->dev, "Microphone event: %x\n", val);
2028
2029 if (!(val & WM5100_ACCDET_VALID)) {
2030 dev_warn(wm5100->dev, "Microphone detection state invalid\n");
2031 return;
2032 }
2033
2034 /* No accessory, reset everything and report removal */
2035 if (!(val & WM5100_ACCDET_STS)) {
2036 dev_dbg(wm5100->dev, "Jack removal detected\n");
2037 wm5100->jack_mic = false;
2038 wm5100->jack_detecting = true;
2039 wm5100->jack_flips = 0;
2040 snd_soc_jack_report(wm5100->jack, 0,
2041 SND_JACK_LINEOUT | SND_JACK_HEADSET |
2042 SND_JACK_BTN_0);
2043
2044 regmap_update_bits(wm5100->regmap, WM5100_MIC_DETECT_1,
2045 WM5100_ACCDET_RATE_MASK,
2046 WM5100_ACCDET_RATE_MASK);
2047 return;
2048 }
2049
2050 /* If the measurement is very high we've got a microphone,
2051 * either we just detected one or if we already reported then
2052 * we've got a button release event.
2053 */
2054 if (val & 0x400) {
2055 if (wm5100->jack_detecting) {
2056 dev_dbg(wm5100->dev, "Microphone detected\n");
2057 wm5100->jack_mic = true;
2058 wm5100->jack_detecting = false;
2059 snd_soc_jack_report(wm5100->jack,
2060 SND_JACK_HEADSET,
2061 SND_JACK_HEADSET | SND_JACK_BTN_0);
2062
2063 /* Increase poll rate to give better responsiveness
2064 * for buttons */
2065 regmap_update_bits(wm5100->regmap, WM5100_MIC_DETECT_1,
2066 WM5100_ACCDET_RATE_MASK,
2067 5 << WM5100_ACCDET_RATE_SHIFT);
2068 } else {
2069 dev_dbg(wm5100->dev, "Mic button up\n");
2070 snd_soc_jack_report(wm5100->jack, 0, SND_JACK_BTN_0);
2071 }
2072
2073 return;
2074 }
2075
2076 /* If we detected a lower impedence during initial startup
2077 * then we probably have the wrong polarity, flip it. Don't
2078 * do this for the lowest impedences to speed up detection of
2079 * plain headphones and give up if neither polarity looks
2080 * sensible.
2081 */
2082 if (wm5100->jack_detecting && (val & 0x3f8)) {
2083 wm5100->jack_flips++;
2084
2085 if (wm5100->jack_flips > 1)
2086 wm5100_report_headphone(wm5100);
2087 else
2088 wm5100_set_detect_mode(wm5100, !wm5100->jack_mode);
2089
2090 return;
2091 }
2092
2093 /* Don't distinguish between buttons, just report any low
2094 * impedence as BTN_0.
2095 */
2096 if (val & 0x3fc) {
2097 if (wm5100->jack_mic) {
2098 dev_dbg(wm5100->dev, "Mic button detected\n");
2099 snd_soc_jack_report(wm5100->jack, SND_JACK_BTN_0,
2100 SND_JACK_BTN_0);
2101 } else if (wm5100->jack_detecting) {
2102 wm5100_report_headphone(wm5100);
2103 }
2104 }
2105 }
2106
2107 int wm5100_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack)
2108 {
2109 struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec);
2110
2111 if (jack) {
2112 wm5100->jack = jack;
2113 wm5100->jack_detecting = true;
2114 wm5100->jack_flips = 0;
2115
2116 wm5100_set_detect_mode(wm5100, 0);
2117
2118 /* Slowest detection rate, gives debounce for initial
2119 * detection */
2120 snd_soc_update_bits(codec, WM5100_MIC_DETECT_1,
2121 WM5100_ACCDET_BIAS_STARTTIME_MASK |
2122 WM5100_ACCDET_RATE_MASK,
2123 (7 << WM5100_ACCDET_BIAS_STARTTIME_SHIFT) |
2124 WM5100_ACCDET_RATE_MASK);
2125
2126 /* We need the charge pump to power MICBIAS */
2127 snd_soc_dapm_force_enable_pin(&codec->dapm, "CP2");
2128 snd_soc_dapm_force_enable_pin(&codec->dapm, "SYSCLK");
2129 snd_soc_dapm_sync(&codec->dapm);
2130
2131 /* We start off just enabling microphone detection - even a
2132 * plain headphone will trigger detection.
2133 */
2134 snd_soc_update_bits(codec, WM5100_MIC_DETECT_1,
2135 WM5100_ACCDET_ENA, WM5100_ACCDET_ENA);
2136
2137 snd_soc_update_bits(codec, WM5100_INTERRUPT_STATUS_3_MASK,
2138 WM5100_IM_ACCDET_EINT, 0);
2139 } else {
2140 snd_soc_update_bits(codec, WM5100_INTERRUPT_STATUS_3_MASK,
2141 WM5100_IM_HPDET_EINT |
2142 WM5100_IM_ACCDET_EINT,
2143 WM5100_IM_HPDET_EINT |
2144 WM5100_IM_ACCDET_EINT);
2145 snd_soc_update_bits(codec, WM5100_MIC_DETECT_1,
2146 WM5100_ACCDET_ENA, 0);
2147 wm5100->jack = NULL;
2148 }
2149
2150 return 0;
2151 }
2152
2153 static irqreturn_t wm5100_irq(int irq, void *data)
2154 {
2155 struct wm5100_priv *wm5100 = data;
2156 irqreturn_t status = IRQ_NONE;
2157 unsigned int irq_val, mask_val;
2158 int ret;
2159
2160 ret = regmap_read(wm5100->regmap, WM5100_INTERRUPT_STATUS_3, &irq_val);
2161 if (ret < 0) {
2162 dev_err(wm5100->dev, "Failed to read IRQ status 3: %d\n",
2163 ret);
2164 irq_val = 0;
2165 }
2166
2167 ret = regmap_read(wm5100->regmap, WM5100_INTERRUPT_STATUS_3_MASK,
2168 &mask_val);
2169 if (ret < 0) {
2170 dev_err(wm5100->dev, "Failed to read IRQ mask 3: %d\n",
2171 ret);
2172 mask_val = 0xffff;
2173 }
2174
2175 irq_val &= ~mask_val;
2176
2177 regmap_write(wm5100->regmap, WM5100_INTERRUPT_STATUS_3, irq_val);
2178
2179 if (irq_val)
2180 status = IRQ_HANDLED;
2181
2182 wm5100_log_status3(wm5100, irq_val);
2183
2184 if (irq_val & WM5100_FLL1_LOCK_EINT) {
2185 dev_dbg(wm5100->dev, "FLL1 locked\n");
2186 complete(&wm5100->fll[0].lock);
2187 }
2188 if (irq_val & WM5100_FLL2_LOCK_EINT) {
2189 dev_dbg(wm5100->dev, "FLL2 locked\n");
2190 complete(&wm5100->fll[1].lock);
2191 }
2192
2193 if (irq_val & WM5100_ACCDET_EINT)
2194 wm5100_micd_irq(wm5100);
2195
2196 ret = regmap_read(wm5100->regmap, WM5100_INTERRUPT_STATUS_4, &irq_val);
2197 if (ret < 0) {
2198 dev_err(wm5100->dev, "Failed to read IRQ status 4: %d\n",
2199 ret);
2200 irq_val = 0;
2201 }
2202
2203 ret = regmap_read(wm5100->regmap, WM5100_INTERRUPT_STATUS_4_MASK,
2204 &mask_val);
2205 if (ret < 0) {
2206 dev_err(wm5100->dev, "Failed to read IRQ mask 4: %d\n",
2207 ret);
2208 mask_val = 0xffff;
2209 }
2210
2211 irq_val &= ~mask_val;
2212
2213 if (irq_val)
2214 status = IRQ_HANDLED;
2215
2216 regmap_write(wm5100->regmap, WM5100_INTERRUPT_STATUS_4, irq_val);
2217
2218 wm5100_log_status4(wm5100, irq_val);
2219
2220 return status;
2221 }
2222
2223 static irqreturn_t wm5100_edge_irq(int irq, void *data)
2224 {
2225 irqreturn_t ret = IRQ_NONE;
2226 irqreturn_t val;
2227
2228 do {
2229 val = wm5100_irq(irq, data);
2230 if (val != IRQ_NONE)
2231 ret = val;
2232 } while (val != IRQ_NONE);
2233
2234 return ret;
2235 }
2236
2237 #ifdef CONFIG_GPIOLIB
2238 static inline struct wm5100_priv *gpio_to_wm5100(struct gpio_chip *chip)
2239 {
2240 return container_of(chip, struct wm5100_priv, gpio_chip);
2241 }
2242
2243 static void wm5100_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
2244 {
2245 struct wm5100_priv *wm5100 = gpio_to_wm5100(chip);
2246
2247 regmap_update_bits(wm5100->regmap, WM5100_GPIO_CTRL_1 + offset,
2248 WM5100_GP1_LVL, !!value << WM5100_GP1_LVL_SHIFT);
2249 }
2250
2251 static int wm5100_gpio_direction_out(struct gpio_chip *chip,
2252 unsigned offset, int value)
2253 {
2254 struct wm5100_priv *wm5100 = gpio_to_wm5100(chip);
2255 int val, ret;
2256
2257 val = (1 << WM5100_GP1_FN_SHIFT) | (!!value << WM5100_GP1_LVL_SHIFT);
2258
2259 ret = regmap_update_bits(wm5100->regmap, WM5100_GPIO_CTRL_1 + offset,
2260 WM5100_GP1_FN_MASK | WM5100_GP1_DIR |
2261 WM5100_GP1_LVL, val);
2262 if (ret < 0)
2263 return ret;
2264 else
2265 return 0;
2266 }
2267
2268 static int wm5100_gpio_get(struct gpio_chip *chip, unsigned offset)
2269 {
2270 struct wm5100_priv *wm5100 = gpio_to_wm5100(chip);
2271 unsigned int reg;
2272 int ret;
2273
2274 ret = regmap_read(wm5100->regmap, WM5100_GPIO_CTRL_1 + offset, &reg);
2275 if (ret < 0)
2276 return ret;
2277
2278 return (reg & WM5100_GP1_LVL) != 0;
2279 }
2280
2281 static int wm5100_gpio_direction_in(struct gpio_chip *chip, unsigned offset)
2282 {
2283 struct wm5100_priv *wm5100 = gpio_to_wm5100(chip);
2284
2285 return regmap_update_bits(wm5100->regmap, WM5100_GPIO_CTRL_1 + offset,
2286 WM5100_GP1_FN_MASK | WM5100_GP1_DIR,
2287 (1 << WM5100_GP1_FN_SHIFT) |
2288 (1 << WM5100_GP1_DIR_SHIFT));
2289 }
2290
2291 static struct gpio_chip wm5100_template_chip = {
2292 .label = "wm5100",
2293 .owner = THIS_MODULE,
2294 .direction_output = wm5100_gpio_direction_out,
2295 .set = wm5100_gpio_set,
2296 .direction_input = wm5100_gpio_direction_in,
2297 .get = wm5100_gpio_get,
2298 .can_sleep = 1,
2299 };
2300
2301 static void wm5100_init_gpio(struct i2c_client *i2c)
2302 {
2303 struct wm5100_priv *wm5100 = i2c_get_clientdata(i2c);
2304 int ret;
2305
2306 wm5100->gpio_chip = wm5100_template_chip;
2307 wm5100->gpio_chip.ngpio = 6;
2308 wm5100->gpio_chip.dev = &i2c->dev;
2309
2310 if (wm5100->pdata.gpio_base)
2311 wm5100->gpio_chip.base = wm5100->pdata.gpio_base;
2312 else
2313 wm5100->gpio_chip.base = -1;
2314
2315 ret = gpiochip_add(&wm5100->gpio_chip);
2316 if (ret != 0)
2317 dev_err(&i2c->dev, "Failed to add GPIOs: %d\n", ret);
2318 }
2319
2320 static void wm5100_free_gpio(struct i2c_client *i2c)
2321 {
2322 struct wm5100_priv *wm5100 = i2c_get_clientdata(i2c);
2323 int ret;
2324
2325 ret = gpiochip_remove(&wm5100->gpio_chip);
2326 if (ret != 0)
2327 dev_err(&i2c->dev, "Failed to remove GPIOs: %d\n", ret);
2328 }
2329 #else
2330 static void wm5100_init_gpio(struct i2c_client *i2c)
2331 {
2332 }
2333
2334 static void wm5100_free_gpio(struct i2c_client *i2c)
2335 {
2336 }
2337 #endif
2338
2339 static int wm5100_probe(struct snd_soc_codec *codec)
2340 {
2341 struct i2c_client *i2c = to_i2c_client(codec->dev);
2342 struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec);
2343 int ret, i;
2344
2345 wm5100->codec = codec;
2346 codec->control_data = wm5100->regmap;
2347
2348 ret = snd_soc_codec_set_cache_io(codec, 16, 16, SND_SOC_REGMAP);
2349 if (ret != 0) {
2350 dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
2351 return ret;
2352 }
2353
2354 for (i = 0; i < ARRAY_SIZE(wm5100_dig_vu); i++)
2355 snd_soc_update_bits(codec, wm5100_dig_vu[i], WM5100_OUT_VU,
2356 WM5100_OUT_VU);
2357
2358 /* Don't debounce interrupts to support use of SYSCLK only */
2359 snd_soc_write(codec, WM5100_IRQ_DEBOUNCE_1, 0);
2360 snd_soc_write(codec, WM5100_IRQ_DEBOUNCE_2, 0);
2361
2362 /* TODO: check if we're symmetric */
2363
2364 if (i2c->irq)
2365 snd_soc_dapm_new_controls(&codec->dapm,
2366 wm5100_dapm_widgets_noirq,
2367 ARRAY_SIZE(wm5100_dapm_widgets_noirq));
2368
2369 if (wm5100->pdata.hp_pol) {
2370 ret = gpio_request_one(wm5100->pdata.hp_pol,
2371 GPIOF_OUT_INIT_HIGH, "WM5100 HP_POL");
2372 if (ret < 0) {
2373 dev_err(&i2c->dev, "Failed to request HP_POL %d: %d\n",
2374 wm5100->pdata.hp_pol, ret);
2375 goto err_gpio;
2376 }
2377 }
2378
2379 return 0;
2380
2381 err_gpio:
2382
2383 return ret;
2384 }
2385
2386 static int wm5100_remove(struct snd_soc_codec *codec)
2387 {
2388 struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec);
2389
2390 if (wm5100->pdata.hp_pol) {
2391 gpio_free(wm5100->pdata.hp_pol);
2392 }
2393
2394 return 0;
2395 }
2396
2397 static int wm5100_soc_volatile(struct snd_soc_codec *codec,
2398 unsigned int reg)
2399 {
2400 return true;
2401 }
2402
2403
2404 static struct snd_soc_codec_driver soc_codec_dev_wm5100 = {
2405 .probe = wm5100_probe,
2406 .remove = wm5100_remove,
2407
2408 .set_sysclk = wm5100_set_sysclk,
2409 .set_pll = wm5100_set_fll,
2410 .idle_bias_off = 1,
2411 .reg_cache_size = WM5100_MAX_REGISTER,
2412 .volatile_register = wm5100_soc_volatile,
2413
2414 .seq_notifier = wm5100_seq_notifier,
2415 .controls = wm5100_snd_controls,
2416 .num_controls = ARRAY_SIZE(wm5100_snd_controls),
2417 .dapm_widgets = wm5100_dapm_widgets,
2418 .num_dapm_widgets = ARRAY_SIZE(wm5100_dapm_widgets),
2419 .dapm_routes = wm5100_dapm_routes,
2420 .num_dapm_routes = ARRAY_SIZE(wm5100_dapm_routes),
2421 };
2422
2423 static const struct regmap_config wm5100_regmap = {
2424 .reg_bits = 16,
2425 .val_bits = 16,
2426
2427 .max_register = WM5100_MAX_REGISTER,
2428 .reg_defaults = wm5100_reg_defaults,
2429 .num_reg_defaults = ARRAY_SIZE(wm5100_reg_defaults),
2430 .volatile_reg = wm5100_volatile_register,
2431 .readable_reg = wm5100_readable_register,
2432 .cache_type = REGCACHE_RBTREE,
2433 };
2434
2435 static const unsigned int wm5100_mic_ctrl_reg[] = {
2436 WM5100_IN1L_CONTROL,
2437 WM5100_IN2L_CONTROL,
2438 WM5100_IN3L_CONTROL,
2439 WM5100_IN4L_CONTROL,
2440 };
2441
2442 static __devinit int wm5100_i2c_probe(struct i2c_client *i2c,
2443 const struct i2c_device_id *id)
2444 {
2445 struct wm5100_pdata *pdata = dev_get_platdata(&i2c->dev);
2446 struct wm5100_priv *wm5100;
2447 unsigned int reg;
2448 int ret, i, irq_flags;
2449
2450 wm5100 = devm_kzalloc(&i2c->dev, sizeof(struct wm5100_priv),
2451 GFP_KERNEL);
2452 if (wm5100 == NULL)
2453 return -ENOMEM;
2454
2455 wm5100->dev = &i2c->dev;
2456
2457 wm5100->regmap = regmap_init_i2c(i2c, &wm5100_regmap);
2458 if (IS_ERR(wm5100->regmap)) {
2459 ret = PTR_ERR(wm5100->regmap);
2460 dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
2461 ret);
2462 goto err;
2463 }
2464
2465 for (i = 0; i < ARRAY_SIZE(wm5100->fll); i++)
2466 init_completion(&wm5100->fll[i].lock);
2467
2468 if (pdata)
2469 wm5100->pdata = *pdata;
2470
2471 i2c_set_clientdata(i2c, wm5100);
2472
2473 for (i = 0; i < ARRAY_SIZE(wm5100->core_supplies); i++)
2474 wm5100->core_supplies[i].supply = wm5100_core_supply_names[i];
2475
2476 ret = devm_regulator_bulk_get(&i2c->dev,
2477 ARRAY_SIZE(wm5100->core_supplies),
2478 wm5100->core_supplies);
2479 if (ret != 0) {
2480 dev_err(&i2c->dev, "Failed to request core supplies: %d\n",
2481 ret);
2482 goto err_regmap;
2483 }
2484
2485 ret = regulator_bulk_enable(ARRAY_SIZE(wm5100->core_supplies),
2486 wm5100->core_supplies);
2487 if (ret != 0) {
2488 dev_err(&i2c->dev, "Failed to enable core supplies: %d\n",
2489 ret);
2490 goto err_regmap;
2491 }
2492
2493 if (wm5100->pdata.ldo_ena) {
2494 ret = gpio_request_one(wm5100->pdata.ldo_ena,
2495 GPIOF_OUT_INIT_HIGH, "WM5100 LDOENA");
2496 if (ret < 0) {
2497 dev_err(&i2c->dev, "Failed to request LDOENA %d: %d\n",
2498 wm5100->pdata.ldo_ena, ret);
2499 goto err_enable;
2500 }
2501 msleep(2);
2502 }
2503
2504 if (wm5100->pdata.reset) {
2505 ret = gpio_request_one(wm5100->pdata.reset,
2506 GPIOF_OUT_INIT_HIGH, "WM5100 /RESET");
2507 if (ret < 0) {
2508 dev_err(&i2c->dev, "Failed to request /RESET %d: %d\n",
2509 wm5100->pdata.reset, ret);
2510 goto err_ldo;
2511 }
2512 }
2513
2514 ret = regmap_read(wm5100->regmap, WM5100_SOFTWARE_RESET, &reg);
2515 if (ret < 0) {
2516 dev_err(&i2c->dev, "Failed to read ID register: %d\n", ret);
2517 goto err_reset;
2518 }
2519 switch (reg) {
2520 case 0x8997:
2521 case 0x5100:
2522 break;
2523
2524 default:
2525 dev_err(&i2c->dev, "Device is not a WM5100, ID is %x\n", reg);
2526 ret = -EINVAL;
2527 goto err_reset;
2528 }
2529
2530 ret = regmap_read(wm5100->regmap, WM5100_DEVICE_REVISION, &reg);
2531 if (ret < 0) {
2532 dev_err(&i2c->dev, "Failed to read revision register\n");
2533 goto err_reset;
2534 }
2535 wm5100->rev = reg & WM5100_DEVICE_REVISION_MASK;
2536
2537 dev_info(&i2c->dev, "revision %c\n", wm5100->rev + 'A');
2538
2539 ret = wm5100_reset(wm5100);
2540 if (ret < 0) {
2541 dev_err(&i2c->dev, "Failed to issue reset\n");
2542 goto err_reset;
2543 }
2544
2545 switch (wm5100->rev) {
2546 case 0:
2547 ret = regmap_register_patch(wm5100->regmap,
2548 wm5100_reva_patches,
2549 ARRAY_SIZE(wm5100_reva_patches));
2550 if (ret != 0) {
2551 dev_err(&i2c->dev, "Failed to register patches: %d\n",
2552 ret);
2553 goto err_reset;
2554 }
2555 break;
2556 default:
2557 break;
2558 }
2559
2560
2561 wm5100_init_gpio(i2c);
2562
2563 for (i = 0; i < ARRAY_SIZE(wm5100->pdata.gpio_defaults); i++) {
2564 if (!wm5100->pdata.gpio_defaults[i])
2565 continue;
2566
2567 regmap_write(wm5100->regmap, WM5100_GPIO_CTRL_1 + i,
2568 wm5100->pdata.gpio_defaults[i]);
2569 }
2570
2571 for (i = 0; i < ARRAY_SIZE(wm5100->pdata.in_mode); i++) {
2572 regmap_update_bits(wm5100->regmap, wm5100_mic_ctrl_reg[i],
2573 WM5100_IN1_MODE_MASK |
2574 WM5100_IN1_DMIC_SUP_MASK,
2575 (wm5100->pdata.in_mode[i] <<
2576 WM5100_IN1_MODE_SHIFT) |
2577 (wm5100->pdata.dmic_sup[i] <<
2578 WM5100_IN1_DMIC_SUP_SHIFT));
2579 }
2580
2581 if (i2c->irq) {
2582 if (wm5100->pdata.irq_flags)
2583 irq_flags = wm5100->pdata.irq_flags;
2584 else
2585 irq_flags = IRQF_TRIGGER_LOW;
2586
2587 irq_flags |= IRQF_ONESHOT;
2588
2589 if (irq_flags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING))
2590 ret = request_threaded_irq(i2c->irq, NULL,
2591 wm5100_edge_irq, irq_flags,
2592 "wm5100", wm5100);
2593 else
2594 ret = request_threaded_irq(i2c->irq, NULL, wm5100_irq,
2595 irq_flags, "wm5100",
2596 wm5100);
2597
2598 if (ret != 0) {
2599 dev_err(&i2c->dev, "Failed to request IRQ %d: %d\n",
2600 i2c->irq, ret);
2601 } else {
2602 /* Enable default interrupts */
2603 regmap_update_bits(wm5100->regmap,
2604 WM5100_INTERRUPT_STATUS_3_MASK,
2605 WM5100_IM_SPK_SHUTDOWN_WARN_EINT |
2606 WM5100_IM_SPK_SHUTDOWN_EINT |
2607 WM5100_IM_ASRC2_LOCK_EINT |
2608 WM5100_IM_ASRC1_LOCK_EINT |
2609 WM5100_IM_FLL2_LOCK_EINT |
2610 WM5100_IM_FLL1_LOCK_EINT |
2611 WM5100_CLKGEN_ERR_EINT |
2612 WM5100_CLKGEN_ERR_ASYNC_EINT, 0);
2613
2614 regmap_update_bits(wm5100->regmap,
2615 WM5100_INTERRUPT_STATUS_4_MASK,
2616 WM5100_AIF3_ERR_EINT |
2617 WM5100_AIF2_ERR_EINT |
2618 WM5100_AIF1_ERR_EINT |
2619 WM5100_CTRLIF_ERR_EINT |
2620 WM5100_ISRC2_UNDERCLOCKED_EINT |
2621 WM5100_ISRC1_UNDERCLOCKED_EINT |
2622 WM5100_FX_UNDERCLOCKED_EINT |
2623 WM5100_AIF3_UNDERCLOCKED_EINT |
2624 WM5100_AIF2_UNDERCLOCKED_EINT |
2625 WM5100_AIF1_UNDERCLOCKED_EINT |
2626 WM5100_ASRC_UNDERCLOCKED_EINT |
2627 WM5100_DAC_UNDERCLOCKED_EINT |
2628 WM5100_ADC_UNDERCLOCKED_EINT |
2629 WM5100_MIXER_UNDERCLOCKED_EINT, 0);
2630 }
2631 }
2632
2633 pm_runtime_set_active(&i2c->dev);
2634 pm_runtime_enable(&i2c->dev);
2635 pm_request_idle(&i2c->dev);
2636
2637 ret = snd_soc_register_codec(&i2c->dev,
2638 &soc_codec_dev_wm5100, wm5100_dai,
2639 ARRAY_SIZE(wm5100_dai));
2640 if (ret < 0) {
2641 dev_err(&i2c->dev, "Failed to register WM5100: %d\n", ret);
2642 goto err_reset;
2643 }
2644
2645 return ret;
2646
2647 err_reset:
2648 if (i2c->irq)
2649 free_irq(i2c->irq, wm5100);
2650 wm5100_free_gpio(i2c);
2651 if (wm5100->pdata.reset) {
2652 gpio_set_value_cansleep(wm5100->pdata.reset, 0);
2653 gpio_free(wm5100->pdata.reset);
2654 }
2655 err_ldo:
2656 if (wm5100->pdata.ldo_ena) {
2657 gpio_set_value_cansleep(wm5100->pdata.ldo_ena, 0);
2658 gpio_free(wm5100->pdata.ldo_ena);
2659 }
2660 err_enable:
2661 regulator_bulk_disable(ARRAY_SIZE(wm5100->core_supplies),
2662 wm5100->core_supplies);
2663 err_regmap:
2664 regmap_exit(wm5100->regmap);
2665 err:
2666 return ret;
2667 }
2668
2669 static __devexit int wm5100_i2c_remove(struct i2c_client *i2c)
2670 {
2671 struct wm5100_priv *wm5100 = i2c_get_clientdata(i2c);
2672
2673 snd_soc_unregister_codec(&i2c->dev);
2674 if (i2c->irq)
2675 free_irq(i2c->irq, wm5100);
2676 wm5100_free_gpio(i2c);
2677 if (wm5100->pdata.reset) {
2678 gpio_set_value_cansleep(wm5100->pdata.reset, 0);
2679 gpio_free(wm5100->pdata.reset);
2680 }
2681 if (wm5100->pdata.ldo_ena) {
2682 gpio_set_value_cansleep(wm5100->pdata.ldo_ena, 0);
2683 gpio_free(wm5100->pdata.ldo_ena);
2684 }
2685 regmap_exit(wm5100->regmap);
2686
2687 return 0;
2688 }
2689
2690 #ifdef CONFIG_PM_RUNTIME
2691 static int wm5100_runtime_suspend(struct device *dev)
2692 {
2693 struct wm5100_priv *wm5100 = dev_get_drvdata(dev);
2694
2695 regcache_cache_only(wm5100->regmap, true);
2696 regcache_mark_dirty(wm5100->regmap);
2697 if (wm5100->pdata.ldo_ena)
2698 gpio_set_value_cansleep(wm5100->pdata.ldo_ena, 0);
2699 regulator_bulk_disable(ARRAY_SIZE(wm5100->core_supplies),
2700 wm5100->core_supplies);
2701
2702 return 0;
2703 }
2704
2705 static int wm5100_runtime_resume(struct device *dev)
2706 {
2707 struct wm5100_priv *wm5100 = dev_get_drvdata(dev);
2708 int ret;
2709
2710 ret = regulator_bulk_enable(ARRAY_SIZE(wm5100->core_supplies),
2711 wm5100->core_supplies);
2712 if (ret != 0) {
2713 dev_err(dev, "Failed to enable supplies: %d\n",
2714 ret);
2715 return ret;
2716 }
2717
2718 if (wm5100->pdata.ldo_ena) {
2719 gpio_set_value_cansleep(wm5100->pdata.ldo_ena, 1);
2720 msleep(2);
2721 }
2722
2723 regcache_cache_only(wm5100->regmap, false);
2724 regcache_sync(wm5100->regmap);
2725
2726 return 0;
2727 }
2728 #endif
2729
2730 static struct dev_pm_ops wm5100_pm = {
2731 SET_RUNTIME_PM_OPS(wm5100_runtime_suspend, wm5100_runtime_resume,
2732 NULL)
2733 };
2734
2735 static const struct i2c_device_id wm5100_i2c_id[] = {
2736 { "wm5100", 0 },
2737 { }
2738 };
2739 MODULE_DEVICE_TABLE(i2c, wm5100_i2c_id);
2740
2741 static struct i2c_driver wm5100_i2c_driver = {
2742 .driver = {
2743 .name = "wm5100",
2744 .owner = THIS_MODULE,
2745 .pm = &wm5100_pm,
2746 },
2747 .probe = wm5100_i2c_probe,
2748 .remove = __devexit_p(wm5100_i2c_remove),
2749 .id_table = wm5100_i2c_id,
2750 };
2751
2752 static int __init wm5100_modinit(void)
2753 {
2754 return i2c_add_driver(&wm5100_i2c_driver);
2755 }
2756 module_init(wm5100_modinit);
2757
2758 static void __exit wm5100_exit(void)
2759 {
2760 i2c_del_driver(&wm5100_i2c_driver);
2761 }
2762 module_exit(wm5100_exit);
2763
2764 MODULE_DESCRIPTION("ASoC WM5100 driver");
2765 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
2766 MODULE_LICENSE("GPL");
This page took 0.1809 seconds and 6 git commands to generate.