ed29619df53f92331b57cc608521596c3c8e3a0d
[firefly-linux-kernel-4.4.55.git] / sound / soc / codecs / rt5640.c
1 /*
2  * rt5640.c  --  RT5640/RT5639 ALSA SoC audio codec driver
3  *
4  * Copyright 2011 Realtek Semiconductor Corp.
5  * Author: Johnny Hsu <johnnyhsu@realtek.com>
6  * Copyright (c) 2013, NVIDIA CORPORATION.  All rights reserved.
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 #include <linux/module.h>
13 #include <linux/moduleparam.h>
14 #include <linux/init.h>
15 #include <linux/delay.h>
16 #include <linux/pm.h>
17 #include <linux/gpio.h>
18 #include <linux/i2c.h>
19 #include <linux/regmap.h>
20 #include <linux/of.h>
21 #include <linux/of_gpio.h>
22 #include <linux/platform_device.h>
23 #include <linux/spi/spi.h>
24 #include <linux/acpi.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/soc-dapm.h>
30 #include <sound/initval.h>
31 #include <sound/tlv.h>
32 #include <sound/jack.h>
33 #include "rl6231.h"
34 #include "rt5640.h"
35 #include <linux/iio/iio.h>
36 #include <linux/iio/machine.h>
37 #include <linux/iio/driver.h>
38 #include <linux/iio/consumer.h>
39
40 #define RT5640_ADC_EMPTY_ADVALUE                        950
41 #define RT5640_ADC_DRIFT_ADVALUE                        70
42 #define RT5640_ADC_INVALID_ADVALUE                      -1
43 #define RT5640_ADC_SAMPLE_JIFFIES (100 / (MSEC_PER_SEC / HZ))   /* 100ms */
44 #define RT5640_DEVICE_ID 0x6231
45 #define RT5640_PR_RANGE_BASE (0xff + 1)
46 #define RT5640_PR_SPACING 0x100
47 #define RT5640_PR_BASE (RT5640_PR_RANGE_BASE + (0 * RT5640_PR_SPACING))
48
49 static const struct regmap_range_cfg rt5640_ranges[] = {
50         { .name = "PR", .range_min = RT5640_PR_BASE,
51           .range_max = RT5640_PR_BASE + 0xb4,
52           .selector_reg = RT5640_PRIV_INDEX,
53           .selector_mask = 0xff,
54           .selector_shift = 0x0,
55           .window_start = RT5640_PRIV_DATA,
56           .window_len = 0x1, },
57 };
58
59 static const struct reg_sequence init_list[] = {
60         {RT5640_PR_BASE + 0x3d, 0x3600},
61         {RT5640_PR_BASE + 0x12, 0x0aa8},
62         {RT5640_PR_BASE + 0x14, 0x0aaa},
63         {RT5640_PR_BASE + 0x20, 0x6110},
64         {RT5640_PR_BASE + 0x21, 0xe0e0},
65         {RT5640_PR_BASE + 0x23, 0x1804},
66 };
67
68 static const struct reg_default rt5640_reg[] = {
69         { 0x00, 0x000e },
70         { 0x01, 0xc8c8 },
71         { 0x02, 0xc8c8 },
72         { 0x03, 0xc8c8 },
73         { 0x04, 0x8000 },
74         { 0x0d, 0x0000 },
75         { 0x0e, 0x0000 },
76         { 0x0f, 0x0808 },
77         { 0x19, 0xafaf },
78         { 0x1a, 0xafaf },
79         { 0x1b, 0x0000 },
80         { 0x1c, 0x2f2f },
81         { 0x1d, 0x2f2f },
82         { 0x1e, 0x0000 },
83         { 0x27, 0x7060 },
84         { 0x28, 0x7070 },
85         { 0x29, 0x8080 },
86         { 0x2a, 0x5454 },
87         { 0x2b, 0x5454 },
88         { 0x2c, 0xaa00 },
89         { 0x2d, 0x0000 },
90         { 0x2e, 0xa000 },
91         { 0x2f, 0x0000 },
92         { 0x3b, 0x0000 },
93         { 0x3c, 0x007f },
94         { 0x3d, 0x0000 },
95         { 0x3e, 0x007f },
96         { 0x45, 0xe000 },
97         { 0x46, 0x003e },
98         { 0x47, 0x003e },
99         { 0x48, 0xf800 },
100         { 0x49, 0x3800 },
101         { 0x4a, 0x0004 },
102         { 0x4c, 0xfc00 },
103         { 0x4d, 0x0000 },
104         { 0x4f, 0x01ff },
105         { 0x50, 0x0000 },
106         { 0x51, 0x0000 },
107         { 0x52, 0x01ff },
108         { 0x53, 0xf000 },
109         { 0x61, 0x0000 },
110         { 0x62, 0x0000 },
111         { 0x63, 0x00c0 },
112         { 0x64, 0x0000 },
113         { 0x65, 0x0000 },
114         { 0x66, 0x0000 },
115         { 0x6a, 0x0000 },
116         { 0x6c, 0x0000 },
117         { 0x70, 0x8000 },
118         { 0x71, 0x8000 },
119         { 0x72, 0x8000 },
120         { 0x73, 0x1114 },
121         { 0x74, 0x0c00 },
122         { 0x75, 0x1d00 },
123         { 0x80, 0x0000 },
124         { 0x81, 0x0000 },
125         { 0x82, 0x0000 },
126         { 0x83, 0x0000 },
127         { 0x84, 0x0000 },
128         { 0x85, 0x0008 },
129         { 0x89, 0x0000 },
130         { 0x8a, 0x0000 },
131         { 0x8b, 0x0600 },
132         { 0x8c, 0x0228 },
133         { 0x8d, 0xa000 },
134         { 0x8e, 0x0004 },
135         { 0x8f, 0x1100 },
136         { 0x90, 0x0646 },
137         { 0x91, 0x0c00 },
138         { 0x92, 0x0000 },
139         { 0x93, 0x3000 },
140         { 0xb0, 0x2080 },
141         { 0xb1, 0x0000 },
142         { 0xb4, 0x2206 },
143         { 0xb5, 0x1f00 },
144         { 0xb6, 0x0000 },
145         { 0xb8, 0x034b },
146         { 0xb9, 0x0066 },
147         { 0xba, 0x000b },
148         { 0xbb, 0x0000 },
149         { 0xbc, 0x0000 },
150         { 0xbd, 0x0000 },
151         { 0xbe, 0x0000 },
152         { 0xbf, 0x0000 },
153         { 0xc0, 0x0400 },
154         { 0xc2, 0x0000 },
155         { 0xc4, 0x0000 },
156         { 0xc5, 0x0000 },
157         { 0xc6, 0x2000 },
158         { 0xc8, 0x0000 },
159         { 0xc9, 0x0000 },
160         { 0xca, 0x0000 },
161         { 0xcb, 0x0000 },
162         { 0xcc, 0x0000 },
163         { 0xcf, 0x0013 },
164         { 0xd0, 0x0680 },
165         { 0xd1, 0x1c17 },
166         { 0xd2, 0x8c00 },
167         { 0xd3, 0xaa20 },
168         { 0xd6, 0x0400 },
169         { 0xd9, 0x0809 },
170         { 0xfe, 0x10ec },
171         { 0xff, 0x6231 },
172 };
173
174 static void rt5640_hp_gpio_ctrl(struct rt5640_priv *rt5640, bool enable)
175 {
176         dev_dbg(rt5640->codec->dev, "hp-con-gpio enable=%d\n", enable);
177         if (enable)
178                 gpio_set_value(rt5640->hp_con_gpio,
179                                rt5640->hp_con_gpio_active_high ? 1 : 0);
180         else
181                 gpio_set_value(rt5640->hp_con_gpio,
182                                rt5640->hp_con_gpio_active_high ? 0 : 1);
183 }
184
185 static int rt5640_reset(struct snd_soc_codec *codec)
186 {
187         return snd_soc_write(codec, RT5640_RESET, 0);
188 }
189
190 static bool rt5640_volatile_register(struct device *dev, unsigned int reg)
191 {
192         int i;
193
194         for (i = 0; i < ARRAY_SIZE(rt5640_ranges); i++)
195                 if ((reg >= rt5640_ranges[i].window_start &&
196                      reg <= rt5640_ranges[i].window_start +
197                      rt5640_ranges[i].window_len) ||
198                     (reg >= rt5640_ranges[i].range_min &&
199                      reg <= rt5640_ranges[i].range_max))
200                         return true;
201
202         switch (reg) {
203         case RT5640_RESET:
204         case RT5640_ASRC_5:
205         case RT5640_EQ_CTRL1:
206         case RT5640_DRC_AGC_1:
207         case RT5640_ANC_CTRL1:
208         case RT5640_IRQ_CTRL2:
209         case RT5640_INT_IRQ_ST:
210         case RT5640_DSP_CTRL2:
211         case RT5640_DSP_CTRL3:
212         case RT5640_PRIV_INDEX:
213         case RT5640_PRIV_DATA:
214         case RT5640_PGM_REG_ARR1:
215         case RT5640_PGM_REG_ARR3:
216         case RT5640_VENDOR_ID:
217         case RT5640_VENDOR_ID1:
218         case RT5640_VENDOR_ID2:
219                 return true;
220         default:
221                 return false;
222         }
223 }
224
225 static bool rt5640_readable_register(struct device *dev, unsigned int reg)
226 {
227         int i;
228
229         for (i = 0; i < ARRAY_SIZE(rt5640_ranges); i++)
230                 if ((reg >= rt5640_ranges[i].window_start &&
231                      reg <= rt5640_ranges[i].window_start +
232                      rt5640_ranges[i].window_len) ||
233                     (reg >= rt5640_ranges[i].range_min &&
234                      reg <= rt5640_ranges[i].range_max))
235                         return true;
236
237         switch (reg) {
238         case RT5640_RESET:
239         case RT5640_SPK_VOL:
240         case RT5640_HP_VOL:
241         case RT5640_OUTPUT:
242         case RT5640_MONO_OUT:
243         case RT5640_IN1_IN2:
244         case RT5640_IN3_IN4:
245         case RT5640_INL_INR_VOL:
246         case RT5640_DAC1_DIG_VOL:
247         case RT5640_DAC2_DIG_VOL:
248         case RT5640_DAC2_CTRL:
249         case RT5640_ADC_DIG_VOL:
250         case RT5640_ADC_DATA:
251         case RT5640_ADC_BST_VOL:
252         case RT5640_STO_ADC_MIXER:
253         case RT5640_MONO_ADC_MIXER:
254         case RT5640_AD_DA_MIXER:
255         case RT5640_STO_DAC_MIXER:
256         case RT5640_MONO_DAC_MIXER:
257         case RT5640_DIG_MIXER:
258         case RT5640_DSP_PATH1:
259         case RT5640_DSP_PATH2:
260         case RT5640_DIG_INF_DATA:
261         case RT5640_REC_L1_MIXER:
262         case RT5640_REC_L2_MIXER:
263         case RT5640_REC_R1_MIXER:
264         case RT5640_REC_R2_MIXER:
265         case RT5640_HPO_MIXER:
266         case RT5640_SPK_L_MIXER:
267         case RT5640_SPK_R_MIXER:
268         case RT5640_SPO_L_MIXER:
269         case RT5640_SPO_R_MIXER:
270         case RT5640_SPO_CLSD_RATIO:
271         case RT5640_MONO_MIXER:
272         case RT5640_OUT_L1_MIXER:
273         case RT5640_OUT_L2_MIXER:
274         case RT5640_OUT_L3_MIXER:
275         case RT5640_OUT_R1_MIXER:
276         case RT5640_OUT_R2_MIXER:
277         case RT5640_OUT_R3_MIXER:
278         case RT5640_LOUT_MIXER:
279         case RT5640_PWR_DIG1:
280         case RT5640_PWR_DIG2:
281         case RT5640_PWR_ANLG1:
282         case RT5640_PWR_ANLG2:
283         case RT5640_PWR_MIXER:
284         case RT5640_PWR_VOL:
285         case RT5640_PRIV_INDEX:
286         case RT5640_PRIV_DATA:
287         case RT5640_I2S1_SDP:
288         case RT5640_I2S2_SDP:
289         case RT5640_ADDA_CLK1:
290         case RT5640_ADDA_CLK2:
291         case RT5640_DMIC:
292         case RT5640_GLB_CLK:
293         case RT5640_PLL_CTRL1:
294         case RT5640_PLL_CTRL2:
295         case RT5640_ASRC_1:
296         case RT5640_ASRC_2:
297         case RT5640_ASRC_3:
298         case RT5640_ASRC_4:
299         case RT5640_ASRC_5:
300         case RT5640_HP_OVCD:
301         case RT5640_CLS_D_OVCD:
302         case RT5640_CLS_D_OUT:
303         case RT5640_DEPOP_M1:
304         case RT5640_DEPOP_M2:
305         case RT5640_DEPOP_M3:
306         case RT5640_CHARGE_PUMP:
307         case RT5640_PV_DET_SPK_G:
308         case RT5640_MICBIAS:
309         case RT5640_EQ_CTRL1:
310         case RT5640_EQ_CTRL2:
311         case RT5640_WIND_FILTER:
312         case RT5640_DRC_AGC_1:
313         case RT5640_DRC_AGC_2:
314         case RT5640_DRC_AGC_3:
315         case RT5640_SVOL_ZC:
316         case RT5640_ANC_CTRL1:
317         case RT5640_ANC_CTRL2:
318         case RT5640_ANC_CTRL3:
319         case RT5640_JD_CTRL:
320         case RT5640_ANC_JD:
321         case RT5640_IRQ_CTRL1:
322         case RT5640_IRQ_CTRL2:
323         case RT5640_INT_IRQ_ST:
324         case RT5640_GPIO_CTRL1:
325         case RT5640_GPIO_CTRL2:
326         case RT5640_GPIO_CTRL3:
327         case RT5640_DSP_CTRL1:
328         case RT5640_DSP_CTRL2:
329         case RT5640_DSP_CTRL3:
330         case RT5640_DSP_CTRL4:
331         case RT5640_PGM_REG_ARR1:
332         case RT5640_PGM_REG_ARR2:
333         case RT5640_PGM_REG_ARR3:
334         case RT5640_PGM_REG_ARR4:
335         case RT5640_PGM_REG_ARR5:
336         case RT5640_SCB_FUNC:
337         case RT5640_SCB_CTRL:
338         case RT5640_BASE_BACK:
339         case RT5640_MP3_PLUS1:
340         case RT5640_MP3_PLUS2:
341         case RT5640_3D_HP:
342         case RT5640_ADJ_HPF:
343         case RT5640_HP_CALIB_AMP_DET:
344         case RT5640_HP_CALIB2:
345         case RT5640_SV_ZCD1:
346         case RT5640_SV_ZCD2:
347         case RT5640_DUMMY1:
348         case RT5640_DUMMY2:
349         case RT5640_DUMMY3:
350         case RT5640_VENDOR_ID:
351         case RT5640_VENDOR_ID1:
352         case RT5640_VENDOR_ID2:
353                 return true;
354         default:
355                 return false;
356         }
357 }
358
359 static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0);
360 static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -65625, 375, 0);
361 static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0);
362 static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -17625, 375, 0);
363 static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0);
364
365 /* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */
366 static const DECLARE_TLV_DB_RANGE(bst_tlv,
367         0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
368         1, 1, TLV_DB_SCALE_ITEM(2000, 0, 0),
369         2, 2, TLV_DB_SCALE_ITEM(2400, 0, 0),
370         3, 5, TLV_DB_SCALE_ITEM(3000, 500, 0),
371         6, 6, TLV_DB_SCALE_ITEM(4400, 0, 0),
372         7, 7, TLV_DB_SCALE_ITEM(5000, 0, 0),
373         8, 8, TLV_DB_SCALE_ITEM(5200, 0, 0)
374 );
375
376 /* Interface data select */
377 static const char * const rt5640_data_select[] = {
378         "Normal", "Swap", "left copy to right", "right copy to left"};
379
380 static SOC_ENUM_SINGLE_DECL(rt5640_if1_dac_enum, RT5640_DIG_INF_DATA,
381                             RT5640_IF1_DAC_SEL_SFT, rt5640_data_select);
382
383 static SOC_ENUM_SINGLE_DECL(rt5640_if1_adc_enum, RT5640_DIG_INF_DATA,
384                             RT5640_IF1_ADC_SEL_SFT, rt5640_data_select);
385
386 static SOC_ENUM_SINGLE_DECL(rt5640_if2_dac_enum, RT5640_DIG_INF_DATA,
387                             RT5640_IF2_DAC_SEL_SFT, rt5640_data_select);
388
389 static SOC_ENUM_SINGLE_DECL(rt5640_if2_adc_enum, RT5640_DIG_INF_DATA,
390                             RT5640_IF2_ADC_SEL_SFT, rt5640_data_select);
391
392 /* Class D speaker gain ratio */
393 static const char * const rt5640_clsd_spk_ratio[] = {"1.66x", "1.83x", "1.94x",
394         "2x", "2.11x", "2.22x", "2.33x", "2.44x", "2.55x", "2.66x", "2.77x"};
395
396 static SOC_ENUM_SINGLE_DECL(rt5640_clsd_spk_ratio_enum, RT5640_CLS_D_OUT,
397                             RT5640_CLSD_RATIO_SFT, rt5640_clsd_spk_ratio);
398
399 static const struct snd_kcontrol_new rt5640_snd_controls[] = {
400         /* Speaker Output Volume */
401         SOC_DOUBLE("Speaker Channel Switch", RT5640_SPK_VOL,
402                 RT5640_VOL_L_SFT, RT5640_VOL_R_SFT, 1, 1),
403         SOC_DOUBLE_TLV("Speaker Playback Volume", RT5640_SPK_VOL,
404                 RT5640_L_VOL_SFT, RT5640_R_VOL_SFT, 39, 1, out_vol_tlv),
405         /* Headphone Output Volume */
406         SOC_DOUBLE("HP Channel Switch", RT5640_HP_VOL,
407                 RT5640_VOL_L_SFT, RT5640_VOL_R_SFT, 1, 1),
408         SOC_DOUBLE_TLV("HP Playback Volume", RT5640_HP_VOL,
409                 RT5640_L_VOL_SFT, RT5640_R_VOL_SFT, 39, 1, out_vol_tlv),
410         /* OUTPUT Control */
411         SOC_DOUBLE("OUT Playback Switch", RT5640_OUTPUT,
412                 RT5640_L_MUTE_SFT, RT5640_R_MUTE_SFT, 1, 1),
413         SOC_DOUBLE("OUT Channel Switch", RT5640_OUTPUT,
414                 RT5640_VOL_L_SFT, RT5640_VOL_R_SFT, 1, 1),
415         SOC_DOUBLE_TLV("OUT Playback Volume", RT5640_OUTPUT,
416                 RT5640_L_VOL_SFT, RT5640_R_VOL_SFT, 39, 1, out_vol_tlv),
417
418         /* DAC Digital Volume */
419         SOC_DOUBLE("DAC2 Playback Switch", RT5640_DAC2_CTRL,
420                 RT5640_M_DAC_L2_VOL_SFT, RT5640_M_DAC_R2_VOL_SFT, 1, 1),
421         SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5640_DAC1_DIG_VOL,
422                         RT5640_L_VOL_SFT, RT5640_R_VOL_SFT,
423                         175, 0, dac_vol_tlv),
424         /* IN1/IN2/IN3 Control */
425         SOC_SINGLE_TLV("IN1 Boost", RT5640_IN1_IN2,
426                 RT5640_BST_SFT1, 8, 0, bst_tlv),
427         SOC_SINGLE_TLV("IN2 Boost", RT5640_IN3_IN4,
428                 RT5640_BST_SFT2, 8, 0, bst_tlv),
429         SOC_SINGLE_TLV("IN3 Boost", RT5640_IN1_IN2,
430                 RT5640_BST_SFT2, 8, 0, bst_tlv),
431
432         /* INL/INR Volume Control */
433         SOC_DOUBLE_TLV("IN Capture Volume", RT5640_INL_INR_VOL,
434                         RT5640_INL_VOL_SFT, RT5640_INR_VOL_SFT,
435                         31, 1, in_vol_tlv),
436         /* ADC Digital Volume Control */
437         SOC_DOUBLE("ADC Capture Switch", RT5640_ADC_DIG_VOL,
438                 RT5640_L_MUTE_SFT, RT5640_R_MUTE_SFT, 1, 1),
439         SOC_DOUBLE_TLV("ADC Capture Volume", RT5640_ADC_DIG_VOL,
440                         RT5640_L_VOL_SFT, RT5640_R_VOL_SFT,
441                         127, 0, adc_vol_tlv),
442         SOC_DOUBLE_TLV("Mono ADC Capture Volume", RT5640_ADC_DATA,
443                         RT5640_L_VOL_SFT, RT5640_R_VOL_SFT,
444                         127, 0, adc_vol_tlv),
445         /* ADC Boost Volume Control */
446         SOC_DOUBLE_TLV("ADC Boost Gain", RT5640_ADC_BST_VOL,
447                         RT5640_ADC_L_BST_SFT, RT5640_ADC_R_BST_SFT,
448                         3, 0, adc_bst_tlv),
449         /* Class D speaker gain ratio */
450         SOC_ENUM("Class D SPK Ratio Control", rt5640_clsd_spk_ratio_enum),
451
452         SOC_ENUM("ADC IF1 Data Switch", rt5640_if1_adc_enum),
453         SOC_ENUM("DAC IF1 Data Switch", rt5640_if1_dac_enum),
454         SOC_ENUM("ADC IF2 Data Switch", rt5640_if2_adc_enum),
455         SOC_ENUM("DAC IF2 Data Switch", rt5640_if2_dac_enum),
456 };
457
458 static const struct snd_kcontrol_new rt5640_specific_snd_controls[] = {
459         /* MONO Output Control */
460         SOC_SINGLE("Mono Playback Switch", RT5640_MONO_OUT, RT5640_L_MUTE_SFT,
461                 1, 1),
462
463         SOC_DOUBLE_TLV("Mono DAC Playback Volume", RT5640_DAC2_DIG_VOL,
464                 RT5640_L_VOL_SFT, RT5640_R_VOL_SFT, 175, 0, dac_vol_tlv),
465 };
466
467 /**
468  * set_dmic_clk - Set parameter of dmic.
469  *
470  * @w: DAPM widget.
471  * @kcontrol: The kcontrol of this widget.
472  * @event: Event id.
473  *
474  */
475 static int set_dmic_clk(struct snd_soc_dapm_widget *w,
476         struct snd_kcontrol *kcontrol, int event)
477 {
478         struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
479         struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
480         int idx, rate;
481
482         rate = rt5640->sysclk / rl6231_get_pre_div(rt5640->regmap,
483                 RT5640_ADDA_CLK1, RT5640_I2S_PD1_SFT);
484         idx = rl6231_calc_dmic_clk(rate);
485         if (idx < 0)
486                 dev_err(codec->dev, "Failed to set DMIC clock\n");
487         else
488                 snd_soc_update_bits(codec, RT5640_DMIC, RT5640_DMIC_CLK_MASK,
489                                         idx << RT5640_DMIC_CLK_SFT);
490         return idx;
491 }
492
493 static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *source,
494                          struct snd_soc_dapm_widget *sink)
495 {
496         struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm);
497         unsigned int val;
498
499         val = snd_soc_read(codec, RT5640_GLB_CLK);
500         val &= RT5640_SCLK_SRC_MASK;
501         if (val == RT5640_SCLK_SRC_PLL1)
502                 return 1;
503         else
504                 return 0;
505 }
506
507 /* Digital Mixer */
508 static const struct snd_kcontrol_new rt5640_sto_adc_l_mix[] = {
509         SOC_DAPM_SINGLE("ADC1 Switch", RT5640_STO_ADC_MIXER,
510                         RT5640_M_ADC_L1_SFT, 1, 1),
511         SOC_DAPM_SINGLE("ADC2 Switch", RT5640_STO_ADC_MIXER,
512                         RT5640_M_ADC_L2_SFT, 1, 1),
513 };
514
515 static const struct snd_kcontrol_new rt5640_sto_adc_r_mix[] = {
516         SOC_DAPM_SINGLE("ADC1 Switch", RT5640_STO_ADC_MIXER,
517                         RT5640_M_ADC_R1_SFT, 1, 1),
518         SOC_DAPM_SINGLE("ADC2 Switch", RT5640_STO_ADC_MIXER,
519                         RT5640_M_ADC_R2_SFT, 1, 1),
520 };
521
522 static const struct snd_kcontrol_new rt5640_mono_adc_l_mix[] = {
523         SOC_DAPM_SINGLE("ADC1 Switch", RT5640_MONO_ADC_MIXER,
524                         RT5640_M_MONO_ADC_L1_SFT, 1, 1),
525         SOC_DAPM_SINGLE("ADC2 Switch", RT5640_MONO_ADC_MIXER,
526                         RT5640_M_MONO_ADC_L2_SFT, 1, 1),
527 };
528
529 static const struct snd_kcontrol_new rt5640_mono_adc_r_mix[] = {
530         SOC_DAPM_SINGLE("ADC1 Switch", RT5640_MONO_ADC_MIXER,
531                         RT5640_M_MONO_ADC_R1_SFT, 1, 1),
532         SOC_DAPM_SINGLE("ADC2 Switch", RT5640_MONO_ADC_MIXER,
533                         RT5640_M_MONO_ADC_R2_SFT, 1, 1),
534 };
535
536 static const struct snd_kcontrol_new rt5640_dac_l_mix[] = {
537         SOC_DAPM_SINGLE("Stereo ADC Switch", RT5640_AD_DA_MIXER,
538                         RT5640_M_ADCMIX_L_SFT, 1, 1),
539         SOC_DAPM_SINGLE("INF1 Switch", RT5640_AD_DA_MIXER,
540                         RT5640_M_IF1_DAC_L_SFT, 1, 1),
541 };
542
543 static const struct snd_kcontrol_new rt5640_dac_r_mix[] = {
544         SOC_DAPM_SINGLE("Stereo ADC Switch", RT5640_AD_DA_MIXER,
545                         RT5640_M_ADCMIX_R_SFT, 1, 1),
546         SOC_DAPM_SINGLE("INF1 Switch", RT5640_AD_DA_MIXER,
547                         RT5640_M_IF1_DAC_R_SFT, 1, 1),
548 };
549
550 static const struct snd_kcontrol_new rt5640_sto_dac_l_mix[] = {
551         SOC_DAPM_SINGLE("DAC L1 Switch", RT5640_STO_DAC_MIXER,
552                         RT5640_M_DAC_L1_SFT, 1, 1),
553         SOC_DAPM_SINGLE("DAC L2 Switch", RT5640_STO_DAC_MIXER,
554                         RT5640_M_DAC_L2_SFT, 1, 1),
555         SOC_DAPM_SINGLE("ANC Switch", RT5640_STO_DAC_MIXER,
556                         RT5640_M_ANC_DAC_L_SFT, 1, 1),
557 };
558
559 static const struct snd_kcontrol_new rt5640_sto_dac_r_mix[] = {
560         SOC_DAPM_SINGLE("DAC R1 Switch", RT5640_STO_DAC_MIXER,
561                         RT5640_M_DAC_R1_SFT, 1, 1),
562         SOC_DAPM_SINGLE("DAC R2 Switch", RT5640_STO_DAC_MIXER,
563                         RT5640_M_DAC_R2_SFT, 1, 1),
564         SOC_DAPM_SINGLE("ANC Switch", RT5640_STO_DAC_MIXER,
565                         RT5640_M_ANC_DAC_R_SFT, 1, 1),
566 };
567
568 static const struct snd_kcontrol_new rt5639_sto_dac_l_mix[] = {
569         SOC_DAPM_SINGLE("DAC L1 Switch", RT5640_STO_DAC_MIXER,
570                         RT5640_M_DAC_L1_SFT, 1, 1),
571         SOC_DAPM_SINGLE("DAC L2 Switch", RT5640_STO_DAC_MIXER,
572                         RT5640_M_DAC_L2_SFT, 1, 1),
573 };
574
575 static const struct snd_kcontrol_new rt5639_sto_dac_r_mix[] = {
576         SOC_DAPM_SINGLE("DAC R1 Switch", RT5640_STO_DAC_MIXER,
577                         RT5640_M_DAC_R1_SFT, 1, 1),
578         SOC_DAPM_SINGLE("DAC R2 Switch", RT5640_STO_DAC_MIXER,
579                         RT5640_M_DAC_R2_SFT, 1, 1),
580 };
581
582 static const struct snd_kcontrol_new rt5640_mono_dac_l_mix[] = {
583         SOC_DAPM_SINGLE("DAC L1 Switch", RT5640_MONO_DAC_MIXER,
584                         RT5640_M_DAC_L1_MONO_L_SFT, 1, 1),
585         SOC_DAPM_SINGLE("DAC L2 Switch", RT5640_MONO_DAC_MIXER,
586                         RT5640_M_DAC_L2_MONO_L_SFT, 1, 1),
587         SOC_DAPM_SINGLE("DAC R2 Switch", RT5640_MONO_DAC_MIXER,
588                         RT5640_M_DAC_R2_MONO_L_SFT, 1, 1),
589 };
590
591 static const struct snd_kcontrol_new rt5640_mono_dac_r_mix[] = {
592         SOC_DAPM_SINGLE("DAC R1 Switch", RT5640_MONO_DAC_MIXER,
593                         RT5640_M_DAC_R1_MONO_R_SFT, 1, 1),
594         SOC_DAPM_SINGLE("DAC R2 Switch", RT5640_MONO_DAC_MIXER,
595                         RT5640_M_DAC_R2_MONO_R_SFT, 1, 1),
596         SOC_DAPM_SINGLE("DAC L2 Switch", RT5640_MONO_DAC_MIXER,
597                         RT5640_M_DAC_L2_MONO_R_SFT, 1, 1),
598 };
599
600 static const struct snd_kcontrol_new rt5640_dig_l_mix[] = {
601         SOC_DAPM_SINGLE("DAC L1 Switch", RT5640_DIG_MIXER,
602                         RT5640_M_STO_L_DAC_L_SFT, 1, 1),
603         SOC_DAPM_SINGLE("DAC L2 Switch", RT5640_DIG_MIXER,
604                         RT5640_M_DAC_L2_DAC_L_SFT, 1, 1),
605 };
606
607 static const struct snd_kcontrol_new rt5640_dig_r_mix[] = {
608         SOC_DAPM_SINGLE("DAC R1 Switch", RT5640_DIG_MIXER,
609                         RT5640_M_STO_R_DAC_R_SFT, 1, 1),
610         SOC_DAPM_SINGLE("DAC R2 Switch", RT5640_DIG_MIXER,
611                         RT5640_M_DAC_R2_DAC_R_SFT, 1, 1),
612 };
613
614 /* Analog Input Mixer */
615 static const struct snd_kcontrol_new rt5640_rec_l_mix[] = {
616         SOC_DAPM_SINGLE("HPOL Switch", RT5640_REC_L2_MIXER,
617                         RT5640_M_HP_L_RM_L_SFT, 1, 1),
618         SOC_DAPM_SINGLE("INL Switch", RT5640_REC_L2_MIXER,
619                         RT5640_M_IN_L_RM_L_SFT, 1, 1),
620         SOC_DAPM_SINGLE("BST3 Switch", RT5640_REC_L2_MIXER,
621                         RT5640_M_BST2_RM_L_SFT, 1, 1),
622         SOC_DAPM_SINGLE("BST2 Switch", RT5640_REC_L2_MIXER,
623                         RT5640_M_BST4_RM_L_SFT, 1, 1),
624         SOC_DAPM_SINGLE("BST1 Switch", RT5640_REC_L2_MIXER,
625                         RT5640_M_BST1_RM_L_SFT, 1, 1),
626         SOC_DAPM_SINGLE("OUT MIXL Switch", RT5640_REC_L2_MIXER,
627                         RT5640_M_OM_L_RM_L_SFT, 1, 1),
628 };
629
630 static const struct snd_kcontrol_new rt5640_rec_r_mix[] = {
631         SOC_DAPM_SINGLE("HPOR Switch", RT5640_REC_R2_MIXER,
632                         RT5640_M_HP_R_RM_R_SFT, 1, 1),
633         SOC_DAPM_SINGLE("INR Switch", RT5640_REC_R2_MIXER,
634                         RT5640_M_IN_R_RM_R_SFT, 1, 1),
635         SOC_DAPM_SINGLE("BST3 Switch", RT5640_REC_R2_MIXER,
636                         RT5640_M_BST2_RM_R_SFT, 1, 1),
637         SOC_DAPM_SINGLE("BST2 Switch", RT5640_REC_R2_MIXER,
638                         RT5640_M_BST4_RM_R_SFT, 1, 1),
639         SOC_DAPM_SINGLE("BST1 Switch", RT5640_REC_R2_MIXER,
640                         RT5640_M_BST1_RM_R_SFT, 1, 1),
641         SOC_DAPM_SINGLE("OUT MIXR Switch", RT5640_REC_R2_MIXER,
642                         RT5640_M_OM_R_RM_R_SFT, 1, 1),
643 };
644
645 /* Analog Output Mixer */
646 static const struct snd_kcontrol_new rt5640_spk_l_mix[] = {
647         SOC_DAPM_SINGLE("REC MIXL Switch", RT5640_SPK_L_MIXER,
648                         RT5640_M_RM_L_SM_L_SFT, 1, 1),
649         SOC_DAPM_SINGLE("INL Switch", RT5640_SPK_L_MIXER,
650                         RT5640_M_IN_L_SM_L_SFT, 1, 1),
651         SOC_DAPM_SINGLE("DAC L1 Switch", RT5640_SPK_L_MIXER,
652                         RT5640_M_DAC_L1_SM_L_SFT, 1, 1),
653         SOC_DAPM_SINGLE("DAC L2 Switch", RT5640_SPK_L_MIXER,
654                         RT5640_M_DAC_L2_SM_L_SFT, 1, 1),
655         SOC_DAPM_SINGLE("OUT MIXL Switch", RT5640_SPK_L_MIXER,
656                         RT5640_M_OM_L_SM_L_SFT, 1, 1),
657 };
658
659 static const struct snd_kcontrol_new rt5640_spk_r_mix[] = {
660         SOC_DAPM_SINGLE("REC MIXR Switch", RT5640_SPK_R_MIXER,
661                         RT5640_M_RM_R_SM_R_SFT, 1, 1),
662         SOC_DAPM_SINGLE("INR Switch", RT5640_SPK_R_MIXER,
663                         RT5640_M_IN_R_SM_R_SFT, 1, 1),
664         SOC_DAPM_SINGLE("DAC R1 Switch", RT5640_SPK_R_MIXER,
665                         RT5640_M_DAC_R1_SM_R_SFT, 1, 1),
666         SOC_DAPM_SINGLE("DAC R2 Switch", RT5640_SPK_R_MIXER,
667                         RT5640_M_DAC_R2_SM_R_SFT, 1, 1),
668         SOC_DAPM_SINGLE("OUT MIXR Switch", RT5640_SPK_R_MIXER,
669                         RT5640_M_OM_R_SM_R_SFT, 1, 1),
670 };
671
672 static const struct snd_kcontrol_new rt5640_out_l_mix[] = {
673         SOC_DAPM_SINGLE("SPK MIXL Switch", RT5640_OUT_L3_MIXER,
674                         RT5640_M_SM_L_OM_L_SFT, 1, 1),
675         SOC_DAPM_SINGLE("BST1 Switch", RT5640_OUT_L3_MIXER,
676                         RT5640_M_BST1_OM_L_SFT, 1, 1),
677         SOC_DAPM_SINGLE("INL Switch", RT5640_OUT_L3_MIXER,
678                         RT5640_M_IN_L_OM_L_SFT, 1, 1),
679         SOC_DAPM_SINGLE("REC MIXL Switch", RT5640_OUT_L3_MIXER,
680                         RT5640_M_RM_L_OM_L_SFT, 1, 1),
681         SOC_DAPM_SINGLE("DAC R2 Switch", RT5640_OUT_L3_MIXER,
682                         RT5640_M_DAC_R2_OM_L_SFT, 1, 1),
683         SOC_DAPM_SINGLE("DAC L2 Switch", RT5640_OUT_L3_MIXER,
684                         RT5640_M_DAC_L2_OM_L_SFT, 1, 1),
685         SOC_DAPM_SINGLE("DAC L1 Switch", RT5640_OUT_L3_MIXER,
686                         RT5640_M_DAC_L1_OM_L_SFT, 1, 1),
687 };
688
689 static const struct snd_kcontrol_new rt5640_out_r_mix[] = {
690         SOC_DAPM_SINGLE("SPK MIXR Switch", RT5640_OUT_R3_MIXER,
691                         RT5640_M_SM_L_OM_R_SFT, 1, 1),
692         SOC_DAPM_SINGLE("BST2 Switch", RT5640_OUT_R3_MIXER,
693                         RT5640_M_BST4_OM_R_SFT, 1, 1),
694         SOC_DAPM_SINGLE("BST1 Switch", RT5640_OUT_R3_MIXER,
695                         RT5640_M_BST1_OM_R_SFT, 1, 1),
696         SOC_DAPM_SINGLE("INR Switch", RT5640_OUT_R3_MIXER,
697                         RT5640_M_IN_R_OM_R_SFT, 1, 1),
698         SOC_DAPM_SINGLE("REC MIXR Switch", RT5640_OUT_R3_MIXER,
699                         RT5640_M_RM_R_OM_R_SFT, 1, 1),
700         SOC_DAPM_SINGLE("DAC L2 Switch", RT5640_OUT_R3_MIXER,
701                         RT5640_M_DAC_L2_OM_R_SFT, 1, 1),
702         SOC_DAPM_SINGLE("DAC R2 Switch", RT5640_OUT_R3_MIXER,
703                         RT5640_M_DAC_R2_OM_R_SFT, 1, 1),
704         SOC_DAPM_SINGLE("DAC R1 Switch", RT5640_OUT_R3_MIXER,
705                         RT5640_M_DAC_R1_OM_R_SFT, 1, 1),
706 };
707
708 static const struct snd_kcontrol_new rt5639_out_l_mix[] = {
709         SOC_DAPM_SINGLE("BST1 Switch", RT5640_OUT_L3_MIXER,
710                         RT5640_M_BST1_OM_L_SFT, 1, 1),
711         SOC_DAPM_SINGLE("INL Switch", RT5640_OUT_L3_MIXER,
712                         RT5640_M_IN_L_OM_L_SFT, 1, 1),
713         SOC_DAPM_SINGLE("REC MIXL Switch", RT5640_OUT_L3_MIXER,
714                         RT5640_M_RM_L_OM_L_SFT, 1, 1),
715         SOC_DAPM_SINGLE("DAC L1 Switch", RT5640_OUT_L3_MIXER,
716                         RT5640_M_DAC_L1_OM_L_SFT, 1, 1),
717 };
718
719 static const struct snd_kcontrol_new rt5639_out_r_mix[] = {
720         SOC_DAPM_SINGLE("BST2 Switch", RT5640_OUT_R3_MIXER,
721                         RT5640_M_BST4_OM_R_SFT, 1, 1),
722         SOC_DAPM_SINGLE("BST1 Switch", RT5640_OUT_R3_MIXER,
723                         RT5640_M_BST1_OM_R_SFT, 1, 1),
724         SOC_DAPM_SINGLE("INR Switch", RT5640_OUT_R3_MIXER,
725                         RT5640_M_IN_R_OM_R_SFT, 1, 1),
726         SOC_DAPM_SINGLE("REC MIXR Switch", RT5640_OUT_R3_MIXER,
727                         RT5640_M_RM_R_OM_R_SFT, 1, 1),
728         SOC_DAPM_SINGLE("DAC R1 Switch", RT5640_OUT_R3_MIXER,
729                         RT5640_M_DAC_R1_OM_R_SFT, 1, 1),
730 };
731
732 static const struct snd_kcontrol_new rt5640_spo_l_mix[] = {
733         SOC_DAPM_SINGLE("DAC R1 Switch", RT5640_SPO_L_MIXER,
734                         RT5640_M_DAC_R1_SPM_L_SFT, 1, 1),
735         SOC_DAPM_SINGLE("DAC L1 Switch", RT5640_SPO_L_MIXER,
736                         RT5640_M_DAC_L1_SPM_L_SFT, 1, 1),
737         SOC_DAPM_SINGLE("SPKVOL R Switch", RT5640_SPO_L_MIXER,
738                         RT5640_M_SV_R_SPM_L_SFT, 1, 1),
739         SOC_DAPM_SINGLE("SPKVOL L Switch", RT5640_SPO_L_MIXER,
740                         RT5640_M_SV_L_SPM_L_SFT, 1, 1),
741         SOC_DAPM_SINGLE("BST1 Switch", RT5640_SPO_L_MIXER,
742                         RT5640_M_BST1_SPM_L_SFT, 1, 1),
743 };
744
745 static const struct snd_kcontrol_new rt5640_spo_r_mix[] = {
746         SOC_DAPM_SINGLE("DAC R1 Switch", RT5640_SPO_R_MIXER,
747                         RT5640_M_DAC_R1_SPM_R_SFT, 1, 1),
748         SOC_DAPM_SINGLE("SPKVOL R Switch", RT5640_SPO_R_MIXER,
749                         RT5640_M_SV_R_SPM_R_SFT, 1, 1),
750         SOC_DAPM_SINGLE("BST1 Switch", RT5640_SPO_R_MIXER,
751                         RT5640_M_BST1_SPM_R_SFT, 1, 1),
752 };
753
754 static const struct snd_kcontrol_new rt5640_hpo_mix[] = {
755         SOC_DAPM_SINGLE("HPO MIX DAC2 Switch", RT5640_HPO_MIXER,
756                         RT5640_M_DAC2_HM_SFT, 1, 1),
757         SOC_DAPM_SINGLE("HPO MIX DAC1 Switch", RT5640_HPO_MIXER,
758                         RT5640_M_DAC1_HM_SFT, 1, 1),
759         SOC_DAPM_SINGLE("HPO MIX HPVOL Switch", RT5640_HPO_MIXER,
760                         RT5640_M_HPVOL_HM_SFT, 1, 1),
761 };
762
763 static const struct snd_kcontrol_new rt5639_hpo_mix[] = {
764         SOC_DAPM_SINGLE("HPO MIX DAC1 Switch", RT5640_HPO_MIXER,
765                         RT5640_M_DAC1_HM_SFT, 1, 1),
766         SOC_DAPM_SINGLE("HPO MIX HPVOL Switch", RT5640_HPO_MIXER,
767                         RT5640_M_HPVOL_HM_SFT, 1, 1),
768 };
769
770 static const struct snd_kcontrol_new rt5640_lout_mix[] = {
771         SOC_DAPM_SINGLE("DAC L1 Switch", RT5640_LOUT_MIXER,
772                         RT5640_M_DAC_L1_LM_SFT, 1, 1),
773         SOC_DAPM_SINGLE("DAC R1 Switch", RT5640_LOUT_MIXER,
774                         RT5640_M_DAC_R1_LM_SFT, 1, 1),
775         SOC_DAPM_SINGLE("OUTVOL L Switch", RT5640_LOUT_MIXER,
776                         RT5640_M_OV_L_LM_SFT, 1, 1),
777         SOC_DAPM_SINGLE("OUTVOL R Switch", RT5640_LOUT_MIXER,
778                         RT5640_M_OV_R_LM_SFT, 1, 1),
779 };
780
781 static const struct snd_kcontrol_new rt5640_mono_mix[] = {
782         SOC_DAPM_SINGLE("DAC R2 Switch", RT5640_MONO_MIXER,
783                         RT5640_M_DAC_R2_MM_SFT, 1, 1),
784         SOC_DAPM_SINGLE("DAC L2 Switch", RT5640_MONO_MIXER,
785                         RT5640_M_DAC_L2_MM_SFT, 1, 1),
786         SOC_DAPM_SINGLE("OUTVOL R Switch", RT5640_MONO_MIXER,
787                         RT5640_M_OV_R_MM_SFT, 1, 1),
788         SOC_DAPM_SINGLE("OUTVOL L Switch", RT5640_MONO_MIXER,
789                         RT5640_M_OV_L_MM_SFT, 1, 1),
790         SOC_DAPM_SINGLE("BST1 Switch", RT5640_MONO_MIXER,
791                         RT5640_M_BST1_MM_SFT, 1, 1),
792 };
793
794 static const struct snd_kcontrol_new spk_l_enable_control =
795         SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5640_SPK_VOL,
796                 RT5640_L_MUTE_SFT, 1, 1);
797
798 static const struct snd_kcontrol_new spk_r_enable_control =
799         SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5640_SPK_VOL,
800                 RT5640_R_MUTE_SFT, 1, 1);
801
802 static const struct snd_kcontrol_new hp_l_enable_control =
803         SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5640_HP_VOL,
804                 RT5640_L_MUTE_SFT, 1, 1);
805
806 static const struct snd_kcontrol_new hp_r_enable_control =
807         SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5640_HP_VOL,
808                 RT5640_R_MUTE_SFT, 1, 1);
809
810 /* Stereo ADC source */
811 static const char * const rt5640_stereo_adc1_src[] = {
812         "DIG MIX", "ADC"
813 };
814
815 static SOC_ENUM_SINGLE_DECL(rt5640_stereo_adc1_enum, RT5640_STO_ADC_MIXER,
816                             RT5640_ADC_1_SRC_SFT, rt5640_stereo_adc1_src);
817
818 static const struct snd_kcontrol_new rt5640_sto_adc_1_mux =
819         SOC_DAPM_ENUM("Stereo ADC1 Mux", rt5640_stereo_adc1_enum);
820
821 static const char * const rt5640_stereo_adc2_src[] = {
822         "DMIC1", "DMIC2", "DIG MIX"
823 };
824
825 static SOC_ENUM_SINGLE_DECL(rt5640_stereo_adc2_enum, RT5640_STO_ADC_MIXER,
826                             RT5640_ADC_2_SRC_SFT, rt5640_stereo_adc2_src);
827
828 static const struct snd_kcontrol_new rt5640_sto_adc_2_mux =
829         SOC_DAPM_ENUM("Stereo ADC2 Mux", rt5640_stereo_adc2_enum);
830
831 /* Mono ADC source */
832 static const char * const rt5640_mono_adc_l1_src[] = {
833         "Mono DAC MIXL", "ADCL"
834 };
835
836 static SOC_ENUM_SINGLE_DECL(rt5640_mono_adc_l1_enum, RT5640_MONO_ADC_MIXER,
837                             RT5640_MONO_ADC_L1_SRC_SFT, rt5640_mono_adc_l1_src);
838
839 static const struct snd_kcontrol_new rt5640_mono_adc_l1_mux =
840         SOC_DAPM_ENUM("Mono ADC1 left source", rt5640_mono_adc_l1_enum);
841
842 static const char * const rt5640_mono_adc_l2_src[] = {
843         "DMIC L1", "DMIC L2", "Mono DAC MIXL"
844 };
845
846 static SOC_ENUM_SINGLE_DECL(rt5640_mono_adc_l2_enum, RT5640_MONO_ADC_MIXER,
847                             RT5640_MONO_ADC_L2_SRC_SFT, rt5640_mono_adc_l2_src);
848
849 static const struct snd_kcontrol_new rt5640_mono_adc_l2_mux =
850         SOC_DAPM_ENUM("Mono ADC2 left source", rt5640_mono_adc_l2_enum);
851
852 static const char * const rt5640_mono_adc_r1_src[] = {
853         "Mono DAC MIXR", "ADCR"
854 };
855
856 static SOC_ENUM_SINGLE_DECL(rt5640_mono_adc_r1_enum, RT5640_MONO_ADC_MIXER,
857                             RT5640_MONO_ADC_R1_SRC_SFT, rt5640_mono_adc_r1_src);
858
859 static const struct snd_kcontrol_new rt5640_mono_adc_r1_mux =
860         SOC_DAPM_ENUM("Mono ADC1 right source", rt5640_mono_adc_r1_enum);
861
862 static const char * const rt5640_mono_adc_r2_src[] = {
863         "DMIC R1", "DMIC R2", "Mono DAC MIXR"
864 };
865
866 static SOC_ENUM_SINGLE_DECL(rt5640_mono_adc_r2_enum, RT5640_MONO_ADC_MIXER,
867                             RT5640_MONO_ADC_R2_SRC_SFT, rt5640_mono_adc_r2_src);
868
869 static const struct snd_kcontrol_new rt5640_mono_adc_r2_mux =
870         SOC_DAPM_ENUM("Mono ADC2 right source", rt5640_mono_adc_r2_enum);
871
872 /* DAC2 channel source */
873 static const char * const rt5640_dac_l2_src[] = {
874         "IF2", "Base L/R"
875 };
876
877 static int rt5640_dac_l2_values[] = {
878         0,
879         3,
880 };
881
882 static SOC_VALUE_ENUM_SINGLE_DECL(rt5640_dac_l2_enum,
883                                   RT5640_DSP_PATH2, RT5640_DAC_L2_SEL_SFT,
884                                   0x3, rt5640_dac_l2_src, rt5640_dac_l2_values);
885
886 static const struct snd_kcontrol_new rt5640_dac_l2_mux =
887         SOC_DAPM_ENUM("DAC2 left channel source", rt5640_dac_l2_enum);
888
889 static const char * const rt5640_dac_r2_src[] = {
890         "IF2",
891 };
892
893 static int rt5640_dac_r2_values[] = {
894         0,
895 };
896
897 static SOC_VALUE_ENUM_SINGLE_DECL(rt5640_dac_r2_enum,
898                                   RT5640_DSP_PATH2, RT5640_DAC_R2_SEL_SFT,
899                                   0x3, rt5640_dac_r2_src, rt5640_dac_r2_values);
900
901 static const struct snd_kcontrol_new rt5640_dac_r2_mux =
902         SOC_DAPM_ENUM("DAC2 right channel source", rt5640_dac_r2_enum);
903
904 /* digital interface and iis interface map */
905 static const char * const rt5640_dai_iis_map[] = {
906         "1:1|2:2", "1:2|2:1", "1:1|2:1", "1:2|2:2"
907 };
908
909 static int rt5640_dai_iis_map_values[] = {
910         0,
911         5,
912         6,
913         7,
914 };
915
916 static SOC_VALUE_ENUM_SINGLE_DECL(rt5640_dai_iis_map_enum,
917                                   RT5640_I2S1_SDP, RT5640_I2S_IF_SFT,
918                                   0x7, rt5640_dai_iis_map,
919                                   rt5640_dai_iis_map_values);
920
921 static const struct snd_kcontrol_new rt5640_dai_mux =
922         SOC_DAPM_ENUM("DAI select", rt5640_dai_iis_map_enum);
923
924 /* SDI select */
925 static const char * const rt5640_sdi_sel[] = {
926         "IF1", "IF2"
927 };
928
929 static SOC_ENUM_SINGLE_DECL(rt5640_sdi_sel_enum, RT5640_I2S2_SDP,
930                             RT5640_I2S2_SDI_SFT, rt5640_sdi_sel);
931
932 static const struct snd_kcontrol_new rt5640_sdi_mux =
933         SOC_DAPM_ENUM("SDI select", rt5640_sdi_sel_enum);
934
935 static void hp_amp_power_on(struct snd_soc_codec *codec)
936 {
937         struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
938
939         /* depop parameters */
940         regmap_update_bits(rt5640->regmap, RT5640_PR_BASE +
941                 RT5640_CHPUMP_INT_REG1, 0x0700, 0x0200);
942         regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M2,
943                 RT5640_DEPOP_MASK, RT5640_DEPOP_MAN);
944         regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M1,
945                 RT5640_HP_CP_MASK | RT5640_HP_SG_MASK | RT5640_HP_CB_MASK,
946                 RT5640_HP_CP_PU | RT5640_HP_SG_DIS | RT5640_HP_CB_PU);
947         regmap_write(rt5640->regmap, RT5640_PR_BASE + RT5640_HP_DCC_INT1,
948                            0x9f00);
949         /* headphone amp power on */
950         regmap_update_bits(rt5640->regmap, RT5640_PWR_ANLG1,
951                 RT5640_PWR_FV1 | RT5640_PWR_FV2, 0);
952         regmap_update_bits(rt5640->regmap, RT5640_PWR_ANLG1,
953                 RT5640_PWR_HA,
954                 RT5640_PWR_HA);
955         usleep_range(10000, 15000);
956         regmap_update_bits(rt5640->regmap, RT5640_PWR_ANLG1,
957                 RT5640_PWR_FV1 | RT5640_PWR_FV2 ,
958                 RT5640_PWR_FV1 | RT5640_PWR_FV2);
959 }
960
961 static void rt5640_pmu_depop(struct snd_soc_codec *codec)
962 {
963         struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
964
965         regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M2,
966                 RT5640_DEPOP_MASK | RT5640_DIG_DP_MASK,
967                 RT5640_DEPOP_AUTO | RT5640_DIG_DP_EN);
968         regmap_update_bits(rt5640->regmap, RT5640_CHARGE_PUMP,
969                 RT5640_PM_HP_MASK, RT5640_PM_HP_HV);
970
971         regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M3,
972                 RT5640_CP_FQ1_MASK | RT5640_CP_FQ2_MASK | RT5640_CP_FQ3_MASK,
973                 (RT5640_CP_FQ_192_KHZ << RT5640_CP_FQ1_SFT) |
974                 (RT5640_CP_FQ_12_KHZ << RT5640_CP_FQ2_SFT) |
975                 (RT5640_CP_FQ_192_KHZ << RT5640_CP_FQ3_SFT));
976
977         regmap_write(rt5640->regmap, RT5640_PR_BASE +
978                 RT5640_MAMP_INT_REG2, 0x1c00);
979         regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M1,
980                 RT5640_HP_CP_MASK | RT5640_HP_SG_MASK,
981                 RT5640_HP_CP_PD | RT5640_HP_SG_EN);
982         regmap_update_bits(rt5640->regmap, RT5640_PR_BASE +
983                 RT5640_CHPUMP_INT_REG1, 0x0700, 0x0400);
984 }
985
986 static int rt5640_hp_event(struct snd_soc_dapm_widget *w,
987                            struct snd_kcontrol *kcontrol, int event)
988 {
989         struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
990         struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
991
992         switch (event) {
993         case SND_SOC_DAPM_POST_PMU:
994                 rt5640_pmu_depop(codec);
995                 rt5640->hp_mute = 0;
996                 break;
997
998         case SND_SOC_DAPM_PRE_PMD:
999                 rt5640->hp_mute = 1;
1000                 rt5640_hp_gpio_ctrl(rt5640, false);
1001                 usleep_range(70000, 75000);
1002                 break;
1003         default:
1004                 return 0;
1005         }
1006
1007         return 0;
1008 }
1009
1010 static int rt5640_lout_event(struct snd_soc_dapm_widget *w,
1011         struct snd_kcontrol *kcontrol, int event)
1012 {
1013         struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1014
1015         switch (event) {
1016         case SND_SOC_DAPM_POST_PMU:
1017                 hp_amp_power_on(codec);
1018                 snd_soc_update_bits(codec, RT5640_PWR_ANLG1,
1019                         RT5640_PWR_LM, RT5640_PWR_LM);
1020                 snd_soc_update_bits(codec, RT5640_OUTPUT,
1021                         RT5640_L_MUTE | RT5640_R_MUTE, 0);
1022                 break;
1023
1024         case SND_SOC_DAPM_PRE_PMD:
1025                 snd_soc_update_bits(codec, RT5640_OUTPUT,
1026                         RT5640_L_MUTE | RT5640_R_MUTE,
1027                         RT5640_L_MUTE | RT5640_R_MUTE);
1028                 snd_soc_update_bits(codec, RT5640_PWR_ANLG1,
1029                         RT5640_PWR_LM, 0);
1030                 break;
1031
1032         default:
1033                 return 0;
1034         }
1035
1036         return 0;
1037 }
1038
1039 static int rt5640_hp_power_event(struct snd_soc_dapm_widget *w,
1040                            struct snd_kcontrol *kcontrol, int event)
1041 {
1042         struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1043
1044         switch (event) {
1045         case SND_SOC_DAPM_POST_PMU:
1046                 hp_amp_power_on(codec);
1047                 break;
1048         default:
1049                 return 0;
1050         }
1051
1052         return 0;
1053 }
1054
1055 static int rt5640_hp_post_event(struct snd_soc_dapm_widget *w,
1056                            struct snd_kcontrol *kcontrol, int event)
1057 {
1058         struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1059         struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
1060
1061         switch (event) {
1062         case SND_SOC_DAPM_POST_PMU:
1063                 if (!rt5640->hp_mute && rt5640->hp_insert) {
1064                         usleep_range(120000, 125000);
1065                         rt5640_hp_gpio_ctrl(rt5640, true);
1066                 }
1067
1068                 break;
1069         default:
1070                 return 0;
1071         }
1072
1073         return 0;
1074 }
1075
1076 static int rt5640_mono_adcl_event(struct snd_soc_dapm_widget *w,
1077                                   struct snd_kcontrol *kcontrol, int event)
1078 {
1079         struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1080
1081         switch (event) {
1082         case SND_SOC_DAPM_POST_PMU:
1083                 snd_soc_update_bits(codec, RT5640_GEN_CTRL1,
1084                                     RT5640_M_MAMIX_L, 0);
1085                 break;
1086         case SND_SOC_DAPM_PRE_PMD:
1087                 snd_soc_update_bits(codec, RT5640_GEN_CTRL1,
1088                                     RT5640_M_MAMIX_L,
1089                                     RT5640_M_MAMIX_L);
1090                 break;
1091
1092         default:
1093                 return 0;
1094         }
1095
1096         return 0;
1097 }
1098
1099 static int rt5640_mono_adcr_event(struct snd_soc_dapm_widget *w,
1100                                   struct snd_kcontrol *kcontrol, int event)
1101 {
1102         struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1103
1104         switch (event) {
1105         case SND_SOC_DAPM_POST_PMU:
1106                 snd_soc_update_bits(codec, RT5640_GEN_CTRL1,
1107                                     RT5640_M_MAMIX_R, 0);
1108                 break;
1109         case SND_SOC_DAPM_PRE_PMD:
1110                 snd_soc_update_bits(codec, RT5640_GEN_CTRL1,
1111                                     RT5640_M_MAMIX_R,
1112                                     RT5640_M_MAMIX_R);
1113                 break;
1114
1115         default:
1116                 return 0;
1117         }
1118
1119         return 0;
1120 }
1121
1122 static const struct snd_soc_dapm_widget rt5640_dapm_widgets[] = {
1123         SND_SOC_DAPM_SUPPLY("PLL1", RT5640_PWR_ANLG2,
1124                         RT5640_PWR_PLL_BIT, 0, NULL, 0),
1125         /* Input Side */
1126         /* micbias */
1127         SND_SOC_DAPM_SUPPLY("LDO2", RT5640_PWR_ANLG1,
1128                         RT5640_PWR_LDO2_BIT, 0, NULL, 0),
1129         SND_SOC_DAPM_SUPPLY("MICBIAS1", RT5640_PWR_ANLG2,
1130                         RT5640_PWR_MB1_BIT, 0, NULL, 0),
1131         /* Input Lines */
1132         SND_SOC_DAPM_INPUT("DMIC1"),
1133         SND_SOC_DAPM_INPUT("DMIC2"),
1134         SND_SOC_DAPM_INPUT("IN1P"),
1135         SND_SOC_DAPM_INPUT("IN1N"),
1136         SND_SOC_DAPM_INPUT("IN2P"),
1137         SND_SOC_DAPM_INPUT("IN2N"),
1138         SND_SOC_DAPM_INPUT("IN3P"),
1139         SND_SOC_DAPM_INPUT("IN3N"),
1140         SND_SOC_DAPM_PGA("DMIC L1", SND_SOC_NOPM, 0, 0, NULL, 0),
1141         SND_SOC_DAPM_PGA("DMIC R1", SND_SOC_NOPM, 0, 0, NULL, 0),
1142         SND_SOC_DAPM_PGA("DMIC L2", SND_SOC_NOPM, 0, 0, NULL, 0),
1143         SND_SOC_DAPM_PGA("DMIC R2", SND_SOC_NOPM, 0, 0, NULL, 0),
1144
1145         SND_SOC_DAPM_SUPPLY("DMIC CLK", SND_SOC_NOPM, 0, 0,
1146                 set_dmic_clk, SND_SOC_DAPM_PRE_PMU),
1147         SND_SOC_DAPM_SUPPLY("DMIC1 Power", RT5640_DMIC, RT5640_DMIC_1_EN_SFT, 0,
1148                 NULL, 0),
1149         SND_SOC_DAPM_SUPPLY("DMIC2 Power", RT5640_DMIC, RT5640_DMIC_2_EN_SFT, 0,
1150                 NULL, 0),
1151         /* Boost */
1152         SND_SOC_DAPM_PGA("BST1", RT5640_PWR_ANLG2,
1153                 RT5640_PWR_BST1_BIT, 0, NULL, 0),
1154         SND_SOC_DAPM_PGA("BST2", RT5640_PWR_ANLG2,
1155                 RT5640_PWR_BST4_BIT, 0, NULL, 0),
1156         SND_SOC_DAPM_PGA("BST3", RT5640_PWR_ANLG2,
1157                 RT5640_PWR_BST2_BIT, 0, NULL, 0),
1158         /* Input Volume */
1159         SND_SOC_DAPM_PGA("INL VOL", RT5640_PWR_VOL,
1160                 RT5640_PWR_IN_L_BIT, 0, NULL, 0),
1161         SND_SOC_DAPM_PGA("INR VOL", RT5640_PWR_VOL,
1162                 RT5640_PWR_IN_R_BIT, 0, NULL, 0),
1163         /* REC Mixer */
1164         SND_SOC_DAPM_MIXER("RECMIXL", RT5640_PWR_MIXER, RT5640_PWR_RM_L_BIT, 0,
1165                         rt5640_rec_l_mix, ARRAY_SIZE(rt5640_rec_l_mix)),
1166         SND_SOC_DAPM_MIXER("RECMIXR", RT5640_PWR_MIXER, RT5640_PWR_RM_R_BIT, 0,
1167                         rt5640_rec_r_mix, ARRAY_SIZE(rt5640_rec_r_mix)),
1168         /* ADCs */
1169         SND_SOC_DAPM_ADC("ADC L", NULL, RT5640_PWR_DIG1,
1170                         RT5640_PWR_ADC_L_BIT, 0),
1171         SND_SOC_DAPM_ADC("ADC R", NULL, RT5640_PWR_DIG1,
1172                         RT5640_PWR_ADC_R_BIT, 0),
1173         /* ADC Mux */
1174         SND_SOC_DAPM_MUX("Stereo ADC L2 Mux", SND_SOC_NOPM, 0, 0,
1175                                 &rt5640_sto_adc_2_mux),
1176         SND_SOC_DAPM_MUX("Stereo ADC R2 Mux", SND_SOC_NOPM, 0, 0,
1177                                 &rt5640_sto_adc_2_mux),
1178         SND_SOC_DAPM_MUX("Stereo ADC L1 Mux", SND_SOC_NOPM, 0, 0,
1179                                 &rt5640_sto_adc_1_mux),
1180         SND_SOC_DAPM_MUX("Stereo ADC R1 Mux", SND_SOC_NOPM, 0, 0,
1181                                 &rt5640_sto_adc_1_mux),
1182         SND_SOC_DAPM_MUX("Mono ADC L2 Mux", SND_SOC_NOPM, 0, 0,
1183                                 &rt5640_mono_adc_l2_mux),
1184         SND_SOC_DAPM_MUX("Mono ADC L1 Mux", SND_SOC_NOPM, 0, 0,
1185                                 &rt5640_mono_adc_l1_mux),
1186         SND_SOC_DAPM_MUX("Mono ADC R1 Mux", SND_SOC_NOPM, 0, 0,
1187                                 &rt5640_mono_adc_r1_mux),
1188         SND_SOC_DAPM_MUX("Mono ADC R2 Mux", SND_SOC_NOPM, 0, 0,
1189                                 &rt5640_mono_adc_r2_mux),
1190         /* ADC Mixer */
1191         SND_SOC_DAPM_SUPPLY("Stereo Filter", RT5640_PWR_DIG2,
1192                 RT5640_PWR_ADC_SF_BIT, 0, NULL, 0),
1193         SND_SOC_DAPM_MIXER("Stereo ADC MIXL", SND_SOC_NOPM, 0, 0,
1194                 rt5640_sto_adc_l_mix, ARRAY_SIZE(rt5640_sto_adc_l_mix)),
1195         SND_SOC_DAPM_MIXER("Stereo ADC MIXR", SND_SOC_NOPM, 0, 0,
1196                 rt5640_sto_adc_r_mix, ARRAY_SIZE(rt5640_sto_adc_r_mix)),
1197         SND_SOC_DAPM_SUPPLY("Mono Left Filter", RT5640_PWR_DIG2,
1198                 RT5640_PWR_ADC_MF_L_BIT, 0, NULL, 0),
1199         SND_SOC_DAPM_MIXER_E("Mono ADC MIXL", SND_SOC_NOPM, 0, 0,
1200                              rt5640_mono_adc_l_mix,
1201                              ARRAY_SIZE(rt5640_mono_adc_l_mix),
1202                              rt5640_mono_adcl_event,
1203                              SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
1204         SND_SOC_DAPM_SUPPLY("Mono Right Filter", RT5640_PWR_DIG2,
1205                 RT5640_PWR_ADC_MF_R_BIT, 0, NULL, 0),
1206         SND_SOC_DAPM_MIXER_E("Mono ADC MIXR", SND_SOC_NOPM, 0, 0,
1207                              rt5640_mono_adc_r_mix,
1208                              ARRAY_SIZE(rt5640_mono_adc_r_mix),
1209                              rt5640_mono_adcr_event,
1210                              SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
1211
1212         /* Digital Interface */
1213         SND_SOC_DAPM_SUPPLY("I2S1", RT5640_PWR_DIG1,
1214                 RT5640_PWR_I2S1_BIT, 0, NULL, 0),
1215         SND_SOC_DAPM_PGA("IF1 DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
1216         SND_SOC_DAPM_PGA("IF1 DAC L", SND_SOC_NOPM, 0, 0, NULL, 0),
1217         SND_SOC_DAPM_PGA("IF1 DAC R", SND_SOC_NOPM, 0, 0, NULL, 0),
1218         SND_SOC_DAPM_PGA("IF1 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
1219         SND_SOC_DAPM_PGA("IF1 ADC L", SND_SOC_NOPM, 0, 0, NULL, 0),
1220         SND_SOC_DAPM_PGA("IF1 ADC R", SND_SOC_NOPM, 0, 0, NULL, 0),
1221         SND_SOC_DAPM_SUPPLY("I2S2", RT5640_PWR_DIG1,
1222                 RT5640_PWR_I2S2_BIT, 0, NULL, 0),
1223         SND_SOC_DAPM_PGA("IF2 DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
1224         SND_SOC_DAPM_PGA("IF2 DAC L", SND_SOC_NOPM, 0, 0, NULL, 0),
1225         SND_SOC_DAPM_PGA("IF2 DAC R", SND_SOC_NOPM, 0, 0, NULL, 0),
1226         SND_SOC_DAPM_PGA("IF2 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
1227         SND_SOC_DAPM_PGA("IF2 ADC L", SND_SOC_NOPM, 0, 0, NULL, 0),
1228         SND_SOC_DAPM_PGA("IF2 ADC R", SND_SOC_NOPM, 0, 0, NULL, 0),
1229         /* Digital Interface Select */
1230         SND_SOC_DAPM_MUX("DAI1 RX Mux", SND_SOC_NOPM, 0, 0, &rt5640_dai_mux),
1231         SND_SOC_DAPM_MUX("DAI1 TX Mux", SND_SOC_NOPM, 0, 0, &rt5640_dai_mux),
1232         SND_SOC_DAPM_MUX("DAI1 IF1 Mux", SND_SOC_NOPM, 0, 0, &rt5640_dai_mux),
1233         SND_SOC_DAPM_MUX("DAI1 IF2 Mux", SND_SOC_NOPM, 0, 0, &rt5640_dai_mux),
1234         SND_SOC_DAPM_MUX("SDI1 TX Mux", SND_SOC_NOPM, 0, 0, &rt5640_sdi_mux),
1235         SND_SOC_DAPM_MUX("DAI2 RX Mux", SND_SOC_NOPM, 0, 0, &rt5640_dai_mux),
1236         SND_SOC_DAPM_MUX("DAI2 TX Mux", SND_SOC_NOPM, 0, 0, &rt5640_dai_mux),
1237         SND_SOC_DAPM_MUX("DAI2 IF1 Mux", SND_SOC_NOPM, 0, 0, &rt5640_dai_mux),
1238         SND_SOC_DAPM_MUX("DAI2 IF2 Mux", SND_SOC_NOPM, 0, 0, &rt5640_dai_mux),
1239         SND_SOC_DAPM_MUX("SDI2 TX Mux", SND_SOC_NOPM, 0, 0, &rt5640_sdi_mux),
1240         /* Audio Interface */
1241         SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0),
1242         SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0),
1243         SND_SOC_DAPM_AIF_IN("AIF2RX", "AIF2 Playback", 0, SND_SOC_NOPM, 0, 0),
1244         SND_SOC_DAPM_AIF_OUT("AIF2TX", "AIF2 Capture", 0, SND_SOC_NOPM, 0, 0),
1245
1246         /* Output Side */
1247         /* DAC mixer before sound effect  */
1248         SND_SOC_DAPM_MIXER("DAC MIXL", SND_SOC_NOPM, 0, 0,
1249                 rt5640_dac_l_mix, ARRAY_SIZE(rt5640_dac_l_mix)),
1250         SND_SOC_DAPM_MIXER("DAC MIXR", SND_SOC_NOPM, 0, 0,
1251                 rt5640_dac_r_mix, ARRAY_SIZE(rt5640_dac_r_mix)),
1252
1253         /* DAC Mixer */
1254         SND_SOC_DAPM_MIXER("Mono DAC MIXL", SND_SOC_NOPM, 0, 0,
1255                 rt5640_mono_dac_l_mix, ARRAY_SIZE(rt5640_mono_dac_l_mix)),
1256         SND_SOC_DAPM_MIXER("Mono DAC MIXR", SND_SOC_NOPM, 0, 0,
1257                 rt5640_mono_dac_r_mix, ARRAY_SIZE(rt5640_mono_dac_r_mix)),
1258         SND_SOC_DAPM_MIXER("DIG MIXL", SND_SOC_NOPM, 0, 0,
1259                 rt5640_dig_l_mix, ARRAY_SIZE(rt5640_dig_l_mix)),
1260         SND_SOC_DAPM_MIXER("DIG MIXR", SND_SOC_NOPM, 0, 0,
1261                 rt5640_dig_r_mix, ARRAY_SIZE(rt5640_dig_r_mix)),
1262         /* DACs */
1263         SND_SOC_DAPM_DAC("DAC L1", NULL, RT5640_PWR_DIG1,
1264                         RT5640_PWR_DAC_L1_BIT, 0),
1265         SND_SOC_DAPM_DAC("DAC R1", NULL, RT5640_PWR_DIG1,
1266                         RT5640_PWR_DAC_R1_BIT, 0),
1267
1268         /* SPK/OUT Mixer */
1269         SND_SOC_DAPM_MIXER("SPK MIXL", RT5640_PWR_MIXER, RT5640_PWR_SM_L_BIT,
1270                 0, rt5640_spk_l_mix, ARRAY_SIZE(rt5640_spk_l_mix)),
1271         SND_SOC_DAPM_MIXER("SPK MIXR", RT5640_PWR_MIXER, RT5640_PWR_SM_R_BIT,
1272                 0, rt5640_spk_r_mix, ARRAY_SIZE(rt5640_spk_r_mix)),
1273         /* Ouput Volume */
1274         SND_SOC_DAPM_PGA("SPKVOL L", RT5640_PWR_VOL,
1275                 RT5640_PWR_SV_L_BIT, 0, NULL, 0),
1276         SND_SOC_DAPM_PGA("SPKVOL R", RT5640_PWR_VOL,
1277                 RT5640_PWR_SV_R_BIT, 0, NULL, 0),
1278         SND_SOC_DAPM_PGA("OUTVOL L", RT5640_PWR_VOL,
1279                 RT5640_PWR_OV_L_BIT, 0, NULL, 0),
1280         SND_SOC_DAPM_PGA("OUTVOL R", RT5640_PWR_VOL,
1281                 RT5640_PWR_OV_R_BIT, 0, NULL, 0),
1282         SND_SOC_DAPM_PGA("HPOVOL L", RT5640_PWR_VOL,
1283                 RT5640_PWR_HV_L_BIT, 0, NULL, 0),
1284         SND_SOC_DAPM_PGA("HPOVOL R", RT5640_PWR_VOL,
1285                 RT5640_PWR_HV_R_BIT, 0, NULL, 0),
1286         /* SPO/HPO/LOUT/Mono Mixer */
1287         SND_SOC_DAPM_MIXER("SPOL MIX", SND_SOC_NOPM, 0,
1288                 0, rt5640_spo_l_mix, ARRAY_SIZE(rt5640_spo_l_mix)),
1289         SND_SOC_DAPM_MIXER("SPOR MIX", SND_SOC_NOPM, 0,
1290                 0, rt5640_spo_r_mix, ARRAY_SIZE(rt5640_spo_r_mix)),
1291         SND_SOC_DAPM_MIXER("LOUT MIX", SND_SOC_NOPM, 0, 0,
1292                 rt5640_lout_mix, ARRAY_SIZE(rt5640_lout_mix)),
1293         SND_SOC_DAPM_SUPPLY_S("Improve HP Amp Drv", 1, SND_SOC_NOPM,
1294                 0, 0, rt5640_hp_power_event, SND_SOC_DAPM_POST_PMU),
1295         SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0,
1296                 rt5640_hp_event,
1297                 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
1298         SND_SOC_DAPM_PGA_S("LOUT amp", 1, SND_SOC_NOPM, 0, 0,
1299                 rt5640_lout_event,
1300                 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
1301         SND_SOC_DAPM_SUPPLY("HP L Amp", RT5640_PWR_ANLG1,
1302                 RT5640_PWR_HP_L_BIT, 0, NULL, 0),
1303         SND_SOC_DAPM_SUPPLY("HP R Amp", RT5640_PWR_ANLG1,
1304                 RT5640_PWR_HP_R_BIT, 0, NULL, 0),
1305         SND_SOC_DAPM_SUPPLY("Improve SPK Amp Drv", RT5640_PWR_DIG1,
1306                 RT5640_PWR_CLS_D_BIT, 0, NULL, 0),
1307
1308         /* Output Switch */
1309         SND_SOC_DAPM_SWITCH("Speaker L Playback", SND_SOC_NOPM, 0, 0,
1310                         &spk_l_enable_control),
1311         SND_SOC_DAPM_SWITCH("Speaker R Playback", SND_SOC_NOPM, 0, 0,
1312                         &spk_r_enable_control),
1313         SND_SOC_DAPM_SWITCH("HP L Playback", SND_SOC_NOPM, 0, 0,
1314                         &hp_l_enable_control),
1315         SND_SOC_DAPM_SWITCH("HP R Playback", SND_SOC_NOPM, 0, 0,
1316                         &hp_r_enable_control),
1317         SND_SOC_DAPM_POST("HP Post", rt5640_hp_post_event),
1318         /* Output Lines */
1319         SND_SOC_DAPM_OUTPUT("SPOLP"),
1320         SND_SOC_DAPM_OUTPUT("SPOLN"),
1321         SND_SOC_DAPM_OUTPUT("SPORP"),
1322         SND_SOC_DAPM_OUTPUT("SPORN"),
1323         SND_SOC_DAPM_OUTPUT("HPOL"),
1324         SND_SOC_DAPM_OUTPUT("HPOR"),
1325         SND_SOC_DAPM_OUTPUT("LOUTL"),
1326         SND_SOC_DAPM_OUTPUT("LOUTR"),
1327 };
1328
1329 static const struct snd_soc_dapm_widget rt5640_specific_dapm_widgets[] = {
1330         /* Audio DSP */
1331         SND_SOC_DAPM_PGA("Audio DSP", SND_SOC_NOPM, 0, 0, NULL, 0),
1332         /* ANC */
1333         SND_SOC_DAPM_PGA("ANC", SND_SOC_NOPM, 0, 0, NULL, 0),
1334
1335         /* DAC2 channel Mux */
1336         SND_SOC_DAPM_MUX("DAC L2 Mux", SND_SOC_NOPM, 0, 0, &rt5640_dac_l2_mux),
1337         SND_SOC_DAPM_MUX("DAC R2 Mux", SND_SOC_NOPM, 0, 0, &rt5640_dac_r2_mux),
1338
1339         SND_SOC_DAPM_MIXER("Stereo DAC MIXL", SND_SOC_NOPM, 0, 0,
1340                 rt5640_sto_dac_l_mix, ARRAY_SIZE(rt5640_sto_dac_l_mix)),
1341         SND_SOC_DAPM_MIXER("Stereo DAC MIXR", SND_SOC_NOPM, 0, 0,
1342                 rt5640_sto_dac_r_mix, ARRAY_SIZE(rt5640_sto_dac_r_mix)),
1343
1344         SND_SOC_DAPM_DAC("DAC R2", NULL, RT5640_PWR_DIG1, RT5640_PWR_DAC_R2_BIT,
1345                 0),
1346         SND_SOC_DAPM_DAC("DAC L2", NULL, RT5640_PWR_DIG1, RT5640_PWR_DAC_L2_BIT,
1347                 0),
1348
1349         SND_SOC_DAPM_MIXER("OUT MIXL", RT5640_PWR_MIXER, RT5640_PWR_OM_L_BIT,
1350                 0, rt5640_out_l_mix, ARRAY_SIZE(rt5640_out_l_mix)),
1351         SND_SOC_DAPM_MIXER("OUT MIXR", RT5640_PWR_MIXER, RT5640_PWR_OM_R_BIT,
1352                 0, rt5640_out_r_mix, ARRAY_SIZE(rt5640_out_r_mix)),
1353
1354         SND_SOC_DAPM_MIXER("HPO MIX L", SND_SOC_NOPM, 0, 0,
1355                 rt5640_hpo_mix, ARRAY_SIZE(rt5640_hpo_mix)),
1356         SND_SOC_DAPM_MIXER("HPO MIX R", SND_SOC_NOPM, 0, 0,
1357                 rt5640_hpo_mix, ARRAY_SIZE(rt5640_hpo_mix)),
1358
1359         SND_SOC_DAPM_MIXER("Mono MIX", RT5640_PWR_ANLG1, RT5640_PWR_MM_BIT, 0,
1360                 rt5640_mono_mix, ARRAY_SIZE(rt5640_mono_mix)),
1361         SND_SOC_DAPM_SUPPLY("Improve MONO Amp Drv", RT5640_PWR_ANLG1,
1362                 RT5640_PWR_MA_BIT, 0, NULL, 0),
1363
1364         SND_SOC_DAPM_OUTPUT("MONOP"),
1365         SND_SOC_DAPM_OUTPUT("MONON"),
1366 };
1367
1368 static const struct snd_soc_dapm_widget rt5639_specific_dapm_widgets[] = {
1369         SND_SOC_DAPM_MIXER("Stereo DAC MIXL", SND_SOC_NOPM, 0, 0,
1370                 rt5639_sto_dac_l_mix, ARRAY_SIZE(rt5639_sto_dac_l_mix)),
1371         SND_SOC_DAPM_MIXER("Stereo DAC MIXR", SND_SOC_NOPM, 0, 0,
1372                 rt5639_sto_dac_r_mix, ARRAY_SIZE(rt5639_sto_dac_r_mix)),
1373
1374         SND_SOC_DAPM_SUPPLY("DAC L2 Filter", RT5640_PWR_DIG1,
1375                 RT5640_PWR_DAC_L2_BIT, 0, NULL, 0),
1376         SND_SOC_DAPM_SUPPLY("DAC R2 Filter", RT5640_PWR_DIG1,
1377                 RT5640_PWR_DAC_R2_BIT, 0, NULL, 0),
1378
1379         SND_SOC_DAPM_MIXER("OUT MIXL", RT5640_PWR_MIXER, RT5640_PWR_OM_L_BIT,
1380                 0, rt5639_out_l_mix, ARRAY_SIZE(rt5639_out_l_mix)),
1381         SND_SOC_DAPM_MIXER("OUT MIXR", RT5640_PWR_MIXER, RT5640_PWR_OM_R_BIT,
1382                 0, rt5639_out_r_mix, ARRAY_SIZE(rt5639_out_r_mix)),
1383
1384         SND_SOC_DAPM_MIXER("HPO MIX L", SND_SOC_NOPM, 0, 0,
1385                 rt5639_hpo_mix, ARRAY_SIZE(rt5639_hpo_mix)),
1386         SND_SOC_DAPM_MIXER("HPO MIX R", SND_SOC_NOPM, 0, 0,
1387                 rt5639_hpo_mix, ARRAY_SIZE(rt5639_hpo_mix)),
1388 };
1389
1390 static const struct snd_soc_dapm_route rt5640_dapm_routes[] = {
1391         {"IN1P", NULL, "LDO2"},
1392         {"IN2P", NULL, "LDO2"},
1393         {"IN3P", NULL, "LDO2"},
1394
1395         {"DMIC L1", NULL, "DMIC1"},
1396         {"DMIC R1", NULL, "DMIC1"},
1397         {"DMIC L2", NULL, "DMIC2"},
1398         {"DMIC R2", NULL, "DMIC2"},
1399
1400         {"BST1", NULL, "IN1P"},
1401         {"BST1", NULL, "IN1N"},
1402         {"BST2", NULL, "IN2P"},
1403         {"BST2", NULL, "IN2N"},
1404         {"BST3", NULL, "IN3P"},
1405         {"BST3", NULL, "IN3N"},
1406
1407         {"INL VOL", NULL, "IN2P"},
1408         {"INR VOL", NULL, "IN2N"},
1409
1410         {"RECMIXL", "HPOL Switch", "HPOL"},
1411         {"RECMIXL", "INL Switch", "INL VOL"},
1412         {"RECMIXL", "BST3 Switch", "BST3"},
1413         {"RECMIXL", "BST2 Switch", "BST2"},
1414         {"RECMIXL", "BST1 Switch", "BST1"},
1415         {"RECMIXL", "OUT MIXL Switch", "OUT MIXL"},
1416
1417         {"RECMIXR", "HPOR Switch", "HPOR"},
1418         {"RECMIXR", "INR Switch", "INR VOL"},
1419         {"RECMIXR", "BST3 Switch", "BST3"},
1420         {"RECMIXR", "BST2 Switch", "BST2"},
1421         {"RECMIXR", "BST1 Switch", "BST1"},
1422         {"RECMIXR", "OUT MIXR Switch", "OUT MIXR"},
1423
1424         {"ADC L", NULL, "RECMIXL"},
1425         {"ADC R", NULL, "RECMIXR"},
1426
1427         {"DMIC L1", NULL, "DMIC CLK"},
1428         {"DMIC L1", NULL, "DMIC1 Power"},
1429         {"DMIC R1", NULL, "DMIC CLK"},
1430         {"DMIC R1", NULL, "DMIC1 Power"},
1431         {"DMIC L2", NULL, "DMIC CLK"},
1432         {"DMIC L2", NULL, "DMIC2 Power"},
1433         {"DMIC R2", NULL, "DMIC CLK"},
1434         {"DMIC R2", NULL, "DMIC2 Power"},
1435
1436         {"Stereo ADC L2 Mux", "DMIC1", "DMIC L1"},
1437         {"Stereo ADC L2 Mux", "DMIC2", "DMIC L2"},
1438         {"Stereo ADC L2 Mux", "DIG MIX", "DIG MIXL"},
1439         {"Stereo ADC L1 Mux", "ADC", "ADC L"},
1440         {"Stereo ADC L1 Mux", "DIG MIX", "DIG MIXL"},
1441
1442         {"Stereo ADC R1 Mux", "ADC", "ADC R"},
1443         {"Stereo ADC R1 Mux", "DIG MIX", "DIG MIXR"},
1444         {"Stereo ADC R2 Mux", "DMIC1", "DMIC R1"},
1445         {"Stereo ADC R2 Mux", "DMIC2", "DMIC R2"},
1446         {"Stereo ADC R2 Mux", "DIG MIX", "DIG MIXR"},
1447
1448         {"Mono ADC L2 Mux", "DMIC L1", "DMIC L1"},
1449         {"Mono ADC L2 Mux", "DMIC L2", "DMIC L2"},
1450         {"Mono ADC L2 Mux", "Mono DAC MIXL", "Mono DAC MIXL"},
1451         {"Mono ADC L1 Mux", "Mono DAC MIXL", "Mono DAC MIXL"},
1452         {"Mono ADC L1 Mux", "ADCL", "ADC L"},
1453
1454         {"Mono ADC R1 Mux", "Mono DAC MIXR", "Mono DAC MIXR"},
1455         {"Mono ADC R1 Mux", "ADCR", "ADC R"},
1456         {"Mono ADC R2 Mux", "DMIC R1", "DMIC R1"},
1457         {"Mono ADC R2 Mux", "DMIC R2", "DMIC R2"},
1458         {"Mono ADC R2 Mux", "Mono DAC MIXR", "Mono DAC MIXR"},
1459
1460         {"Stereo ADC MIXL", "ADC1 Switch", "Stereo ADC L1 Mux"},
1461         {"Stereo ADC MIXL", "ADC2 Switch", "Stereo ADC L2 Mux"},
1462         {"Stereo ADC MIXL", NULL, "Stereo Filter"},
1463         {"Stereo Filter", NULL, "PLL1", is_sys_clk_from_pll},
1464
1465         {"Stereo ADC MIXR", "ADC1 Switch", "Stereo ADC R1 Mux"},
1466         {"Stereo ADC MIXR", "ADC2 Switch", "Stereo ADC R2 Mux"},
1467         {"Stereo ADC MIXR", NULL, "Stereo Filter"},
1468         {"Stereo Filter", NULL, "PLL1", is_sys_clk_from_pll},
1469
1470         {"Mono ADC MIXL", "ADC1 Switch", "Mono ADC L1 Mux"},
1471         {"Mono ADC MIXL", "ADC2 Switch", "Mono ADC L2 Mux"},
1472         {"Mono ADC MIXL", NULL, "Mono Left Filter"},
1473         {"Mono Left Filter", NULL, "PLL1", is_sys_clk_from_pll},
1474
1475         {"Mono ADC MIXR", "ADC1 Switch", "Mono ADC R1 Mux"},
1476         {"Mono ADC MIXR", "ADC2 Switch", "Mono ADC R2 Mux"},
1477         {"Mono ADC MIXR", NULL, "Mono Right Filter"},
1478         {"Mono Right Filter", NULL, "PLL1", is_sys_clk_from_pll},
1479
1480         {"IF2 ADC L", NULL, "Mono ADC MIXL"},
1481         {"IF2 ADC R", NULL, "Mono ADC MIXR"},
1482         {"IF1 ADC L", NULL, "Stereo ADC MIXL"},
1483         {"IF1 ADC R", NULL, "Stereo ADC MIXR"},
1484
1485         {"IF1 ADC", NULL, "I2S1"},
1486         {"IF1 ADC", NULL, "IF1 ADC L"},
1487         {"IF1 ADC", NULL, "IF1 ADC R"},
1488         {"IF2 ADC", NULL, "I2S2"},
1489         {"IF2 ADC", NULL, "IF2 ADC L"},
1490         {"IF2 ADC", NULL, "IF2 ADC R"},
1491
1492         {"DAI1 TX Mux", "1:1|2:2", "IF1 ADC"},
1493         {"DAI1 TX Mux", "1:2|2:1", "IF2 ADC"},
1494         {"DAI1 IF1 Mux", "1:1|2:1", "IF1 ADC"},
1495         {"DAI1 IF2 Mux", "1:1|2:1", "IF2 ADC"},
1496         {"SDI1 TX Mux", "IF1", "DAI1 IF1 Mux"},
1497         {"SDI1 TX Mux", "IF2", "DAI1 IF2 Mux"},
1498
1499         {"DAI2 TX Mux", "1:2|2:1", "IF1 ADC"},
1500         {"DAI2 TX Mux", "1:1|2:2", "IF2 ADC"},
1501         {"DAI2 IF1 Mux", "1:2|2:2", "IF1 ADC"},
1502         {"DAI2 IF2 Mux", "1:2|2:2", "IF2 ADC"},
1503         {"SDI2 TX Mux", "IF1", "DAI2 IF1 Mux"},
1504         {"SDI2 TX Mux", "IF2", "DAI2 IF2 Mux"},
1505
1506         {"AIF1TX", NULL, "DAI1 TX Mux"},
1507         {"AIF1TX", NULL, "SDI1 TX Mux"},
1508         {"AIF2TX", NULL, "DAI2 TX Mux"},
1509         {"AIF2TX", NULL, "SDI2 TX Mux"},
1510
1511         {"DAI1 RX Mux", "1:1|2:2", "AIF1RX"},
1512         {"DAI1 RX Mux", "1:1|2:1", "AIF1RX"},
1513         {"DAI1 RX Mux", "1:2|2:1", "AIF2RX"},
1514         {"DAI1 RX Mux", "1:2|2:2", "AIF2RX"},
1515
1516         {"DAI2 RX Mux", "1:2|2:1", "AIF1RX"},
1517         {"DAI2 RX Mux", "1:1|2:1", "AIF1RX"},
1518         {"DAI2 RX Mux", "1:1|2:2", "AIF2RX"},
1519         {"DAI2 RX Mux", "1:2|2:2", "AIF2RX"},
1520
1521         {"IF1 DAC", NULL, "I2S1"},
1522         {"IF1 DAC", NULL, "DAI1 RX Mux"},
1523         {"IF2 DAC", NULL, "I2S2"},
1524         {"IF2 DAC", NULL, "DAI2 RX Mux"},
1525
1526         {"IF1 DAC L", NULL, "IF1 DAC"},
1527         {"IF1 DAC R", NULL, "IF1 DAC"},
1528         {"IF2 DAC L", NULL, "IF2 DAC"},
1529         {"IF2 DAC R", NULL, "IF2 DAC"},
1530
1531         {"DAC MIXL", "Stereo ADC Switch", "Stereo ADC MIXL"},
1532         {"DAC MIXL", "INF1 Switch", "IF1 DAC L"},
1533         {"DAC MIXR", "Stereo ADC Switch", "Stereo ADC MIXR"},
1534         {"DAC MIXR", "INF1 Switch", "IF1 DAC R"},
1535
1536         {"Stereo DAC MIXL", "DAC L1 Switch", "DAC MIXL"},
1537         {"Stereo DAC MIXR", "DAC R1 Switch", "DAC MIXR"},
1538
1539         {"Mono DAC MIXL", "DAC L1 Switch", "DAC MIXL"},
1540         {"Mono DAC MIXR", "DAC R1 Switch", "DAC MIXR"},
1541
1542         {"DIG MIXL", "DAC L1 Switch", "DAC MIXL"},
1543         {"DIG MIXR", "DAC R1 Switch", "DAC MIXR"},
1544
1545         {"DAC L1", NULL, "Stereo DAC MIXL"},
1546         {"DAC L1", NULL, "PLL1", is_sys_clk_from_pll},
1547         {"DAC R1", NULL, "Stereo DAC MIXR"},
1548         {"DAC R1", NULL, "PLL1", is_sys_clk_from_pll},
1549
1550         {"SPK MIXL", "REC MIXL Switch", "RECMIXL"},
1551         {"SPK MIXL", "INL Switch", "INL VOL"},
1552         {"SPK MIXL", "DAC L1 Switch", "DAC L1"},
1553         {"SPK MIXL", "OUT MIXL Switch", "OUT MIXL"},
1554         {"SPK MIXR", "REC MIXR Switch", "RECMIXR"},
1555         {"SPK MIXR", "INR Switch", "INR VOL"},
1556         {"SPK MIXR", "DAC R1 Switch", "DAC R1"},
1557         {"SPK MIXR", "OUT MIXR Switch", "OUT MIXR"},
1558
1559         {"OUT MIXL", "BST1 Switch", "BST1"},
1560         {"OUT MIXL", "INL Switch", "INL VOL"},
1561         {"OUT MIXL", "REC MIXL Switch", "RECMIXL"},
1562         {"OUT MIXL", "DAC L1 Switch", "DAC L1"},
1563
1564         {"OUT MIXR", "BST2 Switch", "BST2"},
1565         {"OUT MIXR", "BST1 Switch", "BST1"},
1566         {"OUT MIXR", "INR Switch", "INR VOL"},
1567         {"OUT MIXR", "REC MIXR Switch", "RECMIXR"},
1568         {"OUT MIXR", "DAC R1 Switch", "DAC R1"},
1569
1570         {"SPKVOL L", NULL, "SPK MIXL"},
1571         {"SPKVOL R", NULL, "SPK MIXR"},
1572         {"HPOVOL L", NULL, "OUT MIXL"},
1573         {"HPOVOL R", NULL, "OUT MIXR"},
1574         {"OUTVOL L", NULL, "OUT MIXL"},
1575         {"OUTVOL R", NULL, "OUT MIXR"},
1576
1577         {"SPOL MIX", "DAC R1 Switch", "DAC R1"},
1578         {"SPOL MIX", "DAC L1 Switch", "DAC L1"},
1579         {"SPOL MIX", "SPKVOL R Switch", "SPKVOL R"},
1580         {"SPOL MIX", "SPKVOL L Switch", "SPKVOL L"},
1581         {"SPOL MIX", "BST1 Switch", "BST1"},
1582         {"SPOR MIX", "DAC R1 Switch", "DAC R1"},
1583         {"SPOR MIX", "SPKVOL R Switch", "SPKVOL R"},
1584         {"SPOR MIX", "BST1 Switch", "BST1"},
1585
1586         {"HPO MIX L", "HPO MIX DAC1 Switch", "DAC L1"},
1587         {"HPO MIX L", "HPO MIX HPVOL Switch", "HPOVOL L"},
1588         {"HPO MIX L", NULL, "HP L Amp"},
1589         {"HPO MIX R", "HPO MIX DAC1 Switch", "DAC R1"},
1590         {"HPO MIX R", "HPO MIX HPVOL Switch", "HPOVOL R"},
1591         {"HPO MIX R", NULL, "HP R Amp"},
1592
1593         {"LOUT MIX", "DAC L1 Switch", "DAC L1"},
1594         {"LOUT MIX", "DAC R1 Switch", "DAC R1"},
1595         {"LOUT MIX", "OUTVOL L Switch", "OUTVOL L"},
1596         {"LOUT MIX", "OUTVOL R Switch", "OUTVOL R"},
1597
1598         {"HP Amp", NULL, "HPO MIX L"},
1599         {"HP Amp", NULL, "HPO MIX R"},
1600
1601         {"Speaker L Playback", "Switch", "SPOL MIX"},
1602         {"Speaker R Playback", "Switch", "SPOR MIX"},
1603         {"SPOLP", NULL, "Speaker L Playback"},
1604         {"SPOLN", NULL, "Speaker L Playback"},
1605         {"SPORP", NULL, "Speaker R Playback"},
1606         {"SPORN", NULL, "Speaker R Playback"},
1607
1608         {"SPOLP", NULL, "Improve SPK Amp Drv"},
1609         {"SPOLN", NULL, "Improve SPK Amp Drv"},
1610         {"SPORP", NULL, "Improve SPK Amp Drv"},
1611         {"SPORN", NULL, "Improve SPK Amp Drv"},
1612
1613         {"HPOL", NULL, "Improve HP Amp Drv"},
1614         {"HPOR", NULL, "Improve HP Amp Drv"},
1615
1616         {"HP L Playback", "Switch", "HP Amp"},
1617         {"HP R Playback", "Switch", "HP Amp"},
1618         {"HPOL", NULL, "HP L Playback"},
1619         {"HPOR", NULL, "HP R Playback"},
1620
1621         {"LOUT amp", NULL, "LOUT MIX"},
1622         {"LOUTL", NULL, "LOUT amp"},
1623         {"LOUTR", NULL, "LOUT amp"},
1624 };
1625
1626 static const struct snd_soc_dapm_route rt5640_specific_dapm_routes[] = {
1627         {"ANC", NULL, "Stereo ADC MIXL"},
1628         {"ANC", NULL, "Stereo ADC MIXR"},
1629
1630         {"Audio DSP", NULL, "DAC MIXL"},
1631         {"Audio DSP", NULL, "DAC MIXR"},
1632
1633         {"DAC L2 Mux", "IF2", "IF2 DAC L"},
1634         {"DAC L2 Mux", "Base L/R", "Audio DSP"},
1635
1636         {"DAC R2 Mux", "IF2", "IF2 DAC R"},
1637
1638         {"Stereo DAC MIXL", "DAC L2 Switch", "DAC L2 Mux"},
1639         {"Stereo DAC MIXL", "ANC Switch", "ANC"},
1640         {"Stereo DAC MIXR", "DAC R2 Switch", "DAC R2 Mux"},
1641         {"Stereo DAC MIXR", "ANC Switch", "ANC"},
1642
1643         {"Mono DAC MIXL", "DAC L2 Switch", "DAC L2 Mux"},
1644         {"Mono DAC MIXL", "DAC R2 Switch", "DAC R2 Mux"},
1645
1646         {"Mono DAC MIXR", "DAC R2 Switch", "DAC R2 Mux"},
1647         {"Mono DAC MIXR", "DAC L2 Switch", "DAC L2 Mux"},
1648
1649         {"DIG MIXR", "DAC R2 Switch", "DAC R2 Mux"},
1650         {"DIG MIXL", "DAC L2 Switch", "DAC L2 Mux"},
1651
1652         {"DAC L2", NULL, "Mono DAC MIXL"},
1653         {"DAC L2", NULL, "PLL1", is_sys_clk_from_pll},
1654         {"DAC R2", NULL, "Mono DAC MIXR"},
1655         {"DAC R2", NULL, "PLL1", is_sys_clk_from_pll},
1656
1657         {"SPK MIXL", "DAC L2 Switch", "DAC L2"},
1658         {"SPK MIXR", "DAC R2 Switch", "DAC R2"},
1659
1660         {"OUT MIXL", "SPK MIXL Switch", "SPK MIXL"},
1661         {"OUT MIXR", "SPK MIXR Switch", "SPK MIXR"},
1662
1663         {"OUT MIXL", "DAC R2 Switch", "DAC R2"},
1664         {"OUT MIXL", "DAC L2 Switch", "DAC L2"},
1665
1666         {"OUT MIXR", "DAC L2 Switch", "DAC L2"},
1667         {"OUT MIXR", "DAC R2 Switch", "DAC R2"},
1668
1669         {"HPO MIX L", "HPO MIX DAC2 Switch", "DAC L2"},
1670         {"HPO MIX R", "HPO MIX DAC2 Switch", "DAC R2"},
1671
1672         {"Mono MIX", "DAC R2 Switch", "DAC R2"},
1673         {"Mono MIX", "DAC L2 Switch", "DAC L2"},
1674         {"Mono MIX", "OUTVOL R Switch", "OUTVOL R"},
1675         {"Mono MIX", "OUTVOL L Switch", "OUTVOL L"},
1676         {"Mono MIX", "BST1 Switch", "BST1"},
1677
1678         {"MONOP", NULL, "Mono MIX"},
1679         {"MONON", NULL, "Mono MIX"},
1680         {"MONOP", NULL, "Improve MONO Amp Drv"},
1681 };
1682
1683 static const struct snd_soc_dapm_route rt5639_specific_dapm_routes[] = {
1684         {"Stereo DAC MIXL", "DAC L2 Switch", "IF2 DAC L"},
1685         {"Stereo DAC MIXR", "DAC R2 Switch", "IF2 DAC R"},
1686
1687         {"Mono DAC MIXL", "DAC L2 Switch", "IF2 DAC L"},
1688         {"Mono DAC MIXL", "DAC R2 Switch", "IF2 DAC R"},
1689
1690         {"Mono DAC MIXR", "DAC R2 Switch", "IF2 DAC R"},
1691         {"Mono DAC MIXR", "DAC L2 Switch", "IF2 DAC L"},
1692
1693         {"DIG MIXL", "DAC L2 Switch", "IF2 DAC L"},
1694         {"DIG MIXR", "DAC R2 Switch", "IF2 DAC R"},
1695
1696         {"IF2 DAC L", NULL, "DAC L2 Filter"},
1697         {"IF2 DAC R", NULL, "DAC R2 Filter"},
1698 };
1699
1700 static int get_sdp_info(struct snd_soc_codec *codec, int dai_id)
1701 {
1702         int ret = 0, val;
1703
1704         if (codec == NULL)
1705                 return -EINVAL;
1706
1707         val = snd_soc_read(codec, RT5640_I2S1_SDP);
1708         val = (val & RT5640_I2S_IF_MASK) >> RT5640_I2S_IF_SFT;
1709         switch (dai_id) {
1710         case RT5640_AIF1:
1711                 switch (val) {
1712                 case RT5640_IF_123:
1713                 case RT5640_IF_132:
1714                         ret |= RT5640_U_IF1;
1715                         break;
1716                 case RT5640_IF_113:
1717                         ret |= RT5640_U_IF1;
1718                 case RT5640_IF_312:
1719                 case RT5640_IF_213:
1720                         ret |= RT5640_U_IF2;
1721                         break;
1722                 }
1723                 break;
1724
1725         case RT5640_AIF2:
1726                 switch (val) {
1727                 case RT5640_IF_231:
1728                 case RT5640_IF_213:
1729                         ret |= RT5640_U_IF1;
1730                         break;
1731                 case RT5640_IF_223:
1732                         ret |= RT5640_U_IF1;
1733                 case RT5640_IF_123:
1734                 case RT5640_IF_321:
1735                         ret |= RT5640_U_IF2;
1736                         break;
1737                 }
1738                 break;
1739
1740         default:
1741                 ret = -EINVAL;
1742                 break;
1743         }
1744
1745         return ret;
1746 }
1747
1748 static int rt5640_hw_params(struct snd_pcm_substream *substream,
1749         struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
1750 {
1751         struct snd_soc_codec *codec = dai->codec;
1752         struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
1753         unsigned int val_len = 0, val_clk, mask_clk;
1754         int dai_sel, pre_div, bclk_ms, frame_size;
1755
1756         rt5640->lrck[dai->id] = params_rate(params);
1757         pre_div = rl6231_get_clk_info(rt5640->sysclk, rt5640->lrck[dai->id]);
1758         if (pre_div < 0) {
1759                 dev_err(codec->dev, "Unsupported clock setting %d for DAI %d\n",
1760                         rt5640->lrck[dai->id], dai->id);
1761                 return -EINVAL;
1762         }
1763         frame_size = snd_soc_params_to_frame_size(params);
1764         if (frame_size < 0) {
1765                 dev_err(codec->dev, "Unsupported frame size: %d\n", frame_size);
1766                 return frame_size;
1767         }
1768         if (frame_size > 32)
1769                 bclk_ms = 1;
1770         else
1771                 bclk_ms = 0;
1772         rt5640->bclk[dai->id] = rt5640->lrck[dai->id] * (32 << bclk_ms);
1773
1774         dev_dbg(dai->dev, "bclk is %dHz and lrck is %dHz\n",
1775                 rt5640->bclk[dai->id], rt5640->lrck[dai->id]);
1776         dev_dbg(dai->dev, "bclk_ms is %d and pre_div is %d for iis %d\n",
1777                                 bclk_ms, pre_div, dai->id);
1778
1779         switch (params_width(params)) {
1780         case 16:
1781                 break;
1782         case 20:
1783                 val_len |= RT5640_I2S_DL_20;
1784                 break;
1785         case 24:
1786                 val_len |= RT5640_I2S_DL_24;
1787                 break;
1788         case 8:
1789                 val_len |= RT5640_I2S_DL_8;
1790                 break;
1791         default:
1792                 return -EINVAL;
1793         }
1794
1795         dai_sel = get_sdp_info(codec, dai->id);
1796         if (dai_sel < 0) {
1797                 dev_err(codec->dev, "Failed to get sdp info: %d\n", dai_sel);
1798                 return -EINVAL;
1799         }
1800         if (dai_sel & RT5640_U_IF1) {
1801                 mask_clk = RT5640_I2S_BCLK_MS1_MASK | RT5640_I2S_PD1_MASK;
1802                 val_clk = bclk_ms << RT5640_I2S_BCLK_MS1_SFT |
1803                         pre_div << RT5640_I2S_PD1_SFT;
1804                 snd_soc_update_bits(codec, RT5640_I2S1_SDP,
1805                         RT5640_I2S_DL_MASK, val_len);
1806                 snd_soc_update_bits(codec, RT5640_ADDA_CLK1, mask_clk, val_clk);
1807         }
1808         if (dai_sel & RT5640_U_IF2) {
1809                 mask_clk = RT5640_I2S_BCLK_MS2_MASK | RT5640_I2S_PD2_MASK;
1810                 val_clk = bclk_ms << RT5640_I2S_BCLK_MS2_SFT |
1811                         pre_div << RT5640_I2S_PD2_SFT;
1812                 snd_soc_update_bits(codec, RT5640_I2S2_SDP,
1813                         RT5640_I2S_DL_MASK, val_len);
1814                 snd_soc_update_bits(codec, RT5640_ADDA_CLK1, mask_clk, val_clk);
1815         }
1816
1817         return 0;
1818 }
1819
1820 static int rt5640_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
1821 {
1822         struct snd_soc_codec *codec = dai->codec;
1823         struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
1824         unsigned int reg_val = 0;
1825         int dai_sel;
1826
1827         switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
1828         case SND_SOC_DAIFMT_CBM_CFM:
1829                 rt5640->master[dai->id] = 1;
1830                 break;
1831         case SND_SOC_DAIFMT_CBS_CFS:
1832                 reg_val |= RT5640_I2S_MS_S;
1833                 rt5640->master[dai->id] = 0;
1834                 break;
1835         default:
1836                 return -EINVAL;
1837         }
1838
1839         switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
1840         case SND_SOC_DAIFMT_NB_NF:
1841                 break;
1842         case SND_SOC_DAIFMT_IB_NF:
1843                 reg_val |= RT5640_I2S_BP_INV;
1844                 break;
1845         default:
1846                 return -EINVAL;
1847         }
1848
1849         switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
1850         case SND_SOC_DAIFMT_I2S:
1851                 break;
1852         case SND_SOC_DAIFMT_LEFT_J:
1853                 reg_val |= RT5640_I2S_DF_LEFT;
1854                 break;
1855         case SND_SOC_DAIFMT_DSP_A:
1856                 reg_val |= RT5640_I2S_DF_PCM_A;
1857                 break;
1858         case SND_SOC_DAIFMT_DSP_B:
1859                 reg_val  |= RT5640_I2S_DF_PCM_B;
1860                 break;
1861         default:
1862                 return -EINVAL;
1863         }
1864
1865         dai_sel = get_sdp_info(codec, dai->id);
1866         if (dai_sel < 0) {
1867                 dev_err(codec->dev, "Failed to get sdp info: %d\n", dai_sel);
1868                 return -EINVAL;
1869         }
1870         if (dai_sel & RT5640_U_IF1) {
1871                 snd_soc_update_bits(codec, RT5640_I2S1_SDP,
1872                         RT5640_I2S_MS_MASK | RT5640_I2S_BP_MASK |
1873                         RT5640_I2S_DF_MASK, reg_val);
1874         }
1875         if (dai_sel & RT5640_U_IF2) {
1876                 snd_soc_update_bits(codec, RT5640_I2S2_SDP,
1877                         RT5640_I2S_MS_MASK | RT5640_I2S_BP_MASK |
1878                         RT5640_I2S_DF_MASK, reg_val);
1879         }
1880
1881         return 0;
1882 }
1883
1884 static int rt5640_set_dai_sysclk(struct snd_soc_dai *dai,
1885                 int clk_id, unsigned int freq, int dir)
1886 {
1887         struct snd_soc_codec *codec = dai->codec;
1888         struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
1889         unsigned int reg_val = 0;
1890
1891         if (freq == rt5640->sysclk && clk_id == rt5640->sysclk_src)
1892                 return 0;
1893
1894         switch (clk_id) {
1895         case RT5640_SCLK_S_MCLK:
1896                 reg_val |= RT5640_SCLK_SRC_MCLK;
1897                 break;
1898         case RT5640_SCLK_S_PLL1:
1899                 reg_val |= RT5640_SCLK_SRC_PLL1;
1900                 break;
1901         default:
1902                 dev_err(codec->dev, "Invalid clock id (%d)\n", clk_id);
1903                 return -EINVAL;
1904         }
1905         snd_soc_update_bits(codec, RT5640_GLB_CLK,
1906                 RT5640_SCLK_SRC_MASK, reg_val);
1907         rt5640->sysclk = freq;
1908         rt5640->sysclk_src = clk_id;
1909
1910         dev_dbg(dai->dev, "Sysclk is %dHz and clock id is %d\n", freq, clk_id);
1911         return 0;
1912 }
1913
1914 static int rt5640_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source,
1915                         unsigned int freq_in, unsigned int freq_out)
1916 {
1917         struct snd_soc_codec *codec = dai->codec;
1918         struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
1919         struct rl6231_pll_code pll_code;
1920         int ret, dai_sel;
1921
1922         if (source == rt5640->pll_src && freq_in == rt5640->pll_in &&
1923             freq_out == rt5640->pll_out)
1924                 return 0;
1925
1926         if (!freq_in || !freq_out) {
1927                 dev_dbg(codec->dev, "PLL disabled\n");
1928
1929                 rt5640->pll_in = 0;
1930                 rt5640->pll_out = 0;
1931                 snd_soc_update_bits(codec, RT5640_GLB_CLK,
1932                         RT5640_SCLK_SRC_MASK, RT5640_SCLK_SRC_MCLK);
1933                 return 0;
1934         }
1935
1936         switch (source) {
1937         case RT5640_PLL1_S_MCLK:
1938                 snd_soc_update_bits(codec, RT5640_GLB_CLK,
1939                         RT5640_PLL1_SRC_MASK, RT5640_PLL1_SRC_MCLK);
1940                 break;
1941         case RT5640_PLL1_S_BCLK1:
1942         case RT5640_PLL1_S_BCLK2:
1943                 dai_sel = get_sdp_info(codec, dai->id);
1944                 if (dai_sel < 0) {
1945                         dev_err(codec->dev,
1946                                 "Failed to get sdp info: %d\n", dai_sel);
1947                         return -EINVAL;
1948                 }
1949                 if (dai_sel & RT5640_U_IF1) {
1950                         snd_soc_update_bits(codec, RT5640_GLB_CLK,
1951                                 RT5640_PLL1_SRC_MASK, RT5640_PLL1_SRC_BCLK1);
1952                 }
1953                 if (dai_sel & RT5640_U_IF2) {
1954                         snd_soc_update_bits(codec, RT5640_GLB_CLK,
1955                                 RT5640_PLL1_SRC_MASK, RT5640_PLL1_SRC_BCLK2);
1956                 }
1957                 break;
1958         default:
1959                 dev_err(codec->dev, "Unknown PLL source %d\n", source);
1960                 return -EINVAL;
1961         }
1962
1963         ret = rl6231_pll_calc(freq_in, freq_out, &pll_code);
1964         if (ret < 0) {
1965                 dev_err(codec->dev, "Unsupport input clock %d\n", freq_in);
1966                 return ret;
1967         }
1968
1969         dev_dbg(codec->dev, "bypass=%d m=%d n=%d k=%d\n",
1970                 pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code),
1971                 pll_code.n_code, pll_code.k_code);
1972
1973         snd_soc_write(codec, RT5640_PLL_CTRL1,
1974                 pll_code.n_code << RT5640_PLL_N_SFT | pll_code.k_code);
1975         snd_soc_write(codec, RT5640_PLL_CTRL2,
1976                 (pll_code.m_bp ? 0 : pll_code.m_code) << RT5640_PLL_M_SFT |
1977                 pll_code.m_bp << RT5640_PLL_M_BP_SFT);
1978
1979         rt5640->pll_in = freq_in;
1980         rt5640->pll_out = freq_out;
1981         rt5640->pll_src = source;
1982
1983         return 0;
1984 }
1985
1986 static int rt5640_set_bias_level(struct snd_soc_codec *codec,
1987                         enum snd_soc_bias_level level)
1988 {
1989         struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
1990         int ret;
1991
1992         switch (level) {
1993         case SND_SOC_BIAS_ON:
1994                 break;
1995
1996         case SND_SOC_BIAS_PREPARE:
1997                 /*
1998                  * SND_SOC_BIAS_PREPARE is called while preparing for a
1999                  * transition to ON or away from ON. If current bias_level
2000                  * is SND_SOC_BIAS_ON, then it is preparing for a transition
2001                  * away from ON. Disable the clock in that case, otherwise
2002                  * enable it.
2003                  */
2004                 if (IS_ERR(rt5640->mclk))
2005                         break;
2006
2007                 if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_ON) {
2008                         clk_disable_unprepare(rt5640->mclk);
2009                 } else {
2010                         ret = clk_prepare_enable(rt5640->mclk);
2011                         if (ret)
2012                                 return ret;
2013                 }
2014                 break;
2015
2016         case SND_SOC_BIAS_STANDBY:
2017                 if (SND_SOC_BIAS_OFF == snd_soc_codec_get_bias_level(codec)) {
2018                         snd_soc_update_bits(codec, RT5640_PWR_ANLG1,
2019                                 RT5640_PWR_VREF1 | RT5640_PWR_MB |
2020                                 RT5640_PWR_BG | RT5640_PWR_VREF2,
2021                                 RT5640_PWR_VREF1 | RT5640_PWR_MB |
2022                                 RT5640_PWR_BG | RT5640_PWR_VREF2);
2023                         usleep_range(10000, 15000);
2024                         snd_soc_update_bits(codec, RT5640_PWR_ANLG1,
2025                                 RT5640_PWR_FV1 | RT5640_PWR_FV2,
2026                                 RT5640_PWR_FV1 | RT5640_PWR_FV2);
2027                         snd_soc_update_bits(codec, RT5640_DUMMY1,
2028                                                 0x0301, 0x0301);
2029                         snd_soc_update_bits(codec, RT5640_MICBIAS,
2030                                                 0x0030, 0x0030);
2031                 }
2032                 break;
2033
2034         case SND_SOC_BIAS_OFF:
2035                 snd_soc_write(codec, RT5640_DEPOP_M1, 0x0004);
2036                 snd_soc_write(codec, RT5640_DEPOP_M2, 0x1100);
2037                 snd_soc_update_bits(codec, RT5640_DUMMY1, 0x1, 0);
2038                 snd_soc_write(codec, RT5640_PWR_DIG1, 0x0000);
2039                 snd_soc_write(codec, RT5640_PWR_DIG2, 0x0000);
2040                 snd_soc_write(codec, RT5640_PWR_VOL, 0x0000);
2041                 snd_soc_write(codec, RT5640_PWR_MIXER, 0x0000);
2042                 snd_soc_write(codec, RT5640_PWR_ANLG1, 0x0000);
2043                 snd_soc_write(codec, RT5640_PWR_ANLG2, 0x0000);
2044                 break;
2045
2046         default:
2047                 break;
2048         }
2049
2050         return 0;
2051 }
2052
2053 int rt5640_dmic_enable(struct snd_soc_codec *codec,
2054                        bool dmic1_data_pin, bool dmic2_data_pin)
2055 {
2056         struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
2057
2058         regmap_update_bits(rt5640->regmap, RT5640_GPIO_CTRL1,
2059                 RT5640_GP2_PIN_MASK, RT5640_GP2_PIN_DMIC1_SCL);
2060
2061         if (dmic1_data_pin) {
2062                 regmap_update_bits(rt5640->regmap, RT5640_DMIC,
2063                         RT5640_DMIC_1_DP_MASK, RT5640_DMIC_1_DP_GPIO3);
2064                 regmap_update_bits(rt5640->regmap, RT5640_GPIO_CTRL1,
2065                         RT5640_GP3_PIN_MASK, RT5640_GP3_PIN_DMIC1_SDA);
2066         }
2067
2068         if (dmic2_data_pin) {
2069                 regmap_update_bits(rt5640->regmap, RT5640_DMIC,
2070                         RT5640_DMIC_2_DP_MASK, RT5640_DMIC_2_DP_GPIO4);
2071                 regmap_update_bits(rt5640->regmap, RT5640_GPIO_CTRL1,
2072                         RT5640_GP4_PIN_MASK, RT5640_GP4_PIN_DMIC2_SDA);
2073         }
2074
2075         return 0;
2076 }
2077
2078 EXPORT_SYMBOL_GPL(rt5640_dmic_enable);
2079
2080 static int rt5640_hp_jack_change(struct notifier_block *nb,
2081                                  unsigned long flags, void *data)
2082 {
2083         return NOTIFY_OK;
2084 }
2085
2086 static struct notifier_block rt5640_hp_jack_nb = {
2087         .notifier_call = rt5640_hp_jack_change,
2088 };
2089
2090 static void rt5640_jack_init(struct rt5640_priv *rt5640)
2091 {
2092         snd_soc_card_jack_new(rt5640->codec->component.card,
2093                               "Headphone Jack", SND_JACK_HEADPHONE,
2094                         &rt5640->hp_jack, NULL, 0);
2095         snd_soc_jack_notifier_register(&rt5640->hp_jack, &rt5640_hp_jack_nb);
2096 }
2097
2098 static int rt5640_hp_adc_iio_read(struct rt5640_priv *rt5640)
2099 {
2100         struct iio_channel *channel = rt5640->chan;
2101         int val, ret;
2102
2103         if (!channel)
2104                 return RT5640_ADC_INVALID_ADVALUE;
2105         ret = iio_read_channel_raw(channel, &val);
2106         if (ret < 0) {
2107                 dev_err(rt5640->codec->dev,
2108                         "read hp_det channel() error: %d\n", ret);
2109                 return ret;
2110         }
2111         return val;
2112 }
2113
2114 static void rt5640_hp_adc_poll(struct work_struct *work)
2115 {
2116         struct rt5640_priv *rt5640;
2117         int result = -1;
2118
2119         rt5640 = container_of(work, struct rt5640_priv, adc_poll_work.work);
2120                 result = rt5640_hp_adc_iio_read(rt5640);
2121                 if (result > RT5640_ADC_INVALID_ADVALUE &&
2122                     result < RT5640_ADC_EMPTY_ADVALUE) {
2123                         if (result < rt5640->hp_det_adc_value + RT5640_ADC_DRIFT_ADVALUE &&
2124                             result > rt5640->hp_det_adc_value - RT5640_ADC_DRIFT_ADVALUE){
2125                 if (!rt5640->hp_insert) {
2126                         dev_dbg(rt5640->codec->dev,
2127                                 "headphone insert,adc=%d\n", result);
2128                         rt5640->hp_insert = true;
2129                                 snd_soc_jack_report(&rt5640->hp_jack, SND_JACK_HEADPHONE,
2130                                                     SND_JACK_HEADPHONE);
2131                         if (!rt5640->hp_mute)
2132                                 rt5640_hp_gpio_ctrl(rt5640, true);
2133                 }
2134         } else{
2135                 if (rt5640->hp_insert) {
2136                         dev_dbg(rt5640->codec->dev,
2137                                 "headphone not insert,adc=%d\n", result);
2138                         rt5640->hp_insert = false;
2139                                         rt5640_hp_gpio_ctrl(rt5640, false);
2140                                         snd_soc_jack_report(&rt5640->hp_jack, 0,
2141                                                             SND_JACK_HEADPHONE);
2142                         }
2143                 }
2144         }
2145
2146         schedule_delayed_work(&rt5640->adc_poll_work,
2147                               RT5640_ADC_SAMPLE_JIFFIES);
2148 }
2149
2150 static int rt5640_probe(struct snd_soc_codec *codec)
2151 {
2152         struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
2153         struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
2154
2155         /* Check if MCLK provided */
2156         rt5640->mclk = devm_clk_get(codec->dev, "mclk");
2157         if (PTR_ERR(rt5640->mclk) == -EPROBE_DEFER)
2158                 return -EPROBE_DEFER;
2159
2160         rt5640->codec = codec;
2161
2162         snd_soc_codec_force_bias_level(codec, SND_SOC_BIAS_OFF);
2163
2164         snd_soc_update_bits(codec, RT5640_DUMMY1, 0x0301, 0x0301);
2165         snd_soc_update_bits(codec, RT5640_MICBIAS, 0x0030, 0x0030);
2166         snd_soc_update_bits(codec, RT5640_DSP_PATH2, 0xfc00, 0x0c00);
2167
2168         switch (snd_soc_read(codec, RT5640_RESET) & RT5640_ID_MASK) {
2169         case RT5640_ID_5640:
2170         case RT5640_ID_5642:
2171                 snd_soc_add_codec_controls(codec,
2172                         rt5640_specific_snd_controls,
2173                         ARRAY_SIZE(rt5640_specific_snd_controls));
2174                 snd_soc_dapm_new_controls(dapm,
2175                         rt5640_specific_dapm_widgets,
2176                         ARRAY_SIZE(rt5640_specific_dapm_widgets));
2177                 snd_soc_dapm_add_routes(dapm,
2178                         rt5640_specific_dapm_routes,
2179                         ARRAY_SIZE(rt5640_specific_dapm_routes));
2180                 break;
2181         case RT5640_ID_5639:
2182                 snd_soc_dapm_new_controls(dapm,
2183                         rt5639_specific_dapm_widgets,
2184                         ARRAY_SIZE(rt5639_specific_dapm_widgets));
2185                 snd_soc_dapm_add_routes(dapm,
2186                         rt5639_specific_dapm_routes,
2187                         ARRAY_SIZE(rt5639_specific_dapm_routes));
2188                 break;
2189         default:
2190                 dev_err(codec->dev,
2191                         "The driver is for RT5639 RT5640 or RT5642 only\n");
2192                 return -ENODEV;
2193         }
2194
2195         if (rt5640->pdata.dmic_en)
2196                 rt5640_dmic_enable(codec, rt5640->pdata.dmic1_data_pin,
2197                                           rt5640->pdata.dmic2_data_pin);
2198
2199         rt5640->hp_mute = 1;
2200         rt5640->hp_insert = false;
2201         /* adc polling work */
2202         if (rt5640->chan) {
2203                 rt5640_jack_init(rt5640);
2204                 INIT_DELAYED_WORK(&rt5640->adc_poll_work, rt5640_hp_adc_poll);
2205                 schedule_delayed_work(&rt5640->adc_poll_work,
2206                                       1000);
2207         }
2208
2209         return 0;
2210 }
2211
2212 static int rt5640_remove(struct snd_soc_codec *codec)
2213 {
2214         rt5640_reset(codec);
2215
2216         return 0;
2217 }
2218
2219 #ifdef CONFIG_PM
2220 static int rt5640_suspend(struct snd_soc_codec *codec)
2221 {
2222         struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
2223
2224         snd_soc_codec_force_bias_level(codec, SND_SOC_BIAS_OFF);
2225         rt5640_reset(codec);
2226         regcache_cache_only(rt5640->regmap, true);
2227         regcache_mark_dirty(rt5640->regmap);
2228         if (gpio_is_valid(rt5640->pdata.ldo1_en))
2229                 gpio_set_value_cansleep(rt5640->pdata.ldo1_en, 0);
2230
2231         return 0;
2232 }
2233
2234 static int rt5640_resume(struct snd_soc_codec *codec)
2235 {
2236         struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
2237
2238         if (gpio_is_valid(rt5640->pdata.ldo1_en)) {
2239                 gpio_set_value_cansleep(rt5640->pdata.ldo1_en, 1);
2240                 msleep(400);
2241         }
2242
2243         regcache_cache_only(rt5640->regmap, false);
2244         regcache_sync(rt5640->regmap);
2245
2246         return 0;
2247 }
2248 #else
2249 #define rt5640_suspend NULL
2250 #define rt5640_resume NULL
2251 #endif
2252
2253 #define RT5640_STEREO_RATES SNDRV_PCM_RATE_8000_96000
2254 #define RT5640_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
2255                         SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8)
2256
2257 static const struct snd_soc_dai_ops rt5640_aif_dai_ops = {
2258         .hw_params = rt5640_hw_params,
2259         .set_fmt = rt5640_set_dai_fmt,
2260         .set_sysclk = rt5640_set_dai_sysclk,
2261         .set_pll = rt5640_set_dai_pll,
2262 };
2263
2264 static struct snd_soc_dai_driver rt5640_dai[] = {
2265         {
2266                 .name = "rt5640-aif1",
2267                 .id = RT5640_AIF1,
2268                 .playback = {
2269                         .stream_name = "AIF1 Playback",
2270                         .channels_min = 1,
2271                         .channels_max = 2,
2272                         .rates = RT5640_STEREO_RATES,
2273                         .formats = RT5640_FORMATS,
2274                 },
2275                 .capture = {
2276                         .stream_name = "AIF1 Capture",
2277                         .channels_min = 1,
2278                         .channels_max = 2,
2279                         .rates = RT5640_STEREO_RATES,
2280                         .formats = RT5640_FORMATS,
2281                 },
2282                 .ops = &rt5640_aif_dai_ops,
2283         },
2284         {
2285                 .name = "rt5640-aif2",
2286                 .id = RT5640_AIF2,
2287                 .playback = {
2288                         .stream_name = "AIF2 Playback",
2289                         .channels_min = 1,
2290                         .channels_max = 2,
2291                         .rates = RT5640_STEREO_RATES,
2292                         .formats = RT5640_FORMATS,
2293                 },
2294                 .capture = {
2295                         .stream_name = "AIF2 Capture",
2296                         .channels_min = 1,
2297                         .channels_max = 2,
2298                         .rates = RT5640_STEREO_RATES,
2299                         .formats = RT5640_FORMATS,
2300                 },
2301                 .ops = &rt5640_aif_dai_ops,
2302         },
2303 };
2304
2305 static struct snd_soc_codec_driver soc_codec_dev_rt5640 = {
2306         .probe = rt5640_probe,
2307         .remove = rt5640_remove,
2308         .suspend = rt5640_suspend,
2309         .resume = rt5640_resume,
2310         .set_bias_level = rt5640_set_bias_level,
2311         .idle_bias_off = true,
2312         .controls = rt5640_snd_controls,
2313         .num_controls = ARRAY_SIZE(rt5640_snd_controls),
2314         .dapm_widgets = rt5640_dapm_widgets,
2315         .num_dapm_widgets = ARRAY_SIZE(rt5640_dapm_widgets),
2316         .dapm_routes = rt5640_dapm_routes,
2317         .num_dapm_routes = ARRAY_SIZE(rt5640_dapm_routes),
2318 };
2319
2320 static const struct regmap_config rt5640_regmap = {
2321         .reg_bits = 8,
2322         .val_bits = 16,
2323         .use_single_rw = true,
2324
2325         .max_register = RT5640_VENDOR_ID2 + 1 + (ARRAY_SIZE(rt5640_ranges) *
2326                                                RT5640_PR_SPACING),
2327         .volatile_reg = rt5640_volatile_register,
2328         .readable_reg = rt5640_readable_register,
2329
2330         .cache_type = REGCACHE_RBTREE,
2331         .reg_defaults = rt5640_reg,
2332         .num_reg_defaults = ARRAY_SIZE(rt5640_reg),
2333         .ranges = rt5640_ranges,
2334         .num_ranges = ARRAY_SIZE(rt5640_ranges),
2335 };
2336
2337 static const struct i2c_device_id rt5640_i2c_id[] = {
2338         { "rt5640", 0 },
2339         { "rt5639", 0 },
2340         { "rt5642", 0 },
2341         { }
2342 };
2343 MODULE_DEVICE_TABLE(i2c, rt5640_i2c_id);
2344
2345 #if defined(CONFIG_OF)
2346 static const struct of_device_id rt5640_of_match[] = {
2347         { .compatible = "realtek,rt5639", },
2348         { .compatible = "realtek,rt5640", },
2349         {},
2350 };
2351 MODULE_DEVICE_TABLE(of, rt5640_of_match);
2352 #endif
2353
2354 #ifdef CONFIG_ACPI
2355 static const struct acpi_device_id rt5640_acpi_match[] = {
2356         { "INT33CA", 0 },
2357         { "10EC5640", 0 },
2358         { "10EC5642", 0 },
2359         { },
2360 };
2361
2362 MODULE_DEVICE_TABLE(acpi, rt5640_acpi_match);
2363 #endif
2364
2365 static int rt5640_parse_dt(struct rt5640_priv *rt5640, struct device *dev)
2366 {
2367         struct device_node *np = dev->of_node;
2368         struct iio_channel *chan;
2369         u32 adc_value;
2370         enum of_gpio_flags flags;
2371         int gpio, ret;
2372
2373         chan = iio_channel_get(dev, NULL);
2374         if (IS_ERR(chan)) {
2375                 dev_warn(dev, "rt5640 have no io-channels defined\n");
2376                 chan = NULL;
2377         } else{
2378                 if (!of_property_read_u32(np, "hp-det-adc-value", &adc_value)) {
2379                         rt5640->hp_det_adc_value = adc_value;
2380                 } else{
2381                         chan = NULL;
2382                         dev_err(dev, "rt5640 have no hp_det_adc_value defined\n");
2383                 }
2384         }
2385         rt5640->chan = chan;
2386
2387         gpio = of_get_named_gpio_flags(np, "hp-con-gpio", 0, &flags);
2388         if (gpio < 0) {
2389                 dev_err(dev, "Can not read property hp-con-gpio\n");
2390         } else {
2391                 rt5640->hp_con_gpio_active_high =
2392                         (flags & OF_GPIO_ACTIVE_LOW) ? false : true;
2393                 ret = devm_gpio_request(dev, gpio, "hp-con-gpio");
2394                 if (ret < 0)
2395                         dev_err(dev, "hp-con-gpio request ERROR\n");
2396                 else
2397                         gpio_direction_output(gpio, rt5640->hp_con_gpio_active_high ? 0 : 1);
2398         }
2399         rt5640->hp_con_gpio = gpio;
2400
2401         rt5640->pdata.in1_diff = of_property_read_bool(np,
2402                                         "realtek,in1-differential");
2403         rt5640->pdata.in2_diff = of_property_read_bool(np,
2404                                         "realtek,in2-differential");
2405
2406         rt5640->pdata.ldo1_en = of_get_named_gpio(np,
2407                                         "realtek,ldo1-en-gpios", 0);
2408         /*
2409          * LDO1_EN is optional (it may be statically tied on the board).
2410          * -ENOENT means that the property doesn't exist, i.e. there is no
2411          * GPIO, so is not an error. Any other error code means the property
2412          * exists, but could not be parsed.
2413          */
2414         if (!gpio_is_valid(rt5640->pdata.ldo1_en) &&
2415                         (rt5640->pdata.ldo1_en != -ENOENT))
2416                 return rt5640->pdata.ldo1_en;
2417
2418         return 0;
2419 }
2420
2421 static int rt5640_i2c_probe(struct i2c_client *i2c,
2422                     const struct i2c_device_id *id)
2423 {
2424         struct rt5640_platform_data *pdata = dev_get_platdata(&i2c->dev);
2425         struct rt5640_priv *rt5640;
2426         int ret;
2427         unsigned int val;
2428
2429         rt5640 = devm_kzalloc(&i2c->dev,
2430                                 sizeof(struct rt5640_priv),
2431                                 GFP_KERNEL);
2432         if (NULL == rt5640)
2433                 return -ENOMEM;
2434         i2c_set_clientdata(i2c, rt5640);
2435
2436         if (pdata) {
2437                 rt5640->pdata = *pdata;
2438                 /*
2439                  * Translate zero'd out (default) pdata value to an invalid
2440                  * GPIO ID. This makes the pdata and DT paths consistent in
2441                  * terms of the value left in this field when no GPIO is
2442                  * specified, but means we can't actually use GPIO 0.
2443                  */
2444                 if (!rt5640->pdata.ldo1_en)
2445                         rt5640->pdata.ldo1_en = -EINVAL;
2446         } else if (i2c->dev.of_node) {
2447                 ret = rt5640_parse_dt(rt5640, &(i2c->dev));
2448                 if (ret)
2449                         return ret;
2450         } else
2451                 rt5640->pdata.ldo1_en = -EINVAL;
2452
2453         rt5640->regmap = devm_regmap_init_i2c(i2c, &rt5640_regmap);
2454         if (IS_ERR(rt5640->regmap)) {
2455                 ret = PTR_ERR(rt5640->regmap);
2456                 dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
2457                         ret);
2458                 return ret;
2459         }
2460
2461         if (gpio_is_valid(rt5640->pdata.ldo1_en)) {
2462                 ret = devm_gpio_request_one(&i2c->dev, rt5640->pdata.ldo1_en,
2463                                             GPIOF_OUT_INIT_HIGH,
2464                                             "RT5640 LDO1_EN");
2465                 if (ret < 0) {
2466                         dev_err(&i2c->dev, "Failed to request LDO1_EN %d: %d\n",
2467                                 rt5640->pdata.ldo1_en, ret);
2468                         return ret;
2469                 }
2470                 msleep(400);
2471         }
2472
2473         ret = regmap_read(rt5640->regmap, RT5640_VENDOR_ID2, &val);
2474         if (ret)
2475                 return -EPROBE_DEFER;
2476
2477         if (val != RT5640_DEVICE_ID) {
2478                 dev_err(&i2c->dev,
2479                         "Device with ID register %#x is not rt5640/39\n", val);
2480                 return -ENODEV;
2481         }
2482
2483         regmap_write(rt5640->regmap, RT5640_RESET, 0);
2484
2485         ret = regmap_register_patch(rt5640->regmap, init_list,
2486                                     ARRAY_SIZE(init_list));
2487         if (ret != 0)
2488                 dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret);
2489
2490         if (rt5640->pdata.in1_diff)
2491                 regmap_update_bits(rt5640->regmap, RT5640_IN1_IN2,
2492                                         RT5640_IN_DF1, RT5640_IN_DF1);
2493
2494         if (rt5640->pdata.in2_diff)
2495                 regmap_update_bits(rt5640->regmap, RT5640_IN3_IN4,
2496                                         RT5640_IN_DF2, RT5640_IN_DF2);
2497
2498         if (rt5640->pdata.in3_diff)
2499                 regmap_update_bits(rt5640->regmap, RT5640_IN1_IN2,
2500                                         RT5640_IN_DF2, RT5640_IN_DF2);
2501
2502         return snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5640,
2503                                       rt5640_dai, ARRAY_SIZE(rt5640_dai));
2504 }
2505
2506 static int rt5640_i2c_remove(struct i2c_client *i2c)
2507 {
2508         snd_soc_unregister_codec(&i2c->dev);
2509
2510         return 0;
2511 }
2512
2513 static void rt5640_i2c_shutdown(struct i2c_client *i2c)
2514 {
2515         struct rt5640_priv *rt5640;
2516
2517         rt5640 = (struct rt5640_priv *)i2c_get_clientdata(i2c);
2518         rt5640_hp_gpio_ctrl(rt5640, false);
2519 }
2520
2521 static struct i2c_driver rt5640_i2c_driver = {
2522         .driver = {
2523                 .name = "rt5640",
2524                 .acpi_match_table = ACPI_PTR(rt5640_acpi_match),
2525                 .of_match_table = of_match_ptr(rt5640_of_match),
2526         },
2527         .probe = rt5640_i2c_probe,
2528         .remove   = rt5640_i2c_remove,
2529         .shutdown = rt5640_i2c_shutdown,
2530         .id_table = rt5640_i2c_id,
2531 };
2532 module_i2c_driver(rt5640_i2c_driver);
2533
2534 MODULE_DESCRIPTION("ASoC RT5640/RT5639 driver");
2535 MODULE_AUTHOR("Johnny Hsu <johnnyhsu@realtek.com>");
2536 MODULE_LICENSE("GPL v2");