xref: /openbmc/linux/sound/soc/codecs/rt5670.c (revision 044b724a)
15e8351deSBard Liao /*
25e8351deSBard Liao  * rt5670.c  --  RT5670 ALSA SoC audio codec driver
35e8351deSBard Liao  *
45e8351deSBard Liao  * Copyright 2014 Realtek Semiconductor Corp.
55e8351deSBard Liao  * Author: Bard Liao <bardliao@realtek.com>
65e8351deSBard Liao  *
75e8351deSBard Liao  * This program is free software; you can redistribute it and/or modify
85e8351deSBard Liao  * it under the terms of the GNU General Public License version 2 as
95e8351deSBard Liao  * published by the Free Software Foundation.
105e8351deSBard Liao  */
115e8351deSBard Liao 
125e8351deSBard Liao #include <linux/module.h>
135e8351deSBard Liao #include <linux/moduleparam.h>
145e8351deSBard Liao #include <linux/init.h>
155e8351deSBard Liao #include <linux/delay.h>
165e8351deSBard Liao #include <linux/pm.h>
175e8351deSBard Liao #include <linux/i2c.h>
185e8351deSBard Liao #include <linux/platform_device.h>
190605815eSMengdong Lin #include <linux/acpi.h>
205e8351deSBard Liao #include <linux/spi/spi.h>
215e8351deSBard Liao #include <sound/core.h>
225e8351deSBard Liao #include <sound/pcm.h>
235e8351deSBard Liao #include <sound/pcm_params.h>
245e8351deSBard Liao #include <sound/jack.h>
255e8351deSBard Liao #include <sound/soc.h>
265e8351deSBard Liao #include <sound/soc-dapm.h>
275e8351deSBard Liao #include <sound/initval.h>
285e8351deSBard Liao #include <sound/tlv.h>
295e8351deSBard Liao #include <sound/rt5670.h>
305e8351deSBard Liao 
315e8351deSBard Liao #include "rl6231.h"
325e8351deSBard Liao #include "rt5670.h"
335e8351deSBard Liao #include "rt5670-dsp.h"
345e8351deSBard Liao 
355e8351deSBard Liao #define RT5670_DEVICE_ID 0x6271
365e8351deSBard Liao 
375e8351deSBard Liao #define RT5670_PR_RANGE_BASE (0xff + 1)
385e8351deSBard Liao #define RT5670_PR_SPACING 0x100
395e8351deSBard Liao 
405e8351deSBard Liao #define RT5670_PR_BASE (RT5670_PR_RANGE_BASE + (0 * RT5670_PR_SPACING))
415e8351deSBard Liao 
425e8351deSBard Liao static const struct regmap_range_cfg rt5670_ranges[] = {
435e8351deSBard Liao 	{ .name = "PR", .range_min = RT5670_PR_BASE,
445e8351deSBard Liao 	  .range_max = RT5670_PR_BASE + 0xf8,
455e8351deSBard Liao 	  .selector_reg = RT5670_PRIV_INDEX,
465e8351deSBard Liao 	  .selector_mask = 0xff,
475e8351deSBard Liao 	  .selector_shift = 0x0,
485e8351deSBard Liao 	  .window_start = RT5670_PRIV_DATA,
495e8351deSBard Liao 	  .window_len = 0x1, },
505e8351deSBard Liao };
515e8351deSBard Liao 
525e8351deSBard Liao static struct reg_default init_list[] = {
535e8351deSBard Liao 	{ RT5670_PR_BASE + 0x14, 0x9a8a },
545e8351deSBard Liao 	{ RT5670_PR_BASE + 0x38, 0x3ba1 },
555e8351deSBard Liao 	{ RT5670_PR_BASE + 0x3d, 0x3640 },
565e8351deSBard Liao };
575e8351deSBard Liao #define RT5670_INIT_REG_LEN ARRAY_SIZE(init_list)
585e8351deSBard Liao 
595e8351deSBard Liao static const struct reg_default rt5670_reg[] = {
605e8351deSBard Liao 	{ 0x00, 0x0000 },
615e8351deSBard Liao 	{ 0x02, 0x8888 },
625e8351deSBard Liao 	{ 0x03, 0x8888 },
635e8351deSBard Liao 	{ 0x0a, 0x0001 },
645e8351deSBard Liao 	{ 0x0b, 0x0827 },
655e8351deSBard Liao 	{ 0x0c, 0x0000 },
665e8351deSBard Liao 	{ 0x0d, 0x0008 },
675e8351deSBard Liao 	{ 0x0e, 0x0000 },
685e8351deSBard Liao 	{ 0x0f, 0x0808 },
695e8351deSBard Liao 	{ 0x19, 0xafaf },
705e8351deSBard Liao 	{ 0x1a, 0xafaf },
715e8351deSBard Liao 	{ 0x1b, 0x0011 },
725e8351deSBard Liao 	{ 0x1c, 0x2f2f },
735e8351deSBard Liao 	{ 0x1d, 0x2f2f },
745e8351deSBard Liao 	{ 0x1e, 0x0000 },
755e8351deSBard Liao 	{ 0x1f, 0x2f2f },
765e8351deSBard Liao 	{ 0x20, 0x0000 },
775e8351deSBard Liao 	{ 0x26, 0x7860 },
785e8351deSBard Liao 	{ 0x27, 0x7860 },
795e8351deSBard Liao 	{ 0x28, 0x7871 },
805e8351deSBard Liao 	{ 0x29, 0x8080 },
815e8351deSBard Liao 	{ 0x2a, 0x5656 },
825e8351deSBard Liao 	{ 0x2b, 0x5454 },
835e8351deSBard Liao 	{ 0x2c, 0xaaa0 },
845e8351deSBard Liao 	{ 0x2d, 0x0000 },
855e8351deSBard Liao 	{ 0x2e, 0x2f2f },
865e8351deSBard Liao 	{ 0x2f, 0x1002 },
875e8351deSBard Liao 	{ 0x30, 0x0000 },
885e8351deSBard Liao 	{ 0x31, 0x5f00 },
895e8351deSBard Liao 	{ 0x32, 0x0000 },
905e8351deSBard Liao 	{ 0x33, 0x0000 },
915e8351deSBard Liao 	{ 0x34, 0x0000 },
925e8351deSBard Liao 	{ 0x35, 0x0000 },
935e8351deSBard Liao 	{ 0x36, 0x0000 },
945e8351deSBard Liao 	{ 0x37, 0x0000 },
955e8351deSBard Liao 	{ 0x38, 0x0000 },
965e8351deSBard Liao 	{ 0x3b, 0x0000 },
975e8351deSBard Liao 	{ 0x3c, 0x007f },
985e8351deSBard Liao 	{ 0x3d, 0x0000 },
995e8351deSBard Liao 	{ 0x3e, 0x007f },
1005e8351deSBard Liao 	{ 0x45, 0xe00f },
1015e8351deSBard Liao 	{ 0x4c, 0x5380 },
1025e8351deSBard Liao 	{ 0x4f, 0x0073 },
1035e8351deSBard Liao 	{ 0x52, 0x00d3 },
1045e8351deSBard Liao 	{ 0x53, 0xf0f0 },
1055e8351deSBard Liao 	{ 0x61, 0x0000 },
1065e8351deSBard Liao 	{ 0x62, 0x0001 },
1075e8351deSBard Liao 	{ 0x63, 0x00c3 },
1085e8351deSBard Liao 	{ 0x64, 0x0000 },
1095e8351deSBard Liao 	{ 0x65, 0x0000 },
1105e8351deSBard Liao 	{ 0x66, 0x0000 },
1115e8351deSBard Liao 	{ 0x6f, 0x8000 },
1125e8351deSBard Liao 	{ 0x70, 0x8000 },
1135e8351deSBard Liao 	{ 0x71, 0x8000 },
1145e8351deSBard Liao 	{ 0x72, 0x8000 },
1155e8351deSBard Liao 	{ 0x73, 0x1110 },
1165e8351deSBard Liao 	{ 0x74, 0x0e00 },
1175e8351deSBard Liao 	{ 0x75, 0x1505 },
1185e8351deSBard Liao 	{ 0x76, 0x0015 },
1195e8351deSBard Liao 	{ 0x77, 0x0c00 },
1205e8351deSBard Liao 	{ 0x78, 0x4000 },
1215e8351deSBard Liao 	{ 0x79, 0x0123 },
1225e8351deSBard Liao 	{ 0x7f, 0x1100 },
1235e8351deSBard Liao 	{ 0x80, 0x0000 },
1245e8351deSBard Liao 	{ 0x81, 0x0000 },
1255e8351deSBard Liao 	{ 0x82, 0x0000 },
1265e8351deSBard Liao 	{ 0x83, 0x0000 },
1275e8351deSBard Liao 	{ 0x84, 0x0000 },
1285e8351deSBard Liao 	{ 0x85, 0x0000 },
1295e8351deSBard Liao 	{ 0x86, 0x0008 },
1305e8351deSBard Liao 	{ 0x87, 0x0000 },
1315e8351deSBard Liao 	{ 0x88, 0x0000 },
1325e8351deSBard Liao 	{ 0x89, 0x0000 },
1335e8351deSBard Liao 	{ 0x8a, 0x0000 },
1345e8351deSBard Liao 	{ 0x8b, 0x0000 },
1355e8351deSBard Liao 	{ 0x8c, 0x0007 },
1365e8351deSBard Liao 	{ 0x8d, 0x0000 },
1375e8351deSBard Liao 	{ 0x8e, 0x0004 },
1385e8351deSBard Liao 	{ 0x8f, 0x1100 },
1395e8351deSBard Liao 	{ 0x90, 0x0646 },
1405e8351deSBard Liao 	{ 0x91, 0x0c06 },
1415e8351deSBard Liao 	{ 0x93, 0x0000 },
1425e8351deSBard Liao 	{ 0x94, 0x0000 },
1435e8351deSBard Liao 	{ 0x95, 0x0000 },
1445e8351deSBard Liao 	{ 0x97, 0x0000 },
1455e8351deSBard Liao 	{ 0x98, 0x0000 },
1465e8351deSBard Liao 	{ 0x99, 0x0000 },
1475e8351deSBard Liao 	{ 0x9a, 0x2184 },
1485e8351deSBard Liao 	{ 0x9b, 0x010a },
1495e8351deSBard Liao 	{ 0x9c, 0x0aea },
1505e8351deSBard Liao 	{ 0x9d, 0x000c },
1515e8351deSBard Liao 	{ 0x9e, 0x0400 },
1525e8351deSBard Liao 	{ 0xae, 0x7000 },
1535e8351deSBard Liao 	{ 0xaf, 0x0000 },
1545e8351deSBard Liao 	{ 0xb0, 0x6000 },
1555e8351deSBard Liao 	{ 0xb1, 0x0000 },
1565e8351deSBard Liao 	{ 0xb2, 0x0000 },
1575e8351deSBard Liao 	{ 0xb3, 0x001f },
1585e8351deSBard Liao 	{ 0xb4, 0x2206 },
1595e8351deSBard Liao 	{ 0xb5, 0x1f00 },
1605e8351deSBard Liao 	{ 0xb6, 0x0000 },
1615e8351deSBard Liao 	{ 0xb7, 0x0000 },
1625e8351deSBard Liao 	{ 0xbb, 0x0000 },
1635e8351deSBard Liao 	{ 0xbc, 0x0000 },
1645e8351deSBard Liao 	{ 0xbd, 0x0000 },
1655e8351deSBard Liao 	{ 0xbe, 0x0000 },
1665e8351deSBard Liao 	{ 0xbf, 0x0000 },
1675e8351deSBard Liao 	{ 0xc0, 0x0000 },
1685e8351deSBard Liao 	{ 0xc1, 0x0000 },
1695e8351deSBard Liao 	{ 0xc2, 0x0000 },
1705e8351deSBard Liao 	{ 0xcd, 0x0000 },
1715e8351deSBard Liao 	{ 0xce, 0x0000 },
1725e8351deSBard Liao 	{ 0xcf, 0x1813 },
1735e8351deSBard Liao 	{ 0xd0, 0x0690 },
1745e8351deSBard Liao 	{ 0xd1, 0x1c17 },
1755e8351deSBard Liao 	{ 0xd3, 0xb320 },
1765e8351deSBard Liao 	{ 0xd4, 0x0000 },
1775e8351deSBard Liao 	{ 0xd6, 0x0400 },
1785e8351deSBard Liao 	{ 0xd9, 0x0809 },
1795e8351deSBard Liao 	{ 0xda, 0x0000 },
1805e8351deSBard Liao 	{ 0xdb, 0x0001 },
1815e8351deSBard Liao 	{ 0xdc, 0x0049 },
1825e8351deSBard Liao 	{ 0xdd, 0x0009 },
1835e8351deSBard Liao 	{ 0xe6, 0x8000 },
1845e8351deSBard Liao 	{ 0xe7, 0x0000 },
1855e8351deSBard Liao 	{ 0xec, 0xb300 },
1865e8351deSBard Liao 	{ 0xed, 0x0000 },
1875e8351deSBard Liao 	{ 0xee, 0xb300 },
1885e8351deSBard Liao 	{ 0xef, 0x0000 },
1895e8351deSBard Liao 	{ 0xf8, 0x0000 },
1905e8351deSBard Liao 	{ 0xf9, 0x0000 },
1915e8351deSBard Liao 	{ 0xfa, 0x8010 },
1925e8351deSBard Liao 	{ 0xfb, 0x0033 },
1935e8351deSBard Liao 	{ 0xfc, 0x0080 },
1945e8351deSBard Liao };
1955e8351deSBard Liao 
1965e8351deSBard Liao static bool rt5670_volatile_register(struct device *dev, unsigned int reg)
1975e8351deSBard Liao {
1985e8351deSBard Liao 	int i;
1995e8351deSBard Liao 
2005e8351deSBard Liao 	for (i = 0; i < ARRAY_SIZE(rt5670_ranges); i++) {
2015e8351deSBard Liao 		if ((reg >= rt5670_ranges[i].window_start &&
2025e8351deSBard Liao 		     reg <= rt5670_ranges[i].window_start +
2035e8351deSBard Liao 		     rt5670_ranges[i].window_len) ||
2045e8351deSBard Liao 		    (reg >= rt5670_ranges[i].range_min &&
2055e8351deSBard Liao 		     reg <= rt5670_ranges[i].range_max)) {
2065e8351deSBard Liao 			return true;
2075e8351deSBard Liao 		}
2085e8351deSBard Liao 	}
2095e8351deSBard Liao 
2105e8351deSBard Liao 	switch (reg) {
2115e8351deSBard Liao 	case RT5670_RESET:
2125e8351deSBard Liao 	case RT5670_PDM_DATA_CTRL1:
2135e8351deSBard Liao 	case RT5670_PDM1_DATA_CTRL4:
2145e8351deSBard Liao 	case RT5670_PDM2_DATA_CTRL4:
2155e8351deSBard Liao 	case RT5670_PRIV_DATA:
2165e8351deSBard Liao 	case RT5670_ASRC_5:
2175e8351deSBard Liao 	case RT5670_CJ_CTRL1:
2185e8351deSBard Liao 	case RT5670_CJ_CTRL2:
2195e8351deSBard Liao 	case RT5670_CJ_CTRL3:
2205e8351deSBard Liao 	case RT5670_A_JD_CTRL1:
2215e8351deSBard Liao 	case RT5670_A_JD_CTRL2:
2225e8351deSBard Liao 	case RT5670_VAD_CTRL5:
2235e8351deSBard Liao 	case RT5670_ADC_EQ_CTRL1:
2245e8351deSBard Liao 	case RT5670_EQ_CTRL1:
2255e8351deSBard Liao 	case RT5670_ALC_CTRL_1:
2265e8351deSBard Liao 	case RT5670_IRQ_CTRL1:
2275e8351deSBard Liao 	case RT5670_IRQ_CTRL2:
2285e8351deSBard Liao 	case RT5670_INT_IRQ_ST:
2295e8351deSBard Liao 	case RT5670_IL_CMD:
2305e8351deSBard Liao 	case RT5670_DSP_CTRL1:
2315e8351deSBard Liao 	case RT5670_DSP_CTRL2:
2325e8351deSBard Liao 	case RT5670_DSP_CTRL3:
2335e8351deSBard Liao 	case RT5670_DSP_CTRL4:
2345e8351deSBard Liao 	case RT5670_DSP_CTRL5:
2355e8351deSBard Liao 	case RT5670_VENDOR_ID:
2365e8351deSBard Liao 	case RT5670_VENDOR_ID1:
2375e8351deSBard Liao 	case RT5670_VENDOR_ID2:
2385e8351deSBard Liao 		return true;
2395e8351deSBard Liao 	default:
2405e8351deSBard Liao 		return false;
2415e8351deSBard Liao 	}
2425e8351deSBard Liao }
2435e8351deSBard Liao 
2445e8351deSBard Liao static bool rt5670_readable_register(struct device *dev, unsigned int reg)
2455e8351deSBard Liao {
2465e8351deSBard Liao 	int i;
2475e8351deSBard Liao 
2485e8351deSBard Liao 	for (i = 0; i < ARRAY_SIZE(rt5670_ranges); i++) {
2495e8351deSBard Liao 		if ((reg >= rt5670_ranges[i].window_start &&
2505e8351deSBard Liao 		     reg <= rt5670_ranges[i].window_start +
2515e8351deSBard Liao 		     rt5670_ranges[i].window_len) ||
2525e8351deSBard Liao 		    (reg >= rt5670_ranges[i].range_min &&
2535e8351deSBard Liao 		     reg <= rt5670_ranges[i].range_max)) {
2545e8351deSBard Liao 			return true;
2555e8351deSBard Liao 		}
2565e8351deSBard Liao 	}
2575e8351deSBard Liao 
2585e8351deSBard Liao 	switch (reg) {
2595e8351deSBard Liao 	case RT5670_RESET:
2605e8351deSBard Liao 	case RT5670_HP_VOL:
2615e8351deSBard Liao 	case RT5670_LOUT1:
2625e8351deSBard Liao 	case RT5670_CJ_CTRL1:
2635e8351deSBard Liao 	case RT5670_CJ_CTRL2:
2645e8351deSBard Liao 	case RT5670_CJ_CTRL3:
2655e8351deSBard Liao 	case RT5670_IN2:
2665e8351deSBard Liao 	case RT5670_INL1_INR1_VOL:
2675e8351deSBard Liao 	case RT5670_DAC1_DIG_VOL:
2685e8351deSBard Liao 	case RT5670_DAC2_DIG_VOL:
2695e8351deSBard Liao 	case RT5670_DAC_CTRL:
2705e8351deSBard Liao 	case RT5670_STO1_ADC_DIG_VOL:
2715e8351deSBard Liao 	case RT5670_MONO_ADC_DIG_VOL:
2725e8351deSBard Liao 	case RT5670_STO2_ADC_DIG_VOL:
2735e8351deSBard Liao 	case RT5670_ADC_BST_VOL1:
2745e8351deSBard Liao 	case RT5670_ADC_BST_VOL2:
2755e8351deSBard Liao 	case RT5670_STO2_ADC_MIXER:
2765e8351deSBard Liao 	case RT5670_STO1_ADC_MIXER:
2775e8351deSBard Liao 	case RT5670_MONO_ADC_MIXER:
2785e8351deSBard Liao 	case RT5670_AD_DA_MIXER:
2795e8351deSBard Liao 	case RT5670_STO_DAC_MIXER:
2805e8351deSBard Liao 	case RT5670_DD_MIXER:
2815e8351deSBard Liao 	case RT5670_DIG_MIXER:
2825e8351deSBard Liao 	case RT5670_DSP_PATH1:
2835e8351deSBard Liao 	case RT5670_DSP_PATH2:
2845e8351deSBard Liao 	case RT5670_DIG_INF1_DATA:
2855e8351deSBard Liao 	case RT5670_DIG_INF2_DATA:
2865e8351deSBard Liao 	case RT5670_PDM_OUT_CTRL:
2875e8351deSBard Liao 	case RT5670_PDM_DATA_CTRL1:
2885e8351deSBard Liao 	case RT5670_PDM1_DATA_CTRL2:
2895e8351deSBard Liao 	case RT5670_PDM1_DATA_CTRL3:
2905e8351deSBard Liao 	case RT5670_PDM1_DATA_CTRL4:
2915e8351deSBard Liao 	case RT5670_PDM2_DATA_CTRL2:
2925e8351deSBard Liao 	case RT5670_PDM2_DATA_CTRL3:
2935e8351deSBard Liao 	case RT5670_PDM2_DATA_CTRL4:
2945e8351deSBard Liao 	case RT5670_REC_L1_MIXER:
2955e8351deSBard Liao 	case RT5670_REC_L2_MIXER:
2965e8351deSBard Liao 	case RT5670_REC_R1_MIXER:
2975e8351deSBard Liao 	case RT5670_REC_R2_MIXER:
2985e8351deSBard Liao 	case RT5670_HPO_MIXER:
2995e8351deSBard Liao 	case RT5670_MONO_MIXER:
3005e8351deSBard Liao 	case RT5670_OUT_L1_MIXER:
3015e8351deSBard Liao 	case RT5670_OUT_R1_MIXER:
3025e8351deSBard Liao 	case RT5670_LOUT_MIXER:
3035e8351deSBard Liao 	case RT5670_PWR_DIG1:
3045e8351deSBard Liao 	case RT5670_PWR_DIG2:
3055e8351deSBard Liao 	case RT5670_PWR_ANLG1:
3065e8351deSBard Liao 	case RT5670_PWR_ANLG2:
3075e8351deSBard Liao 	case RT5670_PWR_MIXER:
3085e8351deSBard Liao 	case RT5670_PWR_VOL:
3095e8351deSBard Liao 	case RT5670_PRIV_INDEX:
3105e8351deSBard Liao 	case RT5670_PRIV_DATA:
3115e8351deSBard Liao 	case RT5670_I2S4_SDP:
3125e8351deSBard Liao 	case RT5670_I2S1_SDP:
3135e8351deSBard Liao 	case RT5670_I2S2_SDP:
3145e8351deSBard Liao 	case RT5670_I2S3_SDP:
3155e8351deSBard Liao 	case RT5670_ADDA_CLK1:
3165e8351deSBard Liao 	case RT5670_ADDA_CLK2:
3175e8351deSBard Liao 	case RT5670_DMIC_CTRL1:
3185e8351deSBard Liao 	case RT5670_DMIC_CTRL2:
3195e8351deSBard Liao 	case RT5670_TDM_CTRL_1:
3205e8351deSBard Liao 	case RT5670_TDM_CTRL_2:
3215e8351deSBard Liao 	case RT5670_TDM_CTRL_3:
3225e8351deSBard Liao 	case RT5670_DSP_CLK:
3235e8351deSBard Liao 	case RT5670_GLB_CLK:
3245e8351deSBard Liao 	case RT5670_PLL_CTRL1:
3255e8351deSBard Liao 	case RT5670_PLL_CTRL2:
3265e8351deSBard Liao 	case RT5670_ASRC_1:
3275e8351deSBard Liao 	case RT5670_ASRC_2:
3285e8351deSBard Liao 	case RT5670_ASRC_3:
3295e8351deSBard Liao 	case RT5670_ASRC_4:
3305e8351deSBard Liao 	case RT5670_ASRC_5:
3315e8351deSBard Liao 	case RT5670_ASRC_7:
3325e8351deSBard Liao 	case RT5670_ASRC_8:
3335e8351deSBard Liao 	case RT5670_ASRC_9:
3345e8351deSBard Liao 	case RT5670_ASRC_10:
3355e8351deSBard Liao 	case RT5670_ASRC_11:
3365e8351deSBard Liao 	case RT5670_ASRC_12:
3375e8351deSBard Liao 	case RT5670_ASRC_13:
3385e8351deSBard Liao 	case RT5670_ASRC_14:
3395e8351deSBard Liao 	case RT5670_DEPOP_M1:
3405e8351deSBard Liao 	case RT5670_DEPOP_M2:
3415e8351deSBard Liao 	case RT5670_DEPOP_M3:
3425e8351deSBard Liao 	case RT5670_CHARGE_PUMP:
3435e8351deSBard Liao 	case RT5670_MICBIAS:
3445e8351deSBard Liao 	case RT5670_A_JD_CTRL1:
3455e8351deSBard Liao 	case RT5670_A_JD_CTRL2:
3465e8351deSBard Liao 	case RT5670_VAD_CTRL1:
3475e8351deSBard Liao 	case RT5670_VAD_CTRL2:
3485e8351deSBard Liao 	case RT5670_VAD_CTRL3:
3495e8351deSBard Liao 	case RT5670_VAD_CTRL4:
3505e8351deSBard Liao 	case RT5670_VAD_CTRL5:
3515e8351deSBard Liao 	case RT5670_ADC_EQ_CTRL1:
3525e8351deSBard Liao 	case RT5670_ADC_EQ_CTRL2:
3535e8351deSBard Liao 	case RT5670_EQ_CTRL1:
3545e8351deSBard Liao 	case RT5670_EQ_CTRL2:
3555e8351deSBard Liao 	case RT5670_ALC_DRC_CTRL1:
3565e8351deSBard Liao 	case RT5670_ALC_DRC_CTRL2:
3575e8351deSBard Liao 	case RT5670_ALC_CTRL_1:
3585e8351deSBard Liao 	case RT5670_ALC_CTRL_2:
3595e8351deSBard Liao 	case RT5670_ALC_CTRL_3:
3605e8351deSBard Liao 	case RT5670_JD_CTRL:
3615e8351deSBard Liao 	case RT5670_IRQ_CTRL1:
3625e8351deSBard Liao 	case RT5670_IRQ_CTRL2:
3635e8351deSBard Liao 	case RT5670_INT_IRQ_ST:
3645e8351deSBard Liao 	case RT5670_GPIO_CTRL1:
3655e8351deSBard Liao 	case RT5670_GPIO_CTRL2:
3665e8351deSBard Liao 	case RT5670_GPIO_CTRL3:
3675e8351deSBard Liao 	case RT5670_SCRABBLE_FUN:
3685e8351deSBard Liao 	case RT5670_SCRABBLE_CTRL:
3695e8351deSBard Liao 	case RT5670_BASE_BACK:
3705e8351deSBard Liao 	case RT5670_MP3_PLUS1:
3715e8351deSBard Liao 	case RT5670_MP3_PLUS2:
3725e8351deSBard Liao 	case RT5670_ADJ_HPF1:
3735e8351deSBard Liao 	case RT5670_ADJ_HPF2:
3745e8351deSBard Liao 	case RT5670_HP_CALIB_AMP_DET:
3755e8351deSBard Liao 	case RT5670_SV_ZCD1:
3765e8351deSBard Liao 	case RT5670_SV_ZCD2:
3775e8351deSBard Liao 	case RT5670_IL_CMD:
3785e8351deSBard Liao 	case RT5670_IL_CMD2:
3795e8351deSBard Liao 	case RT5670_IL_CMD3:
3805e8351deSBard Liao 	case RT5670_DRC_HL_CTRL1:
3815e8351deSBard Liao 	case RT5670_DRC_HL_CTRL2:
3825e8351deSBard Liao 	case RT5670_ADC_MONO_HP_CTRL1:
3835e8351deSBard Liao 	case RT5670_ADC_MONO_HP_CTRL2:
3845e8351deSBard Liao 	case RT5670_ADC_STO2_HP_CTRL1:
3855e8351deSBard Liao 	case RT5670_ADC_STO2_HP_CTRL2:
3865e8351deSBard Liao 	case RT5670_JD_CTRL3:
3875e8351deSBard Liao 	case RT5670_JD_CTRL4:
3885e8351deSBard Liao 	case RT5670_DIG_MISC:
3895e8351deSBard Liao 	case RT5670_DSP_CTRL1:
3905e8351deSBard Liao 	case RT5670_DSP_CTRL2:
3915e8351deSBard Liao 	case RT5670_DSP_CTRL3:
3925e8351deSBard Liao 	case RT5670_DSP_CTRL4:
3935e8351deSBard Liao 	case RT5670_DSP_CTRL5:
3945e8351deSBard Liao 	case RT5670_GEN_CTRL2:
3955e8351deSBard Liao 	case RT5670_GEN_CTRL3:
3965e8351deSBard Liao 	case RT5670_VENDOR_ID:
3975e8351deSBard Liao 	case RT5670_VENDOR_ID1:
3985e8351deSBard Liao 	case RT5670_VENDOR_ID2:
3995e8351deSBard Liao 		return true;
4005e8351deSBard Liao 	default:
4015e8351deSBard Liao 		return false;
4025e8351deSBard Liao 	}
4035e8351deSBard Liao }
4045e8351deSBard Liao 
4055e8351deSBard Liao static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0);
4065e8351deSBard Liao static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -65625, 375, 0);
4075e8351deSBard Liao static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0);
4085e8351deSBard Liao static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -17625, 375, 0);
4095e8351deSBard Liao static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0);
4105e8351deSBard Liao 
4115e8351deSBard Liao /* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */
4125e8351deSBard Liao static unsigned int bst_tlv[] = {
4135e8351deSBard Liao 	TLV_DB_RANGE_HEAD(7),
4145e8351deSBard Liao 	0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
4155e8351deSBard Liao 	1, 1, TLV_DB_SCALE_ITEM(2000, 0, 0),
4165e8351deSBard Liao 	2, 2, TLV_DB_SCALE_ITEM(2400, 0, 0),
4175e8351deSBard Liao 	3, 5, TLV_DB_SCALE_ITEM(3000, 500, 0),
4185e8351deSBard Liao 	6, 6, TLV_DB_SCALE_ITEM(4400, 0, 0),
4195e8351deSBard Liao 	7, 7, TLV_DB_SCALE_ITEM(5000, 0, 0),
4205e8351deSBard Liao 	8, 8, TLV_DB_SCALE_ITEM(5200, 0, 0),
4215e8351deSBard Liao };
4225e8351deSBard Liao 
4235e8351deSBard Liao /* Interface data select */
4245e8351deSBard Liao static const char * const rt5670_data_select[] = {
4255e8351deSBard Liao 	"Normal", "Swap", "left copy to right", "right copy to left"
4265e8351deSBard Liao };
4275e8351deSBard Liao 
42801957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_if2_dac_enum, RT5670_DIG_INF1_DATA,
4295e8351deSBard Liao 				RT5670_IF2_DAC_SEL_SFT, rt5670_data_select);
4305e8351deSBard Liao 
43101957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_if2_adc_enum, RT5670_DIG_INF1_DATA,
4325e8351deSBard Liao 				RT5670_IF2_ADC_SEL_SFT, rt5670_data_select);
4335e8351deSBard Liao 
4345e8351deSBard Liao static const struct snd_kcontrol_new rt5670_snd_controls[] = {
4355e8351deSBard Liao 	/* Headphone Output Volume */
4365e8351deSBard Liao 	SOC_DOUBLE("HP Playback Switch", RT5670_HP_VOL,
4375e8351deSBard Liao 		RT5670_L_MUTE_SFT, RT5670_R_MUTE_SFT, 1, 1),
4385e8351deSBard Liao 	SOC_DOUBLE_TLV("HP Playback Volume", RT5670_HP_VOL,
4395e8351deSBard Liao 		RT5670_L_VOL_SFT, RT5670_R_VOL_SFT,
4405e8351deSBard Liao 		39, 0, out_vol_tlv),
4415e8351deSBard Liao 	/* OUTPUT Control */
4425e8351deSBard Liao 	SOC_DOUBLE("OUT Channel Switch", RT5670_LOUT1,
4435e8351deSBard Liao 		RT5670_VOL_L_SFT, RT5670_VOL_R_SFT, 1, 1),
4445e8351deSBard Liao 	SOC_DOUBLE_TLV("OUT Playback Volume", RT5670_LOUT1,
4455e8351deSBard Liao 		RT5670_L_VOL_SFT, RT5670_R_VOL_SFT, 39, 1, out_vol_tlv),
4465e8351deSBard Liao 	/* DAC Digital Volume */
4475e8351deSBard Liao 	SOC_DOUBLE("DAC2 Playback Switch", RT5670_DAC_CTRL,
4485e8351deSBard Liao 		RT5670_M_DAC_L2_VOL_SFT, RT5670_M_DAC_R2_VOL_SFT, 1, 1),
4495e8351deSBard Liao 	SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5670_DAC1_DIG_VOL,
4505e8351deSBard Liao 			RT5670_L_VOL_SFT, RT5670_R_VOL_SFT,
4515e8351deSBard Liao 			175, 0, dac_vol_tlv),
4525e8351deSBard Liao 	SOC_DOUBLE_TLV("Mono DAC Playback Volume", RT5670_DAC2_DIG_VOL,
4535e8351deSBard Liao 			RT5670_L_VOL_SFT, RT5670_R_VOL_SFT,
4545e8351deSBard Liao 			175, 0, dac_vol_tlv),
4555e8351deSBard Liao 	/* IN1/IN2 Control */
4565e8351deSBard Liao 	SOC_SINGLE_TLV("IN1 Boost Volume", RT5670_CJ_CTRL1,
4575e8351deSBard Liao 		RT5670_BST_SFT1, 8, 0, bst_tlv),
4585e8351deSBard Liao 	SOC_SINGLE_TLV("IN2 Boost Volume", RT5670_IN2,
4595e8351deSBard Liao 		RT5670_BST_SFT1, 8, 0, bst_tlv),
4605e8351deSBard Liao 	/* INL/INR Volume Control */
4615e8351deSBard Liao 	SOC_DOUBLE_TLV("IN Capture Volume", RT5670_INL1_INR1_VOL,
4625e8351deSBard Liao 			RT5670_INL_VOL_SFT, RT5670_INR_VOL_SFT,
4635e8351deSBard Liao 			31, 1, in_vol_tlv),
4645e8351deSBard Liao 	/* ADC Digital Volume Control */
4655e8351deSBard Liao 	SOC_DOUBLE("ADC Capture Switch", RT5670_STO1_ADC_DIG_VOL,
4665e8351deSBard Liao 		RT5670_L_MUTE_SFT, RT5670_R_MUTE_SFT, 1, 1),
4675e8351deSBard Liao 	SOC_DOUBLE_TLV("ADC Capture Volume", RT5670_STO1_ADC_DIG_VOL,
4685e8351deSBard Liao 			RT5670_L_VOL_SFT, RT5670_R_VOL_SFT,
4695e8351deSBard Liao 			127, 0, adc_vol_tlv),
4705e8351deSBard Liao 
4715e8351deSBard Liao 	SOC_DOUBLE_TLV("Mono ADC Capture Volume", RT5670_MONO_ADC_DIG_VOL,
4725e8351deSBard Liao 			RT5670_L_VOL_SFT, RT5670_R_VOL_SFT,
4735e8351deSBard Liao 			127, 0, adc_vol_tlv),
4745e8351deSBard Liao 
4755e8351deSBard Liao 	/* ADC Boost Volume Control */
4765e8351deSBard Liao 	SOC_DOUBLE_TLV("STO1 ADC Boost Gain Volume", RT5670_ADC_BST_VOL1,
4775e8351deSBard Liao 			RT5670_STO1_ADC_L_BST_SFT, RT5670_STO1_ADC_R_BST_SFT,
4785e8351deSBard Liao 			3, 0, adc_bst_tlv),
4795e8351deSBard Liao 
4805e8351deSBard Liao 	SOC_DOUBLE_TLV("STO2 ADC Boost Gain Volume", RT5670_ADC_BST_VOL1,
4815e8351deSBard Liao 			RT5670_STO2_ADC_L_BST_SFT, RT5670_STO2_ADC_R_BST_SFT,
4825e8351deSBard Liao 			3, 0, adc_bst_tlv),
4835e8351deSBard Liao 
4845e8351deSBard Liao 	SOC_ENUM("ADC IF2 Data Switch", rt5670_if2_adc_enum),
4855e8351deSBard Liao 	SOC_ENUM("DAC IF2 Data Switch", rt5670_if2_dac_enum),
4865e8351deSBard Liao };
4875e8351deSBard Liao 
4885e8351deSBard Liao /**
4895e8351deSBard Liao  * set_dmic_clk - Set parameter of dmic.
4905e8351deSBard Liao  *
4915e8351deSBard Liao  * @w: DAPM widget.
4925e8351deSBard Liao  * @kcontrol: The kcontrol of this widget.
4935e8351deSBard Liao  * @event: Event id.
4945e8351deSBard Liao  *
4955e8351deSBard Liao  * Choose dmic clock between 1MHz and 3MHz.
4965e8351deSBard Liao  * It is better for clock to approximate 3MHz.
4975e8351deSBard Liao  */
4985e8351deSBard Liao static int set_dmic_clk(struct snd_soc_dapm_widget *w,
4995e8351deSBard Liao 	struct snd_kcontrol *kcontrol, int event)
5005e8351deSBard Liao {
5015e8351deSBard Liao 	struct snd_soc_codec *codec = w->codec;
5025e8351deSBard Liao 	struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec);
5035e8351deSBard Liao 	int idx = -EINVAL;
5045e8351deSBard Liao 
5055e8351deSBard Liao 	idx = rl6231_calc_dmic_clk(rt5670->sysclk);
5065e8351deSBard Liao 
5075e8351deSBard Liao 	if (idx < 0)
5085e8351deSBard Liao 		dev_err(codec->dev, "Failed to set DMIC clock\n");
5095e8351deSBard Liao 	else
5105e8351deSBard Liao 		snd_soc_update_bits(codec, RT5670_DMIC_CTRL1,
5115e8351deSBard Liao 			RT5670_DMIC_CLK_MASK, idx << RT5670_DMIC_CLK_SFT);
5125e8351deSBard Liao 	return idx;
5135e8351deSBard Liao }
5145e8351deSBard Liao 
5155e8351deSBard Liao static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *source,
5165e8351deSBard Liao 			 struct snd_soc_dapm_widget *sink)
5175e8351deSBard Liao {
5185e8351deSBard Liao 	unsigned int val;
5195e8351deSBard Liao 
5205e8351deSBard Liao 	val = snd_soc_read(source->codec, RT5670_GLB_CLK);
5215e8351deSBard Liao 	val &= RT5670_SCLK_SRC_MASK;
5225e8351deSBard Liao 	if (val == RT5670_SCLK_SRC_PLL1)
5235e8351deSBard Liao 		return 1;
5245e8351deSBard Liao 	else
5255e8351deSBard Liao 		return 0;
5265e8351deSBard Liao }
5275e8351deSBard Liao 
5285e8351deSBard Liao static int is_using_asrc(struct snd_soc_dapm_widget *source,
5295e8351deSBard Liao 			 struct snd_soc_dapm_widget *sink)
5305e8351deSBard Liao {
5315e8351deSBard Liao 	unsigned int reg, shift, val;
5325e8351deSBard Liao 
5335e8351deSBard Liao 	switch (source->shift) {
5345e8351deSBard Liao 	case 0:
5355e8351deSBard Liao 		reg = RT5670_ASRC_3;
5365e8351deSBard Liao 		shift = 0;
5375e8351deSBard Liao 		break;
5385e8351deSBard Liao 	case 1:
5395e8351deSBard Liao 		reg = RT5670_ASRC_3;
5405e8351deSBard Liao 		shift = 4;
5415e8351deSBard Liao 		break;
5425e8351deSBard Liao 	case 2:
5435e8351deSBard Liao 		reg = RT5670_ASRC_5;
5445e8351deSBard Liao 		shift = 12;
5455e8351deSBard Liao 		break;
5465e8351deSBard Liao 	case 3:
5475e8351deSBard Liao 		reg = RT5670_ASRC_2;
5485e8351deSBard Liao 		shift = 0;
5495e8351deSBard Liao 		break;
5505e8351deSBard Liao 	case 8:
5515e8351deSBard Liao 		reg = RT5670_ASRC_2;
5525e8351deSBard Liao 		shift = 4;
5535e8351deSBard Liao 		break;
5545e8351deSBard Liao 	case 9:
5555e8351deSBard Liao 		reg = RT5670_ASRC_2;
5565e8351deSBard Liao 		shift = 8;
5575e8351deSBard Liao 		break;
5585e8351deSBard Liao 	case 10:
5595e8351deSBard Liao 		reg = RT5670_ASRC_2;
5605e8351deSBard Liao 		shift = 12;
5615e8351deSBard Liao 		break;
5625e8351deSBard Liao 	default:
5635e8351deSBard Liao 		return 0;
5645e8351deSBard Liao 	}
5655e8351deSBard Liao 
5665e8351deSBard Liao 	val = (snd_soc_read(source->codec, reg) >> shift) & 0xf;
5675e8351deSBard Liao 	switch (val) {
5685e8351deSBard Liao 	case 1:
5695e8351deSBard Liao 	case 2:
5705e8351deSBard Liao 	case 3:
5715e8351deSBard Liao 	case 4:
5725e8351deSBard Liao 		return 1;
5735e8351deSBard Liao 	default:
5745e8351deSBard Liao 		return 0;
5755e8351deSBard Liao 	}
5765e8351deSBard Liao 
5775e8351deSBard Liao }
5785e8351deSBard Liao 
5795e8351deSBard Liao /* Digital Mixer */
5805e8351deSBard Liao static const struct snd_kcontrol_new rt5670_sto1_adc_l_mix[] = {
5815e8351deSBard Liao 	SOC_DAPM_SINGLE("ADC1 Switch", RT5670_STO1_ADC_MIXER,
5825e8351deSBard Liao 			RT5670_M_ADC_L1_SFT, 1, 1),
5835e8351deSBard Liao 	SOC_DAPM_SINGLE("ADC2 Switch", RT5670_STO1_ADC_MIXER,
5845e8351deSBard Liao 			RT5670_M_ADC_L2_SFT, 1, 1),
5855e8351deSBard Liao };
5865e8351deSBard Liao 
5875e8351deSBard Liao static const struct snd_kcontrol_new rt5670_sto1_adc_r_mix[] = {
5885e8351deSBard Liao 	SOC_DAPM_SINGLE("ADC1 Switch", RT5670_STO1_ADC_MIXER,
5895e8351deSBard Liao 			RT5670_M_ADC_R1_SFT, 1, 1),
5905e8351deSBard Liao 	SOC_DAPM_SINGLE("ADC2 Switch", RT5670_STO1_ADC_MIXER,
5915e8351deSBard Liao 			RT5670_M_ADC_R2_SFT, 1, 1),
5925e8351deSBard Liao };
5935e8351deSBard Liao 
5945e8351deSBard Liao static const struct snd_kcontrol_new rt5670_sto2_adc_l_mix[] = {
5955e8351deSBard Liao 	SOC_DAPM_SINGLE("ADC1 Switch", RT5670_STO2_ADC_MIXER,
5965e8351deSBard Liao 			RT5670_M_ADC_L1_SFT, 1, 1),
5975e8351deSBard Liao 	SOC_DAPM_SINGLE("ADC2 Switch", RT5670_STO2_ADC_MIXER,
5985e8351deSBard Liao 			RT5670_M_ADC_L2_SFT, 1, 1),
5995e8351deSBard Liao };
6005e8351deSBard Liao 
6015e8351deSBard Liao static const struct snd_kcontrol_new rt5670_sto2_adc_r_mix[] = {
6025e8351deSBard Liao 	SOC_DAPM_SINGLE("ADC1 Switch", RT5670_STO2_ADC_MIXER,
6035e8351deSBard Liao 			RT5670_M_ADC_R1_SFT, 1, 1),
6045e8351deSBard Liao 	SOC_DAPM_SINGLE("ADC2 Switch", RT5670_STO2_ADC_MIXER,
6055e8351deSBard Liao 			RT5670_M_ADC_R2_SFT, 1, 1),
6065e8351deSBard Liao };
6075e8351deSBard Liao 
6085e8351deSBard Liao static const struct snd_kcontrol_new rt5670_mono_adc_l_mix[] = {
6095e8351deSBard Liao 	SOC_DAPM_SINGLE("ADC1 Switch", RT5670_MONO_ADC_MIXER,
6105e8351deSBard Liao 			RT5670_M_MONO_ADC_L1_SFT, 1, 1),
6115e8351deSBard Liao 	SOC_DAPM_SINGLE("ADC2 Switch", RT5670_MONO_ADC_MIXER,
6125e8351deSBard Liao 			RT5670_M_MONO_ADC_L2_SFT, 1, 1),
6135e8351deSBard Liao };
6145e8351deSBard Liao 
6155e8351deSBard Liao static const struct snd_kcontrol_new rt5670_mono_adc_r_mix[] = {
6165e8351deSBard Liao 	SOC_DAPM_SINGLE("ADC1 Switch", RT5670_MONO_ADC_MIXER,
6175e8351deSBard Liao 			RT5670_M_MONO_ADC_R1_SFT, 1, 1),
6185e8351deSBard Liao 	SOC_DAPM_SINGLE("ADC2 Switch", RT5670_MONO_ADC_MIXER,
6195e8351deSBard Liao 			RT5670_M_MONO_ADC_R2_SFT, 1, 1),
6205e8351deSBard Liao };
6215e8351deSBard Liao 
6225e8351deSBard Liao static const struct snd_kcontrol_new rt5670_dac_l_mix[] = {
6235e8351deSBard Liao 	SOC_DAPM_SINGLE("Stereo ADC Switch", RT5670_AD_DA_MIXER,
6245e8351deSBard Liao 			RT5670_M_ADCMIX_L_SFT, 1, 1),
6255e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC1 Switch", RT5670_AD_DA_MIXER,
6265e8351deSBard Liao 			RT5670_M_DAC1_L_SFT, 1, 1),
6275e8351deSBard Liao };
6285e8351deSBard Liao 
6295e8351deSBard Liao static const struct snd_kcontrol_new rt5670_dac_r_mix[] = {
6305e8351deSBard Liao 	SOC_DAPM_SINGLE("Stereo ADC Switch", RT5670_AD_DA_MIXER,
6315e8351deSBard Liao 			RT5670_M_ADCMIX_R_SFT, 1, 1),
6325e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC1 Switch", RT5670_AD_DA_MIXER,
6335e8351deSBard Liao 			RT5670_M_DAC1_R_SFT, 1, 1),
6345e8351deSBard Liao };
6355e8351deSBard Liao 
6365e8351deSBard Liao static const struct snd_kcontrol_new rt5670_sto_dac_l_mix[] = {
6375e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC L1 Switch", RT5670_STO_DAC_MIXER,
6385e8351deSBard Liao 			RT5670_M_DAC_L1_SFT, 1, 1),
6395e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC L2 Switch", RT5670_STO_DAC_MIXER,
6405e8351deSBard Liao 			RT5670_M_DAC_L2_SFT, 1, 1),
6415e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC R1 Switch", RT5670_STO_DAC_MIXER,
6425e8351deSBard Liao 			RT5670_M_DAC_R1_STO_L_SFT, 1, 1),
6435e8351deSBard Liao };
6445e8351deSBard Liao 
6455e8351deSBard Liao static const struct snd_kcontrol_new rt5670_sto_dac_r_mix[] = {
6465e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC R1 Switch", RT5670_STO_DAC_MIXER,
6475e8351deSBard Liao 			RT5670_M_DAC_R1_SFT, 1, 1),
6485e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC R2 Switch", RT5670_STO_DAC_MIXER,
6495e8351deSBard Liao 			RT5670_M_DAC_R2_SFT, 1, 1),
6505e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC L1 Switch", RT5670_STO_DAC_MIXER,
6515e8351deSBard Liao 			RT5670_M_DAC_L1_STO_R_SFT, 1, 1),
6525e8351deSBard Liao };
6535e8351deSBard Liao 
6545e8351deSBard Liao static const struct snd_kcontrol_new rt5670_mono_dac_l_mix[] = {
6555e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC L1 Switch", RT5670_DD_MIXER,
6565e8351deSBard Liao 			RT5670_M_DAC_L1_MONO_L_SFT, 1, 1),
6575e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC L2 Switch", RT5670_DD_MIXER,
6585e8351deSBard Liao 			RT5670_M_DAC_L2_MONO_L_SFT, 1, 1),
6595e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC R2 Switch", RT5670_DD_MIXER,
6605e8351deSBard Liao 			RT5670_M_DAC_R2_MONO_L_SFT, 1, 1),
6615e8351deSBard Liao };
6625e8351deSBard Liao 
6635e8351deSBard Liao static const struct snd_kcontrol_new rt5670_mono_dac_r_mix[] = {
6645e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC R1 Switch", RT5670_DD_MIXER,
6655e8351deSBard Liao 			RT5670_M_DAC_R1_MONO_R_SFT, 1, 1),
6665e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC R2 Switch", RT5670_DD_MIXER,
6675e8351deSBard Liao 			RT5670_M_DAC_R2_MONO_R_SFT, 1, 1),
6685e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC L2 Switch", RT5670_DD_MIXER,
6695e8351deSBard Liao 			RT5670_M_DAC_L2_MONO_R_SFT, 1, 1),
6705e8351deSBard Liao };
6715e8351deSBard Liao 
6725e8351deSBard Liao static const struct snd_kcontrol_new rt5670_dig_l_mix[] = {
6735e8351deSBard Liao 	SOC_DAPM_SINGLE("Sto DAC Mix L Switch", RT5670_DIG_MIXER,
6745e8351deSBard Liao 			RT5670_M_STO_L_DAC_L_SFT, 1, 1),
6755e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC L2 Switch", RT5670_DIG_MIXER,
6765e8351deSBard Liao 			RT5670_M_DAC_L2_DAC_L_SFT, 1, 1),
6775e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC R2 Switch", RT5670_DIG_MIXER,
6785e8351deSBard Liao 			RT5670_M_DAC_R2_DAC_L_SFT, 1, 1),
6795e8351deSBard Liao };
6805e8351deSBard Liao 
6815e8351deSBard Liao static const struct snd_kcontrol_new rt5670_dig_r_mix[] = {
6825e8351deSBard Liao 	SOC_DAPM_SINGLE("Sto DAC Mix R Switch", RT5670_DIG_MIXER,
6835e8351deSBard Liao 			RT5670_M_STO_R_DAC_R_SFT, 1, 1),
6845e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC R2 Switch", RT5670_DIG_MIXER,
6855e8351deSBard Liao 			RT5670_M_DAC_R2_DAC_R_SFT, 1, 1),
6865e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC L2 Switch", RT5670_DIG_MIXER,
6875e8351deSBard Liao 			RT5670_M_DAC_L2_DAC_R_SFT, 1, 1),
6885e8351deSBard Liao };
6895e8351deSBard Liao 
6905e8351deSBard Liao /* Analog Input Mixer */
6915e8351deSBard Liao static const struct snd_kcontrol_new rt5670_rec_l_mix[] = {
6925e8351deSBard Liao 	SOC_DAPM_SINGLE("INL Switch", RT5670_REC_L2_MIXER,
6935e8351deSBard Liao 			RT5670_M_IN_L_RM_L_SFT, 1, 1),
6945e8351deSBard Liao 	SOC_DAPM_SINGLE("BST2 Switch", RT5670_REC_L2_MIXER,
6955e8351deSBard Liao 			RT5670_M_BST2_RM_L_SFT, 1, 1),
6965e8351deSBard Liao 	SOC_DAPM_SINGLE("BST1 Switch", RT5670_REC_L2_MIXER,
6975e8351deSBard Liao 			RT5670_M_BST1_RM_L_SFT, 1, 1),
6985e8351deSBard Liao };
6995e8351deSBard Liao 
7005e8351deSBard Liao static const struct snd_kcontrol_new rt5670_rec_r_mix[] = {
7015e8351deSBard Liao 	SOC_DAPM_SINGLE("INR Switch", RT5670_REC_R2_MIXER,
7025e8351deSBard Liao 			RT5670_M_IN_R_RM_R_SFT, 1, 1),
7035e8351deSBard Liao 	SOC_DAPM_SINGLE("BST2 Switch", RT5670_REC_R2_MIXER,
7045e8351deSBard Liao 			RT5670_M_BST2_RM_R_SFT, 1, 1),
7055e8351deSBard Liao 	SOC_DAPM_SINGLE("BST1 Switch", RT5670_REC_R2_MIXER,
7065e8351deSBard Liao 			RT5670_M_BST1_RM_R_SFT, 1, 1),
7075e8351deSBard Liao };
7085e8351deSBard Liao 
7095e8351deSBard Liao static const struct snd_kcontrol_new rt5670_out_l_mix[] = {
7105e8351deSBard Liao 	SOC_DAPM_SINGLE("BST1 Switch", RT5670_OUT_L1_MIXER,
7115e8351deSBard Liao 			RT5670_M_BST1_OM_L_SFT, 1, 1),
7125e8351deSBard Liao 	SOC_DAPM_SINGLE("INL Switch", RT5670_OUT_L1_MIXER,
7135e8351deSBard Liao 			RT5670_M_IN_L_OM_L_SFT, 1, 1),
7145e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC L2 Switch", RT5670_OUT_L1_MIXER,
7155e8351deSBard Liao 			RT5670_M_DAC_L2_OM_L_SFT, 1, 1),
7165e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC L1 Switch", RT5670_OUT_L1_MIXER,
7175e8351deSBard Liao 			RT5670_M_DAC_L1_OM_L_SFT, 1, 1),
7185e8351deSBard Liao };
7195e8351deSBard Liao 
7205e8351deSBard Liao static const struct snd_kcontrol_new rt5670_out_r_mix[] = {
7215e8351deSBard Liao 	SOC_DAPM_SINGLE("BST2 Switch", RT5670_OUT_R1_MIXER,
7225e8351deSBard Liao 			RT5670_M_BST2_OM_R_SFT, 1, 1),
7235e8351deSBard Liao 	SOC_DAPM_SINGLE("INR Switch", RT5670_OUT_R1_MIXER,
7245e8351deSBard Liao 			RT5670_M_IN_R_OM_R_SFT, 1, 1),
7255e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC R2 Switch", RT5670_OUT_R1_MIXER,
7265e8351deSBard Liao 			RT5670_M_DAC_R2_OM_R_SFT, 1, 1),
7275e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC R1 Switch", RT5670_OUT_R1_MIXER,
7285e8351deSBard Liao 			RT5670_M_DAC_R1_OM_R_SFT, 1, 1),
7295e8351deSBard Liao };
7305e8351deSBard Liao 
7315e8351deSBard Liao static const struct snd_kcontrol_new rt5670_hpo_mix[] = {
7325e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC1 Switch", RT5670_HPO_MIXER,
7335e8351deSBard Liao 			RT5670_M_DAC1_HM_SFT, 1, 1),
7345e8351deSBard Liao 	SOC_DAPM_SINGLE("HPVOL Switch", RT5670_HPO_MIXER,
7355e8351deSBard Liao 			RT5670_M_HPVOL_HM_SFT, 1, 1),
7365e8351deSBard Liao };
7375e8351deSBard Liao 
7385e8351deSBard Liao static const struct snd_kcontrol_new rt5670_hpvoll_mix[] = {
7395e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC1 Switch", RT5670_HPO_MIXER,
7405e8351deSBard Liao 			RT5670_M_DACL1_HML_SFT, 1, 1),
7415e8351deSBard Liao 	SOC_DAPM_SINGLE("INL Switch", RT5670_HPO_MIXER,
7425e8351deSBard Liao 			RT5670_M_INL1_HML_SFT, 1, 1),
7435e8351deSBard Liao };
7445e8351deSBard Liao 
7455e8351deSBard Liao static const struct snd_kcontrol_new rt5670_hpvolr_mix[] = {
7465e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC1 Switch", RT5670_HPO_MIXER,
7475e8351deSBard Liao 			RT5670_M_DACR1_HMR_SFT, 1, 1),
7485e8351deSBard Liao 	SOC_DAPM_SINGLE("INR Switch", RT5670_HPO_MIXER,
7495e8351deSBard Liao 			RT5670_M_INR1_HMR_SFT, 1, 1),
7505e8351deSBard Liao };
7515e8351deSBard Liao 
7525e8351deSBard Liao static const struct snd_kcontrol_new rt5670_lout_mix[] = {
7535e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC L1 Switch", RT5670_LOUT_MIXER,
7545e8351deSBard Liao 			RT5670_M_DAC_L1_LM_SFT, 1, 1),
7555e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC R1 Switch", RT5670_LOUT_MIXER,
7565e8351deSBard Liao 			RT5670_M_DAC_R1_LM_SFT, 1, 1),
7575e8351deSBard Liao 	SOC_DAPM_SINGLE("OUTMIX L Switch", RT5670_LOUT_MIXER,
7585e8351deSBard Liao 			RT5670_M_OV_L_LM_SFT, 1, 1),
7595e8351deSBard Liao 	SOC_DAPM_SINGLE("OUTMIX R Switch", RT5670_LOUT_MIXER,
7605e8351deSBard Liao 			RT5670_M_OV_R_LM_SFT, 1, 1),
7615e8351deSBard Liao };
7625e8351deSBard Liao 
7635e8351deSBard Liao static const struct snd_kcontrol_new rt5670_hpl_mix[] = {
7645e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC L1 Switch", RT5670_HPO_MIXER,
7655e8351deSBard Liao 			RT5670_M_DACL1_HML_SFT, 1, 1),
7665e8351deSBard Liao 	SOC_DAPM_SINGLE("INL1 Switch", RT5670_HPO_MIXER,
7675e8351deSBard Liao 			RT5670_M_INL1_HML_SFT, 1, 1),
7685e8351deSBard Liao };
7695e8351deSBard Liao 
7705e8351deSBard Liao static const struct snd_kcontrol_new rt5670_hpr_mix[] = {
7715e8351deSBard Liao 	SOC_DAPM_SINGLE("DAC R1 Switch", RT5670_HPO_MIXER,
7725e8351deSBard Liao 			RT5670_M_DACR1_HMR_SFT, 1, 1),
7735e8351deSBard Liao 	SOC_DAPM_SINGLE("INR1 Switch", RT5670_HPO_MIXER,
7745e8351deSBard Liao 			RT5670_M_INR1_HMR_SFT, 1, 1),
7755e8351deSBard Liao };
7765e8351deSBard Liao 
7775e8351deSBard Liao static const struct snd_kcontrol_new lout_l_enable_control =
7785e8351deSBard Liao 	SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5670_LOUT1,
7795e8351deSBard Liao 		RT5670_L_MUTE_SFT, 1, 1);
7805e8351deSBard Liao 
7815e8351deSBard Liao static const struct snd_kcontrol_new lout_r_enable_control =
7825e8351deSBard Liao 	SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5670_LOUT1,
7835e8351deSBard Liao 		RT5670_R_MUTE_SFT, 1, 1);
7845e8351deSBard Liao 
7855e8351deSBard Liao /* DAC1 L/R source */ /* MX-29 [9:8] [11:10] */
7865e8351deSBard Liao static const char * const rt5670_dac1_src[] = {
7875e8351deSBard Liao 	"IF1 DAC", "IF2 DAC"
7885e8351deSBard Liao };
7895e8351deSBard Liao 
79001957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_dac1l_enum, RT5670_AD_DA_MIXER,
7915e8351deSBard Liao 	RT5670_DAC1_L_SEL_SFT, rt5670_dac1_src);
7925e8351deSBard Liao 
7935e8351deSBard Liao static const struct snd_kcontrol_new rt5670_dac1l_mux =
7945e8351deSBard Liao 	SOC_DAPM_ENUM("DAC1 L source", rt5670_dac1l_enum);
7955e8351deSBard Liao 
79601957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_dac1r_enum, RT5670_AD_DA_MIXER,
7975e8351deSBard Liao 	RT5670_DAC1_R_SEL_SFT, rt5670_dac1_src);
7985e8351deSBard Liao 
7995e8351deSBard Liao static const struct snd_kcontrol_new rt5670_dac1r_mux =
8005e8351deSBard Liao 	SOC_DAPM_ENUM("DAC1 R source", rt5670_dac1r_enum);
8015e8351deSBard Liao 
8025e8351deSBard Liao /*DAC2 L/R source*/ /* MX-1B [6:4] [2:0] */
8035e8351deSBard Liao /* TODO Use SOC_VALUE_ENUM_SINGLE_DECL */
8045e8351deSBard Liao static const char * const rt5670_dac12_src[] = {
8055e8351deSBard Liao 	"IF1 DAC", "IF2 DAC", "IF3 DAC", "TxDC DAC",
8065e8351deSBard Liao 	"Bass", "VAD_ADC", "IF4 DAC"
8075e8351deSBard Liao };
8085e8351deSBard Liao 
80901957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_dac2l_enum, RT5670_DAC_CTRL,
8105e8351deSBard Liao 	RT5670_DAC2_L_SEL_SFT, rt5670_dac12_src);
8115e8351deSBard Liao 
8125e8351deSBard Liao static const struct snd_kcontrol_new rt5670_dac_l2_mux =
8135e8351deSBard Liao 	SOC_DAPM_ENUM("DAC2 L source", rt5670_dac2l_enum);
8145e8351deSBard Liao 
8155e8351deSBard Liao static const char * const rt5670_dacr2_src[] = {
8165e8351deSBard Liao 	"IF1 DAC", "IF2 DAC", "IF3 DAC", "TxDC DAC", "TxDP ADC", "IF4 DAC"
8175e8351deSBard Liao };
8185e8351deSBard Liao 
81901957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_dac2r_enum, RT5670_DAC_CTRL,
8205e8351deSBard Liao 	RT5670_DAC2_R_SEL_SFT, rt5670_dacr2_src);
8215e8351deSBard Liao 
8225e8351deSBard Liao static const struct snd_kcontrol_new rt5670_dac_r2_mux =
8235e8351deSBard Liao 	SOC_DAPM_ENUM("DAC2 R source", rt5670_dac2r_enum);
8245e8351deSBard Liao 
8255e8351deSBard Liao /*RxDP source*/ /* MX-2D [15:13] */
8265e8351deSBard Liao static const char * const rt5670_rxdp_src[] = {
8275e8351deSBard Liao 	"IF2 DAC", "IF1 DAC", "STO1 ADC Mixer", "STO2 ADC Mixer",
8285e8351deSBard Liao 	"Mono ADC Mixer L", "Mono ADC Mixer R", "DAC1"
8295e8351deSBard Liao };
8305e8351deSBard Liao 
83101957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_rxdp_enum, RT5670_DSP_PATH1,
8325e8351deSBard Liao 	RT5670_RXDP_SEL_SFT, rt5670_rxdp_src);
8335e8351deSBard Liao 
8345e8351deSBard Liao static const struct snd_kcontrol_new rt5670_rxdp_mux =
8355e8351deSBard Liao 	SOC_DAPM_ENUM("DAC2 L source", rt5670_rxdp_enum);
8365e8351deSBard Liao 
8375e8351deSBard Liao /* MX-2D [1] [0] */
8385e8351deSBard Liao static const char * const rt5670_dsp_bypass_src[] = {
8395e8351deSBard Liao 	"DSP", "Bypass"
8405e8351deSBard Liao };
8415e8351deSBard Liao 
84201957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_dsp_ul_enum, RT5670_DSP_PATH1,
8435e8351deSBard Liao 	RT5670_DSP_UL_SFT, rt5670_dsp_bypass_src);
8445e8351deSBard Liao 
8455e8351deSBard Liao static const struct snd_kcontrol_new rt5670_dsp_ul_mux =
8465e8351deSBard Liao 	SOC_DAPM_ENUM("DSP UL source", rt5670_dsp_ul_enum);
8475e8351deSBard Liao 
84801957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_dsp_dl_enum, RT5670_DSP_PATH1,
8495e8351deSBard Liao 	RT5670_DSP_DL_SFT, rt5670_dsp_bypass_src);
8505e8351deSBard Liao 
8515e8351deSBard Liao static const struct snd_kcontrol_new rt5670_dsp_dl_mux =
8525e8351deSBard Liao 	SOC_DAPM_ENUM("DSP DL source", rt5670_dsp_dl_enum);
8535e8351deSBard Liao 
8545e8351deSBard Liao /* Stereo2 ADC source */
8555e8351deSBard Liao /* MX-26 [15] */
8565e8351deSBard Liao static const char * const rt5670_stereo2_adc_lr_src[] = {
8575e8351deSBard Liao 	"L", "LR"
8585e8351deSBard Liao };
8595e8351deSBard Liao 
86001957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_stereo2_adc_lr_enum, RT5670_STO2_ADC_MIXER,
8615e8351deSBard Liao 	RT5670_STO2_ADC_SRC_SFT, rt5670_stereo2_adc_lr_src);
8625e8351deSBard Liao 
8635e8351deSBard Liao static const struct snd_kcontrol_new rt5670_sto2_adc_lr_mux =
8645e8351deSBard Liao 	SOC_DAPM_ENUM("Stereo2 ADC LR source", rt5670_stereo2_adc_lr_enum);
8655e8351deSBard Liao 
8665e8351deSBard Liao /* Stereo1 ADC source */
8675e8351deSBard Liao /* MX-27 MX-26 [12] */
8685e8351deSBard Liao static const char * const rt5670_stereo_adc1_src[] = {
8695e8351deSBard Liao 	"DAC MIX", "ADC"
8705e8351deSBard Liao };
8715e8351deSBard Liao 
87201957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_stereo1_adc1_enum, RT5670_STO1_ADC_MIXER,
8735e8351deSBard Liao 	RT5670_ADC_1_SRC_SFT, rt5670_stereo_adc1_src);
8745e8351deSBard Liao 
8755e8351deSBard Liao static const struct snd_kcontrol_new rt5670_sto_adc_l1_mux =
8765e8351deSBard Liao 	SOC_DAPM_ENUM("Stereo1 ADC L1 source", rt5670_stereo1_adc1_enum);
8775e8351deSBard Liao 
8785e8351deSBard Liao static const struct snd_kcontrol_new rt5670_sto_adc_r1_mux =
8795e8351deSBard Liao 	SOC_DAPM_ENUM("Stereo1 ADC R1 source", rt5670_stereo1_adc1_enum);
8805e8351deSBard Liao 
88101957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_stereo2_adc1_enum, RT5670_STO2_ADC_MIXER,
8825e8351deSBard Liao 	RT5670_ADC_1_SRC_SFT, rt5670_stereo_adc1_src);
8835e8351deSBard Liao 
8845e8351deSBard Liao static const struct snd_kcontrol_new rt5670_sto2_adc_l1_mux =
8855e8351deSBard Liao 	SOC_DAPM_ENUM("Stereo2 ADC L1 source", rt5670_stereo2_adc1_enum);
8865e8351deSBard Liao 
8875e8351deSBard Liao static const struct snd_kcontrol_new rt5670_sto2_adc_r1_mux =
8885e8351deSBard Liao 	SOC_DAPM_ENUM("Stereo2 ADC R1 source", rt5670_stereo2_adc1_enum);
8895e8351deSBard Liao 
8905e8351deSBard Liao /* MX-27 MX-26 [11] */
8915e8351deSBard Liao static const char * const rt5670_stereo_adc2_src[] = {
8925e8351deSBard Liao 	"DAC MIX", "DMIC"
8935e8351deSBard Liao };
8945e8351deSBard Liao 
89501957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_stereo1_adc2_enum, RT5670_STO1_ADC_MIXER,
8965e8351deSBard Liao 	RT5670_ADC_2_SRC_SFT, rt5670_stereo_adc2_src);
8975e8351deSBard Liao 
8985e8351deSBard Liao static const struct snd_kcontrol_new rt5670_sto_adc_l2_mux =
8995e8351deSBard Liao 	SOC_DAPM_ENUM("Stereo1 ADC L2 source", rt5670_stereo1_adc2_enum);
9005e8351deSBard Liao 
9015e8351deSBard Liao static const struct snd_kcontrol_new rt5670_sto_adc_r2_mux =
9025e8351deSBard Liao 	SOC_DAPM_ENUM("Stereo1 ADC R2 source", rt5670_stereo1_adc2_enum);
9035e8351deSBard Liao 
90401957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_stereo2_adc2_enum, RT5670_STO2_ADC_MIXER,
9055e8351deSBard Liao 	RT5670_ADC_2_SRC_SFT, rt5670_stereo_adc2_src);
9065e8351deSBard Liao 
9075e8351deSBard Liao static const struct snd_kcontrol_new rt5670_sto2_adc_l2_mux =
9085e8351deSBard Liao 	SOC_DAPM_ENUM("Stereo2 ADC L2 source", rt5670_stereo2_adc2_enum);
9095e8351deSBard Liao 
9105e8351deSBard Liao static const struct snd_kcontrol_new rt5670_sto2_adc_r2_mux =
9115e8351deSBard Liao 	SOC_DAPM_ENUM("Stereo2 ADC R2 source", rt5670_stereo2_adc2_enum);
9125e8351deSBard Liao 
9135e8351deSBard Liao /* MX-27 MX26 [10] */
9145e8351deSBard Liao static const char * const rt5670_stereo_adc_src[] = {
9155e8351deSBard Liao 	"ADC1L ADC2R", "ADC3"
9165e8351deSBard Liao };
9175e8351deSBard Liao 
91801957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_stereo1_adc_enum, RT5670_STO1_ADC_MIXER,
9195e8351deSBard Liao 	RT5670_ADC_SRC_SFT, rt5670_stereo_adc_src);
9205e8351deSBard Liao 
9215e8351deSBard Liao static const struct snd_kcontrol_new rt5670_sto_adc_mux =
9225e8351deSBard Liao 	SOC_DAPM_ENUM("Stereo1 ADC source", rt5670_stereo1_adc_enum);
9235e8351deSBard Liao 
92401957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_stereo2_adc_enum, RT5670_STO2_ADC_MIXER,
9255e8351deSBard Liao 	RT5670_ADC_SRC_SFT, rt5670_stereo_adc_src);
9265e8351deSBard Liao 
9275e8351deSBard Liao static const struct snd_kcontrol_new rt5670_sto2_adc_mux =
9285e8351deSBard Liao 	SOC_DAPM_ENUM("Stereo2 ADC source", rt5670_stereo2_adc_enum);
9295e8351deSBard Liao 
9305e8351deSBard Liao /* MX-27 MX-26 [9:8] */
9315e8351deSBard Liao static const char * const rt5670_stereo_dmic_src[] = {
9325e8351deSBard Liao 	"DMIC1", "DMIC2", "DMIC3"
9335e8351deSBard Liao };
9345e8351deSBard Liao 
93501957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_stereo1_dmic_enum, RT5670_STO1_ADC_MIXER,
9365e8351deSBard Liao 	RT5670_DMIC_SRC_SFT, rt5670_stereo_dmic_src);
9375e8351deSBard Liao 
9385e8351deSBard Liao static const struct snd_kcontrol_new rt5670_sto1_dmic_mux =
9395e8351deSBard Liao 	SOC_DAPM_ENUM("Stereo1 DMIC source", rt5670_stereo1_dmic_enum);
9405e8351deSBard Liao 
94101957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_stereo2_dmic_enum, RT5670_STO2_ADC_MIXER,
9425e8351deSBard Liao 	RT5670_DMIC_SRC_SFT, rt5670_stereo_dmic_src);
9435e8351deSBard Liao 
9445e8351deSBard Liao static const struct snd_kcontrol_new rt5670_sto2_dmic_mux =
9455e8351deSBard Liao 	SOC_DAPM_ENUM("Stereo2 DMIC source", rt5670_stereo2_dmic_enum);
9465e8351deSBard Liao 
9475e8351deSBard Liao /* MX-27 [0] */
9485e8351deSBard Liao static const char * const rt5670_stereo_dmic3_src[] = {
9495e8351deSBard Liao 	"DMIC3", "PDM ADC"
9505e8351deSBard Liao };
9515e8351deSBard Liao 
95201957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_stereo_dmic3_enum, RT5670_STO1_ADC_MIXER,
9535e8351deSBard Liao 	RT5670_DMIC3_SRC_SFT, rt5670_stereo_dmic3_src);
9545e8351deSBard Liao 
9555e8351deSBard Liao static const struct snd_kcontrol_new rt5670_sto_dmic3_mux =
9565e8351deSBard Liao 	SOC_DAPM_ENUM("Stereo DMIC3 source", rt5670_stereo_dmic3_enum);
9575e8351deSBard Liao 
9585e8351deSBard Liao /* Mono ADC source */
9595e8351deSBard Liao /* MX-28 [12] */
9605e8351deSBard Liao static const char * const rt5670_mono_adc_l1_src[] = {
9615e8351deSBard Liao 	"Mono DAC MIXL", "ADC1"
9625e8351deSBard Liao };
9635e8351deSBard Liao 
96401957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_mono_adc_l1_enum, RT5670_MONO_ADC_MIXER,
9655e8351deSBard Liao 	RT5670_MONO_ADC_L1_SRC_SFT, rt5670_mono_adc_l1_src);
9665e8351deSBard Liao 
9675e8351deSBard Liao static const struct snd_kcontrol_new rt5670_mono_adc_l1_mux =
9685e8351deSBard Liao 	SOC_DAPM_ENUM("Mono ADC1 left source", rt5670_mono_adc_l1_enum);
9695e8351deSBard Liao /* MX-28 [11] */
9705e8351deSBard Liao static const char * const rt5670_mono_adc_l2_src[] = {
9715e8351deSBard Liao 	"Mono DAC MIXL", "DMIC"
9725e8351deSBard Liao };
9735e8351deSBard Liao 
97401957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_mono_adc_l2_enum, RT5670_MONO_ADC_MIXER,
9755e8351deSBard Liao 	RT5670_MONO_ADC_L2_SRC_SFT, rt5670_mono_adc_l2_src);
9765e8351deSBard Liao 
9775e8351deSBard Liao static const struct snd_kcontrol_new rt5670_mono_adc_l2_mux =
9785e8351deSBard Liao 	SOC_DAPM_ENUM("Mono ADC2 left source", rt5670_mono_adc_l2_enum);
9795e8351deSBard Liao 
9805e8351deSBard Liao /* MX-28 [9:8] */
9815e8351deSBard Liao static const char * const rt5670_mono_dmic_src[] = {
9825e8351deSBard Liao 	"DMIC1", "DMIC2", "DMIC3"
9835e8351deSBard Liao };
9845e8351deSBard Liao 
98501957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_mono_dmic_l_enum, RT5670_MONO_ADC_MIXER,
9865e8351deSBard Liao 	RT5670_MONO_DMIC_L_SRC_SFT, rt5670_mono_dmic_src);
9875e8351deSBard Liao 
9885e8351deSBard Liao static const struct snd_kcontrol_new rt5670_mono_dmic_l_mux =
9895e8351deSBard Liao 	SOC_DAPM_ENUM("Mono DMIC left source", rt5670_mono_dmic_l_enum);
9905e8351deSBard Liao /* MX-28 [1:0] */
99101957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_mono_dmic_r_enum, RT5670_MONO_ADC_MIXER,
9925e8351deSBard Liao 	RT5670_MONO_DMIC_R_SRC_SFT, rt5670_mono_dmic_src);
9935e8351deSBard Liao 
9945e8351deSBard Liao static const struct snd_kcontrol_new rt5670_mono_dmic_r_mux =
9955e8351deSBard Liao 	SOC_DAPM_ENUM("Mono DMIC Right source", rt5670_mono_dmic_r_enum);
9965e8351deSBard Liao /* MX-28 [4] */
9975e8351deSBard Liao static const char * const rt5670_mono_adc_r1_src[] = {
9985e8351deSBard Liao 	"Mono DAC MIXR", "ADC2"
9995e8351deSBard Liao };
10005e8351deSBard Liao 
100101957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_mono_adc_r1_enum, RT5670_MONO_ADC_MIXER,
10025e8351deSBard Liao 	RT5670_MONO_ADC_R1_SRC_SFT, rt5670_mono_adc_r1_src);
10035e8351deSBard Liao 
10045e8351deSBard Liao static const struct snd_kcontrol_new rt5670_mono_adc_r1_mux =
10055e8351deSBard Liao 	SOC_DAPM_ENUM("Mono ADC1 right source", rt5670_mono_adc_r1_enum);
10065e8351deSBard Liao /* MX-28 [3] */
10075e8351deSBard Liao static const char * const rt5670_mono_adc_r2_src[] = {
10085e8351deSBard Liao 	"Mono DAC MIXR", "DMIC"
10095e8351deSBard Liao };
10105e8351deSBard Liao 
101101957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_mono_adc_r2_enum, RT5670_MONO_ADC_MIXER,
10125e8351deSBard Liao 	RT5670_MONO_ADC_R2_SRC_SFT, rt5670_mono_adc_r2_src);
10135e8351deSBard Liao 
10145e8351deSBard Liao static const struct snd_kcontrol_new rt5670_mono_adc_r2_mux =
10155e8351deSBard Liao 	SOC_DAPM_ENUM("Mono ADC2 right source", rt5670_mono_adc_r2_enum);
10165e8351deSBard Liao 
10175e8351deSBard Liao /* MX-2D [3:2] */
10185e8351deSBard Liao static const char * const rt5670_txdp_slot_src[] = {
10195e8351deSBard Liao 	"Slot 0-1", "Slot 2-3", "Slot 4-5", "Slot 6-7"
10205e8351deSBard Liao };
10215e8351deSBard Liao 
102201957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_txdp_slot_enum, RT5670_DSP_PATH1,
10235e8351deSBard Liao 	RT5670_TXDP_SLOT_SEL_SFT, rt5670_txdp_slot_src);
10245e8351deSBard Liao 
10255e8351deSBard Liao static const struct snd_kcontrol_new rt5670_txdp_slot_mux =
10265e8351deSBard Liao 	SOC_DAPM_ENUM("TxDP Slot source", rt5670_txdp_slot_enum);
10275e8351deSBard Liao 
10285e8351deSBard Liao /* MX-2F [15] */
10295e8351deSBard Liao static const char * const rt5670_if1_adc2_in_src[] = {
10305e8351deSBard Liao 	"IF_ADC2", "VAD_ADC"
10315e8351deSBard Liao };
10325e8351deSBard Liao 
103301957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_if1_adc2_in_enum, RT5670_DIG_INF1_DATA,
10345e8351deSBard Liao 	RT5670_IF1_ADC2_IN_SFT, rt5670_if1_adc2_in_src);
10355e8351deSBard Liao 
10365e8351deSBard Liao static const struct snd_kcontrol_new rt5670_if1_adc2_in_mux =
10375e8351deSBard Liao 	SOC_DAPM_ENUM("IF1 ADC2 IN source", rt5670_if1_adc2_in_enum);
10385e8351deSBard Liao 
10395e8351deSBard Liao /* MX-2F [14:12] */
10405e8351deSBard Liao static const char * const rt5670_if2_adc_in_src[] = {
10415e8351deSBard Liao 	"IF_ADC1", "IF_ADC2", "IF_ADC3", "TxDC_DAC", "TxDP_ADC", "VAD_ADC"
10425e8351deSBard Liao };
10435e8351deSBard Liao 
104401957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_if2_adc_in_enum, RT5670_DIG_INF1_DATA,
10455e8351deSBard Liao 	RT5670_IF2_ADC_IN_SFT, rt5670_if2_adc_in_src);
10465e8351deSBard Liao 
10475e8351deSBard Liao static const struct snd_kcontrol_new rt5670_if2_adc_in_mux =
10485e8351deSBard Liao 	SOC_DAPM_ENUM("IF2 ADC IN source", rt5670_if2_adc_in_enum);
10495e8351deSBard Liao 
10505e8351deSBard Liao /* MX-30 [5:4] */
10515e8351deSBard Liao static const char * const rt5670_if4_adc_in_src[] = {
10525e8351deSBard Liao 	"IF_ADC1", "IF_ADC2", "IF_ADC3"
10535e8351deSBard Liao };
10545e8351deSBard Liao 
105501957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_if4_adc_in_enum, RT5670_DIG_INF2_DATA,
10565e8351deSBard Liao 	RT5670_IF4_ADC_IN_SFT, rt5670_if4_adc_in_src);
10575e8351deSBard Liao 
10585e8351deSBard Liao static const struct snd_kcontrol_new rt5670_if4_adc_in_mux =
10595e8351deSBard Liao 	SOC_DAPM_ENUM("IF4 ADC IN source", rt5670_if4_adc_in_enum);
10605e8351deSBard Liao 
10615e8351deSBard Liao /* MX-31 [15] [13] [11] [9] */
10625e8351deSBard Liao static const char * const rt5670_pdm_src[] = {
10635e8351deSBard Liao 	"Mono DAC", "Stereo DAC"
10645e8351deSBard Liao };
10655e8351deSBard Liao 
106601957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_pdm1_l_enum, RT5670_PDM_OUT_CTRL,
10675e8351deSBard Liao 	RT5670_PDM1_L_SFT, rt5670_pdm_src);
10685e8351deSBard Liao 
10695e8351deSBard Liao static const struct snd_kcontrol_new rt5670_pdm1_l_mux =
10705e8351deSBard Liao 	SOC_DAPM_ENUM("PDM1 L source", rt5670_pdm1_l_enum);
10715e8351deSBard Liao 
107201957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_pdm1_r_enum, RT5670_PDM_OUT_CTRL,
10735e8351deSBard Liao 	RT5670_PDM1_R_SFT, rt5670_pdm_src);
10745e8351deSBard Liao 
10755e8351deSBard Liao static const struct snd_kcontrol_new rt5670_pdm1_r_mux =
10765e8351deSBard Liao 	SOC_DAPM_ENUM("PDM1 R source", rt5670_pdm1_r_enum);
10775e8351deSBard Liao 
107801957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_pdm2_l_enum, RT5670_PDM_OUT_CTRL,
10795e8351deSBard Liao 	RT5670_PDM2_L_SFT, rt5670_pdm_src);
10805e8351deSBard Liao 
10815e8351deSBard Liao static const struct snd_kcontrol_new rt5670_pdm2_l_mux =
10825e8351deSBard Liao 	SOC_DAPM_ENUM("PDM2 L source", rt5670_pdm2_l_enum);
10835e8351deSBard Liao 
108401957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_pdm2_r_enum, RT5670_PDM_OUT_CTRL,
10855e8351deSBard Liao 	RT5670_PDM2_R_SFT, rt5670_pdm_src);
10865e8351deSBard Liao 
10875e8351deSBard Liao static const struct snd_kcontrol_new rt5670_pdm2_r_mux =
10885e8351deSBard Liao 	SOC_DAPM_ENUM("PDM2 R source", rt5670_pdm2_r_enum);
10895e8351deSBard Liao 
10905e8351deSBard Liao /* MX-FA [12] */
10915e8351deSBard Liao static const char * const rt5670_if1_adc1_in1_src[] = {
10925e8351deSBard Liao 	"IF_ADC1", "IF1_ADC3"
10935e8351deSBard Liao };
10945e8351deSBard Liao 
109501957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_if1_adc1_in1_enum, RT5670_DIG_MISC,
10965e8351deSBard Liao 	RT5670_IF1_ADC1_IN1_SFT, rt5670_if1_adc1_in1_src);
10975e8351deSBard Liao 
10985e8351deSBard Liao static const struct snd_kcontrol_new rt5670_if1_adc1_in1_mux =
10995e8351deSBard Liao 	SOC_DAPM_ENUM("IF1 ADC1 IN1 source", rt5670_if1_adc1_in1_enum);
11005e8351deSBard Liao 
11015e8351deSBard Liao /* MX-FA [11] */
11025e8351deSBard Liao static const char * const rt5670_if1_adc1_in2_src[] = {
11035e8351deSBard Liao 	"IF1_ADC1_IN1", "IF1_ADC4"
11045e8351deSBard Liao };
11055e8351deSBard Liao 
110601957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_if1_adc1_in2_enum, RT5670_DIG_MISC,
11075e8351deSBard Liao 	RT5670_IF1_ADC1_IN2_SFT, rt5670_if1_adc1_in2_src);
11085e8351deSBard Liao 
11095e8351deSBard Liao static const struct snd_kcontrol_new rt5670_if1_adc1_in2_mux =
11105e8351deSBard Liao 	SOC_DAPM_ENUM("IF1 ADC1 IN2 source", rt5670_if1_adc1_in2_enum);
11115e8351deSBard Liao 
11125e8351deSBard Liao /* MX-FA [10] */
11135e8351deSBard Liao static const char * const rt5670_if1_adc2_in1_src[] = {
11145e8351deSBard Liao 	"IF1_ADC2_IN", "IF1_ADC4"
11155e8351deSBard Liao };
11165e8351deSBard Liao 
111701957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_if1_adc2_in1_enum, RT5670_DIG_MISC,
11185e8351deSBard Liao 	RT5670_IF1_ADC2_IN1_SFT, rt5670_if1_adc2_in1_src);
11195e8351deSBard Liao 
11205e8351deSBard Liao static const struct snd_kcontrol_new rt5670_if1_adc2_in1_mux =
11215e8351deSBard Liao 	SOC_DAPM_ENUM("IF1 ADC2 IN1 source", rt5670_if1_adc2_in1_enum);
11225e8351deSBard Liao 
11235e8351deSBard Liao /* MX-9D [9:8] */
11245e8351deSBard Liao static const char * const rt5670_vad_adc_src[] = {
11255e8351deSBard Liao 	"Sto1 ADC L", "Mono ADC L", "Mono ADC R", "Sto2 ADC L"
11265e8351deSBard Liao };
11275e8351deSBard Liao 
112801957572SMark Brown static SOC_ENUM_SINGLE_DECL(rt5670_vad_adc_enum, RT5670_VAD_CTRL4,
11295e8351deSBard Liao 	RT5670_VAD_SEL_SFT, rt5670_vad_adc_src);
11305e8351deSBard Liao 
11315e8351deSBard Liao static const struct snd_kcontrol_new rt5670_vad_adc_mux =
11325e8351deSBard Liao 	SOC_DAPM_ENUM("VAD ADC source", rt5670_vad_adc_enum);
11335e8351deSBard Liao 
11345e8351deSBard Liao static int rt5670_hp_power_event(struct snd_soc_dapm_widget *w,
11355e8351deSBard Liao 			   struct snd_kcontrol *kcontrol, int event)
11365e8351deSBard Liao {
11375e8351deSBard Liao 	struct snd_soc_codec *codec = w->codec;
11385e8351deSBard Liao 	struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec);
11395e8351deSBard Liao 
11405e8351deSBard Liao 	switch (event) {
11415e8351deSBard Liao 	case SND_SOC_DAPM_POST_PMU:
11425e8351deSBard Liao 		regmap_update_bits(rt5670->regmap, RT5670_CHARGE_PUMP,
11435e8351deSBard Liao 			RT5670_PM_HP_MASK, RT5670_PM_HP_HV);
11445e8351deSBard Liao 		regmap_update_bits(rt5670->regmap, RT5670_GEN_CTRL2,
11455e8351deSBard Liao 			0x0400, 0x0400);
11465e8351deSBard Liao 		/* headphone amp power on */
11475e8351deSBard Liao 		regmap_update_bits(rt5670->regmap, RT5670_PWR_ANLG1,
11485e8351deSBard Liao 			RT5670_PWR_HA |	RT5670_PWR_FV1 |
11495e8351deSBard Liao 			RT5670_PWR_FV2,	RT5670_PWR_HA |
11505e8351deSBard Liao 			RT5670_PWR_FV1 | RT5670_PWR_FV2);
11515e8351deSBard Liao 		/* depop parameters */
11525e8351deSBard Liao 		regmap_write(rt5670->regmap, RT5670_DEPOP_M2, 0x3100);
11535e8351deSBard Liao 		regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x8009);
11545e8351deSBard Liao 		regmap_write(rt5670->regmap, RT5670_PR_BASE +
11555e8351deSBard Liao 			RT5670_HP_DCC_INT1, 0x9f00);
11565e8351deSBard Liao 		mdelay(20);
11575e8351deSBard Liao 		regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x8019);
11585e8351deSBard Liao 		break;
11595e8351deSBard Liao 	case SND_SOC_DAPM_PRE_PMD:
11605e8351deSBard Liao 		regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x0004);
11615e8351deSBard Liao 		msleep(30);
11625e8351deSBard Liao 		break;
11635e8351deSBard Liao 	default:
11645e8351deSBard Liao 		return 0;
11655e8351deSBard Liao 	}
11665e8351deSBard Liao 
11675e8351deSBard Liao 	return 0;
11685e8351deSBard Liao }
11695e8351deSBard Liao 
11705e8351deSBard Liao static int rt5670_hp_event(struct snd_soc_dapm_widget *w,
11715e8351deSBard Liao 	struct snd_kcontrol *kcontrol, int event)
11725e8351deSBard Liao {
11735e8351deSBard Liao 	struct snd_soc_codec *codec = w->codec;
11745e8351deSBard Liao 	struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec);
11755e8351deSBard Liao 
11765e8351deSBard Liao 	switch (event) {
11775e8351deSBard Liao 	case SND_SOC_DAPM_POST_PMU:
11785e8351deSBard Liao 		/* headphone unmute sequence */
11795e8351deSBard Liao 		regmap_write(rt5670->regmap, RT5670_PR_BASE +
11805e8351deSBard Liao 				RT5670_MAMP_INT_REG2, 0xb400);
11815e8351deSBard Liao 		regmap_write(rt5670->regmap, RT5670_DEPOP_M3, 0x0772);
11825e8351deSBard Liao 		regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x805d);
11835e8351deSBard Liao 		regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x831d);
11845e8351deSBard Liao 		regmap_update_bits(rt5670->regmap, RT5670_GEN_CTRL2,
11855e8351deSBard Liao 				0x0300, 0x0300);
11865e8351deSBard Liao 		regmap_update_bits(rt5670->regmap, RT5670_HP_VOL,
11875e8351deSBard Liao 			RT5670_L_MUTE | RT5670_R_MUTE, 0);
11885e8351deSBard Liao 		msleep(80);
11895e8351deSBard Liao 		regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x8019);
11905e8351deSBard Liao 		break;
11915e8351deSBard Liao 
11925e8351deSBard Liao 	case SND_SOC_DAPM_PRE_PMD:
11935e8351deSBard Liao 		/* headphone mute sequence */
11945e8351deSBard Liao 		regmap_write(rt5670->regmap, RT5670_PR_BASE +
11955e8351deSBard Liao 				RT5670_MAMP_INT_REG2, 0xb400);
11965e8351deSBard Liao 		regmap_write(rt5670->regmap, RT5670_DEPOP_M3, 0x0772);
11975e8351deSBard Liao 		regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x803d);
11985e8351deSBard Liao 		mdelay(10);
11995e8351deSBard Liao 		regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x831d);
12005e8351deSBard Liao 		mdelay(10);
12015e8351deSBard Liao 		regmap_update_bits(rt5670->regmap, RT5670_HP_VOL,
12025e8351deSBard Liao 				   RT5670_L_MUTE | RT5670_R_MUTE,
12035e8351deSBard Liao 				   RT5670_L_MUTE | RT5670_R_MUTE);
12045e8351deSBard Liao 		msleep(20);
12055e8351deSBard Liao 		regmap_update_bits(rt5670->regmap,
12065e8351deSBard Liao 				   RT5670_GEN_CTRL2, 0x0300, 0x0);
12075e8351deSBard Liao 		regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x8019);
12085e8351deSBard Liao 		regmap_write(rt5670->regmap, RT5670_DEPOP_M3, 0x0707);
12095e8351deSBard Liao 		regmap_write(rt5670->regmap, RT5670_PR_BASE +
12105e8351deSBard Liao 				RT5670_MAMP_INT_REG2, 0xfc00);
12115e8351deSBard Liao 		break;
12125e8351deSBard Liao 
12135e8351deSBard Liao 	default:
12145e8351deSBard Liao 		return 0;
12155e8351deSBard Liao 	}
12165e8351deSBard Liao 
12175e8351deSBard Liao 	return 0;
12185e8351deSBard Liao }
12195e8351deSBard Liao 
12205e8351deSBard Liao static int rt5670_bst1_event(struct snd_soc_dapm_widget *w,
12215e8351deSBard Liao 	struct snd_kcontrol *kcontrol, int event)
12225e8351deSBard Liao {
12235e8351deSBard Liao 	struct snd_soc_codec *codec = w->codec;
12245e8351deSBard Liao 
12255e8351deSBard Liao 	switch (event) {
12265e8351deSBard Liao 	case SND_SOC_DAPM_POST_PMU:
12275e8351deSBard Liao 		snd_soc_update_bits(codec, RT5670_PWR_ANLG2,
12285e8351deSBard Liao 				    RT5670_PWR_BST1_P, RT5670_PWR_BST1_P);
12295e8351deSBard Liao 		break;
12305e8351deSBard Liao 
12315e8351deSBard Liao 	case SND_SOC_DAPM_PRE_PMD:
12325e8351deSBard Liao 		snd_soc_update_bits(codec, RT5670_PWR_ANLG2,
12335e8351deSBard Liao 				    RT5670_PWR_BST1_P, 0);
12345e8351deSBard Liao 		break;
12355e8351deSBard Liao 
12365e8351deSBard Liao 	default:
12375e8351deSBard Liao 		return 0;
12385e8351deSBard Liao 	}
12395e8351deSBard Liao 
12405e8351deSBard Liao 	return 0;
12415e8351deSBard Liao }
12425e8351deSBard Liao 
12435e8351deSBard Liao static int rt5670_bst2_event(struct snd_soc_dapm_widget *w,
12445e8351deSBard Liao 	struct snd_kcontrol *kcontrol, int event)
12455e8351deSBard Liao {
12465e8351deSBard Liao 	struct snd_soc_codec *codec = w->codec;
12475e8351deSBard Liao 
12485e8351deSBard Liao 	switch (event) {
12495e8351deSBard Liao 	case SND_SOC_DAPM_POST_PMU:
12505e8351deSBard Liao 		snd_soc_update_bits(codec, RT5670_PWR_ANLG2,
12515e8351deSBard Liao 				    RT5670_PWR_BST2_P, RT5670_PWR_BST2_P);
12525e8351deSBard Liao 		break;
12535e8351deSBard Liao 
12545e8351deSBard Liao 	case SND_SOC_DAPM_PRE_PMD:
12555e8351deSBard Liao 		snd_soc_update_bits(codec, RT5670_PWR_ANLG2,
12565e8351deSBard Liao 				    RT5670_PWR_BST2_P, 0);
12575e8351deSBard Liao 		break;
12585e8351deSBard Liao 
12595e8351deSBard Liao 	default:
12605e8351deSBard Liao 		return 0;
12615e8351deSBard Liao 	}
12625e8351deSBard Liao 
12635e8351deSBard Liao 	return 0;
12645e8351deSBard Liao }
12655e8351deSBard Liao 
12665e8351deSBard Liao static const struct snd_soc_dapm_widget rt5670_dapm_widgets[] = {
12675e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY("PLL1", RT5670_PWR_ANLG2,
12685e8351deSBard Liao 			    RT5670_PWR_PLL_BIT, 0, NULL, 0),
12695e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY("I2S DSP", RT5670_PWR_DIG2,
12705e8351deSBard Liao 			    RT5670_PWR_I2S_DSP_BIT, 0, NULL, 0),
12715e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY("Mic Det Power", RT5670_PWR_VOL,
12725e8351deSBard Liao 			    RT5670_PWR_MIC_DET_BIT, 0, NULL, 0),
12735e8351deSBard Liao 
12745e8351deSBard Liao 	/* ASRC */
12755e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY_S("I2S1 ASRC", 1, RT5670_ASRC_1,
12765e8351deSBard Liao 			      11, 0, NULL, 0),
12775e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY_S("I2S2 ASRC", 1, RT5670_ASRC_1,
12785e8351deSBard Liao 			      12, 0, NULL, 0),
12795e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY_S("DAC STO ASRC", 1, RT5670_ASRC_1,
12805e8351deSBard Liao 			      10, 0, NULL, 0),
12815e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY_S("DAC MONO L ASRC", 1, RT5670_ASRC_1,
12825e8351deSBard Liao 			      9, 0, NULL, 0),
12835e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY_S("DAC MONO R ASRC", 1, RT5670_ASRC_1,
12845e8351deSBard Liao 			      8, 0, NULL, 0),
12855e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY_S("ADC STO1 ASRC", 1, RT5670_ASRC_1,
12865e8351deSBard Liao 			      3, 0, NULL, 0),
12875e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY_S("ADC STO2 ASRC", 1, RT5670_ASRC_1,
12885e8351deSBard Liao 			      2, 0, NULL, 0),
12895e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY_S("ADC MONO L ASRC", 1, RT5670_ASRC_1,
12905e8351deSBard Liao 			      1, 0, NULL, 0),
12915e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY_S("ADC MONO R ASRC", 1, RT5670_ASRC_1,
12925e8351deSBard Liao 			      0, 0, NULL, 0),
12935e8351deSBard Liao 
12945e8351deSBard Liao 	/* Input Side */
12955e8351deSBard Liao 	/* micbias */
12965e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY("MICBIAS1", RT5670_PWR_ANLG2,
12975e8351deSBard Liao 			     RT5670_PWR_MB1_BIT, 0, NULL, 0),
12985e8351deSBard Liao 
12995e8351deSBard Liao 	/* Input Lines */
13005e8351deSBard Liao 	SND_SOC_DAPM_INPUT("DMIC L1"),
13015e8351deSBard Liao 	SND_SOC_DAPM_INPUT("DMIC R1"),
13025e8351deSBard Liao 	SND_SOC_DAPM_INPUT("DMIC L2"),
13035e8351deSBard Liao 	SND_SOC_DAPM_INPUT("DMIC R2"),
13045e8351deSBard Liao 	SND_SOC_DAPM_INPUT("DMIC L3"),
13055e8351deSBard Liao 	SND_SOC_DAPM_INPUT("DMIC R3"),
13065e8351deSBard Liao 
13075e8351deSBard Liao 	SND_SOC_DAPM_INPUT("IN1P"),
13085e8351deSBard Liao 	SND_SOC_DAPM_INPUT("IN1N"),
13095e8351deSBard Liao 	SND_SOC_DAPM_INPUT("IN2P"),
13105e8351deSBard Liao 	SND_SOC_DAPM_INPUT("IN2N"),
13115e8351deSBard Liao 
13125e8351deSBard Liao 	SND_SOC_DAPM_PGA("DMIC1", SND_SOC_NOPM, 0, 0, NULL, 0),
13135e8351deSBard Liao 	SND_SOC_DAPM_PGA("DMIC2", SND_SOC_NOPM, 0, 0, NULL, 0),
13145e8351deSBard Liao 	SND_SOC_DAPM_PGA("DMIC3", SND_SOC_NOPM, 0, 0, NULL, 0),
13155e8351deSBard Liao 
13165e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY("DMIC CLK", SND_SOC_NOPM, 0, 0,
13175e8351deSBard Liao 			    set_dmic_clk, SND_SOC_DAPM_PRE_PMU),
13185e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY("DMIC1 Power", RT5670_DMIC_CTRL1,
13195e8351deSBard Liao 			    RT5670_DMIC_1_EN_SFT, 0, NULL, 0),
13205e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY("DMIC2 Power", RT5670_DMIC_CTRL1,
13215e8351deSBard Liao 			    RT5670_DMIC_2_EN_SFT, 0, NULL, 0),
13225e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY("DMIC3 Power", RT5670_DMIC_CTRL1,
13235e8351deSBard Liao 			    RT5670_DMIC_3_EN_SFT, 0, NULL, 0),
13245e8351deSBard Liao 	/* Boost */
13255e8351deSBard Liao 	SND_SOC_DAPM_PGA_E("BST1", RT5670_PWR_ANLG2, RT5670_PWR_BST1_BIT,
13265e8351deSBard Liao 			   0, NULL, 0, rt5670_bst1_event,
13275e8351deSBard Liao 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
13285e8351deSBard Liao 	SND_SOC_DAPM_PGA_E("BST2", RT5670_PWR_ANLG2, RT5670_PWR_BST2_BIT,
13295e8351deSBard Liao 			   0, NULL, 0, rt5670_bst2_event,
13305e8351deSBard Liao 			   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
13315e8351deSBard Liao 	/* Input Volume */
13325e8351deSBard Liao 	SND_SOC_DAPM_PGA("INL VOL", RT5670_PWR_VOL,
13335e8351deSBard Liao 			 RT5670_PWR_IN_L_BIT, 0, NULL, 0),
13345e8351deSBard Liao 	SND_SOC_DAPM_PGA("INR VOL", RT5670_PWR_VOL,
13355e8351deSBard Liao 			 RT5670_PWR_IN_R_BIT, 0, NULL, 0),
13365e8351deSBard Liao 
13375e8351deSBard Liao 	/* REC Mixer */
13385e8351deSBard Liao 	SND_SOC_DAPM_MIXER("RECMIXL", RT5670_PWR_MIXER, RT5670_PWR_RM_L_BIT, 0,
13395e8351deSBard Liao 			   rt5670_rec_l_mix, ARRAY_SIZE(rt5670_rec_l_mix)),
13405e8351deSBard Liao 	SND_SOC_DAPM_MIXER("RECMIXR", RT5670_PWR_MIXER, RT5670_PWR_RM_R_BIT, 0,
13415e8351deSBard Liao 			   rt5670_rec_r_mix, ARRAY_SIZE(rt5670_rec_r_mix)),
13425e8351deSBard Liao 	/* ADCs */
13435e8351deSBard Liao 	SND_SOC_DAPM_ADC("ADC 1", NULL, SND_SOC_NOPM, 0, 0),
13445e8351deSBard Liao 	SND_SOC_DAPM_ADC("ADC 2", NULL, SND_SOC_NOPM, 0, 0),
13455e8351deSBard Liao 
13465e8351deSBard Liao 	SND_SOC_DAPM_PGA("ADC 1_2", SND_SOC_NOPM, 0, 0, NULL, 0),
13475e8351deSBard Liao 
13485e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY("ADC 1 power", RT5670_PWR_DIG1,
13495e8351deSBard Liao 			    RT5670_PWR_ADC_L_BIT, 0, NULL, 0),
13505e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY("ADC 2 power", RT5670_PWR_DIG1,
13515e8351deSBard Liao 			    RT5670_PWR_ADC_R_BIT, 0, NULL, 0),
13525e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY("ADC clock", RT5670_PR_BASE +
13535e8351deSBard Liao 			    RT5670_CHOP_DAC_ADC, 12, 0, NULL, 0),
13545e8351deSBard Liao 	/* ADC Mux */
13555e8351deSBard Liao 	SND_SOC_DAPM_MUX("Stereo1 DMIC Mux", SND_SOC_NOPM, 0, 0,
13565e8351deSBard Liao 			 &rt5670_sto1_dmic_mux),
13575e8351deSBard Liao 	SND_SOC_DAPM_MUX("Stereo1 ADC L2 Mux", SND_SOC_NOPM, 0, 0,
13585e8351deSBard Liao 			 &rt5670_sto_adc_l2_mux),
13595e8351deSBard Liao 	SND_SOC_DAPM_MUX("Stereo1 ADC R2 Mux", SND_SOC_NOPM, 0, 0,
13605e8351deSBard Liao 			 &rt5670_sto_adc_r2_mux),
13615e8351deSBard Liao 	SND_SOC_DAPM_MUX("Stereo1 ADC L1 Mux", SND_SOC_NOPM, 0, 0,
13625e8351deSBard Liao 			 &rt5670_sto_adc_l1_mux),
13635e8351deSBard Liao 	SND_SOC_DAPM_MUX("Stereo1 ADC R1 Mux", SND_SOC_NOPM, 0, 0,
13645e8351deSBard Liao 			 &rt5670_sto_adc_r1_mux),
13655e8351deSBard Liao 	SND_SOC_DAPM_MUX("Stereo2 DMIC Mux", SND_SOC_NOPM, 0, 0,
13665e8351deSBard Liao 			 &rt5670_sto2_dmic_mux),
13675e8351deSBard Liao 	SND_SOC_DAPM_MUX("Stereo2 ADC L2 Mux", SND_SOC_NOPM, 0, 0,
13685e8351deSBard Liao 			 &rt5670_sto2_adc_l2_mux),
13695e8351deSBard Liao 	SND_SOC_DAPM_MUX("Stereo2 ADC R2 Mux", SND_SOC_NOPM, 0, 0,
13705e8351deSBard Liao 			 &rt5670_sto2_adc_r2_mux),
13715e8351deSBard Liao 	SND_SOC_DAPM_MUX("Stereo2 ADC L1 Mux", SND_SOC_NOPM, 0, 0,
13725e8351deSBard Liao 			 &rt5670_sto2_adc_l1_mux),
13735e8351deSBard Liao 	SND_SOC_DAPM_MUX("Stereo2 ADC R1 Mux", SND_SOC_NOPM, 0, 0,
13745e8351deSBard Liao 			 &rt5670_sto2_adc_r1_mux),
13755e8351deSBard Liao 	SND_SOC_DAPM_MUX("Stereo2 ADC LR Mux", SND_SOC_NOPM, 0, 0,
13765e8351deSBard Liao 			 &rt5670_sto2_adc_lr_mux),
13775e8351deSBard Liao 	SND_SOC_DAPM_MUX("Mono DMIC L Mux", SND_SOC_NOPM, 0, 0,
13785e8351deSBard Liao 			 &rt5670_mono_dmic_l_mux),
13795e8351deSBard Liao 	SND_SOC_DAPM_MUX("Mono DMIC R Mux", SND_SOC_NOPM, 0, 0,
13805e8351deSBard Liao 			 &rt5670_mono_dmic_r_mux),
13815e8351deSBard Liao 	SND_SOC_DAPM_MUX("Mono ADC L2 Mux", SND_SOC_NOPM, 0, 0,
13825e8351deSBard Liao 			 &rt5670_mono_adc_l2_mux),
13835e8351deSBard Liao 	SND_SOC_DAPM_MUX("Mono ADC L1 Mux", SND_SOC_NOPM, 0, 0,
13845e8351deSBard Liao 			 &rt5670_mono_adc_l1_mux),
13855e8351deSBard Liao 	SND_SOC_DAPM_MUX("Mono ADC R1 Mux", SND_SOC_NOPM, 0, 0,
13865e8351deSBard Liao 			 &rt5670_mono_adc_r1_mux),
13875e8351deSBard Liao 	SND_SOC_DAPM_MUX("Mono ADC R2 Mux", SND_SOC_NOPM, 0, 0,
13885e8351deSBard Liao 			 &rt5670_mono_adc_r2_mux),
13895e8351deSBard Liao 	/* ADC Mixer */
13905e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY("ADC Stereo1 Filter", RT5670_PWR_DIG2,
13915e8351deSBard Liao 			    RT5670_PWR_ADC_S1F_BIT, 0, NULL, 0),
13925e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY("ADC Stereo2 Filter", RT5670_PWR_DIG2,
13935e8351deSBard Liao 			    RT5670_PWR_ADC_S2F_BIT, 0, NULL, 0),
13945e8351deSBard Liao 	SND_SOC_DAPM_MIXER("Sto1 ADC MIXL", RT5670_STO1_ADC_DIG_VOL,
13955e8351deSBard Liao 			   RT5670_L_MUTE_SFT, 1, rt5670_sto1_adc_l_mix,
13965e8351deSBard Liao 			   ARRAY_SIZE(rt5670_sto1_adc_l_mix)),
13975e8351deSBard Liao 	SND_SOC_DAPM_MIXER("Sto1 ADC MIXR", RT5670_STO1_ADC_DIG_VOL,
13985e8351deSBard Liao 			   RT5670_R_MUTE_SFT, 1, rt5670_sto1_adc_r_mix,
13995e8351deSBard Liao 			   ARRAY_SIZE(rt5670_sto1_adc_r_mix)),
14005e8351deSBard Liao 	SND_SOC_DAPM_MIXER("Sto2 ADC MIXL", SND_SOC_NOPM, 0, 0,
14015e8351deSBard Liao 			   rt5670_sto2_adc_l_mix,
14025e8351deSBard Liao 			   ARRAY_SIZE(rt5670_sto2_adc_l_mix)),
14035e8351deSBard Liao 	SND_SOC_DAPM_MIXER("Sto2 ADC MIXR", SND_SOC_NOPM, 0, 0,
14045e8351deSBard Liao 			   rt5670_sto2_adc_r_mix,
14055e8351deSBard Liao 			   ARRAY_SIZE(rt5670_sto2_adc_r_mix)),
14065e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY("ADC Mono Left Filter", RT5670_PWR_DIG2,
14075e8351deSBard Liao 			    RT5670_PWR_ADC_MF_L_BIT, 0, NULL, 0),
14085e8351deSBard Liao 	SND_SOC_DAPM_MIXER("Mono ADC MIXL", RT5670_MONO_ADC_DIG_VOL,
14095e8351deSBard Liao 			   RT5670_L_MUTE_SFT, 1, rt5670_mono_adc_l_mix,
14105e8351deSBard Liao 			   ARRAY_SIZE(rt5670_mono_adc_l_mix)),
14115e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY("ADC Mono Right Filter", RT5670_PWR_DIG2,
14125e8351deSBard Liao 			    RT5670_PWR_ADC_MF_R_BIT, 0, NULL, 0),
14135e8351deSBard Liao 	SND_SOC_DAPM_MIXER("Mono ADC MIXR", RT5670_MONO_ADC_DIG_VOL,
14145e8351deSBard Liao 			   RT5670_R_MUTE_SFT, 1, rt5670_mono_adc_r_mix,
14155e8351deSBard Liao 			   ARRAY_SIZE(rt5670_mono_adc_r_mix)),
14165e8351deSBard Liao 
14175e8351deSBard Liao 	/* ADC PGA */
14185e8351deSBard Liao 	SND_SOC_DAPM_PGA("Stereo1 ADC MIXL", SND_SOC_NOPM, 0, 0, NULL, 0),
14195e8351deSBard Liao 	SND_SOC_DAPM_PGA("Stereo1 ADC MIXR", SND_SOC_NOPM, 0, 0, NULL, 0),
14205e8351deSBard Liao 	SND_SOC_DAPM_PGA("Stereo2 ADC MIXL", SND_SOC_NOPM, 0, 0, NULL, 0),
14215e8351deSBard Liao 	SND_SOC_DAPM_PGA("Stereo2 ADC MIXR", SND_SOC_NOPM, 0, 0, NULL, 0),
14225e8351deSBard Liao 	SND_SOC_DAPM_PGA("Sto2 ADC LR MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
14235e8351deSBard Liao 	SND_SOC_DAPM_PGA("Stereo1 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
14245e8351deSBard Liao 	SND_SOC_DAPM_PGA("Stereo2 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
14255e8351deSBard Liao 	SND_SOC_DAPM_PGA("Mono ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
14265e8351deSBard Liao 	SND_SOC_DAPM_PGA("VAD_ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
14275e8351deSBard Liao 	SND_SOC_DAPM_PGA("IF_ADC1", SND_SOC_NOPM, 0, 0, NULL, 0),
14285e8351deSBard Liao 	SND_SOC_DAPM_PGA("IF_ADC2", SND_SOC_NOPM, 0, 0, NULL, 0),
14295e8351deSBard Liao 	SND_SOC_DAPM_PGA("IF_ADC3", SND_SOC_NOPM, 0, 0, NULL, 0),
14305e8351deSBard Liao 	SND_SOC_DAPM_PGA("IF1_ADC1", SND_SOC_NOPM, 0, 0, NULL, 0),
14315e8351deSBard Liao 	SND_SOC_DAPM_PGA("IF1_ADC2", SND_SOC_NOPM, 0, 0, NULL, 0),
14325e8351deSBard Liao 	SND_SOC_DAPM_PGA("IF1_ADC3", SND_SOC_NOPM, 0, 0, NULL, 0),
14335e8351deSBard Liao 	SND_SOC_DAPM_PGA("IF1_ADC4", SND_SOC_NOPM, 0, 0, NULL, 0),
14345e8351deSBard Liao 
14355e8351deSBard Liao 	/* DSP */
14365e8351deSBard Liao 	SND_SOC_DAPM_PGA("TxDP_ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
14375e8351deSBard Liao 	SND_SOC_DAPM_PGA("TxDP_ADC_L", SND_SOC_NOPM, 0, 0, NULL, 0),
14385e8351deSBard Liao 	SND_SOC_DAPM_PGA("TxDP_ADC_R", SND_SOC_NOPM, 0, 0, NULL, 0),
14395e8351deSBard Liao 	SND_SOC_DAPM_PGA("TxDC_DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
14405e8351deSBard Liao 
14415e8351deSBard Liao 	SND_SOC_DAPM_MUX("TDM Data Mux", SND_SOC_NOPM, 0, 0,
14425e8351deSBard Liao 			 &rt5670_txdp_slot_mux),
14435e8351deSBard Liao 
14445e8351deSBard Liao 	SND_SOC_DAPM_MUX("DSP UL Mux", SND_SOC_NOPM, 0, 0,
14455e8351deSBard Liao 			 &rt5670_dsp_ul_mux),
14465e8351deSBard Liao 	SND_SOC_DAPM_MUX("DSP DL Mux", SND_SOC_NOPM, 0, 0,
14475e8351deSBard Liao 			 &rt5670_dsp_dl_mux),
14485e8351deSBard Liao 
14495e8351deSBard Liao 	SND_SOC_DAPM_MUX("RxDP Mux", SND_SOC_NOPM, 0, 0,
14505e8351deSBard Liao 			 &rt5670_rxdp_mux),
14515e8351deSBard Liao 
14525e8351deSBard Liao 	/* IF2 Mux */
14535e8351deSBard Liao 	SND_SOC_DAPM_MUX("IF2 ADC Mux", SND_SOC_NOPM, 0, 0,
14545e8351deSBard Liao 			 &rt5670_if2_adc_in_mux),
14555e8351deSBard Liao 
14565e8351deSBard Liao 	/* Digital Interface */
14575e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY("I2S1", RT5670_PWR_DIG1,
14585e8351deSBard Liao 			    RT5670_PWR_I2S1_BIT, 0, NULL, 0),
14595e8351deSBard Liao 	SND_SOC_DAPM_PGA("IF1 DAC1", SND_SOC_NOPM, 0, 0, NULL, 0),
14605e8351deSBard Liao 	SND_SOC_DAPM_PGA("IF1 DAC2", SND_SOC_NOPM, 0, 0, NULL, 0),
14615e8351deSBard Liao 	SND_SOC_DAPM_PGA("IF1 DAC1 L", SND_SOC_NOPM, 0, 0, NULL, 0),
14625e8351deSBard Liao 	SND_SOC_DAPM_PGA("IF1 DAC1 R", SND_SOC_NOPM, 0, 0, NULL, 0),
14635e8351deSBard Liao 	SND_SOC_DAPM_PGA("IF1 DAC2 L", SND_SOC_NOPM, 0, 0, NULL, 0),
14645e8351deSBard Liao 	SND_SOC_DAPM_PGA("IF1 DAC2 R", SND_SOC_NOPM, 0, 0, NULL, 0),
14655e8351deSBard Liao 	SND_SOC_DAPM_PGA("IF1 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
14665e8351deSBard Liao 	SND_SOC_DAPM_PGA("IF1 ADC L", SND_SOC_NOPM, 0, 0, NULL, 0),
14675e8351deSBard Liao 	SND_SOC_DAPM_PGA("IF1 ADC R", SND_SOC_NOPM, 0, 0, NULL, 0),
14685e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY("I2S2", RT5670_PWR_DIG1,
14695e8351deSBard Liao 			    RT5670_PWR_I2S2_BIT, 0, NULL, 0),
14705e8351deSBard Liao 	SND_SOC_DAPM_PGA("IF2 DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
14715e8351deSBard Liao 	SND_SOC_DAPM_PGA("IF2 DAC L", SND_SOC_NOPM, 0, 0, NULL, 0),
14725e8351deSBard Liao 	SND_SOC_DAPM_PGA("IF2 DAC R", SND_SOC_NOPM, 0, 0, NULL, 0),
14735e8351deSBard Liao 	SND_SOC_DAPM_PGA("IF2 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
14745e8351deSBard Liao 	SND_SOC_DAPM_PGA("IF2 ADC L", SND_SOC_NOPM, 0, 0, NULL, 0),
14755e8351deSBard Liao 	SND_SOC_DAPM_PGA("IF2 ADC R", SND_SOC_NOPM, 0, 0, NULL, 0),
14765e8351deSBard Liao 
14775e8351deSBard Liao 	/* Digital Interface Select */
14785e8351deSBard Liao 	SND_SOC_DAPM_MUX("IF1 ADC1 IN1 Mux", SND_SOC_NOPM, 0, 0,
14795e8351deSBard Liao 			 &rt5670_if1_adc1_in1_mux),
14805e8351deSBard Liao 	SND_SOC_DAPM_MUX("IF1 ADC1 IN2 Mux", SND_SOC_NOPM, 0, 0,
14815e8351deSBard Liao 			 &rt5670_if1_adc1_in2_mux),
14825e8351deSBard Liao 	SND_SOC_DAPM_MUX("IF1 ADC2 IN Mux", SND_SOC_NOPM, 0, 0,
14835e8351deSBard Liao 			 &rt5670_if1_adc2_in_mux),
14845e8351deSBard Liao 	SND_SOC_DAPM_MUX("IF1 ADC2 IN1 Mux", SND_SOC_NOPM, 0, 0,
14855e8351deSBard Liao 			 &rt5670_if1_adc2_in1_mux),
14865e8351deSBard Liao 	SND_SOC_DAPM_MUX("VAD ADC Mux", SND_SOC_NOPM, 0, 0,
14875e8351deSBard Liao 			 &rt5670_vad_adc_mux),
14885e8351deSBard Liao 
14895e8351deSBard Liao 	/* Audio Interface */
14905e8351deSBard Liao 	SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0),
14915e8351deSBard Liao 	SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0),
14925e8351deSBard Liao 	SND_SOC_DAPM_AIF_IN("AIF2RX", "AIF2 Playback", 0, SND_SOC_NOPM, 0, 0),
14935e8351deSBard Liao 	SND_SOC_DAPM_AIF_OUT("AIF2TX", "AIF2 Capture", 0,
14945e8351deSBard Liao 			     RT5670_GPIO_CTRL1, RT5670_I2S2_PIN_SFT, 1),
14955e8351deSBard Liao 
14965e8351deSBard Liao 	/* Audio DSP */
14975e8351deSBard Liao 	SND_SOC_DAPM_PGA("Audio DSP", SND_SOC_NOPM, 0, 0, NULL, 0),
14985e8351deSBard Liao 
14995e8351deSBard Liao 	/* Output Side */
15005e8351deSBard Liao 	/* DAC mixer before sound effect  */
15015e8351deSBard Liao 	SND_SOC_DAPM_MIXER("DAC1 MIXL", SND_SOC_NOPM, 0, 0,
15025e8351deSBard Liao 			   rt5670_dac_l_mix, ARRAY_SIZE(rt5670_dac_l_mix)),
15035e8351deSBard Liao 	SND_SOC_DAPM_MIXER("DAC1 MIXR", SND_SOC_NOPM, 0, 0,
15045e8351deSBard Liao 			   rt5670_dac_r_mix, ARRAY_SIZE(rt5670_dac_r_mix)),
15055e8351deSBard Liao 	SND_SOC_DAPM_PGA("DAC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
15065e8351deSBard Liao 
15075e8351deSBard Liao 	/* DAC2 channel Mux */
15085e8351deSBard Liao 	SND_SOC_DAPM_MUX("DAC L2 Mux", SND_SOC_NOPM, 0, 0,
15095e8351deSBard Liao 			 &rt5670_dac_l2_mux),
15105e8351deSBard Liao 	SND_SOC_DAPM_MUX("DAC R2 Mux", SND_SOC_NOPM, 0, 0,
15115e8351deSBard Liao 			 &rt5670_dac_r2_mux),
15125e8351deSBard Liao 	SND_SOC_DAPM_PGA("DAC L2 Volume", RT5670_PWR_DIG1,
15135e8351deSBard Liao 			 RT5670_PWR_DAC_L2_BIT, 0, NULL, 0),
15145e8351deSBard Liao 	SND_SOC_DAPM_PGA("DAC R2 Volume", RT5670_PWR_DIG1,
15155e8351deSBard Liao 			 RT5670_PWR_DAC_R2_BIT, 0, NULL, 0),
15165e8351deSBard Liao 
15175e8351deSBard Liao 	SND_SOC_DAPM_MUX("DAC1 L Mux", SND_SOC_NOPM, 0, 0, &rt5670_dac1l_mux),
15185e8351deSBard Liao 	SND_SOC_DAPM_MUX("DAC1 R Mux", SND_SOC_NOPM, 0, 0, &rt5670_dac1r_mux),
15195e8351deSBard Liao 
15205e8351deSBard Liao 	/* DAC Mixer */
15215e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY("DAC Stereo1 Filter", RT5670_PWR_DIG2,
15225e8351deSBard Liao 			    RT5670_PWR_DAC_S1F_BIT, 0, NULL, 0),
15235e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY("DAC Mono Left Filter", RT5670_PWR_DIG2,
15245e8351deSBard Liao 			    RT5670_PWR_DAC_MF_L_BIT, 0, NULL, 0),
15255e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY("DAC Mono Right Filter", RT5670_PWR_DIG2,
15265e8351deSBard Liao 			    RT5670_PWR_DAC_MF_R_BIT, 0, NULL, 0),
15275e8351deSBard Liao 	SND_SOC_DAPM_MIXER("Stereo DAC MIXL", SND_SOC_NOPM, 0, 0,
15285e8351deSBard Liao 			   rt5670_sto_dac_l_mix,
15295e8351deSBard Liao 			   ARRAY_SIZE(rt5670_sto_dac_l_mix)),
15305e8351deSBard Liao 	SND_SOC_DAPM_MIXER("Stereo DAC MIXR", SND_SOC_NOPM, 0, 0,
15315e8351deSBard Liao 			   rt5670_sto_dac_r_mix,
15325e8351deSBard Liao 			   ARRAY_SIZE(rt5670_sto_dac_r_mix)),
15335e8351deSBard Liao 	SND_SOC_DAPM_MIXER("Mono DAC MIXL", SND_SOC_NOPM, 0, 0,
15345e8351deSBard Liao 			   rt5670_mono_dac_l_mix,
15355e8351deSBard Liao 			   ARRAY_SIZE(rt5670_mono_dac_l_mix)),
15365e8351deSBard Liao 	SND_SOC_DAPM_MIXER("Mono DAC MIXR", SND_SOC_NOPM, 0, 0,
15375e8351deSBard Liao 			   rt5670_mono_dac_r_mix,
15385e8351deSBard Liao 			   ARRAY_SIZE(rt5670_mono_dac_r_mix)),
15395e8351deSBard Liao 	SND_SOC_DAPM_MIXER("DAC MIXL", SND_SOC_NOPM, 0, 0,
15405e8351deSBard Liao 			   rt5670_dig_l_mix,
15415e8351deSBard Liao 			   ARRAY_SIZE(rt5670_dig_l_mix)),
15425e8351deSBard Liao 	SND_SOC_DAPM_MIXER("DAC MIXR", SND_SOC_NOPM, 0, 0,
15435e8351deSBard Liao 			   rt5670_dig_r_mix,
15445e8351deSBard Liao 			   ARRAY_SIZE(rt5670_dig_r_mix)),
15455e8351deSBard Liao 
15465e8351deSBard Liao 	/* DACs */
15475e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY("DAC L1 Power", RT5670_PWR_DIG1,
15485e8351deSBard Liao 			    RT5670_PWR_DAC_L1_BIT, 0, NULL, 0),
15495e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY("DAC R1 Power", RT5670_PWR_DIG1,
15505e8351deSBard Liao 			    RT5670_PWR_DAC_R1_BIT, 0, NULL, 0),
15515e8351deSBard Liao 	SND_SOC_DAPM_DAC("DAC L1", NULL, SND_SOC_NOPM, 0, 0),
15525e8351deSBard Liao 	SND_SOC_DAPM_DAC("DAC R1", NULL, SND_SOC_NOPM, 0, 0),
15535e8351deSBard Liao 	SND_SOC_DAPM_DAC("DAC L2", NULL, RT5670_PWR_DIG1,
15545e8351deSBard Liao 			 RT5670_PWR_DAC_L2_BIT, 0),
15555e8351deSBard Liao 
15565e8351deSBard Liao 	SND_SOC_DAPM_DAC("DAC R2", NULL, RT5670_PWR_DIG1,
15575e8351deSBard Liao 			 RT5670_PWR_DAC_R2_BIT, 0),
15585e8351deSBard Liao 	/* OUT Mixer */
15595e8351deSBard Liao 
15605e8351deSBard Liao 	SND_SOC_DAPM_MIXER("OUT MIXL", RT5670_PWR_MIXER, RT5670_PWR_OM_L_BIT,
15615e8351deSBard Liao 			   0, rt5670_out_l_mix, ARRAY_SIZE(rt5670_out_l_mix)),
15625e8351deSBard Liao 	SND_SOC_DAPM_MIXER("OUT MIXR", RT5670_PWR_MIXER, RT5670_PWR_OM_R_BIT,
15635e8351deSBard Liao 			   0, rt5670_out_r_mix, ARRAY_SIZE(rt5670_out_r_mix)),
15645e8351deSBard Liao 	/* Ouput Volume */
15655e8351deSBard Liao 	SND_SOC_DAPM_MIXER("HPOVOL MIXL", RT5670_PWR_VOL,
15665e8351deSBard Liao 			   RT5670_PWR_HV_L_BIT, 0,
15675e8351deSBard Liao 			   rt5670_hpvoll_mix, ARRAY_SIZE(rt5670_hpvoll_mix)),
15685e8351deSBard Liao 	SND_SOC_DAPM_MIXER("HPOVOL MIXR", RT5670_PWR_VOL,
15695e8351deSBard Liao 			   RT5670_PWR_HV_R_BIT, 0,
15705e8351deSBard Liao 			   rt5670_hpvolr_mix, ARRAY_SIZE(rt5670_hpvolr_mix)),
15715e8351deSBard Liao 	SND_SOC_DAPM_PGA("DAC 1", SND_SOC_NOPM, 0, 0, NULL, 0),
15725e8351deSBard Liao 	SND_SOC_DAPM_PGA("DAC 2", SND_SOC_NOPM,	0, 0, NULL, 0),
15735e8351deSBard Liao 	SND_SOC_DAPM_PGA("HPOVOL", SND_SOC_NOPM, 0, 0, NULL, 0),
15745e8351deSBard Liao 
15755e8351deSBard Liao 	/* HPO/LOUT/Mono Mixer */
15765e8351deSBard Liao 	SND_SOC_DAPM_MIXER("HPO MIX", SND_SOC_NOPM, 0, 0,
15775e8351deSBard Liao 			   rt5670_hpo_mix, ARRAY_SIZE(rt5670_hpo_mix)),
15785e8351deSBard Liao 	SND_SOC_DAPM_MIXER("LOUT MIX", RT5670_PWR_ANLG1, RT5670_PWR_LM_BIT,
15795e8351deSBard Liao 			   0, rt5670_lout_mix, ARRAY_SIZE(rt5670_lout_mix)),
15805e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY_S("Improve HP Amp Drv", 1, SND_SOC_NOPM, 0, 0,
15815e8351deSBard Liao 			      rt5670_hp_power_event, SND_SOC_DAPM_POST_PMU |
15825e8351deSBard Liao 			      SND_SOC_DAPM_PRE_PMD),
15835e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY("HP L Amp", RT5670_PWR_ANLG1,
15845e8351deSBard Liao 			    RT5670_PWR_HP_L_BIT, 0, NULL, 0),
15855e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY("HP R Amp", RT5670_PWR_ANLG1,
15865e8351deSBard Liao 			    RT5670_PWR_HP_R_BIT, 0, NULL, 0),
15875e8351deSBard Liao 	SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0,
15885e8351deSBard Liao 			   rt5670_hp_event, SND_SOC_DAPM_PRE_PMD |
15895e8351deSBard Liao 			   SND_SOC_DAPM_POST_PMU),
15905e8351deSBard Liao 	SND_SOC_DAPM_SWITCH("LOUT L Playback", SND_SOC_NOPM, 0, 0,
15915e8351deSBard Liao 			    &lout_l_enable_control),
15925e8351deSBard Liao 	SND_SOC_DAPM_SWITCH("LOUT R Playback", SND_SOC_NOPM, 0, 0,
15935e8351deSBard Liao 			    &lout_r_enable_control),
15945e8351deSBard Liao 	SND_SOC_DAPM_PGA("LOUT Amp", SND_SOC_NOPM, 0, 0, NULL, 0),
15955e8351deSBard Liao 
15965e8351deSBard Liao 	/* PDM */
15975e8351deSBard Liao 	SND_SOC_DAPM_SUPPLY("PDM1 Power", RT5670_PWR_DIG2,
15985e8351deSBard Liao 		RT5670_PWR_PDM1_BIT, 0, NULL, 0),
15995e8351deSBard Liao 
16005e8351deSBard Liao 	SND_SOC_DAPM_MUX("PDM1 L Mux", RT5670_PDM_OUT_CTRL,
16015e8351deSBard Liao 			 RT5670_M_PDM1_L_SFT, 1, &rt5670_pdm1_l_mux),
16025e8351deSBard Liao 	SND_SOC_DAPM_MUX("PDM1 R Mux", RT5670_PDM_OUT_CTRL,
16035e8351deSBard Liao 			 RT5670_M_PDM1_R_SFT, 1, &rt5670_pdm1_r_mux),
16045e8351deSBard Liao 
16055e8351deSBard Liao 	/* Output Lines */
16065e8351deSBard Liao 	SND_SOC_DAPM_OUTPUT("HPOL"),
16075e8351deSBard Liao 	SND_SOC_DAPM_OUTPUT("HPOR"),
16085e8351deSBard Liao 	SND_SOC_DAPM_OUTPUT("LOUTL"),
16095e8351deSBard Liao 	SND_SOC_DAPM_OUTPUT("LOUTR"),
16100cf18632SBard Liao };
16110cf18632SBard Liao 
16120cf18632SBard Liao static const struct snd_soc_dapm_widget rt5670_specific_dapm_widgets[] = {
16130cf18632SBard Liao 	SND_SOC_DAPM_SUPPLY("PDM2 Power", RT5670_PWR_DIG2,
16140cf18632SBard Liao 		RT5670_PWR_PDM2_BIT, 0, NULL, 0),
16150cf18632SBard Liao 	SND_SOC_DAPM_MUX("PDM2 L Mux", RT5670_PDM_OUT_CTRL,
16160cf18632SBard Liao 			 RT5670_M_PDM2_L_SFT, 1, &rt5670_pdm2_l_mux),
16170cf18632SBard Liao 	SND_SOC_DAPM_MUX("PDM2 R Mux", RT5670_PDM_OUT_CTRL,
16180cf18632SBard Liao 			 RT5670_M_PDM2_R_SFT, 1, &rt5670_pdm2_r_mux),
16195e8351deSBard Liao 	SND_SOC_DAPM_OUTPUT("PDM1L"),
16205e8351deSBard Liao 	SND_SOC_DAPM_OUTPUT("PDM1R"),
16215e8351deSBard Liao 	SND_SOC_DAPM_OUTPUT("PDM2L"),
16225e8351deSBard Liao 	SND_SOC_DAPM_OUTPUT("PDM2R"),
16235e8351deSBard Liao };
16245e8351deSBard Liao 
16250cf18632SBard Liao static const struct snd_soc_dapm_widget rt5672_specific_dapm_widgets[] = {
16260cf18632SBard Liao 	SND_SOC_DAPM_PGA("SPO Amp", SND_SOC_NOPM, 0, 0, NULL, 0),
16270cf18632SBard Liao 	SND_SOC_DAPM_OUTPUT("SPOLP"),
16280cf18632SBard Liao 	SND_SOC_DAPM_OUTPUT("SPOLN"),
16290cf18632SBard Liao 	SND_SOC_DAPM_OUTPUT("SPORP"),
16300cf18632SBard Liao 	SND_SOC_DAPM_OUTPUT("SPORN"),
16310cf18632SBard Liao };
16320cf18632SBard Liao 
16335e8351deSBard Liao static const struct snd_soc_dapm_route rt5670_dapm_routes[] = {
16345e8351deSBard Liao 	{ "ADC Stereo1 Filter", NULL, "ADC STO1 ASRC", is_using_asrc },
16355e8351deSBard Liao 	{ "ADC Stereo2 Filter", NULL, "ADC STO2 ASRC", is_using_asrc },
16365e8351deSBard Liao 	{ "ADC Mono Left Filter", NULL, "ADC MONO L ASRC", is_using_asrc },
16375e8351deSBard Liao 	{ "ADC Mono Right Filter", NULL, "ADC MONO R ASRC", is_using_asrc },
16385e8351deSBard Liao 	{ "DAC Mono Left Filter", NULL, "DAC MONO L ASRC", is_using_asrc },
16395e8351deSBard Liao 	{ "DAC Mono Right Filter", NULL, "DAC MONO R ASRC", is_using_asrc },
16405e8351deSBard Liao 	{ "DAC Stereo1 Filter", NULL, "DAC STO ASRC", is_using_asrc },
16415e8351deSBard Liao 
16425e8351deSBard Liao 	{ "I2S1", NULL, "I2S1 ASRC" },
16435e8351deSBard Liao 	{ "I2S2", NULL, "I2S2 ASRC" },
16445e8351deSBard Liao 
16455e8351deSBard Liao 	{ "DMIC1", NULL, "DMIC L1" },
16465e8351deSBard Liao 	{ "DMIC1", NULL, "DMIC R1" },
16475e8351deSBard Liao 	{ "DMIC2", NULL, "DMIC L2" },
16485e8351deSBard Liao 	{ "DMIC2", NULL, "DMIC R2" },
16495e8351deSBard Liao 	{ "DMIC3", NULL, "DMIC L3" },
16505e8351deSBard Liao 	{ "DMIC3", NULL, "DMIC R3" },
16515e8351deSBard Liao 
16525e8351deSBard Liao 	{ "BST1", NULL, "IN1P" },
16535e8351deSBard Liao 	{ "BST1", NULL, "IN1N" },
16545e8351deSBard Liao 	{ "BST1", NULL, "Mic Det Power" },
16555e8351deSBard Liao 	{ "BST2", NULL, "IN2P" },
16565e8351deSBard Liao 	{ "BST2", NULL, "IN2N" },
16575e8351deSBard Liao 
16585e8351deSBard Liao 	{ "INL VOL", NULL, "IN2P" },
16595e8351deSBard Liao 	{ "INR VOL", NULL, "IN2N" },
16605e8351deSBard Liao 
16615e8351deSBard Liao 	{ "RECMIXL", "INL Switch", "INL VOL" },
16625e8351deSBard Liao 	{ "RECMIXL", "BST2 Switch", "BST2" },
16635e8351deSBard Liao 	{ "RECMIXL", "BST1 Switch", "BST1" },
16645e8351deSBard Liao 
16655e8351deSBard Liao 	{ "RECMIXR", "INR Switch", "INR VOL" },
16665e8351deSBard Liao 	{ "RECMIXR", "BST2 Switch", "BST2" },
16675e8351deSBard Liao 	{ "RECMIXR", "BST1 Switch", "BST1" },
16685e8351deSBard Liao 
16695e8351deSBard Liao 	{ "ADC 1", NULL, "RECMIXL" },
16705e8351deSBard Liao 	{ "ADC 1", NULL, "ADC 1 power" },
16715e8351deSBard Liao 	{ "ADC 1", NULL, "ADC clock" },
16725e8351deSBard Liao 	{ "ADC 2", NULL, "RECMIXR" },
16735e8351deSBard Liao 	{ "ADC 2", NULL, "ADC 2 power" },
16745e8351deSBard Liao 	{ "ADC 2", NULL, "ADC clock" },
16755e8351deSBard Liao 
16765e8351deSBard Liao 	{ "DMIC L1", NULL, "DMIC CLK" },
16775e8351deSBard Liao 	{ "DMIC L1", NULL, "DMIC1 Power" },
16785e8351deSBard Liao 	{ "DMIC R1", NULL, "DMIC CLK" },
16795e8351deSBard Liao 	{ "DMIC R1", NULL, "DMIC1 Power" },
16805e8351deSBard Liao 	{ "DMIC L2", NULL, "DMIC CLK" },
16815e8351deSBard Liao 	{ "DMIC L2", NULL, "DMIC2 Power" },
16825e8351deSBard Liao 	{ "DMIC R2", NULL, "DMIC CLK" },
16835e8351deSBard Liao 	{ "DMIC R2", NULL, "DMIC2 Power" },
16845e8351deSBard Liao 	{ "DMIC L3", NULL, "DMIC CLK" },
16855e8351deSBard Liao 	{ "DMIC L3", NULL, "DMIC3 Power" },
16865e8351deSBard Liao 	{ "DMIC R3", NULL, "DMIC CLK" },
16875e8351deSBard Liao 	{ "DMIC R3", NULL, "DMIC3 Power" },
16885e8351deSBard Liao 
16895e8351deSBard Liao 	{ "Stereo1 DMIC Mux", "DMIC1", "DMIC1" },
16905e8351deSBard Liao 	{ "Stereo1 DMIC Mux", "DMIC2", "DMIC2" },
16915e8351deSBard Liao 	{ "Stereo1 DMIC Mux", "DMIC3", "DMIC3" },
16925e8351deSBard Liao 
16935e8351deSBard Liao 	{ "Stereo2 DMIC Mux", "DMIC1", "DMIC1" },
16945e8351deSBard Liao 	{ "Stereo2 DMIC Mux", "DMIC2", "DMIC2" },
16955e8351deSBard Liao 	{ "Stereo2 DMIC Mux", "DMIC3", "DMIC3" },
16965e8351deSBard Liao 
16975e8351deSBard Liao 	{ "Mono DMIC L Mux", "DMIC1", "DMIC L1" },
16985e8351deSBard Liao 	{ "Mono DMIC L Mux", "DMIC2", "DMIC L2" },
16995e8351deSBard Liao 	{ "Mono DMIC L Mux", "DMIC3", "DMIC L3" },
17005e8351deSBard Liao 
17015e8351deSBard Liao 	{ "Mono DMIC R Mux", "DMIC1", "DMIC R1" },
17025e8351deSBard Liao 	{ "Mono DMIC R Mux", "DMIC2", "DMIC R2" },
17035e8351deSBard Liao 	{ "Mono DMIC R Mux", "DMIC3", "DMIC R3" },
17045e8351deSBard Liao 
17055e8351deSBard Liao 	{ "ADC 1_2", NULL, "ADC 1" },
17065e8351deSBard Liao 	{ "ADC 1_2", NULL, "ADC 2" },
17075e8351deSBard Liao 
17085e8351deSBard Liao 	{ "Stereo1 ADC L2 Mux", "DMIC", "Stereo1 DMIC Mux" },
17095e8351deSBard Liao 	{ "Stereo1 ADC L2 Mux", "DAC MIX", "DAC MIXL" },
17105e8351deSBard Liao 	{ "Stereo1 ADC L1 Mux", "ADC", "ADC 1_2" },
17115e8351deSBard Liao 	{ "Stereo1 ADC L1 Mux", "DAC MIX", "DAC MIXL" },
17125e8351deSBard Liao 
17135e8351deSBard Liao 	{ "Stereo1 ADC R1 Mux", "ADC", "ADC 1_2" },
17145e8351deSBard Liao 	{ "Stereo1 ADC R1 Mux", "DAC MIX", "DAC MIXR" },
17155e8351deSBard Liao 	{ "Stereo1 ADC R2 Mux", "DMIC", "Stereo1 DMIC Mux" },
17165e8351deSBard Liao 	{ "Stereo1 ADC R2 Mux", "DAC MIX", "DAC MIXR" },
17175e8351deSBard Liao 
17185e8351deSBard Liao 	{ "Mono ADC L2 Mux", "DMIC", "Mono DMIC L Mux" },
17195e8351deSBard Liao 	{ "Mono ADC L2 Mux", "Mono DAC MIXL", "Mono DAC MIXL" },
17205e8351deSBard Liao 	{ "Mono ADC L1 Mux", "Mono DAC MIXL", "Mono DAC MIXL" },
17215e8351deSBard Liao 	{ "Mono ADC L1 Mux", "ADC1",  "ADC 1" },
17225e8351deSBard Liao 
17235e8351deSBard Liao 	{ "Mono ADC R1 Mux", "Mono DAC MIXR", "Mono DAC MIXR" },
17245e8351deSBard Liao 	{ "Mono ADC R1 Mux", "ADC2", "ADC 2" },
17255e8351deSBard Liao 	{ "Mono ADC R2 Mux", "DMIC", "Mono DMIC R Mux" },
17265e8351deSBard Liao 	{ "Mono ADC R2 Mux", "Mono DAC MIXR", "Mono DAC MIXR" },
17275e8351deSBard Liao 
17285e8351deSBard Liao 	{ "Sto1 ADC MIXL", "ADC1 Switch", "Stereo1 ADC L1 Mux" },
17295e8351deSBard Liao 	{ "Sto1 ADC MIXL", "ADC2 Switch", "Stereo1 ADC L2 Mux" },
17305e8351deSBard Liao 	{ "Sto1 ADC MIXR", "ADC1 Switch", "Stereo1 ADC R1 Mux" },
17315e8351deSBard Liao 	{ "Sto1 ADC MIXR", "ADC2 Switch", "Stereo1 ADC R2 Mux" },
17325e8351deSBard Liao 
17335e8351deSBard Liao 	{ "Stereo1 ADC MIXL", NULL, "Sto1 ADC MIXL" },
17345e8351deSBard Liao 	{ "Stereo1 ADC MIXL", NULL, "ADC Stereo1 Filter" },
17355e8351deSBard Liao 	{ "ADC Stereo1 Filter", NULL, "PLL1", is_sys_clk_from_pll },
17365e8351deSBard Liao 
17375e8351deSBard Liao 	{ "Stereo1 ADC MIXR", NULL, "Sto1 ADC MIXR" },
17385e8351deSBard Liao 	{ "Stereo1 ADC MIXR", NULL, "ADC Stereo1 Filter" },
17395e8351deSBard Liao 	{ "ADC Stereo1 Filter", NULL, "PLL1", is_sys_clk_from_pll },
17405e8351deSBard Liao 
17415e8351deSBard Liao 	{ "Mono ADC MIXL", "ADC1 Switch", "Mono ADC L1 Mux" },
17425e8351deSBard Liao 	{ "Mono ADC MIXL", "ADC2 Switch", "Mono ADC L2 Mux" },
17435e8351deSBard Liao 	{ "Mono ADC MIXL", NULL, "ADC Mono Left Filter" },
17445e8351deSBard Liao 	{ "ADC Mono Left Filter", NULL, "PLL1", is_sys_clk_from_pll },
17455e8351deSBard Liao 
17465e8351deSBard Liao 	{ "Mono ADC MIXR", "ADC1 Switch", "Mono ADC R1 Mux" },
17475e8351deSBard Liao 	{ "Mono ADC MIXR", "ADC2 Switch", "Mono ADC R2 Mux" },
17485e8351deSBard Liao 	{ "Mono ADC MIXR", NULL, "ADC Mono Right Filter" },
17495e8351deSBard Liao 	{ "ADC Mono Right Filter", NULL, "PLL1", is_sys_clk_from_pll },
17505e8351deSBard Liao 
17515e8351deSBard Liao 	{ "Stereo2 ADC L2 Mux", "DMIC", "Stereo2 DMIC Mux" },
17525e8351deSBard Liao 	{ "Stereo2 ADC L2 Mux", "DAC MIX", "DAC MIXL" },
17535e8351deSBard Liao 	{ "Stereo2 ADC L1 Mux", "ADC", "ADC 1_2" },
17545e8351deSBard Liao 	{ "Stereo2 ADC L1 Mux", "DAC MIX", "DAC MIXL" },
17555e8351deSBard Liao 
17565e8351deSBard Liao 	{ "Stereo2 ADC R1 Mux", "ADC", "ADC 1_2" },
17575e8351deSBard Liao 	{ "Stereo2 ADC R1 Mux", "DAC MIX", "DAC MIXR" },
17585e8351deSBard Liao 	{ "Stereo2 ADC R2 Mux", "DMIC", "Stereo2 DMIC Mux" },
17595e8351deSBard Liao 	{ "Stereo2 ADC R2 Mux", "DAC MIX", "DAC MIXR" },
17605e8351deSBard Liao 
17615e8351deSBard Liao 	{ "Sto2 ADC MIXL", "ADC1 Switch", "Stereo2 ADC L1 Mux" },
17625e8351deSBard Liao 	{ "Sto2 ADC MIXL", "ADC2 Switch", "Stereo2 ADC L2 Mux" },
17635e8351deSBard Liao 	{ "Sto2 ADC MIXR", "ADC1 Switch", "Stereo2 ADC R1 Mux" },
17645e8351deSBard Liao 	{ "Sto2 ADC MIXR", "ADC2 Switch", "Stereo2 ADC R2 Mux" },
17655e8351deSBard Liao 
17665e8351deSBard Liao 	{ "Sto2 ADC LR MIX", NULL, "Sto2 ADC MIXL" },
17675e8351deSBard Liao 	{ "Sto2 ADC LR MIX", NULL, "Sto2 ADC MIXR" },
17685e8351deSBard Liao 
17695e8351deSBard Liao 	{ "Stereo2 ADC LR Mux", "L", "Sto2 ADC MIXL" },
17705e8351deSBard Liao 	{ "Stereo2 ADC LR Mux", "LR", "Sto2 ADC LR MIX" },
17715e8351deSBard Liao 
17725e8351deSBard Liao 	{ "Stereo2 ADC MIXL", NULL, "Stereo2 ADC LR Mux" },
17735e8351deSBard Liao 	{ "Stereo2 ADC MIXL", NULL, "ADC Stereo2 Filter" },
17745e8351deSBard Liao 	{ "ADC Stereo2 Filter", NULL, "PLL1", is_sys_clk_from_pll },
17755e8351deSBard Liao 
17765e8351deSBard Liao 	{ "Stereo2 ADC MIXR", NULL, "Sto2 ADC MIXR" },
17775e8351deSBard Liao 	{ "Stereo2 ADC MIXR", NULL, "ADC Stereo2 Filter" },
17785e8351deSBard Liao 	{ "ADC Stereo2 Filter", NULL, "PLL1", is_sys_clk_from_pll },
17795e8351deSBard Liao 
17805e8351deSBard Liao 	{ "VAD ADC Mux", "Sto1 ADC L", "Stereo1 ADC MIXL" },
17815e8351deSBard Liao 	{ "VAD ADC Mux", "Mono ADC L", "Mono ADC MIXL" },
17825e8351deSBard Liao 	{ "VAD ADC Mux", "Mono ADC R", "Mono ADC MIXR" },
17835e8351deSBard Liao 	{ "VAD ADC Mux", "Sto2 ADC L", "Sto2 ADC MIXL" },
17845e8351deSBard Liao 
17855e8351deSBard Liao 	{ "VAD_ADC", NULL, "VAD ADC Mux" },
17865e8351deSBard Liao 
17875e8351deSBard Liao 	{ "IF_ADC1", NULL, "Stereo1 ADC MIXL" },
17885e8351deSBard Liao 	{ "IF_ADC1", NULL, "Stereo1 ADC MIXR" },
17895e8351deSBard Liao 	{ "IF_ADC2", NULL, "Mono ADC MIXL" },
17905e8351deSBard Liao 	{ "IF_ADC2", NULL, "Mono ADC MIXR" },
17915e8351deSBard Liao 	{ "IF_ADC3", NULL, "Stereo2 ADC MIXL" },
17925e8351deSBard Liao 	{ "IF_ADC3", NULL, "Stereo2 ADC MIXR" },
17935e8351deSBard Liao 
17945e8351deSBard Liao 	{ "IF1 ADC1 IN1 Mux", "IF_ADC1", "IF_ADC1" },
17955e8351deSBard Liao 	{ "IF1 ADC1 IN1 Mux", "IF1_ADC3", "IF1_ADC3" },
17965e8351deSBard Liao 
17975e8351deSBard Liao 	{ "IF1 ADC1 IN2 Mux", "IF1_ADC1_IN1", "IF1 ADC1 IN1 Mux" },
17985e8351deSBard Liao 	{ "IF1 ADC1 IN2 Mux", "IF1_ADC4", "IF1_ADC4" },
17995e8351deSBard Liao 
18005e8351deSBard Liao 	{ "IF1 ADC2 IN Mux", "IF_ADC2", "IF_ADC2" },
18015e8351deSBard Liao 	{ "IF1 ADC2 IN Mux", "VAD_ADC", "VAD_ADC" },
18025e8351deSBard Liao 
18035e8351deSBard Liao 	{ "IF1 ADC2 IN1 Mux", "IF1_ADC2_IN", "IF1 ADC2 IN Mux" },
18045e8351deSBard Liao 	{ "IF1 ADC2 IN1 Mux", "IF1_ADC4", "IF1_ADC4" },
18055e8351deSBard Liao 
18065e8351deSBard Liao 	{ "IF1_ADC1" , NULL, "IF1 ADC1 IN2 Mux" },
18075e8351deSBard Liao 	{ "IF1_ADC2" , NULL, "IF1 ADC2 IN1 Mux" },
18085e8351deSBard Liao 
18095e8351deSBard Liao 	{ "Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXL" },
18105e8351deSBard Liao 	{ "Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXR" },
18115e8351deSBard Liao 	{ "Stereo2 ADC MIX", NULL, "Sto2 ADC MIXL" },
18125e8351deSBard Liao 	{ "Stereo2 ADC MIX", NULL, "Sto2 ADC MIXR" },
18135e8351deSBard Liao 	{ "Mono ADC MIX", NULL, "Mono ADC MIXL" },
18145e8351deSBard Liao 	{ "Mono ADC MIX", NULL, "Mono ADC MIXR" },
18155e8351deSBard Liao 
18165e8351deSBard Liao 	{ "RxDP Mux", "IF2 DAC", "IF2 DAC" },
18175e8351deSBard Liao 	{ "RxDP Mux", "IF1 DAC", "IF1 DAC2" },
18185e8351deSBard Liao 	{ "RxDP Mux", "STO1 ADC Mixer", "Stereo1 ADC MIX" },
18195e8351deSBard Liao 	{ "RxDP Mux", "STO2 ADC Mixer", "Stereo2 ADC MIX" },
18205e8351deSBard Liao 	{ "RxDP Mux", "Mono ADC Mixer L", "Mono ADC MIXL" },
18215e8351deSBard Liao 	{ "RxDP Mux", "Mono ADC Mixer R", "Mono ADC MIXR" },
18225e8351deSBard Liao 	{ "RxDP Mux", "DAC1", "DAC MIX" },
18235e8351deSBard Liao 
18245e8351deSBard Liao 	{ "TDM Data Mux", "Slot 0-1", "Stereo1 ADC MIX" },
18255e8351deSBard Liao 	{ "TDM Data Mux", "Slot 2-3", "Mono ADC MIX" },
18265e8351deSBard Liao 	{ "TDM Data Mux", "Slot 4-5", "Stereo2 ADC MIX" },
18275e8351deSBard Liao 	{ "TDM Data Mux", "Slot 6-7", "IF2 DAC" },
18285e8351deSBard Liao 
18295e8351deSBard Liao 	{ "DSP UL Mux", "Bypass", "TDM Data Mux" },
18305e8351deSBard Liao 	{ "DSP UL Mux", NULL, "I2S DSP" },
18315e8351deSBard Liao 	{ "DSP DL Mux", "Bypass", "RxDP Mux" },
18325e8351deSBard Liao 	{ "DSP DL Mux", NULL, "I2S DSP" },
18335e8351deSBard Liao 
18345e8351deSBard Liao 	{ "TxDP_ADC_L", NULL, "DSP UL Mux" },
18355e8351deSBard Liao 	{ "TxDP_ADC_R", NULL, "DSP UL Mux" },
18365e8351deSBard Liao 	{ "TxDC_DAC", NULL, "DSP DL Mux" },
18375e8351deSBard Liao 
18385e8351deSBard Liao 	{ "TxDP_ADC", NULL, "TxDP_ADC_L" },
18395e8351deSBard Liao 	{ "TxDP_ADC", NULL, "TxDP_ADC_R" },
18405e8351deSBard Liao 
18415e8351deSBard Liao 	{ "IF1 ADC", NULL, "I2S1" },
18425e8351deSBard Liao 	{ "IF1 ADC", NULL, "IF1_ADC1" },
18435e8351deSBard Liao 	{ "IF1 ADC", NULL, "IF1_ADC2" },
18445e8351deSBard Liao 	{ "IF1 ADC", NULL, "IF_ADC3" },
18455e8351deSBard Liao 	{ "IF1 ADC", NULL, "TxDP_ADC" },
18465e8351deSBard Liao 
18475e8351deSBard Liao 	{ "IF2 ADC Mux", "IF_ADC1", "IF_ADC1" },
18485e8351deSBard Liao 	{ "IF2 ADC Mux", "IF_ADC2", "IF_ADC2" },
18495e8351deSBard Liao 	{ "IF2 ADC Mux", "IF_ADC3", "IF_ADC3" },
18505e8351deSBard Liao 	{ "IF2 ADC Mux", "TxDC_DAC", "TxDC_DAC" },
18515e8351deSBard Liao 	{ "IF2 ADC Mux", "TxDP_ADC", "TxDP_ADC" },
18525e8351deSBard Liao 	{ "IF2 ADC Mux", "VAD_ADC", "VAD_ADC" },
18535e8351deSBard Liao 
18545e8351deSBard Liao 	{ "IF2 ADC L", NULL, "IF2 ADC Mux" },
18555e8351deSBard Liao 	{ "IF2 ADC R", NULL, "IF2 ADC Mux" },
18565e8351deSBard Liao 
18575e8351deSBard Liao 	{ "IF2 ADC", NULL, "I2S2" },
18585e8351deSBard Liao 	{ "IF2 ADC", NULL, "IF2 ADC L" },
18595e8351deSBard Liao 	{ "IF2 ADC", NULL, "IF2 ADC R" },
18605e8351deSBard Liao 
18615e8351deSBard Liao 	{ "AIF1TX", NULL, "IF1 ADC" },
18625e8351deSBard Liao 	{ "AIF2TX", NULL, "IF2 ADC" },
18635e8351deSBard Liao 
18645e8351deSBard Liao 	{ "IF1 DAC1", NULL, "AIF1RX" },
18655e8351deSBard Liao 	{ "IF1 DAC2", NULL, "AIF1RX" },
18665e8351deSBard Liao 	{ "IF2 DAC", NULL, "AIF2RX" },
18675e8351deSBard Liao 
18685e8351deSBard Liao 	{ "IF1 DAC1", NULL, "I2S1" },
18695e8351deSBard Liao 	{ "IF1 DAC2", NULL, "I2S1" },
18705e8351deSBard Liao 	{ "IF2 DAC", NULL, "I2S2" },
18715e8351deSBard Liao 
18725e8351deSBard Liao 	{ "IF1 DAC2 L", NULL, "IF1 DAC2" },
18735e8351deSBard Liao 	{ "IF1 DAC2 R", NULL, "IF1 DAC2" },
18745e8351deSBard Liao 	{ "IF1 DAC1 L", NULL, "IF1 DAC1" },
18755e8351deSBard Liao 	{ "IF1 DAC1 R", NULL, "IF1 DAC1" },
18765e8351deSBard Liao 	{ "IF2 DAC L", NULL, "IF2 DAC" },
18775e8351deSBard Liao 	{ "IF2 DAC R", NULL, "IF2 DAC" },
18785e8351deSBard Liao 
18795e8351deSBard Liao 	{ "DAC1 L Mux", "IF1 DAC", "IF1 DAC1 L" },
18805e8351deSBard Liao 	{ "DAC1 L Mux", "IF2 DAC", "IF2 DAC L" },
18815e8351deSBard Liao 
18825e8351deSBard Liao 	{ "DAC1 R Mux", "IF1 DAC", "IF1 DAC1 R" },
18835e8351deSBard Liao 	{ "DAC1 R Mux", "IF2 DAC", "IF2 DAC R" },
18845e8351deSBard Liao 
18855e8351deSBard Liao 	{ "DAC1 MIXL", "Stereo ADC Switch", "Stereo1 ADC MIXL" },
18865e8351deSBard Liao 	{ "DAC1 MIXL", "DAC1 Switch", "DAC1 L Mux" },
18875e8351deSBard Liao 	{ "DAC1 MIXL", NULL, "DAC Stereo1 Filter" },
18885e8351deSBard Liao 	{ "DAC1 MIXR", "Stereo ADC Switch", "Stereo1 ADC MIXR" },
18895e8351deSBard Liao 	{ "DAC1 MIXR", "DAC1 Switch", "DAC1 R Mux" },
18905e8351deSBard Liao 	{ "DAC1 MIXR", NULL, "DAC Stereo1 Filter" },
18915e8351deSBard Liao 
18925e8351deSBard Liao 	{ "DAC MIX", NULL, "DAC1 MIXL" },
18935e8351deSBard Liao 	{ "DAC MIX", NULL, "DAC1 MIXR" },
18945e8351deSBard Liao 
18955e8351deSBard Liao 	{ "Audio DSP", NULL, "DAC1 MIXL" },
18965e8351deSBard Liao 	{ "Audio DSP", NULL, "DAC1 MIXR" },
18975e8351deSBard Liao 
18985e8351deSBard Liao 	{ "DAC L2 Mux", "IF1 DAC", "IF1 DAC2 L" },
18995e8351deSBard Liao 	{ "DAC L2 Mux", "IF2 DAC", "IF2 DAC L" },
19005e8351deSBard Liao 	{ "DAC L2 Mux", "TxDC DAC", "TxDC_DAC" },
19015e8351deSBard Liao 	{ "DAC L2 Mux", "VAD_ADC", "VAD_ADC" },
19025e8351deSBard Liao 	{ "DAC L2 Volume", NULL, "DAC L2 Mux" },
19035e8351deSBard Liao 	{ "DAC L2 Volume", NULL, "DAC Mono Left Filter" },
19045e8351deSBard Liao 
19055e8351deSBard Liao 	{ "DAC R2 Mux", "IF1 DAC", "IF1 DAC2 R" },
19065e8351deSBard Liao 	{ "DAC R2 Mux", "IF2 DAC", "IF2 DAC R" },
19075e8351deSBard Liao 	{ "DAC R2 Mux", "TxDC DAC", "TxDC_DAC" },
19085e8351deSBard Liao 	{ "DAC R2 Mux", "TxDP ADC", "TxDP_ADC" },
19095e8351deSBard Liao 	{ "DAC R2 Volume", NULL, "DAC R2 Mux" },
19105e8351deSBard Liao 	{ "DAC R2 Volume", NULL, "DAC Mono Right Filter" },
19115e8351deSBard Liao 
19125e8351deSBard Liao 	{ "Stereo DAC MIXL", "DAC L1 Switch", "DAC1 MIXL" },
19135e8351deSBard Liao 	{ "Stereo DAC MIXL", "DAC R1 Switch", "DAC1 MIXR" },
19145e8351deSBard Liao 	{ "Stereo DAC MIXL", "DAC L2 Switch", "DAC L2 Volume" },
19155e8351deSBard Liao 	{ "Stereo DAC MIXL", NULL, "DAC Stereo1 Filter" },
19165e8351deSBard Liao 	{ "Stereo DAC MIXL", NULL, "DAC L1 Power" },
19175e8351deSBard Liao 	{ "Stereo DAC MIXR", "DAC R1 Switch", "DAC1 MIXR" },
19185e8351deSBard Liao 	{ "Stereo DAC MIXR", "DAC L1 Switch", "DAC1 MIXL" },
19195e8351deSBard Liao 	{ "Stereo DAC MIXR", "DAC R2 Switch", "DAC R2 Volume" },
19205e8351deSBard Liao 	{ "Stereo DAC MIXR", NULL, "DAC Stereo1 Filter" },
19215e8351deSBard Liao 	{ "Stereo DAC MIXR", NULL, "DAC R1 Power" },
19225e8351deSBard Liao 
19235e8351deSBard Liao 	{ "Mono DAC MIXL", "DAC L1 Switch", "DAC1 MIXL" },
19245e8351deSBard Liao 	{ "Mono DAC MIXL", "DAC L2 Switch", "DAC L2 Volume" },
19255e8351deSBard Liao 	{ "Mono DAC MIXL", "DAC R2 Switch", "DAC R2 Volume" },
19265e8351deSBard Liao 	{ "Mono DAC MIXL", NULL, "DAC Mono Left Filter" },
19275e8351deSBard Liao 	{ "Mono DAC MIXR", "DAC R1 Switch", "DAC1 MIXR" },
19285e8351deSBard Liao 	{ "Mono DAC MIXR", "DAC R2 Switch", "DAC R2 Volume" },
19295e8351deSBard Liao 	{ "Mono DAC MIXR", "DAC L2 Switch", "DAC L2 Volume" },
19305e8351deSBard Liao 	{ "Mono DAC MIXR", NULL, "DAC Mono Right Filter" },
19315e8351deSBard Liao 
19325e8351deSBard Liao 	{ "DAC MIXL", "Sto DAC Mix L Switch", "Stereo DAC MIXL" },
19335e8351deSBard Liao 	{ "DAC MIXL", "DAC L2 Switch", "DAC L2 Volume" },
19345e8351deSBard Liao 	{ "DAC MIXL", "DAC R2 Switch", "DAC R2 Volume" },
19355e8351deSBard Liao 	{ "DAC MIXR", "Sto DAC Mix R Switch", "Stereo DAC MIXR" },
19365e8351deSBard Liao 	{ "DAC MIXR", "DAC R2 Switch", "DAC R2 Volume" },
19375e8351deSBard Liao 	{ "DAC MIXR", "DAC L2 Switch", "DAC L2 Volume" },
19385e8351deSBard Liao 
19395e8351deSBard Liao 	{ "DAC L1", NULL, "DAC L1 Power" },
19405e8351deSBard Liao 	{ "DAC L1", NULL, "Stereo DAC MIXL" },
19415e8351deSBard Liao 	{ "DAC L1", NULL, "PLL1", is_sys_clk_from_pll },
19425e8351deSBard Liao 	{ "DAC R1", NULL, "DAC R1 Power" },
19435e8351deSBard Liao 	{ "DAC R1", NULL, "Stereo DAC MIXR" },
19445e8351deSBard Liao 	{ "DAC R1", NULL, "PLL1", is_sys_clk_from_pll },
19455e8351deSBard Liao 	{ "DAC L2", NULL, "Mono DAC MIXL" },
19465e8351deSBard Liao 	{ "DAC L2", NULL, "PLL1", is_sys_clk_from_pll },
19475e8351deSBard Liao 	{ "DAC R2", NULL, "Mono DAC MIXR" },
19485e8351deSBard Liao 	{ "DAC R2", NULL, "PLL1", is_sys_clk_from_pll },
19495e8351deSBard Liao 
19505e8351deSBard Liao 	{ "OUT MIXL", "BST1 Switch", "BST1" },
19515e8351deSBard Liao 	{ "OUT MIXL", "INL Switch", "INL VOL" },
19525e8351deSBard Liao 	{ "OUT MIXL", "DAC L2 Switch", "DAC L2" },
19535e8351deSBard Liao 	{ "OUT MIXL", "DAC L1 Switch", "DAC L1" },
19545e8351deSBard Liao 
19555e8351deSBard Liao 	{ "OUT MIXR", "BST2 Switch", "BST2" },
19565e8351deSBard Liao 	{ "OUT MIXR", "INR Switch", "INR VOL" },
19575e8351deSBard Liao 	{ "OUT MIXR", "DAC R2 Switch", "DAC R2" },
19585e8351deSBard Liao 	{ "OUT MIXR", "DAC R1 Switch", "DAC R1" },
19595e8351deSBard Liao 
19605e8351deSBard Liao 	{ "HPOVOL MIXL", "DAC1 Switch", "DAC L1" },
19615e8351deSBard Liao 	{ "HPOVOL MIXL", "INL Switch", "INL VOL" },
19625e8351deSBard Liao 	{ "HPOVOL MIXR", "DAC1 Switch", "DAC R1" },
19635e8351deSBard Liao 	{ "HPOVOL MIXR", "INR Switch", "INR VOL" },
19645e8351deSBard Liao 
19655e8351deSBard Liao 	{ "DAC 2", NULL, "DAC L2" },
19665e8351deSBard Liao 	{ "DAC 2", NULL, "DAC R2" },
19675e8351deSBard Liao 	{ "DAC 1", NULL, "DAC L1" },
19685e8351deSBard Liao 	{ "DAC 1", NULL, "DAC R1" },
19695e8351deSBard Liao 	{ "HPOVOL", NULL, "HPOVOL MIXL" },
19705e8351deSBard Liao 	{ "HPOVOL", NULL, "HPOVOL MIXR" },
19715e8351deSBard Liao 	{ "HPO MIX", "DAC1 Switch", "DAC 1" },
19725e8351deSBard Liao 	{ "HPO MIX", "HPVOL Switch", "HPOVOL" },
19735e8351deSBard Liao 
19745e8351deSBard Liao 	{ "LOUT MIX", "DAC L1 Switch", "DAC L1" },
19755e8351deSBard Liao 	{ "LOUT MIX", "DAC R1 Switch", "DAC R1" },
19765e8351deSBard Liao 	{ "LOUT MIX", "OUTMIX L Switch", "OUT MIXL" },
19775e8351deSBard Liao 	{ "LOUT MIX", "OUTMIX R Switch", "OUT MIXR" },
19785e8351deSBard Liao 
19795e8351deSBard Liao 	{ "PDM1 L Mux", "Stereo DAC", "Stereo DAC MIXL" },
19805e8351deSBard Liao 	{ "PDM1 L Mux", "Mono DAC", "Mono DAC MIXL" },
19815e8351deSBard Liao 	{ "PDM1 L Mux", NULL, "PDM1 Power" },
19825e8351deSBard Liao 	{ "PDM1 R Mux", "Stereo DAC", "Stereo DAC MIXR" },
19835e8351deSBard Liao 	{ "PDM1 R Mux", "Mono DAC", "Mono DAC MIXR" },
19845e8351deSBard Liao 	{ "PDM1 R Mux", NULL, "PDM1 Power" },
19855e8351deSBard Liao 
19865e8351deSBard Liao 	{ "HP Amp", NULL, "HPO MIX" },
19875e8351deSBard Liao 	{ "HP Amp", NULL, "Mic Det Power" },
19885e8351deSBard Liao 	{ "HPOL", NULL, "HP Amp" },
19895e8351deSBard Liao 	{ "HPOL", NULL, "HP L Amp" },
19905e8351deSBard Liao 	{ "HPOL", NULL, "Improve HP Amp Drv" },
19915e8351deSBard Liao 	{ "HPOR", NULL, "HP Amp" },
19925e8351deSBard Liao 	{ "HPOR", NULL, "HP R Amp" },
19935e8351deSBard Liao 	{ "HPOR", NULL, "Improve HP Amp Drv" },
19945e8351deSBard Liao 
19955e8351deSBard Liao 	{ "LOUT Amp", NULL, "LOUT MIX" },
19965e8351deSBard Liao 	{ "LOUT L Playback", "Switch", "LOUT Amp" },
19975e8351deSBard Liao 	{ "LOUT R Playback", "Switch", "LOUT Amp" },
19985e8351deSBard Liao 	{ "LOUTL", NULL, "LOUT L Playback" },
19995e8351deSBard Liao 	{ "LOUTR", NULL, "LOUT R Playback" },
20005e8351deSBard Liao 	{ "LOUTL", NULL, "Improve HP Amp Drv" },
20015e8351deSBard Liao 	{ "LOUTR", NULL, "Improve HP Amp Drv" },
20020cf18632SBard Liao };
20035e8351deSBard Liao 
20040cf18632SBard Liao static const struct snd_soc_dapm_route rt5670_specific_dapm_routes[] = {
20050cf18632SBard Liao 	{ "PDM2 L Mux", "Stereo DAC", "Stereo DAC MIXL" },
20060cf18632SBard Liao 	{ "PDM2 L Mux", "Mono DAC", "Mono DAC MIXL" },
20070cf18632SBard Liao 	{ "PDM2 L Mux", NULL, "PDM2 Power" },
20080cf18632SBard Liao 	{ "PDM2 R Mux", "Stereo DAC", "Stereo DAC MIXR" },
20090cf18632SBard Liao 	{ "PDM2 R Mux", "Mono DAC", "Mono DAC MIXR" },
20100cf18632SBard Liao 	{ "PDM2 R Mux", NULL, "PDM2 Power" },
20115e8351deSBard Liao 	{ "PDM1L", NULL, "PDM1 L Mux" },
20125e8351deSBard Liao 	{ "PDM1R", NULL, "PDM1 R Mux" },
20135e8351deSBard Liao 	{ "PDM2L", NULL, "PDM2 L Mux" },
20145e8351deSBard Liao 	{ "PDM2R", NULL, "PDM2 R Mux" },
20155e8351deSBard Liao };
20165e8351deSBard Liao 
20170cf18632SBard Liao static const struct snd_soc_dapm_route rt5672_specific_dapm_routes[] = {
20180cf18632SBard Liao 	{ "SPO Amp", NULL, "PDM1 L Mux" },
20190cf18632SBard Liao 	{ "SPO Amp", NULL, "PDM1 R Mux" },
20200cf18632SBard Liao 	{ "SPOLP", NULL, "SPO Amp" },
20210cf18632SBard Liao 	{ "SPOLN", NULL, "SPO Amp" },
20220cf18632SBard Liao 	{ "SPORP", NULL, "SPO Amp" },
20230cf18632SBard Liao 	{ "SPORN", NULL, "SPO Amp" },
20240cf18632SBard Liao };
20250cf18632SBard Liao 
20265e8351deSBard Liao static int rt5670_hw_params(struct snd_pcm_substream *substream,
20275e8351deSBard Liao 	struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
20285e8351deSBard Liao {
20295e8351deSBard Liao 	struct snd_soc_codec *codec = dai->codec;
20305e8351deSBard Liao 	struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec);
20315e8351deSBard Liao 	unsigned int val_len = 0, val_clk, mask_clk;
20325e8351deSBard Liao 	int pre_div, bclk_ms, frame_size;
20335e8351deSBard Liao 
20345e8351deSBard Liao 	rt5670->lrck[dai->id] = params_rate(params);
20355e8351deSBard Liao 	pre_div = rl6231_get_clk_info(rt5670->sysclk, rt5670->lrck[dai->id]);
20365e8351deSBard Liao 	if (pre_div < 0) {
20375e8351deSBard Liao 		dev_err(codec->dev, "Unsupported clock setting %d for DAI %d\n",
20385e8351deSBard Liao 			rt5670->lrck[dai->id], dai->id);
20395e8351deSBard Liao 		return -EINVAL;
20405e8351deSBard Liao 	}
20415e8351deSBard Liao 	frame_size = snd_soc_params_to_frame_size(params);
20425e8351deSBard Liao 	if (frame_size < 0) {
20435e8351deSBard Liao 		dev_err(codec->dev, "Unsupported frame size: %d\n", frame_size);
20445e8351deSBard Liao 		return -EINVAL;
20455e8351deSBard Liao 	}
20465e8351deSBard Liao 	bclk_ms = frame_size > 32;
20475e8351deSBard Liao 	rt5670->bclk[dai->id] = rt5670->lrck[dai->id] * (32 << bclk_ms);
20485e8351deSBard Liao 
20495e8351deSBard Liao 	dev_dbg(dai->dev, "bclk is %dHz and lrck is %dHz\n",
20505e8351deSBard Liao 		rt5670->bclk[dai->id], rt5670->lrck[dai->id]);
20515e8351deSBard Liao 	dev_dbg(dai->dev, "bclk_ms is %d and pre_div is %d for iis %d\n",
20525e8351deSBard Liao 				bclk_ms, pre_div, dai->id);
20535e8351deSBard Liao 
20545e8351deSBard Liao 	switch (params_width(params)) {
20555e8351deSBard Liao 	case 16:
20565e8351deSBard Liao 		break;
20575e8351deSBard Liao 	case 20:
20585e8351deSBard Liao 		val_len |= RT5670_I2S_DL_20;
20595e8351deSBard Liao 		break;
20605e8351deSBard Liao 	case 24:
20615e8351deSBard Liao 		val_len |= RT5670_I2S_DL_24;
20625e8351deSBard Liao 		break;
20635e8351deSBard Liao 	case 8:
20645e8351deSBard Liao 		val_len |= RT5670_I2S_DL_8;
20655e8351deSBard Liao 		break;
20665e8351deSBard Liao 	default:
20675e8351deSBard Liao 		return -EINVAL;
20685e8351deSBard Liao 	}
20695e8351deSBard Liao 
20705e8351deSBard Liao 	switch (dai->id) {
20715e8351deSBard Liao 	case RT5670_AIF1:
20725e8351deSBard Liao 		mask_clk = RT5670_I2S_BCLK_MS1_MASK | RT5670_I2S_PD1_MASK;
20735e8351deSBard Liao 		val_clk = bclk_ms << RT5670_I2S_BCLK_MS1_SFT |
20745e8351deSBard Liao 			pre_div << RT5670_I2S_PD1_SFT;
20755e8351deSBard Liao 		snd_soc_update_bits(codec, RT5670_I2S1_SDP,
20765e8351deSBard Liao 			RT5670_I2S_DL_MASK, val_len);
20775e8351deSBard Liao 		snd_soc_update_bits(codec, RT5670_ADDA_CLK1, mask_clk, val_clk);
20785e8351deSBard Liao 		break;
20795e8351deSBard Liao 	case RT5670_AIF2:
20805e8351deSBard Liao 		mask_clk = RT5670_I2S_BCLK_MS2_MASK | RT5670_I2S_PD2_MASK;
20815e8351deSBard Liao 		val_clk = bclk_ms << RT5670_I2S_BCLK_MS2_SFT |
20825e8351deSBard Liao 			pre_div << RT5670_I2S_PD2_SFT;
20835e8351deSBard Liao 		snd_soc_update_bits(codec, RT5670_I2S2_SDP,
20845e8351deSBard Liao 			RT5670_I2S_DL_MASK, val_len);
20855e8351deSBard Liao 		snd_soc_update_bits(codec, RT5670_ADDA_CLK1, mask_clk, val_clk);
20865e8351deSBard Liao 		break;
20875e8351deSBard Liao 	default:
20885e8351deSBard Liao 		dev_err(codec->dev, "Invalid dai->id: %d\n", dai->id);
20895e8351deSBard Liao 		return -EINVAL;
20905e8351deSBard Liao 	}
20915e8351deSBard Liao 
20925e8351deSBard Liao 	return 0;
20935e8351deSBard Liao }
20945e8351deSBard Liao 
20955e8351deSBard Liao static int rt5670_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
20965e8351deSBard Liao {
20975e8351deSBard Liao 	struct snd_soc_codec *codec = dai->codec;
20985e8351deSBard Liao 	struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec);
20995e8351deSBard Liao 	unsigned int reg_val = 0;
21005e8351deSBard Liao 
21015e8351deSBard Liao 	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
21025e8351deSBard Liao 	case SND_SOC_DAIFMT_CBM_CFM:
21035e8351deSBard Liao 		rt5670->master[dai->id] = 1;
21045e8351deSBard Liao 		break;
21055e8351deSBard Liao 	case SND_SOC_DAIFMT_CBS_CFS:
21065e8351deSBard Liao 		reg_val |= RT5670_I2S_MS_S;
21075e8351deSBard Liao 		rt5670->master[dai->id] = 0;
21085e8351deSBard Liao 		break;
21095e8351deSBard Liao 	default:
21105e8351deSBard Liao 		return -EINVAL;
21115e8351deSBard Liao 	}
21125e8351deSBard Liao 
21135e8351deSBard Liao 	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
21145e8351deSBard Liao 	case SND_SOC_DAIFMT_NB_NF:
21155e8351deSBard Liao 		break;
21165e8351deSBard Liao 	case SND_SOC_DAIFMT_IB_NF:
21175e8351deSBard Liao 		reg_val |= RT5670_I2S_BP_INV;
21185e8351deSBard Liao 		break;
21195e8351deSBard Liao 	default:
21205e8351deSBard Liao 		return -EINVAL;
21215e8351deSBard Liao 	}
21225e8351deSBard Liao 
21235e8351deSBard Liao 	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
21245e8351deSBard Liao 	case SND_SOC_DAIFMT_I2S:
21255e8351deSBard Liao 		break;
21265e8351deSBard Liao 	case SND_SOC_DAIFMT_LEFT_J:
21275e8351deSBard Liao 		reg_val |= RT5670_I2S_DF_LEFT;
21285e8351deSBard Liao 		break;
21295e8351deSBard Liao 	case SND_SOC_DAIFMT_DSP_A:
21305e8351deSBard Liao 		reg_val |= RT5670_I2S_DF_PCM_A;
21315e8351deSBard Liao 		break;
21325e8351deSBard Liao 	case SND_SOC_DAIFMT_DSP_B:
21335e8351deSBard Liao 		reg_val |= RT5670_I2S_DF_PCM_B;
21345e8351deSBard Liao 		break;
21355e8351deSBard Liao 	default:
21365e8351deSBard Liao 		return -EINVAL;
21375e8351deSBard Liao 	}
21385e8351deSBard Liao 
21395e8351deSBard Liao 	switch (dai->id) {
21405e8351deSBard Liao 	case RT5670_AIF1:
21415e8351deSBard Liao 		snd_soc_update_bits(codec, RT5670_I2S1_SDP,
21425e8351deSBard Liao 			RT5670_I2S_MS_MASK | RT5670_I2S_BP_MASK |
21435e8351deSBard Liao 			RT5670_I2S_DF_MASK, reg_val);
21445e8351deSBard Liao 		break;
21455e8351deSBard Liao 	case RT5670_AIF2:
21465e8351deSBard Liao 		snd_soc_update_bits(codec, RT5670_I2S2_SDP,
21475e8351deSBard Liao 			RT5670_I2S_MS_MASK | RT5670_I2S_BP_MASK |
21485e8351deSBard Liao 			RT5670_I2S_DF_MASK, reg_val);
21495e8351deSBard Liao 		break;
21505e8351deSBard Liao 	default:
21515e8351deSBard Liao 		dev_err(codec->dev, "Invalid dai->id: %d\n", dai->id);
21525e8351deSBard Liao 		return -EINVAL;
21535e8351deSBard Liao 	}
21545e8351deSBard Liao 	return 0;
21555e8351deSBard Liao }
21565e8351deSBard Liao 
21575e8351deSBard Liao static int rt5670_set_dai_sysclk(struct snd_soc_dai *dai,
21585e8351deSBard Liao 		int clk_id, unsigned int freq, int dir)
21595e8351deSBard Liao {
21605e8351deSBard Liao 	struct snd_soc_codec *codec = dai->codec;
21615e8351deSBard Liao 	struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec);
21625e8351deSBard Liao 	unsigned int reg_val = 0;
21635e8351deSBard Liao 
21645e8351deSBard Liao 	if (freq == rt5670->sysclk && clk_id == rt5670->sysclk_src)
21655e8351deSBard Liao 		return 0;
21665e8351deSBard Liao 
21675e8351deSBard Liao 	switch (clk_id) {
21685e8351deSBard Liao 	case RT5670_SCLK_S_MCLK:
21695e8351deSBard Liao 		reg_val |= RT5670_SCLK_SRC_MCLK;
21705e8351deSBard Liao 		break;
21715e8351deSBard Liao 	case RT5670_SCLK_S_PLL1:
21725e8351deSBard Liao 		reg_val |= RT5670_SCLK_SRC_PLL1;
21735e8351deSBard Liao 		break;
21745e8351deSBard Liao 	case RT5670_SCLK_S_RCCLK:
21755e8351deSBard Liao 		reg_val |= RT5670_SCLK_SRC_RCCLK;
21765e8351deSBard Liao 		break;
21775e8351deSBard Liao 	default:
21785e8351deSBard Liao 		dev_err(codec->dev, "Invalid clock id (%d)\n", clk_id);
21795e8351deSBard Liao 		return -EINVAL;
21805e8351deSBard Liao 	}
21815e8351deSBard Liao 	snd_soc_update_bits(codec, RT5670_GLB_CLK,
21825e8351deSBard Liao 		RT5670_SCLK_SRC_MASK, reg_val);
21835e8351deSBard Liao 	rt5670->sysclk = freq;
21845e8351deSBard Liao 	rt5670->sysclk_src = clk_id;
21855e8351deSBard Liao 
21865e8351deSBard Liao 	dev_dbg(dai->dev, "Sysclk is %dHz and clock id is %d\n", freq, clk_id);
21875e8351deSBard Liao 
21885e8351deSBard Liao 	return 0;
21895e8351deSBard Liao }
21905e8351deSBard Liao 
21915e8351deSBard Liao static int rt5670_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source,
21925e8351deSBard Liao 			unsigned int freq_in, unsigned int freq_out)
21935e8351deSBard Liao {
21945e8351deSBard Liao 	struct snd_soc_codec *codec = dai->codec;
21955e8351deSBard Liao 	struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec);
21965e8351deSBard Liao 	struct rl6231_pll_code pll_code;
21975e8351deSBard Liao 	int ret;
21985e8351deSBard Liao 
21995e8351deSBard Liao 	if (source == rt5670->pll_src && freq_in == rt5670->pll_in &&
22005e8351deSBard Liao 	    freq_out == rt5670->pll_out)
22015e8351deSBard Liao 		return 0;
22025e8351deSBard Liao 
22035e8351deSBard Liao 	if (!freq_in || !freq_out) {
22045e8351deSBard Liao 		dev_dbg(codec->dev, "PLL disabled\n");
22055e8351deSBard Liao 
22065e8351deSBard Liao 		rt5670->pll_in = 0;
22075e8351deSBard Liao 		rt5670->pll_out = 0;
22085e8351deSBard Liao 		snd_soc_update_bits(codec, RT5670_GLB_CLK,
22095e8351deSBard Liao 			RT5670_SCLK_SRC_MASK, RT5670_SCLK_SRC_MCLK);
22105e8351deSBard Liao 		return 0;
22115e8351deSBard Liao 	}
22125e8351deSBard Liao 
22135e8351deSBard Liao 	switch (source) {
22145e8351deSBard Liao 	case RT5670_PLL1_S_MCLK:
22155e8351deSBard Liao 		snd_soc_update_bits(codec, RT5670_GLB_CLK,
22165e8351deSBard Liao 			RT5670_PLL1_SRC_MASK, RT5670_PLL1_SRC_MCLK);
22175e8351deSBard Liao 		break;
22185e8351deSBard Liao 	case RT5670_PLL1_S_BCLK1:
22195e8351deSBard Liao 	case RT5670_PLL1_S_BCLK2:
22205e8351deSBard Liao 	case RT5670_PLL1_S_BCLK3:
22215e8351deSBard Liao 	case RT5670_PLL1_S_BCLK4:
22225e8351deSBard Liao 		switch (dai->id) {
22235e8351deSBard Liao 		case RT5670_AIF1:
22245e8351deSBard Liao 			snd_soc_update_bits(codec, RT5670_GLB_CLK,
22255e8351deSBard Liao 				RT5670_PLL1_SRC_MASK, RT5670_PLL1_SRC_BCLK1);
22265e8351deSBard Liao 			break;
22275e8351deSBard Liao 		case RT5670_AIF2:
22285e8351deSBard Liao 			snd_soc_update_bits(codec, RT5670_GLB_CLK,
22295e8351deSBard Liao 				RT5670_PLL1_SRC_MASK, RT5670_PLL1_SRC_BCLK2);
22305e8351deSBard Liao 			break;
22315e8351deSBard Liao 		default:
22325e8351deSBard Liao 			dev_err(codec->dev, "Invalid dai->id: %d\n", dai->id);
22335e8351deSBard Liao 			return -EINVAL;
22345e8351deSBard Liao 		}
22355e8351deSBard Liao 		break;
22365e8351deSBard Liao 	default:
22375e8351deSBard Liao 		dev_err(codec->dev, "Unknown PLL source %d\n", source);
22385e8351deSBard Liao 		return -EINVAL;
22395e8351deSBard Liao 	}
22405e8351deSBard Liao 
22415e8351deSBard Liao 	ret = rl6231_pll_calc(freq_in, freq_out, &pll_code);
22425e8351deSBard Liao 	if (ret < 0) {
22435e8351deSBard Liao 		dev_err(codec->dev, "Unsupport input clock %d\n", freq_in);
22445e8351deSBard Liao 		return ret;
22455e8351deSBard Liao 	}
22465e8351deSBard Liao 
22475e8351deSBard Liao 	dev_dbg(codec->dev, "bypass=%d m=%d n=%d k=%d\n",
22485e8351deSBard Liao 		pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code),
22495e8351deSBard Liao 		pll_code.n_code, pll_code.k_code);
22505e8351deSBard Liao 
22515e8351deSBard Liao 	snd_soc_write(codec, RT5670_PLL_CTRL1,
22525e8351deSBard Liao 		pll_code.n_code << RT5670_PLL_N_SFT | pll_code.k_code);
22535e8351deSBard Liao 	snd_soc_write(codec, RT5670_PLL_CTRL2,
22545e8351deSBard Liao 		(pll_code.m_bp ? 0 : pll_code.m_code) << RT5670_PLL_M_SFT |
22555e8351deSBard Liao 		pll_code.m_bp << RT5670_PLL_M_BP_SFT);
22565e8351deSBard Liao 
22575e8351deSBard Liao 	rt5670->pll_in = freq_in;
22585e8351deSBard Liao 	rt5670->pll_out = freq_out;
22595e8351deSBard Liao 	rt5670->pll_src = source;
22605e8351deSBard Liao 
22615e8351deSBard Liao 	return 0;
22625e8351deSBard Liao }
22635e8351deSBard Liao 
22645e8351deSBard Liao static int rt5670_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
22655e8351deSBard Liao 			unsigned int rx_mask, int slots, int slot_width)
22665e8351deSBard Liao {
22675e8351deSBard Liao 	struct snd_soc_codec *codec = dai->codec;
22685e8351deSBard Liao 	unsigned int val = 0;
22695e8351deSBard Liao 
22705e8351deSBard Liao 	if (rx_mask || tx_mask)
22715e8351deSBard Liao 		val |= (1 << 14);
22725e8351deSBard Liao 
22735e8351deSBard Liao 	switch (slots) {
22745e8351deSBard Liao 	case 4:
22755e8351deSBard Liao 		val |= (1 << 12);
22765e8351deSBard Liao 		break;
22775e8351deSBard Liao 	case 6:
22785e8351deSBard Liao 		val |= (2 << 12);
22795e8351deSBard Liao 		break;
22805e8351deSBard Liao 	case 8:
22815e8351deSBard Liao 		val |= (3 << 12);
22825e8351deSBard Liao 		break;
22835e8351deSBard Liao 	case 2:
22845e8351deSBard Liao 		break;
22855e8351deSBard Liao 	default:
22865e8351deSBard Liao 		return -EINVAL;
22875e8351deSBard Liao 	}
22885e8351deSBard Liao 
22895e8351deSBard Liao 	switch (slot_width) {
22905e8351deSBard Liao 	case 20:
22915e8351deSBard Liao 		val |= (1 << 10);
22925e8351deSBard Liao 		break;
22935e8351deSBard Liao 	case 24:
22945e8351deSBard Liao 		val |= (2 << 10);
22955e8351deSBard Liao 		break;
22965e8351deSBard Liao 	case 32:
22975e8351deSBard Liao 		val |= (3 << 10);
22985e8351deSBard Liao 		break;
22995e8351deSBard Liao 	case 16:
23005e8351deSBard Liao 		break;
23015e8351deSBard Liao 	default:
23025e8351deSBard Liao 		return -EINVAL;
23035e8351deSBard Liao 	}
23045e8351deSBard Liao 
23055e8351deSBard Liao 	snd_soc_update_bits(codec, RT5670_TDM_CTRL_1, 0x7c00, val);
23065e8351deSBard Liao 
23075e8351deSBard Liao 	return 0;
23085e8351deSBard Liao }
23095e8351deSBard Liao 
23105e8351deSBard Liao static int rt5670_set_bias_level(struct snd_soc_codec *codec,
23115e8351deSBard Liao 			enum snd_soc_bias_level level)
23125e8351deSBard Liao {
2313044b724aSBard Liao 	struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec);
2314044b724aSBard Liao 
23155e8351deSBard Liao 	switch (level) {
23165e8351deSBard Liao 	case SND_SOC_BIAS_PREPARE:
23175e8351deSBard Liao 		if (SND_SOC_BIAS_STANDBY == codec->dapm.bias_level) {
23185e8351deSBard Liao 			snd_soc_update_bits(codec, RT5670_PWR_ANLG1,
23195e8351deSBard Liao 				RT5670_PWR_VREF1 | RT5670_PWR_MB |
23205e8351deSBard Liao 				RT5670_PWR_BG | RT5670_PWR_VREF2,
23215e8351deSBard Liao 				RT5670_PWR_VREF1 | RT5670_PWR_MB |
23225e8351deSBard Liao 				RT5670_PWR_BG | RT5670_PWR_VREF2);
23235e8351deSBard Liao 			mdelay(10);
23245e8351deSBard Liao 			snd_soc_update_bits(codec, RT5670_PWR_ANLG1,
23255e8351deSBard Liao 				RT5670_PWR_FV1 | RT5670_PWR_FV2,
23265e8351deSBard Liao 				RT5670_PWR_FV1 | RT5670_PWR_FV2);
23275e8351deSBard Liao 			snd_soc_update_bits(codec, RT5670_CHARGE_PUMP,
23285e8351deSBard Liao 				RT5670_OSW_L_MASK | RT5670_OSW_R_MASK,
23295e8351deSBard Liao 				RT5670_OSW_L_DIS | RT5670_OSW_R_DIS);
23305e8351deSBard Liao 			snd_soc_update_bits(codec, RT5670_DIG_MISC, 0x1, 0x1);
23315e8351deSBard Liao 			snd_soc_update_bits(codec, RT5670_PWR_ANLG1,
23325e8351deSBard Liao 				RT5670_LDO_SEL_MASK, 0x3);
23335e8351deSBard Liao 		}
23345e8351deSBard Liao 		break;
23355e8351deSBard Liao 	case SND_SOC_BIAS_STANDBY:
2336044b724aSBard Liao 		snd_soc_update_bits(codec, RT5670_PWR_ANLG1,
2337044b724aSBard Liao 				RT5670_PWR_VREF1 | RT5670_PWR_VREF2 |
2338044b724aSBard Liao 				RT5670_PWR_FV1 | RT5670_PWR_FV2, 0);
23395e8351deSBard Liao 		snd_soc_update_bits(codec, RT5670_PWR_ANLG1,
23405e8351deSBard Liao 				RT5670_LDO_SEL_MASK, 0x1);
23415e8351deSBard Liao 		break;
2342044b724aSBard Liao 	case SND_SOC_BIAS_OFF:
2343044b724aSBard Liao 		if (rt5670->pdata.jd_mode)
2344044b724aSBard Liao 			snd_soc_update_bits(codec, RT5670_PWR_ANLG1,
2345044b724aSBard Liao 				RT5670_PWR_VREF1 | RT5670_PWR_MB |
2346044b724aSBard Liao 				RT5670_PWR_BG | RT5670_PWR_VREF2 |
2347044b724aSBard Liao 				RT5670_PWR_FV1 | RT5670_PWR_FV2,
2348044b724aSBard Liao 				RT5670_PWR_MB | RT5670_PWR_BG);
2349044b724aSBard Liao 		else
2350044b724aSBard Liao 			snd_soc_update_bits(codec, RT5670_PWR_ANLG1,
2351044b724aSBard Liao 				RT5670_PWR_VREF1 | RT5670_PWR_MB |
2352044b724aSBard Liao 				RT5670_PWR_BG | RT5670_PWR_VREF2 |
2353044b724aSBard Liao 				RT5670_PWR_FV1 | RT5670_PWR_FV2, 0);
2354044b724aSBard Liao 
2355044b724aSBard Liao 		snd_soc_update_bits(codec, RT5670_DIG_MISC, 0x1, 0x0);
2356044b724aSBard Liao 		break;
23575e8351deSBard Liao 
23585e8351deSBard Liao 	default:
23595e8351deSBard Liao 		break;
23605e8351deSBard Liao 	}
23615e8351deSBard Liao 	codec->dapm.bias_level = level;
23625e8351deSBard Liao 
23635e8351deSBard Liao 	return 0;
23645e8351deSBard Liao }
23655e8351deSBard Liao 
23665e8351deSBard Liao static int rt5670_probe(struct snd_soc_codec *codec)
23675e8351deSBard Liao {
23685e8351deSBard Liao 	struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec);
23695e8351deSBard Liao 
23700cf18632SBard Liao 	switch (snd_soc_read(codec, RT5670_RESET) & RT5670_ID_MASK) {
23710cf18632SBard Liao 	case RT5670_ID_5670:
23720cf18632SBard Liao 	case RT5670_ID_5671:
23730cf18632SBard Liao 		snd_soc_dapm_new_controls(&codec->dapm,
23740cf18632SBard Liao 			rt5670_specific_dapm_widgets,
23750cf18632SBard Liao 			ARRAY_SIZE(rt5670_specific_dapm_widgets));
23760cf18632SBard Liao 		snd_soc_dapm_add_routes(&codec->dapm,
23770cf18632SBard Liao 			rt5670_specific_dapm_routes,
23780cf18632SBard Liao 			ARRAY_SIZE(rt5670_specific_dapm_routes));
23790cf18632SBard Liao 		break;
23800cf18632SBard Liao 	case RT5670_ID_5672:
23810cf18632SBard Liao 		snd_soc_dapm_new_controls(&codec->dapm,
23820cf18632SBard Liao 			rt5672_specific_dapm_widgets,
23830cf18632SBard Liao 			ARRAY_SIZE(rt5672_specific_dapm_widgets));
23840cf18632SBard Liao 		snd_soc_dapm_add_routes(&codec->dapm,
23850cf18632SBard Liao 			rt5672_specific_dapm_routes,
23860cf18632SBard Liao 			ARRAY_SIZE(rt5672_specific_dapm_routes));
23870cf18632SBard Liao 		break;
23880cf18632SBard Liao 	default:
23890cf18632SBard Liao 		dev_err(codec->dev,
23900cf18632SBard Liao 			"The driver is for RT5670 RT5671 or RT5672 only\n");
23910cf18632SBard Liao 		return -ENODEV;
23920cf18632SBard Liao 	}
23935e8351deSBard Liao 	rt5670->codec = codec;
23945e8351deSBard Liao 
23955e8351deSBard Liao 	return 0;
23965e8351deSBard Liao }
23975e8351deSBard Liao 
23985e8351deSBard Liao static int rt5670_remove(struct snd_soc_codec *codec)
23995e8351deSBard Liao {
24005e8351deSBard Liao 	struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec);
24015e8351deSBard Liao 
24025e8351deSBard Liao 	regmap_write(rt5670->regmap, RT5670_RESET, 0);
24035e8351deSBard Liao 	return 0;
24045e8351deSBard Liao }
24055e8351deSBard Liao 
24065e8351deSBard Liao #ifdef CONFIG_PM
24075e8351deSBard Liao static int rt5670_suspend(struct snd_soc_codec *codec)
24085e8351deSBard Liao {
24095e8351deSBard Liao 	struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec);
24105e8351deSBard Liao 
24115e8351deSBard Liao 	regcache_cache_only(rt5670->regmap, true);
24125e8351deSBard Liao 	regcache_mark_dirty(rt5670->regmap);
24135e8351deSBard Liao 	return 0;
24145e8351deSBard Liao }
24155e8351deSBard Liao 
24165e8351deSBard Liao static int rt5670_resume(struct snd_soc_codec *codec)
24175e8351deSBard Liao {
24185e8351deSBard Liao 	struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec);
24195e8351deSBard Liao 
24205e8351deSBard Liao 	regcache_cache_only(rt5670->regmap, false);
24215e8351deSBard Liao 	regcache_sync(rt5670->regmap);
24225e8351deSBard Liao 
24235e8351deSBard Liao 	return 0;
24245e8351deSBard Liao }
24255e8351deSBard Liao #else
24265e8351deSBard Liao #define rt5670_suspend NULL
24275e8351deSBard Liao #define rt5670_resume NULL
24285e8351deSBard Liao #endif
24295e8351deSBard Liao 
24305e8351deSBard Liao #define RT5670_STEREO_RATES SNDRV_PCM_RATE_8000_96000
24315e8351deSBard Liao #define RT5670_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
24325e8351deSBard Liao 			SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8)
24335e8351deSBard Liao 
2434ff62b958SMark Brown static struct snd_soc_dai_ops rt5670_aif_dai_ops = {
24355e8351deSBard Liao 	.hw_params = rt5670_hw_params,
24365e8351deSBard Liao 	.set_fmt = rt5670_set_dai_fmt,
24375e8351deSBard Liao 	.set_sysclk = rt5670_set_dai_sysclk,
24385e8351deSBard Liao 	.set_tdm_slot = rt5670_set_tdm_slot,
24395e8351deSBard Liao 	.set_pll = rt5670_set_dai_pll,
24405e8351deSBard Liao };
24415e8351deSBard Liao 
2442ff62b958SMark Brown static struct snd_soc_dai_driver rt5670_dai[] = {
24435e8351deSBard Liao 	{
24445e8351deSBard Liao 		.name = "rt5670-aif1",
24455e8351deSBard Liao 		.id = RT5670_AIF1,
24465e8351deSBard Liao 		.playback = {
24475e8351deSBard Liao 			.stream_name = "AIF1 Playback",
24485e8351deSBard Liao 			.channels_min = 1,
24495e8351deSBard Liao 			.channels_max = 2,
24505e8351deSBard Liao 			.rates = RT5670_STEREO_RATES,
24515e8351deSBard Liao 			.formats = RT5670_FORMATS,
24525e8351deSBard Liao 		},
24535e8351deSBard Liao 		.capture = {
24545e8351deSBard Liao 			.stream_name = "AIF1 Capture",
24555e8351deSBard Liao 			.channels_min = 1,
24565e8351deSBard Liao 			.channels_max = 2,
24575e8351deSBard Liao 			.rates = RT5670_STEREO_RATES,
24585e8351deSBard Liao 			.formats = RT5670_FORMATS,
24595e8351deSBard Liao 		},
24605e8351deSBard Liao 		.ops = &rt5670_aif_dai_ops,
24615e8351deSBard Liao 	},
24625e8351deSBard Liao 	{
24635e8351deSBard Liao 		.name = "rt5670-aif2",
24645e8351deSBard Liao 		.id = RT5670_AIF2,
24655e8351deSBard Liao 		.playback = {
24665e8351deSBard Liao 			.stream_name = "AIF2 Playback",
24675e8351deSBard Liao 			.channels_min = 1,
24685e8351deSBard Liao 			.channels_max = 2,
24695e8351deSBard Liao 			.rates = RT5670_STEREO_RATES,
24705e8351deSBard Liao 			.formats = RT5670_FORMATS,
24715e8351deSBard Liao 		},
24725e8351deSBard Liao 		.capture = {
24735e8351deSBard Liao 			.stream_name = "AIF2 Capture",
24745e8351deSBard Liao 			.channels_min = 1,
24755e8351deSBard Liao 			.channels_max = 2,
24765e8351deSBard Liao 			.rates = RT5670_STEREO_RATES,
24775e8351deSBard Liao 			.formats = RT5670_FORMATS,
24785e8351deSBard Liao 		},
24795e8351deSBard Liao 		.ops = &rt5670_aif_dai_ops,
24805e8351deSBard Liao 	},
24815e8351deSBard Liao };
24825e8351deSBard Liao 
24835e8351deSBard Liao static struct snd_soc_codec_driver soc_codec_dev_rt5670 = {
24845e8351deSBard Liao 	.probe = rt5670_probe,
24855e8351deSBard Liao 	.remove = rt5670_remove,
24865e8351deSBard Liao 	.suspend = rt5670_suspend,
24875e8351deSBard Liao 	.resume = rt5670_resume,
24885e8351deSBard Liao 	.set_bias_level = rt5670_set_bias_level,
24895e8351deSBard Liao 	.idle_bias_off = true,
24905e8351deSBard Liao 	.controls = rt5670_snd_controls,
24915e8351deSBard Liao 	.num_controls = ARRAY_SIZE(rt5670_snd_controls),
24925e8351deSBard Liao 	.dapm_widgets = rt5670_dapm_widgets,
24935e8351deSBard Liao 	.num_dapm_widgets = ARRAY_SIZE(rt5670_dapm_widgets),
24945e8351deSBard Liao 	.dapm_routes = rt5670_dapm_routes,
24955e8351deSBard Liao 	.num_dapm_routes = ARRAY_SIZE(rt5670_dapm_routes),
24965e8351deSBard Liao };
24975e8351deSBard Liao 
24985e8351deSBard Liao static const struct regmap_config rt5670_regmap = {
24995e8351deSBard Liao 	.reg_bits = 8,
25005e8351deSBard Liao 	.val_bits = 16,
25015e8351deSBard Liao 	.max_register = RT5670_VENDOR_ID2 + 1 + (ARRAY_SIZE(rt5670_ranges) *
25025e8351deSBard Liao 					       RT5670_PR_SPACING),
25035e8351deSBard Liao 	.volatile_reg = rt5670_volatile_register,
25045e8351deSBard Liao 	.readable_reg = rt5670_readable_register,
25055e8351deSBard Liao 	.cache_type = REGCACHE_RBTREE,
25065e8351deSBard Liao 	.reg_defaults = rt5670_reg,
25075e8351deSBard Liao 	.num_reg_defaults = ARRAY_SIZE(rt5670_reg),
25085e8351deSBard Liao 	.ranges = rt5670_ranges,
25095e8351deSBard Liao 	.num_ranges = ARRAY_SIZE(rt5670_ranges),
25105e8351deSBard Liao };
25115e8351deSBard Liao 
25125e8351deSBard Liao static const struct i2c_device_id rt5670_i2c_id[] = {
25135e8351deSBard Liao 	{ "rt5670", 0 },
25140cf18632SBard Liao 	{ "rt5671", 0 },
25150cf18632SBard Liao 	{ "rt5672", 0 },
25165e8351deSBard Liao 	{ }
25175e8351deSBard Liao };
25185e8351deSBard Liao MODULE_DEVICE_TABLE(i2c, rt5670_i2c_id);
25195e8351deSBard Liao 
25200605815eSMengdong Lin #ifdef CONFIG_ACPI
25210605815eSMengdong Lin static struct acpi_device_id rt5670_acpi_match[] = {
25220605815eSMengdong Lin 	{ "10EC5670", 0},
25230605815eSMengdong Lin 	{ },
25240605815eSMengdong Lin };
25250605815eSMengdong Lin MODULE_DEVICE_TABLE(acpi, rt5670_acpi_match);
25260605815eSMengdong Lin #endif
25270605815eSMengdong Lin 
25285e8351deSBard Liao static int rt5670_i2c_probe(struct i2c_client *i2c,
25295e8351deSBard Liao 		    const struct i2c_device_id *id)
25305e8351deSBard Liao {
25315e8351deSBard Liao 	struct rt5670_platform_data *pdata = dev_get_platdata(&i2c->dev);
25325e8351deSBard Liao 	struct rt5670_priv *rt5670;
25335e8351deSBard Liao 	int ret;
25345e8351deSBard Liao 	unsigned int val;
25355e8351deSBard Liao 
25365e8351deSBard Liao 	rt5670 = devm_kzalloc(&i2c->dev,
25375e8351deSBard Liao 				sizeof(struct rt5670_priv),
25385e8351deSBard Liao 				GFP_KERNEL);
25395e8351deSBard Liao 	if (NULL == rt5670)
25405e8351deSBard Liao 		return -ENOMEM;
25415e8351deSBard Liao 
25425e8351deSBard Liao 	i2c_set_clientdata(i2c, rt5670);
25435e8351deSBard Liao 
25445e8351deSBard Liao 	if (pdata)
25455e8351deSBard Liao 		rt5670->pdata = *pdata;
25465e8351deSBard Liao 
25475e8351deSBard Liao 	rt5670->regmap = devm_regmap_init_i2c(i2c, &rt5670_regmap);
25485e8351deSBard Liao 	if (IS_ERR(rt5670->regmap)) {
25495e8351deSBard Liao 		ret = PTR_ERR(rt5670->regmap);
25505e8351deSBard Liao 		dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
25515e8351deSBard Liao 			ret);
25525e8351deSBard Liao 		return ret;
25535e8351deSBard Liao 	}
25545e8351deSBard Liao 
25555e8351deSBard Liao 	regmap_read(rt5670->regmap, RT5670_VENDOR_ID2, &val);
25565e8351deSBard Liao 	if (val != RT5670_DEVICE_ID) {
25575e8351deSBard Liao 		dev_err(&i2c->dev,
25585e8351deSBard Liao 			"Device with ID register %x is not rt5670/72\n", val);
25595e8351deSBard Liao 		return -ENODEV;
25605e8351deSBard Liao 	}
25615e8351deSBard Liao 
25625e8351deSBard Liao 	regmap_write(rt5670->regmap, RT5670_RESET, 0);
25635e8351deSBard Liao 	regmap_update_bits(rt5670->regmap, RT5670_PWR_ANLG1,
25645e8351deSBard Liao 		RT5670_PWR_HP_L | RT5670_PWR_HP_R |
25655e8351deSBard Liao 		RT5670_PWR_VREF2, RT5670_PWR_VREF2);
25665e8351deSBard Liao 	msleep(100);
25675e8351deSBard Liao 
25685e8351deSBard Liao 	regmap_write(rt5670->regmap, RT5670_RESET, 0);
25695e8351deSBard Liao 
25705e8351deSBard Liao 	ret = regmap_register_patch(rt5670->regmap, init_list,
25715e8351deSBard Liao 				    ARRAY_SIZE(init_list));
25725e8351deSBard Liao 	if (ret != 0)
25735e8351deSBard Liao 		dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret);
25745e8351deSBard Liao 
25755e8351deSBard Liao 	if (rt5670->pdata.in2_diff)
25765e8351deSBard Liao 		regmap_update_bits(rt5670->regmap, RT5670_IN2,
25775e8351deSBard Liao 					RT5670_IN_DF2, RT5670_IN_DF2);
25785e8351deSBard Liao 
25795e8351deSBard Liao 	if (i2c->irq) {
25805e8351deSBard Liao 		regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL1,
25815e8351deSBard Liao 				   RT5670_GP1_PIN_MASK, RT5670_GP1_PIN_IRQ);
25825e8351deSBard Liao 		regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL2,
25835e8351deSBard Liao 				   RT5670_GP1_PF_MASK, RT5670_GP1_PF_OUT);
25845e8351deSBard Liao 
25855e8351deSBard Liao 	}
25865e8351deSBard Liao 
25875e8351deSBard Liao 	if (rt5670->pdata.jd_mode) {
25885e8351deSBard Liao 		regmap_update_bits(rt5670->regmap, RT5670_PWR_ANLG1,
25895e8351deSBard Liao 				   RT5670_PWR_MB, RT5670_PWR_MB);
25905e8351deSBard Liao 		regmap_update_bits(rt5670->regmap, RT5670_PWR_ANLG2,
25915e8351deSBard Liao 				   RT5670_PWR_JD1, RT5670_PWR_JD1);
25925e8351deSBard Liao 		regmap_update_bits(rt5670->regmap, RT5670_IRQ_CTRL1,
25935e8351deSBard Liao 				   RT5670_JD1_1_EN_MASK, RT5670_JD1_1_EN);
25945e8351deSBard Liao 		regmap_update_bits(rt5670->regmap, RT5670_JD_CTRL3,
25955e8351deSBard Liao 				   RT5670_JD_TRI_CBJ_SEL_MASK |
25965e8351deSBard Liao 				   RT5670_JD_TRI_HPO_SEL_MASK,
25975e8351deSBard Liao 				   RT5670_JD_CBJ_JD1_1 | RT5670_JD_HPO_JD1_1);
25985e8351deSBard Liao 		switch (rt5670->pdata.jd_mode) {
25995e8351deSBard Liao 		case 1:
26005e8351deSBard Liao 			regmap_update_bits(rt5670->regmap, RT5670_A_JD_CTRL1,
26015e8351deSBard Liao 					   RT5670_JD1_MODE_MASK,
26025e8351deSBard Liao 					   RT5670_JD1_MODE_0);
26035e8351deSBard Liao 			break;
26045e8351deSBard Liao 		case 2:
26055e8351deSBard Liao 			regmap_update_bits(rt5670->regmap, RT5670_A_JD_CTRL1,
26065e8351deSBard Liao 					   RT5670_JD1_MODE_MASK,
26075e8351deSBard Liao 					   RT5670_JD1_MODE_1);
26085e8351deSBard Liao 			break;
26095e8351deSBard Liao 		case 3:
26105e8351deSBard Liao 			regmap_update_bits(rt5670->regmap, RT5670_A_JD_CTRL1,
26115e8351deSBard Liao 					   RT5670_JD1_MODE_MASK,
26125e8351deSBard Liao 					   RT5670_JD1_MODE_2);
26135e8351deSBard Liao 			break;
26145e8351deSBard Liao 		default:
26155e8351deSBard Liao 			break;
26165e8351deSBard Liao 		}
26175e8351deSBard Liao 	}
26185e8351deSBard Liao 
26195e8351deSBard Liao 	if (rt5670->pdata.dmic_en) {
26205e8351deSBard Liao 		regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL1,
26215e8351deSBard Liao 				   RT5670_GP2_PIN_MASK,
26225e8351deSBard Liao 				   RT5670_GP2_PIN_DMIC1_SCL);
26235e8351deSBard Liao 
26245e8351deSBard Liao 		switch (rt5670->pdata.dmic1_data_pin) {
26255e8351deSBard Liao 		case RT5670_DMIC_DATA_IN2P:
26265e8351deSBard Liao 			regmap_update_bits(rt5670->regmap, RT5670_DMIC_CTRL1,
26275e8351deSBard Liao 					   RT5670_DMIC_1_DP_MASK,
26285e8351deSBard Liao 					   RT5670_DMIC_1_DP_IN2P);
26295e8351deSBard Liao 			break;
26305e8351deSBard Liao 
26315e8351deSBard Liao 		case RT5670_DMIC_DATA_GPIO6:
26325e8351deSBard Liao 			regmap_update_bits(rt5670->regmap, RT5670_DMIC_CTRL1,
26335e8351deSBard Liao 					   RT5670_DMIC_1_DP_MASK,
26345e8351deSBard Liao 					   RT5670_DMIC_1_DP_GPIO6);
26355e8351deSBard Liao 			regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL1,
26365e8351deSBard Liao 					   RT5670_GP6_PIN_MASK,
26375e8351deSBard Liao 					   RT5670_GP6_PIN_DMIC1_SDA);
26385e8351deSBard Liao 			break;
26395e8351deSBard Liao 
26405e8351deSBard Liao 		case RT5670_DMIC_DATA_GPIO7:
26415e8351deSBard Liao 			regmap_update_bits(rt5670->regmap, RT5670_DMIC_CTRL1,
26425e8351deSBard Liao 					   RT5670_DMIC_1_DP_MASK,
26435e8351deSBard Liao 					   RT5670_DMIC_1_DP_GPIO7);
26445e8351deSBard Liao 			regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL1,
26455e8351deSBard Liao 					   RT5670_GP7_PIN_MASK,
26465e8351deSBard Liao 					   RT5670_GP7_PIN_DMIC1_SDA);
26475e8351deSBard Liao 			break;
26485e8351deSBard Liao 
26495e8351deSBard Liao 		default:
26505e8351deSBard Liao 			break;
26515e8351deSBard Liao 		}
26525e8351deSBard Liao 
26535e8351deSBard Liao 		switch (rt5670->pdata.dmic2_data_pin) {
26545e8351deSBard Liao 		case RT5670_DMIC_DATA_IN3N:
26555e8351deSBard Liao 			regmap_update_bits(rt5670->regmap, RT5670_DMIC_CTRL1,
26565e8351deSBard Liao 					   RT5670_DMIC_2_DP_MASK,
26575e8351deSBard Liao 					   RT5670_DMIC_2_DP_IN3N);
26585e8351deSBard Liao 			break;
26595e8351deSBard Liao 
26605e8351deSBard Liao 		case RT5670_DMIC_DATA_GPIO8:
26615e8351deSBard Liao 			regmap_update_bits(rt5670->regmap, RT5670_DMIC_CTRL1,
26625e8351deSBard Liao 					   RT5670_DMIC_2_DP_MASK,
26635e8351deSBard Liao 					   RT5670_DMIC_2_DP_GPIO8);
26645e8351deSBard Liao 			regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL1,
26655e8351deSBard Liao 					   RT5670_GP8_PIN_MASK,
26665e8351deSBard Liao 					   RT5670_GP8_PIN_DMIC2_SDA);
26675e8351deSBard Liao 			break;
26685e8351deSBard Liao 
26695e8351deSBard Liao 		default:
26705e8351deSBard Liao 			break;
26715e8351deSBard Liao 		}
26725e8351deSBard Liao 
26735e8351deSBard Liao 		switch (rt5670->pdata.dmic3_data_pin) {
26745e8351deSBard Liao 		case RT5670_DMIC_DATA_GPIO5:
26755e8351deSBard Liao 			regmap_update_bits(rt5670->regmap, RT5670_DMIC_CTRL2,
26765e8351deSBard Liao 					   RT5670_DMIC_3_DP_MASK,
26775e8351deSBard Liao 					   RT5670_DMIC_3_DP_GPIO5);
26785e8351deSBard Liao 			regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL1,
26795e8351deSBard Liao 					   RT5670_GP5_PIN_MASK,
26805e8351deSBard Liao 					   RT5670_GP5_PIN_DMIC3_SDA);
26815e8351deSBard Liao 			break;
26825e8351deSBard Liao 
26835e8351deSBard Liao 		case RT5670_DMIC_DATA_GPIO9:
26845e8351deSBard Liao 		case RT5670_DMIC_DATA_GPIO10:
26855e8351deSBard Liao 			dev_err(&i2c->dev,
26865e8351deSBard Liao 				"Always use GPIO5 as DMIC3 data pin\n");
26875e8351deSBard Liao 			break;
26885e8351deSBard Liao 
26895e8351deSBard Liao 		default:
26905e8351deSBard Liao 			break;
26915e8351deSBard Liao 		}
26925e8351deSBard Liao 
26935e8351deSBard Liao 	}
26945e8351deSBard Liao 
26955e8351deSBard Liao 	ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5670,
26965e8351deSBard Liao 			rt5670_dai, ARRAY_SIZE(rt5670_dai));
26975e8351deSBard Liao 	if (ret < 0)
26985e8351deSBard Liao 		goto err;
26995e8351deSBard Liao 
27005e8351deSBard Liao 	return 0;
27015e8351deSBard Liao err:
27025e8351deSBard Liao 	return ret;
27035e8351deSBard Liao }
27045e8351deSBard Liao 
27055e8351deSBard Liao static int rt5670_i2c_remove(struct i2c_client *i2c)
27065e8351deSBard Liao {
27075e8351deSBard Liao 	snd_soc_unregister_codec(&i2c->dev);
27085e8351deSBard Liao 
27095e8351deSBard Liao 	return 0;
27105e8351deSBard Liao }
27115e8351deSBard Liao 
2712ff62b958SMark Brown static struct i2c_driver rt5670_i2c_driver = {
27135e8351deSBard Liao 	.driver = {
27145e8351deSBard Liao 		.name = "rt5670",
27155e8351deSBard Liao 		.owner = THIS_MODULE,
27160605815eSMengdong Lin 		.acpi_match_table = ACPI_PTR(rt5670_acpi_match),
27175e8351deSBard Liao 	},
27185e8351deSBard Liao 	.probe = rt5670_i2c_probe,
27195e8351deSBard Liao 	.remove   = rt5670_i2c_remove,
27205e8351deSBard Liao 	.id_table = rt5670_i2c_id,
27215e8351deSBard Liao };
27225e8351deSBard Liao 
27235e8351deSBard Liao module_i2c_driver(rt5670_i2c_driver);
27245e8351deSBard Liao 
27255e8351deSBard Liao MODULE_DESCRIPTION("ASoC RT5670 driver");
27265e8351deSBard Liao MODULE_AUTHOR("Bard Liao <bardliao@realtek.com>");
27275e8351deSBard Liao MODULE_LICENSE("GPL v2");
2728