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