057198facb3fe23e4d6bb67f75e85636de9fb7f2
[linux-3.10.git] / sound / soc / codecs / audience / es-a300.c
1
2 /*
3  * es-a300.c  --  Audience eS755 ALSA SoC Audio driver
4  *
5  * Copyright 2013 Audience, Inc.
6  *
7  * Author: Rajat Aggarwal <raggarwal@audience.com>
8  *
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License version 2 as
12  * published by the Free Software Foundation.
13  */
14 #include <sound/soc.h>
15 #include <sound/soc-dapm.h>
16 #include <sound/tlv.h>
17 #include "escore.h"
18 #include "es-a300-reg.h"
19
20 static DECLARE_TLV_DB_SCALE(spkr_tlv, -3600, 200, 1);
21 static DECLARE_TLV_DB_SCALE(lo_tlv, -2200, 200, 1);
22 static DECLARE_TLV_DB_SCALE(ep_tlv, -2200, 200, 1);
23 static DECLARE_TLV_DB_SCALE(aux_tlv, 0, 150, 0);
24 static DECLARE_TLV_DB_SCALE(mic_tlv, 0, 150, 0);
25
26 static const unsigned int hp_tlv[] = {
27         TLV_DB_RANGE_HEAD(6),
28         0, 0, TLV_DB_SCALE_ITEM(-6000, 0, 0),
29         1, 1, TLV_DB_SCALE_ITEM(-5100, 0, 0),
30         2, 2, TLV_DB_SCALE_ITEM(-4300, 0, 0),
31         3, 5, TLV_DB_SCALE_ITEM(-3700, 500, 0),
32         6, 11, TLV_DB_SCALE_ITEM(-2300, 300, 0),
33         12, 15, TLV_DB_SCALE_ITEM(-600, 200, 0),
34 };
35
36 static const char * const aux_mono_text[] = {
37         "Mono", "Stereo"
38 };
39
40 static const struct soc_enum auxl_mono_enum =
41         SOC_ENUM_SINGLE(ES_AUX_L_CTRL, ES_AUX_STEREO_SHIFT,
42                 ARRAY_SIZE(aux_mono_text), aux_mono_text);
43
44 static const struct soc_enum auxr_mono_enum =
45         SOC_ENUM_SINGLE(ES_AUX_R_CTRL, ES_AUX_STEREO_SHIFT,
46                 ARRAY_SIZE(aux_mono_text), aux_mono_text);
47
48 static const char * const i2s_ch_text[] = {
49         "2", "4",
50 };
51
52 static const struct soc_enum i2s_ch_enum =
53         SOC_ENUM_SINGLE(ES_DAC_DIG_CH, ES_I2S_CH_SHIFT,
54                 ARRAY_SIZE(i2s_ch_text), i2s_ch_text);
55
56 static const char * const fs_sel_text[] = {
57         "48", "96", "192",
58 };
59
60 static const struct soc_enum fs_sel_enum =
61         SOC_ENUM_SINGLE(ES_DAC_DIG_FS_SEL, ES_FS_SEL_SHIFT,
62                 ARRAY_SIZE(fs_sel_text), fs_sel_text);
63
64 static const char * const michs_sel_mux_text[] = {
65         "MIC0_PGA", "MIC1_PGA",
66 };
67
68 static const struct soc_enum michs_sel_mux_enum =
69         SOC_ENUM_SINGLE(ES_MICHS_CTRL, ES_MICHS_IN_SEL_SHIFT,
70                 ARRAY_SIZE(michs_sel_mux_text), michs_sel_mux_text);
71
72 static const char * const micx_input_type_text[] = {
73         "Differential", "Single Ended",
74 };
75
76 static const struct soc_enum mic0_input_type_enum =
77         SOC_ENUM_SINGLE(ES_MIC0_CTRL, ES_MIC0_SE_SHIFT,
78                 ARRAY_SIZE(micx_input_type_text), micx_input_type_text);
79
80 static const struct soc_enum mic1_input_type_enum =
81         SOC_ENUM_SINGLE(ES_MIC1_CTRL, ES_MIC1_SE_SHIFT,
82                 ARRAY_SIZE(micx_input_type_text), micx_input_type_text);
83
84 static const struct soc_enum mic2_input_type_enum =
85         SOC_ENUM_SINGLE(ES_MIC2_CTRL, ES_MIC2_SE_SHIFT,
86                 ARRAY_SIZE(micx_input_type_text), micx_input_type_text);
87
88 static const struct soc_enum michs_input_type_enum =
89         SOC_ENUM_SINGLE(ES_MICHS_CTRL, ES_MICHS_SE_SHIFT,
90                 ARRAY_SIZE(micx_input_type_text), micx_input_type_text);
91
92 static const struct soc_enum auxin_input_type_enum =
93         SOC_ENUM_SINGLE(ES_AUX_R_CTRL, ES_AUXR_SE_SHIFT,
94                 ARRAY_SIZE(micx_input_type_text), micx_input_type_text);
95
96 static const char * const micx_bias_output_voltage_text[] = {
97         "1.6V", "1.8V", "2.0V", "2.2V", "2.4V", "2.6V", "2.8V", "3.0V",
98 };
99
100 static const unsigned int micx_bias_output_voltage_value[] = {
101         0, 1, 2, 3, 4, 5, 6, 7,
102 };
103
104 static const struct soc_enum mic0_bias_output_voltage_enum =
105         SOC_VALUE_ENUM_SINGLE(ES_MB_TRIM2, ES_MB0_TRIM_SHIFT,
106                 ES_MB0_TRIM_MASK, ARRAY_SIZE(micx_bias_output_voltage_text),
107                         micx_bias_output_voltage_text,
108                         micx_bias_output_voltage_value);
109
110 static const struct soc_enum mic1_bias_output_voltage_enum =
111         SOC_VALUE_ENUM_SINGLE(ES_MB_TRIM2, ES_MB1_TRIM_SHIFT,
112                 ES_MB1_TRIM_MASK, ARRAY_SIZE(micx_bias_output_voltage_text),
113                         micx_bias_output_voltage_text,
114                         micx_bias_output_voltage_value);
115
116 static const struct soc_enum mic2_bias_output_voltage_enum =
117         SOC_VALUE_ENUM_SINGLE(ES_MB_TRIM1, ES_MB2_TRIM_SHIFT,
118                 ES_MB2_TRIM_MASK, ARRAY_SIZE(micx_bias_output_voltage_text),
119                         micx_bias_output_voltage_text,
120                         micx_bias_output_voltage_value);
121
122 static const struct soc_enum michs_bias_output_voltage_enum =
123         SOC_VALUE_ENUM_SINGLE(ES_MB_TRIM1, ES_MBHS_TRIM_SHIFT,
124                 ES_MBHS_TRIM_MASK, ARRAY_SIZE(micx_bias_output_voltage_text),
125                         micx_bias_output_voltage_text,
126                         micx_bias_output_voltage_value);
127
128 static const char * const micx_zin_mode_text[] = {
129         "100kohm", "50kohm", "25kohm", "Attenuate by 3dB",
130 };
131
132 static const struct soc_enum mic0_zin_mode_enum =
133         SOC_ENUM_SINGLE(ES_MIC_TUNE, ES_MIC0_ZIN_MODE_SHIFT,
134                 ARRAY_SIZE(micx_zin_mode_text), micx_zin_mode_text);
135
136 static const struct soc_enum mic1_zin_mode_enum =
137         SOC_ENUM_SINGLE(ES_MIC_TUNE, ES_MIC1_ZIN_MODE_SHIFT,
138                 ARRAY_SIZE(micx_zin_mode_text), micx_zin_mode_text);
139
140 static const struct soc_enum mic2_zin_mode_enum =
141         SOC_ENUM_SINGLE(ES_MIC_TUNE, ES_MIC2_ZIN_MODE_SHIFT,
142                 ARRAY_SIZE(micx_zin_mode_text), micx_zin_mode_text);
143
144 static const struct soc_enum michs_zin_mode_enum =
145         SOC_ENUM_SINGLE(ES_MIC_TUNE, ES_MICHS_ZIN_MODE_SHIFT,
146                 ARRAY_SIZE(micx_zin_mode_text), micx_zin_mode_text);
147
148 static const char * const bps_text[] = {
149         "0", "16", "20", "24", "32",
150 };
151
152 static const unsigned int bps_value_text[] = {
153         0, 15, 19, 23, 31,
154 };
155
156 static const struct soc_enum bps_enum =
157         SOC_VALUE_ENUM_SINGLE(ES_DAC_DIG_I2S1, ES_BITS_PER_SAMPLE_SHIFT,
158                 ES_BITS_PER_SAMPLE_MASK, ARRAY_SIZE(bps_text),
159                         bps_text, bps_value_text);
160
161 const struct snd_kcontrol_new es_codec_snd_controls[] = {
162
163         SOC_SINGLE("Bypass Alc", ES_SPKR_ALC1, BYPASS_ALC_SHIFT, 0x01, 0),
164         SOC_DOUBLE_R_TLV("SPKR Gain", ES_SPKR_L_GAIN, ES_SPKR_R_GAIN,
165                         0, 0x1F, 0, spkr_tlv),
166         SOC_DOUBLE_R_TLV("LO Gain", ES_LO_L_GAIN, ES_LO_R_GAIN,
167                         0, 0x0F, 0, lo_tlv),
168         SOC_DOUBLE_R_TLV("HP Gain", ES_HP_L_GAIN, ES_HP_R_GAIN,
169                         0, 0x0F, 0, hp_tlv),
170         SOC_DOUBLE_R_TLV("AUXIN Gain", ES_AUX_L_CTRL, ES_AUX_R_CTRL,
171                         1, 0x14, 0, aux_tlv),
172
173
174         SOC_SINGLE_TLV("SPKRL Gain", ES_SPKR_L_GAIN, ES_SPKRL_GAIN_SHIFT,
175                         ES_SPKRL_GAIN_MAX, 0, spkr_tlv),
176         SOC_SINGLE_TLV("SPKRR Gain", ES_SPKR_R_GAIN, ES_SPKRR_GAIN_SHIFT,
177                         ES_SPKRR_GAIN_MAX, 0, spkr_tlv),
178         SOC_SINGLE_TLV("LOL Gain", ES_LO_L_GAIN, ES_LO_L_GAIN_SHIFT,
179                         ES_LO_L_GAIN_MAX, 0, lo_tlv),
180         SOC_SINGLE_TLV("LOR Gain", ES_LO_R_GAIN, ES_LO_R_GAIN_SHIFT,
181                         ES_LO_R_GAIN_MAX, 0, lo_tlv),
182         SOC_SINGLE_TLV("HPL Gain", ES_HP_L_GAIN, ES_HPL_GAIN_SHIFT,
183                         ES_HPL_GAIN_MAX, 0, hp_tlv),
184         SOC_SINGLE_TLV("HPR Gain", ES_HP_R_GAIN, ES_HPR_GAIN_SHIFT,
185                         ES_HPR_GAIN_MAX, 0, hp_tlv),
186         SOC_SINGLE_TLV("EP Gain", ES_EP_GAIN, ES_EP_GAIN_SHIFT,
187                         ES_EP_GAIN_MAX, 0, ep_tlv),
188         SOC_SINGLE_TLV("AUXINL Gain", ES_AUX_L_CTRL, ES_AUXL_GAIN_SHIFT,
189                         ES_AUXL_GAIN_MAX, 0, aux_tlv),
190         SOC_SINGLE_TLV("AUXINR Gain", ES_AUX_R_CTRL, ES_AUXR_GAIN_SHIFT,
191                         ES_AUXR_GAIN_MAX, 0, aux_tlv),
192
193
194         SOC_SINGLE_TLV("MIC0 Gain", ES_MIC0_CTRL, ES_MIC0_GAIN_SHIFT,
195                         ES_MIC0_GAIN_MAX, 0, mic_tlv),
196         SOC_SINGLE_TLV("MIC1 Gain", ES_MIC1_CTRL, ES_MIC1_GAIN_SHIFT,
197                         ES_MIC1_GAIN_MAX, 0, mic_tlv),
198         SOC_SINGLE_TLV("MIC2 Gain", ES_MIC2_CTRL, ES_MIC2_GAIN_SHIFT,
199                         ES_MIC2_GAIN_MAX, 0, mic_tlv),
200         SOC_SINGLE_TLV("MICHS Gain", ES_MICHS_CTRL, ES_MICHS_GAIN_SHIFT,
201                         ES_MICHS_GAIN_MAX, 0, mic_tlv),
202
203
204         SOC_ENUM("AUXL Mono", auxl_mono_enum),
205         SOC_ENUM("AUXR Mono", auxr_mono_enum),
206         SOC_SINGLE("ADC Mute", ES_ADC_CTRL, ES_ADC_MUTE_SHIFT, 1, 0),
207         SOC_SINGLE("EP Mute", ES_EP_GAIN, ES_EP_MUTE_SHIFT, 1, 0),
208         SOC_SINGLE("HPL Mute", ES_HP_L_GAIN, ES_HPL_MUTE_SHIFT, 1, 0),
209         SOC_SINGLE("HPR Mute", ES_HP_R_GAIN, ES_HPR_MUTE_SHIFT, 1, 0),
210         SOC_SINGLE("SPKRL Mute", ES_SPKR_L_GAIN, ES_SPKRL_MUTE_SHIFT, 1, 0),
211         SOC_SINGLE("SPKRR Mute", ES_SPKR_R_GAIN, ES_SPKRR_MUTE_SHIFT, 1, 0),
212         SOC_SINGLE("LOL Mute", ES_LO_L_GAIN, ES_LO_L_MUTE_SHIFT, 1, 0),
213         SOC_SINGLE("LOR Mute", ES_LO_R_GAIN, ES_LO_R_MUTE_SHIFT, 1, 0),
214
215         SOC_ENUM("I2S Channels", i2s_ch_enum),
216         SOC_ENUM("FrameSync SEL", fs_sel_enum),
217         SOC_VALUE_ENUM("Bits per Sample", bps_enum),
218
219         SOC_ENUM("MICHS SEL MUX", michs_sel_mux_enum),
220
221         SOC_ENUM("MIC0 Input Type", mic0_input_type_enum),
222         SOC_ENUM("MIC1 Input Type", mic1_input_type_enum),
223         SOC_ENUM("MIC2 Input Type", mic2_input_type_enum),
224         SOC_ENUM("MICHS Input Type", michs_input_type_enum),
225         SOC_ENUM("AUXIN Input Type", auxin_input_type_enum),
226
227         SOC_VALUE_ENUM("MIC0 Bias Output Voltage",
228                         mic0_bias_output_voltage_enum),
229         SOC_VALUE_ENUM("MIC1 Bias Output Voltage",
230                         mic1_bias_output_voltage_enum),
231         SOC_VALUE_ENUM("MIC2 Bias Output Voltage",
232                         mic2_bias_output_voltage_enum),
233         SOC_VALUE_ENUM("MICHS Bias Output Voltage",
234                         michs_bias_output_voltage_enum),
235
236         SOC_ENUM("MIC0 Input Impedance Mode", mic0_zin_mode_enum),
237         SOC_ENUM("MIC1 Input Impedance Mode", mic1_zin_mode_enum),
238         SOC_ENUM("MIC2 Input Impedance Mode", mic2_zin_mode_enum),
239         SOC_ENUM("MICHS Input Impedance Mode", michs_zin_mode_enum),
240 };
241
242 static const char * const adc1_mux_text[] = {
243         "MIC1_PGA", "MIC2_PGA",
244 };
245
246 static const struct soc_enum adc1_mux_enum =
247         SOC_ENUM_SINGLE(ES_ADC_CTRL, ES_ADC1_IN_SEL_SHIFT,
248                 ARRAY_SIZE(adc1_mux_text), adc1_mux_text);
249
250 static const struct snd_kcontrol_new adc1_mux =
251                 SOC_DAPM_ENUM("ADC1 MUX Mux", adc1_mux_enum);
252
253 static const char * const adc2_mux_text[] = {
254         "MIC2_PGA", "AUXR_PGA",
255 };
256
257 static const struct soc_enum adc2_mux_enum =
258         SOC_ENUM_SINGLE(ES_ADC_CTRL, ES_ADC2_IN_SEL_SHIFT,
259                 ARRAY_SIZE(adc2_mux_text), adc2_mux_text);
260
261 static const struct snd_kcontrol_new adc2_mux =
262                 SOC_DAPM_ENUM("ADC2 MUX Mux", adc2_mux_enum);
263
264
265 static const struct snd_kcontrol_new ep_mix[] = {
266         SOC_DAPM_SINGLE("DAC0L", ES_EP_CTRL, ES_DAC0L_TO_EP_SHIFT, 1, 0),
267         SOC_DAPM_SINGLE("AUXL", ES_EP_CTRL, ES_AUXL_TO_EP_SHIFT, 1, 0),
268 };
269
270 static const struct snd_kcontrol_new hpl_mix[] = {
271         SOC_DAPM_SINGLE("DAC0L", ES_HP_L_CTRL, ES_DAC0L_TO_HPL_SHIFT, 1, 0),
272         SOC_DAPM_SINGLE("AUXL", ES_HP_L_CTRL, ES_AUXL_TO_HPL_SHIFT, 1, 0),
273 };
274
275 static const struct snd_kcontrol_new hpr_mix[] = {
276         SOC_DAPM_SINGLE("DAC0R", ES_HP_R_CTRL, ES_DAC0R_TO_HPR_SHIFT, 1, 0),
277         SOC_DAPM_SINGLE("AUXR", ES_HP_R_CTRL, ES_AUXR_TO_HPR_SHIFT, 1, 0),
278 };
279
280 static const struct snd_kcontrol_new spkrl_mix[] = {
281         SOC_DAPM_SINGLE("DAC0L", ES_SPKR_L_CTRL, ES_DAC0L_TO_SPKRL_SHIFT, 1, 0),
282         SOC_DAPM_SINGLE("DAC1L", ES_SPKR_L_CTRL, ES_DAC1L_TO_SPKRL_SHIFT, 1, 0),
283         SOC_DAPM_SINGLE("AUXL", ES_SPKR_L_CTRL, ES_AUXL_TO_SPKRL_SHIFT, 1, 0),
284 };
285
286 static const struct snd_kcontrol_new spkrr_mix[] = {
287         SOC_DAPM_SINGLE("DAC0R", ES_SPKR_R_CTRL, ES_DAC0R_TO_SPKRR_SHIFT, 1, 0),
288         SOC_DAPM_SINGLE("DAC1R", ES_SPKR_R_CTRL, ES_DAC1R_TO_SPKRR_SHIFT, 1, 0),
289         SOC_DAPM_SINGLE("AUXR", ES_SPKR_R_CTRL, ES_AUXR_TO_SPKRR_SHIFT, 1, 0),
290 };
291
292 static const struct snd_kcontrol_new lo_l_mix[] = {
293         SOC_DAPM_SINGLE("DAC0L", ES_LO_L_CTRL, ES_DAC0L_TO_LO_L_SHIFT, 1, 0),
294         SOC_DAPM_SINGLE("DAC1L", ES_LO_L_CTRL, ES_DAC1L_TO_LO_L_SHIFT, 1, 0),
295         SOC_DAPM_SINGLE("AUXL", ES_LO_L_CTRL, ES_AUXL_TO_LO_L_SHIFT, 1, 0),
296 };
297
298 static const struct snd_kcontrol_new lo_r_mix[] = {
299         SOC_DAPM_SINGLE("DAC0R", ES_LO_R_CTRL, ES_DAC0R_TO_LO_R_SHIFT, 1, 0),
300         SOC_DAPM_SINGLE("DAC1R", ES_LO_R_CTRL, ES_DAC1R_TO_LO_R_SHIFT, 1, 0),
301         SOC_DAPM_SINGLE("AUXR", ES_LO_R_CTRL, ES_AUXR_TO_LO_R_SHIFT, 1, 0),
302 };
303
304 static const struct snd_kcontrol_new michs_control =
305         SOC_DAPM_SINGLE("Switch", ES_MICHS_CTRL, ES_MICHS_ON_SHIFT, 1, 0);
306
307 static int es_lo_enable(struct snd_soc_dapm_widget *w,
308         struct snd_kcontrol *kcontrol, int event)
309 {
310         struct snd_soc_codec *codec = w->codec;
311         pr_debug("%s LO event %d\n", __func__, event);
312
313         switch (event) {
314         case SND_SOC_DAPM_PRE_PMU:
315                 snd_soc_update_bits(codec, ES_LO_L_CTRL, ES_LO_TRIM_DIS_MASK,
316                         ES_LO_TRIM_DIS);
317                 break;
318         case SND_SOC_DAPM_POST_PMD:
319                 snd_soc_update_bits(codec, ES_LO_L_CTRL, ES_LO_TRIM_DIS_MASK,
320                         0);
321                 break;
322         }
323         return 0;
324 }
325
326 static int es_dac_enable(struct snd_soc_dapm_widget *w,
327         struct snd_kcontrol *kcontrol, int event)
328 {
329         struct snd_soc_codec *codec = w->codec;
330         unsigned int val;
331         pr_debug("%s DAC%d event %d\n", __func__, w->shift, event);
332
333         switch (event) {
334         case SND_SOC_DAPM_PRE_PMU:
335                 snd_soc_update_bits(codec, w->reg, 1<<w->shift, 1<<w->shift);
336                 snd_soc_update_bits(codec, ES_DAC_DIG_EN, ES_DIG_CLK_EN_MASK,
337                         ES_DIG_CLK_EN);
338                 snd_soc_update_bits(codec, ES_DAC_DIG_EN, ES_DAC_CLK_EN_MASK,
339                         ES_DAC_CLK_EN);
340                 break;
341         case SND_SOC_DAPM_POST_PMD:
342                 snd_soc_update_bits(codec, w->reg, 1<<w->shift , 0);
343                 snd_soc_update_bits(codec, ES_DAC_DIG_EN, ES_DIG_CLK_EN_MASK,
344                         0);
345                 snd_soc_update_bits(codec, ES_DAC_DIG_EN, ES_DAC_CLK_EN_MASK,
346                                 0);
347                 break;
348         }
349
350         /* find which DAC is enabled */
351         val = snd_soc_read(codec, ES_DAC_CTRL);
352         snd_soc_update_bits(codec, ES_DAC_DIG_EN, ES_DAC0_LEFT_EN_MASK |
353                 ES_DAC0_RIGHT_EN_MASK | ES_DAC1_LEFT_EN_MASK |
354                 ES_DAC1_RIGHT_EN_MASK, val);
355
356         return 0;
357 }
358
359 static int mic_event(struct snd_soc_dapm_widget *w,
360                 struct snd_kcontrol *k, int event)
361 {
362         struct snd_soc_codec *codec = w->codec;
363         pr_debug("%s() %x\n", __func__, SND_SOC_DAPM_EVENT_ON(event));
364
365         if (SND_SOC_DAPM_EVENT_ON(event)) {
366                 if (!strncmp(w->name, "MIC0", 4))
367                         snd_soc_update_bits(codec, ES_MIC0_CTRL,
368                                         ES_MIC0_ON_MASK, 1);
369                 else if (!strncmp(w->name, "MIC1", 4))
370                         snd_soc_update_bits(codec, ES_MIC1_CTRL,
371                                         ES_MIC1_ON_MASK, 1);
372                 else if (!strncmp(w->name, "MIC2", 4))
373                         snd_soc_update_bits(codec, ES_MIC2_CTRL,
374                                         ES_MIC2_ON_MASK, 1);
375                 else {
376                         pr_err("%s() Invalid Mic Widget ON = %s\n",
377                                         __func__, w->name);
378                         return -EINVAL;
379                 }
380
381         } else {
382                 if (!strncmp(w->name, "MIC0", 4))
383                         snd_soc_update_bits(codec, ES_MIC0_CTRL,
384                                 ES_MIC0_ON_MASK, 0);
385                 else if (!strncmp(w->name, "MIC1", 4))
386                         snd_soc_update_bits(codec, ES_MIC1_CTRL,
387                                 ES_MIC1_ON_MASK, 0);
388                 else if (!strncmp(w->name, "MIC2", 4))
389                         snd_soc_update_bits(codec, ES_MIC2_CTRL,
390                                 ES_MIC2_ON_MASK, 0);
391                 else {
392                         pr_err("%s() Invalid Mic Widget OFF = %s\n",
393                                         __func__, w->name);
394                         return -EINVAL;
395                 }
396         }
397         return 0;
398 }
399
400 const struct snd_soc_dapm_widget es_codec_dapm_widgets[] = {
401
402         /* Inputs */
403         SND_SOC_DAPM_MIC("MIC0", mic_event),
404         SND_SOC_DAPM_MIC("MIC1", mic_event),
405         SND_SOC_DAPM_MIC("MIC2", mic_event),
406         SND_SOC_DAPM_MIC("MICHS", NULL),
407         SND_SOC_DAPM_MIC("AUXINM", NULL),
408         SND_SOC_DAPM_MIC("AUXINP", NULL),
409
410         /* Outputs */
411         SND_SOC_DAPM_HP("HPL", NULL),
412         SND_SOC_DAPM_HP("HPR", NULL),
413         SND_SOC_DAPM_SPK("SPKRL", NULL),
414         SND_SOC_DAPM_SPK("SPKRR", NULL),
415         SND_SOC_DAPM_OUTPUT("EP"),
416         SND_SOC_DAPM_LINE("AUXOUTL", NULL),
417         SND_SOC_DAPM_LINE("AUXOUTR", NULL),
418
419         /* Microphone bias */
420         SND_SOC_DAPM_SUPPLY("MICHS Bias", ES_MICBIAS_CTRL,
421                 ES_MBIASHS_MODE_SHIFT, 0, NULL, 0),
422         SND_SOC_DAPM_SUPPLY("MIC0 Bias", ES_MICBIAS_CTRL,
423                 ES_MBIAS0_MODE_SHIFT, 0, NULL, 0),
424         SND_SOC_DAPM_SUPPLY("MIC1 Bias", ES_MICBIAS_CTRL,
425                 ES_MBIAS1_MODE_SHIFT, 0, NULL, 0),
426         SND_SOC_DAPM_SUPPLY("MIC2 Bias", ES_MICBIAS_CTRL,
427                 ES_MBIAS2_MODE_SHIFT, 0, NULL, 0),
428
429         /* Mic headset Switch ON/OFF */
430         SND_SOC_DAPM_SWITCH("MICHS ON", SND_SOC_NOPM, 0, 0, &michs_control),
431
432         /* ADC */
433         SND_SOC_DAPM_ADC("ADC0", NULL, ES_ADC_CTRL, ES_ADC0_ON_SHIFT, 0),
434         SND_SOC_DAPM_MUX("ADC1 MUX", SND_SOC_NOPM, 0, 0, &adc1_mux),
435         SND_SOC_DAPM_ADC("ADC1", NULL, ES_ADC_CTRL, ES_ADC1_ON_SHIFT, 0),
436         SND_SOC_DAPM_MUX("ADC2 MUX", SND_SOC_NOPM, 0, 0, &adc2_mux),
437         SND_SOC_DAPM_ADC("ADC2", NULL, ES_ADC_CTRL, ES_ADC2_ON_SHIFT, 0),
438         SND_SOC_DAPM_ADC("ADC3", NULL, ES_ADC_CTRL, ES_ADC3_ON_SHIFT, 0),
439
440         /* DAC */
441         SND_SOC_DAPM_DAC_E("DAC0L", NULL, ES_DAC_CTRL, ES_DAC0L_ON_SHIFT,
442                 0, es_dac_enable, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
443         SND_SOC_DAPM_DAC_E("DAC0R", NULL, ES_DAC_CTRL, ES_DAC0R_ON_SHIFT,
444                 0, es_dac_enable, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
445         SND_SOC_DAPM_DAC_E("DAC1L", NULL, ES_DAC_CTRL, ES_DAC1L_ON_SHIFT,
446                 0, es_dac_enable, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
447         SND_SOC_DAPM_DAC_E("DAC1R", NULL, ES_DAC_CTRL, ES_DAC1R_ON_SHIFT,
448                 0, es_dac_enable, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
449
450         /* Earphone Mixer */
451         SND_SOC_DAPM_MIXER("EP MIXER", SND_SOC_NOPM, 0, 0,
452                 ep_mix, ARRAY_SIZE(ep_mix)),
453
454         /* Headphone Mixer */
455         SND_SOC_DAPM_MIXER("HPL MIXER", SND_SOC_NOPM, 0, 0,
456                 hpl_mix, ARRAY_SIZE(hpl_mix)),
457         SND_SOC_DAPM_MIXER("HPR MIXER", SND_SOC_NOPM, 0, 0,
458                 hpr_mix, ARRAY_SIZE(hpr_mix)),
459
460         /* Handsfree Mixer */
461         SND_SOC_DAPM_MIXER("SPKRL MIXER", SND_SOC_NOPM, 0, 0,
462                 spkrl_mix, ARRAY_SIZE(spkrl_mix)),
463         SND_SOC_DAPM_MIXER("SPKRR MIXER", SND_SOC_NOPM, 0, 0,
464                 spkrr_mix, ARRAY_SIZE(spkrr_mix)),
465
466         /* LineOut Mixer */
467         SND_SOC_DAPM_MIXER("LOL MIXER", SND_SOC_NOPM, 0, 0,
468                 lo_l_mix, ARRAY_SIZE(lo_l_mix)),
469         SND_SOC_DAPM_MIXER("LOR MIXER", SND_SOC_NOPM, 0, 0,
470                 lo_r_mix, ARRAY_SIZE(lo_r_mix)),
471
472         /* Output PGAs */
473         SND_SOC_DAPM_PGA("SPKRL PGA", ES_SPKR_L_CTRL, ES_SPKRL_ON_SHIFT,
474                 0, NULL, 0),
475         SND_SOC_DAPM_PGA("SPKRR PGA", ES_SPKR_R_CTRL, ES_SPKRR_ON_SHIFT,
476                 0, NULL, 0),
477         SND_SOC_DAPM_PGA("HPL PGA", ES_HP_L_CTRL, ES_HPL_ON_SHIFT, 0, NULL, 0),
478         SND_SOC_DAPM_PGA("HPR PGA", ES_HP_R_CTRL, ES_HPR_ON_SHIFT, 0, NULL, 0),
479         SND_SOC_DAPM_PGA_E("LOL PGA", ES_LO_L_CTRL, ES_LO_L_ON_SHIFT, 0, NULL,
480                 0, es_lo_enable, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
481         SND_SOC_DAPM_PGA_E("LOR PGA", ES_LO_R_CTRL, ES_LO_R_ON_SHIFT, 0, NULL,
482                 0, es_lo_enable, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
483         SND_SOC_DAPM_PGA("EP PGA", ES_EP_CTRL, ES_EP_ON_SHIFT, 0, NULL, 0),
484
485         /* Input PGAs */
486         SND_SOC_DAPM_PGA("MIC0 PGA", SND_SOC_NOPM, 0, 0, NULL, 0),
487         SND_SOC_DAPM_PGA("MIC1 PGA", SND_SOC_NOPM, 0, 0, NULL, 0),
488         SND_SOC_DAPM_PGA("MIC2 PGA", SND_SOC_NOPM, 0, 0, NULL, 0),
489         SND_SOC_DAPM_PGA("AUXINL PGA", ES_AUX_L_CTRL, ES_AUXL_ON_SHIFT, 0,
490                 NULL, 0),
491         SND_SOC_DAPM_PGA("AUXINR PGA", ES_AUX_R_CTRL, ES_AUXR_ON_SHIFT, 0,
492                 NULL, 0),
493
494 };
495
496 /* TODO */
497 static const struct snd_soc_dapm_route intercon[] = {
498
499         /* Capture path */
500
501         {"MICHS", NULL, "MICHS Bias"},
502         {"MIC0", NULL, "MIC0 Bias"},
503         {"MIC1", NULL, "MIC1 Bias"},
504         {"MIC2", NULL, "MIC2 Bias"},
505
506         {"MICHS ON", "Switch", "MICHS"},
507
508         {"MIC0 PGA", NULL, "MIC0"},
509         {"MIC1 PGA", NULL, "MIC1"},
510         {"MIC1 PGA", NULL, "MICHS ON"},
511         {"MIC2 PGA", NULL, "MIC2"},
512         {"MIC2 PGA", NULL, "MICHS ON"},
513
514         {"AUXINL PGA", NULL, "AUXINP"},
515         {"AUXINR PGA", NULL, "AUXINM"},
516
517         {"ADC0", NULL, "MIC0 PGA"},
518         {"ADC1 MUX", "MIC1_PGA", "MIC1 PGA"},
519         {"ADC1 MUX", "MIC2_PGA", "MIC2 PGA"},
520         {"ADC2 MUX", "MIC2_PGA", "MIC2 PGA"},
521         {"ADC2 MUX", "AUXR_PGA", "AUXINR PGA"},
522         {"ADC3", NULL, "AUXINL PGA"},
523
524         {"ADC1", NULL, "ADC1 MUX"},
525         {"ADC2", NULL, "ADC2 MUX"},
526
527         /* Playback path */
528
529         {"SPKRL MIXER", "DAC0L", "DAC0L"},
530         {"SPKRL MIXER", "DAC1L", "DAC1L"},
531         {"SPKRL MIXER", "AUXL", "AUXINL PGA"},
532
533         {"SPKRR MIXER", "DAC0R", "DAC0R"},
534         {"SPKRR MIXER", "DAC1R", "DAC1R"},
535         {"SPKRR MIXER", "AUXR", "AUXINR PGA"},
536
537         {"HPL MIXER", "DAC0L", "DAC0L"},
538         {"HPL MIXER", "AUXL", "AUXINL PGA"},
539
540         {"HPR MIXER", "DAC0R", "DAC0R"},
541         {"HPR MIXER", "AUXR", "AUXINR PGA"},
542
543         {"EP MIXER", "DAC0L", "DAC0L"},
544         {"EP MIXER", "AUXL", "AUXINL PGA"},
545
546         {"LOL MIXER", "DAC0L", "DAC0L"},
547         {"LOL MIXER", "DAC1L", "DAC1L"},
548         {"LOL MIXER", "AUXL", "AUXINL PGA"},
549
550         {"LOR MIXER", "DAC0R", "DAC0R"},
551         {"LOR MIXER", "DAC1R", "DAC1R"},
552         {"LOR MIXER", "AUXR", "AUXINR PGA"},
553
554         {"LOL PGA", NULL, "LOL MIXER"},
555         {"LOR PGA", NULL, "LOR MIXER"},
556         {"HPL PGA", NULL, "HPL MIXER"},
557         {"HPR PGA", NULL, "HPR MIXER"},
558         {"SPKRL PGA", NULL, "SPKRL MIXER"},
559         {"SPKRR PGA", NULL, "SPKRR MIXER"},
560         {"EP PGA", NULL, "EP MIXER"},
561
562         {"AUXOUTL", NULL, "LOL PGA"},
563         {"AUXOUTR", NULL, "LOR PGA"},
564         {"HPL", NULL, "HPL PGA"},
565         {"HPR", NULL, "HPR PGA"},
566         {"SPKRL", NULL, "SPKRL PGA"},
567         {"SPKRR", NULL, "SPKRR PGA"},
568         {"EP", NULL, "EP PGA"},
569
570 };
571
572 int es_analog_add_snd_soc_controls(struct snd_soc_codec *codec)
573 {
574         int rc;
575
576         rc = snd_soc_add_codec_controls(codec, es_codec_snd_controls,
577                         ARRAY_SIZE(es_codec_snd_controls));
578
579         return rc;
580 }
581 int es_analog_add_snd_soc_dapm_controls(struct snd_soc_codec *codec)
582 {
583         int rc;
584
585         rc = snd_soc_dapm_new_controls(&codec->dapm, es_codec_dapm_widgets,
586                                         ARRAY_SIZE(es_codec_dapm_widgets));
587
588         return rc;
589 }
590 int es_analog_add_snd_soc_route_map(struct snd_soc_codec *codec)
591 {
592         int rc;
593
594         rc = snd_soc_dapm_add_routes(&codec->dapm, intercon,
595                                         ARRAY_SIZE(intercon));
596
597         return rc;
598 }