1d2912cb1SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
20e826e86SOder Chiou /*
30e826e86SOder Chiou * rt5677.c -- RT5677 ALSA SoC audio codec driver
40e826e86SOder Chiou *
50e826e86SOder Chiou * Copyright 2013 Realtek Semiconductor Corp.
60e826e86SOder Chiou * Author: Oder Chiou <oder_chiou@realtek.com>
70e826e86SOder Chiou */
80e826e86SOder Chiou
90e826e86SOder Chiou #include <linux/delay.h>
10af48f1d0SOder Chiou #include <linux/firmware.h>
11*ea1c1019SAndy Shevchenko #include <linux/fs.h>
12*ea1c1019SAndy Shevchenko #include <linux/i2c.h>
13*ea1c1019SAndy Shevchenko #include <linux/init.h>
144f7b018bSBen Zhang #include <linux/interrupt.h>
154f7b018bSBen Zhang #include <linux/irqdomain.h>
16*ea1c1019SAndy Shevchenko #include <linux/irq.h>
17*ea1c1019SAndy Shevchenko #include <linux/module.h>
18*ea1c1019SAndy Shevchenko #include <linux/moduleparam.h>
19*ea1c1019SAndy Shevchenko #include <linux/platform_device.h>
20*ea1c1019SAndy Shevchenko #include <linux/pm.h>
21*ea1c1019SAndy Shevchenko #include <linux/property.h>
22*ea1c1019SAndy Shevchenko #include <linux/regmap.h>
23*ea1c1019SAndy Shevchenko #include <linux/spi/spi.h>
244f7b018bSBen Zhang #include <linux/workqueue.h>
250e826e86SOder Chiou #include <sound/core.h>
260e826e86SOder Chiou #include <sound/pcm.h>
270e826e86SOder Chiou #include <sound/pcm_params.h>
280e826e86SOder Chiou #include <sound/soc.h>
290e826e86SOder Chiou #include <sound/soc-dapm.h>
300e826e86SOder Chiou #include <sound/initval.h>
310e826e86SOder Chiou #include <sound/tlv.h>
320e826e86SOder Chiou
3330f14b43SAxel Lin #include "rl6231.h"
340e826e86SOder Chiou #include "rt5677.h"
35af48f1d0SOder Chiou #include "rt5677-spi.h"
360e826e86SOder Chiou
370e826e86SOder Chiou #define RT5677_DEVICE_ID 0x6327
380e826e86SOder Chiou
39461c6232SBen Zhang /* Register controlling boot vector */
40461c6232SBen Zhang #define RT5677_DSP_BOOT_VECTOR 0x1801f090
41461c6232SBen Zhang #define RT5677_MODEL_ADDR 0x5FFC9800
42461c6232SBen Zhang
430e826e86SOder Chiou #define RT5677_PR_RANGE_BASE (0xff + 1)
440e826e86SOder Chiou #define RT5677_PR_SPACING 0x100
450e826e86SOder Chiou
460e826e86SOder Chiou #define RT5677_PR_BASE (RT5677_PR_RANGE_BASE + (0 * RT5677_PR_SPACING))
470e826e86SOder Chiou
480e826e86SOder Chiou static const struct regmap_range_cfg rt5677_ranges[] = {
490e826e86SOder Chiou {
500e826e86SOder Chiou .name = "PR",
510e826e86SOder Chiou .range_min = RT5677_PR_BASE,
520e826e86SOder Chiou .range_max = RT5677_PR_BASE + 0xfd,
530e826e86SOder Chiou .selector_reg = RT5677_PRIV_INDEX,
540e826e86SOder Chiou .selector_mask = 0xff,
550e826e86SOder Chiou .selector_shift = 0x0,
560e826e86SOder Chiou .window_start = RT5677_PRIV_DATA,
570e826e86SOder Chiou .window_len = 0x1,
580e826e86SOder Chiou },
590e826e86SOder Chiou };
600e826e86SOder Chiou
618019ff6cSNariman Poushin static const struct reg_sequence init_list[] = {
6286ae04b1SOder Chiou {RT5677_ASRC_12, 0x0018},
630e826e86SOder Chiou {RT5677_PR_BASE + 0x3d, 0x364d},
640e826e86SOder Chiou {RT5677_PR_BASE + 0x17, 0x4fc0},
650e826e86SOder Chiou {RT5677_PR_BASE + 0x13, 0x0312},
660e826e86SOder Chiou {RT5677_PR_BASE + 0x1e, 0x0000},
670e826e86SOder Chiou {RT5677_PR_BASE + 0x12, 0x0eaa},
680e826e86SOder Chiou {RT5677_PR_BASE + 0x14, 0x018a},
6974d6ea52SBard Liao {RT5677_PR_BASE + 0x15, 0x0490},
7074d6ea52SBard Liao {RT5677_PR_BASE + 0x38, 0x0f71},
7174d6ea52SBard Liao {RT5677_PR_BASE + 0x39, 0x0f71},
720e826e86SOder Chiou };
730e826e86SOder Chiou #define RT5677_INIT_REG_LEN ARRAY_SIZE(init_list)
740e826e86SOder Chiou
750e826e86SOder Chiou static const struct reg_default rt5677_reg[] = {
760e826e86SOder Chiou {RT5677_RESET , 0x0000},
770e826e86SOder Chiou {RT5677_LOUT1 , 0xa800},
780e826e86SOder Chiou {RT5677_IN1 , 0x0000},
790e826e86SOder Chiou {RT5677_MICBIAS , 0x0000},
800e826e86SOder Chiou {RT5677_SLIMBUS_PARAM , 0x0000},
810e826e86SOder Chiou {RT5677_SLIMBUS_RX , 0x0000},
820e826e86SOder Chiou {RT5677_SLIMBUS_CTRL , 0x0000},
830e826e86SOder Chiou {RT5677_SIDETONE_CTRL , 0x000b},
840e826e86SOder Chiou {RT5677_ANA_DAC1_2_3_SRC , 0x0000},
850e826e86SOder Chiou {RT5677_IF_DSP_DAC3_4_MIXER , 0x1111},
860e826e86SOder Chiou {RT5677_DAC4_DIG_VOL , 0xafaf},
870e826e86SOder Chiou {RT5677_DAC3_DIG_VOL , 0xafaf},
880e826e86SOder Chiou {RT5677_DAC1_DIG_VOL , 0xafaf},
890e826e86SOder Chiou {RT5677_DAC2_DIG_VOL , 0xafaf},
900e826e86SOder Chiou {RT5677_IF_DSP_DAC2_MIXER , 0x0011},
910e826e86SOder Chiou {RT5677_STO1_ADC_DIG_VOL , 0x2f2f},
920e826e86SOder Chiou {RT5677_MONO_ADC_DIG_VOL , 0x2f2f},
930e826e86SOder Chiou {RT5677_STO1_2_ADC_BST , 0x0000},
940e826e86SOder Chiou {RT5677_STO2_ADC_DIG_VOL , 0x2f2f},
950e826e86SOder Chiou {RT5677_ADC_BST_CTRL2 , 0x0000},
960e826e86SOder Chiou {RT5677_STO3_4_ADC_BST , 0x0000},
970e826e86SOder Chiou {RT5677_STO3_ADC_DIG_VOL , 0x2f2f},
980e826e86SOder Chiou {RT5677_STO4_ADC_DIG_VOL , 0x2f2f},
990e826e86SOder Chiou {RT5677_STO4_ADC_MIXER , 0xd4c0},
1000e826e86SOder Chiou {RT5677_STO3_ADC_MIXER , 0xd4c0},
1010e826e86SOder Chiou {RT5677_STO2_ADC_MIXER , 0xd4c0},
1020e826e86SOder Chiou {RT5677_STO1_ADC_MIXER , 0xd4c0},
1030e826e86SOder Chiou {RT5677_MONO_ADC_MIXER , 0xd4d1},
1040e826e86SOder Chiou {RT5677_ADC_IF_DSP_DAC1_MIXER , 0x8080},
1050e826e86SOder Chiou {RT5677_STO1_DAC_MIXER , 0xaaaa},
1060e826e86SOder Chiou {RT5677_MONO_DAC_MIXER , 0xaaaa},
1070e826e86SOder Chiou {RT5677_DD1_MIXER , 0xaaaa},
1080e826e86SOder Chiou {RT5677_DD2_MIXER , 0xaaaa},
1090e826e86SOder Chiou {RT5677_IF3_DATA , 0x0000},
1100e826e86SOder Chiou {RT5677_IF4_DATA , 0x0000},
1110e826e86SOder Chiou {RT5677_PDM_OUT_CTRL , 0x8888},
1120e826e86SOder Chiou {RT5677_PDM_DATA_CTRL1 , 0x0000},
1130e826e86SOder Chiou {RT5677_PDM_DATA_CTRL2 , 0x0000},
1140e826e86SOder Chiou {RT5677_PDM1_DATA_CTRL2 , 0x0000},
1150e826e86SOder Chiou {RT5677_PDM1_DATA_CTRL3 , 0x0000},
1160e826e86SOder Chiou {RT5677_PDM1_DATA_CTRL4 , 0x0000},
1170e826e86SOder Chiou {RT5677_PDM2_DATA_CTRL2 , 0x0000},
1180e826e86SOder Chiou {RT5677_PDM2_DATA_CTRL3 , 0x0000},
1190e826e86SOder Chiou {RT5677_PDM2_DATA_CTRL4 , 0x0000},
1200e826e86SOder Chiou {RT5677_TDM1_CTRL1 , 0x0300},
1210e826e86SOder Chiou {RT5677_TDM1_CTRL2 , 0x0000},
1220e826e86SOder Chiou {RT5677_TDM1_CTRL3 , 0x4000},
1230e826e86SOder Chiou {RT5677_TDM1_CTRL4 , 0x0123},
1240e826e86SOder Chiou {RT5677_TDM1_CTRL5 , 0x4567},
1250e826e86SOder Chiou {RT5677_TDM2_CTRL1 , 0x0300},
1260e826e86SOder Chiou {RT5677_TDM2_CTRL2 , 0x0000},
1270e826e86SOder Chiou {RT5677_TDM2_CTRL3 , 0x4000},
1280e826e86SOder Chiou {RT5677_TDM2_CTRL4 , 0x0123},
1290e826e86SOder Chiou {RT5677_TDM2_CTRL5 , 0x4567},
1300e826e86SOder Chiou {RT5677_I2C_MASTER_CTRL1 , 0x0001},
1310e826e86SOder Chiou {RT5677_I2C_MASTER_CTRL2 , 0x0000},
1320e826e86SOder Chiou {RT5677_I2C_MASTER_CTRL3 , 0x0000},
1330e826e86SOder Chiou {RT5677_I2C_MASTER_CTRL4 , 0x0000},
1340e826e86SOder Chiou {RT5677_I2C_MASTER_CTRL5 , 0x0000},
1350e826e86SOder Chiou {RT5677_I2C_MASTER_CTRL6 , 0x0000},
1360e826e86SOder Chiou {RT5677_I2C_MASTER_CTRL7 , 0x0000},
1370e826e86SOder Chiou {RT5677_I2C_MASTER_CTRL8 , 0x0000},
1380e826e86SOder Chiou {RT5677_DMIC_CTRL1 , 0x1505},
1390e826e86SOder Chiou {RT5677_DMIC_CTRL2 , 0x0055},
1400e826e86SOder Chiou {RT5677_HAP_GENE_CTRL1 , 0x0111},
1410e826e86SOder Chiou {RT5677_HAP_GENE_CTRL2 , 0x0064},
1420e826e86SOder Chiou {RT5677_HAP_GENE_CTRL3 , 0xef0e},
1430e826e86SOder Chiou {RT5677_HAP_GENE_CTRL4 , 0xf0f0},
1440e826e86SOder Chiou {RT5677_HAP_GENE_CTRL5 , 0xef0e},
1450e826e86SOder Chiou {RT5677_HAP_GENE_CTRL6 , 0xf0f0},
1460e826e86SOder Chiou {RT5677_HAP_GENE_CTRL7 , 0xef0e},
1470e826e86SOder Chiou {RT5677_HAP_GENE_CTRL8 , 0xf0f0},
1480e826e86SOder Chiou {RT5677_HAP_GENE_CTRL9 , 0xf000},
1490e826e86SOder Chiou {RT5677_HAP_GENE_CTRL10 , 0x0000},
1500e826e86SOder Chiou {RT5677_PWR_DIG1 , 0x0000},
1510e826e86SOder Chiou {RT5677_PWR_DIG2 , 0x0000},
1520e826e86SOder Chiou {RT5677_PWR_ANLG1 , 0x0055},
1530e826e86SOder Chiou {RT5677_PWR_ANLG2 , 0x0000},
1540e826e86SOder Chiou {RT5677_PWR_DSP1 , 0x0001},
1550e826e86SOder Chiou {RT5677_PWR_DSP_ST , 0x0000},
1560e826e86SOder Chiou {RT5677_PWR_DSP2 , 0x0000},
1570e826e86SOder Chiou {RT5677_ADC_DAC_HPF_CTRL1 , 0x0e00},
1580e826e86SOder Chiou {RT5677_PRIV_INDEX , 0x0000},
1590e826e86SOder Chiou {RT5677_PRIV_DATA , 0x0000},
1600e826e86SOder Chiou {RT5677_I2S4_SDP , 0x8000},
1610e826e86SOder Chiou {RT5677_I2S1_SDP , 0x8000},
1620e826e86SOder Chiou {RT5677_I2S2_SDP , 0x8000},
1630e826e86SOder Chiou {RT5677_I2S3_SDP , 0x8000},
1640e826e86SOder Chiou {RT5677_CLK_TREE_CTRL1 , 0x1111},
1650e826e86SOder Chiou {RT5677_CLK_TREE_CTRL2 , 0x1111},
1660e826e86SOder Chiou {RT5677_CLK_TREE_CTRL3 , 0x0000},
1670e826e86SOder Chiou {RT5677_PLL1_CTRL1 , 0x0000},
1680e826e86SOder Chiou {RT5677_PLL1_CTRL2 , 0x0000},
1690e826e86SOder Chiou {RT5677_PLL2_CTRL1 , 0x0c60},
1700e826e86SOder Chiou {RT5677_PLL2_CTRL2 , 0x2000},
1710e826e86SOder Chiou {RT5677_GLB_CLK1 , 0x0000},
1720e826e86SOder Chiou {RT5677_GLB_CLK2 , 0x0000},
1730e826e86SOder Chiou {RT5677_ASRC_1 , 0x0000},
1740e826e86SOder Chiou {RT5677_ASRC_2 , 0x0000},
1750e826e86SOder Chiou {RT5677_ASRC_3 , 0x0000},
1760e826e86SOder Chiou {RT5677_ASRC_4 , 0x0000},
1770e826e86SOder Chiou {RT5677_ASRC_5 , 0x0000},
1780e826e86SOder Chiou {RT5677_ASRC_6 , 0x0000},
1790e826e86SOder Chiou {RT5677_ASRC_7 , 0x0000},
1800e826e86SOder Chiou {RT5677_ASRC_8 , 0x0000},
1810e826e86SOder Chiou {RT5677_ASRC_9 , 0x0000},
1820e826e86SOder Chiou {RT5677_ASRC_10 , 0x0000},
1830e826e86SOder Chiou {RT5677_ASRC_11 , 0x0000},
18486ae04b1SOder Chiou {RT5677_ASRC_12 , 0x0018},
1850e826e86SOder Chiou {RT5677_ASRC_13 , 0x0000},
1860e826e86SOder Chiou {RT5677_ASRC_14 , 0x0000},
1870e826e86SOder Chiou {RT5677_ASRC_15 , 0x0000},
1880e826e86SOder Chiou {RT5677_ASRC_16 , 0x0000},
1890e826e86SOder Chiou {RT5677_ASRC_17 , 0x0000},
1900e826e86SOder Chiou {RT5677_ASRC_18 , 0x0000},
1910e826e86SOder Chiou {RT5677_ASRC_19 , 0x0000},
1920e826e86SOder Chiou {RT5677_ASRC_20 , 0x0000},
1930e826e86SOder Chiou {RT5677_ASRC_21 , 0x000c},
1940e826e86SOder Chiou {RT5677_ASRC_22 , 0x0000},
1950e826e86SOder Chiou {RT5677_ASRC_23 , 0x0000},
1960e826e86SOder Chiou {RT5677_VAD_CTRL1 , 0x2184},
1970e826e86SOder Chiou {RT5677_VAD_CTRL2 , 0x010a},
1980e826e86SOder Chiou {RT5677_VAD_CTRL3 , 0x0aea},
1990e826e86SOder Chiou {RT5677_VAD_CTRL4 , 0x000c},
2000e826e86SOder Chiou {RT5677_VAD_CTRL5 , 0x0000},
2010e826e86SOder Chiou {RT5677_DSP_INB_CTRL1 , 0x0000},
2020e826e86SOder Chiou {RT5677_DSP_INB_CTRL2 , 0x0000},
2030e826e86SOder Chiou {RT5677_DSP_IN_OUTB_CTRL , 0x0000},
2040e826e86SOder Chiou {RT5677_DSP_OUTB0_1_DIG_VOL , 0x2f2f},
2050e826e86SOder Chiou {RT5677_DSP_OUTB2_3_DIG_VOL , 0x2f2f},
2060e826e86SOder Chiou {RT5677_DSP_OUTB4_5_DIG_VOL , 0x2f2f},
2070e826e86SOder Chiou {RT5677_DSP_OUTB6_7_DIG_VOL , 0x2f2f},
2080e826e86SOder Chiou {RT5677_ADC_EQ_CTRL1 , 0x6000},
2090e826e86SOder Chiou {RT5677_ADC_EQ_CTRL2 , 0x0000},
2100e826e86SOder Chiou {RT5677_EQ_CTRL1 , 0xc000},
2110e826e86SOder Chiou {RT5677_EQ_CTRL2 , 0x0000},
2120e826e86SOder Chiou {RT5677_EQ_CTRL3 , 0x0000},
2130e826e86SOder Chiou {RT5677_SOFT_VOL_ZERO_CROSS1 , 0x0009},
2140e826e86SOder Chiou {RT5677_JD_CTRL1 , 0x0000},
2150e826e86SOder Chiou {RT5677_JD_CTRL2 , 0x0000},
2160e826e86SOder Chiou {RT5677_JD_CTRL3 , 0x0000},
2170e826e86SOder Chiou {RT5677_IRQ_CTRL1 , 0x0000},
2180e826e86SOder Chiou {RT5677_IRQ_CTRL2 , 0x0000},
2190e826e86SOder Chiou {RT5677_GPIO_ST , 0x0000},
2200e826e86SOder Chiou {RT5677_GPIO_CTRL1 , 0x0000},
2210e826e86SOder Chiou {RT5677_GPIO_CTRL2 , 0x0000},
2220e826e86SOder Chiou {RT5677_GPIO_CTRL3 , 0x0000},
2230e826e86SOder Chiou {RT5677_STO1_ADC_HI_FILTER1 , 0xb320},
2240e826e86SOder Chiou {RT5677_STO1_ADC_HI_FILTER2 , 0x0000},
2250e826e86SOder Chiou {RT5677_MONO_ADC_HI_FILTER1 , 0xb300},
2260e826e86SOder Chiou {RT5677_MONO_ADC_HI_FILTER2 , 0x0000},
2270e826e86SOder Chiou {RT5677_STO2_ADC_HI_FILTER1 , 0xb300},
2280e826e86SOder Chiou {RT5677_STO2_ADC_HI_FILTER2 , 0x0000},
2290e826e86SOder Chiou {RT5677_STO3_ADC_HI_FILTER1 , 0xb300},
2300e826e86SOder Chiou {RT5677_STO3_ADC_HI_FILTER2 , 0x0000},
2310e826e86SOder Chiou {RT5677_STO4_ADC_HI_FILTER1 , 0xb300},
2320e826e86SOder Chiou {RT5677_STO4_ADC_HI_FILTER2 , 0x0000},
2330e826e86SOder Chiou {RT5677_MB_DRC_CTRL1 , 0x0f20},
2340e826e86SOder Chiou {RT5677_DRC1_CTRL1 , 0x001f},
2350e826e86SOder Chiou {RT5677_DRC1_CTRL2 , 0x020c},
2360e826e86SOder Chiou {RT5677_DRC1_CTRL3 , 0x1f00},
2370e826e86SOder Chiou {RT5677_DRC1_CTRL4 , 0x0000},
2380e826e86SOder Chiou {RT5677_DRC1_CTRL5 , 0x0000},
2390e826e86SOder Chiou {RT5677_DRC1_CTRL6 , 0x0029},
2400e826e86SOder Chiou {RT5677_DRC2_CTRL1 , 0x001f},
2410e826e86SOder Chiou {RT5677_DRC2_CTRL2 , 0x020c},
2420e826e86SOder Chiou {RT5677_DRC2_CTRL3 , 0x1f00},
2430e826e86SOder Chiou {RT5677_DRC2_CTRL4 , 0x0000},
2440e826e86SOder Chiou {RT5677_DRC2_CTRL5 , 0x0000},
2450e826e86SOder Chiou {RT5677_DRC2_CTRL6 , 0x0029},
2460e826e86SOder Chiou {RT5677_DRC1_HL_CTRL1 , 0x8000},
2470e826e86SOder Chiou {RT5677_DRC1_HL_CTRL2 , 0x0200},
2480e826e86SOder Chiou {RT5677_DRC2_HL_CTRL1 , 0x8000},
2490e826e86SOder Chiou {RT5677_DRC2_HL_CTRL2 , 0x0200},
2500e826e86SOder Chiou {RT5677_DSP_INB1_SRC_CTRL1 , 0x5800},
2510e826e86SOder Chiou {RT5677_DSP_INB1_SRC_CTRL2 , 0x0000},
2520e826e86SOder Chiou {RT5677_DSP_INB1_SRC_CTRL3 , 0x0000},
2530e826e86SOder Chiou {RT5677_DSP_INB1_SRC_CTRL4 , 0x0800},
2540e826e86SOder Chiou {RT5677_DSP_INB2_SRC_CTRL1 , 0x5800},
2550e826e86SOder Chiou {RT5677_DSP_INB2_SRC_CTRL2 , 0x0000},
2560e826e86SOder Chiou {RT5677_DSP_INB2_SRC_CTRL3 , 0x0000},
2570e826e86SOder Chiou {RT5677_DSP_INB2_SRC_CTRL4 , 0x0800},
2580e826e86SOder Chiou {RT5677_DSP_INB3_SRC_CTRL1 , 0x5800},
2590e826e86SOder Chiou {RT5677_DSP_INB3_SRC_CTRL2 , 0x0000},
2600e826e86SOder Chiou {RT5677_DSP_INB3_SRC_CTRL3 , 0x0000},
2610e826e86SOder Chiou {RT5677_DSP_INB3_SRC_CTRL4 , 0x0800},
2620e826e86SOder Chiou {RT5677_DSP_OUTB1_SRC_CTRL1 , 0x5800},
2630e826e86SOder Chiou {RT5677_DSP_OUTB1_SRC_CTRL2 , 0x0000},
2640e826e86SOder Chiou {RT5677_DSP_OUTB1_SRC_CTRL3 , 0x0000},
2650e826e86SOder Chiou {RT5677_DSP_OUTB1_SRC_CTRL4 , 0x0800},
2660e826e86SOder Chiou {RT5677_DSP_OUTB2_SRC_CTRL1 , 0x5800},
2670e826e86SOder Chiou {RT5677_DSP_OUTB2_SRC_CTRL2 , 0x0000},
2680e826e86SOder Chiou {RT5677_DSP_OUTB2_SRC_CTRL3 , 0x0000},
2690e826e86SOder Chiou {RT5677_DSP_OUTB2_SRC_CTRL4 , 0x0800},
2700e826e86SOder Chiou {RT5677_DSP_OUTB_0123_MIXER_CTRL, 0xfefe},
2710e826e86SOder Chiou {RT5677_DSP_OUTB_45_MIXER_CTRL , 0xfefe},
2720e826e86SOder Chiou {RT5677_DSP_OUTB_67_MIXER_CTRL , 0xfefe},
2730e826e86SOder Chiou {RT5677_DIG_MISC , 0x0000},
2740e826e86SOder Chiou {RT5677_GEN_CTRL1 , 0x0000},
2750e826e86SOder Chiou {RT5677_GEN_CTRL2 , 0x0000},
2760e826e86SOder Chiou {RT5677_VENDOR_ID , 0x0000},
2770e826e86SOder Chiou {RT5677_VENDOR_ID1 , 0x10ec},
2780e826e86SOder Chiou {RT5677_VENDOR_ID2 , 0x6327},
2790e826e86SOder Chiou };
2800e826e86SOder Chiou
rt5677_volatile_register(struct device * dev,unsigned int reg)2810e826e86SOder Chiou static bool rt5677_volatile_register(struct device *dev, unsigned int reg)
2820e826e86SOder Chiou {
2830e826e86SOder Chiou int i;
2840e826e86SOder Chiou
2850e826e86SOder Chiou for (i = 0; i < ARRAY_SIZE(rt5677_ranges); i++) {
2860e826e86SOder Chiou if (reg >= rt5677_ranges[i].range_min &&
2870e826e86SOder Chiou reg <= rt5677_ranges[i].range_max) {
2880e826e86SOder Chiou return true;
2890e826e86SOder Chiou }
2900e826e86SOder Chiou }
2910e826e86SOder Chiou
2920e826e86SOder Chiou switch (reg) {
2930e826e86SOder Chiou case RT5677_RESET:
2940e826e86SOder Chiou case RT5677_SLIMBUS_PARAM:
2950e826e86SOder Chiou case RT5677_PDM_DATA_CTRL1:
2960e826e86SOder Chiou case RT5677_PDM_DATA_CTRL2:
2970e826e86SOder Chiou case RT5677_PDM1_DATA_CTRL4:
2980e826e86SOder Chiou case RT5677_PDM2_DATA_CTRL4:
2990e826e86SOder Chiou case RT5677_I2C_MASTER_CTRL1:
3000e826e86SOder Chiou case RT5677_I2C_MASTER_CTRL7:
3010e826e86SOder Chiou case RT5677_I2C_MASTER_CTRL8:
3020e826e86SOder Chiou case RT5677_HAP_GENE_CTRL2:
303eabf424fSBen Zhang case RT5677_PWR_ANLG2: /* Modified by DSP firmware */
3040e826e86SOder Chiou case RT5677_PWR_DSP_ST:
3050e826e86SOder Chiou case RT5677_PRIV_DATA:
3060e826e86SOder Chiou case RT5677_ASRC_22:
3070e826e86SOder Chiou case RT5677_ASRC_23:
3080e826e86SOder Chiou case RT5677_VAD_CTRL5:
3090e826e86SOder Chiou case RT5677_ADC_EQ_CTRL1:
3100e826e86SOder Chiou case RT5677_EQ_CTRL1:
3110e826e86SOder Chiou case RT5677_IRQ_CTRL1:
3120e826e86SOder Chiou case RT5677_IRQ_CTRL2:
3130e826e86SOder Chiou case RT5677_GPIO_ST:
31421c00e5dSBen Zhang case RT5677_GPIO_CTRL1: /* Modified by DSP firmware */
31521c00e5dSBen Zhang case RT5677_GPIO_CTRL2: /* Modified by DSP firmware */
3160e826e86SOder Chiou case RT5677_DSP_INB1_SRC_CTRL4:
3170e826e86SOder Chiou case RT5677_DSP_INB2_SRC_CTRL4:
3180e826e86SOder Chiou case RT5677_DSP_INB3_SRC_CTRL4:
3190e826e86SOder Chiou case RT5677_DSP_OUTB1_SRC_CTRL4:
3200e826e86SOder Chiou case RT5677_DSP_OUTB2_SRC_CTRL4:
3210e826e86SOder Chiou case RT5677_VENDOR_ID:
3220e826e86SOder Chiou case RT5677_VENDOR_ID1:
3230e826e86SOder Chiou case RT5677_VENDOR_ID2:
3240e826e86SOder Chiou return true;
3250e826e86SOder Chiou default:
3260e826e86SOder Chiou return false;
3270e826e86SOder Chiou }
3280e826e86SOder Chiou }
3290e826e86SOder Chiou
rt5677_readable_register(struct device * dev,unsigned int reg)3300e826e86SOder Chiou static bool rt5677_readable_register(struct device *dev, unsigned int reg)
3310e826e86SOder Chiou {
3320e826e86SOder Chiou int i;
3330e826e86SOder Chiou
3340e826e86SOder Chiou for (i = 0; i < ARRAY_SIZE(rt5677_ranges); i++) {
3350e826e86SOder Chiou if (reg >= rt5677_ranges[i].range_min &&
3360e826e86SOder Chiou reg <= rt5677_ranges[i].range_max) {
3370e826e86SOder Chiou return true;
3380e826e86SOder Chiou }
3390e826e86SOder Chiou }
3400e826e86SOder Chiou
3410e826e86SOder Chiou switch (reg) {
3420e826e86SOder Chiou case RT5677_RESET:
3430e826e86SOder Chiou case RT5677_LOUT1:
3440e826e86SOder Chiou case RT5677_IN1:
3450e826e86SOder Chiou case RT5677_MICBIAS:
3460e826e86SOder Chiou case RT5677_SLIMBUS_PARAM:
3470e826e86SOder Chiou case RT5677_SLIMBUS_RX:
3480e826e86SOder Chiou case RT5677_SLIMBUS_CTRL:
3490e826e86SOder Chiou case RT5677_SIDETONE_CTRL:
3500e826e86SOder Chiou case RT5677_ANA_DAC1_2_3_SRC:
3510e826e86SOder Chiou case RT5677_IF_DSP_DAC3_4_MIXER:
3520e826e86SOder Chiou case RT5677_DAC4_DIG_VOL:
3530e826e86SOder Chiou case RT5677_DAC3_DIG_VOL:
3540e826e86SOder Chiou case RT5677_DAC1_DIG_VOL:
3550e826e86SOder Chiou case RT5677_DAC2_DIG_VOL:
3560e826e86SOder Chiou case RT5677_IF_DSP_DAC2_MIXER:
3570e826e86SOder Chiou case RT5677_STO1_ADC_DIG_VOL:
3580e826e86SOder Chiou case RT5677_MONO_ADC_DIG_VOL:
3590e826e86SOder Chiou case RT5677_STO1_2_ADC_BST:
3600e826e86SOder Chiou case RT5677_STO2_ADC_DIG_VOL:
3610e826e86SOder Chiou case RT5677_ADC_BST_CTRL2:
3620e826e86SOder Chiou case RT5677_STO3_4_ADC_BST:
3630e826e86SOder Chiou case RT5677_STO3_ADC_DIG_VOL:
3640e826e86SOder Chiou case RT5677_STO4_ADC_DIG_VOL:
3650e826e86SOder Chiou case RT5677_STO4_ADC_MIXER:
3660e826e86SOder Chiou case RT5677_STO3_ADC_MIXER:
3670e826e86SOder Chiou case RT5677_STO2_ADC_MIXER:
3680e826e86SOder Chiou case RT5677_STO1_ADC_MIXER:
3690e826e86SOder Chiou case RT5677_MONO_ADC_MIXER:
3700e826e86SOder Chiou case RT5677_ADC_IF_DSP_DAC1_MIXER:
3710e826e86SOder Chiou case RT5677_STO1_DAC_MIXER:
3720e826e86SOder Chiou case RT5677_MONO_DAC_MIXER:
3730e826e86SOder Chiou case RT5677_DD1_MIXER:
3740e826e86SOder Chiou case RT5677_DD2_MIXER:
3750e826e86SOder Chiou case RT5677_IF3_DATA:
3760e826e86SOder Chiou case RT5677_IF4_DATA:
3770e826e86SOder Chiou case RT5677_PDM_OUT_CTRL:
3780e826e86SOder Chiou case RT5677_PDM_DATA_CTRL1:
3790e826e86SOder Chiou case RT5677_PDM_DATA_CTRL2:
3800e826e86SOder Chiou case RT5677_PDM1_DATA_CTRL2:
3810e826e86SOder Chiou case RT5677_PDM1_DATA_CTRL3:
3820e826e86SOder Chiou case RT5677_PDM1_DATA_CTRL4:
3830e826e86SOder Chiou case RT5677_PDM2_DATA_CTRL2:
3840e826e86SOder Chiou case RT5677_PDM2_DATA_CTRL3:
3850e826e86SOder Chiou case RT5677_PDM2_DATA_CTRL4:
3860e826e86SOder Chiou case RT5677_TDM1_CTRL1:
3870e826e86SOder Chiou case RT5677_TDM1_CTRL2:
3880e826e86SOder Chiou case RT5677_TDM1_CTRL3:
3890e826e86SOder Chiou case RT5677_TDM1_CTRL4:
3900e826e86SOder Chiou case RT5677_TDM1_CTRL5:
3910e826e86SOder Chiou case RT5677_TDM2_CTRL1:
3920e826e86SOder Chiou case RT5677_TDM2_CTRL2:
3930e826e86SOder Chiou case RT5677_TDM2_CTRL3:
3940e826e86SOder Chiou case RT5677_TDM2_CTRL4:
3950e826e86SOder Chiou case RT5677_TDM2_CTRL5:
3960e826e86SOder Chiou case RT5677_I2C_MASTER_CTRL1:
3970e826e86SOder Chiou case RT5677_I2C_MASTER_CTRL2:
3980e826e86SOder Chiou case RT5677_I2C_MASTER_CTRL3:
3990e826e86SOder Chiou case RT5677_I2C_MASTER_CTRL4:
4000e826e86SOder Chiou case RT5677_I2C_MASTER_CTRL5:
4010e826e86SOder Chiou case RT5677_I2C_MASTER_CTRL6:
4020e826e86SOder Chiou case RT5677_I2C_MASTER_CTRL7:
4030e826e86SOder Chiou case RT5677_I2C_MASTER_CTRL8:
4040e826e86SOder Chiou case RT5677_DMIC_CTRL1:
4050e826e86SOder Chiou case RT5677_DMIC_CTRL2:
4060e826e86SOder Chiou case RT5677_HAP_GENE_CTRL1:
4070e826e86SOder Chiou case RT5677_HAP_GENE_CTRL2:
4080e826e86SOder Chiou case RT5677_HAP_GENE_CTRL3:
4090e826e86SOder Chiou case RT5677_HAP_GENE_CTRL4:
4100e826e86SOder Chiou case RT5677_HAP_GENE_CTRL5:
4110e826e86SOder Chiou case RT5677_HAP_GENE_CTRL6:
4120e826e86SOder Chiou case RT5677_HAP_GENE_CTRL7:
4130e826e86SOder Chiou case RT5677_HAP_GENE_CTRL8:
4140e826e86SOder Chiou case RT5677_HAP_GENE_CTRL9:
4150e826e86SOder Chiou case RT5677_HAP_GENE_CTRL10:
4160e826e86SOder Chiou case RT5677_PWR_DIG1:
4170e826e86SOder Chiou case RT5677_PWR_DIG2:
4180e826e86SOder Chiou case RT5677_PWR_ANLG1:
4190e826e86SOder Chiou case RT5677_PWR_ANLG2:
4200e826e86SOder Chiou case RT5677_PWR_DSP1:
4210e826e86SOder Chiou case RT5677_PWR_DSP_ST:
4220e826e86SOder Chiou case RT5677_PWR_DSP2:
4230e826e86SOder Chiou case RT5677_ADC_DAC_HPF_CTRL1:
4240e826e86SOder Chiou case RT5677_PRIV_INDEX:
4250e826e86SOder Chiou case RT5677_PRIV_DATA:
4260e826e86SOder Chiou case RT5677_I2S4_SDP:
4270e826e86SOder Chiou case RT5677_I2S1_SDP:
4280e826e86SOder Chiou case RT5677_I2S2_SDP:
4290e826e86SOder Chiou case RT5677_I2S3_SDP:
4300e826e86SOder Chiou case RT5677_CLK_TREE_CTRL1:
4310e826e86SOder Chiou case RT5677_CLK_TREE_CTRL2:
4320e826e86SOder Chiou case RT5677_CLK_TREE_CTRL3:
4330e826e86SOder Chiou case RT5677_PLL1_CTRL1:
4340e826e86SOder Chiou case RT5677_PLL1_CTRL2:
4350e826e86SOder Chiou case RT5677_PLL2_CTRL1:
4360e826e86SOder Chiou case RT5677_PLL2_CTRL2:
4370e826e86SOder Chiou case RT5677_GLB_CLK1:
4380e826e86SOder Chiou case RT5677_GLB_CLK2:
4390e826e86SOder Chiou case RT5677_ASRC_1:
4400e826e86SOder Chiou case RT5677_ASRC_2:
4410e826e86SOder Chiou case RT5677_ASRC_3:
4420e826e86SOder Chiou case RT5677_ASRC_4:
4430e826e86SOder Chiou case RT5677_ASRC_5:
4440e826e86SOder Chiou case RT5677_ASRC_6:
4450e826e86SOder Chiou case RT5677_ASRC_7:
4460e826e86SOder Chiou case RT5677_ASRC_8:
4470e826e86SOder Chiou case RT5677_ASRC_9:
4480e826e86SOder Chiou case RT5677_ASRC_10:
4490e826e86SOder Chiou case RT5677_ASRC_11:
4500e826e86SOder Chiou case RT5677_ASRC_12:
4510e826e86SOder Chiou case RT5677_ASRC_13:
4520e826e86SOder Chiou case RT5677_ASRC_14:
4530e826e86SOder Chiou case RT5677_ASRC_15:
4540e826e86SOder Chiou case RT5677_ASRC_16:
4550e826e86SOder Chiou case RT5677_ASRC_17:
4560e826e86SOder Chiou case RT5677_ASRC_18:
4570e826e86SOder Chiou case RT5677_ASRC_19:
4580e826e86SOder Chiou case RT5677_ASRC_20:
4590e826e86SOder Chiou case RT5677_ASRC_21:
4600e826e86SOder Chiou case RT5677_ASRC_22:
4610e826e86SOder Chiou case RT5677_ASRC_23:
4620e826e86SOder Chiou case RT5677_VAD_CTRL1:
4630e826e86SOder Chiou case RT5677_VAD_CTRL2:
4640e826e86SOder Chiou case RT5677_VAD_CTRL3:
4650e826e86SOder Chiou case RT5677_VAD_CTRL4:
4660e826e86SOder Chiou case RT5677_VAD_CTRL5:
4670e826e86SOder Chiou case RT5677_DSP_INB_CTRL1:
4680e826e86SOder Chiou case RT5677_DSP_INB_CTRL2:
4690e826e86SOder Chiou case RT5677_DSP_IN_OUTB_CTRL:
4700e826e86SOder Chiou case RT5677_DSP_OUTB0_1_DIG_VOL:
4710e826e86SOder Chiou case RT5677_DSP_OUTB2_3_DIG_VOL:
4720e826e86SOder Chiou case RT5677_DSP_OUTB4_5_DIG_VOL:
4730e826e86SOder Chiou case RT5677_DSP_OUTB6_7_DIG_VOL:
4740e826e86SOder Chiou case RT5677_ADC_EQ_CTRL1:
4750e826e86SOder Chiou case RT5677_ADC_EQ_CTRL2:
4760e826e86SOder Chiou case RT5677_EQ_CTRL1:
4770e826e86SOder Chiou case RT5677_EQ_CTRL2:
4780e826e86SOder Chiou case RT5677_EQ_CTRL3:
4790e826e86SOder Chiou case RT5677_SOFT_VOL_ZERO_CROSS1:
4800e826e86SOder Chiou case RT5677_JD_CTRL1:
4810e826e86SOder Chiou case RT5677_JD_CTRL2:
4820e826e86SOder Chiou case RT5677_JD_CTRL3:
4830e826e86SOder Chiou case RT5677_IRQ_CTRL1:
4840e826e86SOder Chiou case RT5677_IRQ_CTRL2:
4850e826e86SOder Chiou case RT5677_GPIO_ST:
4860e826e86SOder Chiou case RT5677_GPIO_CTRL1:
4870e826e86SOder Chiou case RT5677_GPIO_CTRL2:
4880e826e86SOder Chiou case RT5677_GPIO_CTRL3:
4890e826e86SOder Chiou case RT5677_STO1_ADC_HI_FILTER1:
4900e826e86SOder Chiou case RT5677_STO1_ADC_HI_FILTER2:
4910e826e86SOder Chiou case RT5677_MONO_ADC_HI_FILTER1:
4920e826e86SOder Chiou case RT5677_MONO_ADC_HI_FILTER2:
4930e826e86SOder Chiou case RT5677_STO2_ADC_HI_FILTER1:
4940e826e86SOder Chiou case RT5677_STO2_ADC_HI_FILTER2:
4950e826e86SOder Chiou case RT5677_STO3_ADC_HI_FILTER1:
4960e826e86SOder Chiou case RT5677_STO3_ADC_HI_FILTER2:
4970e826e86SOder Chiou case RT5677_STO4_ADC_HI_FILTER1:
4980e826e86SOder Chiou case RT5677_STO4_ADC_HI_FILTER2:
4990e826e86SOder Chiou case RT5677_MB_DRC_CTRL1:
5000e826e86SOder Chiou case RT5677_DRC1_CTRL1:
5010e826e86SOder Chiou case RT5677_DRC1_CTRL2:
5020e826e86SOder Chiou case RT5677_DRC1_CTRL3:
5030e826e86SOder Chiou case RT5677_DRC1_CTRL4:
5040e826e86SOder Chiou case RT5677_DRC1_CTRL5:
5050e826e86SOder Chiou case RT5677_DRC1_CTRL6:
5060e826e86SOder Chiou case RT5677_DRC2_CTRL1:
5070e826e86SOder Chiou case RT5677_DRC2_CTRL2:
5080e826e86SOder Chiou case RT5677_DRC2_CTRL3:
5090e826e86SOder Chiou case RT5677_DRC2_CTRL4:
5100e826e86SOder Chiou case RT5677_DRC2_CTRL5:
5110e826e86SOder Chiou case RT5677_DRC2_CTRL6:
5120e826e86SOder Chiou case RT5677_DRC1_HL_CTRL1:
5130e826e86SOder Chiou case RT5677_DRC1_HL_CTRL2:
5140e826e86SOder Chiou case RT5677_DRC2_HL_CTRL1:
5150e826e86SOder Chiou case RT5677_DRC2_HL_CTRL2:
5160e826e86SOder Chiou case RT5677_DSP_INB1_SRC_CTRL1:
5170e826e86SOder Chiou case RT5677_DSP_INB1_SRC_CTRL2:
5180e826e86SOder Chiou case RT5677_DSP_INB1_SRC_CTRL3:
5190e826e86SOder Chiou case RT5677_DSP_INB1_SRC_CTRL4:
5200e826e86SOder Chiou case RT5677_DSP_INB2_SRC_CTRL1:
5210e826e86SOder Chiou case RT5677_DSP_INB2_SRC_CTRL2:
5220e826e86SOder Chiou case RT5677_DSP_INB2_SRC_CTRL3:
5230e826e86SOder Chiou case RT5677_DSP_INB2_SRC_CTRL4:
5240e826e86SOder Chiou case RT5677_DSP_INB3_SRC_CTRL1:
5250e826e86SOder Chiou case RT5677_DSP_INB3_SRC_CTRL2:
5260e826e86SOder Chiou case RT5677_DSP_INB3_SRC_CTRL3:
5270e826e86SOder Chiou case RT5677_DSP_INB3_SRC_CTRL4:
5280e826e86SOder Chiou case RT5677_DSP_OUTB1_SRC_CTRL1:
5290e826e86SOder Chiou case RT5677_DSP_OUTB1_SRC_CTRL2:
5300e826e86SOder Chiou case RT5677_DSP_OUTB1_SRC_CTRL3:
5310e826e86SOder Chiou case RT5677_DSP_OUTB1_SRC_CTRL4:
5320e826e86SOder Chiou case RT5677_DSP_OUTB2_SRC_CTRL1:
5330e826e86SOder Chiou case RT5677_DSP_OUTB2_SRC_CTRL2:
5340e826e86SOder Chiou case RT5677_DSP_OUTB2_SRC_CTRL3:
5350e826e86SOder Chiou case RT5677_DSP_OUTB2_SRC_CTRL4:
5360e826e86SOder Chiou case RT5677_DSP_OUTB_0123_MIXER_CTRL:
5370e826e86SOder Chiou case RT5677_DSP_OUTB_45_MIXER_CTRL:
5380e826e86SOder Chiou case RT5677_DSP_OUTB_67_MIXER_CTRL:
5390e826e86SOder Chiou case RT5677_DIG_MISC:
5400e826e86SOder Chiou case RT5677_GEN_CTRL1:
5410e826e86SOder Chiou case RT5677_GEN_CTRL2:
5420e826e86SOder Chiou case RT5677_VENDOR_ID:
5430e826e86SOder Chiou case RT5677_VENDOR_ID1:
5440e826e86SOder Chiou case RT5677_VENDOR_ID2:
5450e826e86SOder Chiou return true;
5460e826e86SOder Chiou default:
5470e826e86SOder Chiou return false;
5480e826e86SOder Chiou }
5490e826e86SOder Chiou }
5500e826e86SOder Chiou
551af48f1d0SOder Chiou /**
552af48f1d0SOder Chiou * rt5677_dsp_mode_i2c_write_addr - Write value to address on DSP mode.
55319ba484dSOder Chiou * @rt5677: Private Data.
554af48f1d0SOder Chiou * @addr: Address index.
555af48f1d0SOder Chiou * @value: Address data.
556dc22a409SPierre-Louis Bossart * @opcode: opcode value
557af48f1d0SOder Chiou *
558af48f1d0SOder Chiou * Returns 0 for success or negative error code.
559af48f1d0SOder Chiou */
rt5677_dsp_mode_i2c_write_addr(struct rt5677_priv * rt5677,unsigned int addr,unsigned int value,unsigned int opcode)56019ba484dSOder Chiou static int rt5677_dsp_mode_i2c_write_addr(struct rt5677_priv *rt5677,
561af48f1d0SOder Chiou unsigned int addr, unsigned int value, unsigned int opcode)
562af48f1d0SOder Chiou {
56379223bf1SKuninori Morimoto struct snd_soc_component *component = rt5677->component;
564af48f1d0SOder Chiou int ret;
565af48f1d0SOder Chiou
566af48f1d0SOder Chiou mutex_lock(&rt5677->dsp_cmd_lock);
567af48f1d0SOder Chiou
56819ba484dSOder Chiou ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_ADDR_MSB,
56919ba484dSOder Chiou addr >> 16);
570af48f1d0SOder Chiou if (ret < 0) {
57179223bf1SKuninori Morimoto dev_err(component->dev, "Failed to set addr msb value: %d\n", ret);
572af48f1d0SOder Chiou goto err;
573af48f1d0SOder Chiou }
574af48f1d0SOder Chiou
57519ba484dSOder Chiou ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_ADDR_LSB,
576af48f1d0SOder Chiou addr & 0xffff);
577af48f1d0SOder Chiou if (ret < 0) {
57879223bf1SKuninori Morimoto dev_err(component->dev, "Failed to set addr lsb value: %d\n", ret);
579af48f1d0SOder Chiou goto err;
580af48f1d0SOder Chiou }
581af48f1d0SOder Chiou
58219ba484dSOder Chiou ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_DATA_MSB,
583af48f1d0SOder Chiou value >> 16);
584af48f1d0SOder Chiou if (ret < 0) {
58579223bf1SKuninori Morimoto dev_err(component->dev, "Failed to set data msb value: %d\n", ret);
586af48f1d0SOder Chiou goto err;
587af48f1d0SOder Chiou }
588af48f1d0SOder Chiou
58919ba484dSOder Chiou ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_DATA_LSB,
590af48f1d0SOder Chiou value & 0xffff);
591af48f1d0SOder Chiou if (ret < 0) {
59279223bf1SKuninori Morimoto dev_err(component->dev, "Failed to set data lsb value: %d\n", ret);
593af48f1d0SOder Chiou goto err;
594af48f1d0SOder Chiou }
595af48f1d0SOder Chiou
59619ba484dSOder Chiou ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_OP_CODE,
59719ba484dSOder Chiou opcode);
598af48f1d0SOder Chiou if (ret < 0) {
59979223bf1SKuninori Morimoto dev_err(component->dev, "Failed to set op code value: %d\n", ret);
600af48f1d0SOder Chiou goto err;
601af48f1d0SOder Chiou }
602af48f1d0SOder Chiou
603af48f1d0SOder Chiou err:
604af48f1d0SOder Chiou mutex_unlock(&rt5677->dsp_cmd_lock);
605af48f1d0SOder Chiou
606af48f1d0SOder Chiou return ret;
607af48f1d0SOder Chiou }
608af48f1d0SOder Chiou
609af48f1d0SOder Chiou /**
610af48f1d0SOder Chiou * rt5677_dsp_mode_i2c_read_addr - Read value from address on DSP mode.
611dc22a409SPierre-Louis Bossart * @rt5677: Private Data.
612af48f1d0SOder Chiou * @addr: Address index.
613af48f1d0SOder Chiou * @value: Address data.
614af48f1d0SOder Chiou *
61519ba484dSOder Chiou *
616af48f1d0SOder Chiou * Returns 0 for success or negative error code.
617af48f1d0SOder Chiou */
rt5677_dsp_mode_i2c_read_addr(struct rt5677_priv * rt5677,unsigned int addr,unsigned int * value)618af48f1d0SOder Chiou static int rt5677_dsp_mode_i2c_read_addr(
61919ba484dSOder Chiou struct rt5677_priv *rt5677, unsigned int addr, unsigned int *value)
620af48f1d0SOder Chiou {
62179223bf1SKuninori Morimoto struct snd_soc_component *component = rt5677->component;
622af48f1d0SOder Chiou int ret;
623af48f1d0SOder Chiou unsigned int msb, lsb;
624af48f1d0SOder Chiou
625af48f1d0SOder Chiou mutex_lock(&rt5677->dsp_cmd_lock);
626af48f1d0SOder Chiou
62719ba484dSOder Chiou ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_ADDR_MSB,
62819ba484dSOder Chiou addr >> 16);
629af48f1d0SOder Chiou if (ret < 0) {
63079223bf1SKuninori Morimoto dev_err(component->dev, "Failed to set addr msb value: %d\n", ret);
631af48f1d0SOder Chiou goto err;
632af48f1d0SOder Chiou }
633af48f1d0SOder Chiou
63419ba484dSOder Chiou ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_ADDR_LSB,
635af48f1d0SOder Chiou addr & 0xffff);
636af48f1d0SOder Chiou if (ret < 0) {
63779223bf1SKuninori Morimoto dev_err(component->dev, "Failed to set addr lsb value: %d\n", ret);
638af48f1d0SOder Chiou goto err;
639af48f1d0SOder Chiou }
640af48f1d0SOder Chiou
64119ba484dSOder Chiou ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_OP_CODE,
64219ba484dSOder Chiou 0x0002);
643af48f1d0SOder Chiou if (ret < 0) {
64479223bf1SKuninori Morimoto dev_err(component->dev, "Failed to set op code value: %d\n", ret);
645af48f1d0SOder Chiou goto err;
646af48f1d0SOder Chiou }
647af48f1d0SOder Chiou
64819ba484dSOder Chiou regmap_read(rt5677->regmap_physical, RT5677_DSP_I2C_DATA_MSB, &msb);
64919ba484dSOder Chiou regmap_read(rt5677->regmap_physical, RT5677_DSP_I2C_DATA_LSB, &lsb);
650af48f1d0SOder Chiou *value = (msb << 16) | lsb;
651af48f1d0SOder Chiou
652af48f1d0SOder Chiou err:
653af48f1d0SOder Chiou mutex_unlock(&rt5677->dsp_cmd_lock);
654af48f1d0SOder Chiou
655af48f1d0SOder Chiou return ret;
656af48f1d0SOder Chiou }
657af48f1d0SOder Chiou
658af48f1d0SOder Chiou /**
659af48f1d0SOder Chiou * rt5677_dsp_mode_i2c_write - Write register on DSP mode.
660dc22a409SPierre-Louis Bossart * @rt5677: Private Data.
661af48f1d0SOder Chiou * @reg: Register index.
662af48f1d0SOder Chiou * @value: Register data.
663af48f1d0SOder Chiou *
664af48f1d0SOder Chiou *
665af48f1d0SOder Chiou * Returns 0 for success or negative error code.
666af48f1d0SOder Chiou */
rt5677_dsp_mode_i2c_write(struct rt5677_priv * rt5677,unsigned int reg,unsigned int value)66719ba484dSOder Chiou static int rt5677_dsp_mode_i2c_write(struct rt5677_priv *rt5677,
668af48f1d0SOder Chiou unsigned int reg, unsigned int value)
669af48f1d0SOder Chiou {
67019ba484dSOder Chiou return rt5677_dsp_mode_i2c_write_addr(rt5677, 0x18020000 + reg * 2,
671af48f1d0SOder Chiou value, 0x0001);
672af48f1d0SOder Chiou }
673af48f1d0SOder Chiou
674af48f1d0SOder Chiou /**
675af48f1d0SOder Chiou * rt5677_dsp_mode_i2c_read - Read register on DSP mode.
676dc22a409SPierre-Louis Bossart * @rt5677: Private Data
677af48f1d0SOder Chiou * @reg: Register index.
67819ba484dSOder Chiou * @value: Register data.
679af48f1d0SOder Chiou *
680af48f1d0SOder Chiou *
68119ba484dSOder Chiou * Returns 0 for success or negative error code.
682af48f1d0SOder Chiou */
rt5677_dsp_mode_i2c_read(struct rt5677_priv * rt5677,unsigned int reg,unsigned int * value)68319ba484dSOder Chiou static int rt5677_dsp_mode_i2c_read(
68419ba484dSOder Chiou struct rt5677_priv *rt5677, unsigned int reg, unsigned int *value)
685af48f1d0SOder Chiou {
68619ba484dSOder Chiou int ret = rt5677_dsp_mode_i2c_read_addr(rt5677, 0x18020000 + reg * 2,
68719ba484dSOder Chiou value);
688af48f1d0SOder Chiou
68919ba484dSOder Chiou *value &= 0xffff;
690af48f1d0SOder Chiou
691af48f1d0SOder Chiou return ret;
692af48f1d0SOder Chiou }
693af48f1d0SOder Chiou
rt5677_set_dsp_mode(struct rt5677_priv * rt5677,bool on)694461c6232SBen Zhang static void rt5677_set_dsp_mode(struct rt5677_priv *rt5677, bool on)
69519ba484dSOder Chiou {
69619ba484dSOder Chiou if (on) {
69733b773dcSCurtis Malainey regmap_update_bits(rt5677->regmap, RT5677_PWR_DSP1,
69833b773dcSCurtis Malainey RT5677_PWR_DSP, RT5677_PWR_DSP);
69919ba484dSOder Chiou rt5677->is_dsp_mode = true;
70019ba484dSOder Chiou } else {
70133b773dcSCurtis Malainey regmap_update_bits(rt5677->regmap, RT5677_PWR_DSP1,
70233b773dcSCurtis Malainey RT5677_PWR_DSP, 0x0);
70319ba484dSOder Chiou rt5677->is_dsp_mode = false;
70419ba484dSOder Chiou }
70519ba484dSOder Chiou }
70619ba484dSOder Chiou
rt5677_set_vad_source(struct rt5677_priv * rt5677)707461c6232SBen Zhang static unsigned int rt5677_set_vad_source(struct rt5677_priv *rt5677)
708461c6232SBen Zhang {
70929073ae4SBen Zhang struct snd_soc_dapm_context *dapm =
71029073ae4SBen Zhang snd_soc_component_get_dapm(rt5677->component);
71129073ae4SBen Zhang /* Force dapm to sync before we enable the
71229073ae4SBen Zhang * DSP to prevent write corruption
71329073ae4SBen Zhang */
71429073ae4SBen Zhang snd_soc_dapm_sync(dapm);
71529073ae4SBen Zhang
716461c6232SBen Zhang /* DMIC1 power = enabled
717461c6232SBen Zhang * DMIC CLK = 256 * fs / 12
718461c6232SBen Zhang */
719461c6232SBen Zhang regmap_update_bits(rt5677->regmap, RT5677_DMIC_CTRL1,
720461c6232SBen Zhang RT5677_DMIC_CLK_MASK, 5 << RT5677_DMIC_CLK_SFT);
721461c6232SBen Zhang
722461c6232SBen Zhang /* I2S pre divide 2 = /6 (clk_sys2) */
723461c6232SBen Zhang regmap_update_bits(rt5677->regmap, RT5677_CLK_TREE_CTRL1,
724461c6232SBen Zhang RT5677_I2S_PD2_MASK, RT5677_I2S_PD2_6);
725461c6232SBen Zhang
726461c6232SBen Zhang /* DSP Clock = MCLK1 (bypassed PLL2) */
727461c6232SBen Zhang regmap_write(rt5677->regmap, RT5677_GLB_CLK2,
728461c6232SBen Zhang RT5677_DSP_CLK_SRC_BYPASS);
729461c6232SBen Zhang
730461c6232SBen Zhang /* SAD Threshold1 */
731461c6232SBen Zhang regmap_write(rt5677->regmap, RT5677_VAD_CTRL2, 0x013f);
732461c6232SBen Zhang /* SAD Threshold2 */
733461c6232SBen Zhang regmap_write(rt5677->regmap, RT5677_VAD_CTRL3, 0x0ae5);
734461c6232SBen Zhang /* SAD Sample Rate Converter = Up 6 (8K to 48K)
735461c6232SBen Zhang * SAD Output Sample Rate = Same as I2S
736461c6232SBen Zhang * SAD Threshold3
737461c6232SBen Zhang */
738461c6232SBen Zhang regmap_update_bits(rt5677->regmap, RT5677_VAD_CTRL4,
739461c6232SBen Zhang RT5677_VAD_OUT_SRC_RATE_MASK | RT5677_VAD_OUT_SRC_MASK |
740461c6232SBen Zhang RT5677_VAD_LV_DIFF_MASK, 0x7f << RT5677_VAD_LV_DIFF_SFT);
741461c6232SBen Zhang /* Minimum frame level within a pre-determined duration = 32 frames
742461c6232SBen Zhang * Bypass ADPCM Encoder/Decoder = Bypass ADPCM
743461c6232SBen Zhang * Automatic Push Data to SAD Buffer Once SAD Flag is triggered = enable
744461c6232SBen Zhang * SAD Buffer Over-Writing = enable
745461c6232SBen Zhang * SAD Buffer Pop Mode Control = disable
746461c6232SBen Zhang * SAD Buffer Push Mode Control = enable
747461c6232SBen Zhang * SAD Detector Control = enable
748461c6232SBen Zhang * SAD Function Control = enable
749461c6232SBen Zhang * SAD Function Reset = normal
750461c6232SBen Zhang */
751461c6232SBen Zhang regmap_write(rt5677->regmap, RT5677_VAD_CTRL1,
752461c6232SBen Zhang RT5677_VAD_FUNC_RESET | RT5677_VAD_FUNC_ENABLE |
753461c6232SBen Zhang RT5677_VAD_DET_ENABLE | RT5677_VAD_BUF_PUSH |
754461c6232SBen Zhang RT5677_VAD_BUF_OW | RT5677_VAD_FG2ENC |
755461c6232SBen Zhang RT5677_VAD_ADPCM_BYPASS | 1 << RT5677_VAD_MIN_DUR_SFT);
756461c6232SBen Zhang
75721c00e5dSBen Zhang /* VAD/SAD is not routed to the IRQ output (i.e. MX-BE[14] = 0), but it
75821c00e5dSBen Zhang * is routed to DSP_IRQ_0, so DSP firmware may use it to sleep and save
75921c00e5dSBen Zhang * power. See ALC5677 datasheet section 9.17 "GPIO, Interrupt and Jack
76021c00e5dSBen Zhang * Detection" for more info.
76121c00e5dSBen Zhang */
762461c6232SBen Zhang
763461c6232SBen Zhang /* Private register, no doc */
764461c6232SBen Zhang regmap_update_bits(rt5677->regmap, RT5677_PR_BASE + RT5677_BIAS_CUR4,
765461c6232SBen Zhang 0x0f00, 0x0100);
766461c6232SBen Zhang
767461c6232SBen Zhang /* LDO2 output = 1.2V
768461c6232SBen Zhang * LDO1 output = 1.2V (LDO_IN = 1.8V)
769461c6232SBen Zhang */
770461c6232SBen Zhang regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG1,
771461c6232SBen Zhang RT5677_LDO1_SEL_MASK | RT5677_LDO2_SEL_MASK,
772461c6232SBen Zhang 5 << RT5677_LDO1_SEL_SFT | 5 << RT5677_LDO2_SEL_SFT);
773461c6232SBen Zhang
774461c6232SBen Zhang /* Codec core power = power on
775461c6232SBen Zhang * LDO1 power = power on
776461c6232SBen Zhang */
777461c6232SBen Zhang regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,
778461c6232SBen Zhang RT5677_PWR_CORE | RT5677_PWR_LDO1,
779461c6232SBen Zhang RT5677_PWR_CORE | RT5677_PWR_LDO1);
780461c6232SBen Zhang
781461c6232SBen Zhang /* Isolation for DCVDD4 = normal (set during probe)
782461c6232SBen Zhang * Isolation for DCVDD2 = normal (set during probe)
783461c6232SBen Zhang * Isolation for DSP = normal
784461c6232SBen Zhang * Isolation for Band 0~7 = disable
785461c6232SBen Zhang * Isolation for InBound 4~10 and OutBound 4~10 = disable
786461c6232SBen Zhang */
787461c6232SBen Zhang regmap_write(rt5677->regmap, RT5677_PWR_DSP2,
788461c6232SBen Zhang RT5677_PWR_CORE_ISO | RT5677_PWR_DSP_ISO |
789461c6232SBen Zhang RT5677_PWR_SR7_ISO | RT5677_PWR_SR6_ISO |
790461c6232SBen Zhang RT5677_PWR_SR5_ISO | RT5677_PWR_SR4_ISO |
791461c6232SBen Zhang RT5677_PWR_SR3_ISO | RT5677_PWR_SR2_ISO |
792461c6232SBen Zhang RT5677_PWR_SR1_ISO | RT5677_PWR_SR0_ISO |
793461c6232SBen Zhang RT5677_PWR_MLT_ISO);
794461c6232SBen Zhang
795461c6232SBen Zhang /* System Band 0~7 = power on
796461c6232SBen Zhang * InBound 4~10 and OutBound 4~10 = power on
797461c6232SBen Zhang * DSP = power on
798461c6232SBen Zhang * DSP CPU = stop (will be set to "run" after firmware loaded)
799461c6232SBen Zhang */
800461c6232SBen Zhang regmap_write(rt5677->regmap, RT5677_PWR_DSP1,
801461c6232SBen Zhang RT5677_PWR_SR7 | RT5677_PWR_SR6 |
802461c6232SBen Zhang RT5677_PWR_SR5 | RT5677_PWR_SR4 |
803461c6232SBen Zhang RT5677_PWR_SR3 | RT5677_PWR_SR2 |
804461c6232SBen Zhang RT5677_PWR_SR1 | RT5677_PWR_SR0 |
805461c6232SBen Zhang RT5677_PWR_MLT | RT5677_PWR_DSP |
806461c6232SBen Zhang RT5677_PWR_DSP_CPU);
807461c6232SBen Zhang
808461c6232SBen Zhang return 0;
809461c6232SBen Zhang }
810461c6232SBen Zhang
rt5677_parse_and_load_dsp(struct rt5677_priv * rt5677,const u8 * buf,unsigned int len)811461c6232SBen Zhang static int rt5677_parse_and_load_dsp(struct rt5677_priv *rt5677, const u8 *buf,
812461c6232SBen Zhang unsigned int len)
813461c6232SBen Zhang {
814461c6232SBen Zhang struct snd_soc_component *component = rt5677->component;
815461c6232SBen Zhang Elf32_Ehdr *elf_hdr;
816461c6232SBen Zhang Elf32_Phdr *pr_hdr;
817461c6232SBen Zhang Elf32_Half i;
818461c6232SBen Zhang int ret = 0;
819461c6232SBen Zhang
820461c6232SBen Zhang if (!buf || (len < sizeof(Elf32_Ehdr)))
821461c6232SBen Zhang return -ENOMEM;
822461c6232SBen Zhang
823461c6232SBen Zhang elf_hdr = (Elf32_Ehdr *)buf;
824461c6232SBen Zhang #ifndef EM_XTENSA
825461c6232SBen Zhang #define EM_XTENSA 94
826461c6232SBen Zhang #endif
827461c6232SBen Zhang if (strncmp(elf_hdr->e_ident, ELFMAG, sizeof(ELFMAG) - 1))
828461c6232SBen Zhang dev_err(component->dev, "Wrong ELF header prefix\n");
829461c6232SBen Zhang if (elf_hdr->e_ehsize != sizeof(Elf32_Ehdr))
83070e79866SAlexey Dobriyan dev_err(component->dev, "Wrong ELF header size\n");
831461c6232SBen Zhang if (elf_hdr->e_machine != EM_XTENSA)
832461c6232SBen Zhang dev_err(component->dev, "Wrong DSP code file\n");
833461c6232SBen Zhang
834461c6232SBen Zhang if (len < elf_hdr->e_phoff)
835461c6232SBen Zhang return -ENOMEM;
836461c6232SBen Zhang pr_hdr = (Elf32_Phdr *)(buf + elf_hdr->e_phoff);
837461c6232SBen Zhang for (i = 0; i < elf_hdr->e_phnum; i++) {
838461c6232SBen Zhang /* TODO: handle p_memsz != p_filesz */
839461c6232SBen Zhang if (pr_hdr->p_paddr && pr_hdr->p_filesz) {
840461c6232SBen Zhang dev_info(component->dev, "Load 0x%x bytes to 0x%x\n",
841461c6232SBen Zhang pr_hdr->p_filesz, pr_hdr->p_paddr);
842461c6232SBen Zhang
843461c6232SBen Zhang ret = rt5677_spi_write(pr_hdr->p_paddr,
844461c6232SBen Zhang buf + pr_hdr->p_offset,
845461c6232SBen Zhang pr_hdr->p_filesz);
846461c6232SBen Zhang if (ret)
847461c6232SBen Zhang dev_err(component->dev, "Load firmware failed %d\n",
848461c6232SBen Zhang ret);
849461c6232SBen Zhang }
850461c6232SBen Zhang pr_hdr++;
851461c6232SBen Zhang }
852461c6232SBen Zhang return ret;
853461c6232SBen Zhang }
854461c6232SBen Zhang
rt5677_load_dsp_from_file(struct rt5677_priv * rt5677)855461c6232SBen Zhang static int rt5677_load_dsp_from_file(struct rt5677_priv *rt5677)
856461c6232SBen Zhang {
857461c6232SBen Zhang const struct firmware *fwp;
858461c6232SBen Zhang struct device *dev = rt5677->component->dev;
859461c6232SBen Zhang int ret = 0;
860461c6232SBen Zhang
861461c6232SBen Zhang /* Load dsp firmware from rt5677_elf_vad file */
862461c6232SBen Zhang ret = request_firmware(&fwp, "rt5677_elf_vad", dev);
863461c6232SBen Zhang if (ret) {
864461c6232SBen Zhang dev_err(dev, "Request rt5677_elf_vad failed %d\n", ret);
865461c6232SBen Zhang return ret;
866461c6232SBen Zhang }
867461c6232SBen Zhang dev_info(dev, "Requested rt5677_elf_vad (%zu)\n", fwp->size);
868461c6232SBen Zhang
869461c6232SBen Zhang ret = rt5677_parse_and_load_dsp(rt5677, fwp->data, fwp->size);
870461c6232SBen Zhang release_firmware(fwp);
871461c6232SBen Zhang return ret;
872461c6232SBen Zhang }
873461c6232SBen Zhang
rt5677_set_dsp_vad(struct snd_soc_component * component,bool on)87479223bf1SKuninori Morimoto static int rt5677_set_dsp_vad(struct snd_soc_component *component, bool on)
875af48f1d0SOder Chiou {
87679223bf1SKuninori Morimoto struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
8773f81068dSBen Zhang rt5677->dsp_vad_en_request = on;
878461c6232SBen Zhang rt5677->dsp_vad_en = on;
879af48f1d0SOder Chiou
8804c121129SArnd Bergmann if (!IS_ENABLED(CONFIG_SND_SOC_RT5677_SPI))
8814c121129SArnd Bergmann return -ENXIO;
8824c121129SArnd Bergmann
883461c6232SBen Zhang schedule_delayed_work(&rt5677->dsp_work, 0);
884461c6232SBen Zhang return 0;
885461c6232SBen Zhang }
886461c6232SBen Zhang
rt5677_dsp_work(struct work_struct * work)887461c6232SBen Zhang static void rt5677_dsp_work(struct work_struct *work)
888461c6232SBen Zhang {
889461c6232SBen Zhang struct rt5677_priv *rt5677 =
890461c6232SBen Zhang container_of(work, struct rt5677_priv, dsp_work.work);
891461c6232SBen Zhang static bool activity;
892461c6232SBen Zhang bool enable = rt5677->dsp_vad_en;
8939da776baSCurtis Malainey int i, val;
894461c6232SBen Zhang
895461c6232SBen Zhang
896461c6232SBen Zhang dev_info(rt5677->component->dev, "DSP VAD: enable=%d, activity=%d\n",
897461c6232SBen Zhang enable, activity);
898461c6232SBen Zhang
899461c6232SBen Zhang if (enable && !activity) {
900af48f1d0SOder Chiou activity = true;
901af48f1d0SOder Chiou
90221c00e5dSBen Zhang /* Before a hotword is detected, GPIO1 pin is configured as IRQ
90321c00e5dSBen Zhang * output so that jack detect works. When a hotword is detected,
90421c00e5dSBen Zhang * the DSP firmware configures the GPIO1 pin as GPIO1 and
90521c00e5dSBen Zhang * drives a 1. rt5677_irq() is called after a rising edge on
90621c00e5dSBen Zhang * the GPIO1 pin, due to either jack detect event or hotword
90721c00e5dSBen Zhang * event, or both. All possible events are checked and handled
90821c00e5dSBen Zhang * in rt5677_irq() where GPIO1 pin is configured back to IRQ
90921c00e5dSBen Zhang * output if a hotword is detected.
910461c6232SBen Zhang */
911af48f1d0SOder Chiou
912461c6232SBen Zhang rt5677_set_vad_source(rt5677);
913461c6232SBen Zhang rt5677_set_dsp_mode(rt5677, true);
914af48f1d0SOder Chiou
9159da776baSCurtis Malainey #define RT5677_BOOT_RETRY 20
9169da776baSCurtis Malainey for (i = 0; i < RT5677_BOOT_RETRY; i++) {
9179da776baSCurtis Malainey regmap_read(rt5677->regmap, RT5677_PWR_DSP_ST, &val);
9189da776baSCurtis Malainey if (val == 0x3ff)
9199da776baSCurtis Malainey break;
9209da776baSCurtis Malainey udelay(500);
9219da776baSCurtis Malainey }
9229da776baSCurtis Malainey if (i == RT5677_BOOT_RETRY && val != 0x3ff) {
9239da776baSCurtis Malainey dev_err(rt5677->component->dev, "DSP Boot Timed Out!");
9249da776baSCurtis Malainey return;
9259da776baSCurtis Malainey }
9269da776baSCurtis Malainey
927461c6232SBen Zhang /* Boot the firmware from IRAM instead of SRAM0. */
928461c6232SBen Zhang rt5677_dsp_mode_i2c_write_addr(rt5677, RT5677_DSP_BOOT_VECTOR,
929461c6232SBen Zhang 0x0009, 0x0003);
930461c6232SBen Zhang rt5677_dsp_mode_i2c_write_addr(rt5677, RT5677_DSP_BOOT_VECTOR,
931461c6232SBen Zhang 0x0019, 0x0003);
932461c6232SBen Zhang rt5677_dsp_mode_i2c_write_addr(rt5677, RT5677_DSP_BOOT_VECTOR,
933461c6232SBen Zhang 0x0009, 0x0003);
934af48f1d0SOder Chiou
935461c6232SBen Zhang rt5677_load_dsp_from_file(rt5677);
936af48f1d0SOder Chiou
937461c6232SBen Zhang /* Set DSP CPU to Run */
938461c6232SBen Zhang regmap_update_bits(rt5677->regmap, RT5677_PWR_DSP1,
939461c6232SBen Zhang RT5677_PWR_DSP_CPU, 0x0);
940461c6232SBen Zhang } else if (!enable && activity) {
941af48f1d0SOder Chiou activity = false;
942af48f1d0SOder Chiou
94321c00e5dSBen Zhang /* Don't turn off the DSP while handling irqs */
94421c00e5dSBen Zhang mutex_lock(&rt5677->irq_lock);
945461c6232SBen Zhang /* Set DSP CPU to Stop */
946461c6232SBen Zhang regmap_update_bits(rt5677->regmap, RT5677_PWR_DSP1,
947461c6232SBen Zhang RT5677_PWR_DSP_CPU, RT5677_PWR_DSP_CPU);
948af48f1d0SOder Chiou
949461c6232SBen Zhang rt5677_set_dsp_mode(rt5677, false);
950af48f1d0SOder Chiou
951461c6232SBen Zhang /* Disable and clear VAD interrupt */
952461c6232SBen Zhang regmap_write(rt5677->regmap, RT5677_VAD_CTRL1, 0x2184);
953af48f1d0SOder Chiou
954461c6232SBen Zhang /* Set GPIO1 pin back to be IRQ output for jack detect */
955461c6232SBen Zhang regmap_update_bits(rt5677->regmap, RT5677_GPIO_CTRL1,
956461c6232SBen Zhang RT5677_GPIO1_PIN_MASK, RT5677_GPIO1_PIN_IRQ);
957461c6232SBen Zhang
95821c00e5dSBen Zhang mutex_unlock(&rt5677->irq_lock);
959af48f1d0SOder Chiou }
960af48f1d0SOder Chiou }
961af48f1d0SOder Chiou
96240e3262eSDylan Reid static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -6525, 75, 0);
96340e3262eSDylan Reid static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -1725, 75, 0);
9640e826e86SOder Chiou static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0);
96590bdbb46SOder Chiou static const DECLARE_TLV_DB_SCALE(st_vol_tlv, -4650, 150, 0);
9660e826e86SOder Chiou
9670e826e86SOder Chiou /* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */
96853f28609SLars-Peter Clausen static const DECLARE_TLV_DB_RANGE(bst_tlv,
9690e826e86SOder Chiou 0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
9700e826e86SOder Chiou 1, 1, TLV_DB_SCALE_ITEM(2000, 0, 0),
9710e826e86SOder Chiou 2, 2, TLV_DB_SCALE_ITEM(2400, 0, 0),
9720e826e86SOder Chiou 3, 5, TLV_DB_SCALE_ITEM(3000, 500, 0),
9730e826e86SOder Chiou 6, 6, TLV_DB_SCALE_ITEM(4400, 0, 0),
9740e826e86SOder Chiou 7, 7, TLV_DB_SCALE_ITEM(5000, 0, 0),
97553f28609SLars-Peter Clausen 8, 8, TLV_DB_SCALE_ITEM(5200, 0, 0)
97653f28609SLars-Peter Clausen );
9770e826e86SOder Chiou
rt5677_dsp_vad_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)978af48f1d0SOder Chiou static int rt5677_dsp_vad_get(struct snd_kcontrol *kcontrol,
979af48f1d0SOder Chiou struct snd_ctl_elem_value *ucontrol)
980af48f1d0SOder Chiou {
9816087fcabSFang, Yang A struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
9826087fcabSFang, Yang A struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
983af48f1d0SOder Chiou
9843f81068dSBen Zhang ucontrol->value.integer.value[0] = rt5677->dsp_vad_en_request;
985af48f1d0SOder Chiou
986af48f1d0SOder Chiou return 0;
987af48f1d0SOder Chiou }
988af48f1d0SOder Chiou
rt5677_dsp_vad_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)989af48f1d0SOder Chiou static int rt5677_dsp_vad_put(struct snd_kcontrol *kcontrol,
990af48f1d0SOder Chiou struct snd_ctl_elem_value *ucontrol)
991af48f1d0SOder Chiou {
9926087fcabSFang, Yang A struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
993af48f1d0SOder Chiou
994395f02efSCurtis Malainey rt5677_set_dsp_vad(component, !!ucontrol->value.integer.value[0]);
995af48f1d0SOder Chiou
996af48f1d0SOder Chiou return 0;
997af48f1d0SOder Chiou }
998af48f1d0SOder Chiou
9990e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_snd_controls[] = {
10000e826e86SOder Chiou /* OUTPUT Control */
10010e826e86SOder Chiou SOC_SINGLE("OUT1 Playback Switch", RT5677_LOUT1,
10020e826e86SOder Chiou RT5677_LOUT1_L_MUTE_SFT, 1, 1),
10030e826e86SOder Chiou SOC_SINGLE("OUT2 Playback Switch", RT5677_LOUT1,
10040e826e86SOder Chiou RT5677_LOUT2_L_MUTE_SFT, 1, 1),
10050e826e86SOder Chiou SOC_SINGLE("OUT3 Playback Switch", RT5677_LOUT1,
10060e826e86SOder Chiou RT5677_LOUT3_L_MUTE_SFT, 1, 1),
10070e826e86SOder Chiou
10080e826e86SOder Chiou /* DAC Digital Volume */
10090e826e86SOder Chiou SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5677_DAC1_DIG_VOL,
1010753c36a4SDylan Reid RT5677_L_VOL_SFT, RT5677_R_VOL_SFT, 127, 0, dac_vol_tlv),
10110e826e86SOder Chiou SOC_DOUBLE_TLV("DAC2 Playback Volume", RT5677_DAC2_DIG_VOL,
1012753c36a4SDylan Reid RT5677_L_VOL_SFT, RT5677_R_VOL_SFT, 127, 0, dac_vol_tlv),
10130e826e86SOder Chiou SOC_DOUBLE_TLV("DAC3 Playback Volume", RT5677_DAC3_DIG_VOL,
1014753c36a4SDylan Reid RT5677_L_VOL_SFT, RT5677_R_VOL_SFT, 127, 0, dac_vol_tlv),
10150e826e86SOder Chiou SOC_DOUBLE_TLV("DAC4 Playback Volume", RT5677_DAC4_DIG_VOL,
1016753c36a4SDylan Reid RT5677_L_VOL_SFT, RT5677_R_VOL_SFT, 127, 0, dac_vol_tlv),
10170e826e86SOder Chiou
10180e826e86SOder Chiou /* IN1/IN2 Control */
10190e826e86SOder Chiou SOC_SINGLE_TLV("IN1 Boost", RT5677_IN1, RT5677_BST_SFT1, 8, 0, bst_tlv),
10200e826e86SOder Chiou SOC_SINGLE_TLV("IN2 Boost", RT5677_IN1, RT5677_BST_SFT2, 8, 0, bst_tlv),
10210e826e86SOder Chiou
10220e826e86SOder Chiou /* ADC Digital Volume Control */
10230e826e86SOder Chiou SOC_DOUBLE("ADC1 Capture Switch", RT5677_STO1_ADC_DIG_VOL,
10240e826e86SOder Chiou RT5677_L_MUTE_SFT, RT5677_R_MUTE_SFT, 1, 1),
10250e826e86SOder Chiou SOC_DOUBLE("ADC2 Capture Switch", RT5677_STO2_ADC_DIG_VOL,
10260e826e86SOder Chiou RT5677_L_MUTE_SFT, RT5677_R_MUTE_SFT, 1, 1),
10270e826e86SOder Chiou SOC_DOUBLE("ADC3 Capture Switch", RT5677_STO3_ADC_DIG_VOL,
10280e826e86SOder Chiou RT5677_L_MUTE_SFT, RT5677_R_MUTE_SFT, 1, 1),
10290e826e86SOder Chiou SOC_DOUBLE("ADC4 Capture Switch", RT5677_STO4_ADC_DIG_VOL,
10300e826e86SOder Chiou RT5677_L_MUTE_SFT, RT5677_R_MUTE_SFT, 1, 1),
10310e826e86SOder Chiou SOC_DOUBLE("Mono ADC Capture Switch", RT5677_MONO_ADC_DIG_VOL,
10320e826e86SOder Chiou RT5677_L_MUTE_SFT, RT5677_R_MUTE_SFT, 1, 1),
10330e826e86SOder Chiou
10340e826e86SOder Chiou SOC_DOUBLE_TLV("ADC1 Capture Volume", RT5677_STO1_ADC_DIG_VOL,
103540e3262eSDylan Reid RT5677_STO1_ADC_L_VOL_SFT, RT5677_STO1_ADC_R_VOL_SFT, 63, 0,
10360e826e86SOder Chiou adc_vol_tlv),
10370e826e86SOder Chiou SOC_DOUBLE_TLV("ADC2 Capture Volume", RT5677_STO2_ADC_DIG_VOL,
103840e3262eSDylan Reid RT5677_STO1_ADC_L_VOL_SFT, RT5677_STO1_ADC_R_VOL_SFT, 63, 0,
10390e826e86SOder Chiou adc_vol_tlv),
10400e826e86SOder Chiou SOC_DOUBLE_TLV("ADC3 Capture Volume", RT5677_STO3_ADC_DIG_VOL,
104140e3262eSDylan Reid RT5677_STO1_ADC_L_VOL_SFT, RT5677_STO1_ADC_R_VOL_SFT, 63, 0,
10420e826e86SOder Chiou adc_vol_tlv),
10430e826e86SOder Chiou SOC_DOUBLE_TLV("ADC4 Capture Volume", RT5677_STO4_ADC_DIG_VOL,
104440e3262eSDylan Reid RT5677_STO1_ADC_L_VOL_SFT, RT5677_STO1_ADC_R_VOL_SFT, 63, 0,
10450e826e86SOder Chiou adc_vol_tlv),
10460e826e86SOder Chiou SOC_DOUBLE_TLV("Mono ADC Capture Volume", RT5677_MONO_ADC_DIG_VOL,
104740e3262eSDylan Reid RT5677_MONO_ADC_L_VOL_SFT, RT5677_MONO_ADC_R_VOL_SFT, 63, 0,
10480e826e86SOder Chiou adc_vol_tlv),
10490e826e86SOder Chiou
105090bdbb46SOder Chiou /* Sidetone Control */
105190bdbb46SOder Chiou SOC_SINGLE_TLV("Sidetone Volume", RT5677_SIDETONE_CTRL,
105290bdbb46SOder Chiou RT5677_ST_VOL_SFT, 31, 0, st_vol_tlv),
105390bdbb46SOder Chiou
10540e826e86SOder Chiou /* ADC Boost Volume Control */
105580220f29SOder Chiou SOC_DOUBLE_TLV("STO1 ADC Boost Volume", RT5677_STO1_2_ADC_BST,
10560e826e86SOder Chiou RT5677_STO1_ADC_L_BST_SFT, RT5677_STO1_ADC_R_BST_SFT, 3, 0,
10570e826e86SOder Chiou adc_bst_tlv),
105880220f29SOder Chiou SOC_DOUBLE_TLV("STO2 ADC Boost Volume", RT5677_STO1_2_ADC_BST,
10590e826e86SOder Chiou RT5677_STO2_ADC_L_BST_SFT, RT5677_STO2_ADC_R_BST_SFT, 3, 0,
10600e826e86SOder Chiou adc_bst_tlv),
106180220f29SOder Chiou SOC_DOUBLE_TLV("STO3 ADC Boost Volume", RT5677_STO3_4_ADC_BST,
10620e826e86SOder Chiou RT5677_STO3_ADC_L_BST_SFT, RT5677_STO3_ADC_R_BST_SFT, 3, 0,
10630e826e86SOder Chiou adc_bst_tlv),
106480220f29SOder Chiou SOC_DOUBLE_TLV("STO4 ADC Boost Volume", RT5677_STO3_4_ADC_BST,
10650e826e86SOder Chiou RT5677_STO4_ADC_L_BST_SFT, RT5677_STO4_ADC_R_BST_SFT, 3, 0,
10660e826e86SOder Chiou adc_bst_tlv),
106780220f29SOder Chiou SOC_DOUBLE_TLV("Mono ADC Boost Volume", RT5677_ADC_BST_CTRL2,
10680e826e86SOder Chiou RT5677_MONO_ADC_L_BST_SFT, RT5677_MONO_ADC_R_BST_SFT, 3, 0,
10690e826e86SOder Chiou adc_bst_tlv),
1070af48f1d0SOder Chiou
1071af48f1d0SOder Chiou SOC_SINGLE_EXT("DSP VAD Switch", SND_SOC_NOPM, 0, 1, 0,
1072af48f1d0SOder Chiou rt5677_dsp_vad_get, rt5677_dsp_vad_put),
10730e826e86SOder Chiou };
10740e826e86SOder Chiou
10750e826e86SOder Chiou /**
10760e826e86SOder Chiou * set_dmic_clk - Set parameter of dmic.
10770e826e86SOder Chiou *
10780e826e86SOder Chiou * @w: DAPM widget.
10790e826e86SOder Chiou * @kcontrol: The kcontrol of this widget.
10800e826e86SOder Chiou * @event: Event id.
10810e826e86SOder Chiou *
10820e826e86SOder Chiou * Choose dmic clock between 1MHz and 3MHz.
10830e826e86SOder Chiou * It is better for clock to approximate 3MHz.
10840e826e86SOder Chiou */
set_dmic_clk(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)10850e826e86SOder Chiou static int set_dmic_clk(struct snd_soc_dapm_widget *w,
10860e826e86SOder Chiou struct snd_kcontrol *kcontrol, int event)
10870e826e86SOder Chiou {
108879223bf1SKuninori Morimoto struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
108979223bf1SKuninori Morimoto struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
109000a6d6e5SOder Chiou int idx, rate;
10910e826e86SOder Chiou
109200a6d6e5SOder Chiou rate = rt5677->sysclk / rl6231_get_pre_div(rt5677->regmap,
109300a6d6e5SOder Chiou RT5677_CLK_TREE_CTRL1, RT5677_I2S_PD1_SFT);
109400a6d6e5SOder Chiou idx = rl6231_calc_dmic_clk(rate);
10950e826e86SOder Chiou if (idx < 0)
109679223bf1SKuninori Morimoto dev_err(component->dev, "Failed to set DMIC clock\n");
10970e826e86SOder Chiou else
10980e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_DMIC_CTRL1,
10990e826e86SOder Chiou RT5677_DMIC_CLK_MASK, idx << RT5677_DMIC_CLK_SFT);
11000e826e86SOder Chiou return idx;
11010e826e86SOder Chiou }
11020e826e86SOder Chiou
is_sys_clk_from_pll(struct snd_soc_dapm_widget * source,struct snd_soc_dapm_widget * sink)11030e826e86SOder Chiou static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *source,
11040e826e86SOder Chiou struct snd_soc_dapm_widget *sink)
11050e826e86SOder Chiou {
110679223bf1SKuninori Morimoto struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm);
110779223bf1SKuninori Morimoto struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
11080e826e86SOder Chiou unsigned int val;
11090e826e86SOder Chiou
11100e826e86SOder Chiou regmap_read(rt5677->regmap, RT5677_GLB_CLK1, &val);
11110e826e86SOder Chiou val &= RT5677_SCLK_SRC_MASK;
11120e826e86SOder Chiou if (val == RT5677_SCLK_SRC_PLL1)
11130e826e86SOder Chiou return 1;
11140e826e86SOder Chiou else
11150e826e86SOder Chiou return 0;
11160e826e86SOder Chiou }
11170e826e86SOder Chiou
is_using_asrc(struct snd_soc_dapm_widget * source,struct snd_soc_dapm_widget * sink)11185a8c7c26SOder Chiou static int is_using_asrc(struct snd_soc_dapm_widget *source,
11195a8c7c26SOder Chiou struct snd_soc_dapm_widget *sink)
11205a8c7c26SOder Chiou {
112179223bf1SKuninori Morimoto struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm);
112279223bf1SKuninori Morimoto struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
11235a8c7c26SOder Chiou unsigned int reg, shift, val;
11245a8c7c26SOder Chiou
11255a8c7c26SOder Chiou if (source->reg == RT5677_ASRC_1) {
11265a8c7c26SOder Chiou switch (source->shift) {
11275a8c7c26SOder Chiou case 12:
11285a8c7c26SOder Chiou reg = RT5677_ASRC_4;
11295a8c7c26SOder Chiou shift = 0;
11305a8c7c26SOder Chiou break;
11315a8c7c26SOder Chiou case 13:
11325a8c7c26SOder Chiou reg = RT5677_ASRC_4;
11335a8c7c26SOder Chiou shift = 4;
11345a8c7c26SOder Chiou break;
11355a8c7c26SOder Chiou case 14:
11365a8c7c26SOder Chiou reg = RT5677_ASRC_4;
11375a8c7c26SOder Chiou shift = 8;
11385a8c7c26SOder Chiou break;
11395a8c7c26SOder Chiou case 15:
11405a8c7c26SOder Chiou reg = RT5677_ASRC_4;
11415a8c7c26SOder Chiou shift = 12;
11425a8c7c26SOder Chiou break;
11435a8c7c26SOder Chiou default:
11445a8c7c26SOder Chiou return 0;
11455a8c7c26SOder Chiou }
11465a8c7c26SOder Chiou } else {
11475a8c7c26SOder Chiou switch (source->shift) {
11485a8c7c26SOder Chiou case 0:
11495a8c7c26SOder Chiou reg = RT5677_ASRC_6;
11505a8c7c26SOder Chiou shift = 8;
11515a8c7c26SOder Chiou break;
11525a8c7c26SOder Chiou case 1:
11535a8c7c26SOder Chiou reg = RT5677_ASRC_6;
11545a8c7c26SOder Chiou shift = 12;
11555a8c7c26SOder Chiou break;
11565a8c7c26SOder Chiou case 2:
11575a8c7c26SOder Chiou reg = RT5677_ASRC_5;
11585a8c7c26SOder Chiou shift = 0;
11595a8c7c26SOder Chiou break;
11605a8c7c26SOder Chiou case 3:
11615a8c7c26SOder Chiou reg = RT5677_ASRC_5;
11625a8c7c26SOder Chiou shift = 4;
11635a8c7c26SOder Chiou break;
11645a8c7c26SOder Chiou case 4:
11655a8c7c26SOder Chiou reg = RT5677_ASRC_5;
11665a8c7c26SOder Chiou shift = 8;
11675a8c7c26SOder Chiou break;
11685a8c7c26SOder Chiou case 5:
11695a8c7c26SOder Chiou reg = RT5677_ASRC_5;
11705a8c7c26SOder Chiou shift = 12;
11715a8c7c26SOder Chiou break;
11725a8c7c26SOder Chiou case 12:
11735a8c7c26SOder Chiou reg = RT5677_ASRC_3;
11745a8c7c26SOder Chiou shift = 0;
11755a8c7c26SOder Chiou break;
11765a8c7c26SOder Chiou case 13:
11775a8c7c26SOder Chiou reg = RT5677_ASRC_3;
11785a8c7c26SOder Chiou shift = 4;
11795a8c7c26SOder Chiou break;
11805a8c7c26SOder Chiou case 14:
11815a8c7c26SOder Chiou reg = RT5677_ASRC_3;
11825a8c7c26SOder Chiou shift = 12;
11835a8c7c26SOder Chiou break;
11845a8c7c26SOder Chiou default:
11855a8c7c26SOder Chiou return 0;
11865a8c7c26SOder Chiou }
11875a8c7c26SOder Chiou }
11885a8c7c26SOder Chiou
1189e4b7e6a8SOder Chiou regmap_read(rt5677->regmap, reg, &val);
1190e4b7e6a8SOder Chiou val = (val >> shift) & 0xf;
1191e4b7e6a8SOder Chiou
11925a8c7c26SOder Chiou switch (val) {
11935a8c7c26SOder Chiou case 1 ... 6:
11945a8c7c26SOder Chiou return 1;
11955a8c7c26SOder Chiou default:
11965a8c7c26SOder Chiou return 0;
11975a8c7c26SOder Chiou }
11985a8c7c26SOder Chiou
11995a8c7c26SOder Chiou }
12005a8c7c26SOder Chiou
can_use_asrc(struct snd_soc_dapm_widget * source,struct snd_soc_dapm_widget * sink)12015a8c7c26SOder Chiou static int can_use_asrc(struct snd_soc_dapm_widget *source,
12025a8c7c26SOder Chiou struct snd_soc_dapm_widget *sink)
12035a8c7c26SOder Chiou {
120479223bf1SKuninori Morimoto struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm);
120579223bf1SKuninori Morimoto struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
12065a8c7c26SOder Chiou
12075a8c7c26SOder Chiou if (rt5677->sysclk > rt5677->lrck[RT5677_AIF1] * 384)
12085a8c7c26SOder Chiou return 1;
12095a8c7c26SOder Chiou
12105a8c7c26SOder Chiou return 0;
12115a8c7c26SOder Chiou }
12125a8c7c26SOder Chiou
1213c36aa0a1SOder Chiou /**
1214c36aa0a1SOder Chiou * rt5677_sel_asrc_clk_src - select ASRC clock source for a set of filters
121579223bf1SKuninori Morimoto * @component: SoC audio component device.
1216c36aa0a1SOder Chiou * @filter_mask: mask of filters.
1217c36aa0a1SOder Chiou * @clk_src: clock source
1218c36aa0a1SOder Chiou *
1219c36aa0a1SOder Chiou * The ASRC function is for asynchronous MCLK and LRCK. Also, since RT5677 can
1220c36aa0a1SOder Chiou * only support standard 32fs or 64fs i2s format, ASRC should be enabled to
1221c36aa0a1SOder Chiou * support special i2s clock format such as Intel's 100fs(100 * sampling rate).
1222c36aa0a1SOder Chiou * ASRC function will track i2s clock and generate a corresponding system clock
1223c36aa0a1SOder Chiou * for codec. This function provides an API to select the clock source for a
1224c36aa0a1SOder Chiou * set of filters specified by the mask. And the codec driver will turn on ASRC
1225c36aa0a1SOder Chiou * for these filters if ASRC is selected as their clock source.
1226c36aa0a1SOder Chiou */
rt5677_sel_asrc_clk_src(struct snd_soc_component * component,unsigned int filter_mask,unsigned int clk_src)122779223bf1SKuninori Morimoto int rt5677_sel_asrc_clk_src(struct snd_soc_component *component,
1228c36aa0a1SOder Chiou unsigned int filter_mask, unsigned int clk_src)
1229c36aa0a1SOder Chiou {
123079223bf1SKuninori Morimoto struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
1231c36aa0a1SOder Chiou unsigned int asrc3_mask = 0, asrc3_value = 0;
1232c36aa0a1SOder Chiou unsigned int asrc4_mask = 0, asrc4_value = 0;
1233c36aa0a1SOder Chiou unsigned int asrc5_mask = 0, asrc5_value = 0;
1234c36aa0a1SOder Chiou unsigned int asrc6_mask = 0, asrc6_value = 0;
1235c36aa0a1SOder Chiou unsigned int asrc7_mask = 0, asrc7_value = 0;
123616ab6e18SBard Liao unsigned int asrc8_mask = 0, asrc8_value = 0;
1237c36aa0a1SOder Chiou
1238c36aa0a1SOder Chiou switch (clk_src) {
1239c36aa0a1SOder Chiou case RT5677_CLK_SEL_SYS:
1240c36aa0a1SOder Chiou case RT5677_CLK_SEL_I2S1_ASRC:
1241c36aa0a1SOder Chiou case RT5677_CLK_SEL_I2S2_ASRC:
1242c36aa0a1SOder Chiou case RT5677_CLK_SEL_I2S3_ASRC:
1243c36aa0a1SOder Chiou case RT5677_CLK_SEL_I2S4_ASRC:
1244c36aa0a1SOder Chiou case RT5677_CLK_SEL_I2S5_ASRC:
1245c36aa0a1SOder Chiou case RT5677_CLK_SEL_I2S6_ASRC:
1246c36aa0a1SOder Chiou case RT5677_CLK_SEL_SYS2:
1247c36aa0a1SOder Chiou case RT5677_CLK_SEL_SYS3:
1248c36aa0a1SOder Chiou case RT5677_CLK_SEL_SYS4:
1249c36aa0a1SOder Chiou case RT5677_CLK_SEL_SYS5:
1250c36aa0a1SOder Chiou case RT5677_CLK_SEL_SYS6:
1251c36aa0a1SOder Chiou case RT5677_CLK_SEL_SYS7:
1252c36aa0a1SOder Chiou break;
1253c36aa0a1SOder Chiou
1254c36aa0a1SOder Chiou default:
1255c36aa0a1SOder Chiou return -EINVAL;
1256c36aa0a1SOder Chiou }
1257c36aa0a1SOder Chiou
1258c36aa0a1SOder Chiou /* ASRC 3 */
1259c36aa0a1SOder Chiou if (filter_mask & RT5677_DA_STEREO_FILTER) {
1260c36aa0a1SOder Chiou asrc3_mask |= RT5677_DA_STO_CLK_SEL_MASK;
1261c36aa0a1SOder Chiou asrc3_value = (asrc3_value & ~RT5677_DA_STO_CLK_SEL_MASK)
1262c36aa0a1SOder Chiou | (clk_src << RT5677_DA_STO_CLK_SEL_SFT);
1263c36aa0a1SOder Chiou }
1264c36aa0a1SOder Chiou
1265c36aa0a1SOder Chiou if (filter_mask & RT5677_DA_MONO2_L_FILTER) {
1266c36aa0a1SOder Chiou asrc3_mask |= RT5677_DA_MONO2L_CLK_SEL_MASK;
1267c36aa0a1SOder Chiou asrc3_value = (asrc3_value & ~RT5677_DA_MONO2L_CLK_SEL_MASK)
1268c36aa0a1SOder Chiou | (clk_src << RT5677_DA_MONO2L_CLK_SEL_SFT);
1269c36aa0a1SOder Chiou }
1270c36aa0a1SOder Chiou
1271c36aa0a1SOder Chiou if (filter_mask & RT5677_DA_MONO2_R_FILTER) {
1272c36aa0a1SOder Chiou asrc3_mask |= RT5677_DA_MONO2R_CLK_SEL_MASK;
1273c36aa0a1SOder Chiou asrc3_value = (asrc3_value & ~RT5677_DA_MONO2R_CLK_SEL_MASK)
1274c36aa0a1SOder Chiou | (clk_src << RT5677_DA_MONO2R_CLK_SEL_SFT);
1275c36aa0a1SOder Chiou }
1276c36aa0a1SOder Chiou
1277c36aa0a1SOder Chiou if (asrc3_mask)
1278c36aa0a1SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_ASRC_3, asrc3_mask,
1279c36aa0a1SOder Chiou asrc3_value);
1280c36aa0a1SOder Chiou
1281c36aa0a1SOder Chiou /* ASRC 4 */
1282c36aa0a1SOder Chiou if (filter_mask & RT5677_DA_MONO3_L_FILTER) {
1283c36aa0a1SOder Chiou asrc4_mask |= RT5677_DA_MONO3L_CLK_SEL_MASK;
1284c36aa0a1SOder Chiou asrc4_value = (asrc4_value & ~RT5677_DA_MONO3L_CLK_SEL_MASK)
1285c36aa0a1SOder Chiou | (clk_src << RT5677_DA_MONO3L_CLK_SEL_SFT);
1286c36aa0a1SOder Chiou }
1287c36aa0a1SOder Chiou
1288c36aa0a1SOder Chiou if (filter_mask & RT5677_DA_MONO3_R_FILTER) {
1289c36aa0a1SOder Chiou asrc4_mask |= RT5677_DA_MONO3R_CLK_SEL_MASK;
1290c36aa0a1SOder Chiou asrc4_value = (asrc4_value & ~RT5677_DA_MONO3R_CLK_SEL_MASK)
1291c36aa0a1SOder Chiou | (clk_src << RT5677_DA_MONO3R_CLK_SEL_SFT);
1292c36aa0a1SOder Chiou }
1293c36aa0a1SOder Chiou
1294c36aa0a1SOder Chiou if (filter_mask & RT5677_DA_MONO4_L_FILTER) {
1295c36aa0a1SOder Chiou asrc4_mask |= RT5677_DA_MONO4L_CLK_SEL_MASK;
1296c36aa0a1SOder Chiou asrc4_value = (asrc4_value & ~RT5677_DA_MONO4L_CLK_SEL_MASK)
1297c36aa0a1SOder Chiou | (clk_src << RT5677_DA_MONO4L_CLK_SEL_SFT);
1298c36aa0a1SOder Chiou }
1299c36aa0a1SOder Chiou
1300c36aa0a1SOder Chiou if (filter_mask & RT5677_DA_MONO4_R_FILTER) {
1301c36aa0a1SOder Chiou asrc4_mask |= RT5677_DA_MONO4R_CLK_SEL_MASK;
1302c36aa0a1SOder Chiou asrc4_value = (asrc4_value & ~RT5677_DA_MONO4R_CLK_SEL_MASK)
1303c36aa0a1SOder Chiou | (clk_src << RT5677_DA_MONO4R_CLK_SEL_SFT);
1304c36aa0a1SOder Chiou }
1305c36aa0a1SOder Chiou
1306c36aa0a1SOder Chiou if (asrc4_mask)
1307c36aa0a1SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_ASRC_4, asrc4_mask,
1308c36aa0a1SOder Chiou asrc4_value);
1309c36aa0a1SOder Chiou
1310c36aa0a1SOder Chiou /* ASRC 5 */
1311c36aa0a1SOder Chiou if (filter_mask & RT5677_AD_STEREO1_FILTER) {
1312c36aa0a1SOder Chiou asrc5_mask |= RT5677_AD_STO1_CLK_SEL_MASK;
1313c36aa0a1SOder Chiou asrc5_value = (asrc5_value & ~RT5677_AD_STO1_CLK_SEL_MASK)
1314c36aa0a1SOder Chiou | (clk_src << RT5677_AD_STO1_CLK_SEL_SFT);
1315c36aa0a1SOder Chiou }
1316c36aa0a1SOder Chiou
1317c36aa0a1SOder Chiou if (filter_mask & RT5677_AD_STEREO2_FILTER) {
1318c36aa0a1SOder Chiou asrc5_mask |= RT5677_AD_STO2_CLK_SEL_MASK;
1319c36aa0a1SOder Chiou asrc5_value = (asrc5_value & ~RT5677_AD_STO2_CLK_SEL_MASK)
1320c36aa0a1SOder Chiou | (clk_src << RT5677_AD_STO2_CLK_SEL_SFT);
1321c36aa0a1SOder Chiou }
1322c36aa0a1SOder Chiou
1323c36aa0a1SOder Chiou if (filter_mask & RT5677_AD_STEREO3_FILTER) {
1324c36aa0a1SOder Chiou asrc5_mask |= RT5677_AD_STO3_CLK_SEL_MASK;
1325c36aa0a1SOder Chiou asrc5_value = (asrc5_value & ~RT5677_AD_STO3_CLK_SEL_MASK)
1326c36aa0a1SOder Chiou | (clk_src << RT5677_AD_STO3_CLK_SEL_SFT);
1327c36aa0a1SOder Chiou }
1328c36aa0a1SOder Chiou
1329c36aa0a1SOder Chiou if (filter_mask & RT5677_AD_STEREO4_FILTER) {
1330c36aa0a1SOder Chiou asrc5_mask |= RT5677_AD_STO4_CLK_SEL_MASK;
1331c36aa0a1SOder Chiou asrc5_value = (asrc5_value & ~RT5677_AD_STO4_CLK_SEL_MASK)
1332c36aa0a1SOder Chiou | (clk_src << RT5677_AD_STO4_CLK_SEL_SFT);
1333c36aa0a1SOder Chiou }
1334c36aa0a1SOder Chiou
1335c36aa0a1SOder Chiou if (asrc5_mask)
1336c36aa0a1SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_ASRC_5, asrc5_mask,
1337c36aa0a1SOder Chiou asrc5_value);
1338c36aa0a1SOder Chiou
1339c36aa0a1SOder Chiou /* ASRC 6 */
1340c36aa0a1SOder Chiou if (filter_mask & RT5677_AD_MONO_L_FILTER) {
1341c36aa0a1SOder Chiou asrc6_mask |= RT5677_AD_MONOL_CLK_SEL_MASK;
1342c36aa0a1SOder Chiou asrc6_value = (asrc6_value & ~RT5677_AD_MONOL_CLK_SEL_MASK)
1343c36aa0a1SOder Chiou | (clk_src << RT5677_AD_MONOL_CLK_SEL_SFT);
1344c36aa0a1SOder Chiou }
1345c36aa0a1SOder Chiou
1346c36aa0a1SOder Chiou if (filter_mask & RT5677_AD_MONO_R_FILTER) {
1347c36aa0a1SOder Chiou asrc6_mask |= RT5677_AD_MONOR_CLK_SEL_MASK;
1348c36aa0a1SOder Chiou asrc6_value = (asrc6_value & ~RT5677_AD_MONOR_CLK_SEL_MASK)
1349c36aa0a1SOder Chiou | (clk_src << RT5677_AD_MONOR_CLK_SEL_SFT);
1350c36aa0a1SOder Chiou }
1351c36aa0a1SOder Chiou
1352c36aa0a1SOder Chiou if (asrc6_mask)
1353c36aa0a1SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_ASRC_6, asrc6_mask,
1354c36aa0a1SOder Chiou asrc6_value);
1355c36aa0a1SOder Chiou
1356c36aa0a1SOder Chiou /* ASRC 7 */
1357c36aa0a1SOder Chiou if (filter_mask & RT5677_DSP_OB_0_3_FILTER) {
1358c36aa0a1SOder Chiou asrc7_mask |= RT5677_DSP_OB_0_3_CLK_SEL_MASK;
1359c36aa0a1SOder Chiou asrc7_value = (asrc7_value & ~RT5677_DSP_OB_0_3_CLK_SEL_MASK)
1360c36aa0a1SOder Chiou | (clk_src << RT5677_DSP_OB_0_3_CLK_SEL_SFT);
1361c36aa0a1SOder Chiou }
1362c36aa0a1SOder Chiou
1363c36aa0a1SOder Chiou if (filter_mask & RT5677_DSP_OB_4_7_FILTER) {
1364c36aa0a1SOder Chiou asrc7_mask |= RT5677_DSP_OB_4_7_CLK_SEL_MASK;
1365c36aa0a1SOder Chiou asrc7_value = (asrc7_value & ~RT5677_DSP_OB_4_7_CLK_SEL_MASK)
1366c36aa0a1SOder Chiou | (clk_src << RT5677_DSP_OB_4_7_CLK_SEL_SFT);
1367c36aa0a1SOder Chiou }
1368c36aa0a1SOder Chiou
1369c36aa0a1SOder Chiou if (asrc7_mask)
1370c36aa0a1SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_ASRC_7, asrc7_mask,
1371c36aa0a1SOder Chiou asrc7_value);
1372c36aa0a1SOder Chiou
137316ab6e18SBard Liao /* ASRC 8 */
137416ab6e18SBard Liao if (filter_mask & RT5677_I2S1_SOURCE) {
137516ab6e18SBard Liao asrc8_mask |= RT5677_I2S1_CLK_SEL_MASK;
137616ab6e18SBard Liao asrc8_value = (asrc8_value & ~RT5677_I2S1_CLK_SEL_MASK)
137716ab6e18SBard Liao | ((clk_src - 1) << RT5677_I2S1_CLK_SEL_SFT);
137816ab6e18SBard Liao }
137916ab6e18SBard Liao
138016ab6e18SBard Liao if (filter_mask & RT5677_I2S2_SOURCE) {
138116ab6e18SBard Liao asrc8_mask |= RT5677_I2S2_CLK_SEL_MASK;
138216ab6e18SBard Liao asrc8_value = (asrc8_value & ~RT5677_I2S2_CLK_SEL_MASK)
138316ab6e18SBard Liao | ((clk_src - 1) << RT5677_I2S2_CLK_SEL_SFT);
138416ab6e18SBard Liao }
138516ab6e18SBard Liao
138616ab6e18SBard Liao if (filter_mask & RT5677_I2S3_SOURCE) {
138716ab6e18SBard Liao asrc8_mask |= RT5677_I2S3_CLK_SEL_MASK;
138816ab6e18SBard Liao asrc8_value = (asrc8_value & ~RT5677_I2S3_CLK_SEL_MASK)
138916ab6e18SBard Liao | ((clk_src - 1) << RT5677_I2S3_CLK_SEL_SFT);
139016ab6e18SBard Liao }
139116ab6e18SBard Liao
139216ab6e18SBard Liao if (filter_mask & RT5677_I2S4_SOURCE) {
139316ab6e18SBard Liao asrc8_mask |= RT5677_I2S4_CLK_SEL_MASK;
139416ab6e18SBard Liao asrc8_value = (asrc8_value & ~RT5677_I2S4_CLK_SEL_MASK)
139516ab6e18SBard Liao | ((clk_src - 1) << RT5677_I2S4_CLK_SEL_SFT);
139616ab6e18SBard Liao }
139716ab6e18SBard Liao
139816ab6e18SBard Liao if (asrc8_mask)
139916ab6e18SBard Liao regmap_update_bits(rt5677->regmap, RT5677_ASRC_8, asrc8_mask,
140016ab6e18SBard Liao asrc8_value);
140116ab6e18SBard Liao
1402c36aa0a1SOder Chiou return 0;
1403c36aa0a1SOder Chiou }
1404c36aa0a1SOder Chiou EXPORT_SYMBOL_GPL(rt5677_sel_asrc_clk_src);
1405c36aa0a1SOder Chiou
rt5677_dmic_use_asrc(struct snd_soc_dapm_widget * source,struct snd_soc_dapm_widget * sink)14065220f7fbSOder Chiou static int rt5677_dmic_use_asrc(struct snd_soc_dapm_widget *source,
14075220f7fbSOder Chiou struct snd_soc_dapm_widget *sink)
14085220f7fbSOder Chiou {
140979223bf1SKuninori Morimoto struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm);
141079223bf1SKuninori Morimoto struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
14115220f7fbSOder Chiou unsigned int asrc_setting;
14125220f7fbSOder Chiou
14135220f7fbSOder Chiou switch (source->shift) {
14145220f7fbSOder Chiou case 11:
14155220f7fbSOder Chiou regmap_read(rt5677->regmap, RT5677_ASRC_5, &asrc_setting);
14165220f7fbSOder Chiou asrc_setting = (asrc_setting & RT5677_AD_STO1_CLK_SEL_MASK) >>
14175220f7fbSOder Chiou RT5677_AD_STO1_CLK_SEL_SFT;
14185220f7fbSOder Chiou break;
14195220f7fbSOder Chiou
14205220f7fbSOder Chiou case 10:
14215220f7fbSOder Chiou regmap_read(rt5677->regmap, RT5677_ASRC_5, &asrc_setting);
14225220f7fbSOder Chiou asrc_setting = (asrc_setting & RT5677_AD_STO2_CLK_SEL_MASK) >>
14235220f7fbSOder Chiou RT5677_AD_STO2_CLK_SEL_SFT;
14245220f7fbSOder Chiou break;
14255220f7fbSOder Chiou
14265220f7fbSOder Chiou case 9:
14275220f7fbSOder Chiou regmap_read(rt5677->regmap, RT5677_ASRC_5, &asrc_setting);
14285220f7fbSOder Chiou asrc_setting = (asrc_setting & RT5677_AD_STO3_CLK_SEL_MASK) >>
14295220f7fbSOder Chiou RT5677_AD_STO3_CLK_SEL_SFT;
14305220f7fbSOder Chiou break;
14315220f7fbSOder Chiou
14325220f7fbSOder Chiou case 8:
14335220f7fbSOder Chiou regmap_read(rt5677->regmap, RT5677_ASRC_5, &asrc_setting);
14345220f7fbSOder Chiou asrc_setting = (asrc_setting & RT5677_AD_STO4_CLK_SEL_MASK) >>
14355220f7fbSOder Chiou RT5677_AD_STO4_CLK_SEL_SFT;
14365220f7fbSOder Chiou break;
14375220f7fbSOder Chiou
14385220f7fbSOder Chiou case 7:
14395220f7fbSOder Chiou regmap_read(rt5677->regmap, RT5677_ASRC_6, &asrc_setting);
14405220f7fbSOder Chiou asrc_setting = (asrc_setting & RT5677_AD_MONOL_CLK_SEL_MASK) >>
14415220f7fbSOder Chiou RT5677_AD_MONOL_CLK_SEL_SFT;
14425220f7fbSOder Chiou break;
14435220f7fbSOder Chiou
14445220f7fbSOder Chiou case 6:
14455220f7fbSOder Chiou regmap_read(rt5677->regmap, RT5677_ASRC_6, &asrc_setting);
14465220f7fbSOder Chiou asrc_setting = (asrc_setting & RT5677_AD_MONOR_CLK_SEL_MASK) >>
14475220f7fbSOder Chiou RT5677_AD_MONOR_CLK_SEL_SFT;
14485220f7fbSOder Chiou break;
14495220f7fbSOder Chiou
14505220f7fbSOder Chiou default:
14512dfadff6SAxel Lin return 0;
14525220f7fbSOder Chiou }
14535220f7fbSOder Chiou
14542dfadff6SAxel Lin if (asrc_setting >= RT5677_CLK_SEL_I2S1_ASRC &&
14552dfadff6SAxel Lin asrc_setting <= RT5677_CLK_SEL_I2S6_ASRC)
14562dfadff6SAxel Lin return 1;
14572dfadff6SAxel Lin
14585220f7fbSOder Chiou return 0;
14595220f7fbSOder Chiou }
14605220f7fbSOder Chiou
14610e826e86SOder Chiou /* Digital Mixer */
14620e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_sto1_adc_l_mix[] = {
14630e826e86SOder Chiou SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO1_ADC_MIXER,
14640e826e86SOder Chiou RT5677_M_STO1_ADC_L1_SFT, 1, 1),
14650e826e86SOder Chiou SOC_DAPM_SINGLE("ADC2 Switch", RT5677_STO1_ADC_MIXER,
14660e826e86SOder Chiou RT5677_M_STO1_ADC_L2_SFT, 1, 1),
14670e826e86SOder Chiou };
14680e826e86SOder Chiou
14690e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_sto1_adc_r_mix[] = {
14700e826e86SOder Chiou SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO1_ADC_MIXER,
14710e826e86SOder Chiou RT5677_M_STO1_ADC_R1_SFT, 1, 1),
14720e826e86SOder Chiou SOC_DAPM_SINGLE("ADC2 Switch", RT5677_STO1_ADC_MIXER,
14730e826e86SOder Chiou RT5677_M_STO1_ADC_R2_SFT, 1, 1),
14740e826e86SOder Chiou };
14750e826e86SOder Chiou
14760e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_sto2_adc_l_mix[] = {
14770e826e86SOder Chiou SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO2_ADC_MIXER,
14780e826e86SOder Chiou RT5677_M_STO2_ADC_L1_SFT, 1, 1),
14790e826e86SOder Chiou SOC_DAPM_SINGLE("ADC2 Switch", RT5677_STO2_ADC_MIXER,
14800e826e86SOder Chiou RT5677_M_STO2_ADC_L2_SFT, 1, 1),
14810e826e86SOder Chiou };
14820e826e86SOder Chiou
14830e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_sto2_adc_r_mix[] = {
14840e826e86SOder Chiou SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO2_ADC_MIXER,
14850e826e86SOder Chiou RT5677_M_STO2_ADC_R1_SFT, 1, 1),
14860e826e86SOder Chiou SOC_DAPM_SINGLE("ADC2 Switch", RT5677_STO2_ADC_MIXER,
14870e826e86SOder Chiou RT5677_M_STO2_ADC_R2_SFT, 1, 1),
14880e826e86SOder Chiou };
14890e826e86SOder Chiou
14900e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_sto3_adc_l_mix[] = {
14910e826e86SOder Chiou SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO3_ADC_MIXER,
14920e826e86SOder Chiou RT5677_M_STO3_ADC_L1_SFT, 1, 1),
14930e826e86SOder Chiou SOC_DAPM_SINGLE("ADC2 Switch", RT5677_STO3_ADC_MIXER,
14940e826e86SOder Chiou RT5677_M_STO3_ADC_L2_SFT, 1, 1),
14950e826e86SOder Chiou };
14960e826e86SOder Chiou
14970e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_sto3_adc_r_mix[] = {
14980e826e86SOder Chiou SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO3_ADC_MIXER,
14990e826e86SOder Chiou RT5677_M_STO3_ADC_R1_SFT, 1, 1),
15000e826e86SOder Chiou SOC_DAPM_SINGLE("ADC2 Switch", RT5677_STO3_ADC_MIXER,
15010e826e86SOder Chiou RT5677_M_STO3_ADC_R2_SFT, 1, 1),
15020e826e86SOder Chiou };
15030e826e86SOder Chiou
15040e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_sto4_adc_l_mix[] = {
15050e826e86SOder Chiou SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO4_ADC_MIXER,
15060e826e86SOder Chiou RT5677_M_STO4_ADC_L1_SFT, 1, 1),
15070e826e86SOder Chiou SOC_DAPM_SINGLE("ADC2 Switch", RT5677_STO4_ADC_MIXER,
15080e826e86SOder Chiou RT5677_M_STO4_ADC_L2_SFT, 1, 1),
15090e826e86SOder Chiou };
15100e826e86SOder Chiou
15110e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_sto4_adc_r_mix[] = {
15120e826e86SOder Chiou SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO4_ADC_MIXER,
15130e826e86SOder Chiou RT5677_M_STO4_ADC_R1_SFT, 1, 1),
15140e826e86SOder Chiou SOC_DAPM_SINGLE("ADC2 Switch", RT5677_STO4_ADC_MIXER,
15150e826e86SOder Chiou RT5677_M_STO4_ADC_R2_SFT, 1, 1),
15160e826e86SOder Chiou };
15170e826e86SOder Chiou
15180e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_mono_adc_l_mix[] = {
15190e826e86SOder Chiou SOC_DAPM_SINGLE("ADC1 Switch", RT5677_MONO_ADC_MIXER,
15200e826e86SOder Chiou RT5677_M_MONO_ADC_L1_SFT, 1, 1),
15210e826e86SOder Chiou SOC_DAPM_SINGLE("ADC2 Switch", RT5677_MONO_ADC_MIXER,
15220e826e86SOder Chiou RT5677_M_MONO_ADC_L2_SFT, 1, 1),
15230e826e86SOder Chiou };
15240e826e86SOder Chiou
15250e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_mono_adc_r_mix[] = {
15260e826e86SOder Chiou SOC_DAPM_SINGLE("ADC1 Switch", RT5677_MONO_ADC_MIXER,
15270e826e86SOder Chiou RT5677_M_MONO_ADC_R1_SFT, 1, 1),
15280e826e86SOder Chiou SOC_DAPM_SINGLE("ADC2 Switch", RT5677_MONO_ADC_MIXER,
15290e826e86SOder Chiou RT5677_M_MONO_ADC_R2_SFT, 1, 1),
15300e826e86SOder Chiou };
15310e826e86SOder Chiou
15320e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_dac_l_mix[] = {
15330e826e86SOder Chiou SOC_DAPM_SINGLE("Stereo ADC Switch", RT5677_ADC_IF_DSP_DAC1_MIXER,
15340e826e86SOder Chiou RT5677_M_ADDA_MIXER1_L_SFT, 1, 1),
15350e826e86SOder Chiou SOC_DAPM_SINGLE("DAC1 Switch", RT5677_ADC_IF_DSP_DAC1_MIXER,
15360e826e86SOder Chiou RT5677_M_DAC1_L_SFT, 1, 1),
15370e826e86SOder Chiou };
15380e826e86SOder Chiou
15390e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_dac_r_mix[] = {
15400e826e86SOder Chiou SOC_DAPM_SINGLE("Stereo ADC Switch", RT5677_ADC_IF_DSP_DAC1_MIXER,
15410e826e86SOder Chiou RT5677_M_ADDA_MIXER1_R_SFT, 1, 1),
15420e826e86SOder Chiou SOC_DAPM_SINGLE("DAC1 Switch", RT5677_ADC_IF_DSP_DAC1_MIXER,
15430e826e86SOder Chiou RT5677_M_DAC1_R_SFT, 1, 1),
15440e826e86SOder Chiou };
15450e826e86SOder Chiou
15460e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_sto1_dac_l_mix[] = {
1547c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("ST L Switch", RT5677_STO1_DAC_MIXER,
15480e826e86SOder Chiou RT5677_M_ST_DAC1_L_SFT, 1, 1),
1549c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("DAC1 L Switch", RT5677_STO1_DAC_MIXER,
15500e826e86SOder Chiou RT5677_M_DAC1_L_STO_L_SFT, 1, 1),
1551c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("DAC2 L Switch", RT5677_STO1_DAC_MIXER,
15520e826e86SOder Chiou RT5677_M_DAC2_L_STO_L_SFT, 1, 1),
1553c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("DAC1 R Switch", RT5677_STO1_DAC_MIXER,
15540e826e86SOder Chiou RT5677_M_DAC1_R_STO_L_SFT, 1, 1),
15550e826e86SOder Chiou };
15560e826e86SOder Chiou
15570e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_sto1_dac_r_mix[] = {
1558c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("ST R Switch", RT5677_STO1_DAC_MIXER,
15590e826e86SOder Chiou RT5677_M_ST_DAC1_R_SFT, 1, 1),
1560c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("DAC1 R Switch", RT5677_STO1_DAC_MIXER,
15610e826e86SOder Chiou RT5677_M_DAC1_R_STO_R_SFT, 1, 1),
1562c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("DAC2 R Switch", RT5677_STO1_DAC_MIXER,
15630e826e86SOder Chiou RT5677_M_DAC2_R_STO_R_SFT, 1, 1),
1564c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("DAC1 L Switch", RT5677_STO1_DAC_MIXER,
15650e826e86SOder Chiou RT5677_M_DAC1_L_STO_R_SFT, 1, 1),
15660e826e86SOder Chiou };
15670e826e86SOder Chiou
15680e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_mono_dac_l_mix[] = {
1569c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("ST L Switch", RT5677_MONO_DAC_MIXER,
15700e826e86SOder Chiou RT5677_M_ST_DAC2_L_SFT, 1, 1),
1571c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("DAC1 L Switch", RT5677_MONO_DAC_MIXER,
15720e826e86SOder Chiou RT5677_M_DAC1_L_MONO_L_SFT, 1, 1),
1573c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("DAC2 L Switch", RT5677_MONO_DAC_MIXER,
15740e826e86SOder Chiou RT5677_M_DAC2_L_MONO_L_SFT, 1, 1),
1575c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("DAC2 R Switch", RT5677_MONO_DAC_MIXER,
15760e826e86SOder Chiou RT5677_M_DAC2_R_MONO_L_SFT, 1, 1),
15770e826e86SOder Chiou };
15780e826e86SOder Chiou
15790e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_mono_dac_r_mix[] = {
1580c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("ST R Switch", RT5677_MONO_DAC_MIXER,
15810e826e86SOder Chiou RT5677_M_ST_DAC2_R_SFT, 1, 1),
1582c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("DAC1 R Switch", RT5677_MONO_DAC_MIXER,
15830e826e86SOder Chiou RT5677_M_DAC1_R_MONO_R_SFT, 1, 1),
1584c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("DAC2 R Switch", RT5677_MONO_DAC_MIXER,
15850e826e86SOder Chiou RT5677_M_DAC2_R_MONO_R_SFT, 1, 1),
1586c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("DAC2 L Switch", RT5677_MONO_DAC_MIXER,
15870e826e86SOder Chiou RT5677_M_DAC2_L_MONO_R_SFT, 1, 1),
15880e826e86SOder Chiou };
15890e826e86SOder Chiou
15900e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_dd1_l_mix[] = {
1591c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("Sto DAC Mix L Switch", RT5677_DD1_MIXER,
15920e826e86SOder Chiou RT5677_M_STO_L_DD1_L_SFT, 1, 1),
1593c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("Mono DAC Mix L Switch", RT5677_DD1_MIXER,
15940e826e86SOder Chiou RT5677_M_MONO_L_DD1_L_SFT, 1, 1),
1595c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("DAC3 L Switch", RT5677_DD1_MIXER,
15960e826e86SOder Chiou RT5677_M_DAC3_L_DD1_L_SFT, 1, 1),
1597c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("DAC3 R Switch", RT5677_DD1_MIXER,
15980e826e86SOder Chiou RT5677_M_DAC3_R_DD1_L_SFT, 1, 1),
15990e826e86SOder Chiou };
16000e826e86SOder Chiou
16010e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_dd1_r_mix[] = {
1602c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("Sto DAC Mix R Switch", RT5677_DD1_MIXER,
16030e826e86SOder Chiou RT5677_M_STO_R_DD1_R_SFT, 1, 1),
1604c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("Mono DAC Mix R Switch", RT5677_DD1_MIXER,
16050e826e86SOder Chiou RT5677_M_MONO_R_DD1_R_SFT, 1, 1),
1606c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("DAC3 R Switch", RT5677_DD1_MIXER,
16070e826e86SOder Chiou RT5677_M_DAC3_R_DD1_R_SFT, 1, 1),
1608c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("DAC3 L Switch", RT5677_DD1_MIXER,
16090e826e86SOder Chiou RT5677_M_DAC3_L_DD1_R_SFT, 1, 1),
16100e826e86SOder Chiou };
16110e826e86SOder Chiou
16120e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_dd2_l_mix[] = {
1613c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("Sto DAC Mix L Switch", RT5677_DD2_MIXER,
16140e826e86SOder Chiou RT5677_M_STO_L_DD2_L_SFT, 1, 1),
1615c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("Mono DAC Mix L Switch", RT5677_DD2_MIXER,
16160e826e86SOder Chiou RT5677_M_MONO_L_DD2_L_SFT, 1, 1),
1617c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("DAC4 L Switch", RT5677_DD2_MIXER,
16180e826e86SOder Chiou RT5677_M_DAC4_L_DD2_L_SFT, 1, 1),
1619c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("DAC4 R Switch", RT5677_DD2_MIXER,
16200e826e86SOder Chiou RT5677_M_DAC4_R_DD2_L_SFT, 1, 1),
16210e826e86SOder Chiou };
16220e826e86SOder Chiou
16230e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_dd2_r_mix[] = {
1624c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("Sto DAC Mix R Switch", RT5677_DD2_MIXER,
16250e826e86SOder Chiou RT5677_M_STO_R_DD2_R_SFT, 1, 1),
1626c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("Mono DAC Mix R Switch", RT5677_DD2_MIXER,
16270e826e86SOder Chiou RT5677_M_MONO_R_DD2_R_SFT, 1, 1),
1628c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("DAC4 R Switch", RT5677_DD2_MIXER,
16290e826e86SOder Chiou RT5677_M_DAC4_R_DD2_R_SFT, 1, 1),
1630c22d7666SOder Chiou SOC_DAPM_SINGLE_AUTODISABLE("DAC4 L Switch", RT5677_DD2_MIXER,
16310e826e86SOder Chiou RT5677_M_DAC4_L_DD2_R_SFT, 1, 1),
16320e826e86SOder Chiou };
16330e826e86SOder Chiou
16340e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_ob_01_mix[] = {
16350e826e86SOder Chiou SOC_DAPM_SINGLE("IB01 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
16360e826e86SOder Chiou RT5677_DSP_IB_01_H_SFT, 1, 1),
16370e826e86SOder Chiou SOC_DAPM_SINGLE("IB23 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
16380e826e86SOder Chiou RT5677_DSP_IB_23_H_SFT, 1, 1),
16390e826e86SOder Chiou SOC_DAPM_SINGLE("IB45 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
16400e826e86SOder Chiou RT5677_DSP_IB_45_H_SFT, 1, 1),
16410e826e86SOder Chiou SOC_DAPM_SINGLE("IB6 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
16420e826e86SOder Chiou RT5677_DSP_IB_6_H_SFT, 1, 1),
16430e826e86SOder Chiou SOC_DAPM_SINGLE("IB7 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
16440e826e86SOder Chiou RT5677_DSP_IB_7_H_SFT, 1, 1),
16450e826e86SOder Chiou SOC_DAPM_SINGLE("IB8 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
16460e826e86SOder Chiou RT5677_DSP_IB_8_H_SFT, 1, 1),
16470e826e86SOder Chiou SOC_DAPM_SINGLE("IB9 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
16480e826e86SOder Chiou RT5677_DSP_IB_9_H_SFT, 1, 1),
16490e826e86SOder Chiou };
16500e826e86SOder Chiou
16510e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_ob_23_mix[] = {
16520e826e86SOder Chiou SOC_DAPM_SINGLE("IB01 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
16530e826e86SOder Chiou RT5677_DSP_IB_01_L_SFT, 1, 1),
16540e826e86SOder Chiou SOC_DAPM_SINGLE("IB23 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
16550e826e86SOder Chiou RT5677_DSP_IB_23_L_SFT, 1, 1),
16560e826e86SOder Chiou SOC_DAPM_SINGLE("IB45 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
16570e826e86SOder Chiou RT5677_DSP_IB_45_L_SFT, 1, 1),
16580e826e86SOder Chiou SOC_DAPM_SINGLE("IB6 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
16590e826e86SOder Chiou RT5677_DSP_IB_6_L_SFT, 1, 1),
16600e826e86SOder Chiou SOC_DAPM_SINGLE("IB7 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
16610e826e86SOder Chiou RT5677_DSP_IB_7_L_SFT, 1, 1),
16620e826e86SOder Chiou SOC_DAPM_SINGLE("IB8 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
16630e826e86SOder Chiou RT5677_DSP_IB_8_L_SFT, 1, 1),
16640e826e86SOder Chiou SOC_DAPM_SINGLE("IB9 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
16650e826e86SOder Chiou RT5677_DSP_IB_9_L_SFT, 1, 1),
16660e826e86SOder Chiou };
16670e826e86SOder Chiou
16680e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_ob_4_mix[] = {
16690e826e86SOder Chiou SOC_DAPM_SINGLE("IB01 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
16700e826e86SOder Chiou RT5677_DSP_IB_01_H_SFT, 1, 1),
16710e826e86SOder Chiou SOC_DAPM_SINGLE("IB23 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
16720e826e86SOder Chiou RT5677_DSP_IB_23_H_SFT, 1, 1),
16730e826e86SOder Chiou SOC_DAPM_SINGLE("IB45 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
16740e826e86SOder Chiou RT5677_DSP_IB_45_H_SFT, 1, 1),
16750e826e86SOder Chiou SOC_DAPM_SINGLE("IB6 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
16760e826e86SOder Chiou RT5677_DSP_IB_6_H_SFT, 1, 1),
16770e826e86SOder Chiou SOC_DAPM_SINGLE("IB7 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
16780e826e86SOder Chiou RT5677_DSP_IB_7_H_SFT, 1, 1),
16790e826e86SOder Chiou SOC_DAPM_SINGLE("IB8 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
16800e826e86SOder Chiou RT5677_DSP_IB_8_H_SFT, 1, 1),
16810e826e86SOder Chiou SOC_DAPM_SINGLE("IB9 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
16820e826e86SOder Chiou RT5677_DSP_IB_9_H_SFT, 1, 1),
16830e826e86SOder Chiou };
16840e826e86SOder Chiou
16850e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_ob_5_mix[] = {
16860e826e86SOder Chiou SOC_DAPM_SINGLE("IB01 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
16870e826e86SOder Chiou RT5677_DSP_IB_01_L_SFT, 1, 1),
16880e826e86SOder Chiou SOC_DAPM_SINGLE("IB23 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
16890e826e86SOder Chiou RT5677_DSP_IB_23_L_SFT, 1, 1),
16900e826e86SOder Chiou SOC_DAPM_SINGLE("IB45 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
16910e826e86SOder Chiou RT5677_DSP_IB_45_L_SFT, 1, 1),
16920e826e86SOder Chiou SOC_DAPM_SINGLE("IB6 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
16930e826e86SOder Chiou RT5677_DSP_IB_6_L_SFT, 1, 1),
16940e826e86SOder Chiou SOC_DAPM_SINGLE("IB7 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
16950e826e86SOder Chiou RT5677_DSP_IB_7_L_SFT, 1, 1),
16960e826e86SOder Chiou SOC_DAPM_SINGLE("IB8 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
16970e826e86SOder Chiou RT5677_DSP_IB_8_L_SFT, 1, 1),
16980e826e86SOder Chiou SOC_DAPM_SINGLE("IB9 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
16990e826e86SOder Chiou RT5677_DSP_IB_9_L_SFT, 1, 1),
17000e826e86SOder Chiou };
17010e826e86SOder Chiou
17020e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_ob_6_mix[] = {
17030e826e86SOder Chiou SOC_DAPM_SINGLE("IB01 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
17040e826e86SOder Chiou RT5677_DSP_IB_01_H_SFT, 1, 1),
17050e826e86SOder Chiou SOC_DAPM_SINGLE("IB23 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
17060e826e86SOder Chiou RT5677_DSP_IB_23_H_SFT, 1, 1),
17070e826e86SOder Chiou SOC_DAPM_SINGLE("IB45 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
17080e826e86SOder Chiou RT5677_DSP_IB_45_H_SFT, 1, 1),
17090e826e86SOder Chiou SOC_DAPM_SINGLE("IB6 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
17100e826e86SOder Chiou RT5677_DSP_IB_6_H_SFT, 1, 1),
17110e826e86SOder Chiou SOC_DAPM_SINGLE("IB7 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
17120e826e86SOder Chiou RT5677_DSP_IB_7_H_SFT, 1, 1),
17130e826e86SOder Chiou SOC_DAPM_SINGLE("IB8 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
17140e826e86SOder Chiou RT5677_DSP_IB_8_H_SFT, 1, 1),
17150e826e86SOder Chiou SOC_DAPM_SINGLE("IB9 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
17160e826e86SOder Chiou RT5677_DSP_IB_9_H_SFT, 1, 1),
17170e826e86SOder Chiou };
17180e826e86SOder Chiou
17190e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_ob_7_mix[] = {
17200e826e86SOder Chiou SOC_DAPM_SINGLE("IB01 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
17210e826e86SOder Chiou RT5677_DSP_IB_01_L_SFT, 1, 1),
17220e826e86SOder Chiou SOC_DAPM_SINGLE("IB23 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
17230e826e86SOder Chiou RT5677_DSP_IB_23_L_SFT, 1, 1),
17240e826e86SOder Chiou SOC_DAPM_SINGLE("IB45 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
17250e826e86SOder Chiou RT5677_DSP_IB_45_L_SFT, 1, 1),
17260e826e86SOder Chiou SOC_DAPM_SINGLE("IB6 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
17270e826e86SOder Chiou RT5677_DSP_IB_6_L_SFT, 1, 1),
17280e826e86SOder Chiou SOC_DAPM_SINGLE("IB7 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
17290e826e86SOder Chiou RT5677_DSP_IB_7_L_SFT, 1, 1),
17300e826e86SOder Chiou SOC_DAPM_SINGLE("IB8 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
17310e826e86SOder Chiou RT5677_DSP_IB_8_L_SFT, 1, 1),
17320e826e86SOder Chiou SOC_DAPM_SINGLE("IB9 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
17330e826e86SOder Chiou RT5677_DSP_IB_9_L_SFT, 1, 1),
17340e826e86SOder Chiou };
17350e826e86SOder Chiou
17360e826e86SOder Chiou
17370e826e86SOder Chiou /* Mux */
17381b7fd76aSOder Chiou /* DAC1 L/R Source */ /* MX-29 [10:8] */
17390e826e86SOder Chiou static const char * const rt5677_dac1_src[] = {
17400e826e86SOder Chiou "IF1 DAC 01", "IF2 DAC 01", "IF3 DAC LR", "IF4 DAC LR", "SLB DAC 01",
17410e826e86SOder Chiou "OB 01"
17420e826e86SOder Chiou };
17430e826e86SOder Chiou
17440e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
17450e826e86SOder Chiou rt5677_dac1_enum, RT5677_ADC_IF_DSP_DAC1_MIXER,
17460e826e86SOder Chiou RT5677_DAC1_L_SEL_SFT, rt5677_dac1_src);
17470e826e86SOder Chiou
17480e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_dac1_mux =
17491b7fd76aSOder Chiou SOC_DAPM_ENUM("DAC1 Source", rt5677_dac1_enum);
17500e826e86SOder Chiou
17511b7fd76aSOder Chiou /* ADDA1 L/R Source */ /* MX-29 [1:0] */
17520e826e86SOder Chiou static const char * const rt5677_adda1_src[] = {
17530e826e86SOder Chiou "STO1 ADC MIX", "STO2 ADC MIX", "OB 67",
17540e826e86SOder Chiou };
17550e826e86SOder Chiou
17560e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
17570e826e86SOder Chiou rt5677_adda1_enum, RT5677_ADC_IF_DSP_DAC1_MIXER,
17580e826e86SOder Chiou RT5677_ADDA1_SEL_SFT, rt5677_adda1_src);
17590e826e86SOder Chiou
17600e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_adda1_mux =
17611b7fd76aSOder Chiou SOC_DAPM_ENUM("ADDA1 Source", rt5677_adda1_enum);
17620e826e86SOder Chiou
17630e826e86SOder Chiou
17641b7fd76aSOder Chiou /*DAC2 L/R Source*/ /* MX-1B [6:4] [2:0] */
17650e826e86SOder Chiou static const char * const rt5677_dac2l_src[] = {
17660e826e86SOder Chiou "IF1 DAC 2", "IF2 DAC 2", "IF3 DAC L", "IF4 DAC L", "SLB DAC 2",
17670e826e86SOder Chiou "OB 2",
17680e826e86SOder Chiou };
17690e826e86SOder Chiou
17700e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
17710e826e86SOder Chiou rt5677_dac2l_enum, RT5677_IF_DSP_DAC2_MIXER,
17720e826e86SOder Chiou RT5677_SEL_DAC2_L_SRC_SFT, rt5677_dac2l_src);
17730e826e86SOder Chiou
17740e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_dac2_l_mux =
17751b7fd76aSOder Chiou SOC_DAPM_ENUM("DAC2 L Source", rt5677_dac2l_enum);
17760e826e86SOder Chiou
17770e826e86SOder Chiou static const char * const rt5677_dac2r_src[] = {
17780e826e86SOder Chiou "IF1 DAC 3", "IF2 DAC 3", "IF3 DAC R", "IF4 DAC R", "SLB DAC 3",
17790e826e86SOder Chiou "OB 3", "Haptic Generator", "VAD ADC"
17800e826e86SOder Chiou };
17810e826e86SOder Chiou
17820e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
17830e826e86SOder Chiou rt5677_dac2r_enum, RT5677_IF_DSP_DAC2_MIXER,
17840e826e86SOder Chiou RT5677_SEL_DAC2_R_SRC_SFT, rt5677_dac2r_src);
17850e826e86SOder Chiou
17860e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_dac2_r_mux =
17871b7fd76aSOder Chiou SOC_DAPM_ENUM("DAC2 R Source", rt5677_dac2r_enum);
17880e826e86SOder Chiou
17891b7fd76aSOder Chiou /*DAC3 L/R Source*/ /* MX-16 [6:4] [2:0] */
17900e826e86SOder Chiou static const char * const rt5677_dac3l_src[] = {
17910e826e86SOder Chiou "IF1 DAC 4", "IF2 DAC 4", "IF3 DAC L", "IF4 DAC L",
17920e826e86SOder Chiou "SLB DAC 4", "OB 4"
17930e826e86SOder Chiou };
17940e826e86SOder Chiou
17950e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
17960e826e86SOder Chiou rt5677_dac3l_enum, RT5677_IF_DSP_DAC3_4_MIXER,
17970e826e86SOder Chiou RT5677_SEL_DAC3_L_SRC_SFT, rt5677_dac3l_src);
17980e826e86SOder Chiou
17990e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_dac3_l_mux =
18001b7fd76aSOder Chiou SOC_DAPM_ENUM("DAC3 L Source", rt5677_dac3l_enum);
18010e826e86SOder Chiou
18020e826e86SOder Chiou static const char * const rt5677_dac3r_src[] = {
18030e826e86SOder Chiou "IF1 DAC 5", "IF2 DAC 5", "IF3 DAC R", "IF4 DAC R",
18040e826e86SOder Chiou "SLB DAC 5", "OB 5"
18050e826e86SOder Chiou };
18060e826e86SOder Chiou
18070e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
18080e826e86SOder Chiou rt5677_dac3r_enum, RT5677_IF_DSP_DAC3_4_MIXER,
18090e826e86SOder Chiou RT5677_SEL_DAC3_R_SRC_SFT, rt5677_dac3r_src);
18100e826e86SOder Chiou
18110e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_dac3_r_mux =
18121b7fd76aSOder Chiou SOC_DAPM_ENUM("DAC3 R Source", rt5677_dac3r_enum);
18130e826e86SOder Chiou
18141b7fd76aSOder Chiou /*DAC4 L/R Source*/ /* MX-16 [14:12] [10:8] */
18150e826e86SOder Chiou static const char * const rt5677_dac4l_src[] = {
18160e826e86SOder Chiou "IF1 DAC 6", "IF2 DAC 6", "IF3 DAC L", "IF4 DAC L",
18170e826e86SOder Chiou "SLB DAC 6", "OB 6"
18180e826e86SOder Chiou };
18190e826e86SOder Chiou
18200e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
18210e826e86SOder Chiou rt5677_dac4l_enum, RT5677_IF_DSP_DAC3_4_MIXER,
18220e826e86SOder Chiou RT5677_SEL_DAC4_L_SRC_SFT, rt5677_dac4l_src);
18230e826e86SOder Chiou
18240e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_dac4_l_mux =
18251b7fd76aSOder Chiou SOC_DAPM_ENUM("DAC4 L Source", rt5677_dac4l_enum);
18260e826e86SOder Chiou
18270e826e86SOder Chiou static const char * const rt5677_dac4r_src[] = {
18280e826e86SOder Chiou "IF1 DAC 7", "IF2 DAC 7", "IF3 DAC R", "IF4 DAC R",
18290e826e86SOder Chiou "SLB DAC 7", "OB 7"
18300e826e86SOder Chiou };
18310e826e86SOder Chiou
18320e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
18330e826e86SOder Chiou rt5677_dac4r_enum, RT5677_IF_DSP_DAC3_4_MIXER,
18340e826e86SOder Chiou RT5677_SEL_DAC4_R_SRC_SFT, rt5677_dac4r_src);
18350e826e86SOder Chiou
18360e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_dac4_r_mux =
18371b7fd76aSOder Chiou SOC_DAPM_ENUM("DAC4 R Source", rt5677_dac4r_enum);
18380e826e86SOder Chiou
18390e826e86SOder Chiou /* In/OutBound Source Pass SRC */ /* MX-A5 [3] [4] [0] [1] [2] */
18400e826e86SOder Chiou static const char * const rt5677_iob_bypass_src[] = {
18410e826e86SOder Chiou "Bypass", "Pass SRC"
18420e826e86SOder Chiou };
18430e826e86SOder Chiou
18440e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
18450e826e86SOder Chiou rt5677_ob01_bypass_src_enum, RT5677_DSP_IN_OUTB_CTRL,
18460e826e86SOder Chiou RT5677_SEL_SRC_OB01_SFT, rt5677_iob_bypass_src);
18470e826e86SOder Chiou
18480e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_ob01_bypass_src_mux =
18491b7fd76aSOder Chiou SOC_DAPM_ENUM("OB01 Bypass Source", rt5677_ob01_bypass_src_enum);
18500e826e86SOder Chiou
18510e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
18520e826e86SOder Chiou rt5677_ob23_bypass_src_enum, RT5677_DSP_IN_OUTB_CTRL,
18530e826e86SOder Chiou RT5677_SEL_SRC_OB23_SFT, rt5677_iob_bypass_src);
18540e826e86SOder Chiou
18550e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_ob23_bypass_src_mux =
18561b7fd76aSOder Chiou SOC_DAPM_ENUM("OB23 Bypass Source", rt5677_ob23_bypass_src_enum);
18570e826e86SOder Chiou
18580e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
18590e826e86SOder Chiou rt5677_ib01_bypass_src_enum, RT5677_DSP_IN_OUTB_CTRL,
18600e826e86SOder Chiou RT5677_SEL_SRC_IB01_SFT, rt5677_iob_bypass_src);
18610e826e86SOder Chiou
18620e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_ib01_bypass_src_mux =
18631b7fd76aSOder Chiou SOC_DAPM_ENUM("IB01 Bypass Source", rt5677_ib01_bypass_src_enum);
18640e826e86SOder Chiou
18650e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
18660e826e86SOder Chiou rt5677_ib23_bypass_src_enum, RT5677_DSP_IN_OUTB_CTRL,
18670e826e86SOder Chiou RT5677_SEL_SRC_IB23_SFT, rt5677_iob_bypass_src);
18680e826e86SOder Chiou
18690e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_ib23_bypass_src_mux =
18701b7fd76aSOder Chiou SOC_DAPM_ENUM("IB23 Bypass Source", rt5677_ib23_bypass_src_enum);
18710e826e86SOder Chiou
18720e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
18730e826e86SOder Chiou rt5677_ib45_bypass_src_enum, RT5677_DSP_IN_OUTB_CTRL,
18740e826e86SOder Chiou RT5677_SEL_SRC_IB45_SFT, rt5677_iob_bypass_src);
18750e826e86SOder Chiou
18760e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_ib45_bypass_src_mux =
18771b7fd76aSOder Chiou SOC_DAPM_ENUM("IB45 Bypass Source", rt5677_ib45_bypass_src_enum);
18780e826e86SOder Chiou
18790e826e86SOder Chiou /* Stereo ADC Source 2 */ /* MX-27 MX26 MX25 [11:10] */
18800e826e86SOder Chiou static const char * const rt5677_stereo_adc2_src[] = {
18810e826e86SOder Chiou "DD MIX1", "DMIC", "Stereo DAC MIX"
18820e826e86SOder Chiou };
18830e826e86SOder Chiou
18840e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
18850e826e86SOder Chiou rt5677_stereo1_adc2_enum, RT5677_STO1_ADC_MIXER,
18860e826e86SOder Chiou RT5677_SEL_STO1_ADC2_SFT, rt5677_stereo_adc2_src);
18870e826e86SOder Chiou
18880e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_sto1_adc2_mux =
18891b7fd76aSOder Chiou SOC_DAPM_ENUM("Stereo1 ADC2 Source", rt5677_stereo1_adc2_enum);
18900e826e86SOder Chiou
18910e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
18920e826e86SOder Chiou rt5677_stereo2_adc2_enum, RT5677_STO2_ADC_MIXER,
18930e826e86SOder Chiou RT5677_SEL_STO2_ADC2_SFT, rt5677_stereo_adc2_src);
18940e826e86SOder Chiou
18950e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_sto2_adc2_mux =
18961b7fd76aSOder Chiou SOC_DAPM_ENUM("Stereo2 ADC2 Source", rt5677_stereo2_adc2_enum);
18970e826e86SOder Chiou
18980e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
18990e826e86SOder Chiou rt5677_stereo3_adc2_enum, RT5677_STO3_ADC_MIXER,
19000e826e86SOder Chiou RT5677_SEL_STO3_ADC2_SFT, rt5677_stereo_adc2_src);
19010e826e86SOder Chiou
19020e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_sto3_adc2_mux =
19031b7fd76aSOder Chiou SOC_DAPM_ENUM("Stereo3 ADC2 Source", rt5677_stereo3_adc2_enum);
19040e826e86SOder Chiou
19050e826e86SOder Chiou /* DMIC Source */ /* MX-28 [9:8][1:0] MX-27 MX-26 MX-25 MX-24 [9:8] */
19060e826e86SOder Chiou static const char * const rt5677_dmic_src[] = {
19070e826e86SOder Chiou "DMIC1", "DMIC2", "DMIC3", "DMIC4"
19080e826e86SOder Chiou };
19090e826e86SOder Chiou
19100e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
19110e826e86SOder Chiou rt5677_mono_dmic_l_enum, RT5677_MONO_ADC_MIXER,
19120e826e86SOder Chiou RT5677_SEL_MONO_DMIC_L_SFT, rt5677_dmic_src);
19130e826e86SOder Chiou
19140e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_mono_dmic_l_mux =
19151b7fd76aSOder Chiou SOC_DAPM_ENUM("Mono DMIC L Source", rt5677_mono_dmic_l_enum);
19160e826e86SOder Chiou
19170e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
19180e826e86SOder Chiou rt5677_mono_dmic_r_enum, RT5677_MONO_ADC_MIXER,
19190e826e86SOder Chiou RT5677_SEL_MONO_DMIC_R_SFT, rt5677_dmic_src);
19200e826e86SOder Chiou
19210e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_mono_dmic_r_mux =
19221b7fd76aSOder Chiou SOC_DAPM_ENUM("Mono DMIC R Source", rt5677_mono_dmic_r_enum);
19230e826e86SOder Chiou
19240e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
19250e826e86SOder Chiou rt5677_stereo1_dmic_enum, RT5677_STO1_ADC_MIXER,
19260e826e86SOder Chiou RT5677_SEL_STO1_DMIC_SFT, rt5677_dmic_src);
19270e826e86SOder Chiou
19280e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_sto1_dmic_mux =
19291b7fd76aSOder Chiou SOC_DAPM_ENUM("Stereo1 DMIC Source", rt5677_stereo1_dmic_enum);
19300e826e86SOder Chiou
19310e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
19320e826e86SOder Chiou rt5677_stereo2_dmic_enum, RT5677_STO2_ADC_MIXER,
19330e826e86SOder Chiou RT5677_SEL_STO2_DMIC_SFT, rt5677_dmic_src);
19340e826e86SOder Chiou
19350e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_sto2_dmic_mux =
19361b7fd76aSOder Chiou SOC_DAPM_ENUM("Stereo2 DMIC Source", rt5677_stereo2_dmic_enum);
19370e826e86SOder Chiou
19380e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
19390e826e86SOder Chiou rt5677_stereo3_dmic_enum, RT5677_STO3_ADC_MIXER,
19400e826e86SOder Chiou RT5677_SEL_STO3_DMIC_SFT, rt5677_dmic_src);
19410e826e86SOder Chiou
19420e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_sto3_dmic_mux =
19431b7fd76aSOder Chiou SOC_DAPM_ENUM("Stereo3 DMIC Source", rt5677_stereo3_dmic_enum);
19440e826e86SOder Chiou
19450e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
19460e826e86SOder Chiou rt5677_stereo4_dmic_enum, RT5677_STO4_ADC_MIXER,
19470e826e86SOder Chiou RT5677_SEL_STO4_DMIC_SFT, rt5677_dmic_src);
19480e826e86SOder Chiou
19490e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_sto4_dmic_mux =
19501b7fd76aSOder Chiou SOC_DAPM_ENUM("Stereo4 DMIC Source", rt5677_stereo4_dmic_enum);
19510e826e86SOder Chiou
19521b7fd76aSOder Chiou /* Stereo2 ADC Source */ /* MX-26 [0] */
19530e826e86SOder Chiou static const char * const rt5677_stereo2_adc_lr_src[] = {
19540e826e86SOder Chiou "L", "LR"
19550e826e86SOder Chiou };
19560e826e86SOder Chiou
19570e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
19580e826e86SOder Chiou rt5677_stereo2_adc_lr_enum, RT5677_STO2_ADC_MIXER,
19590e826e86SOder Chiou RT5677_SEL_STO2_LR_MIX_SFT, rt5677_stereo2_adc_lr_src);
19600e826e86SOder Chiou
19610e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_sto2_adc_lr_mux =
19621b7fd76aSOder Chiou SOC_DAPM_ENUM("Stereo2 ADC LR Source", rt5677_stereo2_adc_lr_enum);
19630e826e86SOder Chiou
19640e826e86SOder Chiou /* Stereo1 ADC Source 1 */ /* MX-27 MX26 MX25 [13:12] */
19650e826e86SOder Chiou static const char * const rt5677_stereo_adc1_src[] = {
19660e826e86SOder Chiou "DD MIX1", "ADC1/2", "Stereo DAC MIX"
19670e826e86SOder Chiou };
19680e826e86SOder Chiou
19690e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
19700e826e86SOder Chiou rt5677_stereo1_adc1_enum, RT5677_STO1_ADC_MIXER,
19710e826e86SOder Chiou RT5677_SEL_STO1_ADC1_SFT, rt5677_stereo_adc1_src);
19720e826e86SOder Chiou
19730e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_sto1_adc1_mux =
19741b7fd76aSOder Chiou SOC_DAPM_ENUM("Stereo1 ADC1 Source", rt5677_stereo1_adc1_enum);
19750e826e86SOder Chiou
19760e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
19770e826e86SOder Chiou rt5677_stereo2_adc1_enum, RT5677_STO2_ADC_MIXER,
19780e826e86SOder Chiou RT5677_SEL_STO2_ADC1_SFT, rt5677_stereo_adc1_src);
19790e826e86SOder Chiou
19800e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_sto2_adc1_mux =
19811b7fd76aSOder Chiou SOC_DAPM_ENUM("Stereo2 ADC1 Source", rt5677_stereo2_adc1_enum);
19820e826e86SOder Chiou
19830e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
19840e826e86SOder Chiou rt5677_stereo3_adc1_enum, RT5677_STO3_ADC_MIXER,
19850e826e86SOder Chiou RT5677_SEL_STO3_ADC1_SFT, rt5677_stereo_adc1_src);
19860e826e86SOder Chiou
19870e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_sto3_adc1_mux =
19881b7fd76aSOder Chiou SOC_DAPM_ENUM("Stereo3 ADC1 Source", rt5677_stereo3_adc1_enum);
19890e826e86SOder Chiou
19901b7fd76aSOder Chiou /* Mono ADC Left Source 2 */ /* MX-28 [11:10] */
19910e826e86SOder Chiou static const char * const rt5677_mono_adc2_l_src[] = {
19920e826e86SOder Chiou "DD MIX1L", "DMIC", "MONO DAC MIXL"
19930e826e86SOder Chiou };
19940e826e86SOder Chiou
19950e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
19960e826e86SOder Chiou rt5677_mono_adc2_l_enum, RT5677_MONO_ADC_MIXER,
19970e826e86SOder Chiou RT5677_SEL_MONO_ADC_L2_SFT, rt5677_mono_adc2_l_src);
19980e826e86SOder Chiou
19990e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_mono_adc2_l_mux =
20001b7fd76aSOder Chiou SOC_DAPM_ENUM("Mono ADC2 L Source", rt5677_mono_adc2_l_enum);
20010e826e86SOder Chiou
20021b7fd76aSOder Chiou /* Mono ADC Left Source 1 */ /* MX-28 [13:12] */
20030e826e86SOder Chiou static const char * const rt5677_mono_adc1_l_src[] = {
20040e826e86SOder Chiou "DD MIX1L", "ADC1", "MONO DAC MIXL"
20050e826e86SOder Chiou };
20060e826e86SOder Chiou
20070e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
20080e826e86SOder Chiou rt5677_mono_adc1_l_enum, RT5677_MONO_ADC_MIXER,
20090e826e86SOder Chiou RT5677_SEL_MONO_ADC_L1_SFT, rt5677_mono_adc1_l_src);
20100e826e86SOder Chiou
20110e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_mono_adc1_l_mux =
20121b7fd76aSOder Chiou SOC_DAPM_ENUM("Mono ADC1 L Source", rt5677_mono_adc1_l_enum);
20130e826e86SOder Chiou
20141b7fd76aSOder Chiou /* Mono ADC Right Source 2 */ /* MX-28 [3:2] */
20150e826e86SOder Chiou static const char * const rt5677_mono_adc2_r_src[] = {
20160e826e86SOder Chiou "DD MIX1R", "DMIC", "MONO DAC MIXR"
20170e826e86SOder Chiou };
20180e826e86SOder Chiou
20190e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
20200e826e86SOder Chiou rt5677_mono_adc2_r_enum, RT5677_MONO_ADC_MIXER,
20210e826e86SOder Chiou RT5677_SEL_MONO_ADC_R2_SFT, rt5677_mono_adc2_r_src);
20220e826e86SOder Chiou
20230e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_mono_adc2_r_mux =
20241b7fd76aSOder Chiou SOC_DAPM_ENUM("Mono ADC2 R Source", rt5677_mono_adc2_r_enum);
20250e826e86SOder Chiou
20261b7fd76aSOder Chiou /* Mono ADC Right Source 1 */ /* MX-28 [5:4] */
20270e826e86SOder Chiou static const char * const rt5677_mono_adc1_r_src[] = {
20280e826e86SOder Chiou "DD MIX1R", "ADC2", "MONO DAC MIXR"
20290e826e86SOder Chiou };
20300e826e86SOder Chiou
20310e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
20320e826e86SOder Chiou rt5677_mono_adc1_r_enum, RT5677_MONO_ADC_MIXER,
20330e826e86SOder Chiou RT5677_SEL_MONO_ADC_R1_SFT, rt5677_mono_adc1_r_src);
20340e826e86SOder Chiou
20350e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_mono_adc1_r_mux =
20361b7fd76aSOder Chiou SOC_DAPM_ENUM("Mono ADC1 R Source", rt5677_mono_adc1_r_enum);
20370e826e86SOder Chiou
20380e826e86SOder Chiou /* Stereo4 ADC Source 2 */ /* MX-24 [11:10] */
20390e826e86SOder Chiou static const char * const rt5677_stereo4_adc2_src[] = {
20400e826e86SOder Chiou "DD MIX1", "DMIC", "DD MIX2"
20410e826e86SOder Chiou };
20420e826e86SOder Chiou
20430e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
20440e826e86SOder Chiou rt5677_stereo4_adc2_enum, RT5677_STO4_ADC_MIXER,
20450e826e86SOder Chiou RT5677_SEL_STO4_ADC2_SFT, rt5677_stereo4_adc2_src);
20460e826e86SOder Chiou
20470e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_sto4_adc2_mux =
20481b7fd76aSOder Chiou SOC_DAPM_ENUM("Stereo4 ADC2 Source", rt5677_stereo4_adc2_enum);
20490e826e86SOder Chiou
20500e826e86SOder Chiou
20510e826e86SOder Chiou /* Stereo4 ADC Source 1 */ /* MX-24 [13:12] */
20520e826e86SOder Chiou static const char * const rt5677_stereo4_adc1_src[] = {
20530e826e86SOder Chiou "DD MIX1", "ADC1/2", "DD MIX2"
20540e826e86SOder Chiou };
20550e826e86SOder Chiou
20560e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
20570e826e86SOder Chiou rt5677_stereo4_adc1_enum, RT5677_STO4_ADC_MIXER,
20580e826e86SOder Chiou RT5677_SEL_STO4_ADC1_SFT, rt5677_stereo4_adc1_src);
20590e826e86SOder Chiou
20600e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_sto4_adc1_mux =
20611b7fd76aSOder Chiou SOC_DAPM_ENUM("Stereo4 ADC1 Source", rt5677_stereo4_adc1_enum);
20620e826e86SOder Chiou
20630e826e86SOder Chiou /* InBound0/1 Source */ /* MX-A3 [14:12] */
20640e826e86SOder Chiou static const char * const rt5677_inbound01_src[] = {
20650e826e86SOder Chiou "IF1 DAC 01", "IF2 DAC 01", "SLB DAC 01", "STO1 ADC MIX",
20660e826e86SOder Chiou "VAD ADC/DAC1 FS"
20670e826e86SOder Chiou };
20680e826e86SOder Chiou
20690e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
20700e826e86SOder Chiou rt5677_inbound01_enum, RT5677_DSP_INB_CTRL1,
20710e826e86SOder Chiou RT5677_IB01_SRC_SFT, rt5677_inbound01_src);
20720e826e86SOder Chiou
20730e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_ib01_src_mux =
20740e826e86SOder Chiou SOC_DAPM_ENUM("InBound0/1 Source", rt5677_inbound01_enum);
20750e826e86SOder Chiou
20760e826e86SOder Chiou /* InBound2/3 Source */ /* MX-A3 [10:8] */
20770e826e86SOder Chiou static const char * const rt5677_inbound23_src[] = {
20780e826e86SOder Chiou "IF1 DAC 23", "IF2 DAC 23", "SLB DAC 23", "STO2 ADC MIX",
20790e826e86SOder Chiou "DAC1 FS", "IF4 DAC"
20800e826e86SOder Chiou };
20810e826e86SOder Chiou
20820e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
20830e826e86SOder Chiou rt5677_inbound23_enum, RT5677_DSP_INB_CTRL1,
20840e826e86SOder Chiou RT5677_IB23_SRC_SFT, rt5677_inbound23_src);
20850e826e86SOder Chiou
20860e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_ib23_src_mux =
20870e826e86SOder Chiou SOC_DAPM_ENUM("InBound2/3 Source", rt5677_inbound23_enum);
20880e826e86SOder Chiou
20890e826e86SOder Chiou /* InBound4/5 Source */ /* MX-A3 [6:4] */
20900e826e86SOder Chiou static const char * const rt5677_inbound45_src[] = {
20910e826e86SOder Chiou "IF1 DAC 45", "IF2 DAC 45", "SLB DAC 45", "STO3 ADC MIX",
20920e826e86SOder Chiou "IF3 DAC"
20930e826e86SOder Chiou };
20940e826e86SOder Chiou
20950e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
20960e826e86SOder Chiou rt5677_inbound45_enum, RT5677_DSP_INB_CTRL1,
20970e826e86SOder Chiou RT5677_IB45_SRC_SFT, rt5677_inbound45_src);
20980e826e86SOder Chiou
20990e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_ib45_src_mux =
21000e826e86SOder Chiou SOC_DAPM_ENUM("InBound4/5 Source", rt5677_inbound45_enum);
21010e826e86SOder Chiou
21020e826e86SOder Chiou /* InBound6 Source */ /* MX-A3 [2:0] */
21030e826e86SOder Chiou static const char * const rt5677_inbound6_src[] = {
21040e826e86SOder Chiou "IF1 DAC 6", "IF2 DAC 6", "SLB DAC 6", "STO4 ADC MIX L",
21050e826e86SOder Chiou "IF4 DAC L", "STO1 ADC MIX L", "STO2 ADC MIX L", "STO3 ADC MIX L"
21060e826e86SOder Chiou };
21070e826e86SOder Chiou
21080e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
21090e826e86SOder Chiou rt5677_inbound6_enum, RT5677_DSP_INB_CTRL1,
21100e826e86SOder Chiou RT5677_IB6_SRC_SFT, rt5677_inbound6_src);
21110e826e86SOder Chiou
21120e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_ib6_src_mux =
21130e826e86SOder Chiou SOC_DAPM_ENUM("InBound6 Source", rt5677_inbound6_enum);
21140e826e86SOder Chiou
21150e826e86SOder Chiou /* InBound7 Source */ /* MX-A4 [14:12] */
21160e826e86SOder Chiou static const char * const rt5677_inbound7_src[] = {
21170e826e86SOder Chiou "IF1 DAC 7", "IF2 DAC 7", "SLB DAC 7", "STO4 ADC MIX R",
21180e826e86SOder Chiou "IF4 DAC R", "STO1 ADC MIX R", "STO2 ADC MIX R", "STO3 ADC MIX R"
21190e826e86SOder Chiou };
21200e826e86SOder Chiou
21210e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
21220e826e86SOder Chiou rt5677_inbound7_enum, RT5677_DSP_INB_CTRL2,
21230e826e86SOder Chiou RT5677_IB7_SRC_SFT, rt5677_inbound7_src);
21240e826e86SOder Chiou
21250e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_ib7_src_mux =
21260e826e86SOder Chiou SOC_DAPM_ENUM("InBound7 Source", rt5677_inbound7_enum);
21270e826e86SOder Chiou
21280e826e86SOder Chiou /* InBound8 Source */ /* MX-A4 [10:8] */
21290e826e86SOder Chiou static const char * const rt5677_inbound8_src[] = {
21300e826e86SOder Chiou "STO1 ADC MIX L", "STO2 ADC MIX L", "STO3 ADC MIX L", "STO4 ADC MIX L",
21310e826e86SOder Chiou "MONO ADC MIX L", "DACL1 FS"
21320e826e86SOder Chiou };
21330e826e86SOder Chiou
21340e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
21350e826e86SOder Chiou rt5677_inbound8_enum, RT5677_DSP_INB_CTRL2,
21360e826e86SOder Chiou RT5677_IB8_SRC_SFT, rt5677_inbound8_src);
21370e826e86SOder Chiou
21380e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_ib8_src_mux =
21390e826e86SOder Chiou SOC_DAPM_ENUM("InBound8 Source", rt5677_inbound8_enum);
21400e826e86SOder Chiou
21410e826e86SOder Chiou /* InBound9 Source */ /* MX-A4 [6:4] */
21420e826e86SOder Chiou static const char * const rt5677_inbound9_src[] = {
21430e826e86SOder Chiou "STO1 ADC MIX R", "STO2 ADC MIX R", "STO3 ADC MIX R", "STO4 ADC MIX R",
21440e826e86SOder Chiou "MONO ADC MIX R", "DACR1 FS", "DAC1 FS"
21450e826e86SOder Chiou };
21460e826e86SOder Chiou
21470e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
21480e826e86SOder Chiou rt5677_inbound9_enum, RT5677_DSP_INB_CTRL2,
21490e826e86SOder Chiou RT5677_IB9_SRC_SFT, rt5677_inbound9_src);
21500e826e86SOder Chiou
21510e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_ib9_src_mux =
21520e826e86SOder Chiou SOC_DAPM_ENUM("InBound9 Source", rt5677_inbound9_enum);
21530e826e86SOder Chiou
21540e826e86SOder Chiou /* VAD Source */ /* MX-9F [6:4] */
21550e826e86SOder Chiou static const char * const rt5677_vad_src[] = {
21560e826e86SOder Chiou "STO1 ADC MIX L", "MONO ADC MIX L", "MONO ADC MIX R", "STO2 ADC MIX L",
21570e826e86SOder Chiou "STO3 ADC MIX L"
21580e826e86SOder Chiou };
21590e826e86SOder Chiou
21600e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
21610e826e86SOder Chiou rt5677_vad_enum, RT5677_VAD_CTRL4,
21620e826e86SOder Chiou RT5677_VAD_SRC_SFT, rt5677_vad_src);
21630e826e86SOder Chiou
21640e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_vad_src_mux =
21650e826e86SOder Chiou SOC_DAPM_ENUM("VAD Source", rt5677_vad_enum);
21660e826e86SOder Chiou
21670e826e86SOder Chiou /* Sidetone Source */ /* MX-13 [11:9] */
21680e826e86SOder Chiou static const char * const rt5677_sidetone_src[] = {
21690e826e86SOder Chiou "DMIC1 L", "DMIC2 L", "DMIC3 L", "DMIC4 L", "ADC1", "ADC2"
21700e826e86SOder Chiou };
21710e826e86SOder Chiou
21720e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
21730e826e86SOder Chiou rt5677_sidetone_enum, RT5677_SIDETONE_CTRL,
21740e826e86SOder Chiou RT5677_ST_SEL_SFT, rt5677_sidetone_src);
21750e826e86SOder Chiou
21760e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_sidetone_mux =
21770e826e86SOder Chiou SOC_DAPM_ENUM("Sidetone Source", rt5677_sidetone_enum);
21780e826e86SOder Chiou
21790e826e86SOder Chiou /* DAC1/2 Source */ /* MX-15 [1:0] */
21800e826e86SOder Chiou static const char * const rt5677_dac12_src[] = {
21810e826e86SOder Chiou "STO1 DAC MIX", "MONO DAC MIX", "DD MIX1", "DD MIX2"
21820e826e86SOder Chiou };
21830e826e86SOder Chiou
21840e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
21850e826e86SOder Chiou rt5677_dac12_enum, RT5677_ANA_DAC1_2_3_SRC,
21860e826e86SOder Chiou RT5677_ANA_DAC1_2_SRC_SEL_SFT, rt5677_dac12_src);
21870e826e86SOder Chiou
21880e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_dac12_mux =
21890e826e86SOder Chiou SOC_DAPM_ENUM("Analog DAC1/2 Source", rt5677_dac12_enum);
21900e826e86SOder Chiou
21910e826e86SOder Chiou /* DAC3 Source */ /* MX-15 [5:4] */
21920e826e86SOder Chiou static const char * const rt5677_dac3_src[] = {
21930e826e86SOder Chiou "MONO DAC MIXL", "MONO DAC MIXR", "DD MIX1L", "DD MIX2L"
21940e826e86SOder Chiou };
21950e826e86SOder Chiou
21960e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
21970e826e86SOder Chiou rt5677_dac3_enum, RT5677_ANA_DAC1_2_3_SRC,
21980e826e86SOder Chiou RT5677_ANA_DAC3_SRC_SEL_SFT, rt5677_dac3_src);
21990e826e86SOder Chiou
22000e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_dac3_mux =
22010e826e86SOder Chiou SOC_DAPM_ENUM("Analog DAC3 Source", rt5677_dac3_enum);
22020e826e86SOder Chiou
22031b7fd76aSOder Chiou /* PDM channel Source */ /* MX-31 [13:12][9:8][5:4][1:0] */
22040e826e86SOder Chiou static const char * const rt5677_pdm_src[] = {
22050e826e86SOder Chiou "STO1 DAC MIX", "MONO DAC MIX", "DD MIX1", "DD MIX2"
22060e826e86SOder Chiou };
22070e826e86SOder Chiou
22080e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
22090e826e86SOder Chiou rt5677_pdm1_l_enum, RT5677_PDM_OUT_CTRL,
22100e826e86SOder Chiou RT5677_SEL_PDM1_L_SFT, rt5677_pdm_src);
22110e826e86SOder Chiou
22120e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_pdm1_l_mux =
22131b7fd76aSOder Chiou SOC_DAPM_ENUM("PDM1 Source", rt5677_pdm1_l_enum);
22140e826e86SOder Chiou
22150e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
22160e826e86SOder Chiou rt5677_pdm2_l_enum, RT5677_PDM_OUT_CTRL,
22170e826e86SOder Chiou RT5677_SEL_PDM2_L_SFT, rt5677_pdm_src);
22180e826e86SOder Chiou
22190e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_pdm2_l_mux =
22201b7fd76aSOder Chiou SOC_DAPM_ENUM("PDM2 Source", rt5677_pdm2_l_enum);
22210e826e86SOder Chiou
22220e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
22230e826e86SOder Chiou rt5677_pdm1_r_enum, RT5677_PDM_OUT_CTRL,
22240e826e86SOder Chiou RT5677_SEL_PDM1_R_SFT, rt5677_pdm_src);
22250e826e86SOder Chiou
22260e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_pdm1_r_mux =
22271b7fd76aSOder Chiou SOC_DAPM_ENUM("PDM1 Source", rt5677_pdm1_r_enum);
22280e826e86SOder Chiou
22290e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
22300e826e86SOder Chiou rt5677_pdm2_r_enum, RT5677_PDM_OUT_CTRL,
22310e826e86SOder Chiou RT5677_SEL_PDM2_R_SFT, rt5677_pdm_src);
22320e826e86SOder Chiou
22330e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_pdm2_r_mux =
22341b7fd76aSOder Chiou SOC_DAPM_ENUM("PDM2 Source", rt5677_pdm2_r_enum);
22350e826e86SOder Chiou
22360e826e86SOder Chiou /* TDM IF1/2 SLB ADC1 Data Selection */ /* MX-3C MX-41 [5:4] MX-08 [1:0] */
22370e826e86SOder Chiou static const char * const rt5677_if12_adc1_src[] = {
22380e826e86SOder Chiou "STO1 ADC MIX", "OB01", "VAD ADC"
22390e826e86SOder Chiou };
22400e826e86SOder Chiou
22410e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
22420e826e86SOder Chiou rt5677_if1_adc1_enum, RT5677_TDM1_CTRL2,
22430e826e86SOder Chiou RT5677_IF1_ADC1_SFT, rt5677_if12_adc1_src);
22440e826e86SOder Chiou
22450e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_if1_adc1_mux =
22461b7fd76aSOder Chiou SOC_DAPM_ENUM("IF1 ADC1 Source", rt5677_if1_adc1_enum);
22470e826e86SOder Chiou
22480e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
22490e826e86SOder Chiou rt5677_if2_adc1_enum, RT5677_TDM2_CTRL2,
22500e826e86SOder Chiou RT5677_IF2_ADC1_SFT, rt5677_if12_adc1_src);
22510e826e86SOder Chiou
22520e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_if2_adc1_mux =
22531b7fd76aSOder Chiou SOC_DAPM_ENUM("IF2 ADC1 Source", rt5677_if2_adc1_enum);
22540e826e86SOder Chiou
22550e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
22560e826e86SOder Chiou rt5677_slb_adc1_enum, RT5677_SLIMBUS_RX,
22570e826e86SOder Chiou RT5677_SLB_ADC1_SFT, rt5677_if12_adc1_src);
22580e826e86SOder Chiou
22590e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_slb_adc1_mux =
22601b7fd76aSOder Chiou SOC_DAPM_ENUM("SLB ADC1 Source", rt5677_slb_adc1_enum);
22610e826e86SOder Chiou
22620e826e86SOder Chiou /* TDM IF1/2 SLB ADC2 Data Selection */ /* MX-3C MX-41 [7:6] MX-08 [3:2] */
22630e826e86SOder Chiou static const char * const rt5677_if12_adc2_src[] = {
22640e826e86SOder Chiou "STO2 ADC MIX", "OB23"
22650e826e86SOder Chiou };
22660e826e86SOder Chiou
22670e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
22680e826e86SOder Chiou rt5677_if1_adc2_enum, RT5677_TDM1_CTRL2,
22690e826e86SOder Chiou RT5677_IF1_ADC2_SFT, rt5677_if12_adc2_src);
22700e826e86SOder Chiou
22710e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_if1_adc2_mux =
22721b7fd76aSOder Chiou SOC_DAPM_ENUM("IF1 ADC2 Source", rt5677_if1_adc2_enum);
22730e826e86SOder Chiou
22740e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
22750e826e86SOder Chiou rt5677_if2_adc2_enum, RT5677_TDM2_CTRL2,
22760e826e86SOder Chiou RT5677_IF2_ADC2_SFT, rt5677_if12_adc2_src);
22770e826e86SOder Chiou
22780e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_if2_adc2_mux =
22791b7fd76aSOder Chiou SOC_DAPM_ENUM("IF2 ADC2 Source", rt5677_if2_adc2_enum);
22800e826e86SOder Chiou
22810e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
22820e826e86SOder Chiou rt5677_slb_adc2_enum, RT5677_SLIMBUS_RX,
22830e826e86SOder Chiou RT5677_SLB_ADC2_SFT, rt5677_if12_adc2_src);
22840e826e86SOder Chiou
22850e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_slb_adc2_mux =
22861b7fd76aSOder Chiou SOC_DAPM_ENUM("SLB ADC2 Source", rt5677_slb_adc2_enum);
22870e826e86SOder Chiou
22880e826e86SOder Chiou /* TDM IF1/2 SLB ADC3 Data Selection */ /* MX-3C MX-41 [9:8] MX-08 [5:4] */
22890e826e86SOder Chiou static const char * const rt5677_if12_adc3_src[] = {
22900e826e86SOder Chiou "STO3 ADC MIX", "MONO ADC MIX", "OB45"
22910e826e86SOder Chiou };
22920e826e86SOder Chiou
22930e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
22940e826e86SOder Chiou rt5677_if1_adc3_enum, RT5677_TDM1_CTRL2,
22950e826e86SOder Chiou RT5677_IF1_ADC3_SFT, rt5677_if12_adc3_src);
22960e826e86SOder Chiou
22970e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_if1_adc3_mux =
22981b7fd76aSOder Chiou SOC_DAPM_ENUM("IF1 ADC3 Source", rt5677_if1_adc3_enum);
22990e826e86SOder Chiou
23000e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
23010e826e86SOder Chiou rt5677_if2_adc3_enum, RT5677_TDM2_CTRL2,
23020e826e86SOder Chiou RT5677_IF2_ADC3_SFT, rt5677_if12_adc3_src);
23030e826e86SOder Chiou
23040e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_if2_adc3_mux =
23051b7fd76aSOder Chiou SOC_DAPM_ENUM("IF2 ADC3 Source", rt5677_if2_adc3_enum);
23060e826e86SOder Chiou
23070e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
23080e826e86SOder Chiou rt5677_slb_adc3_enum, RT5677_SLIMBUS_RX,
23090e826e86SOder Chiou RT5677_SLB_ADC3_SFT, rt5677_if12_adc3_src);
23100e826e86SOder Chiou
23110e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_slb_adc3_mux =
23121b7fd76aSOder Chiou SOC_DAPM_ENUM("SLB ADC3 Source", rt5677_slb_adc3_enum);
23130e826e86SOder Chiou
23140e826e86SOder Chiou /* TDM IF1/2 SLB ADC4 Data Selection */ /* MX-3C MX-41 [11:10] MX-08 [7:6] */
23150e826e86SOder Chiou static const char * const rt5677_if12_adc4_src[] = {
23160e826e86SOder Chiou "STO4 ADC MIX", "OB67", "OB01"
23170e826e86SOder Chiou };
23180e826e86SOder Chiou
23190e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
23200e826e86SOder Chiou rt5677_if1_adc4_enum, RT5677_TDM1_CTRL2,
23210e826e86SOder Chiou RT5677_IF1_ADC4_SFT, rt5677_if12_adc4_src);
23220e826e86SOder Chiou
23230e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_if1_adc4_mux =
23241b7fd76aSOder Chiou SOC_DAPM_ENUM("IF1 ADC4 Source", rt5677_if1_adc4_enum);
23250e826e86SOder Chiou
23260e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
23270e826e86SOder Chiou rt5677_if2_adc4_enum, RT5677_TDM2_CTRL2,
23280e826e86SOder Chiou RT5677_IF2_ADC4_SFT, rt5677_if12_adc4_src);
23290e826e86SOder Chiou
23300e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_if2_adc4_mux =
23311b7fd76aSOder Chiou SOC_DAPM_ENUM("IF2 ADC4 Source", rt5677_if2_adc4_enum);
23320e826e86SOder Chiou
23330e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
23340e826e86SOder Chiou rt5677_slb_adc4_enum, RT5677_SLIMBUS_RX,
23350e826e86SOder Chiou RT5677_SLB_ADC4_SFT, rt5677_if12_adc4_src);
23360e826e86SOder Chiou
23370e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_slb_adc4_mux =
23381b7fd76aSOder Chiou SOC_DAPM_ENUM("SLB ADC4 Source", rt5677_slb_adc4_enum);
23390e826e86SOder Chiou
23400e826e86SOder Chiou /* Interface3/4 ADC Data Input */ /* MX-2F [3:0] MX-30 [7:4] */
23410e826e86SOder Chiou static const char * const rt5677_if34_adc_src[] = {
23420e826e86SOder Chiou "STO1 ADC MIX", "STO2 ADC MIX", "STO3 ADC MIX", "STO4 ADC MIX",
23430e826e86SOder Chiou "MONO ADC MIX", "OB01", "OB23", "VAD ADC"
23440e826e86SOder Chiou };
23450e826e86SOder Chiou
23460e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
23470e826e86SOder Chiou rt5677_if3_adc_enum, RT5677_IF3_DATA,
23480e826e86SOder Chiou RT5677_IF3_ADC_IN_SFT, rt5677_if34_adc_src);
23490e826e86SOder Chiou
23500e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_if3_adc_mux =
23511b7fd76aSOder Chiou SOC_DAPM_ENUM("IF3 ADC Source", rt5677_if3_adc_enum);
23520e826e86SOder Chiou
23530e826e86SOder Chiou static SOC_ENUM_SINGLE_DECL(
23540e826e86SOder Chiou rt5677_if4_adc_enum, RT5677_IF4_DATA,
23550e826e86SOder Chiou RT5677_IF4_ADC_IN_SFT, rt5677_if34_adc_src);
23560e826e86SOder Chiou
23570e826e86SOder Chiou static const struct snd_kcontrol_new rt5677_if4_adc_mux =
23581b7fd76aSOder Chiou SOC_DAPM_ENUM("IF4 ADC Source", rt5677_if4_adc_enum);
23590e826e86SOder Chiou
2360e6f6ebc1SOder Chiou /* TDM IF1/2 ADC Data Selection */ /* MX-3B MX-40 [7:6][5:4][3:2][1:0] */
2361e6f6ebc1SOder Chiou static const char * const rt5677_if12_adc_swap_src[] = {
2362e6f6ebc1SOder Chiou "L/R", "R/L", "L/L", "R/R"
2363e6f6ebc1SOder Chiou };
2364e6f6ebc1SOder Chiou
2365e6f6ebc1SOder Chiou static SOC_ENUM_SINGLE_DECL(
2366e6f6ebc1SOder Chiou rt5677_if1_adc1_swap_enum, RT5677_TDM1_CTRL1,
2367e6f6ebc1SOder Chiou RT5677_IF1_ADC1_SWAP_SFT, rt5677_if12_adc_swap_src);
2368e6f6ebc1SOder Chiou
2369e6f6ebc1SOder Chiou static const struct snd_kcontrol_new rt5677_if1_adc1_swap_mux =
2370e6f6ebc1SOder Chiou SOC_DAPM_ENUM("IF1 ADC1 Swap Source", rt5677_if1_adc1_swap_enum);
2371e6f6ebc1SOder Chiou
2372e6f6ebc1SOder Chiou static SOC_ENUM_SINGLE_DECL(
2373e6f6ebc1SOder Chiou rt5677_if1_adc2_swap_enum, RT5677_TDM1_CTRL1,
2374e6f6ebc1SOder Chiou RT5677_IF1_ADC2_SWAP_SFT, rt5677_if12_adc_swap_src);
2375e6f6ebc1SOder Chiou
2376e6f6ebc1SOder Chiou static const struct snd_kcontrol_new rt5677_if1_adc2_swap_mux =
2377e6f6ebc1SOder Chiou SOC_DAPM_ENUM("IF1 ADC2 Swap Source", rt5677_if1_adc2_swap_enum);
2378e6f6ebc1SOder Chiou
2379e6f6ebc1SOder Chiou static SOC_ENUM_SINGLE_DECL(
2380e6f6ebc1SOder Chiou rt5677_if1_adc3_swap_enum, RT5677_TDM1_CTRL1,
2381e6f6ebc1SOder Chiou RT5677_IF1_ADC3_SWAP_SFT, rt5677_if12_adc_swap_src);
2382e6f6ebc1SOder Chiou
2383e6f6ebc1SOder Chiou static const struct snd_kcontrol_new rt5677_if1_adc3_swap_mux =
2384e6f6ebc1SOder Chiou SOC_DAPM_ENUM("IF1 ADC3 Swap Source", rt5677_if1_adc3_swap_enum);
2385e6f6ebc1SOder Chiou
2386e6f6ebc1SOder Chiou static SOC_ENUM_SINGLE_DECL(
2387e6f6ebc1SOder Chiou rt5677_if1_adc4_swap_enum, RT5677_TDM1_CTRL1,
2388e6f6ebc1SOder Chiou RT5677_IF1_ADC4_SWAP_SFT, rt5677_if12_adc_swap_src);
2389e6f6ebc1SOder Chiou
2390e6f6ebc1SOder Chiou static const struct snd_kcontrol_new rt5677_if1_adc4_swap_mux =
2391e6f6ebc1SOder Chiou SOC_DAPM_ENUM("IF1 ADC4 Swap Source", rt5677_if1_adc4_swap_enum);
2392e6f6ebc1SOder Chiou
2393e6f6ebc1SOder Chiou static SOC_ENUM_SINGLE_DECL(
2394e6f6ebc1SOder Chiou rt5677_if2_adc1_swap_enum, RT5677_TDM2_CTRL1,
2395e6f6ebc1SOder Chiou RT5677_IF1_ADC2_SWAP_SFT, rt5677_if12_adc_swap_src);
2396e6f6ebc1SOder Chiou
2397e6f6ebc1SOder Chiou static const struct snd_kcontrol_new rt5677_if2_adc1_swap_mux =
2398e6f6ebc1SOder Chiou SOC_DAPM_ENUM("IF1 ADC2 Swap Source", rt5677_if2_adc1_swap_enum);
2399e6f6ebc1SOder Chiou
2400e6f6ebc1SOder Chiou static SOC_ENUM_SINGLE_DECL(
2401e6f6ebc1SOder Chiou rt5677_if2_adc2_swap_enum, RT5677_TDM2_CTRL1,
2402e6f6ebc1SOder Chiou RT5677_IF2_ADC2_SWAP_SFT, rt5677_if12_adc_swap_src);
2403e6f6ebc1SOder Chiou
2404e6f6ebc1SOder Chiou static const struct snd_kcontrol_new rt5677_if2_adc2_swap_mux =
2405e6f6ebc1SOder Chiou SOC_DAPM_ENUM("IF2 ADC2 Swap Source", rt5677_if2_adc2_swap_enum);
2406e6f6ebc1SOder Chiou
2407e6f6ebc1SOder Chiou static SOC_ENUM_SINGLE_DECL(
2408e6f6ebc1SOder Chiou rt5677_if2_adc3_swap_enum, RT5677_TDM2_CTRL1,
2409e6f6ebc1SOder Chiou RT5677_IF2_ADC3_SWAP_SFT, rt5677_if12_adc_swap_src);
2410e6f6ebc1SOder Chiou
2411e6f6ebc1SOder Chiou static const struct snd_kcontrol_new rt5677_if2_adc3_swap_mux =
2412e6f6ebc1SOder Chiou SOC_DAPM_ENUM("IF2 ADC3 Swap Source", rt5677_if2_adc3_swap_enum);
2413e6f6ebc1SOder Chiou
2414e6f6ebc1SOder Chiou static SOC_ENUM_SINGLE_DECL(
2415e6f6ebc1SOder Chiou rt5677_if2_adc4_swap_enum, RT5677_TDM2_CTRL1,
2416e6f6ebc1SOder Chiou RT5677_IF2_ADC4_SWAP_SFT, rt5677_if12_adc_swap_src);
2417e6f6ebc1SOder Chiou
2418e6f6ebc1SOder Chiou static const struct snd_kcontrol_new rt5677_if2_adc4_swap_mux =
2419e6f6ebc1SOder Chiou SOC_DAPM_ENUM("IF2 ADC4 Swap Source", rt5677_if2_adc4_swap_enum);
2420e6f6ebc1SOder Chiou
2421e6f6ebc1SOder Chiou /* TDM IF1 ADC Data Selection */ /* MX-3C [2:0] */
2422e6f6ebc1SOder Chiou static const char * const rt5677_if1_adc_tdm_swap_src[] = {
2423e6f6ebc1SOder Chiou "1/2/3/4", "2/1/3/4", "2/3/1/4", "4/1/2/3", "1/3/2/4", "1/4/2/3",
2424e6f6ebc1SOder Chiou "3/1/2/4", "3/4/1/2"
2425e6f6ebc1SOder Chiou };
2426e6f6ebc1SOder Chiou
2427e6f6ebc1SOder Chiou static SOC_ENUM_SINGLE_DECL(
2428e6f6ebc1SOder Chiou rt5677_if1_adc_tdm_swap_enum, RT5677_TDM1_CTRL2,
2429e6f6ebc1SOder Chiou RT5677_IF1_ADC_CTRL_SFT, rt5677_if1_adc_tdm_swap_src);
2430e6f6ebc1SOder Chiou
2431e6f6ebc1SOder Chiou static const struct snd_kcontrol_new rt5677_if1_adc_tdm_swap_mux =
2432e6f6ebc1SOder Chiou SOC_DAPM_ENUM("IF1 ADC TDM Swap Source", rt5677_if1_adc_tdm_swap_enum);
2433e6f6ebc1SOder Chiou
2434e6f6ebc1SOder Chiou /* TDM IF2 ADC Data Selection */ /* MX-41[2:0] */
2435e6f6ebc1SOder Chiou static const char * const rt5677_if2_adc_tdm_swap_src[] = {
2436e6f6ebc1SOder Chiou "1/2/3/4", "2/1/3/4", "3/1/2/4", "4/1/2/3", "1/3/2/4", "1/4/2/3",
2437e6f6ebc1SOder Chiou "2/3/1/4", "3/4/1/2"
2438e6f6ebc1SOder Chiou };
2439e6f6ebc1SOder Chiou
2440e6f6ebc1SOder Chiou static SOC_ENUM_SINGLE_DECL(
2441e6f6ebc1SOder Chiou rt5677_if2_adc_tdm_swap_enum, RT5677_TDM2_CTRL2,
2442e6f6ebc1SOder Chiou RT5677_IF2_ADC_CTRL_SFT, rt5677_if2_adc_tdm_swap_src);
2443e6f6ebc1SOder Chiou
2444e6f6ebc1SOder Chiou static const struct snd_kcontrol_new rt5677_if2_adc_tdm_swap_mux =
2445e6f6ebc1SOder Chiou SOC_DAPM_ENUM("IF2 ADC TDM Swap Source", rt5677_if2_adc_tdm_swap_enum);
2446e6f6ebc1SOder Chiou
244791159ecaSOder Chiou /* TDM IF1/2 DAC Data Selection */ /* MX-3E[14:12][10:8][6:4][2:0]
244891159ecaSOder Chiou MX-3F[14:12][10:8][6:4][2:0]
244991159ecaSOder Chiou MX-43[14:12][10:8][6:4][2:0]
245091159ecaSOder Chiou MX-44[14:12][10:8][6:4][2:0] */
245191159ecaSOder Chiou static const char * const rt5677_if12_dac_tdm_sel_src[] = {
245291159ecaSOder Chiou "Slot0", "Slot1", "Slot2", "Slot3", "Slot4", "Slot5", "Slot6", "Slot7"
245391159ecaSOder Chiou };
245491159ecaSOder Chiou
245591159ecaSOder Chiou static SOC_ENUM_SINGLE_DECL(
245691159ecaSOder Chiou rt5677_if1_dac0_tdm_sel_enum, RT5677_TDM1_CTRL4,
245791159ecaSOder Chiou RT5677_IF1_DAC0_SFT, rt5677_if12_dac_tdm_sel_src);
245891159ecaSOder Chiou
245991159ecaSOder Chiou static const struct snd_kcontrol_new rt5677_if1_dac0_tdm_sel_mux =
246091159ecaSOder Chiou SOC_DAPM_ENUM("IF1 DAC0 TDM Source", rt5677_if1_dac0_tdm_sel_enum);
246191159ecaSOder Chiou
246291159ecaSOder Chiou static SOC_ENUM_SINGLE_DECL(
246391159ecaSOder Chiou rt5677_if1_dac1_tdm_sel_enum, RT5677_TDM1_CTRL4,
246491159ecaSOder Chiou RT5677_IF1_DAC1_SFT, rt5677_if12_dac_tdm_sel_src);
246591159ecaSOder Chiou
246691159ecaSOder Chiou static const struct snd_kcontrol_new rt5677_if1_dac1_tdm_sel_mux =
246791159ecaSOder Chiou SOC_DAPM_ENUM("IF1 DAC1 TDM Source", rt5677_if1_dac1_tdm_sel_enum);
246891159ecaSOder Chiou
246991159ecaSOder Chiou static SOC_ENUM_SINGLE_DECL(
247091159ecaSOder Chiou rt5677_if1_dac2_tdm_sel_enum, RT5677_TDM1_CTRL4,
247191159ecaSOder Chiou RT5677_IF1_DAC2_SFT, rt5677_if12_dac_tdm_sel_src);
247291159ecaSOder Chiou
247391159ecaSOder Chiou static const struct snd_kcontrol_new rt5677_if1_dac2_tdm_sel_mux =
247491159ecaSOder Chiou SOC_DAPM_ENUM("IF1 DAC2 TDM Source", rt5677_if1_dac2_tdm_sel_enum);
247591159ecaSOder Chiou
247691159ecaSOder Chiou static SOC_ENUM_SINGLE_DECL(
247791159ecaSOder Chiou rt5677_if1_dac3_tdm_sel_enum, RT5677_TDM1_CTRL4,
247891159ecaSOder Chiou RT5677_IF1_DAC3_SFT, rt5677_if12_dac_tdm_sel_src);
247991159ecaSOder Chiou
248091159ecaSOder Chiou static const struct snd_kcontrol_new rt5677_if1_dac3_tdm_sel_mux =
248191159ecaSOder Chiou SOC_DAPM_ENUM("IF1 DAC3 TDM Source", rt5677_if1_dac3_tdm_sel_enum);
248291159ecaSOder Chiou
248391159ecaSOder Chiou static SOC_ENUM_SINGLE_DECL(
248491159ecaSOder Chiou rt5677_if1_dac4_tdm_sel_enum, RT5677_TDM1_CTRL5,
248591159ecaSOder Chiou RT5677_IF1_DAC4_SFT, rt5677_if12_dac_tdm_sel_src);
248691159ecaSOder Chiou
248791159ecaSOder Chiou static const struct snd_kcontrol_new rt5677_if1_dac4_tdm_sel_mux =
248891159ecaSOder Chiou SOC_DAPM_ENUM("IF1 DAC4 TDM Source", rt5677_if1_dac4_tdm_sel_enum);
248991159ecaSOder Chiou
249091159ecaSOder Chiou static SOC_ENUM_SINGLE_DECL(
249191159ecaSOder Chiou rt5677_if1_dac5_tdm_sel_enum, RT5677_TDM1_CTRL5,
249291159ecaSOder Chiou RT5677_IF1_DAC5_SFT, rt5677_if12_dac_tdm_sel_src);
249391159ecaSOder Chiou
249491159ecaSOder Chiou static const struct snd_kcontrol_new rt5677_if1_dac5_tdm_sel_mux =
249591159ecaSOder Chiou SOC_DAPM_ENUM("IF1 DAC5 TDM Source", rt5677_if1_dac5_tdm_sel_enum);
249691159ecaSOder Chiou
249791159ecaSOder Chiou static SOC_ENUM_SINGLE_DECL(
249891159ecaSOder Chiou rt5677_if1_dac6_tdm_sel_enum, RT5677_TDM1_CTRL5,
249991159ecaSOder Chiou RT5677_IF1_DAC6_SFT, rt5677_if12_dac_tdm_sel_src);
250091159ecaSOder Chiou
250191159ecaSOder Chiou static const struct snd_kcontrol_new rt5677_if1_dac6_tdm_sel_mux =
250291159ecaSOder Chiou SOC_DAPM_ENUM("IF1 DAC6 TDM Source", rt5677_if1_dac6_tdm_sel_enum);
250391159ecaSOder Chiou
250491159ecaSOder Chiou static SOC_ENUM_SINGLE_DECL(
250591159ecaSOder Chiou rt5677_if1_dac7_tdm_sel_enum, RT5677_TDM1_CTRL5,
250691159ecaSOder Chiou RT5677_IF1_DAC7_SFT, rt5677_if12_dac_tdm_sel_src);
250791159ecaSOder Chiou
250891159ecaSOder Chiou static const struct snd_kcontrol_new rt5677_if1_dac7_tdm_sel_mux =
250991159ecaSOder Chiou SOC_DAPM_ENUM("IF1 DAC7 TDM Source", rt5677_if1_dac7_tdm_sel_enum);
251091159ecaSOder Chiou
251191159ecaSOder Chiou static SOC_ENUM_SINGLE_DECL(
251291159ecaSOder Chiou rt5677_if2_dac0_tdm_sel_enum, RT5677_TDM2_CTRL4,
251391159ecaSOder Chiou RT5677_IF2_DAC0_SFT, rt5677_if12_dac_tdm_sel_src);
251491159ecaSOder Chiou
251591159ecaSOder Chiou static const struct snd_kcontrol_new rt5677_if2_dac0_tdm_sel_mux =
251691159ecaSOder Chiou SOC_DAPM_ENUM("IF2 DAC0 TDM Source", rt5677_if2_dac0_tdm_sel_enum);
251791159ecaSOder Chiou
251891159ecaSOder Chiou static SOC_ENUM_SINGLE_DECL(
251991159ecaSOder Chiou rt5677_if2_dac1_tdm_sel_enum, RT5677_TDM2_CTRL4,
252091159ecaSOder Chiou RT5677_IF2_DAC1_SFT, rt5677_if12_dac_tdm_sel_src);
252191159ecaSOder Chiou
252291159ecaSOder Chiou static const struct snd_kcontrol_new rt5677_if2_dac1_tdm_sel_mux =
252391159ecaSOder Chiou SOC_DAPM_ENUM("IF2 DAC1 TDM Source", rt5677_if2_dac1_tdm_sel_enum);
252491159ecaSOder Chiou
252591159ecaSOder Chiou static SOC_ENUM_SINGLE_DECL(
252691159ecaSOder Chiou rt5677_if2_dac2_tdm_sel_enum, RT5677_TDM2_CTRL4,
252791159ecaSOder Chiou RT5677_IF2_DAC2_SFT, rt5677_if12_dac_tdm_sel_src);
252891159ecaSOder Chiou
252991159ecaSOder Chiou static const struct snd_kcontrol_new rt5677_if2_dac2_tdm_sel_mux =
253091159ecaSOder Chiou SOC_DAPM_ENUM("IF2 DAC2 TDM Source", rt5677_if2_dac2_tdm_sel_enum);
253191159ecaSOder Chiou
253291159ecaSOder Chiou static SOC_ENUM_SINGLE_DECL(
253391159ecaSOder Chiou rt5677_if2_dac3_tdm_sel_enum, RT5677_TDM2_CTRL4,
253491159ecaSOder Chiou RT5677_IF2_DAC3_SFT, rt5677_if12_dac_tdm_sel_src);
253591159ecaSOder Chiou
253691159ecaSOder Chiou static const struct snd_kcontrol_new rt5677_if2_dac3_tdm_sel_mux =
253791159ecaSOder Chiou SOC_DAPM_ENUM("IF2 DAC3 TDM Source", rt5677_if2_dac3_tdm_sel_enum);
253891159ecaSOder Chiou
253991159ecaSOder Chiou static SOC_ENUM_SINGLE_DECL(
254091159ecaSOder Chiou rt5677_if2_dac4_tdm_sel_enum, RT5677_TDM2_CTRL5,
254191159ecaSOder Chiou RT5677_IF2_DAC4_SFT, rt5677_if12_dac_tdm_sel_src);
254291159ecaSOder Chiou
254391159ecaSOder Chiou static const struct snd_kcontrol_new rt5677_if2_dac4_tdm_sel_mux =
254491159ecaSOder Chiou SOC_DAPM_ENUM("IF2 DAC4 TDM Source", rt5677_if2_dac4_tdm_sel_enum);
254591159ecaSOder Chiou
254691159ecaSOder Chiou static SOC_ENUM_SINGLE_DECL(
254791159ecaSOder Chiou rt5677_if2_dac5_tdm_sel_enum, RT5677_TDM2_CTRL5,
254891159ecaSOder Chiou RT5677_IF2_DAC5_SFT, rt5677_if12_dac_tdm_sel_src);
254991159ecaSOder Chiou
255091159ecaSOder Chiou static const struct snd_kcontrol_new rt5677_if2_dac5_tdm_sel_mux =
255191159ecaSOder Chiou SOC_DAPM_ENUM("IF2 DAC5 TDM Source", rt5677_if2_dac5_tdm_sel_enum);
255291159ecaSOder Chiou
255391159ecaSOder Chiou static SOC_ENUM_SINGLE_DECL(
255491159ecaSOder Chiou rt5677_if2_dac6_tdm_sel_enum, RT5677_TDM2_CTRL5,
255591159ecaSOder Chiou RT5677_IF2_DAC6_SFT, rt5677_if12_dac_tdm_sel_src);
255691159ecaSOder Chiou
255791159ecaSOder Chiou static const struct snd_kcontrol_new rt5677_if2_dac6_tdm_sel_mux =
255891159ecaSOder Chiou SOC_DAPM_ENUM("IF2 DAC6 TDM Source", rt5677_if2_dac6_tdm_sel_enum);
255991159ecaSOder Chiou
256091159ecaSOder Chiou static SOC_ENUM_SINGLE_DECL(
256191159ecaSOder Chiou rt5677_if2_dac7_tdm_sel_enum, RT5677_TDM2_CTRL5,
256291159ecaSOder Chiou RT5677_IF2_DAC7_SFT, rt5677_if12_dac_tdm_sel_src);
256391159ecaSOder Chiou
256491159ecaSOder Chiou static const struct snd_kcontrol_new rt5677_if2_dac7_tdm_sel_mux =
256591159ecaSOder Chiou SOC_DAPM_ENUM("IF2 DAC7 TDM Source", rt5677_if2_dac7_tdm_sel_enum);
256691159ecaSOder Chiou
rt5677_bst1_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)25670e826e86SOder Chiou static int rt5677_bst1_event(struct snd_soc_dapm_widget *w,
25680e826e86SOder Chiou struct snd_kcontrol *kcontrol, int event)
25690e826e86SOder Chiou {
257079223bf1SKuninori Morimoto struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
257179223bf1SKuninori Morimoto struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
25720e826e86SOder Chiou
25730e826e86SOder Chiou switch (event) {
25740e826e86SOder Chiou case SND_SOC_DAPM_POST_PMU:
25750e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,
25760e826e86SOder Chiou RT5677_PWR_BST1_P, RT5677_PWR_BST1_P);
25770e826e86SOder Chiou break;
25780e826e86SOder Chiou
25790e826e86SOder Chiou case SND_SOC_DAPM_PRE_PMD:
25800e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,
25810e826e86SOder Chiou RT5677_PWR_BST1_P, 0);
25820e826e86SOder Chiou break;
25830e826e86SOder Chiou
25840e826e86SOder Chiou default:
25850e826e86SOder Chiou return 0;
25860e826e86SOder Chiou }
25870e826e86SOder Chiou
25880e826e86SOder Chiou return 0;
25890e826e86SOder Chiou }
25900e826e86SOder Chiou
rt5677_bst2_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)25910e826e86SOder Chiou static int rt5677_bst2_event(struct snd_soc_dapm_widget *w,
25920e826e86SOder Chiou struct snd_kcontrol *kcontrol, int event)
25930e826e86SOder Chiou {
259479223bf1SKuninori Morimoto struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
259579223bf1SKuninori Morimoto struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
25960e826e86SOder Chiou
25970e826e86SOder Chiou switch (event) {
25980e826e86SOder Chiou case SND_SOC_DAPM_POST_PMU:
25990e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,
26000e826e86SOder Chiou RT5677_PWR_BST2_P, RT5677_PWR_BST2_P);
26010e826e86SOder Chiou break;
26020e826e86SOder Chiou
26030e826e86SOder Chiou case SND_SOC_DAPM_PRE_PMD:
26040e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,
26050e826e86SOder Chiou RT5677_PWR_BST2_P, 0);
26060e826e86SOder Chiou break;
26070e826e86SOder Chiou
26080e826e86SOder Chiou default:
26090e826e86SOder Chiou return 0;
26100e826e86SOder Chiou }
26110e826e86SOder Chiou
26120e826e86SOder Chiou return 0;
26130e826e86SOder Chiou }
26140e826e86SOder Chiou
rt5677_set_pll1_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)26150e826e86SOder Chiou static int rt5677_set_pll1_event(struct snd_soc_dapm_widget *w,
26160e826e86SOder Chiou struct snd_kcontrol *kcontrol, int event)
26170e826e86SOder Chiou {
261879223bf1SKuninori Morimoto struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
261979223bf1SKuninori Morimoto struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
26200e826e86SOder Chiou
26210e826e86SOder Chiou switch (event) {
2622bdfbf255SOder Chiou case SND_SOC_DAPM_PRE_PMU:
26230e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_PLL1_CTRL2, 0x2, 0x2);
2624bdfbf255SOder Chiou break;
2625bdfbf255SOder Chiou
2626bdfbf255SOder Chiou case SND_SOC_DAPM_POST_PMU:
26270e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_PLL1_CTRL2, 0x2, 0x0);
26280e826e86SOder Chiou break;
2629bdfbf255SOder Chiou
26300e826e86SOder Chiou default:
26310e826e86SOder Chiou return 0;
26320e826e86SOder Chiou }
26330e826e86SOder Chiou
26340e826e86SOder Chiou return 0;
26350e826e86SOder Chiou }
26360e826e86SOder Chiou
rt5677_set_pll2_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)26370e826e86SOder Chiou static int rt5677_set_pll2_event(struct snd_soc_dapm_widget *w,
26380e826e86SOder Chiou struct snd_kcontrol *kcontrol, int event)
26390e826e86SOder Chiou {
264079223bf1SKuninori Morimoto struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
264179223bf1SKuninori Morimoto struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
26420e826e86SOder Chiou
26430e826e86SOder Chiou switch (event) {
2644bdfbf255SOder Chiou case SND_SOC_DAPM_PRE_PMU:
26450e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_PLL2_CTRL2, 0x2, 0x2);
2646bdfbf255SOder Chiou break;
2647bdfbf255SOder Chiou
2648bdfbf255SOder Chiou case SND_SOC_DAPM_POST_PMU:
26490e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_PLL2_CTRL2, 0x2, 0x0);
26500e826e86SOder Chiou break;
2651bdfbf255SOder Chiou
26520e826e86SOder Chiou default:
26530e826e86SOder Chiou return 0;
26540e826e86SOder Chiou }
26550e826e86SOder Chiou
26560e826e86SOder Chiou return 0;
26570e826e86SOder Chiou }
26580e826e86SOder Chiou
rt5677_set_micbias1_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)26590e826e86SOder Chiou static int rt5677_set_micbias1_event(struct snd_soc_dapm_widget *w,
26600e826e86SOder Chiou struct snd_kcontrol *kcontrol, int event)
26610e826e86SOder Chiou {
266279223bf1SKuninori Morimoto struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
266379223bf1SKuninori Morimoto struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
26640e826e86SOder Chiou
26650e826e86SOder Chiou switch (event) {
26660e826e86SOder Chiou case SND_SOC_DAPM_POST_PMU:
26670e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,
26680e826e86SOder Chiou RT5677_PWR_CLK_MB1 | RT5677_PWR_PP_MB1 |
26690e826e86SOder Chiou RT5677_PWR_CLK_MB, RT5677_PWR_CLK_MB1 |
26700e826e86SOder Chiou RT5677_PWR_PP_MB1 | RT5677_PWR_CLK_MB);
26710e826e86SOder Chiou break;
2672f58c3b91SOder Chiou
2673f58c3b91SOder Chiou case SND_SOC_DAPM_PRE_PMD:
2674f58c3b91SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,
2675f58c3b91SOder Chiou RT5677_PWR_CLK_MB1 | RT5677_PWR_PP_MB1 |
2676f58c3b91SOder Chiou RT5677_PWR_CLK_MB, 0);
2677f58c3b91SOder Chiou break;
2678f58c3b91SOder Chiou
26790e826e86SOder Chiou default:
26800e826e86SOder Chiou return 0;
26810e826e86SOder Chiou }
26820e826e86SOder Chiou
26830e826e86SOder Chiou return 0;
26840e826e86SOder Chiou }
26850e826e86SOder Chiou
rt5677_if1_adc_tdm_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)2686e6f6ebc1SOder Chiou static int rt5677_if1_adc_tdm_event(struct snd_soc_dapm_widget *w,
2687e6f6ebc1SOder Chiou struct snd_kcontrol *kcontrol, int event)
2688e6f6ebc1SOder Chiou {
268979223bf1SKuninori Morimoto struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
269079223bf1SKuninori Morimoto struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
2691e6f6ebc1SOder Chiou unsigned int value;
2692e6f6ebc1SOder Chiou
2693e6f6ebc1SOder Chiou switch (event) {
2694e6f6ebc1SOder Chiou case SND_SOC_DAPM_PRE_PMU:
2695e6f6ebc1SOder Chiou regmap_read(rt5677->regmap, RT5677_TDM1_CTRL2, &value);
2696e6f6ebc1SOder Chiou if (value & RT5677_IF1_ADC_CTRL_MASK)
2697e6f6ebc1SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_TDM1_CTRL1,
2698e6f6ebc1SOder Chiou RT5677_IF1_ADC_MODE_MASK,
2699e6f6ebc1SOder Chiou RT5677_IF1_ADC_MODE_TDM);
2700e6f6ebc1SOder Chiou break;
2701e6f6ebc1SOder Chiou
2702e6f6ebc1SOder Chiou default:
2703e6f6ebc1SOder Chiou return 0;
2704e6f6ebc1SOder Chiou }
2705e6f6ebc1SOder Chiou
2706e6f6ebc1SOder Chiou return 0;
2707e6f6ebc1SOder Chiou }
2708e6f6ebc1SOder Chiou
rt5677_if2_adc_tdm_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)2709e6f6ebc1SOder Chiou static int rt5677_if2_adc_tdm_event(struct snd_soc_dapm_widget *w,
2710e6f6ebc1SOder Chiou struct snd_kcontrol *kcontrol, int event)
2711e6f6ebc1SOder Chiou {
271279223bf1SKuninori Morimoto struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
271379223bf1SKuninori Morimoto struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
2714e6f6ebc1SOder Chiou unsigned int value;
2715e6f6ebc1SOder Chiou
2716e6f6ebc1SOder Chiou switch (event) {
2717e6f6ebc1SOder Chiou case SND_SOC_DAPM_PRE_PMU:
2718e6f6ebc1SOder Chiou regmap_read(rt5677->regmap, RT5677_TDM2_CTRL2, &value);
2719e6f6ebc1SOder Chiou if (value & RT5677_IF2_ADC_CTRL_MASK)
2720e6f6ebc1SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_TDM2_CTRL1,
2721e6f6ebc1SOder Chiou RT5677_IF2_ADC_MODE_MASK,
2722e6f6ebc1SOder Chiou RT5677_IF2_ADC_MODE_TDM);
2723e6f6ebc1SOder Chiou break;
2724e6f6ebc1SOder Chiou
2725e6f6ebc1SOder Chiou default:
2726e6f6ebc1SOder Chiou return 0;
2727e6f6ebc1SOder Chiou }
2728e6f6ebc1SOder Chiou
2729e6f6ebc1SOder Chiou return 0;
2730e6f6ebc1SOder Chiou }
2731e6f6ebc1SOder Chiou
rt5677_vref_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)2732683996cbSOder Chiou static int rt5677_vref_event(struct snd_soc_dapm_widget *w,
2733683996cbSOder Chiou struct snd_kcontrol *kcontrol, int event)
2734683996cbSOder Chiou {
273579223bf1SKuninori Morimoto struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
273679223bf1SKuninori Morimoto struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
2737683996cbSOder Chiou
2738683996cbSOder Chiou switch (event) {
2739683996cbSOder Chiou case SND_SOC_DAPM_POST_PMU:
274079223bf1SKuninori Morimoto if (snd_soc_component_get_bias_level(component) != SND_SOC_BIAS_ON &&
2741683996cbSOder Chiou !rt5677->is_vref_slow) {
2742683996cbSOder Chiou mdelay(20);
2743683996cbSOder Chiou regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG1,
2744683996cbSOder Chiou RT5677_PWR_FV1 | RT5677_PWR_FV2,
2745683996cbSOder Chiou RT5677_PWR_FV1 | RT5677_PWR_FV2);
2746683996cbSOder Chiou rt5677->is_vref_slow = true;
2747683996cbSOder Chiou }
2748683996cbSOder Chiou break;
2749683996cbSOder Chiou
2750683996cbSOder Chiou default:
2751683996cbSOder Chiou return 0;
2752683996cbSOder Chiou }
2753683996cbSOder Chiou
2754683996cbSOder Chiou return 0;
2755683996cbSOder Chiou }
2756683996cbSOder Chiou
rt5677_filter_power_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)2757c22d7666SOder Chiou static int rt5677_filter_power_event(struct snd_soc_dapm_widget *w,
2758c22d7666SOder Chiou struct snd_kcontrol *kcontrol, int event)
2759c22d7666SOder Chiou {
2760c22d7666SOder Chiou switch (event) {
2761c22d7666SOder Chiou case SND_SOC_DAPM_POST_PMU:
2762c22d7666SOder Chiou msleep(50);
2763c22d7666SOder Chiou break;
2764c22d7666SOder Chiou
2765c22d7666SOder Chiou default:
2766c22d7666SOder Chiou return 0;
2767c22d7666SOder Chiou }
2768c22d7666SOder Chiou
2769c22d7666SOder Chiou return 0;
2770c22d7666SOder Chiou }
2771c22d7666SOder Chiou
27720e826e86SOder Chiou static const struct snd_soc_dapm_widget rt5677_dapm_widgets[] = {
27730e826e86SOder Chiou SND_SOC_DAPM_SUPPLY("PLL1", RT5677_PWR_ANLG2, RT5677_PWR_PLL1_BIT,
2774bdfbf255SOder Chiou 0, rt5677_set_pll1_event, SND_SOC_DAPM_PRE_PMU |
2775bdfbf255SOder Chiou SND_SOC_DAPM_POST_PMU),
27760e826e86SOder Chiou SND_SOC_DAPM_SUPPLY("PLL2", RT5677_PWR_ANLG2, RT5677_PWR_PLL2_BIT,
2777bdfbf255SOder Chiou 0, rt5677_set_pll2_event, SND_SOC_DAPM_PRE_PMU |
2778bdfbf255SOder Chiou SND_SOC_DAPM_POST_PMU),
27790e826e86SOder Chiou
27805a8c7c26SOder Chiou /* ASRC */
27815a8c7c26SOder Chiou SND_SOC_DAPM_SUPPLY_S("I2S1 ASRC", 1, RT5677_ASRC_1, 0, 0, NULL, 0),
27825a8c7c26SOder Chiou SND_SOC_DAPM_SUPPLY_S("I2S2 ASRC", 1, RT5677_ASRC_1, 1, 0, NULL, 0),
27835a8c7c26SOder Chiou SND_SOC_DAPM_SUPPLY_S("I2S3 ASRC", 1, RT5677_ASRC_1, 2, 0, NULL, 0),
27845a8c7c26SOder Chiou SND_SOC_DAPM_SUPPLY_S("I2S4 ASRC", 1, RT5677_ASRC_1, 3, 0, NULL, 0),
278524043d60SCurtis Malainey SND_SOC_DAPM_SUPPLY_S("DAC STO ASRC", 1, RT5677_ASRC_2, 14, 0,
278624043d60SCurtis Malainey rt5677_filter_power_event, SND_SOC_DAPM_POST_PMU),
27875a8c7c26SOder Chiou SND_SOC_DAPM_SUPPLY_S("DAC MONO2 L ASRC", 1, RT5677_ASRC_2, 13, 0, NULL,
27885a8c7c26SOder Chiou 0),
27895a8c7c26SOder Chiou SND_SOC_DAPM_SUPPLY_S("DAC MONO2 R ASRC", 1, RT5677_ASRC_2, 12, 0, NULL,
27905a8c7c26SOder Chiou 0),
27915a8c7c26SOder Chiou SND_SOC_DAPM_SUPPLY_S("DAC MONO3 L ASRC", 1, RT5677_ASRC_1, 15, 0, NULL,
27925a8c7c26SOder Chiou 0),
27935a8c7c26SOder Chiou SND_SOC_DAPM_SUPPLY_S("DAC MONO3 R ASRC", 1, RT5677_ASRC_1, 14, 0, NULL,
27945a8c7c26SOder Chiou 0),
27955a8c7c26SOder Chiou SND_SOC_DAPM_SUPPLY_S("DAC MONO4 L ASRC", 1, RT5677_ASRC_1, 13, 0, NULL,
27965a8c7c26SOder Chiou 0),
27975a8c7c26SOder Chiou SND_SOC_DAPM_SUPPLY_S("DAC MONO4 R ASRC", 1, RT5677_ASRC_1, 12, 0, NULL,
27985a8c7c26SOder Chiou 0),
27995a8c7c26SOder Chiou SND_SOC_DAPM_SUPPLY_S("DMIC STO1 ASRC", 1, RT5677_ASRC_2, 11, 0, NULL,
28005a8c7c26SOder Chiou 0),
28015a8c7c26SOder Chiou SND_SOC_DAPM_SUPPLY_S("DMIC STO2 ASRC", 1, RT5677_ASRC_2, 10, 0, NULL,
28025a8c7c26SOder Chiou 0),
28035a8c7c26SOder Chiou SND_SOC_DAPM_SUPPLY_S("DMIC STO3 ASRC", 1, RT5677_ASRC_2, 9, 0, NULL,
28045a8c7c26SOder Chiou 0),
28055a8c7c26SOder Chiou SND_SOC_DAPM_SUPPLY_S("DMIC STO4 ASRC", 1, RT5677_ASRC_2, 8, 0, NULL,
28065a8c7c26SOder Chiou 0),
28075a8c7c26SOder Chiou SND_SOC_DAPM_SUPPLY_S("DMIC MONO L ASRC", 1, RT5677_ASRC_2, 7, 0, NULL,
28085a8c7c26SOder Chiou 0),
28095a8c7c26SOder Chiou SND_SOC_DAPM_SUPPLY_S("DMIC MONO R ASRC", 1, RT5677_ASRC_2, 6, 0, NULL,
28105a8c7c26SOder Chiou 0),
28115a8c7c26SOder Chiou SND_SOC_DAPM_SUPPLY_S("ADC STO1 ASRC", 1, RT5677_ASRC_2, 5, 0, NULL, 0),
28125a8c7c26SOder Chiou SND_SOC_DAPM_SUPPLY_S("ADC STO2 ASRC", 1, RT5677_ASRC_2, 4, 0, NULL, 0),
28135a8c7c26SOder Chiou SND_SOC_DAPM_SUPPLY_S("ADC STO3 ASRC", 1, RT5677_ASRC_2, 3, 0, NULL, 0),
28145a8c7c26SOder Chiou SND_SOC_DAPM_SUPPLY_S("ADC STO4 ASRC", 1, RT5677_ASRC_2, 2, 0, NULL, 0),
28155a8c7c26SOder Chiou SND_SOC_DAPM_SUPPLY_S("ADC MONO L ASRC", 1, RT5677_ASRC_2, 1, 0, NULL,
28165a8c7c26SOder Chiou 0),
28175a8c7c26SOder Chiou SND_SOC_DAPM_SUPPLY_S("ADC MONO R ASRC", 1, RT5677_ASRC_2, 0, 0, NULL,
28185a8c7c26SOder Chiou 0),
28195a8c7c26SOder Chiou
28200e826e86SOder Chiou /* Input Side */
28210e826e86SOder Chiou /* micbias */
28223d0c03d9SOder Chiou SND_SOC_DAPM_SUPPLY("MICBIAS1", RT5677_PWR_ANLG2, RT5677_PWR_MB1_BIT,
2823f58c3b91SOder Chiou 0, rt5677_set_micbias1_event, SND_SOC_DAPM_PRE_PMD |
2824f58c3b91SOder Chiou SND_SOC_DAPM_POST_PMU),
28250e826e86SOder Chiou
28260e826e86SOder Chiou /* Input Lines */
28270e826e86SOder Chiou SND_SOC_DAPM_INPUT("DMIC L1"),
28280e826e86SOder Chiou SND_SOC_DAPM_INPUT("DMIC R1"),
28290e826e86SOder Chiou SND_SOC_DAPM_INPUT("DMIC L2"),
28300e826e86SOder Chiou SND_SOC_DAPM_INPUT("DMIC R2"),
28310e826e86SOder Chiou SND_SOC_DAPM_INPUT("DMIC L3"),
28320e826e86SOder Chiou SND_SOC_DAPM_INPUT("DMIC R3"),
28330e826e86SOder Chiou SND_SOC_DAPM_INPUT("DMIC L4"),
28340e826e86SOder Chiou SND_SOC_DAPM_INPUT("DMIC R4"),
28350e826e86SOder Chiou
28360e826e86SOder Chiou SND_SOC_DAPM_INPUT("IN1P"),
28370e826e86SOder Chiou SND_SOC_DAPM_INPUT("IN1N"),
28380e826e86SOder Chiou SND_SOC_DAPM_INPUT("IN2P"),
28390e826e86SOder Chiou SND_SOC_DAPM_INPUT("IN2N"),
28400e826e86SOder Chiou
28410e826e86SOder Chiou SND_SOC_DAPM_INPUT("Haptic Generator"),
28420e826e86SOder Chiou
28432d15d974SBard Liao SND_SOC_DAPM_PGA("DMIC1", SND_SOC_NOPM, 0, 0, NULL, 0),
28442d15d974SBard Liao SND_SOC_DAPM_PGA("DMIC2", SND_SOC_NOPM, 0, 0, NULL, 0),
28452d15d974SBard Liao SND_SOC_DAPM_PGA("DMIC3", SND_SOC_NOPM, 0, 0, NULL, 0),
28462d15d974SBard Liao SND_SOC_DAPM_PGA("DMIC4", SND_SOC_NOPM, 0, 0, NULL, 0),
28472d15d974SBard Liao
28482d15d974SBard Liao SND_SOC_DAPM_SUPPLY("DMIC1 power", RT5677_DMIC_CTRL1,
28492d15d974SBard Liao RT5677_DMIC_1_EN_SFT, 0, NULL, 0),
28502d15d974SBard Liao SND_SOC_DAPM_SUPPLY("DMIC2 power", RT5677_DMIC_CTRL1,
28512d15d974SBard Liao RT5677_DMIC_2_EN_SFT, 0, NULL, 0),
28522d15d974SBard Liao SND_SOC_DAPM_SUPPLY("DMIC3 power", RT5677_DMIC_CTRL1,
28532d15d974SBard Liao RT5677_DMIC_3_EN_SFT, 0, NULL, 0),
28542d15d974SBard Liao SND_SOC_DAPM_SUPPLY("DMIC4 power", RT5677_DMIC_CTRL2,
28552d15d974SBard Liao RT5677_DMIC_4_EN_SFT, 0, NULL, 0),
28560e826e86SOder Chiou
28570e826e86SOder Chiou SND_SOC_DAPM_SUPPLY("DMIC CLK", SND_SOC_NOPM, 0, 0,
28580e826e86SOder Chiou set_dmic_clk, SND_SOC_DAPM_PRE_PMU),
28590e826e86SOder Chiou
28600e826e86SOder Chiou /* Boost */
28610e826e86SOder Chiou SND_SOC_DAPM_PGA_E("BST1", RT5677_PWR_ANLG2,
28620e826e86SOder Chiou RT5677_PWR_BST1_BIT, 0, NULL, 0, rt5677_bst1_event,
28630e826e86SOder Chiou SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
28640e826e86SOder Chiou SND_SOC_DAPM_PGA_E("BST2", RT5677_PWR_ANLG2,
28650e826e86SOder Chiou RT5677_PWR_BST2_BIT, 0, NULL, 0, rt5677_bst2_event,
28660e826e86SOder Chiou SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
28670e826e86SOder Chiou
28680e826e86SOder Chiou /* ADCs */
28690e826e86SOder Chiou SND_SOC_DAPM_ADC("ADC 1", NULL, SND_SOC_NOPM,
28700e826e86SOder Chiou 0, 0),
28710e826e86SOder Chiou SND_SOC_DAPM_ADC("ADC 2", NULL, SND_SOC_NOPM,
28720e826e86SOder Chiou 0, 0),
28730e826e86SOder Chiou SND_SOC_DAPM_PGA("ADC 1_2", SND_SOC_NOPM, 0, 0, NULL, 0),
28740e826e86SOder Chiou
28750e826e86SOder Chiou SND_SOC_DAPM_SUPPLY("ADC 1 power", RT5677_PWR_DIG1,
28760e826e86SOder Chiou RT5677_PWR_ADC_L_BIT, 0, NULL, 0),
28770e826e86SOder Chiou SND_SOC_DAPM_SUPPLY("ADC 2 power", RT5677_PWR_DIG1,
28780e826e86SOder Chiou RT5677_PWR_ADC_R_BIT, 0, NULL, 0),
28790e826e86SOder Chiou SND_SOC_DAPM_SUPPLY("ADC1 clock", RT5677_PWR_DIG1,
28800e826e86SOder Chiou RT5677_PWR_ADCFED1_BIT, 0, NULL, 0),
28810e826e86SOder Chiou SND_SOC_DAPM_SUPPLY("ADC2 clock", RT5677_PWR_DIG1,
28820e826e86SOder Chiou RT5677_PWR_ADCFED2_BIT, 0, NULL, 0),
28830e826e86SOder Chiou
28840e826e86SOder Chiou /* ADC Mux */
28850e826e86SOder Chiou SND_SOC_DAPM_MUX("Stereo1 DMIC Mux", SND_SOC_NOPM, 0, 0,
28860e826e86SOder Chiou &rt5677_sto1_dmic_mux),
28870e826e86SOder Chiou SND_SOC_DAPM_MUX("Stereo1 ADC1 Mux", SND_SOC_NOPM, 0, 0,
28880e826e86SOder Chiou &rt5677_sto1_adc1_mux),
28890e826e86SOder Chiou SND_SOC_DAPM_MUX("Stereo1 ADC2 Mux", SND_SOC_NOPM, 0, 0,
28900e826e86SOder Chiou &rt5677_sto1_adc2_mux),
28910e826e86SOder Chiou SND_SOC_DAPM_MUX("Stereo2 DMIC Mux", SND_SOC_NOPM, 0, 0,
28920e826e86SOder Chiou &rt5677_sto2_dmic_mux),
28930e826e86SOder Chiou SND_SOC_DAPM_MUX("Stereo2 ADC1 Mux", SND_SOC_NOPM, 0, 0,
28940e826e86SOder Chiou &rt5677_sto2_adc1_mux),
28950e826e86SOder Chiou SND_SOC_DAPM_MUX("Stereo2 ADC2 Mux", SND_SOC_NOPM, 0, 0,
28960e826e86SOder Chiou &rt5677_sto2_adc2_mux),
28970e826e86SOder Chiou SND_SOC_DAPM_MUX("Stereo2 ADC LR Mux", SND_SOC_NOPM, 0, 0,
28980e826e86SOder Chiou &rt5677_sto2_adc_lr_mux),
28990e826e86SOder Chiou SND_SOC_DAPM_MUX("Stereo3 DMIC Mux", SND_SOC_NOPM, 0, 0,
29000e826e86SOder Chiou &rt5677_sto3_dmic_mux),
29010e826e86SOder Chiou SND_SOC_DAPM_MUX("Stereo3 ADC1 Mux", SND_SOC_NOPM, 0, 0,
29020e826e86SOder Chiou &rt5677_sto3_adc1_mux),
29030e826e86SOder Chiou SND_SOC_DAPM_MUX("Stereo3 ADC2 Mux", SND_SOC_NOPM, 0, 0,
29040e826e86SOder Chiou &rt5677_sto3_adc2_mux),
29050e826e86SOder Chiou SND_SOC_DAPM_MUX("Stereo4 DMIC Mux", SND_SOC_NOPM, 0, 0,
29060e826e86SOder Chiou &rt5677_sto4_dmic_mux),
29070e826e86SOder Chiou SND_SOC_DAPM_MUX("Stereo4 ADC1 Mux", SND_SOC_NOPM, 0, 0,
29080e826e86SOder Chiou &rt5677_sto4_adc1_mux),
29090e826e86SOder Chiou SND_SOC_DAPM_MUX("Stereo4 ADC2 Mux", SND_SOC_NOPM, 0, 0,
29100e826e86SOder Chiou &rt5677_sto4_adc2_mux),
29110e826e86SOder Chiou SND_SOC_DAPM_MUX("Mono DMIC L Mux", SND_SOC_NOPM, 0, 0,
29120e826e86SOder Chiou &rt5677_mono_dmic_l_mux),
29130e826e86SOder Chiou SND_SOC_DAPM_MUX("Mono DMIC R Mux", SND_SOC_NOPM, 0, 0,
29140e826e86SOder Chiou &rt5677_mono_dmic_r_mux),
29150e826e86SOder Chiou SND_SOC_DAPM_MUX("Mono ADC2 L Mux", SND_SOC_NOPM, 0, 0,
29160e826e86SOder Chiou &rt5677_mono_adc2_l_mux),
29170e826e86SOder Chiou SND_SOC_DAPM_MUX("Mono ADC1 L Mux", SND_SOC_NOPM, 0, 0,
29180e826e86SOder Chiou &rt5677_mono_adc1_l_mux),
29190e826e86SOder Chiou SND_SOC_DAPM_MUX("Mono ADC1 R Mux", SND_SOC_NOPM, 0, 0,
29200e826e86SOder Chiou &rt5677_mono_adc1_r_mux),
29210e826e86SOder Chiou SND_SOC_DAPM_MUX("Mono ADC2 R Mux", SND_SOC_NOPM, 0, 0,
29220e826e86SOder Chiou &rt5677_mono_adc2_r_mux),
29230e826e86SOder Chiou
29240e826e86SOder Chiou /* ADC Mixer */
29250e826e86SOder Chiou SND_SOC_DAPM_SUPPLY("adc stereo1 filter", RT5677_PWR_DIG2,
29260e826e86SOder Chiou RT5677_PWR_ADC_S1F_BIT, 0, NULL, 0),
29270e826e86SOder Chiou SND_SOC_DAPM_SUPPLY("adc stereo2 filter", RT5677_PWR_DIG2,
29280e826e86SOder Chiou RT5677_PWR_ADC_S2F_BIT, 0, NULL, 0),
29290e826e86SOder Chiou SND_SOC_DAPM_SUPPLY("adc stereo3 filter", RT5677_PWR_DIG2,
29300e826e86SOder Chiou RT5677_PWR_ADC_S3F_BIT, 0, NULL, 0),
29310e826e86SOder Chiou SND_SOC_DAPM_SUPPLY("adc stereo4 filter", RT5677_PWR_DIG2,
29320e826e86SOder Chiou RT5677_PWR_ADC_S4F_BIT, 0, NULL, 0),
29330e826e86SOder Chiou SND_SOC_DAPM_MIXER("Sto1 ADC MIXL", SND_SOC_NOPM, 0, 0,
29340e826e86SOder Chiou rt5677_sto1_adc_l_mix, ARRAY_SIZE(rt5677_sto1_adc_l_mix)),
29350e826e86SOder Chiou SND_SOC_DAPM_MIXER("Sto1 ADC MIXR", SND_SOC_NOPM, 0, 0,
29360e826e86SOder Chiou rt5677_sto1_adc_r_mix, ARRAY_SIZE(rt5677_sto1_adc_r_mix)),
29370e826e86SOder Chiou SND_SOC_DAPM_MIXER("Sto2 ADC MIXL", SND_SOC_NOPM, 0, 0,
29380e826e86SOder Chiou rt5677_sto2_adc_l_mix, ARRAY_SIZE(rt5677_sto2_adc_l_mix)),
29390e826e86SOder Chiou SND_SOC_DAPM_MIXER("Sto2 ADC MIXR", SND_SOC_NOPM, 0, 0,
29400e826e86SOder Chiou rt5677_sto2_adc_r_mix, ARRAY_SIZE(rt5677_sto2_adc_r_mix)),
29410e826e86SOder Chiou SND_SOC_DAPM_MIXER("Sto3 ADC MIXL", SND_SOC_NOPM, 0, 0,
29420e826e86SOder Chiou rt5677_sto3_adc_l_mix, ARRAY_SIZE(rt5677_sto3_adc_l_mix)),
29430e826e86SOder Chiou SND_SOC_DAPM_MIXER("Sto3 ADC MIXR", SND_SOC_NOPM, 0, 0,
29440e826e86SOder Chiou rt5677_sto3_adc_r_mix, ARRAY_SIZE(rt5677_sto3_adc_r_mix)),
29450e826e86SOder Chiou SND_SOC_DAPM_MIXER("Sto4 ADC MIXL", SND_SOC_NOPM, 0, 0,
29460e826e86SOder Chiou rt5677_sto4_adc_l_mix, ARRAY_SIZE(rt5677_sto4_adc_l_mix)),
29470e826e86SOder Chiou SND_SOC_DAPM_MIXER("Sto4 ADC MIXR", SND_SOC_NOPM, 0, 0,
29480e826e86SOder Chiou rt5677_sto4_adc_r_mix, ARRAY_SIZE(rt5677_sto4_adc_r_mix)),
29490e826e86SOder Chiou SND_SOC_DAPM_SUPPLY("adc mono left filter", RT5677_PWR_DIG2,
29500e826e86SOder Chiou RT5677_PWR_ADC_MF_L_BIT, 0, NULL, 0),
29510e826e86SOder Chiou SND_SOC_DAPM_MIXER("Mono ADC MIXL", SND_SOC_NOPM, 0, 0,
29520e826e86SOder Chiou rt5677_mono_adc_l_mix, ARRAY_SIZE(rt5677_mono_adc_l_mix)),
29530e826e86SOder Chiou SND_SOC_DAPM_SUPPLY("adc mono right filter", RT5677_PWR_DIG2,
29540e826e86SOder Chiou RT5677_PWR_ADC_MF_R_BIT, 0, NULL, 0),
29550e826e86SOder Chiou SND_SOC_DAPM_MIXER("Mono ADC MIXR", SND_SOC_NOPM, 0, 0,
29560e826e86SOder Chiou rt5677_mono_adc_r_mix, ARRAY_SIZE(rt5677_mono_adc_r_mix)),
29570e826e86SOder Chiou
29580e826e86SOder Chiou /* ADC PGA */
29590e826e86SOder Chiou SND_SOC_DAPM_PGA("Stereo1 ADC MIXL", SND_SOC_NOPM, 0, 0, NULL, 0),
29600e826e86SOder Chiou SND_SOC_DAPM_PGA("Stereo1 ADC MIXR", SND_SOC_NOPM, 0, 0, NULL, 0),
29610e826e86SOder Chiou SND_SOC_DAPM_PGA("Stereo1 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
29620e826e86SOder Chiou SND_SOC_DAPM_PGA("Stereo2 ADC MIXL", SND_SOC_NOPM, 0, 0, NULL, 0),
29630e826e86SOder Chiou SND_SOC_DAPM_PGA("Stereo2 ADC MIXR", SND_SOC_NOPM, 0, 0, NULL, 0),
29640e826e86SOder Chiou SND_SOC_DAPM_PGA("Stereo2 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
29650e826e86SOder Chiou SND_SOC_DAPM_PGA("Stereo3 ADC MIXL", SND_SOC_NOPM, 0, 0, NULL, 0),
29660e826e86SOder Chiou SND_SOC_DAPM_PGA("Stereo3 ADC MIXR", SND_SOC_NOPM, 0, 0, NULL, 0),
29670e826e86SOder Chiou SND_SOC_DAPM_PGA("Stereo3 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
29680e826e86SOder Chiou SND_SOC_DAPM_PGA("Stereo4 ADC MIXL", SND_SOC_NOPM, 0, 0, NULL, 0),
29690e826e86SOder Chiou SND_SOC_DAPM_PGA("Stereo4 ADC MIXR", SND_SOC_NOPM, 0, 0, NULL, 0),
29700e826e86SOder Chiou SND_SOC_DAPM_PGA("Stereo4 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
29710e826e86SOder Chiou SND_SOC_DAPM_PGA("Sto2 ADC LR MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
29720e826e86SOder Chiou SND_SOC_DAPM_PGA("Mono ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
2973e6f6ebc1SOder Chiou SND_SOC_DAPM_PGA("IF1 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
2974e6f6ebc1SOder Chiou SND_SOC_DAPM_PGA("IF2 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
29750e826e86SOder Chiou
29760e826e86SOder Chiou /* DSP */
29770e826e86SOder Chiou SND_SOC_DAPM_MUX("IB9 Mux", SND_SOC_NOPM, 0, 0,
29780e826e86SOder Chiou &rt5677_ib9_src_mux),
29790e826e86SOder Chiou SND_SOC_DAPM_MUX("IB8 Mux", SND_SOC_NOPM, 0, 0,
29800e826e86SOder Chiou &rt5677_ib8_src_mux),
29810e826e86SOder Chiou SND_SOC_DAPM_MUX("IB7 Mux", SND_SOC_NOPM, 0, 0,
29820e826e86SOder Chiou &rt5677_ib7_src_mux),
29830e826e86SOder Chiou SND_SOC_DAPM_MUX("IB6 Mux", SND_SOC_NOPM, 0, 0,
29840e826e86SOder Chiou &rt5677_ib6_src_mux),
29850e826e86SOder Chiou SND_SOC_DAPM_MUX("IB45 Mux", SND_SOC_NOPM, 0, 0,
29860e826e86SOder Chiou &rt5677_ib45_src_mux),
29870e826e86SOder Chiou SND_SOC_DAPM_MUX("IB23 Mux", SND_SOC_NOPM, 0, 0,
29880e826e86SOder Chiou &rt5677_ib23_src_mux),
29890e826e86SOder Chiou SND_SOC_DAPM_MUX("IB01 Mux", SND_SOC_NOPM, 0, 0,
29900e826e86SOder Chiou &rt5677_ib01_src_mux),
29910e826e86SOder Chiou SND_SOC_DAPM_MUX("IB45 Bypass Mux", SND_SOC_NOPM, 0, 0,
29920e826e86SOder Chiou &rt5677_ib45_bypass_src_mux),
29930e826e86SOder Chiou SND_SOC_DAPM_MUX("IB23 Bypass Mux", SND_SOC_NOPM, 0, 0,
29940e826e86SOder Chiou &rt5677_ib23_bypass_src_mux),
29950e826e86SOder Chiou SND_SOC_DAPM_MUX("IB01 Bypass Mux", SND_SOC_NOPM, 0, 0,
29960e826e86SOder Chiou &rt5677_ib01_bypass_src_mux),
29970e826e86SOder Chiou SND_SOC_DAPM_MUX("OB23 Bypass Mux", SND_SOC_NOPM, 0, 0,
29980e826e86SOder Chiou &rt5677_ob23_bypass_src_mux),
29990e826e86SOder Chiou SND_SOC_DAPM_MUX("OB01 Bypass Mux", SND_SOC_NOPM, 0, 0,
30000e826e86SOder Chiou &rt5677_ob01_bypass_src_mux),
30010e826e86SOder Chiou
30020e826e86SOder Chiou SND_SOC_DAPM_PGA("OB45", SND_SOC_NOPM, 0, 0, NULL, 0),
30030e826e86SOder Chiou SND_SOC_DAPM_PGA("OB67", SND_SOC_NOPM, 0, 0, NULL, 0),
30040e826e86SOder Chiou
30050e826e86SOder Chiou SND_SOC_DAPM_PGA("OutBound2", SND_SOC_NOPM, 0, 0, NULL, 0),
30060e826e86SOder Chiou SND_SOC_DAPM_PGA("OutBound3", SND_SOC_NOPM, 0, 0, NULL, 0),
30070e826e86SOder Chiou SND_SOC_DAPM_PGA("OutBound4", SND_SOC_NOPM, 0, 0, NULL, 0),
30080e826e86SOder Chiou SND_SOC_DAPM_PGA("OutBound5", SND_SOC_NOPM, 0, 0, NULL, 0),
30090e826e86SOder Chiou SND_SOC_DAPM_PGA("OutBound6", SND_SOC_NOPM, 0, 0, NULL, 0),
30100e826e86SOder Chiou SND_SOC_DAPM_PGA("OutBound7", SND_SOC_NOPM, 0, 0, NULL, 0),
30110e826e86SOder Chiou
30120e826e86SOder Chiou /* Digital Interface */
30130e826e86SOder Chiou SND_SOC_DAPM_SUPPLY("I2S1", RT5677_PWR_DIG1,
30140e826e86SOder Chiou RT5677_PWR_I2S1_BIT, 0, NULL, 0),
30150e826e86SOder Chiou SND_SOC_DAPM_PGA("IF1 DAC0", SND_SOC_NOPM, 0, 0, NULL, 0),
30160e826e86SOder Chiou SND_SOC_DAPM_PGA("IF1 DAC1", SND_SOC_NOPM, 0, 0, NULL, 0),
30170e826e86SOder Chiou SND_SOC_DAPM_PGA("IF1 DAC2", SND_SOC_NOPM, 0, 0, NULL, 0),
30180e826e86SOder Chiou SND_SOC_DAPM_PGA("IF1 DAC3", SND_SOC_NOPM, 0, 0, NULL, 0),
30190e826e86SOder Chiou SND_SOC_DAPM_PGA("IF1 DAC4", SND_SOC_NOPM, 0, 0, NULL, 0),
30200e826e86SOder Chiou SND_SOC_DAPM_PGA("IF1 DAC5", SND_SOC_NOPM, 0, 0, NULL, 0),
30210e826e86SOder Chiou SND_SOC_DAPM_PGA("IF1 DAC6", SND_SOC_NOPM, 0, 0, NULL, 0),
30220e826e86SOder Chiou SND_SOC_DAPM_PGA("IF1 DAC7", SND_SOC_NOPM, 0, 0, NULL, 0),
30230e826e86SOder Chiou SND_SOC_DAPM_PGA("IF1 DAC01", SND_SOC_NOPM, 0, 0, NULL, 0),
30240e826e86SOder Chiou SND_SOC_DAPM_PGA("IF1 DAC23", SND_SOC_NOPM, 0, 0, NULL, 0),
30250e826e86SOder Chiou SND_SOC_DAPM_PGA("IF1 DAC45", SND_SOC_NOPM, 0, 0, NULL, 0),
30260e826e86SOder Chiou SND_SOC_DAPM_PGA("IF1 DAC67", SND_SOC_NOPM, 0, 0, NULL, 0),
30270e826e86SOder Chiou SND_SOC_DAPM_PGA("IF1 ADC1", SND_SOC_NOPM, 0, 0, NULL, 0),
30280e826e86SOder Chiou SND_SOC_DAPM_PGA("IF1 ADC2", SND_SOC_NOPM, 0, 0, NULL, 0),
30290e826e86SOder Chiou SND_SOC_DAPM_PGA("IF1 ADC3", SND_SOC_NOPM, 0, 0, NULL, 0),
30300e826e86SOder Chiou SND_SOC_DAPM_PGA("IF1 ADC4", SND_SOC_NOPM, 0, 0, NULL, 0),
30310e826e86SOder Chiou
30320e826e86SOder Chiou SND_SOC_DAPM_SUPPLY("I2S2", RT5677_PWR_DIG1,
30330e826e86SOder Chiou RT5677_PWR_I2S2_BIT, 0, NULL, 0),
30340e826e86SOder Chiou SND_SOC_DAPM_PGA("IF2 DAC0", SND_SOC_NOPM, 0, 0, NULL, 0),
30350e826e86SOder Chiou SND_SOC_DAPM_PGA("IF2 DAC1", SND_SOC_NOPM, 0, 0, NULL, 0),
30360e826e86SOder Chiou SND_SOC_DAPM_PGA("IF2 DAC2", SND_SOC_NOPM, 0, 0, NULL, 0),
30370e826e86SOder Chiou SND_SOC_DAPM_PGA("IF2 DAC3", SND_SOC_NOPM, 0, 0, NULL, 0),
30380e826e86SOder Chiou SND_SOC_DAPM_PGA("IF2 DAC4", SND_SOC_NOPM, 0, 0, NULL, 0),
30390e826e86SOder Chiou SND_SOC_DAPM_PGA("IF2 DAC5", SND_SOC_NOPM, 0, 0, NULL, 0),
30400e826e86SOder Chiou SND_SOC_DAPM_PGA("IF2 DAC6", SND_SOC_NOPM, 0, 0, NULL, 0),
30410e826e86SOder Chiou SND_SOC_DAPM_PGA("IF2 DAC7", SND_SOC_NOPM, 0, 0, NULL, 0),
30420e826e86SOder Chiou SND_SOC_DAPM_PGA("IF2 DAC01", SND_SOC_NOPM, 0, 0, NULL, 0),
30430e826e86SOder Chiou SND_SOC_DAPM_PGA("IF2 DAC23", SND_SOC_NOPM, 0, 0, NULL, 0),
30440e826e86SOder Chiou SND_SOC_DAPM_PGA("IF2 DAC45", SND_SOC_NOPM, 0, 0, NULL, 0),
30450e826e86SOder Chiou SND_SOC_DAPM_PGA("IF2 DAC67", SND_SOC_NOPM, 0, 0, NULL, 0),
30460e826e86SOder Chiou SND_SOC_DAPM_PGA("IF2 ADC1", SND_SOC_NOPM, 0, 0, NULL, 0),
30470e826e86SOder Chiou SND_SOC_DAPM_PGA("IF2 ADC2", SND_SOC_NOPM, 0, 0, NULL, 0),
30480e826e86SOder Chiou SND_SOC_DAPM_PGA("IF2 ADC3", SND_SOC_NOPM, 0, 0, NULL, 0),
30490e826e86SOder Chiou SND_SOC_DAPM_PGA("IF2 ADC4", SND_SOC_NOPM, 0, 0, NULL, 0),
30500e826e86SOder Chiou
30510e826e86SOder Chiou SND_SOC_DAPM_SUPPLY("I2S3", RT5677_PWR_DIG1,
30520e826e86SOder Chiou RT5677_PWR_I2S3_BIT, 0, NULL, 0),
30530e826e86SOder Chiou SND_SOC_DAPM_PGA("IF3 DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
30540e826e86SOder Chiou SND_SOC_DAPM_PGA("IF3 DAC L", SND_SOC_NOPM, 0, 0, NULL, 0),
30550e826e86SOder Chiou SND_SOC_DAPM_PGA("IF3 DAC R", SND_SOC_NOPM, 0, 0, NULL, 0),
30560e826e86SOder Chiou SND_SOC_DAPM_PGA("IF3 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
30570e826e86SOder Chiou SND_SOC_DAPM_PGA("IF3 ADC L", SND_SOC_NOPM, 0, 0, NULL, 0),
30580e826e86SOder Chiou SND_SOC_DAPM_PGA("IF3 ADC R", SND_SOC_NOPM, 0, 0, NULL, 0),
30590e826e86SOder Chiou
30600e826e86SOder Chiou SND_SOC_DAPM_SUPPLY("I2S4", RT5677_PWR_DIG1,
30610e826e86SOder Chiou RT5677_PWR_I2S4_BIT, 0, NULL, 0),
30620e826e86SOder Chiou SND_SOC_DAPM_PGA("IF4 DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
30630e826e86SOder Chiou SND_SOC_DAPM_PGA("IF4 DAC L", SND_SOC_NOPM, 0, 0, NULL, 0),
30640e826e86SOder Chiou SND_SOC_DAPM_PGA("IF4 DAC R", SND_SOC_NOPM, 0, 0, NULL, 0),
30650e826e86SOder Chiou SND_SOC_DAPM_PGA("IF4 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
30660e826e86SOder Chiou SND_SOC_DAPM_PGA("IF4 ADC L", SND_SOC_NOPM, 0, 0, NULL, 0),
30670e826e86SOder Chiou SND_SOC_DAPM_PGA("IF4 ADC R", SND_SOC_NOPM, 0, 0, NULL, 0),
30680e826e86SOder Chiou
30690e826e86SOder Chiou SND_SOC_DAPM_SUPPLY("SLB", RT5677_PWR_DIG1,
30700e826e86SOder Chiou RT5677_PWR_SLB_BIT, 0, NULL, 0),
30710e826e86SOder Chiou SND_SOC_DAPM_PGA("SLB DAC0", SND_SOC_NOPM, 0, 0, NULL, 0),
30720e826e86SOder Chiou SND_SOC_DAPM_PGA("SLB DAC1", SND_SOC_NOPM, 0, 0, NULL, 0),
30730e826e86SOder Chiou SND_SOC_DAPM_PGA("SLB DAC2", SND_SOC_NOPM, 0, 0, NULL, 0),
30740e826e86SOder Chiou SND_SOC_DAPM_PGA("SLB DAC3", SND_SOC_NOPM, 0, 0, NULL, 0),
30750e826e86SOder Chiou SND_SOC_DAPM_PGA("SLB DAC4", SND_SOC_NOPM, 0, 0, NULL, 0),
30760e826e86SOder Chiou SND_SOC_DAPM_PGA("SLB DAC5", SND_SOC_NOPM, 0, 0, NULL, 0),
30770e826e86SOder Chiou SND_SOC_DAPM_PGA("SLB DAC6", SND_SOC_NOPM, 0, 0, NULL, 0),
30780e826e86SOder Chiou SND_SOC_DAPM_PGA("SLB DAC7", SND_SOC_NOPM, 0, 0, NULL, 0),
30790e826e86SOder Chiou SND_SOC_DAPM_PGA("SLB DAC01", SND_SOC_NOPM, 0, 0, NULL, 0),
30800e826e86SOder Chiou SND_SOC_DAPM_PGA("SLB DAC23", SND_SOC_NOPM, 0, 0, NULL, 0),
30810e826e86SOder Chiou SND_SOC_DAPM_PGA("SLB DAC45", SND_SOC_NOPM, 0, 0, NULL, 0),
30820e826e86SOder Chiou SND_SOC_DAPM_PGA("SLB DAC67", SND_SOC_NOPM, 0, 0, NULL, 0),
30830e826e86SOder Chiou SND_SOC_DAPM_PGA("SLB ADC1", SND_SOC_NOPM, 0, 0, NULL, 0),
30840e826e86SOder Chiou SND_SOC_DAPM_PGA("SLB ADC2", SND_SOC_NOPM, 0, 0, NULL, 0),
30850e826e86SOder Chiou SND_SOC_DAPM_PGA("SLB ADC3", SND_SOC_NOPM, 0, 0, NULL, 0),
30860e826e86SOder Chiou SND_SOC_DAPM_PGA("SLB ADC4", SND_SOC_NOPM, 0, 0, NULL, 0),
30870e826e86SOder Chiou
30880e826e86SOder Chiou /* Digital Interface Select */
30890e826e86SOder Chiou SND_SOC_DAPM_MUX("IF1 ADC1 Mux", SND_SOC_NOPM, 0, 0,
30900e826e86SOder Chiou &rt5677_if1_adc1_mux),
30910e826e86SOder Chiou SND_SOC_DAPM_MUX("IF1 ADC2 Mux", SND_SOC_NOPM, 0, 0,
30920e826e86SOder Chiou &rt5677_if1_adc2_mux),
30930e826e86SOder Chiou SND_SOC_DAPM_MUX("IF1 ADC3 Mux", SND_SOC_NOPM, 0, 0,
30940e826e86SOder Chiou &rt5677_if1_adc3_mux),
30950e826e86SOder Chiou SND_SOC_DAPM_MUX("IF1 ADC4 Mux", SND_SOC_NOPM, 0, 0,
30960e826e86SOder Chiou &rt5677_if1_adc4_mux),
3097e6f6ebc1SOder Chiou SND_SOC_DAPM_MUX("IF1 ADC1 Swap Mux", SND_SOC_NOPM, 0, 0,
3098e6f6ebc1SOder Chiou &rt5677_if1_adc1_swap_mux),
3099e6f6ebc1SOder Chiou SND_SOC_DAPM_MUX("IF1 ADC2 Swap Mux", SND_SOC_NOPM, 0, 0,
3100e6f6ebc1SOder Chiou &rt5677_if1_adc2_swap_mux),
3101e6f6ebc1SOder Chiou SND_SOC_DAPM_MUX("IF1 ADC3 Swap Mux", SND_SOC_NOPM, 0, 0,
3102e6f6ebc1SOder Chiou &rt5677_if1_adc3_swap_mux),
3103e6f6ebc1SOder Chiou SND_SOC_DAPM_MUX("IF1 ADC4 Swap Mux", SND_SOC_NOPM, 0, 0,
3104e6f6ebc1SOder Chiou &rt5677_if1_adc4_swap_mux),
3105e6f6ebc1SOder Chiou SND_SOC_DAPM_MUX_E("IF1 ADC TDM Swap Mux", SND_SOC_NOPM, 0, 0,
3106e6f6ebc1SOder Chiou &rt5677_if1_adc_tdm_swap_mux, rt5677_if1_adc_tdm_event,
3107e6f6ebc1SOder Chiou SND_SOC_DAPM_PRE_PMU),
31080e826e86SOder Chiou SND_SOC_DAPM_MUX("IF2 ADC1 Mux", SND_SOC_NOPM, 0, 0,
31090e826e86SOder Chiou &rt5677_if2_adc1_mux),
31100e826e86SOder Chiou SND_SOC_DAPM_MUX("IF2 ADC2 Mux", SND_SOC_NOPM, 0, 0,
31110e826e86SOder Chiou &rt5677_if2_adc2_mux),
31120e826e86SOder Chiou SND_SOC_DAPM_MUX("IF2 ADC3 Mux", SND_SOC_NOPM, 0, 0,
31130e826e86SOder Chiou &rt5677_if2_adc3_mux),
31140e826e86SOder Chiou SND_SOC_DAPM_MUX("IF2 ADC4 Mux", SND_SOC_NOPM, 0, 0,
31150e826e86SOder Chiou &rt5677_if2_adc4_mux),
3116e6f6ebc1SOder Chiou SND_SOC_DAPM_MUX("IF2 ADC1 Swap Mux", SND_SOC_NOPM, 0, 0,
3117e6f6ebc1SOder Chiou &rt5677_if2_adc1_swap_mux),
3118e6f6ebc1SOder Chiou SND_SOC_DAPM_MUX("IF2 ADC2 Swap Mux", SND_SOC_NOPM, 0, 0,
3119e6f6ebc1SOder Chiou &rt5677_if2_adc2_swap_mux),
3120e6f6ebc1SOder Chiou SND_SOC_DAPM_MUX("IF2 ADC3 Swap Mux", SND_SOC_NOPM, 0, 0,
3121e6f6ebc1SOder Chiou &rt5677_if2_adc3_swap_mux),
3122e6f6ebc1SOder Chiou SND_SOC_DAPM_MUX("IF2 ADC4 Swap Mux", SND_SOC_NOPM, 0, 0,
3123e6f6ebc1SOder Chiou &rt5677_if2_adc4_swap_mux),
3124e6f6ebc1SOder Chiou SND_SOC_DAPM_MUX_E("IF2 ADC TDM Swap Mux", SND_SOC_NOPM, 0, 0,
3125e6f6ebc1SOder Chiou &rt5677_if2_adc_tdm_swap_mux, rt5677_if2_adc_tdm_event,
3126e6f6ebc1SOder Chiou SND_SOC_DAPM_PRE_PMU),
31270e826e86SOder Chiou SND_SOC_DAPM_MUX("IF3 ADC Mux", SND_SOC_NOPM, 0, 0,
31280e826e86SOder Chiou &rt5677_if3_adc_mux),
31290e826e86SOder Chiou SND_SOC_DAPM_MUX("IF4 ADC Mux", SND_SOC_NOPM, 0, 0,
31300e826e86SOder Chiou &rt5677_if4_adc_mux),
31310e826e86SOder Chiou SND_SOC_DAPM_MUX("SLB ADC1 Mux", SND_SOC_NOPM, 0, 0,
31320e826e86SOder Chiou &rt5677_slb_adc1_mux),
31330e826e86SOder Chiou SND_SOC_DAPM_MUX("SLB ADC2 Mux", SND_SOC_NOPM, 0, 0,
31340e826e86SOder Chiou &rt5677_slb_adc2_mux),
31350e826e86SOder Chiou SND_SOC_DAPM_MUX("SLB ADC3 Mux", SND_SOC_NOPM, 0, 0,
31360e826e86SOder Chiou &rt5677_slb_adc3_mux),
31370e826e86SOder Chiou SND_SOC_DAPM_MUX("SLB ADC4 Mux", SND_SOC_NOPM, 0, 0,
31380e826e86SOder Chiou &rt5677_slb_adc4_mux),
31390e826e86SOder Chiou
314091159ecaSOder Chiou SND_SOC_DAPM_MUX("IF1 DAC0 Mux", SND_SOC_NOPM, 0, 0,
314191159ecaSOder Chiou &rt5677_if1_dac0_tdm_sel_mux),
314291159ecaSOder Chiou SND_SOC_DAPM_MUX("IF1 DAC1 Mux", SND_SOC_NOPM, 0, 0,
314391159ecaSOder Chiou &rt5677_if1_dac1_tdm_sel_mux),
314491159ecaSOder Chiou SND_SOC_DAPM_MUX("IF1 DAC2 Mux", SND_SOC_NOPM, 0, 0,
314591159ecaSOder Chiou &rt5677_if1_dac2_tdm_sel_mux),
314691159ecaSOder Chiou SND_SOC_DAPM_MUX("IF1 DAC3 Mux", SND_SOC_NOPM, 0, 0,
314791159ecaSOder Chiou &rt5677_if1_dac3_tdm_sel_mux),
314891159ecaSOder Chiou SND_SOC_DAPM_MUX("IF1 DAC4 Mux", SND_SOC_NOPM, 0, 0,
314991159ecaSOder Chiou &rt5677_if1_dac4_tdm_sel_mux),
315091159ecaSOder Chiou SND_SOC_DAPM_MUX("IF1 DAC5 Mux", SND_SOC_NOPM, 0, 0,
315191159ecaSOder Chiou &rt5677_if1_dac5_tdm_sel_mux),
315291159ecaSOder Chiou SND_SOC_DAPM_MUX("IF1 DAC6 Mux", SND_SOC_NOPM, 0, 0,
315391159ecaSOder Chiou &rt5677_if1_dac6_tdm_sel_mux),
315491159ecaSOder Chiou SND_SOC_DAPM_MUX("IF1 DAC7 Mux", SND_SOC_NOPM, 0, 0,
315591159ecaSOder Chiou &rt5677_if1_dac7_tdm_sel_mux),
315691159ecaSOder Chiou
315791159ecaSOder Chiou SND_SOC_DAPM_MUX("IF2 DAC0 Mux", SND_SOC_NOPM, 0, 0,
315891159ecaSOder Chiou &rt5677_if2_dac0_tdm_sel_mux),
315991159ecaSOder Chiou SND_SOC_DAPM_MUX("IF2 DAC1 Mux", SND_SOC_NOPM, 0, 0,
316091159ecaSOder Chiou &rt5677_if2_dac1_tdm_sel_mux),
316191159ecaSOder Chiou SND_SOC_DAPM_MUX("IF2 DAC2 Mux", SND_SOC_NOPM, 0, 0,
316291159ecaSOder Chiou &rt5677_if2_dac2_tdm_sel_mux),
316391159ecaSOder Chiou SND_SOC_DAPM_MUX("IF2 DAC3 Mux", SND_SOC_NOPM, 0, 0,
316491159ecaSOder Chiou &rt5677_if2_dac3_tdm_sel_mux),
316591159ecaSOder Chiou SND_SOC_DAPM_MUX("IF2 DAC4 Mux", SND_SOC_NOPM, 0, 0,
316691159ecaSOder Chiou &rt5677_if2_dac4_tdm_sel_mux),
316791159ecaSOder Chiou SND_SOC_DAPM_MUX("IF2 DAC5 Mux", SND_SOC_NOPM, 0, 0,
316891159ecaSOder Chiou &rt5677_if2_dac5_tdm_sel_mux),
316991159ecaSOder Chiou SND_SOC_DAPM_MUX("IF2 DAC6 Mux", SND_SOC_NOPM, 0, 0,
317091159ecaSOder Chiou &rt5677_if2_dac6_tdm_sel_mux),
317191159ecaSOder Chiou SND_SOC_DAPM_MUX("IF2 DAC7 Mux", SND_SOC_NOPM, 0, 0,
317291159ecaSOder Chiou &rt5677_if2_dac7_tdm_sel_mux),
317391159ecaSOder Chiou
31740e826e86SOder Chiou /* Audio Interface */
31750e826e86SOder Chiou SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0),
31760e826e86SOder Chiou SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0),
31770e826e86SOder Chiou SND_SOC_DAPM_AIF_IN("AIF2RX", "AIF2 Playback", 0, SND_SOC_NOPM, 0, 0),
31780e826e86SOder Chiou SND_SOC_DAPM_AIF_OUT("AIF2TX", "AIF2 Capture", 0, SND_SOC_NOPM, 0, 0),
31790e826e86SOder Chiou SND_SOC_DAPM_AIF_IN("AIF3RX", "AIF3 Playback", 0, SND_SOC_NOPM, 0, 0),
31800e826e86SOder Chiou SND_SOC_DAPM_AIF_OUT("AIF3TX", "AIF3 Capture", 0, SND_SOC_NOPM, 0, 0),
31810e826e86SOder Chiou SND_SOC_DAPM_AIF_IN("AIF4RX", "AIF4 Playback", 0, SND_SOC_NOPM, 0, 0),
31820e826e86SOder Chiou SND_SOC_DAPM_AIF_OUT("AIF4TX", "AIF4 Capture", 0, SND_SOC_NOPM, 0, 0),
31830e826e86SOder Chiou SND_SOC_DAPM_AIF_IN("SLBRX", "SLIMBus Playback", 0, SND_SOC_NOPM, 0, 0),
31840e826e86SOder Chiou SND_SOC_DAPM_AIF_OUT("SLBTX", "SLIMBus Capture", 0, SND_SOC_NOPM, 0, 0),
318529073ae4SBen Zhang SND_SOC_DAPM_AIF_OUT("DSPTX", "DSP Buffer", 0, SND_SOC_NOPM, 0, 0),
31860e826e86SOder Chiou
31870e826e86SOder Chiou /* Sidetone Mux */
31880e826e86SOder Chiou SND_SOC_DAPM_MUX("Sidetone Mux", SND_SOC_NOPM, 0, 0,
31890e826e86SOder Chiou &rt5677_sidetone_mux),
319090bdbb46SOder Chiou SND_SOC_DAPM_SUPPLY("Sidetone Power", RT5677_SIDETONE_CTRL,
319190bdbb46SOder Chiou RT5677_ST_EN_SFT, 0, NULL, 0),
319290bdbb46SOder Chiou
31930e826e86SOder Chiou /* VAD Mux*/
31940e826e86SOder Chiou SND_SOC_DAPM_MUX("VAD ADC Mux", SND_SOC_NOPM, 0, 0,
31950e826e86SOder Chiou &rt5677_vad_src_mux),
31960e826e86SOder Chiou
31970e826e86SOder Chiou /* Tensilica DSP */
31980e826e86SOder Chiou SND_SOC_DAPM_PGA("Tensilica DSP", SND_SOC_NOPM, 0, 0, NULL, 0),
31990e826e86SOder Chiou SND_SOC_DAPM_MIXER("OB01 MIX", SND_SOC_NOPM, 0, 0,
32000e826e86SOder Chiou rt5677_ob_01_mix, ARRAY_SIZE(rt5677_ob_01_mix)),
32010e826e86SOder Chiou SND_SOC_DAPM_MIXER("OB23 MIX", SND_SOC_NOPM, 0, 0,
32020e826e86SOder Chiou rt5677_ob_23_mix, ARRAY_SIZE(rt5677_ob_23_mix)),
32030e826e86SOder Chiou SND_SOC_DAPM_MIXER("OB4 MIX", SND_SOC_NOPM, 0, 0,
32040e826e86SOder Chiou rt5677_ob_4_mix, ARRAY_SIZE(rt5677_ob_4_mix)),
32050e826e86SOder Chiou SND_SOC_DAPM_MIXER("OB5 MIX", SND_SOC_NOPM, 0, 0,
32060e826e86SOder Chiou rt5677_ob_5_mix, ARRAY_SIZE(rt5677_ob_5_mix)),
32070e826e86SOder Chiou SND_SOC_DAPM_MIXER("OB6 MIX", SND_SOC_NOPM, 0, 0,
32080e826e86SOder Chiou rt5677_ob_6_mix, ARRAY_SIZE(rt5677_ob_6_mix)),
32090e826e86SOder Chiou SND_SOC_DAPM_MIXER("OB7 MIX", SND_SOC_NOPM, 0, 0,
32100e826e86SOder Chiou rt5677_ob_7_mix, ARRAY_SIZE(rt5677_ob_7_mix)),
32110e826e86SOder Chiou
32120e826e86SOder Chiou /* Output Side */
32130e826e86SOder Chiou /* DAC mixer before sound effect */
32140e826e86SOder Chiou SND_SOC_DAPM_MIXER("DAC1 MIXL", SND_SOC_NOPM, 0, 0,
32150e826e86SOder Chiou rt5677_dac_l_mix, ARRAY_SIZE(rt5677_dac_l_mix)),
32160e826e86SOder Chiou SND_SOC_DAPM_MIXER("DAC1 MIXR", SND_SOC_NOPM, 0, 0,
32170e826e86SOder Chiou rt5677_dac_r_mix, ARRAY_SIZE(rt5677_dac_r_mix)),
32180e826e86SOder Chiou SND_SOC_DAPM_PGA("DAC1 FS", SND_SOC_NOPM, 0, 0, NULL, 0),
32190e826e86SOder Chiou
32200e826e86SOder Chiou /* DAC Mux */
32210e826e86SOder Chiou SND_SOC_DAPM_MUX("DAC1 Mux", SND_SOC_NOPM, 0, 0,
32220e826e86SOder Chiou &rt5677_dac1_mux),
32230e826e86SOder Chiou SND_SOC_DAPM_MUX("ADDA1 Mux", SND_SOC_NOPM, 0, 0,
32240e826e86SOder Chiou &rt5677_adda1_mux),
32250e826e86SOder Chiou SND_SOC_DAPM_MUX("DAC12 SRC Mux", SND_SOC_NOPM, 0, 0,
32260e826e86SOder Chiou &rt5677_dac12_mux),
32270e826e86SOder Chiou SND_SOC_DAPM_MUX("DAC3 SRC Mux", SND_SOC_NOPM, 0, 0,
32280e826e86SOder Chiou &rt5677_dac3_mux),
32290e826e86SOder Chiou
32300e826e86SOder Chiou /* DAC2 channel Mux */
32310e826e86SOder Chiou SND_SOC_DAPM_MUX("DAC2 L Mux", SND_SOC_NOPM, 0, 0,
32320e826e86SOder Chiou &rt5677_dac2_l_mux),
32330e826e86SOder Chiou SND_SOC_DAPM_MUX("DAC2 R Mux", SND_SOC_NOPM, 0, 0,
32340e826e86SOder Chiou &rt5677_dac2_r_mux),
32350e826e86SOder Chiou
32360e826e86SOder Chiou /* DAC3 channel Mux */
32370e826e86SOder Chiou SND_SOC_DAPM_MUX("DAC3 L Mux", SND_SOC_NOPM, 0, 0,
32380e826e86SOder Chiou &rt5677_dac3_l_mux),
32390e826e86SOder Chiou SND_SOC_DAPM_MUX("DAC3 R Mux", SND_SOC_NOPM, 0, 0,
32400e826e86SOder Chiou &rt5677_dac3_r_mux),
32410e826e86SOder Chiou
32420e826e86SOder Chiou /* DAC4 channel Mux */
32430e826e86SOder Chiou SND_SOC_DAPM_MUX("DAC4 L Mux", SND_SOC_NOPM, 0, 0,
32440e826e86SOder Chiou &rt5677_dac4_l_mux),
32450e826e86SOder Chiou SND_SOC_DAPM_MUX("DAC4 R Mux", SND_SOC_NOPM, 0, 0,
32460e826e86SOder Chiou &rt5677_dac4_r_mux),
32470e826e86SOder Chiou
32480e826e86SOder Chiou /* DAC Mixer */
32490e826e86SOder Chiou SND_SOC_DAPM_SUPPLY("dac stereo1 filter", RT5677_PWR_DIG2,
3250c22d7666SOder Chiou RT5677_PWR_DAC_S1F_BIT, 0, rt5677_filter_power_event,
3251c22d7666SOder Chiou SND_SOC_DAPM_POST_PMU),
32526800b5baSOder Chiou SND_SOC_DAPM_SUPPLY("dac mono2 left filter", RT5677_PWR_DIG2,
3253c22d7666SOder Chiou RT5677_PWR_DAC_M2F_L_BIT, 0, rt5677_filter_power_event,
3254c22d7666SOder Chiou SND_SOC_DAPM_POST_PMU),
32556800b5baSOder Chiou SND_SOC_DAPM_SUPPLY("dac mono2 right filter", RT5677_PWR_DIG2,
3256c22d7666SOder Chiou RT5677_PWR_DAC_M2F_R_BIT, 0, rt5677_filter_power_event,
3257c22d7666SOder Chiou SND_SOC_DAPM_POST_PMU),
32586800b5baSOder Chiou SND_SOC_DAPM_SUPPLY("dac mono3 left filter", RT5677_PWR_DIG2,
3259c22d7666SOder Chiou RT5677_PWR_DAC_M3F_L_BIT, 0, rt5677_filter_power_event,
3260c22d7666SOder Chiou SND_SOC_DAPM_POST_PMU),
32616800b5baSOder Chiou SND_SOC_DAPM_SUPPLY("dac mono3 right filter", RT5677_PWR_DIG2,
3262c22d7666SOder Chiou RT5677_PWR_DAC_M3F_R_BIT, 0, rt5677_filter_power_event,
3263c22d7666SOder Chiou SND_SOC_DAPM_POST_PMU),
32646800b5baSOder Chiou SND_SOC_DAPM_SUPPLY("dac mono4 left filter", RT5677_PWR_DIG2,
3265c22d7666SOder Chiou RT5677_PWR_DAC_M4F_L_BIT, 0, rt5677_filter_power_event,
3266c22d7666SOder Chiou SND_SOC_DAPM_POST_PMU),
32676800b5baSOder Chiou SND_SOC_DAPM_SUPPLY("dac mono4 right filter", RT5677_PWR_DIG2,
3268c22d7666SOder Chiou RT5677_PWR_DAC_M4F_R_BIT, 0, rt5677_filter_power_event,
3269c22d7666SOder Chiou SND_SOC_DAPM_POST_PMU),
32700e826e86SOder Chiou
32710e826e86SOder Chiou SND_SOC_DAPM_MIXER("Stereo DAC MIXL", SND_SOC_NOPM, 0, 0,
32720e826e86SOder Chiou rt5677_sto1_dac_l_mix, ARRAY_SIZE(rt5677_sto1_dac_l_mix)),
32730e826e86SOder Chiou SND_SOC_DAPM_MIXER("Stereo DAC MIXR", SND_SOC_NOPM, 0, 0,
32740e826e86SOder Chiou rt5677_sto1_dac_r_mix, ARRAY_SIZE(rt5677_sto1_dac_r_mix)),
32750e826e86SOder Chiou SND_SOC_DAPM_MIXER("Mono DAC MIXL", SND_SOC_NOPM, 0, 0,
32760e826e86SOder Chiou rt5677_mono_dac_l_mix, ARRAY_SIZE(rt5677_mono_dac_l_mix)),
32770e826e86SOder Chiou SND_SOC_DAPM_MIXER("Mono DAC MIXR", SND_SOC_NOPM, 0, 0,
32780e826e86SOder Chiou rt5677_mono_dac_r_mix, ARRAY_SIZE(rt5677_mono_dac_r_mix)),
32790e826e86SOder Chiou SND_SOC_DAPM_MIXER("DD1 MIXL", SND_SOC_NOPM, 0, 0,
32800e826e86SOder Chiou rt5677_dd1_l_mix, ARRAY_SIZE(rt5677_dd1_l_mix)),
32810e826e86SOder Chiou SND_SOC_DAPM_MIXER("DD1 MIXR", SND_SOC_NOPM, 0, 0,
32820e826e86SOder Chiou rt5677_dd1_r_mix, ARRAY_SIZE(rt5677_dd1_r_mix)),
32830e826e86SOder Chiou SND_SOC_DAPM_MIXER("DD2 MIXL", SND_SOC_NOPM, 0, 0,
32840e826e86SOder Chiou rt5677_dd2_l_mix, ARRAY_SIZE(rt5677_dd2_l_mix)),
32850e826e86SOder Chiou SND_SOC_DAPM_MIXER("DD2 MIXR", SND_SOC_NOPM, 0, 0,
32860e826e86SOder Chiou rt5677_dd2_r_mix, ARRAY_SIZE(rt5677_dd2_r_mix)),
32870e826e86SOder Chiou SND_SOC_DAPM_PGA("Stereo DAC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
32880e826e86SOder Chiou SND_SOC_DAPM_PGA("Mono DAC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
32890e826e86SOder Chiou SND_SOC_DAPM_PGA("DD1 MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
32900e826e86SOder Chiou SND_SOC_DAPM_PGA("DD2 MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
32910e826e86SOder Chiou
32920e826e86SOder Chiou /* DACs */
32930e826e86SOder Chiou SND_SOC_DAPM_DAC("DAC 1", NULL, RT5677_PWR_DIG1,
32940e826e86SOder Chiou RT5677_PWR_DAC1_BIT, 0),
32950e826e86SOder Chiou SND_SOC_DAPM_DAC("DAC 2", NULL, RT5677_PWR_DIG1,
32960e826e86SOder Chiou RT5677_PWR_DAC2_BIT, 0),
32970e826e86SOder Chiou SND_SOC_DAPM_DAC("DAC 3", NULL, RT5677_PWR_DIG1,
32980e826e86SOder Chiou RT5677_PWR_DAC3_BIT, 0),
32990e826e86SOder Chiou
33000e826e86SOder Chiou /* PDM */
33010e826e86SOder Chiou SND_SOC_DAPM_SUPPLY("PDM1 Power", RT5677_PWR_DIG2,
33020e826e86SOder Chiou RT5677_PWR_PDM1_BIT, 0, NULL, 0),
33030e826e86SOder Chiou SND_SOC_DAPM_SUPPLY("PDM2 Power", RT5677_PWR_DIG2,
33040e826e86SOder Chiou RT5677_PWR_PDM2_BIT, 0, NULL, 0),
33050e826e86SOder Chiou
33060e826e86SOder Chiou SND_SOC_DAPM_MUX("PDM1 L Mux", RT5677_PDM_OUT_CTRL, RT5677_M_PDM1_L_SFT,
33070e826e86SOder Chiou 1, &rt5677_pdm1_l_mux),
33080e826e86SOder Chiou SND_SOC_DAPM_MUX("PDM1 R Mux", RT5677_PDM_OUT_CTRL, RT5677_M_PDM1_R_SFT,
33090e826e86SOder Chiou 1, &rt5677_pdm1_r_mux),
33100e826e86SOder Chiou SND_SOC_DAPM_MUX("PDM2 L Mux", RT5677_PDM_OUT_CTRL, RT5677_M_PDM2_L_SFT,
33110e826e86SOder Chiou 1, &rt5677_pdm2_l_mux),
33120e826e86SOder Chiou SND_SOC_DAPM_MUX("PDM2 R Mux", RT5677_PDM_OUT_CTRL, RT5677_M_PDM2_R_SFT,
33130e826e86SOder Chiou 1, &rt5677_pdm2_r_mux),
33140e826e86SOder Chiou
3315683996cbSOder Chiou SND_SOC_DAPM_PGA_S("LOUT1 amp", 0, RT5677_PWR_ANLG1, RT5677_PWR_LO1_BIT,
33160e826e86SOder Chiou 0, NULL, 0),
3317683996cbSOder Chiou SND_SOC_DAPM_PGA_S("LOUT2 amp", 0, RT5677_PWR_ANLG1, RT5677_PWR_LO2_BIT,
33180e826e86SOder Chiou 0, NULL, 0),
3319683996cbSOder Chiou SND_SOC_DAPM_PGA_S("LOUT3 amp", 0, RT5677_PWR_ANLG1, RT5677_PWR_LO3_BIT,
33200e826e86SOder Chiou 0, NULL, 0),
33210e826e86SOder Chiou
3322683996cbSOder Chiou SND_SOC_DAPM_PGA_S("LOUT1 vref", 1, SND_SOC_NOPM, 0, 0,
3323683996cbSOder Chiou rt5677_vref_event, SND_SOC_DAPM_POST_PMU),
3324683996cbSOder Chiou SND_SOC_DAPM_PGA_S("LOUT2 vref", 1, SND_SOC_NOPM, 0, 0,
3325683996cbSOder Chiou rt5677_vref_event, SND_SOC_DAPM_POST_PMU),
3326683996cbSOder Chiou SND_SOC_DAPM_PGA_S("LOUT3 vref", 1, SND_SOC_NOPM, 0, 0,
3327683996cbSOder Chiou rt5677_vref_event, SND_SOC_DAPM_POST_PMU),
3328683996cbSOder Chiou
33290e826e86SOder Chiou /* Output Lines */
33300e826e86SOder Chiou SND_SOC_DAPM_OUTPUT("LOUT1"),
33310e826e86SOder Chiou SND_SOC_DAPM_OUTPUT("LOUT2"),
33320e826e86SOder Chiou SND_SOC_DAPM_OUTPUT("LOUT3"),
33330e826e86SOder Chiou SND_SOC_DAPM_OUTPUT("PDM1L"),
33340e826e86SOder Chiou SND_SOC_DAPM_OUTPUT("PDM1R"),
33350e826e86SOder Chiou SND_SOC_DAPM_OUTPUT("PDM2L"),
33360e826e86SOder Chiou SND_SOC_DAPM_OUTPUT("PDM2R"),
3337683996cbSOder Chiou
3338683996cbSOder Chiou SND_SOC_DAPM_POST("vref", rt5677_vref_event),
33390e826e86SOder Chiou };
33400e826e86SOder Chiou
33410e826e86SOder Chiou static const struct snd_soc_dapm_route rt5677_dapm_routes[] = {
33425220f7fbSOder Chiou { "Stereo1 DMIC Mux", NULL, "DMIC STO1 ASRC", rt5677_dmic_use_asrc },
33435220f7fbSOder Chiou { "Stereo2 DMIC Mux", NULL, "DMIC STO2 ASRC", rt5677_dmic_use_asrc },
33445220f7fbSOder Chiou { "Stereo3 DMIC Mux", NULL, "DMIC STO3 ASRC", rt5677_dmic_use_asrc },
33455220f7fbSOder Chiou { "Stereo4 DMIC Mux", NULL, "DMIC STO4 ASRC", rt5677_dmic_use_asrc },
33465220f7fbSOder Chiou { "Mono DMIC L Mux", NULL, "DMIC MONO L ASRC", rt5677_dmic_use_asrc },
33475220f7fbSOder Chiou { "Mono DMIC R Mux", NULL, "DMIC MONO R ASRC", rt5677_dmic_use_asrc },
33485a8c7c26SOder Chiou { "I2S1", NULL, "I2S1 ASRC", can_use_asrc},
33495a8c7c26SOder Chiou { "I2S2", NULL, "I2S2 ASRC", can_use_asrc},
33505a8c7c26SOder Chiou { "I2S3", NULL, "I2S3 ASRC", can_use_asrc},
33515a8c7c26SOder Chiou { "I2S4", NULL, "I2S4 ASRC", can_use_asrc},
33525a8c7c26SOder Chiou
33535a8c7c26SOder Chiou { "dac stereo1 filter", NULL, "DAC STO ASRC", is_using_asrc },
33545a8c7c26SOder Chiou { "dac mono2 left filter", NULL, "DAC MONO2 L ASRC", is_using_asrc },
33555a8c7c26SOder Chiou { "dac mono2 right filter", NULL, "DAC MONO2 R ASRC", is_using_asrc },
33565a8c7c26SOder Chiou { "dac mono3 left filter", NULL, "DAC MONO3 L ASRC", is_using_asrc },
33575a8c7c26SOder Chiou { "dac mono3 right filter", NULL, "DAC MONO3 R ASRC", is_using_asrc },
33585a8c7c26SOder Chiou { "dac mono4 left filter", NULL, "DAC MONO4 L ASRC", is_using_asrc },
33595a8c7c26SOder Chiou { "dac mono4 right filter", NULL, "DAC MONO4 R ASRC", is_using_asrc },
33605a8c7c26SOder Chiou { "adc stereo1 filter", NULL, "ADC STO1 ASRC", is_using_asrc },
33615a8c7c26SOder Chiou { "adc stereo2 filter", NULL, "ADC STO2 ASRC", is_using_asrc },
33625a8c7c26SOder Chiou { "adc stereo3 filter", NULL, "ADC STO3 ASRC", is_using_asrc },
33635a8c7c26SOder Chiou { "adc stereo4 filter", NULL, "ADC STO4 ASRC", is_using_asrc },
33645a8c7c26SOder Chiou { "adc mono left filter", NULL, "ADC MONO L ASRC", is_using_asrc },
33655a8c7c26SOder Chiou { "adc mono right filter", NULL, "ADC MONO R ASRC", is_using_asrc },
33665a8c7c26SOder Chiou
33670e826e86SOder Chiou { "DMIC1", NULL, "DMIC L1" },
33680e826e86SOder Chiou { "DMIC1", NULL, "DMIC R1" },
33690e826e86SOder Chiou { "DMIC2", NULL, "DMIC L2" },
33700e826e86SOder Chiou { "DMIC2", NULL, "DMIC R2" },
33710e826e86SOder Chiou { "DMIC3", NULL, "DMIC L3" },
33720e826e86SOder Chiou { "DMIC3", NULL, "DMIC R3" },
33730e826e86SOder Chiou { "DMIC4", NULL, "DMIC L4" },
33740e826e86SOder Chiou { "DMIC4", NULL, "DMIC R4" },
33750e826e86SOder Chiou
33760e826e86SOder Chiou { "DMIC L1", NULL, "DMIC CLK" },
33770e826e86SOder Chiou { "DMIC R1", NULL, "DMIC CLK" },
33780e826e86SOder Chiou { "DMIC L2", NULL, "DMIC CLK" },
33790e826e86SOder Chiou { "DMIC R2", NULL, "DMIC CLK" },
33800e826e86SOder Chiou { "DMIC L3", NULL, "DMIC CLK" },
33810e826e86SOder Chiou { "DMIC R3", NULL, "DMIC CLK" },
33820e826e86SOder Chiou { "DMIC L4", NULL, "DMIC CLK" },
33830e826e86SOder Chiou { "DMIC R4", NULL, "DMIC CLK" },
33840e826e86SOder Chiou
33852d15d974SBard Liao { "DMIC L1", NULL, "DMIC1 power" },
33862d15d974SBard Liao { "DMIC R1", NULL, "DMIC1 power" },
33872d15d974SBard Liao { "DMIC L3", NULL, "DMIC3 power" },
33882d15d974SBard Liao { "DMIC R3", NULL, "DMIC3 power" },
33892d15d974SBard Liao { "DMIC L4", NULL, "DMIC4 power" },
33902d15d974SBard Liao { "DMIC R4", NULL, "DMIC4 power" },
33912d15d974SBard Liao
33920e826e86SOder Chiou { "BST1", NULL, "IN1P" },
33930e826e86SOder Chiou { "BST1", NULL, "IN1N" },
33940e826e86SOder Chiou { "BST2", NULL, "IN2P" },
33950e826e86SOder Chiou { "BST2", NULL, "IN2N" },
33960e826e86SOder Chiou
339722e51345SBard Liao { "IN1P", NULL, "MICBIAS1" },
339822e51345SBard Liao { "IN1N", NULL, "MICBIAS1" },
339922e51345SBard Liao { "IN2P", NULL, "MICBIAS1" },
340022e51345SBard Liao { "IN2N", NULL, "MICBIAS1" },
34010e826e86SOder Chiou
34020e826e86SOder Chiou { "ADC 1", NULL, "BST1" },
34030e826e86SOder Chiou { "ADC 1", NULL, "ADC 1 power" },
34040e826e86SOder Chiou { "ADC 1", NULL, "ADC1 clock" },
34050e826e86SOder Chiou { "ADC 2", NULL, "BST2" },
34060e826e86SOder Chiou { "ADC 2", NULL, "ADC 2 power" },
34070e826e86SOder Chiou { "ADC 2", NULL, "ADC2 clock" },
34080e826e86SOder Chiou
34090e826e86SOder Chiou { "Stereo1 DMIC Mux", "DMIC1", "DMIC1" },
34100e826e86SOder Chiou { "Stereo1 DMIC Mux", "DMIC2", "DMIC2" },
34110e826e86SOder Chiou { "Stereo1 DMIC Mux", "DMIC3", "DMIC3" },
34120e826e86SOder Chiou { "Stereo1 DMIC Mux", "DMIC4", "DMIC4" },
34130e826e86SOder Chiou
34140e826e86SOder Chiou { "Stereo2 DMIC Mux", "DMIC1", "DMIC1" },
34150e826e86SOder Chiou { "Stereo2 DMIC Mux", "DMIC2", "DMIC2" },
34160e826e86SOder Chiou { "Stereo2 DMIC Mux", "DMIC3", "DMIC3" },
34170e826e86SOder Chiou { "Stereo2 DMIC Mux", "DMIC4", "DMIC4" },
34180e826e86SOder Chiou
34190e826e86SOder Chiou { "Stereo3 DMIC Mux", "DMIC1", "DMIC1" },
34200e826e86SOder Chiou { "Stereo3 DMIC Mux", "DMIC2", "DMIC2" },
34210e826e86SOder Chiou { "Stereo3 DMIC Mux", "DMIC3", "DMIC3" },
34220e826e86SOder Chiou { "Stereo3 DMIC Mux", "DMIC4", "DMIC4" },
34230e826e86SOder Chiou
34240e826e86SOder Chiou { "Stereo4 DMIC Mux", "DMIC1", "DMIC1" },
34250e826e86SOder Chiou { "Stereo4 DMIC Mux", "DMIC2", "DMIC2" },
34260e826e86SOder Chiou { "Stereo4 DMIC Mux", "DMIC3", "DMIC3" },
34270e826e86SOder Chiou { "Stereo4 DMIC Mux", "DMIC4", "DMIC4" },
34280e826e86SOder Chiou
34290e826e86SOder Chiou { "Mono DMIC L Mux", "DMIC1", "DMIC1" },
34300e826e86SOder Chiou { "Mono DMIC L Mux", "DMIC2", "DMIC2" },
34310e826e86SOder Chiou { "Mono DMIC L Mux", "DMIC3", "DMIC3" },
34320e826e86SOder Chiou { "Mono DMIC L Mux", "DMIC4", "DMIC4" },
34330e826e86SOder Chiou
34340e826e86SOder Chiou { "Mono DMIC R Mux", "DMIC1", "DMIC1" },
34350e826e86SOder Chiou { "Mono DMIC R Mux", "DMIC2", "DMIC2" },
34360e826e86SOder Chiou { "Mono DMIC R Mux", "DMIC3", "DMIC3" },
34370e826e86SOder Chiou { "Mono DMIC R Mux", "DMIC4", "DMIC4" },
34380e826e86SOder Chiou
34390e826e86SOder Chiou { "ADC 1_2", NULL, "ADC 1" },
34400e826e86SOder Chiou { "ADC 1_2", NULL, "ADC 2" },
34410e826e86SOder Chiou
34420e826e86SOder Chiou { "Stereo1 ADC1 Mux", "DD MIX1", "DD1 MIX" },
34430e826e86SOder Chiou { "Stereo1 ADC1 Mux", "ADC1/2", "ADC 1_2" },
34440e826e86SOder Chiou { "Stereo1 ADC1 Mux", "Stereo DAC MIX", "Stereo DAC MIX" },
34450e826e86SOder Chiou
34460e826e86SOder Chiou { "Stereo1 ADC2 Mux", "DD MIX1", "DD1 MIX" },
34470e826e86SOder Chiou { "Stereo1 ADC2 Mux", "DMIC", "Stereo1 DMIC Mux" },
34480e826e86SOder Chiou { "Stereo1 ADC2 Mux", "Stereo DAC MIX", "Stereo DAC MIX" },
34490e826e86SOder Chiou
34500e826e86SOder Chiou { "Stereo2 ADC1 Mux", "DD MIX1", "DD1 MIX" },
34510e826e86SOder Chiou { "Stereo2 ADC1 Mux", "ADC1/2", "ADC 1_2" },
34520e826e86SOder Chiou { "Stereo2 ADC1 Mux", "Stereo DAC MIX", "Stereo DAC MIX" },
34530e826e86SOder Chiou
34540e826e86SOder Chiou { "Stereo2 ADC2 Mux", "DD MIX1", "DD1 MIX" },
34550e826e86SOder Chiou { "Stereo2 ADC2 Mux", "DMIC", "Stereo2 DMIC Mux" },
34560e826e86SOder Chiou { "Stereo2 ADC2 Mux", "Stereo DAC MIX", "Stereo DAC MIX" },
34570e826e86SOder Chiou
34580e826e86SOder Chiou { "Stereo3 ADC1 Mux", "DD MIX1", "DD1 MIX" },
34590e826e86SOder Chiou { "Stereo3 ADC1 Mux", "ADC1/2", "ADC 1_2" },
34600e826e86SOder Chiou { "Stereo3 ADC1 Mux", "Stereo DAC MIX", "Stereo DAC MIX" },
34610e826e86SOder Chiou
34620e826e86SOder Chiou { "Stereo3 ADC2 Mux", "DD MIX1", "DD1 MIX" },
34630e826e86SOder Chiou { "Stereo3 ADC2 Mux", "DMIC", "Stereo3 DMIC Mux" },
34640e826e86SOder Chiou { "Stereo3 ADC2 Mux", "Stereo DAC MIX", "Stereo DAC MIX" },
34650e826e86SOder Chiou
34660e826e86SOder Chiou { "Stereo4 ADC1 Mux", "DD MIX1", "DD1 MIX" },
34670e826e86SOder Chiou { "Stereo4 ADC1 Mux", "ADC1/2", "ADC 1_2" },
34680e826e86SOder Chiou { "Stereo4 ADC1 Mux", "DD MIX2", "DD2 MIX" },
34690e826e86SOder Chiou
34700e826e86SOder Chiou { "Stereo4 ADC2 Mux", "DD MIX1", "DD1 MIX" },
34710e826e86SOder Chiou { "Stereo4 ADC2 Mux", "DMIC", "Stereo3 DMIC Mux" },
34720e826e86SOder Chiou { "Stereo4 ADC2 Mux", "DD MIX2", "DD2 MIX" },
34730e826e86SOder Chiou
34740e826e86SOder Chiou { "Mono ADC2 L Mux", "DD MIX1L", "DD1 MIXL" },
34750e826e86SOder Chiou { "Mono ADC2 L Mux", "DMIC", "Mono DMIC L Mux" },
34760e826e86SOder Chiou { "Mono ADC2 L Mux", "MONO DAC MIXL", "Mono DAC MIXL" },
34770e826e86SOder Chiou
34780e826e86SOder Chiou { "Mono ADC1 L Mux", "DD MIX1L", "DD1 MIXL" },
34790e826e86SOder Chiou { "Mono ADC1 L Mux", "ADC1", "ADC 1" },
34800e826e86SOder Chiou { "Mono ADC1 L Mux", "MONO DAC MIXL", "Mono DAC MIXL" },
34810e826e86SOder Chiou
34820e826e86SOder Chiou { "Mono ADC1 R Mux", "DD MIX1R", "DD1 MIXR" },
34830e826e86SOder Chiou { "Mono ADC1 R Mux", "ADC2", "ADC 2" },
34840e826e86SOder Chiou { "Mono ADC1 R Mux", "MONO DAC MIXR", "Mono DAC MIXR" },
34850e826e86SOder Chiou
34860e826e86SOder Chiou { "Mono ADC2 R Mux", "DD MIX1R", "DD1 MIXR" },
34870e826e86SOder Chiou { "Mono ADC2 R Mux", "DMIC", "Mono DMIC R Mux" },
34880e826e86SOder Chiou { "Mono ADC2 R Mux", "MONO DAC MIXR", "Mono DAC MIXR" },
34890e826e86SOder Chiou
34900e826e86SOder Chiou { "Sto1 ADC MIXL", "ADC1 Switch", "Stereo1 ADC1 Mux" },
34910e826e86SOder Chiou { "Sto1 ADC MIXL", "ADC2 Switch", "Stereo1 ADC2 Mux" },
34920e826e86SOder Chiou { "Sto1 ADC MIXR", "ADC1 Switch", "Stereo1 ADC1 Mux" },
34930e826e86SOder Chiou { "Sto1 ADC MIXR", "ADC2 Switch", "Stereo1 ADC2 Mux" },
34940e826e86SOder Chiou
34950e826e86SOder Chiou { "Stereo1 ADC MIXL", NULL, "Sto1 ADC MIXL" },
34960e826e86SOder Chiou { "Stereo1 ADC MIXL", NULL, "adc stereo1 filter" },
34970e826e86SOder Chiou { "Stereo1 ADC MIXR", NULL, "Sto1 ADC MIXR" },
34980e826e86SOder Chiou { "Stereo1 ADC MIXR", NULL, "adc stereo1 filter" },
34990e826e86SOder Chiou { "adc stereo1 filter", NULL, "PLL1", is_sys_clk_from_pll },
35000e826e86SOder Chiou
35010e826e86SOder Chiou { "Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXL" },
35020e826e86SOder Chiou { "Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXR" },
35030e826e86SOder Chiou
35040e826e86SOder Chiou { "Sto2 ADC MIXL", "ADC1 Switch", "Stereo2 ADC1 Mux" },
35050e826e86SOder Chiou { "Sto2 ADC MIXL", "ADC2 Switch", "Stereo2 ADC2 Mux" },
35060e826e86SOder Chiou { "Sto2 ADC MIXR", "ADC1 Switch", "Stereo2 ADC1 Mux" },
35070e826e86SOder Chiou { "Sto2 ADC MIXR", "ADC2 Switch", "Stereo2 ADC2 Mux" },
35080e826e86SOder Chiou
35090e826e86SOder Chiou { "Sto2 ADC LR MIX", NULL, "Sto2 ADC MIXL" },
35100e826e86SOder Chiou { "Sto2 ADC LR MIX", NULL, "Sto2 ADC MIXR" },
35110e826e86SOder Chiou
35120e826e86SOder Chiou { "Stereo2 ADC LR Mux", "L", "Sto2 ADC MIXL" },
35130e826e86SOder Chiou { "Stereo2 ADC LR Mux", "LR", "Sto2 ADC LR MIX" },
35140e826e86SOder Chiou
35150e826e86SOder Chiou { "Stereo2 ADC MIXL", NULL, "Stereo2 ADC LR Mux" },
35160e826e86SOder Chiou { "Stereo2 ADC MIXL", NULL, "adc stereo2 filter" },
35170e826e86SOder Chiou { "Stereo2 ADC MIXR", NULL, "Sto2 ADC MIXR" },
35180e826e86SOder Chiou { "Stereo2 ADC MIXR", NULL, "adc stereo2 filter" },
35190e826e86SOder Chiou { "adc stereo2 filter", NULL, "PLL1", is_sys_clk_from_pll },
35200e826e86SOder Chiou
35210e826e86SOder Chiou { "Stereo2 ADC MIX", NULL, "Stereo2 ADC MIXL" },
35220e826e86SOder Chiou { "Stereo2 ADC MIX", NULL, "Stereo2 ADC MIXR" },
35230e826e86SOder Chiou
35240e826e86SOder Chiou { "Sto3 ADC MIXL", "ADC1 Switch", "Stereo3 ADC1 Mux" },
35250e826e86SOder Chiou { "Sto3 ADC MIXL", "ADC2 Switch", "Stereo3 ADC2 Mux" },
35260e826e86SOder Chiou { "Sto3 ADC MIXR", "ADC1 Switch", "Stereo3 ADC1 Mux" },
35270e826e86SOder Chiou { "Sto3 ADC MIXR", "ADC2 Switch", "Stereo3 ADC2 Mux" },
35280e826e86SOder Chiou
35290e826e86SOder Chiou { "Stereo3 ADC MIXL", NULL, "Sto3 ADC MIXL" },
35300e826e86SOder Chiou { "Stereo3 ADC MIXL", NULL, "adc stereo3 filter" },
35310e826e86SOder Chiou { "Stereo3 ADC MIXR", NULL, "Sto3 ADC MIXR" },
35320e826e86SOder Chiou { "Stereo3 ADC MIXR", NULL, "adc stereo3 filter" },
35330e826e86SOder Chiou { "adc stereo3 filter", NULL, "PLL1", is_sys_clk_from_pll },
35340e826e86SOder Chiou
35350e826e86SOder Chiou { "Stereo3 ADC MIX", NULL, "Stereo3 ADC MIXL" },
35360e826e86SOder Chiou { "Stereo3 ADC MIX", NULL, "Stereo3 ADC MIXR" },
35370e826e86SOder Chiou
35380e826e86SOder Chiou { "Sto4 ADC MIXL", "ADC1 Switch", "Stereo4 ADC1 Mux" },
35390e826e86SOder Chiou { "Sto4 ADC MIXL", "ADC2 Switch", "Stereo4 ADC2 Mux" },
35400e826e86SOder Chiou { "Sto4 ADC MIXR", "ADC1 Switch", "Stereo4 ADC1 Mux" },
35410e826e86SOder Chiou { "Sto4 ADC MIXR", "ADC2 Switch", "Stereo4 ADC2 Mux" },
35420e826e86SOder Chiou
35430e826e86SOder Chiou { "Stereo4 ADC MIXL", NULL, "Sto4 ADC MIXL" },
35440e826e86SOder Chiou { "Stereo4 ADC MIXL", NULL, "adc stereo4 filter" },
35450e826e86SOder Chiou { "Stereo4 ADC MIXR", NULL, "Sto4 ADC MIXR" },
35460e826e86SOder Chiou { "Stereo4 ADC MIXR", NULL, "adc stereo4 filter" },
35470e826e86SOder Chiou { "adc stereo4 filter", NULL, "PLL1", is_sys_clk_from_pll },
35480e826e86SOder Chiou
35490e826e86SOder Chiou { "Stereo4 ADC MIX", NULL, "Stereo4 ADC MIXL" },
35500e826e86SOder Chiou { "Stereo4 ADC MIX", NULL, "Stereo4 ADC MIXR" },
35510e826e86SOder Chiou
35520e826e86SOder Chiou { "Mono ADC MIXL", "ADC1 Switch", "Mono ADC1 L Mux" },
35530e826e86SOder Chiou { "Mono ADC MIXL", "ADC2 Switch", "Mono ADC2 L Mux" },
35540e826e86SOder Chiou { "Mono ADC MIXL", NULL, "adc mono left filter" },
35550e826e86SOder Chiou { "adc mono left filter", NULL, "PLL1", is_sys_clk_from_pll },
35560e826e86SOder Chiou
35570e826e86SOder Chiou { "Mono ADC MIXR", "ADC1 Switch", "Mono ADC1 R Mux" },
35580e826e86SOder Chiou { "Mono ADC MIXR", "ADC2 Switch", "Mono ADC2 R Mux" },
35590e826e86SOder Chiou { "Mono ADC MIXR", NULL, "adc mono right filter" },
35600e826e86SOder Chiou { "adc mono right filter", NULL, "PLL1", is_sys_clk_from_pll },
35610e826e86SOder Chiou
35620e826e86SOder Chiou { "Mono ADC MIX", NULL, "Mono ADC MIXL" },
35630e826e86SOder Chiou { "Mono ADC MIX", NULL, "Mono ADC MIXR" },
35640e826e86SOder Chiou
35650e826e86SOder Chiou { "VAD ADC Mux", "STO1 ADC MIX L", "Stereo1 ADC MIXL" },
35660e826e86SOder Chiou { "VAD ADC Mux", "MONO ADC MIX L", "Mono ADC MIXL" },
35670e826e86SOder Chiou { "VAD ADC Mux", "MONO ADC MIX R", "Mono ADC MIXR" },
35680e826e86SOder Chiou { "VAD ADC Mux", "STO2 ADC MIX L", "Stereo2 ADC MIXL" },
35690e826e86SOder Chiou { "VAD ADC Mux", "STO3 ADC MIX L", "Stereo3 ADC MIXL" },
35700e826e86SOder Chiou
35710e826e86SOder Chiou { "IF1 ADC1 Mux", "STO1 ADC MIX", "Stereo1 ADC MIX" },
35720e826e86SOder Chiou { "IF1 ADC1 Mux", "OB01", "OB01 Bypass Mux" },
35730e826e86SOder Chiou { "IF1 ADC1 Mux", "VAD ADC", "VAD ADC Mux" },
35740e826e86SOder Chiou
35750e826e86SOder Chiou { "IF1 ADC2 Mux", "STO2 ADC MIX", "Stereo2 ADC MIX" },
35760e826e86SOder Chiou { "IF1 ADC2 Mux", "OB23", "OB23 Bypass Mux" },
35770e826e86SOder Chiou
35780e826e86SOder Chiou { "IF1 ADC3 Mux", "STO3 ADC MIX", "Stereo3 ADC MIX" },
35790e826e86SOder Chiou { "IF1 ADC3 Mux", "MONO ADC MIX", "Mono ADC MIX" },
35800e826e86SOder Chiou { "IF1 ADC3 Mux", "OB45", "OB45" },
35810e826e86SOder Chiou
35820e826e86SOder Chiou { "IF1 ADC4 Mux", "STO4 ADC MIX", "Stereo4 ADC MIX" },
35830e826e86SOder Chiou { "IF1 ADC4 Mux", "OB67", "OB67" },
35840e826e86SOder Chiou { "IF1 ADC4 Mux", "OB01", "OB01 Bypass Mux" },
35850e826e86SOder Chiou
3586e6f6ebc1SOder Chiou { "IF1 ADC1 Swap Mux", "L/R", "IF1 ADC1 Mux" },
3587e6f6ebc1SOder Chiou { "IF1 ADC1 Swap Mux", "R/L", "IF1 ADC1 Mux" },
3588e6f6ebc1SOder Chiou { "IF1 ADC1 Swap Mux", "L/L", "IF1 ADC1 Mux" },
3589e6f6ebc1SOder Chiou { "IF1 ADC1 Swap Mux", "R/R", "IF1 ADC1 Mux" },
3590e6f6ebc1SOder Chiou
3591e6f6ebc1SOder Chiou { "IF1 ADC2 Swap Mux", "L/R", "IF1 ADC2 Mux" },
3592e6f6ebc1SOder Chiou { "IF1 ADC2 Swap Mux", "R/L", "IF1 ADC2 Mux" },
3593e6f6ebc1SOder Chiou { "IF1 ADC2 Swap Mux", "L/L", "IF1 ADC2 Mux" },
3594e6f6ebc1SOder Chiou { "IF1 ADC2 Swap Mux", "R/R", "IF1 ADC2 Mux" },
3595e6f6ebc1SOder Chiou
3596e6f6ebc1SOder Chiou { "IF1 ADC3 Swap Mux", "L/R", "IF1 ADC3 Mux" },
3597e6f6ebc1SOder Chiou { "IF1 ADC3 Swap Mux", "R/L", "IF1 ADC3 Mux" },
3598e6f6ebc1SOder Chiou { "IF1 ADC3 Swap Mux", "L/L", "IF1 ADC3 Mux" },
3599e6f6ebc1SOder Chiou { "IF1 ADC3 Swap Mux", "R/R", "IF1 ADC3 Mux" },
3600e6f6ebc1SOder Chiou
3601e6f6ebc1SOder Chiou { "IF1 ADC4 Swap Mux", "L/R", "IF1 ADC4 Mux" },
3602e6f6ebc1SOder Chiou { "IF1 ADC4 Swap Mux", "R/L", "IF1 ADC4 Mux" },
3603e6f6ebc1SOder Chiou { "IF1 ADC4 Swap Mux", "L/L", "IF1 ADC4 Mux" },
3604e6f6ebc1SOder Chiou { "IF1 ADC4 Swap Mux", "R/R", "IF1 ADC4 Mux" },
3605e6f6ebc1SOder Chiou
3606e6f6ebc1SOder Chiou { "IF1 ADC", NULL, "IF1 ADC1 Swap Mux" },
3607e6f6ebc1SOder Chiou { "IF1 ADC", NULL, "IF1 ADC2 Swap Mux" },
3608e6f6ebc1SOder Chiou { "IF1 ADC", NULL, "IF1 ADC3 Swap Mux" },
3609e6f6ebc1SOder Chiou { "IF1 ADC", NULL, "IF1 ADC4 Swap Mux" },
3610e6f6ebc1SOder Chiou
3611e6f6ebc1SOder Chiou { "IF1 ADC TDM Swap Mux", "1/2/3/4", "IF1 ADC" },
3612e6f6ebc1SOder Chiou { "IF1 ADC TDM Swap Mux", "2/1/3/4", "IF1 ADC" },
3613e6f6ebc1SOder Chiou { "IF1 ADC TDM Swap Mux", "2/3/1/4", "IF1 ADC" },
3614e6f6ebc1SOder Chiou { "IF1 ADC TDM Swap Mux", "4/1/2/3", "IF1 ADC" },
3615e6f6ebc1SOder Chiou { "IF1 ADC TDM Swap Mux", "1/3/2/4", "IF1 ADC" },
3616e6f6ebc1SOder Chiou { "IF1 ADC TDM Swap Mux", "1/4/2/3", "IF1 ADC" },
3617e6f6ebc1SOder Chiou { "IF1 ADC TDM Swap Mux", "3/1/2/4", "IF1 ADC" },
3618e6f6ebc1SOder Chiou { "IF1 ADC TDM Swap Mux", "3/4/1/2", "IF1 ADC" },
3619e6f6ebc1SOder Chiou
36200e826e86SOder Chiou { "AIF1TX", NULL, "I2S1" },
3621e6f6ebc1SOder Chiou { "AIF1TX", NULL, "IF1 ADC TDM Swap Mux" },
36220e826e86SOder Chiou
36230e826e86SOder Chiou { "IF2 ADC1 Mux", "STO1 ADC MIX", "Stereo1 ADC MIX" },
36240e826e86SOder Chiou { "IF2 ADC1 Mux", "OB01", "OB01 Bypass Mux" },
36250e826e86SOder Chiou { "IF2 ADC1 Mux", "VAD ADC", "VAD ADC Mux" },
36260e826e86SOder Chiou
36270e826e86SOder Chiou { "IF2 ADC2 Mux", "STO2 ADC MIX", "Stereo2 ADC MIX" },
36280e826e86SOder Chiou { "IF2 ADC2 Mux", "OB23", "OB23 Bypass Mux" },
36290e826e86SOder Chiou
36300e826e86SOder Chiou { "IF2 ADC3 Mux", "STO3 ADC MIX", "Stereo3 ADC MIX" },
36310e826e86SOder Chiou { "IF2 ADC3 Mux", "MONO ADC MIX", "Mono ADC MIX" },
36320e826e86SOder Chiou { "IF2 ADC3 Mux", "OB45", "OB45" },
36330e826e86SOder Chiou
36340e826e86SOder Chiou { "IF2 ADC4 Mux", "STO4 ADC MIX", "Stereo4 ADC MIX" },
36350e826e86SOder Chiou { "IF2 ADC4 Mux", "OB67", "OB67" },
36360e826e86SOder Chiou { "IF2 ADC4 Mux", "OB01", "OB01 Bypass Mux" },
36370e826e86SOder Chiou
3638e6f6ebc1SOder Chiou { "IF2 ADC1 Swap Mux", "L/R", "IF2 ADC1 Mux" },
3639e6f6ebc1SOder Chiou { "IF2 ADC1 Swap Mux", "R/L", "IF2 ADC1 Mux" },
3640e6f6ebc1SOder Chiou { "IF2 ADC1 Swap Mux", "L/L", "IF2 ADC1 Mux" },
3641e6f6ebc1SOder Chiou { "IF2 ADC1 Swap Mux", "R/R", "IF2 ADC1 Mux" },
3642e6f6ebc1SOder Chiou
3643e6f6ebc1SOder Chiou { "IF2 ADC2 Swap Mux", "L/R", "IF2 ADC2 Mux" },
3644e6f6ebc1SOder Chiou { "IF2 ADC2 Swap Mux", "R/L", "IF2 ADC2 Mux" },
3645e6f6ebc1SOder Chiou { "IF2 ADC2 Swap Mux", "L/L", "IF2 ADC2 Mux" },
3646e6f6ebc1SOder Chiou { "IF2 ADC2 Swap Mux", "R/R", "IF2 ADC2 Mux" },
3647e6f6ebc1SOder Chiou
3648e6f6ebc1SOder Chiou { "IF2 ADC3 Swap Mux", "L/R", "IF2 ADC3 Mux" },
3649e6f6ebc1SOder Chiou { "IF2 ADC3 Swap Mux", "R/L", "IF2 ADC3 Mux" },
3650e6f6ebc1SOder Chiou { "IF2 ADC3 Swap Mux", "L/L", "IF2 ADC3 Mux" },
3651e6f6ebc1SOder Chiou { "IF2 ADC3 Swap Mux", "R/R", "IF2 ADC3 Mux" },
3652e6f6ebc1SOder Chiou
3653e6f6ebc1SOder Chiou { "IF2 ADC4 Swap Mux", "L/R", "IF2 ADC4 Mux" },
3654e6f6ebc1SOder Chiou { "IF2 ADC4 Swap Mux", "R/L", "IF2 ADC4 Mux" },
3655e6f6ebc1SOder Chiou { "IF2 ADC4 Swap Mux", "L/L", "IF2 ADC4 Mux" },
3656e6f6ebc1SOder Chiou { "IF2 ADC4 Swap Mux", "R/R", "IF2 ADC4 Mux" },
3657e6f6ebc1SOder Chiou
3658e6f6ebc1SOder Chiou { "IF2 ADC", NULL, "IF2 ADC1 Swap Mux" },
3659e6f6ebc1SOder Chiou { "IF2 ADC", NULL, "IF2 ADC2 Swap Mux" },
3660e6f6ebc1SOder Chiou { "IF2 ADC", NULL, "IF2 ADC3 Swap Mux" },
3661e6f6ebc1SOder Chiou { "IF2 ADC", NULL, "IF2 ADC4 Swap Mux" },
3662e6f6ebc1SOder Chiou
3663e6f6ebc1SOder Chiou { "IF2 ADC TDM Swap Mux", "1/2/3/4", "IF2 ADC" },
3664e6f6ebc1SOder Chiou { "IF2 ADC TDM Swap Mux", "2/1/3/4", "IF2 ADC" },
3665e6f6ebc1SOder Chiou { "IF2 ADC TDM Swap Mux", "3/1/2/4", "IF2 ADC" },
3666e6f6ebc1SOder Chiou { "IF2 ADC TDM Swap Mux", "4/1/2/3", "IF2 ADC" },
3667e6f6ebc1SOder Chiou { "IF2 ADC TDM Swap Mux", "1/3/2/4", "IF2 ADC" },
3668e6f6ebc1SOder Chiou { "IF2 ADC TDM Swap Mux", "1/4/2/3", "IF2 ADC" },
3669e6f6ebc1SOder Chiou { "IF2 ADC TDM Swap Mux", "2/3/1/4", "IF2 ADC" },
3670e6f6ebc1SOder Chiou { "IF2 ADC TDM Swap Mux", "3/4/1/2", "IF2 ADC" },
3671e6f6ebc1SOder Chiou
36720e826e86SOder Chiou { "AIF2TX", NULL, "I2S2" },
3673e6f6ebc1SOder Chiou { "AIF2TX", NULL, "IF2 ADC TDM Swap Mux" },
36740e826e86SOder Chiou
36750e826e86SOder Chiou { "IF3 ADC Mux", "STO1 ADC MIX", "Stereo1 ADC MIX" },
36760e826e86SOder Chiou { "IF3 ADC Mux", "STO2 ADC MIX", "Stereo2 ADC MIX" },
36770e826e86SOder Chiou { "IF3 ADC Mux", "STO3 ADC MIX", "Stereo3 ADC MIX" },
36780e826e86SOder Chiou { "IF3 ADC Mux", "STO4 ADC MIX", "Stereo4 ADC MIX" },
36790e826e86SOder Chiou { "IF3 ADC Mux", "MONO ADC MIX", "Mono ADC MIX" },
36800e826e86SOder Chiou { "IF3 ADC Mux", "OB01", "OB01 Bypass Mux" },
36810e826e86SOder Chiou { "IF3 ADC Mux", "OB23", "OB23 Bypass Mux" },
36820e826e86SOder Chiou { "IF3 ADC Mux", "VAD ADC", "VAD ADC Mux" },
36830e826e86SOder Chiou
36840e826e86SOder Chiou { "AIF3TX", NULL, "I2S3" },
36850e826e86SOder Chiou { "AIF3TX", NULL, "IF3 ADC Mux" },
36860e826e86SOder Chiou
36870e826e86SOder Chiou { "IF4 ADC Mux", "STO1 ADC MIX", "Stereo1 ADC MIX" },
36880e826e86SOder Chiou { "IF4 ADC Mux", "STO2 ADC MIX", "Stereo2 ADC MIX" },
36890e826e86SOder Chiou { "IF4 ADC Mux", "STO3 ADC MIX", "Stereo3 ADC MIX" },
36900e826e86SOder Chiou { "IF4 ADC Mux", "STO4 ADC MIX", "Stereo4 ADC MIX" },
36910e826e86SOder Chiou { "IF4 ADC Mux", "MONO ADC MIX", "Mono ADC MIX" },
36920e826e86SOder Chiou { "IF4 ADC Mux", "OB01", "OB01 Bypass Mux" },
36930e826e86SOder Chiou { "IF4 ADC Mux", "OB23", "OB23 Bypass Mux" },
36940e826e86SOder Chiou { "IF4 ADC Mux", "VAD ADC", "VAD ADC Mux" },
36950e826e86SOder Chiou
36960e826e86SOder Chiou { "AIF4TX", NULL, "I2S4" },
36970e826e86SOder Chiou { "AIF4TX", NULL, "IF4 ADC Mux" },
36980e826e86SOder Chiou
36990e826e86SOder Chiou { "SLB ADC1 Mux", "STO1 ADC MIX", "Stereo1 ADC MIX" },
37000e826e86SOder Chiou { "SLB ADC1 Mux", "OB01", "OB01 Bypass Mux" },
37010e826e86SOder Chiou { "SLB ADC1 Mux", "VAD ADC", "VAD ADC Mux" },
37020e826e86SOder Chiou
37030e826e86SOder Chiou { "SLB ADC2 Mux", "STO2 ADC MIX", "Stereo2 ADC MIX" },
37040e826e86SOder Chiou { "SLB ADC2 Mux", "OB23", "OB23 Bypass Mux" },
37050e826e86SOder Chiou
37060e826e86SOder Chiou { "SLB ADC3 Mux", "STO3 ADC MIX", "Stereo3 ADC MIX" },
37070e826e86SOder Chiou { "SLB ADC3 Mux", "MONO ADC MIX", "Mono ADC MIX" },
37080e826e86SOder Chiou { "SLB ADC3 Mux", "OB45", "OB45" },
37090e826e86SOder Chiou
37100e826e86SOder Chiou { "SLB ADC4 Mux", "STO4 ADC MIX", "Stereo4 ADC MIX" },
37110e826e86SOder Chiou { "SLB ADC4 Mux", "OB67", "OB67" },
37120e826e86SOder Chiou { "SLB ADC4 Mux", "OB01", "OB01 Bypass Mux" },
37130e826e86SOder Chiou
37140e826e86SOder Chiou { "SLBTX", NULL, "SLB" },
37150e826e86SOder Chiou { "SLBTX", NULL, "SLB ADC1 Mux" },
37160e826e86SOder Chiou { "SLBTX", NULL, "SLB ADC2 Mux" },
37170e826e86SOder Chiou { "SLBTX", NULL, "SLB ADC3 Mux" },
37180e826e86SOder Chiou { "SLBTX", NULL, "SLB ADC4 Mux" },
37190e826e86SOder Chiou
372029073ae4SBen Zhang { "DSPTX", NULL, "IB01 Bypass Mux" },
372129073ae4SBen Zhang
37220e826e86SOder Chiou { "IB01 Mux", "IF1 DAC 01", "IF1 DAC01" },
37230e826e86SOder Chiou { "IB01 Mux", "IF2 DAC 01", "IF2 DAC01" },
37240e826e86SOder Chiou { "IB01 Mux", "SLB DAC 01", "SLB DAC01" },
37250e826e86SOder Chiou { "IB01 Mux", "STO1 ADC MIX", "Stereo1 ADC MIX" },
372629073ae4SBen Zhang /* The IB01 Mux controls the source for InBound0 and InBound1.
372729073ae4SBen Zhang * When the mux option "VAD ADC/DAC1 FS" is selected, "VAD ADC" goes to
372829073ae4SBen Zhang * InBound0 and "DAC1 FS" goes to InBound1. "VAD ADC" is used for
372929073ae4SBen Zhang * hotwording. "DAC1 FS" is not used currently.
373029073ae4SBen Zhang *
373129073ae4SBen Zhang * Creating a common widget node for "VAD ADC" + "DAC1 FS" and
373229073ae4SBen Zhang * connecting the common widget to IB01 Mux causes the issue where
373329073ae4SBen Zhang * there is an active path going from system playback -> "DAC1 FS" ->
373429073ae4SBen Zhang * IB01 Mux -> DSP Buffer -> hotword stream. This wrong path confuses
373529073ae4SBen Zhang * DAPM. Therefore "DAC1 FS" is ignored for now.
373629073ae4SBen Zhang */
373729073ae4SBen Zhang { "IB01 Mux", "VAD ADC/DAC1 FS", "VAD ADC Mux" },
37380e826e86SOder Chiou
37390e826e86SOder Chiou { "IB01 Bypass Mux", "Bypass", "IB01 Mux" },
37400e826e86SOder Chiou { "IB01 Bypass Mux", "Pass SRC", "IB01 Mux" },
37410e826e86SOder Chiou
37420e826e86SOder Chiou { "IB23 Mux", "IF1 DAC 23", "IF1 DAC23" },
37430e826e86SOder Chiou { "IB23 Mux", "IF2 DAC 23", "IF2 DAC23" },
37440e826e86SOder Chiou { "IB23 Mux", "SLB DAC 23", "SLB DAC23" },
37450e826e86SOder Chiou { "IB23 Mux", "STO2 ADC MIX", "Stereo2 ADC MIX" },
37460e826e86SOder Chiou { "IB23 Mux", "DAC1 FS", "DAC1 FS" },
37470e826e86SOder Chiou { "IB23 Mux", "IF4 DAC", "IF4 DAC" },
37480e826e86SOder Chiou
37490e826e86SOder Chiou { "IB23 Bypass Mux", "Bypass", "IB23 Mux" },
37500e826e86SOder Chiou { "IB23 Bypass Mux", "Pass SRC", "IB23 Mux" },
37510e826e86SOder Chiou
37520e826e86SOder Chiou { "IB45 Mux", "IF1 DAC 45", "IF1 DAC45" },
37530e826e86SOder Chiou { "IB45 Mux", "IF2 DAC 45", "IF2 DAC45" },
37540e826e86SOder Chiou { "IB45 Mux", "SLB DAC 45", "SLB DAC45" },
37550e826e86SOder Chiou { "IB45 Mux", "STO3 ADC MIX", "Stereo3 ADC MIX" },
37560e826e86SOder Chiou { "IB45 Mux", "IF3 DAC", "IF3 DAC" },
37570e826e86SOder Chiou
37580e826e86SOder Chiou { "IB45 Bypass Mux", "Bypass", "IB45 Mux" },
37590e826e86SOder Chiou { "IB45 Bypass Mux", "Pass SRC", "IB45 Mux" },
37600e826e86SOder Chiou
376170068776SOder Chiou { "IB6 Mux", "IF1 DAC 6", "IF1 DAC6 Mux" },
376270068776SOder Chiou { "IB6 Mux", "IF2 DAC 6", "IF2 DAC6 Mux" },
37630e826e86SOder Chiou { "IB6 Mux", "SLB DAC 6", "SLB DAC6" },
37640e826e86SOder Chiou { "IB6 Mux", "STO4 ADC MIX L", "Stereo4 ADC MIXL" },
37650e826e86SOder Chiou { "IB6 Mux", "IF4 DAC L", "IF4 DAC L" },
37660e826e86SOder Chiou { "IB6 Mux", "STO1 ADC MIX L", "Stereo1 ADC MIXL" },
37670e826e86SOder Chiou { "IB6 Mux", "STO2 ADC MIX L", "Stereo2 ADC MIXL" },
37680e826e86SOder Chiou { "IB6 Mux", "STO3 ADC MIX L", "Stereo3 ADC MIXL" },
37690e826e86SOder Chiou
377070068776SOder Chiou { "IB7 Mux", "IF1 DAC 7", "IF1 DAC7 Mux" },
377170068776SOder Chiou { "IB7 Mux", "IF2 DAC 7", "IF2 DAC7 Mux" },
37720e826e86SOder Chiou { "IB7 Mux", "SLB DAC 7", "SLB DAC7" },
37730e826e86SOder Chiou { "IB7 Mux", "STO4 ADC MIX R", "Stereo4 ADC MIXR" },
37740e826e86SOder Chiou { "IB7 Mux", "IF4 DAC R", "IF4 DAC R" },
37750e826e86SOder Chiou { "IB7 Mux", "STO1 ADC MIX R", "Stereo1 ADC MIXR" },
37760e826e86SOder Chiou { "IB7 Mux", "STO2 ADC MIX R", "Stereo2 ADC MIXR" },
37770e826e86SOder Chiou { "IB7 Mux", "STO3 ADC MIX R", "Stereo3 ADC MIXR" },
37780e826e86SOder Chiou
37790e826e86SOder Chiou { "IB8 Mux", "STO1 ADC MIX L", "Stereo1 ADC MIXL" },
37800e826e86SOder Chiou { "IB8 Mux", "STO2 ADC MIX L", "Stereo2 ADC MIXL" },
37810e826e86SOder Chiou { "IB8 Mux", "STO3 ADC MIX L", "Stereo3 ADC MIXL" },
37820e826e86SOder Chiou { "IB8 Mux", "STO4 ADC MIX L", "Stereo4 ADC MIXL" },
37830e826e86SOder Chiou { "IB8 Mux", "MONO ADC MIX L", "Mono ADC MIXL" },
37840e826e86SOder Chiou { "IB8 Mux", "DACL1 FS", "DAC1 MIXL" },
37850e826e86SOder Chiou
37860e826e86SOder Chiou { "IB9 Mux", "STO1 ADC MIX R", "Stereo1 ADC MIXR" },
37870e826e86SOder Chiou { "IB9 Mux", "STO2 ADC MIX R", "Stereo2 ADC MIXR" },
37880e826e86SOder Chiou { "IB9 Mux", "STO3 ADC MIX R", "Stereo3 ADC MIXR" },
37890e826e86SOder Chiou { "IB9 Mux", "STO4 ADC MIX R", "Stereo4 ADC MIXR" },
37900e826e86SOder Chiou { "IB9 Mux", "MONO ADC MIX R", "Mono ADC MIXR" },
37910e826e86SOder Chiou { "IB9 Mux", "DACR1 FS", "DAC1 MIXR" },
37920e826e86SOder Chiou { "IB9 Mux", "DAC1 FS", "DAC1 FS" },
37930e826e86SOder Chiou
37940e826e86SOder Chiou { "OB01 MIX", "IB01 Switch", "IB01 Bypass Mux" },
37950e826e86SOder Chiou { "OB01 MIX", "IB23 Switch", "IB23 Bypass Mux" },
37960e826e86SOder Chiou { "OB01 MIX", "IB45 Switch", "IB45 Bypass Mux" },
37970e826e86SOder Chiou { "OB01 MIX", "IB6 Switch", "IB6 Mux" },
37980e826e86SOder Chiou { "OB01 MIX", "IB7 Switch", "IB7 Mux" },
37990e826e86SOder Chiou { "OB01 MIX", "IB8 Switch", "IB8 Mux" },
38000e826e86SOder Chiou { "OB01 MIX", "IB9 Switch", "IB9 Mux" },
38010e826e86SOder Chiou
38020e826e86SOder Chiou { "OB23 MIX", "IB01 Switch", "IB01 Bypass Mux" },
38030e826e86SOder Chiou { "OB23 MIX", "IB23 Switch", "IB23 Bypass Mux" },
38040e826e86SOder Chiou { "OB23 MIX", "IB45 Switch", "IB45 Bypass Mux" },
38050e826e86SOder Chiou { "OB23 MIX", "IB6 Switch", "IB6 Mux" },
38060e826e86SOder Chiou { "OB23 MIX", "IB7 Switch", "IB7 Mux" },
38070e826e86SOder Chiou { "OB23 MIX", "IB8 Switch", "IB8 Mux" },
38080e826e86SOder Chiou { "OB23 MIX", "IB9 Switch", "IB9 Mux" },
38090e826e86SOder Chiou
38100e826e86SOder Chiou { "OB4 MIX", "IB01 Switch", "IB01 Bypass Mux" },
38110e826e86SOder Chiou { "OB4 MIX", "IB23 Switch", "IB23 Bypass Mux" },
38120e826e86SOder Chiou { "OB4 MIX", "IB45 Switch", "IB45 Bypass Mux" },
38130e826e86SOder Chiou { "OB4 MIX", "IB6 Switch", "IB6 Mux" },
38140e826e86SOder Chiou { "OB4 MIX", "IB7 Switch", "IB7 Mux" },
38150e826e86SOder Chiou { "OB4 MIX", "IB8 Switch", "IB8 Mux" },
38160e826e86SOder Chiou { "OB4 MIX", "IB9 Switch", "IB9 Mux" },
38170e826e86SOder Chiou
38180e826e86SOder Chiou { "OB5 MIX", "IB01 Switch", "IB01 Bypass Mux" },
38190e826e86SOder Chiou { "OB5 MIX", "IB23 Switch", "IB23 Bypass Mux" },
38200e826e86SOder Chiou { "OB5 MIX", "IB45 Switch", "IB45 Bypass Mux" },
38210e826e86SOder Chiou { "OB5 MIX", "IB6 Switch", "IB6 Mux" },
38220e826e86SOder Chiou { "OB5 MIX", "IB7 Switch", "IB7 Mux" },
38230e826e86SOder Chiou { "OB5 MIX", "IB8 Switch", "IB8 Mux" },
38240e826e86SOder Chiou { "OB5 MIX", "IB9 Switch", "IB9 Mux" },
38250e826e86SOder Chiou
38260e826e86SOder Chiou { "OB6 MIX", "IB01 Switch", "IB01 Bypass Mux" },
38270e826e86SOder Chiou { "OB6 MIX", "IB23 Switch", "IB23 Bypass Mux" },
38280e826e86SOder Chiou { "OB6 MIX", "IB45 Switch", "IB45 Bypass Mux" },
38290e826e86SOder Chiou { "OB6 MIX", "IB6 Switch", "IB6 Mux" },
38300e826e86SOder Chiou { "OB6 MIX", "IB7 Switch", "IB7 Mux" },
38310e826e86SOder Chiou { "OB6 MIX", "IB8 Switch", "IB8 Mux" },
38320e826e86SOder Chiou { "OB6 MIX", "IB9 Switch", "IB9 Mux" },
38330e826e86SOder Chiou
38340e826e86SOder Chiou { "OB7 MIX", "IB01 Switch", "IB01 Bypass Mux" },
38350e826e86SOder Chiou { "OB7 MIX", "IB23 Switch", "IB23 Bypass Mux" },
38360e826e86SOder Chiou { "OB7 MIX", "IB45 Switch", "IB45 Bypass Mux" },
38370e826e86SOder Chiou { "OB7 MIX", "IB6 Switch", "IB6 Mux" },
38380e826e86SOder Chiou { "OB7 MIX", "IB7 Switch", "IB7 Mux" },
38390e826e86SOder Chiou { "OB7 MIX", "IB8 Switch", "IB8 Mux" },
38400e826e86SOder Chiou { "OB7 MIX", "IB9 Switch", "IB9 Mux" },
38410e826e86SOder Chiou
38420e826e86SOder Chiou { "OB01 Bypass Mux", "Bypass", "OB01 MIX" },
38430e826e86SOder Chiou { "OB01 Bypass Mux", "Pass SRC", "OB01 MIX" },
38440e826e86SOder Chiou { "OB23 Bypass Mux", "Bypass", "OB23 MIX" },
38450e826e86SOder Chiou { "OB23 Bypass Mux", "Pass SRC", "OB23 MIX" },
38460e826e86SOder Chiou
38470e826e86SOder Chiou { "OutBound2", NULL, "OB23 Bypass Mux" },
38480e826e86SOder Chiou { "OutBound3", NULL, "OB23 Bypass Mux" },
38490e826e86SOder Chiou { "OutBound4", NULL, "OB4 MIX" },
38500e826e86SOder Chiou { "OutBound5", NULL, "OB5 MIX" },
38510e826e86SOder Chiou { "OutBound6", NULL, "OB6 MIX" },
38520e826e86SOder Chiou { "OutBound7", NULL, "OB7 MIX" },
38530e826e86SOder Chiou
38540e826e86SOder Chiou { "OB45", NULL, "OutBound4" },
38550e826e86SOder Chiou { "OB45", NULL, "OutBound5" },
38560e826e86SOder Chiou { "OB67", NULL, "OutBound6" },
38570e826e86SOder Chiou { "OB67", NULL, "OutBound7" },
38580e826e86SOder Chiou
38590e826e86SOder Chiou { "IF1 DAC0", NULL, "AIF1RX" },
38600e826e86SOder Chiou { "IF1 DAC1", NULL, "AIF1RX" },
38610e826e86SOder Chiou { "IF1 DAC2", NULL, "AIF1RX" },
38620e826e86SOder Chiou { "IF1 DAC3", NULL, "AIF1RX" },
38630e826e86SOder Chiou { "IF1 DAC4", NULL, "AIF1RX" },
38640e826e86SOder Chiou { "IF1 DAC5", NULL, "AIF1RX" },
38650e826e86SOder Chiou { "IF1 DAC6", NULL, "AIF1RX" },
38660e826e86SOder Chiou { "IF1 DAC7", NULL, "AIF1RX" },
38670e826e86SOder Chiou { "IF1 DAC0", NULL, "I2S1" },
38680e826e86SOder Chiou { "IF1 DAC1", NULL, "I2S1" },
38690e826e86SOder Chiou { "IF1 DAC2", NULL, "I2S1" },
38700e826e86SOder Chiou { "IF1 DAC3", NULL, "I2S1" },
38710e826e86SOder Chiou { "IF1 DAC4", NULL, "I2S1" },
38720e826e86SOder Chiou { "IF1 DAC5", NULL, "I2S1" },
38730e826e86SOder Chiou { "IF1 DAC6", NULL, "I2S1" },
38740e826e86SOder Chiou { "IF1 DAC7", NULL, "I2S1" },
38750e826e86SOder Chiou
387691159ecaSOder Chiou { "IF1 DAC0 Mux", "Slot0", "IF1 DAC0" },
387791159ecaSOder Chiou { "IF1 DAC0 Mux", "Slot1", "IF1 DAC1" },
387891159ecaSOder Chiou { "IF1 DAC0 Mux", "Slot2", "IF1 DAC2" },
387991159ecaSOder Chiou { "IF1 DAC0 Mux", "Slot3", "IF1 DAC3" },
388091159ecaSOder Chiou { "IF1 DAC0 Mux", "Slot4", "IF1 DAC4" },
388191159ecaSOder Chiou { "IF1 DAC0 Mux", "Slot5", "IF1 DAC5" },
388291159ecaSOder Chiou { "IF1 DAC0 Mux", "Slot6", "IF1 DAC6" },
388391159ecaSOder Chiou { "IF1 DAC0 Mux", "Slot7", "IF1 DAC7" },
388491159ecaSOder Chiou
388591159ecaSOder Chiou { "IF1 DAC1 Mux", "Slot0", "IF1 DAC0" },
388691159ecaSOder Chiou { "IF1 DAC1 Mux", "Slot1", "IF1 DAC1" },
388791159ecaSOder Chiou { "IF1 DAC1 Mux", "Slot2", "IF1 DAC2" },
388891159ecaSOder Chiou { "IF1 DAC1 Mux", "Slot3", "IF1 DAC3" },
388991159ecaSOder Chiou { "IF1 DAC1 Mux", "Slot4", "IF1 DAC4" },
389091159ecaSOder Chiou { "IF1 DAC1 Mux", "Slot5", "IF1 DAC5" },
389191159ecaSOder Chiou { "IF1 DAC1 Mux", "Slot6", "IF1 DAC6" },
389291159ecaSOder Chiou { "IF1 DAC1 Mux", "Slot7", "IF1 DAC7" },
389391159ecaSOder Chiou
389491159ecaSOder Chiou { "IF1 DAC2 Mux", "Slot0", "IF1 DAC0" },
389591159ecaSOder Chiou { "IF1 DAC2 Mux", "Slot1", "IF1 DAC1" },
389691159ecaSOder Chiou { "IF1 DAC2 Mux", "Slot2", "IF1 DAC2" },
389791159ecaSOder Chiou { "IF1 DAC2 Mux", "Slot3", "IF1 DAC3" },
389891159ecaSOder Chiou { "IF1 DAC2 Mux", "Slot4", "IF1 DAC4" },
389991159ecaSOder Chiou { "IF1 DAC2 Mux", "Slot5", "IF1 DAC5" },
390091159ecaSOder Chiou { "IF1 DAC2 Mux", "Slot6", "IF1 DAC6" },
390191159ecaSOder Chiou { "IF1 DAC2 Mux", "Slot7", "IF1 DAC7" },
390291159ecaSOder Chiou
390391159ecaSOder Chiou { "IF1 DAC3 Mux", "Slot0", "IF1 DAC0" },
390491159ecaSOder Chiou { "IF1 DAC3 Mux", "Slot1", "IF1 DAC1" },
390591159ecaSOder Chiou { "IF1 DAC3 Mux", "Slot2", "IF1 DAC2" },
390691159ecaSOder Chiou { "IF1 DAC3 Mux", "Slot3", "IF1 DAC3" },
390791159ecaSOder Chiou { "IF1 DAC3 Mux", "Slot4", "IF1 DAC4" },
390891159ecaSOder Chiou { "IF1 DAC3 Mux", "Slot5", "IF1 DAC5" },
390991159ecaSOder Chiou { "IF1 DAC3 Mux", "Slot6", "IF1 DAC6" },
391091159ecaSOder Chiou { "IF1 DAC3 Mux", "Slot7", "IF1 DAC7" },
391191159ecaSOder Chiou
391291159ecaSOder Chiou { "IF1 DAC4 Mux", "Slot0", "IF1 DAC0" },
391391159ecaSOder Chiou { "IF1 DAC4 Mux", "Slot1", "IF1 DAC1" },
391491159ecaSOder Chiou { "IF1 DAC4 Mux", "Slot2", "IF1 DAC2" },
391591159ecaSOder Chiou { "IF1 DAC4 Mux", "Slot3", "IF1 DAC3" },
391691159ecaSOder Chiou { "IF1 DAC4 Mux", "Slot4", "IF1 DAC4" },
391791159ecaSOder Chiou { "IF1 DAC4 Mux", "Slot5", "IF1 DAC5" },
391891159ecaSOder Chiou { "IF1 DAC4 Mux", "Slot6", "IF1 DAC6" },
391991159ecaSOder Chiou { "IF1 DAC4 Mux", "Slot7", "IF1 DAC7" },
392091159ecaSOder Chiou
392191159ecaSOder Chiou { "IF1 DAC5 Mux", "Slot0", "IF1 DAC0" },
392291159ecaSOder Chiou { "IF1 DAC5 Mux", "Slot1", "IF1 DAC1" },
392391159ecaSOder Chiou { "IF1 DAC5 Mux", "Slot2", "IF1 DAC2" },
392491159ecaSOder Chiou { "IF1 DAC5 Mux", "Slot3", "IF1 DAC3" },
392591159ecaSOder Chiou { "IF1 DAC5 Mux", "Slot4", "IF1 DAC4" },
392691159ecaSOder Chiou { "IF1 DAC5 Mux", "Slot5", "IF1 DAC5" },
392791159ecaSOder Chiou { "IF1 DAC5 Mux", "Slot6", "IF1 DAC6" },
392891159ecaSOder Chiou { "IF1 DAC5 Mux", "Slot7", "IF1 DAC7" },
392991159ecaSOder Chiou
393091159ecaSOder Chiou { "IF1 DAC6 Mux", "Slot0", "IF1 DAC0" },
393191159ecaSOder Chiou { "IF1 DAC6 Mux", "Slot1", "IF1 DAC1" },
393291159ecaSOder Chiou { "IF1 DAC6 Mux", "Slot2", "IF1 DAC2" },
393391159ecaSOder Chiou { "IF1 DAC6 Mux", "Slot3", "IF1 DAC3" },
393491159ecaSOder Chiou { "IF1 DAC6 Mux", "Slot4", "IF1 DAC4" },
393591159ecaSOder Chiou { "IF1 DAC6 Mux", "Slot5", "IF1 DAC5" },
393691159ecaSOder Chiou { "IF1 DAC6 Mux", "Slot6", "IF1 DAC6" },
393791159ecaSOder Chiou { "IF1 DAC6 Mux", "Slot7", "IF1 DAC7" },
393891159ecaSOder Chiou
393991159ecaSOder Chiou { "IF1 DAC7 Mux", "Slot0", "IF1 DAC0" },
394091159ecaSOder Chiou { "IF1 DAC7 Mux", "Slot1", "IF1 DAC1" },
394191159ecaSOder Chiou { "IF1 DAC7 Mux", "Slot2", "IF1 DAC2" },
394291159ecaSOder Chiou { "IF1 DAC7 Mux", "Slot3", "IF1 DAC3" },
394391159ecaSOder Chiou { "IF1 DAC7 Mux", "Slot4", "IF1 DAC4" },
394491159ecaSOder Chiou { "IF1 DAC7 Mux", "Slot5", "IF1 DAC5" },
394591159ecaSOder Chiou { "IF1 DAC7 Mux", "Slot6", "IF1 DAC6" },
394691159ecaSOder Chiou { "IF1 DAC7 Mux", "Slot7", "IF1 DAC7" },
394791159ecaSOder Chiou
394891159ecaSOder Chiou { "IF1 DAC01", NULL, "IF1 DAC0 Mux" },
394991159ecaSOder Chiou { "IF1 DAC01", NULL, "IF1 DAC1 Mux" },
395091159ecaSOder Chiou { "IF1 DAC23", NULL, "IF1 DAC2 Mux" },
395191159ecaSOder Chiou { "IF1 DAC23", NULL, "IF1 DAC3 Mux" },
395291159ecaSOder Chiou { "IF1 DAC45", NULL, "IF1 DAC4 Mux" },
395391159ecaSOder Chiou { "IF1 DAC45", NULL, "IF1 DAC5 Mux" },
395491159ecaSOder Chiou { "IF1 DAC67", NULL, "IF1 DAC6 Mux" },
395591159ecaSOder Chiou { "IF1 DAC67", NULL, "IF1 DAC7 Mux" },
39560e826e86SOder Chiou
39570e826e86SOder Chiou { "IF2 DAC0", NULL, "AIF2RX" },
39580e826e86SOder Chiou { "IF2 DAC1", NULL, "AIF2RX" },
39590e826e86SOder Chiou { "IF2 DAC2", NULL, "AIF2RX" },
39600e826e86SOder Chiou { "IF2 DAC3", NULL, "AIF2RX" },
39610e826e86SOder Chiou { "IF2 DAC4", NULL, "AIF2RX" },
39620e826e86SOder Chiou { "IF2 DAC5", NULL, "AIF2RX" },
39630e826e86SOder Chiou { "IF2 DAC6", NULL, "AIF2RX" },
39640e826e86SOder Chiou { "IF2 DAC7", NULL, "AIF2RX" },
39650e826e86SOder Chiou { "IF2 DAC0", NULL, "I2S2" },
39660e826e86SOder Chiou { "IF2 DAC1", NULL, "I2S2" },
39670e826e86SOder Chiou { "IF2 DAC2", NULL, "I2S2" },
39680e826e86SOder Chiou { "IF2 DAC3", NULL, "I2S2" },
39690e826e86SOder Chiou { "IF2 DAC4", NULL, "I2S2" },
39700e826e86SOder Chiou { "IF2 DAC5", NULL, "I2S2" },
39710e826e86SOder Chiou { "IF2 DAC6", NULL, "I2S2" },
39720e826e86SOder Chiou { "IF2 DAC7", NULL, "I2S2" },
39730e826e86SOder Chiou
397491159ecaSOder Chiou { "IF2 DAC0 Mux", "Slot0", "IF2 DAC0" },
397591159ecaSOder Chiou { "IF2 DAC0 Mux", "Slot1", "IF2 DAC1" },
397691159ecaSOder Chiou { "IF2 DAC0 Mux", "Slot2", "IF2 DAC2" },
397791159ecaSOder Chiou { "IF2 DAC0 Mux", "Slot3", "IF2 DAC3" },
397891159ecaSOder Chiou { "IF2 DAC0 Mux", "Slot4", "IF2 DAC4" },
397991159ecaSOder Chiou { "IF2 DAC0 Mux", "Slot5", "IF2 DAC5" },
398091159ecaSOder Chiou { "IF2 DAC0 Mux", "Slot6", "IF2 DAC6" },
398191159ecaSOder Chiou { "IF2 DAC0 Mux", "Slot7", "IF2 DAC7" },
398291159ecaSOder Chiou
398391159ecaSOder Chiou { "IF2 DAC1 Mux", "Slot0", "IF2 DAC0" },
398491159ecaSOder Chiou { "IF2 DAC1 Mux", "Slot1", "IF2 DAC1" },
398591159ecaSOder Chiou { "IF2 DAC1 Mux", "Slot2", "IF2 DAC2" },
398691159ecaSOder Chiou { "IF2 DAC1 Mux", "Slot3", "IF2 DAC3" },
398791159ecaSOder Chiou { "IF2 DAC1 Mux", "Slot4", "IF2 DAC4" },
398891159ecaSOder Chiou { "IF2 DAC1 Mux", "Slot5", "IF2 DAC5" },
398991159ecaSOder Chiou { "IF2 DAC1 Mux", "Slot6", "IF2 DAC6" },
399091159ecaSOder Chiou { "IF2 DAC1 Mux", "Slot7", "IF2 DAC7" },
399191159ecaSOder Chiou
399291159ecaSOder Chiou { "IF2 DAC2 Mux", "Slot0", "IF2 DAC0" },
399391159ecaSOder Chiou { "IF2 DAC2 Mux", "Slot1", "IF2 DAC1" },
399491159ecaSOder Chiou { "IF2 DAC2 Mux", "Slot2", "IF2 DAC2" },
399591159ecaSOder Chiou { "IF2 DAC2 Mux", "Slot3", "IF2 DAC3" },
399691159ecaSOder Chiou { "IF2 DAC2 Mux", "Slot4", "IF2 DAC4" },
399791159ecaSOder Chiou { "IF2 DAC2 Mux", "Slot5", "IF2 DAC5" },
399891159ecaSOder Chiou { "IF2 DAC2 Mux", "Slot6", "IF2 DAC6" },
399991159ecaSOder Chiou { "IF2 DAC2 Mux", "Slot7", "IF2 DAC7" },
400091159ecaSOder Chiou
400191159ecaSOder Chiou { "IF2 DAC3 Mux", "Slot0", "IF2 DAC0" },
400291159ecaSOder Chiou { "IF2 DAC3 Mux", "Slot1", "IF2 DAC1" },
400391159ecaSOder Chiou { "IF2 DAC3 Mux", "Slot2", "IF2 DAC2" },
400491159ecaSOder Chiou { "IF2 DAC3 Mux", "Slot3", "IF2 DAC3" },
400591159ecaSOder Chiou { "IF2 DAC3 Mux", "Slot4", "IF2 DAC4" },
400691159ecaSOder Chiou { "IF2 DAC3 Mux", "Slot5", "IF2 DAC5" },
400791159ecaSOder Chiou { "IF2 DAC3 Mux", "Slot6", "IF2 DAC6" },
400891159ecaSOder Chiou { "IF2 DAC3 Mux", "Slot7", "IF2 DAC7" },
400991159ecaSOder Chiou
401091159ecaSOder Chiou { "IF2 DAC4 Mux", "Slot0", "IF2 DAC0" },
401191159ecaSOder Chiou { "IF2 DAC4 Mux", "Slot1", "IF2 DAC1" },
401291159ecaSOder Chiou { "IF2 DAC4 Mux", "Slot2", "IF2 DAC2" },
401391159ecaSOder Chiou { "IF2 DAC4 Mux", "Slot3", "IF2 DAC3" },
401491159ecaSOder Chiou { "IF2 DAC4 Mux", "Slot4", "IF2 DAC4" },
401591159ecaSOder Chiou { "IF2 DAC4 Mux", "Slot5", "IF2 DAC5" },
401691159ecaSOder Chiou { "IF2 DAC4 Mux", "Slot6", "IF2 DAC6" },
401791159ecaSOder Chiou { "IF2 DAC4 Mux", "Slot7", "IF2 DAC7" },
401891159ecaSOder Chiou
401991159ecaSOder Chiou { "IF2 DAC5 Mux", "Slot0", "IF2 DAC0" },
402091159ecaSOder Chiou { "IF2 DAC5 Mux", "Slot1", "IF2 DAC1" },
402191159ecaSOder Chiou { "IF2 DAC5 Mux", "Slot2", "IF2 DAC2" },
402291159ecaSOder Chiou { "IF2 DAC5 Mux", "Slot3", "IF2 DAC3" },
402391159ecaSOder Chiou { "IF2 DAC5 Mux", "Slot4", "IF2 DAC4" },
402491159ecaSOder Chiou { "IF2 DAC5 Mux", "Slot5", "IF2 DAC5" },
402591159ecaSOder Chiou { "IF2 DAC5 Mux", "Slot6", "IF2 DAC6" },
402691159ecaSOder Chiou { "IF2 DAC5 Mux", "Slot7", "IF2 DAC7" },
402791159ecaSOder Chiou
402891159ecaSOder Chiou { "IF2 DAC6 Mux", "Slot0", "IF2 DAC0" },
402991159ecaSOder Chiou { "IF2 DAC6 Mux", "Slot1", "IF2 DAC1" },
403091159ecaSOder Chiou { "IF2 DAC6 Mux", "Slot2", "IF2 DAC2" },
403191159ecaSOder Chiou { "IF2 DAC6 Mux", "Slot3", "IF2 DAC3" },
403291159ecaSOder Chiou { "IF2 DAC6 Mux", "Slot4", "IF2 DAC4" },
403391159ecaSOder Chiou { "IF2 DAC6 Mux", "Slot5", "IF2 DAC5" },
403491159ecaSOder Chiou { "IF2 DAC6 Mux", "Slot6", "IF2 DAC6" },
403591159ecaSOder Chiou { "IF2 DAC6 Mux", "Slot7", "IF2 DAC7" },
403691159ecaSOder Chiou
403791159ecaSOder Chiou { "IF2 DAC7 Mux", "Slot0", "IF2 DAC0" },
403891159ecaSOder Chiou { "IF2 DAC7 Mux", "Slot1", "IF2 DAC1" },
403991159ecaSOder Chiou { "IF2 DAC7 Mux", "Slot2", "IF2 DAC2" },
404091159ecaSOder Chiou { "IF2 DAC7 Mux", "Slot3", "IF2 DAC3" },
404191159ecaSOder Chiou { "IF2 DAC7 Mux", "Slot4", "IF2 DAC4" },
404291159ecaSOder Chiou { "IF2 DAC7 Mux", "Slot5", "IF2 DAC5" },
404391159ecaSOder Chiou { "IF2 DAC7 Mux", "Slot6", "IF2 DAC6" },
404491159ecaSOder Chiou { "IF2 DAC7 Mux", "Slot7", "IF2 DAC7" },
404591159ecaSOder Chiou
404691159ecaSOder Chiou { "IF2 DAC01", NULL, "IF2 DAC0 Mux" },
404791159ecaSOder Chiou { "IF2 DAC01", NULL, "IF2 DAC1 Mux" },
404891159ecaSOder Chiou { "IF2 DAC23", NULL, "IF2 DAC2 Mux" },
404991159ecaSOder Chiou { "IF2 DAC23", NULL, "IF2 DAC3 Mux" },
405091159ecaSOder Chiou { "IF2 DAC45", NULL, "IF2 DAC4 Mux" },
405191159ecaSOder Chiou { "IF2 DAC45", NULL, "IF2 DAC5 Mux" },
405291159ecaSOder Chiou { "IF2 DAC67", NULL, "IF2 DAC6 Mux" },
405391159ecaSOder Chiou { "IF2 DAC67", NULL, "IF2 DAC7 Mux" },
40540e826e86SOder Chiou
40550e826e86SOder Chiou { "IF3 DAC", NULL, "AIF3RX" },
40560e826e86SOder Chiou { "IF3 DAC", NULL, "I2S3" },
40570e826e86SOder Chiou
40580e826e86SOder Chiou { "IF4 DAC", NULL, "AIF4RX" },
40590e826e86SOder Chiou { "IF4 DAC", NULL, "I2S4" },
40600e826e86SOder Chiou
40610e826e86SOder Chiou { "IF3 DAC L", NULL, "IF3 DAC" },
40620e826e86SOder Chiou { "IF3 DAC R", NULL, "IF3 DAC" },
40630e826e86SOder Chiou
40640e826e86SOder Chiou { "IF4 DAC L", NULL, "IF4 DAC" },
40650e826e86SOder Chiou { "IF4 DAC R", NULL, "IF4 DAC" },
40660e826e86SOder Chiou
40670e826e86SOder Chiou { "SLB DAC0", NULL, "SLBRX" },
40680e826e86SOder Chiou { "SLB DAC1", NULL, "SLBRX" },
40690e826e86SOder Chiou { "SLB DAC2", NULL, "SLBRX" },
40700e826e86SOder Chiou { "SLB DAC3", NULL, "SLBRX" },
40710e826e86SOder Chiou { "SLB DAC4", NULL, "SLBRX" },
40720e826e86SOder Chiou { "SLB DAC5", NULL, "SLBRX" },
40730e826e86SOder Chiou { "SLB DAC6", NULL, "SLBRX" },
40740e826e86SOder Chiou { "SLB DAC7", NULL, "SLBRX" },
40750e826e86SOder Chiou { "SLB DAC0", NULL, "SLB" },
40760e826e86SOder Chiou { "SLB DAC1", NULL, "SLB" },
40770e826e86SOder Chiou { "SLB DAC2", NULL, "SLB" },
40780e826e86SOder Chiou { "SLB DAC3", NULL, "SLB" },
40790e826e86SOder Chiou { "SLB DAC4", NULL, "SLB" },
40800e826e86SOder Chiou { "SLB DAC5", NULL, "SLB" },
40810e826e86SOder Chiou { "SLB DAC6", NULL, "SLB" },
40820e826e86SOder Chiou { "SLB DAC7", NULL, "SLB" },
40830e826e86SOder Chiou
40840e826e86SOder Chiou { "SLB DAC01", NULL, "SLB DAC0" },
40850e826e86SOder Chiou { "SLB DAC01", NULL, "SLB DAC1" },
40860e826e86SOder Chiou { "SLB DAC23", NULL, "SLB DAC2" },
40870e826e86SOder Chiou { "SLB DAC23", NULL, "SLB DAC3" },
40880e826e86SOder Chiou { "SLB DAC45", NULL, "SLB DAC4" },
40890e826e86SOder Chiou { "SLB DAC45", NULL, "SLB DAC5" },
40900e826e86SOder Chiou { "SLB DAC67", NULL, "SLB DAC6" },
40910e826e86SOder Chiou { "SLB DAC67", NULL, "SLB DAC7" },
40920e826e86SOder Chiou
40930e826e86SOder Chiou { "ADDA1 Mux", "STO1 ADC MIX", "Stereo1 ADC MIX" },
40940e826e86SOder Chiou { "ADDA1 Mux", "STO2 ADC MIX", "Stereo2 ADC MIX" },
40950e826e86SOder Chiou { "ADDA1 Mux", "OB 67", "OB67" },
40960e826e86SOder Chiou
40970e826e86SOder Chiou { "DAC1 Mux", "IF1 DAC 01", "IF1 DAC01" },
40980e826e86SOder Chiou { "DAC1 Mux", "IF2 DAC 01", "IF2 DAC01" },
40990e826e86SOder Chiou { "DAC1 Mux", "IF3 DAC LR", "IF3 DAC" },
41000e826e86SOder Chiou { "DAC1 Mux", "IF4 DAC LR", "IF4 DAC" },
41010e826e86SOder Chiou { "DAC1 Mux", "SLB DAC 01", "SLB DAC01" },
41020e826e86SOder Chiou { "DAC1 Mux", "OB 01", "OB01 Bypass Mux" },
41030e826e86SOder Chiou
41040e826e86SOder Chiou { "DAC1 MIXL", "Stereo ADC Switch", "ADDA1 Mux" },
41050e826e86SOder Chiou { "DAC1 MIXL", "DAC1 Switch", "DAC1 Mux" },
41060e826e86SOder Chiou { "DAC1 MIXR", "Stereo ADC Switch", "ADDA1 Mux" },
41070e826e86SOder Chiou { "DAC1 MIXR", "DAC1 Switch", "DAC1 Mux" },
41080e826e86SOder Chiou
41090e826e86SOder Chiou { "DAC1 FS", NULL, "DAC1 MIXL" },
41100e826e86SOder Chiou { "DAC1 FS", NULL, "DAC1 MIXR" },
41110e826e86SOder Chiou
411270068776SOder Chiou { "DAC2 L Mux", "IF1 DAC 2", "IF1 DAC2 Mux" },
411370068776SOder Chiou { "DAC2 L Mux", "IF2 DAC 2", "IF2 DAC2 Mux" },
41140e826e86SOder Chiou { "DAC2 L Mux", "IF3 DAC L", "IF3 DAC L" },
41150e826e86SOder Chiou { "DAC2 L Mux", "IF4 DAC L", "IF4 DAC L" },
41160e826e86SOder Chiou { "DAC2 L Mux", "SLB DAC 2", "SLB DAC2" },
41170e826e86SOder Chiou { "DAC2 L Mux", "OB 2", "OutBound2" },
41180e826e86SOder Chiou
411970068776SOder Chiou { "DAC2 R Mux", "IF1 DAC 3", "IF1 DAC3 Mux" },
412070068776SOder Chiou { "DAC2 R Mux", "IF2 DAC 3", "IF2 DAC3 Mux" },
41210e826e86SOder Chiou { "DAC2 R Mux", "IF3 DAC R", "IF3 DAC R" },
41220e826e86SOder Chiou { "DAC2 R Mux", "IF4 DAC R", "IF4 DAC R" },
41230e826e86SOder Chiou { "DAC2 R Mux", "SLB DAC 3", "SLB DAC3" },
41240e826e86SOder Chiou { "DAC2 R Mux", "OB 3", "OutBound3" },
41250e826e86SOder Chiou { "DAC2 R Mux", "Haptic Generator", "Haptic Generator" },
41260e826e86SOder Chiou { "DAC2 R Mux", "VAD ADC", "VAD ADC Mux" },
41270e826e86SOder Chiou
412870068776SOder Chiou { "DAC3 L Mux", "IF1 DAC 4", "IF1 DAC4 Mux" },
412970068776SOder Chiou { "DAC3 L Mux", "IF2 DAC 4", "IF2 DAC4 Mux" },
41300e826e86SOder Chiou { "DAC3 L Mux", "IF3 DAC L", "IF3 DAC L" },
41310e826e86SOder Chiou { "DAC3 L Mux", "IF4 DAC L", "IF4 DAC L" },
41320e826e86SOder Chiou { "DAC3 L Mux", "SLB DAC 4", "SLB DAC4" },
41330e826e86SOder Chiou { "DAC3 L Mux", "OB 4", "OutBound4" },
41340e826e86SOder Chiou
413570068776SOder Chiou { "DAC3 R Mux", "IF1 DAC 5", "IF1 DAC5 Mux" },
413670068776SOder Chiou { "DAC3 R Mux", "IF2 DAC 5", "IF2 DAC5 Mux" },
41370e826e86SOder Chiou { "DAC3 R Mux", "IF3 DAC R", "IF3 DAC R" },
41380e826e86SOder Chiou { "DAC3 R Mux", "IF4 DAC R", "IF4 DAC R" },
41390e826e86SOder Chiou { "DAC3 R Mux", "SLB DAC 5", "SLB DAC5" },
41400e826e86SOder Chiou { "DAC3 R Mux", "OB 5", "OutBound5" },
41410e826e86SOder Chiou
414270068776SOder Chiou { "DAC4 L Mux", "IF1 DAC 6", "IF1 DAC6 Mux" },
414370068776SOder Chiou { "DAC4 L Mux", "IF2 DAC 6", "IF2 DAC6 Mux" },
41440e826e86SOder Chiou { "DAC4 L Mux", "IF3 DAC L", "IF3 DAC L" },
41450e826e86SOder Chiou { "DAC4 L Mux", "IF4 DAC L", "IF4 DAC L" },
41460e826e86SOder Chiou { "DAC4 L Mux", "SLB DAC 6", "SLB DAC6" },
41470e826e86SOder Chiou { "DAC4 L Mux", "OB 6", "OutBound6" },
41480e826e86SOder Chiou
414970068776SOder Chiou { "DAC4 R Mux", "IF1 DAC 7", "IF1 DAC7 Mux" },
415070068776SOder Chiou { "DAC4 R Mux", "IF2 DAC 7", "IF2 DAC7 Mux" },
41510e826e86SOder Chiou { "DAC4 R Mux", "IF3 DAC R", "IF3 DAC R" },
41520e826e86SOder Chiou { "DAC4 R Mux", "IF4 DAC R", "IF4 DAC R" },
41530e826e86SOder Chiou { "DAC4 R Mux", "SLB DAC 7", "SLB DAC7" },
41540e826e86SOder Chiou { "DAC4 R Mux", "OB 7", "OutBound7" },
41550e826e86SOder Chiou
41560e826e86SOder Chiou { "Sidetone Mux", "DMIC1 L", "DMIC L1" },
41570e826e86SOder Chiou { "Sidetone Mux", "DMIC2 L", "DMIC L2" },
41580e826e86SOder Chiou { "Sidetone Mux", "DMIC3 L", "DMIC L3" },
41590e826e86SOder Chiou { "Sidetone Mux", "DMIC4 L", "DMIC L4" },
41600e826e86SOder Chiou { "Sidetone Mux", "ADC1", "ADC 1" },
41610e826e86SOder Chiou { "Sidetone Mux", "ADC2", "ADC 2" },
416290bdbb46SOder Chiou { "Sidetone Mux", NULL, "Sidetone Power" },
41630e826e86SOder Chiou
41640e826e86SOder Chiou { "Stereo DAC MIXL", "ST L Switch", "Sidetone Mux" },
41650e826e86SOder Chiou { "Stereo DAC MIXL", "DAC1 L Switch", "DAC1 MIXL" },
41660e826e86SOder Chiou { "Stereo DAC MIXL", "DAC2 L Switch", "DAC2 L Mux" },
41670e826e86SOder Chiou { "Stereo DAC MIXL", "DAC1 R Switch", "DAC1 MIXR" },
41680e826e86SOder Chiou { "Stereo DAC MIXL", NULL, "dac stereo1 filter" },
41690e826e86SOder Chiou { "Stereo DAC MIXR", "ST R Switch", "Sidetone Mux" },
41700e826e86SOder Chiou { "Stereo DAC MIXR", "DAC1 R Switch", "DAC1 MIXR" },
41710e826e86SOder Chiou { "Stereo DAC MIXR", "DAC2 R Switch", "DAC2 R Mux" },
41720e826e86SOder Chiou { "Stereo DAC MIXR", "DAC1 L Switch", "DAC1 MIXL" },
41730e826e86SOder Chiou { "Stereo DAC MIXR", NULL, "dac stereo1 filter" },
417438d595e2SOder Chiou { "dac stereo1 filter", NULL, "PLL1", is_sys_clk_from_pll },
41750e826e86SOder Chiou
41760e826e86SOder Chiou { "Mono DAC MIXL", "ST L Switch", "Sidetone Mux" },
41770e826e86SOder Chiou { "Mono DAC MIXL", "DAC1 L Switch", "DAC1 MIXL" },
41780e826e86SOder Chiou { "Mono DAC MIXL", "DAC2 L Switch", "DAC2 L Mux" },
41790e826e86SOder Chiou { "Mono DAC MIXL", "DAC2 R Switch", "DAC2 R Mux" },
41806800b5baSOder Chiou { "Mono DAC MIXL", NULL, "dac mono2 left filter" },
418138d595e2SOder Chiou { "dac mono2 left filter", NULL, "PLL1", is_sys_clk_from_pll },
41820e826e86SOder Chiou { "Mono DAC MIXR", "ST R Switch", "Sidetone Mux" },
41830e826e86SOder Chiou { "Mono DAC MIXR", "DAC1 R Switch", "DAC1 MIXR" },
41840e826e86SOder Chiou { "Mono DAC MIXR", "DAC2 R Switch", "DAC2 R Mux" },
41850e826e86SOder Chiou { "Mono DAC MIXR", "DAC2 L Switch", "DAC2 L Mux" },
41866800b5baSOder Chiou { "Mono DAC MIXR", NULL, "dac mono2 right filter" },
418738d595e2SOder Chiou { "dac mono2 right filter", NULL, "PLL1", is_sys_clk_from_pll },
41880e826e86SOder Chiou
41890e826e86SOder Chiou { "DD1 MIXL", "Sto DAC Mix L Switch", "Stereo DAC MIXL" },
41900e826e86SOder Chiou { "DD1 MIXL", "Mono DAC Mix L Switch", "Mono DAC MIXL" },
41910e826e86SOder Chiou { "DD1 MIXL", "DAC3 L Switch", "DAC3 L Mux" },
41920e826e86SOder Chiou { "DD1 MIXL", "DAC3 R Switch", "DAC3 R Mux" },
41936800b5baSOder Chiou { "DD1 MIXL", NULL, "dac mono3 left filter" },
419438d595e2SOder Chiou { "dac mono3 left filter", NULL, "PLL1", is_sys_clk_from_pll },
41950e826e86SOder Chiou { "DD1 MIXR", "Sto DAC Mix R Switch", "Stereo DAC MIXR" },
41960e826e86SOder Chiou { "DD1 MIXR", "Mono DAC Mix R Switch", "Mono DAC MIXR" },
41970e826e86SOder Chiou { "DD1 MIXR", "DAC3 L Switch", "DAC3 L Mux" },
41980e826e86SOder Chiou { "DD1 MIXR", "DAC3 R Switch", "DAC3 R Mux" },
41996800b5baSOder Chiou { "DD1 MIXR", NULL, "dac mono3 right filter" },
420038d595e2SOder Chiou { "dac mono3 right filter", NULL, "PLL1", is_sys_clk_from_pll },
42010e826e86SOder Chiou
42020e826e86SOder Chiou { "DD2 MIXL", "Sto DAC Mix L Switch", "Stereo DAC MIXL" },
42030e826e86SOder Chiou { "DD2 MIXL", "Mono DAC Mix L Switch", "Mono DAC MIXL" },
42040e826e86SOder Chiou { "DD2 MIXL", "DAC4 L Switch", "DAC4 L Mux" },
42050e826e86SOder Chiou { "DD2 MIXL", "DAC4 R Switch", "DAC4 R Mux" },
42066800b5baSOder Chiou { "DD2 MIXL", NULL, "dac mono4 left filter" },
420738d595e2SOder Chiou { "dac mono4 left filter", NULL, "PLL1", is_sys_clk_from_pll },
42080e826e86SOder Chiou { "DD2 MIXR", "Sto DAC Mix R Switch", "Stereo DAC MIXR" },
42090e826e86SOder Chiou { "DD2 MIXR", "Mono DAC Mix R Switch", "Mono DAC MIXR" },
42100e826e86SOder Chiou { "DD2 MIXR", "DAC4 L Switch", "DAC4 L Mux" },
42110e826e86SOder Chiou { "DD2 MIXR", "DAC4 R Switch", "DAC4 R Mux" },
42126800b5baSOder Chiou { "DD2 MIXR", NULL, "dac mono4 right filter" },
421338d595e2SOder Chiou { "dac mono4 right filter", NULL, "PLL1", is_sys_clk_from_pll },
42140e826e86SOder Chiou
42150e826e86SOder Chiou { "Stereo DAC MIX", NULL, "Stereo DAC MIXL" },
42160e826e86SOder Chiou { "Stereo DAC MIX", NULL, "Stereo DAC MIXR" },
42170e826e86SOder Chiou { "Mono DAC MIX", NULL, "Mono DAC MIXL" },
42180e826e86SOder Chiou { "Mono DAC MIX", NULL, "Mono DAC MIXR" },
42190e826e86SOder Chiou { "DD1 MIX", NULL, "DD1 MIXL" },
42200e826e86SOder Chiou { "DD1 MIX", NULL, "DD1 MIXR" },
42210e826e86SOder Chiou { "DD2 MIX", NULL, "DD2 MIXL" },
42220e826e86SOder Chiou { "DD2 MIX", NULL, "DD2 MIXR" },
42230e826e86SOder Chiou
42240e826e86SOder Chiou { "DAC12 SRC Mux", "STO1 DAC MIX", "Stereo DAC MIX" },
42250e826e86SOder Chiou { "DAC12 SRC Mux", "MONO DAC MIX", "Mono DAC MIX" },
42260e826e86SOder Chiou { "DAC12 SRC Mux", "DD MIX1", "DD1 MIX" },
42270e826e86SOder Chiou { "DAC12 SRC Mux", "DD MIX2", "DD2 MIX" },
42280e826e86SOder Chiou
42290e826e86SOder Chiou { "DAC3 SRC Mux", "MONO DAC MIXL", "Mono DAC MIXL" },
42300e826e86SOder Chiou { "DAC3 SRC Mux", "MONO DAC MIXR", "Mono DAC MIXR" },
42310e826e86SOder Chiou { "DAC3 SRC Mux", "DD MIX1L", "DD1 MIXL" },
42320e826e86SOder Chiou { "DAC3 SRC Mux", "DD MIX2L", "DD2 MIXL" },
42330e826e86SOder Chiou
42340e826e86SOder Chiou { "DAC 1", NULL, "DAC12 SRC Mux" },
42350e826e86SOder Chiou { "DAC 2", NULL, "DAC12 SRC Mux" },
42360e826e86SOder Chiou { "DAC 3", NULL, "DAC3 SRC Mux" },
42370e826e86SOder Chiou
42380e826e86SOder Chiou { "PDM1 L Mux", "STO1 DAC MIX", "Stereo DAC MIXL" },
42390e826e86SOder Chiou { "PDM1 L Mux", "MONO DAC MIX", "Mono DAC MIXL" },
42400e826e86SOder Chiou { "PDM1 L Mux", "DD MIX1", "DD1 MIXL" },
42410e826e86SOder Chiou { "PDM1 L Mux", "DD MIX2", "DD2 MIXL" },
42420e826e86SOder Chiou { "PDM1 L Mux", NULL, "PDM1 Power" },
42430e826e86SOder Chiou { "PDM1 R Mux", "STO1 DAC MIX", "Stereo DAC MIXR" },
42440e826e86SOder Chiou { "PDM1 R Mux", "MONO DAC MIX", "Mono DAC MIXR" },
42450e826e86SOder Chiou { "PDM1 R Mux", "DD MIX1", "DD1 MIXR" },
42460e826e86SOder Chiou { "PDM1 R Mux", "DD MIX2", "DD2 MIXR" },
42470e826e86SOder Chiou { "PDM1 R Mux", NULL, "PDM1 Power" },
42480e826e86SOder Chiou { "PDM2 L Mux", "STO1 DAC MIX", "Stereo DAC MIXL" },
42490e826e86SOder Chiou { "PDM2 L Mux", "MONO DAC MIX", "Mono DAC MIXL" },
42500e826e86SOder Chiou { "PDM2 L Mux", "DD MIX1", "DD1 MIXL" },
42510e826e86SOder Chiou { "PDM2 L Mux", "DD MIX2", "DD2 MIXL" },
42520e826e86SOder Chiou { "PDM2 L Mux", NULL, "PDM2 Power" },
42530e826e86SOder Chiou { "PDM2 R Mux", "STO1 DAC MIX", "Stereo DAC MIXR" },
42540e826e86SOder Chiou { "PDM2 R Mux", "MONO DAC MIX", "Mono DAC MIXR" },
42550e826e86SOder Chiou { "PDM2 R Mux", "DD MIX1", "DD1 MIXR" },
42560e826e86SOder Chiou { "PDM2 R Mux", "DD MIX1", "DD2 MIXR" },
42570e826e86SOder Chiou { "PDM2 R Mux", NULL, "PDM2 Power" },
42580e826e86SOder Chiou
42590e826e86SOder Chiou { "LOUT1 amp", NULL, "DAC 1" },
42600e826e86SOder Chiou { "LOUT2 amp", NULL, "DAC 2" },
42610e826e86SOder Chiou { "LOUT3 amp", NULL, "DAC 3" },
42620e826e86SOder Chiou
4263683996cbSOder Chiou { "LOUT1 vref", NULL, "LOUT1 amp" },
4264683996cbSOder Chiou { "LOUT2 vref", NULL, "LOUT2 amp" },
4265683996cbSOder Chiou { "LOUT3 vref", NULL, "LOUT3 amp" },
4266683996cbSOder Chiou
4267683996cbSOder Chiou { "LOUT1", NULL, "LOUT1 vref" },
4268683996cbSOder Chiou { "LOUT2", NULL, "LOUT2 vref" },
4269683996cbSOder Chiou { "LOUT3", NULL, "LOUT3 vref" },
42700e826e86SOder Chiou
42710e826e86SOder Chiou { "PDM1L", NULL, "PDM1 L Mux" },
42720e826e86SOder Chiou { "PDM1R", NULL, "PDM1 R Mux" },
42730e826e86SOder Chiou { "PDM2L", NULL, "PDM2 L Mux" },
42740e826e86SOder Chiou { "PDM2R", NULL, "PDM2 R Mux" },
42750e826e86SOder Chiou };
42760e826e86SOder Chiou
42772d15d974SBard Liao static const struct snd_soc_dapm_route rt5677_dmic2_clk_1[] = {
42782d15d974SBard Liao { "DMIC L2", NULL, "DMIC1 power" },
42792d15d974SBard Liao { "DMIC R2", NULL, "DMIC1 power" },
42802d15d974SBard Liao };
42812d15d974SBard Liao
42822d15d974SBard Liao static const struct snd_soc_dapm_route rt5677_dmic2_clk_2[] = {
42832d15d974SBard Liao { "DMIC L2", NULL, "DMIC2 power" },
42842d15d974SBard Liao { "DMIC R2", NULL, "DMIC2 power" },
42852d15d974SBard Liao };
42862d15d974SBard Liao
rt5677_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params,struct snd_soc_dai * dai)42870e826e86SOder Chiou static int rt5677_hw_params(struct snd_pcm_substream *substream,
42880e826e86SOder Chiou struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
42890e826e86SOder Chiou {
429079223bf1SKuninori Morimoto struct snd_soc_component *component = dai->component;
429179223bf1SKuninori Morimoto struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
42920e826e86SOder Chiou unsigned int val_len = 0, val_clk, mask_clk;
42930e826e86SOder Chiou int pre_div, bclk_ms, frame_size;
42940e826e86SOder Chiou
42950e826e86SOder Chiou rt5677->lrck[dai->id] = params_rate(params);
429630f14b43SAxel Lin pre_div = rl6231_get_clk_info(rt5677->sysclk, rt5677->lrck[dai->id]);
42970e826e86SOder Chiou if (pre_div < 0) {
429879223bf1SKuninori Morimoto dev_err(component->dev, "Unsupported clock setting: sysclk=%dHz lrck=%dHz\n",
42998a4bd60aSAnatol Pomozov rt5677->sysclk, rt5677->lrck[dai->id]);
43000e826e86SOder Chiou return -EINVAL;
43010e826e86SOder Chiou }
43020e826e86SOder Chiou frame_size = snd_soc_params_to_frame_size(params);
43030e826e86SOder Chiou if (frame_size < 0) {
430479223bf1SKuninori Morimoto dev_err(component->dev, "Unsupported frame size: %d\n", frame_size);
43050e826e86SOder Chiou return -EINVAL;
43060e826e86SOder Chiou }
43070e826e86SOder Chiou bclk_ms = frame_size > 32;
43080e826e86SOder Chiou rt5677->bclk[dai->id] = rt5677->lrck[dai->id] * (32 << bclk_ms);
43090e826e86SOder Chiou
43100e826e86SOder Chiou dev_dbg(dai->dev, "bclk is %dHz and lrck is %dHz\n",
43110e826e86SOder Chiou rt5677->bclk[dai->id], rt5677->lrck[dai->id]);
43120e826e86SOder Chiou dev_dbg(dai->dev, "bclk_ms is %d and pre_div is %d for iis %d\n",
43130e826e86SOder Chiou bclk_ms, pre_div, dai->id);
43140e826e86SOder Chiou
43150e826e86SOder Chiou switch (params_width(params)) {
43160e826e86SOder Chiou case 16:
43170e826e86SOder Chiou break;
43180e826e86SOder Chiou case 20:
43190e826e86SOder Chiou val_len |= RT5677_I2S_DL_20;
43200e826e86SOder Chiou break;
43210e826e86SOder Chiou case 24:
43220e826e86SOder Chiou val_len |= RT5677_I2S_DL_24;
43230e826e86SOder Chiou break;
43240e826e86SOder Chiou case 8:
43250e826e86SOder Chiou val_len |= RT5677_I2S_DL_8;
43260e826e86SOder Chiou break;
43270e826e86SOder Chiou default:
43280e826e86SOder Chiou return -EINVAL;
43290e826e86SOder Chiou }
43300e826e86SOder Chiou
43310e826e86SOder Chiou switch (dai->id) {
43320e826e86SOder Chiou case RT5677_AIF1:
43330e826e86SOder Chiou mask_clk = RT5677_I2S_PD1_MASK;
43340e826e86SOder Chiou val_clk = pre_div << RT5677_I2S_PD1_SFT;
43350e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_I2S1_SDP,
43360e826e86SOder Chiou RT5677_I2S_DL_MASK, val_len);
43370e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_CLK_TREE_CTRL1,
43380e826e86SOder Chiou mask_clk, val_clk);
43390e826e86SOder Chiou break;
43400e826e86SOder Chiou case RT5677_AIF2:
43410e826e86SOder Chiou mask_clk = RT5677_I2S_PD2_MASK;
43420e826e86SOder Chiou val_clk = pre_div << RT5677_I2S_PD2_SFT;
43430e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_I2S2_SDP,
43440e826e86SOder Chiou RT5677_I2S_DL_MASK, val_len);
43450e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_CLK_TREE_CTRL1,
43460e826e86SOder Chiou mask_clk, val_clk);
43470e826e86SOder Chiou break;
43480e826e86SOder Chiou case RT5677_AIF3:
43490e826e86SOder Chiou mask_clk = RT5677_I2S_BCLK_MS3_MASK | RT5677_I2S_PD3_MASK;
43500e826e86SOder Chiou val_clk = bclk_ms << RT5677_I2S_BCLK_MS3_SFT |
43510e826e86SOder Chiou pre_div << RT5677_I2S_PD3_SFT;
43520e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_I2S3_SDP,
43530e826e86SOder Chiou RT5677_I2S_DL_MASK, val_len);
43540e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_CLK_TREE_CTRL1,
43550e826e86SOder Chiou mask_clk, val_clk);
43560e826e86SOder Chiou break;
43570e826e86SOder Chiou case RT5677_AIF4:
43580e826e86SOder Chiou mask_clk = RT5677_I2S_BCLK_MS4_MASK | RT5677_I2S_PD4_MASK;
43590e826e86SOder Chiou val_clk = bclk_ms << RT5677_I2S_BCLK_MS4_SFT |
43600e826e86SOder Chiou pre_div << RT5677_I2S_PD4_SFT;
43610e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_I2S4_SDP,
43620e826e86SOder Chiou RT5677_I2S_DL_MASK, val_len);
43630e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_CLK_TREE_CTRL1,
43640e826e86SOder Chiou mask_clk, val_clk);
43650e826e86SOder Chiou break;
43660e826e86SOder Chiou default:
43670e826e86SOder Chiou break;
43680e826e86SOder Chiou }
43690e826e86SOder Chiou
43700e826e86SOder Chiou return 0;
43710e826e86SOder Chiou }
43720e826e86SOder Chiou
rt5677_set_dai_fmt(struct snd_soc_dai * dai,unsigned int fmt)43730e826e86SOder Chiou static int rt5677_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
43740e826e86SOder Chiou {
437579223bf1SKuninori Morimoto struct snd_soc_component *component = dai->component;
437679223bf1SKuninori Morimoto struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
43770e826e86SOder Chiou unsigned int reg_val = 0;
43780e826e86SOder Chiou
43790e826e86SOder Chiou switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
43800e826e86SOder Chiou case SND_SOC_DAIFMT_CBM_CFM:
43810e826e86SOder Chiou rt5677->master[dai->id] = 1;
43820e826e86SOder Chiou break;
43830e826e86SOder Chiou case SND_SOC_DAIFMT_CBS_CFS:
43840e826e86SOder Chiou reg_val |= RT5677_I2S_MS_S;
43850e826e86SOder Chiou rt5677->master[dai->id] = 0;
43860e826e86SOder Chiou break;
43870e826e86SOder Chiou default:
43880e826e86SOder Chiou return -EINVAL;
43890e826e86SOder Chiou }
43900e826e86SOder Chiou
43910e826e86SOder Chiou switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
43920e826e86SOder Chiou case SND_SOC_DAIFMT_NB_NF:
43930e826e86SOder Chiou break;
43940e826e86SOder Chiou case SND_SOC_DAIFMT_IB_NF:
43950e826e86SOder Chiou reg_val |= RT5677_I2S_BP_INV;
43960e826e86SOder Chiou break;
43970e826e86SOder Chiou default:
43980e826e86SOder Chiou return -EINVAL;
43990e826e86SOder Chiou }
44000e826e86SOder Chiou
44010e826e86SOder Chiou switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
44020e826e86SOder Chiou case SND_SOC_DAIFMT_I2S:
44030e826e86SOder Chiou break;
44040e826e86SOder Chiou case SND_SOC_DAIFMT_LEFT_J:
44050e826e86SOder Chiou reg_val |= RT5677_I2S_DF_LEFT;
44060e826e86SOder Chiou break;
44070e826e86SOder Chiou case SND_SOC_DAIFMT_DSP_A:
44080e826e86SOder Chiou reg_val |= RT5677_I2S_DF_PCM_A;
44090e826e86SOder Chiou break;
44100e826e86SOder Chiou case SND_SOC_DAIFMT_DSP_B:
44110e826e86SOder Chiou reg_val |= RT5677_I2S_DF_PCM_B;
44120e826e86SOder Chiou break;
44130e826e86SOder Chiou default:
44140e826e86SOder Chiou return -EINVAL;
44150e826e86SOder Chiou }
44160e826e86SOder Chiou
44170e826e86SOder Chiou switch (dai->id) {
44180e826e86SOder Chiou case RT5677_AIF1:
44190e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_I2S1_SDP,
44200e826e86SOder Chiou RT5677_I2S_MS_MASK | RT5677_I2S_BP_MASK |
44210e826e86SOder Chiou RT5677_I2S_DF_MASK, reg_val);
44220e826e86SOder Chiou break;
44230e826e86SOder Chiou case RT5677_AIF2:
44240e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_I2S2_SDP,
44250e826e86SOder Chiou RT5677_I2S_MS_MASK | RT5677_I2S_BP_MASK |
44260e826e86SOder Chiou RT5677_I2S_DF_MASK, reg_val);
44270e826e86SOder Chiou break;
44280e826e86SOder Chiou case RT5677_AIF3:
44290e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_I2S3_SDP,
44300e826e86SOder Chiou RT5677_I2S_MS_MASK | RT5677_I2S_BP_MASK |
44310e826e86SOder Chiou RT5677_I2S_DF_MASK, reg_val);
44320e826e86SOder Chiou break;
44330e826e86SOder Chiou case RT5677_AIF4:
44340e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_I2S4_SDP,
44350e826e86SOder Chiou RT5677_I2S_MS_MASK | RT5677_I2S_BP_MASK |
44360e826e86SOder Chiou RT5677_I2S_DF_MASK, reg_val);
44370e826e86SOder Chiou break;
44380e826e86SOder Chiou default:
44390e826e86SOder Chiou break;
44400e826e86SOder Chiou }
44410e826e86SOder Chiou
44420e826e86SOder Chiou
44430e826e86SOder Chiou return 0;
44440e826e86SOder Chiou }
44450e826e86SOder Chiou
rt5677_set_dai_sysclk(struct snd_soc_dai * dai,int clk_id,unsigned int freq,int dir)44460e826e86SOder Chiou static int rt5677_set_dai_sysclk(struct snd_soc_dai *dai,
44470e826e86SOder Chiou int clk_id, unsigned int freq, int dir)
44480e826e86SOder Chiou {
444979223bf1SKuninori Morimoto struct snd_soc_component *component = dai->component;
445079223bf1SKuninori Morimoto struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
44510e826e86SOder Chiou unsigned int reg_val = 0;
44520e826e86SOder Chiou
44530e826e86SOder Chiou if (freq == rt5677->sysclk && clk_id == rt5677->sysclk_src)
44540e826e86SOder Chiou return 0;
44550e826e86SOder Chiou
44560e826e86SOder Chiou switch (clk_id) {
44570e826e86SOder Chiou case RT5677_SCLK_S_MCLK:
44580e826e86SOder Chiou reg_val |= RT5677_SCLK_SRC_MCLK;
44590e826e86SOder Chiou break;
44600e826e86SOder Chiou case RT5677_SCLK_S_PLL1:
44610e826e86SOder Chiou reg_val |= RT5677_SCLK_SRC_PLL1;
44620e826e86SOder Chiou break;
44630e826e86SOder Chiou case RT5677_SCLK_S_RCCLK:
44640e826e86SOder Chiou reg_val |= RT5677_SCLK_SRC_RCCLK;
44650e826e86SOder Chiou break;
44660e826e86SOder Chiou default:
446779223bf1SKuninori Morimoto dev_err(component->dev, "Invalid clock id (%d)\n", clk_id);
44680e826e86SOder Chiou return -EINVAL;
44690e826e86SOder Chiou }
44700e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK1,
44710e826e86SOder Chiou RT5677_SCLK_SRC_MASK, reg_val);
44720e826e86SOder Chiou rt5677->sysclk = freq;
44730e826e86SOder Chiou rt5677->sysclk_src = clk_id;
44740e826e86SOder Chiou
44750e826e86SOder Chiou dev_dbg(dai->dev, "Sysclk is %dHz and clock id is %d\n", freq, clk_id);
44760e826e86SOder Chiou
44770e826e86SOder Chiou return 0;
44780e826e86SOder Chiou }
44790e826e86SOder Chiou
44800e826e86SOder Chiou /**
44810e826e86SOder Chiou * rt5677_pll_calc - Calcualte PLL M/N/K code.
44820e826e86SOder Chiou * @freq_in: external clock provided to codec.
44830e826e86SOder Chiou * @freq_out: target clock which codec works on.
44840e826e86SOder Chiou * @pll_code: Pointer to structure with M, N, K, bypass K and bypass M flag.
44850e826e86SOder Chiou *
44860e826e86SOder Chiou * Calcualte M/N/K code and bypass K/M flag to configure PLL for codec.
44870e826e86SOder Chiou *
44880e826e86SOder Chiou * Returns 0 for success or negative error code.
44890e826e86SOder Chiou */
rt5677_pll_calc(const unsigned int freq_in,const unsigned int freq_out,struct rl6231_pll_code * pll_code)44900e826e86SOder Chiou static int rt5677_pll_calc(const unsigned int freq_in,
4491099d334eSAxel Lin const unsigned int freq_out, struct rl6231_pll_code *pll_code)
44920e826e86SOder Chiou {
4493099d334eSAxel Lin if (RT5677_PLL_INP_MIN > freq_in)
44940e826e86SOder Chiou return -EINVAL;
44950e826e86SOder Chiou
4496099d334eSAxel Lin return rl6231_pll_calc(freq_in, freq_out, pll_code);
44970e826e86SOder Chiou }
44980e826e86SOder Chiou
rt5677_set_dai_pll(struct snd_soc_dai * dai,int pll_id,int source,unsigned int freq_in,unsigned int freq_out)44990e826e86SOder Chiou static int rt5677_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source,
45000e826e86SOder Chiou unsigned int freq_in, unsigned int freq_out)
45010e826e86SOder Chiou {
450279223bf1SKuninori Morimoto struct snd_soc_component *component = dai->component;
450379223bf1SKuninori Morimoto struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
4504099d334eSAxel Lin struct rl6231_pll_code pll_code;
45050e826e86SOder Chiou int ret;
45060e826e86SOder Chiou
45070e826e86SOder Chiou if (source == rt5677->pll_src && freq_in == rt5677->pll_in &&
45080e826e86SOder Chiou freq_out == rt5677->pll_out)
45090e826e86SOder Chiou return 0;
45100e826e86SOder Chiou
45110e826e86SOder Chiou if (!freq_in || !freq_out) {
451279223bf1SKuninori Morimoto dev_dbg(component->dev, "PLL disabled\n");
45130e826e86SOder Chiou
45140e826e86SOder Chiou rt5677->pll_in = 0;
45150e826e86SOder Chiou rt5677->pll_out = 0;
45160e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK1,
45170e826e86SOder Chiou RT5677_SCLK_SRC_MASK, RT5677_SCLK_SRC_MCLK);
45180e826e86SOder Chiou return 0;
45190e826e86SOder Chiou }
45200e826e86SOder Chiou
45210e826e86SOder Chiou switch (source) {
45220e826e86SOder Chiou case RT5677_PLL1_S_MCLK:
45230e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK1,
45240e826e86SOder Chiou RT5677_PLL1_SRC_MASK, RT5677_PLL1_SRC_MCLK);
45250e826e86SOder Chiou break;
45260e826e86SOder Chiou case RT5677_PLL1_S_BCLK1:
45270e826e86SOder Chiou case RT5677_PLL1_S_BCLK2:
45280e826e86SOder Chiou case RT5677_PLL1_S_BCLK3:
45290e826e86SOder Chiou case RT5677_PLL1_S_BCLK4:
45300e826e86SOder Chiou switch (dai->id) {
45310e826e86SOder Chiou case RT5677_AIF1:
45320e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK1,
45330e826e86SOder Chiou RT5677_PLL1_SRC_MASK, RT5677_PLL1_SRC_BCLK1);
45340e826e86SOder Chiou break;
45350e826e86SOder Chiou case RT5677_AIF2:
45360e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK1,
45370e826e86SOder Chiou RT5677_PLL1_SRC_MASK, RT5677_PLL1_SRC_BCLK2);
45380e826e86SOder Chiou break;
45390e826e86SOder Chiou case RT5677_AIF3:
45400e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK1,
45410e826e86SOder Chiou RT5677_PLL1_SRC_MASK, RT5677_PLL1_SRC_BCLK3);
45420e826e86SOder Chiou break;
45430e826e86SOder Chiou case RT5677_AIF4:
45440e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK1,
45450e826e86SOder Chiou RT5677_PLL1_SRC_MASK, RT5677_PLL1_SRC_BCLK4);
45460e826e86SOder Chiou break;
45470e826e86SOder Chiou default:
45480e826e86SOder Chiou break;
45490e826e86SOder Chiou }
45500e826e86SOder Chiou break;
45510e826e86SOder Chiou default:
455279223bf1SKuninori Morimoto dev_err(component->dev, "Unknown PLL source %d\n", source);
45530e826e86SOder Chiou return -EINVAL;
45540e826e86SOder Chiou }
45550e826e86SOder Chiou
45560e826e86SOder Chiou ret = rt5677_pll_calc(freq_in, freq_out, &pll_code);
45570e826e86SOder Chiou if (ret < 0) {
4558a4db95b2SColin Ian King dev_err(component->dev, "Unsupported input clock %d\n", freq_in);
45590e826e86SOder Chiou return ret;
45600e826e86SOder Chiou }
45610e826e86SOder Chiou
456279223bf1SKuninori Morimoto dev_dbg(component->dev, "m_bypass=%d m=%d n=%d k=%d\n",
4563099d334eSAxel Lin pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code),
4564099d334eSAxel Lin pll_code.n_code, pll_code.k_code);
45650e826e86SOder Chiou
45660e826e86SOder Chiou regmap_write(rt5677->regmap, RT5677_PLL1_CTRL1,
4567099d334eSAxel Lin pll_code.n_code << RT5677_PLL_N_SFT | pll_code.k_code);
45680e826e86SOder Chiou regmap_write(rt5677->regmap, RT5677_PLL1_CTRL2,
4569ae052909SPierre-Louis Bossart ((pll_code.m_bp ? 0 : pll_code.m_code) << RT5677_PLL_M_SFT) |
4570ae052909SPierre-Louis Bossart (pll_code.m_bp << RT5677_PLL_M_BP_SFT));
45710e826e86SOder Chiou
45720e826e86SOder Chiou rt5677->pll_in = freq_in;
45730e826e86SOder Chiou rt5677->pll_out = freq_out;
45740e826e86SOder Chiou rt5677->pll_src = source;
45750e826e86SOder Chiou
45760e826e86SOder Chiou return 0;
45770e826e86SOder Chiou }
45780e826e86SOder Chiou
rt5677_set_tdm_slot(struct snd_soc_dai * dai,unsigned int tx_mask,unsigned int rx_mask,int slots,int slot_width)457948561afeSOder Chiou static int rt5677_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
458048561afeSOder Chiou unsigned int rx_mask, int slots, int slot_width)
458148561afeSOder Chiou {
458279223bf1SKuninori Morimoto struct snd_soc_component *component = dai->component;
458379223bf1SKuninori Morimoto struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
45849913b9f5SOder Chiou unsigned int val = 0, slot_width_25 = 0;
458548561afeSOder Chiou
458648561afeSOder Chiou if (rx_mask || tx_mask)
458748561afeSOder Chiou val |= (1 << 12);
458848561afeSOder Chiou
458948561afeSOder Chiou switch (slots) {
459048561afeSOder Chiou case 4:
459148561afeSOder Chiou val |= (1 << 10);
459248561afeSOder Chiou break;
459348561afeSOder Chiou case 6:
459448561afeSOder Chiou val |= (2 << 10);
459548561afeSOder Chiou break;
459648561afeSOder Chiou case 8:
459748561afeSOder Chiou val |= (3 << 10);
459848561afeSOder Chiou break;
459948561afeSOder Chiou case 2:
460048561afeSOder Chiou default:
460148561afeSOder Chiou break;
460248561afeSOder Chiou }
460348561afeSOder Chiou
460448561afeSOder Chiou switch (slot_width) {
460548561afeSOder Chiou case 20:
460648561afeSOder Chiou val |= (1 << 8);
460748561afeSOder Chiou break;
46089913b9f5SOder Chiou case 25:
46099913b9f5SOder Chiou slot_width_25 = 0x8080;
46103e146b55SGustavo A. R. Silva fallthrough;
461148561afeSOder Chiou case 24:
461248561afeSOder Chiou val |= (2 << 8);
461348561afeSOder Chiou break;
461448561afeSOder Chiou case 32:
461548561afeSOder Chiou val |= (3 << 8);
461648561afeSOder Chiou break;
461748561afeSOder Chiou case 16:
461848561afeSOder Chiou default:
461948561afeSOder Chiou break;
462048561afeSOder Chiou }
462148561afeSOder Chiou
462248561afeSOder Chiou switch (dai->id) {
462348561afeSOder Chiou case RT5677_AIF1:
4624e4b7e6a8SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_TDM1_CTRL1, 0x1f00,
4625e4b7e6a8SOder Chiou val);
46269913b9f5SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_DIG_MISC, 0x8000,
46279913b9f5SOder Chiou slot_width_25);
462848561afeSOder Chiou break;
462948561afeSOder Chiou case RT5677_AIF2:
4630e4b7e6a8SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_TDM2_CTRL1, 0x1f00,
4631e4b7e6a8SOder Chiou val);
46329913b9f5SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_DIG_MISC, 0x80,
46339913b9f5SOder Chiou slot_width_25);
463448561afeSOder Chiou break;
463548561afeSOder Chiou default:
463648561afeSOder Chiou break;
463748561afeSOder Chiou }
463848561afeSOder Chiou
463948561afeSOder Chiou return 0;
464048561afeSOder Chiou }
464148561afeSOder Chiou
rt5677_set_bias_level(struct snd_soc_component * component,enum snd_soc_bias_level level)464279223bf1SKuninori Morimoto static int rt5677_set_bias_level(struct snd_soc_component *component,
46430e826e86SOder Chiou enum snd_soc_bias_level level)
46440e826e86SOder Chiou {
464579223bf1SKuninori Morimoto struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
46463f81068dSBen Zhang enum snd_soc_bias_level prev_bias =
46473f81068dSBen Zhang snd_soc_component_get_bias_level(component);
46480e826e86SOder Chiou
46490e826e86SOder Chiou switch (level) {
46500e826e86SOder Chiou case SND_SOC_BIAS_ON:
46510e826e86SOder Chiou break;
46520e826e86SOder Chiou
46530e826e86SOder Chiou case SND_SOC_BIAS_PREPARE:
46543f81068dSBen Zhang if (prev_bias == SND_SOC_BIAS_STANDBY) {
4655af48f1d0SOder Chiou
46560e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG1,
46570e826e86SOder Chiou RT5677_LDO1_SEL_MASK | RT5677_LDO2_SEL_MASK,
465833b773dcSCurtis Malainey 5 << RT5677_LDO1_SEL_SFT |
465933b773dcSCurtis Malainey 5 << RT5677_LDO2_SEL_SFT);
46600e826e86SOder Chiou regmap_update_bits(rt5677->regmap,
46610e826e86SOder Chiou RT5677_PR_BASE + RT5677_BIAS_CUR4,
46620e826e86SOder Chiou 0x0f00, 0x0f00);
46630e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG1,
4664683996cbSOder Chiou RT5677_PWR_FV1 | RT5677_PWR_FV2 |
46650e826e86SOder Chiou RT5677_PWR_VREF1 | RT5677_PWR_MB |
46660e826e86SOder Chiou RT5677_PWR_BG | RT5677_PWR_VREF2,
46670e826e86SOder Chiou RT5677_PWR_VREF1 | RT5677_PWR_MB |
46680e826e86SOder Chiou RT5677_PWR_BG | RT5677_PWR_VREF2);
4669683996cbSOder Chiou rt5677->is_vref_slow = false;
46700e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,
46710e826e86SOder Chiou RT5677_PWR_CORE, RT5677_PWR_CORE);
46720e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_DIG_MISC,
46730e826e86SOder Chiou 0x1, 0x1);
46740e826e86SOder Chiou }
46750e826e86SOder Chiou break;
46760e826e86SOder Chiou
46770e826e86SOder Chiou case SND_SOC_BIAS_STANDBY:
46783f81068dSBen Zhang if (prev_bias == SND_SOC_BIAS_OFF &&
46793f81068dSBen Zhang rt5677->dsp_vad_en_request) {
46803f81068dSBen Zhang /* Re-enable the DSP if it was turned off at suspend */
46813f81068dSBen Zhang rt5677->dsp_vad_en = true;
46823f81068dSBen Zhang /* The delay is to wait for MCLK */
46833f81068dSBen Zhang schedule_delayed_work(&rt5677->dsp_work,
46843f81068dSBen Zhang msecs_to_jiffies(1000));
46853f81068dSBen Zhang }
46860e826e86SOder Chiou break;
46870e826e86SOder Chiou
46880e826e86SOder Chiou case SND_SOC_BIAS_OFF:
46893f81068dSBen Zhang flush_delayed_work(&rt5677->dsp_work);
46903f81068dSBen Zhang if (rt5677->is_dsp_mode) {
46913f81068dSBen Zhang /* Turn off the DSP before suspend */
46923f81068dSBen Zhang rt5677->dsp_vad_en = false;
46933f81068dSBen Zhang schedule_delayed_work(&rt5677->dsp_work, 0);
46943f81068dSBen Zhang flush_delayed_work(&rt5677->dsp_work);
46953f81068dSBen Zhang }
46963f81068dSBen Zhang
46970e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_DIG_MISC, 0x1, 0x0);
46980e826e86SOder Chiou regmap_write(rt5677->regmap, RT5677_PWR_DIG1, 0x0000);
469933b773dcSCurtis Malainey regmap_write(rt5677->regmap, RT5677_PWR_ANLG1,
470033b773dcSCurtis Malainey 2 << RT5677_LDO1_SEL_SFT |
470133b773dcSCurtis Malainey 2 << RT5677_LDO2_SEL_SFT);
4702dfe58f20SBen Zhang regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,
4703dfe58f20SBen Zhang RT5677_PWR_CORE, 0);
47040e826e86SOder Chiou regmap_update_bits(rt5677->regmap,
47050e826e86SOder Chiou RT5677_PR_BASE + RT5677_BIAS_CUR4, 0x0f00, 0x0000);
4706af48f1d0SOder Chiou
4707af48f1d0SOder Chiou if (rt5677->dsp_vad_en)
470879223bf1SKuninori Morimoto rt5677_set_dsp_vad(component, true);
47090e826e86SOder Chiou break;
47100e826e86SOder Chiou
47110e826e86SOder Chiou default:
47120e826e86SOder Chiou break;
47130e826e86SOder Chiou }
47140e826e86SOder Chiou
47150e826e86SOder Chiou return 0;
47160e826e86SOder Chiou }
47170e826e86SOder Chiou
rt5677_update_gpio_bits(struct rt5677_priv * rt5677,unsigned offset,int m,int v)47185512ffd9SAndy Shevchenko static int rt5677_update_gpio_bits(struct rt5677_priv *rt5677, unsigned offset, int m, int v)
47195512ffd9SAndy Shevchenko {
47205512ffd9SAndy Shevchenko unsigned int bank = offset / 5;
47215512ffd9SAndy Shevchenko unsigned int shift = (offset % 5) * 3;
47225512ffd9SAndy Shevchenko unsigned int reg = bank ? RT5677_GPIO_CTRL3 : RT5677_GPIO_CTRL2;
47235512ffd9SAndy Shevchenko
47245512ffd9SAndy Shevchenko return regmap_update_bits(rt5677->regmap, reg, m << shift, v << shift);
47255512ffd9SAndy Shevchenko }
47265512ffd9SAndy Shevchenko
472744caf764SOder Chiou #ifdef CONFIG_GPIOLIB
rt5677_gpio_set(struct gpio_chip * chip,unsigned offset,int value)472844caf764SOder Chiou static void rt5677_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
472944caf764SOder Chiou {
473014900363SLinus Walleij struct rt5677_priv *rt5677 = gpiochip_get_data(chip);
47315512ffd9SAndy Shevchenko int level = value ? RT5677_GPIOx_OUT_HI : RT5677_GPIOx_OUT_LO;
47325512ffd9SAndy Shevchenko int m = RT5677_GPIOx_OUT_MASK;
473344caf764SOder Chiou
47345512ffd9SAndy Shevchenko rt5677_update_gpio_bits(rt5677, offset, m, level);
473544caf764SOder Chiou }
473644caf764SOder Chiou
rt5677_gpio_direction_out(struct gpio_chip * chip,unsigned offset,int value)473744caf764SOder Chiou static int rt5677_gpio_direction_out(struct gpio_chip *chip,
473844caf764SOder Chiou unsigned offset, int value)
473944caf764SOder Chiou {
474014900363SLinus Walleij struct rt5677_priv *rt5677 = gpiochip_get_data(chip);
47415512ffd9SAndy Shevchenko int level = value ? RT5677_GPIOx_OUT_HI : RT5677_GPIOx_OUT_LO;
47425512ffd9SAndy Shevchenko int m = RT5677_GPIOx_DIR_MASK | RT5677_GPIOx_OUT_MASK;
47435512ffd9SAndy Shevchenko int v = RT5677_GPIOx_DIR_OUT | level;
474444caf764SOder Chiou
47455512ffd9SAndy Shevchenko return rt5677_update_gpio_bits(rt5677, offset, m, v);
474644caf764SOder Chiou }
474744caf764SOder Chiou
rt5677_gpio_get(struct gpio_chip * chip,unsigned offset)474844caf764SOder Chiou static int rt5677_gpio_get(struct gpio_chip *chip, unsigned offset)
474944caf764SOder Chiou {
475014900363SLinus Walleij struct rt5677_priv *rt5677 = gpiochip_get_data(chip);
475144caf764SOder Chiou int value, ret;
475244caf764SOder Chiou
475344caf764SOder Chiou ret = regmap_read(rt5677->regmap, RT5677_GPIO_ST, &value);
475444caf764SOder Chiou if (ret < 0)
475544caf764SOder Chiou return ret;
475644caf764SOder Chiou
475744caf764SOder Chiou return (value & (0x1 << offset)) >> offset;
475844caf764SOder Chiou }
475944caf764SOder Chiou
rt5677_gpio_direction_in(struct gpio_chip * chip,unsigned offset)476044caf764SOder Chiou static int rt5677_gpio_direction_in(struct gpio_chip *chip, unsigned offset)
476144caf764SOder Chiou {
476214900363SLinus Walleij struct rt5677_priv *rt5677 = gpiochip_get_data(chip);
47635512ffd9SAndy Shevchenko int m = RT5677_GPIOx_DIR_MASK;
47645512ffd9SAndy Shevchenko int v = RT5677_GPIOx_DIR_IN;
476544caf764SOder Chiou
47665512ffd9SAndy Shevchenko return rt5677_update_gpio_bits(rt5677, offset, m, v);
476744caf764SOder Chiou }
476844caf764SOder Chiou
47695512ffd9SAndy Shevchenko /*
47705512ffd9SAndy Shevchenko * Configures the GPIO as
477140eb90a1SAnatol Pomozov * 0 - floating
477240eb90a1SAnatol Pomozov * 1 - pull down
477340eb90a1SAnatol Pomozov * 2 - pull up
477440eb90a1SAnatol Pomozov */
rt5677_gpio_config(struct rt5677_priv * rt5677,unsigned offset,int value)477540eb90a1SAnatol Pomozov static void rt5677_gpio_config(struct rt5677_priv *rt5677, unsigned offset,
477640eb90a1SAnatol Pomozov int value)
477740eb90a1SAnatol Pomozov {
477840eb90a1SAnatol Pomozov int shift;
477940eb90a1SAnatol Pomozov
478040eb90a1SAnatol Pomozov switch (offset) {
478140eb90a1SAnatol Pomozov case RT5677_GPIO1 ... RT5677_GPIO2:
478240eb90a1SAnatol Pomozov shift = 2 * (1 - offset);
478340eb90a1SAnatol Pomozov regmap_update_bits(rt5677->regmap,
478440eb90a1SAnatol Pomozov RT5677_PR_BASE + RT5677_DIG_IN_PIN_ST_CTRL2,
478540eb90a1SAnatol Pomozov 0x3 << shift,
478640eb90a1SAnatol Pomozov (value & 0x3) << shift);
478740eb90a1SAnatol Pomozov break;
478840eb90a1SAnatol Pomozov
478940eb90a1SAnatol Pomozov case RT5677_GPIO3 ... RT5677_GPIO6:
479040eb90a1SAnatol Pomozov shift = 2 * (9 - offset);
479140eb90a1SAnatol Pomozov regmap_update_bits(rt5677->regmap,
479240eb90a1SAnatol Pomozov RT5677_PR_BASE + RT5677_DIG_IN_PIN_ST_CTRL3,
479340eb90a1SAnatol Pomozov 0x3 << shift,
479440eb90a1SAnatol Pomozov (value & 0x3) << shift);
479540eb90a1SAnatol Pomozov break;
479640eb90a1SAnatol Pomozov
479740eb90a1SAnatol Pomozov default:
479840eb90a1SAnatol Pomozov break;
479940eb90a1SAnatol Pomozov }
480040eb90a1SAnatol Pomozov }
480140eb90a1SAnatol Pomozov
rt5677_to_irq(struct gpio_chip * chip,unsigned offset)48025e3363adSOder Chiou static int rt5677_to_irq(struct gpio_chip *chip, unsigned offset)
48035e3363adSOder Chiou {
480414900363SLinus Walleij struct rt5677_priv *rt5677 = gpiochip_get_data(chip);
48055e3363adSOder Chiou int irq;
48065e3363adSOder Chiou
48075e3363adSOder Chiou if ((rt5677->pdata.jd1_gpio == 1 && offset == RT5677_GPIO1) ||
48085e3363adSOder Chiou (rt5677->pdata.jd1_gpio == 2 &&
48095e3363adSOder Chiou offset == RT5677_GPIO2) ||
48105e3363adSOder Chiou (rt5677->pdata.jd1_gpio == 3 &&
48115e3363adSOder Chiou offset == RT5677_GPIO3)) {
48125e3363adSOder Chiou irq = RT5677_IRQ_JD1;
4813d4e753d3SAndy Shevchenko } else if ((rt5677->pdata.jd2_gpio == 1 && offset == RT5677_GPIO4) ||
48145e3363adSOder Chiou (rt5677->pdata.jd2_gpio == 2 &&
48155e3363adSOder Chiou offset == RT5677_GPIO5) ||
48165e3363adSOder Chiou (rt5677->pdata.jd2_gpio == 3 &&
48175e3363adSOder Chiou offset == RT5677_GPIO6)) {
48185e3363adSOder Chiou irq = RT5677_IRQ_JD2;
48195e3363adSOder Chiou } else if ((rt5677->pdata.jd3_gpio == 1 &&
48205e3363adSOder Chiou offset == RT5677_GPIO4) ||
48215e3363adSOder Chiou (rt5677->pdata.jd3_gpio == 2 &&
48225e3363adSOder Chiou offset == RT5677_GPIO5) ||
48235e3363adSOder Chiou (rt5677->pdata.jd3_gpio == 3 &&
48245e3363adSOder Chiou offset == RT5677_GPIO6)) {
48255e3363adSOder Chiou irq = RT5677_IRQ_JD3;
48265e3363adSOder Chiou } else {
48275e3363adSOder Chiou return -ENXIO;
48285e3363adSOder Chiou }
48295e3363adSOder Chiou
48304f7b018bSBen Zhang return irq_create_mapping(rt5677->domain, irq);
48315e3363adSOder Chiou }
48325e3363adSOder Chiou
4833c59b24f8SJulia Lawall static const struct gpio_chip rt5677_template_chip = {
4834893d1a9cSCurtis Malainey .label = RT5677_DRV_NAME,
483544caf764SOder Chiou .owner = THIS_MODULE,
483644caf764SOder Chiou .direction_output = rt5677_gpio_direction_out,
483744caf764SOder Chiou .set = rt5677_gpio_set,
483844caf764SOder Chiou .direction_input = rt5677_gpio_direction_in,
483944caf764SOder Chiou .get = rt5677_gpio_get,
48405e3363adSOder Chiou .to_irq = rt5677_to_irq,
484144caf764SOder Chiou .can_sleep = 1,
484244caf764SOder Chiou };
484344caf764SOder Chiou
rt5677_init_gpio(struct i2c_client * i2c)484444caf764SOder Chiou static void rt5677_init_gpio(struct i2c_client *i2c)
484544caf764SOder Chiou {
484644caf764SOder Chiou struct rt5677_priv *rt5677 = i2c_get_clientdata(i2c);
484744caf764SOder Chiou int ret;
484844caf764SOder Chiou
484944caf764SOder Chiou rt5677->gpio_chip = rt5677_template_chip;
485044caf764SOder Chiou rt5677->gpio_chip.ngpio = RT5677_GPIO_NUM;
485158383c78SLinus Walleij rt5677->gpio_chip.parent = &i2c->dev;
485244caf764SOder Chiou rt5677->gpio_chip.base = -1;
485344caf764SOder Chiou
485414900363SLinus Walleij ret = gpiochip_add_data(&rt5677->gpio_chip, rt5677);
485544caf764SOder Chiou if (ret != 0)
485644caf764SOder Chiou dev_err(&i2c->dev, "Failed to add GPIOs: %d\n", ret);
485744caf764SOder Chiou }
485844caf764SOder Chiou
rt5677_free_gpio(struct i2c_client * i2c)485944caf764SOder Chiou static void rt5677_free_gpio(struct i2c_client *i2c)
486044caf764SOder Chiou {
486144caf764SOder Chiou struct rt5677_priv *rt5677 = i2c_get_clientdata(i2c);
486244caf764SOder Chiou
48635d5e63afSAxel Lin gpiochip_remove(&rt5677->gpio_chip);
486444caf764SOder Chiou }
486544caf764SOder Chiou #else
rt5677_gpio_config(struct rt5677_priv * rt5677,unsigned offset,int value)486645b6e1d3SAnatol Pomozov static void rt5677_gpio_config(struct rt5677_priv *rt5677, unsigned offset,
486745b6e1d3SAnatol Pomozov int value)
486845b6e1d3SAnatol Pomozov {
486945b6e1d3SAnatol Pomozov }
487045b6e1d3SAnatol Pomozov
rt5677_init_gpio(struct i2c_client * i2c)487144caf764SOder Chiou static void rt5677_init_gpio(struct i2c_client *i2c)
487244caf764SOder Chiou {
487344caf764SOder Chiou }
487444caf764SOder Chiou
rt5677_free_gpio(struct i2c_client * i2c)487544caf764SOder Chiou static void rt5677_free_gpio(struct i2c_client *i2c)
487644caf764SOder Chiou {
487744caf764SOder Chiou }
487844caf764SOder Chiou #endif
487944caf764SOder Chiou
rt5677_probe(struct snd_soc_component * component)488079223bf1SKuninori Morimoto static int rt5677_probe(struct snd_soc_component *component)
48810e826e86SOder Chiou {
488279223bf1SKuninori Morimoto struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
488379223bf1SKuninori Morimoto struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
488440eb90a1SAnatol Pomozov int i;
48850e826e86SOder Chiou
488679223bf1SKuninori Morimoto rt5677->component = component;
48870e826e86SOder Chiou
48882d15d974SBard Liao if (rt5677->pdata.dmic2_clk_pin == RT5677_DMIC_CLK2) {
48896b43c2ebSLars-Peter Clausen snd_soc_dapm_add_routes(dapm,
48902d15d974SBard Liao rt5677_dmic2_clk_2,
48912d15d974SBard Liao ARRAY_SIZE(rt5677_dmic2_clk_2));
48922d15d974SBard Liao } else { /*use dmic1 clock by default*/
48936b43c2ebSLars-Peter Clausen snd_soc_dapm_add_routes(dapm,
48942d15d974SBard Liao rt5677_dmic2_clk_1,
48952d15d974SBard Liao ARRAY_SIZE(rt5677_dmic2_clk_1));
48962d15d974SBard Liao }
48972d15d974SBard Liao
489879223bf1SKuninori Morimoto snd_soc_component_force_bias_level(component, SND_SOC_BIAS_OFF);
48990e826e86SOder Chiou
490024180064SFletcher Woodruff regmap_update_bits(rt5677->regmap, RT5677_DIG_MISC,
490124180064SFletcher Woodruff ~RT5677_IRQ_DEBOUNCE_SEL_MASK, 0x0020);
490233b773dcSCurtis Malainey regmap_write(rt5677->regmap, RT5677_PWR_DSP2,
490333b773dcSCurtis Malainey RT5677_PWR_SLIM_ISO | RT5677_PWR_CORE_ISO);
49040e826e86SOder Chiou
490540eb90a1SAnatol Pomozov for (i = 0; i < RT5677_GPIO_NUM; i++)
490640eb90a1SAnatol Pomozov rt5677_gpio_config(rt5677, i, rt5677->pdata.gpio_config[i]);
490740eb90a1SAnatol Pomozov
4908af48f1d0SOder Chiou mutex_init(&rt5677->dsp_cmd_lock);
49096fe17da0SOder Chiou mutex_init(&rt5677->dsp_pri_lock);
4910af48f1d0SOder Chiou
49110e826e86SOder Chiou return 0;
49120e826e86SOder Chiou }
49130e826e86SOder Chiou
rt5677_remove(struct snd_soc_component * component)491479223bf1SKuninori Morimoto static void rt5677_remove(struct snd_soc_component *component)
49150e826e86SOder Chiou {
491679223bf1SKuninori Morimoto struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
49170e826e86SOder Chiou
4918461c6232SBen Zhang cancel_delayed_work_sync(&rt5677->dsp_work);
4919461c6232SBen Zhang
49200e826e86SOder Chiou regmap_write(rt5677->regmap, RT5677_RESET, 0x10ec);
4921efd901eeSBen Zhang gpiod_set_value_cansleep(rt5677->pow_ldo2, 0);
4922cdab0d4eSAnatol Pomozov gpiod_set_value_cansleep(rt5677->reset_pin, 1);
49230e826e86SOder Chiou }
49240e826e86SOder Chiou
49250e826e86SOder Chiou #ifdef CONFIG_PM
rt5677_suspend(struct snd_soc_component * component)492679223bf1SKuninori Morimoto static int rt5677_suspend(struct snd_soc_component *component)
49270e826e86SOder Chiou {
492879223bf1SKuninori Morimoto struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
49290e826e86SOder Chiou
4930ee0be4a9SBen Zhang if (rt5677->irq) {
4931ee0be4a9SBen Zhang cancel_delayed_work_sync(&rt5677->resume_irq_check);
4932ee0be4a9SBen Zhang disable_irq(rt5677->irq);
4933ee0be4a9SBen Zhang }
4934ee0be4a9SBen Zhang
4935af48f1d0SOder Chiou if (!rt5677->dsp_vad_en) {
49360e826e86SOder Chiou regcache_cache_only(rt5677->regmap, true);
49370e826e86SOder Chiou regcache_mark_dirty(rt5677->regmap);
4938af48f1d0SOder Chiou
4939efd901eeSBen Zhang gpiod_set_value_cansleep(rt5677->pow_ldo2, 0);
4940cdab0d4eSAnatol Pomozov gpiod_set_value_cansleep(rt5677->reset_pin, 1);
4941cbca4076SOder Chiou }
49420e826e86SOder Chiou
49430e826e86SOder Chiou return 0;
49440e826e86SOder Chiou }
49450e826e86SOder Chiou
rt5677_resume(struct snd_soc_component * component)494679223bf1SKuninori Morimoto static int rt5677_resume(struct snd_soc_component *component)
49470e826e86SOder Chiou {
494879223bf1SKuninori Morimoto struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
49490e826e86SOder Chiou
4950cbca4076SOder Chiou if (!rt5677->dsp_vad_en) {
49511aa844cdSBen Zhang rt5677->pll_src = 0;
49521aa844cdSBen Zhang rt5677->pll_in = 0;
49531aa844cdSBen Zhang rt5677->pll_out = 0;
4954efd901eeSBen Zhang gpiod_set_value_cansleep(rt5677->pow_ldo2, 1);
4955cdab0d4eSAnatol Pomozov gpiod_set_value_cansleep(rt5677->reset_pin, 0);
4956efd901eeSBen Zhang if (rt5677->pow_ldo2 || rt5677->reset_pin)
4957f9f6a592SAnatol Pomozov msleep(10);
4958af48f1d0SOder Chiou
49590e826e86SOder Chiou regcache_cache_only(rt5677->regmap, false);
49600e826e86SOder Chiou regcache_sync(rt5677->regmap);
4961af48f1d0SOder Chiou }
49620e826e86SOder Chiou
4963ee0be4a9SBen Zhang if (rt5677->irq) {
4964ee0be4a9SBen Zhang enable_irq(rt5677->irq);
4965ee0be4a9SBen Zhang schedule_delayed_work(&rt5677->resume_irq_check, 0);
4966ee0be4a9SBen Zhang }
4967ee0be4a9SBen Zhang
49680e826e86SOder Chiou return 0;
49690e826e86SOder Chiou }
49700e826e86SOder Chiou #else
49710e826e86SOder Chiou #define rt5677_suspend NULL
49720e826e86SOder Chiou #define rt5677_resume NULL
49730e826e86SOder Chiou #endif
49740e826e86SOder Chiou
rt5677_read(void * context,unsigned int reg,unsigned int * val)497519ba484dSOder Chiou static int rt5677_read(void *context, unsigned int reg, unsigned int *val)
497619ba484dSOder Chiou {
497719ba484dSOder Chiou struct i2c_client *client = context;
497819ba484dSOder Chiou struct rt5677_priv *rt5677 = i2c_get_clientdata(client);
497919ba484dSOder Chiou
49806fe17da0SOder Chiou if (rt5677->is_dsp_mode) {
49816fe17da0SOder Chiou if (reg > 0xff) {
49826fe17da0SOder Chiou mutex_lock(&rt5677->dsp_pri_lock);
49836fe17da0SOder Chiou rt5677_dsp_mode_i2c_write(rt5677, RT5677_PRIV_INDEX,
49846fe17da0SOder Chiou reg & 0xff);
49856fe17da0SOder Chiou rt5677_dsp_mode_i2c_read(rt5677, RT5677_PRIV_DATA, val);
49866fe17da0SOder Chiou mutex_unlock(&rt5677->dsp_pri_lock);
49876fe17da0SOder Chiou } else {
498819ba484dSOder Chiou rt5677_dsp_mode_i2c_read(rt5677, reg, val);
49896fe17da0SOder Chiou }
49906fe17da0SOder Chiou } else {
499119ba484dSOder Chiou regmap_read(rt5677->regmap_physical, reg, val);
49926fe17da0SOder Chiou }
499319ba484dSOder Chiou
499419ba484dSOder Chiou return 0;
499519ba484dSOder Chiou }
499619ba484dSOder Chiou
rt5677_write(void * context,unsigned int reg,unsigned int val)499719ba484dSOder Chiou static int rt5677_write(void *context, unsigned int reg, unsigned int val)
499819ba484dSOder Chiou {
499919ba484dSOder Chiou struct i2c_client *client = context;
500019ba484dSOder Chiou struct rt5677_priv *rt5677 = i2c_get_clientdata(client);
500119ba484dSOder Chiou
50026fe17da0SOder Chiou if (rt5677->is_dsp_mode) {
50036fe17da0SOder Chiou if (reg > 0xff) {
50046fe17da0SOder Chiou mutex_lock(&rt5677->dsp_pri_lock);
50056fe17da0SOder Chiou rt5677_dsp_mode_i2c_write(rt5677, RT5677_PRIV_INDEX,
50066fe17da0SOder Chiou reg & 0xff);
50076fe17da0SOder Chiou rt5677_dsp_mode_i2c_write(rt5677, RT5677_PRIV_DATA,
50086fe17da0SOder Chiou val);
50096fe17da0SOder Chiou mutex_unlock(&rt5677->dsp_pri_lock);
50106fe17da0SOder Chiou } else {
501119ba484dSOder Chiou rt5677_dsp_mode_i2c_write(rt5677, reg, val);
50126fe17da0SOder Chiou }
50136fe17da0SOder Chiou } else {
501419ba484dSOder Chiou regmap_write(rt5677->regmap_physical, reg, val);
50156fe17da0SOder Chiou }
501619ba484dSOder Chiou
501719ba484dSOder Chiou return 0;
501819ba484dSOder Chiou }
501919ba484dSOder Chiou
50200e826e86SOder Chiou #define RT5677_STEREO_RATES SNDRV_PCM_RATE_8000_96000
50210e826e86SOder Chiou #define RT5677_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
50220e826e86SOder Chiou SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8)
50230e826e86SOder Chiou
502464793047SAxel Lin static const struct snd_soc_dai_ops rt5677_aif_dai_ops = {
50250e826e86SOder Chiou .hw_params = rt5677_hw_params,
50260e826e86SOder Chiou .set_fmt = rt5677_set_dai_fmt,
50270e826e86SOder Chiou .set_sysclk = rt5677_set_dai_sysclk,
50280e826e86SOder Chiou .set_pll = rt5677_set_dai_pll,
502948561afeSOder Chiou .set_tdm_slot = rt5677_set_tdm_slot,
50300e826e86SOder Chiou };
50310e826e86SOder Chiou
5032ba0b3a97SCurtis Malainey static const struct snd_soc_dai_ops rt5677_dsp_dai_ops = {
5033ba0b3a97SCurtis Malainey .set_sysclk = rt5677_set_dai_sysclk,
5034ba0b3a97SCurtis Malainey .set_pll = rt5677_set_dai_pll,
5035ba0b3a97SCurtis Malainey };
5036ba0b3a97SCurtis Malainey
50370e826e86SOder Chiou static struct snd_soc_dai_driver rt5677_dai[] = {
50380e826e86SOder Chiou {
50390e826e86SOder Chiou .name = "rt5677-aif1",
50400e826e86SOder Chiou .id = RT5677_AIF1,
50410e826e86SOder Chiou .playback = {
50420e826e86SOder Chiou .stream_name = "AIF1 Playback",
50430e826e86SOder Chiou .channels_min = 1,
50440e826e86SOder Chiou .channels_max = 2,
50450e826e86SOder Chiou .rates = RT5677_STEREO_RATES,
50460e826e86SOder Chiou .formats = RT5677_FORMATS,
50470e826e86SOder Chiou },
50480e826e86SOder Chiou .capture = {
50490e826e86SOder Chiou .stream_name = "AIF1 Capture",
50500e826e86SOder Chiou .channels_min = 1,
50510e826e86SOder Chiou .channels_max = 2,
50520e826e86SOder Chiou .rates = RT5677_STEREO_RATES,
50530e826e86SOder Chiou .formats = RT5677_FORMATS,
50540e826e86SOder Chiou },
50550e826e86SOder Chiou .ops = &rt5677_aif_dai_ops,
50560e826e86SOder Chiou },
50570e826e86SOder Chiou {
50580e826e86SOder Chiou .name = "rt5677-aif2",
50590e826e86SOder Chiou .id = RT5677_AIF2,
50600e826e86SOder Chiou .playback = {
50610e826e86SOder Chiou .stream_name = "AIF2 Playback",
50620e826e86SOder Chiou .channels_min = 1,
50630e826e86SOder Chiou .channels_max = 2,
50640e826e86SOder Chiou .rates = RT5677_STEREO_RATES,
50650e826e86SOder Chiou .formats = RT5677_FORMATS,
50660e826e86SOder Chiou },
50670e826e86SOder Chiou .capture = {
50680e826e86SOder Chiou .stream_name = "AIF2 Capture",
50690e826e86SOder Chiou .channels_min = 1,
50700e826e86SOder Chiou .channels_max = 2,
50710e826e86SOder Chiou .rates = RT5677_STEREO_RATES,
50720e826e86SOder Chiou .formats = RT5677_FORMATS,
50730e826e86SOder Chiou },
50740e826e86SOder Chiou .ops = &rt5677_aif_dai_ops,
50750e826e86SOder Chiou },
50760e826e86SOder Chiou {
50770e826e86SOder Chiou .name = "rt5677-aif3",
50780e826e86SOder Chiou .id = RT5677_AIF3,
50790e826e86SOder Chiou .playback = {
50800e826e86SOder Chiou .stream_name = "AIF3 Playback",
50810e826e86SOder Chiou .channels_min = 1,
50820e826e86SOder Chiou .channels_max = 2,
50830e826e86SOder Chiou .rates = RT5677_STEREO_RATES,
50840e826e86SOder Chiou .formats = RT5677_FORMATS,
50850e826e86SOder Chiou },
50860e826e86SOder Chiou .capture = {
50870e826e86SOder Chiou .stream_name = "AIF3 Capture",
50880e826e86SOder Chiou .channels_min = 1,
50890e826e86SOder Chiou .channels_max = 2,
50900e826e86SOder Chiou .rates = RT5677_STEREO_RATES,
50910e826e86SOder Chiou .formats = RT5677_FORMATS,
50920e826e86SOder Chiou },
50930e826e86SOder Chiou .ops = &rt5677_aif_dai_ops,
50940e826e86SOder Chiou },
50950e826e86SOder Chiou {
50960e826e86SOder Chiou .name = "rt5677-aif4",
50970e826e86SOder Chiou .id = RT5677_AIF4,
50980e826e86SOder Chiou .playback = {
50990e826e86SOder Chiou .stream_name = "AIF4 Playback",
51000e826e86SOder Chiou .channels_min = 1,
51010e826e86SOder Chiou .channels_max = 2,
51020e826e86SOder Chiou .rates = RT5677_STEREO_RATES,
51030e826e86SOder Chiou .formats = RT5677_FORMATS,
51040e826e86SOder Chiou },
51050e826e86SOder Chiou .capture = {
51060e826e86SOder Chiou .stream_name = "AIF4 Capture",
51070e826e86SOder Chiou .channels_min = 1,
51080e826e86SOder Chiou .channels_max = 2,
51090e826e86SOder Chiou .rates = RT5677_STEREO_RATES,
51100e826e86SOder Chiou .formats = RT5677_FORMATS,
51110e826e86SOder Chiou },
51120e826e86SOder Chiou .ops = &rt5677_aif_dai_ops,
51130e826e86SOder Chiou },
51140e826e86SOder Chiou {
51150e826e86SOder Chiou .name = "rt5677-slimbus",
51160e826e86SOder Chiou .id = RT5677_AIF5,
51170e826e86SOder Chiou .playback = {
51180e826e86SOder Chiou .stream_name = "SLIMBus Playback",
51190e826e86SOder Chiou .channels_min = 1,
51200e826e86SOder Chiou .channels_max = 2,
51210e826e86SOder Chiou .rates = RT5677_STEREO_RATES,
51220e826e86SOder Chiou .formats = RT5677_FORMATS,
51230e826e86SOder Chiou },
51240e826e86SOder Chiou .capture = {
51250e826e86SOder Chiou .stream_name = "SLIMBus Capture",
51260e826e86SOder Chiou .channels_min = 1,
51270e826e86SOder Chiou .channels_max = 2,
51280e826e86SOder Chiou .rates = RT5677_STEREO_RATES,
51290e826e86SOder Chiou .formats = RT5677_FORMATS,
51300e826e86SOder Chiou },
51310e826e86SOder Chiou .ops = &rt5677_aif_dai_ops,
51320e826e86SOder Chiou },
5133461c6232SBen Zhang {
5134461c6232SBen Zhang .name = "rt5677-dspbuffer",
5135461c6232SBen Zhang .id = RT5677_DSPBUFF,
5136461c6232SBen Zhang .capture = {
5137461c6232SBen Zhang .stream_name = "DSP Buffer",
5138461c6232SBen Zhang .channels_min = 1,
5139461c6232SBen Zhang .channels_max = 1,
5140461c6232SBen Zhang .rates = SNDRV_PCM_RATE_16000,
5141461c6232SBen Zhang .formats = SNDRV_PCM_FMTBIT_S16_LE,
5142461c6232SBen Zhang },
5143ba0b3a97SCurtis Malainey .ops = &rt5677_dsp_dai_ops,
5144461c6232SBen Zhang },
51450e826e86SOder Chiou };
51460e826e86SOder Chiou
514779223bf1SKuninori Morimoto static const struct snd_soc_component_driver soc_component_dev_rt5677 = {
5148893d1a9cSCurtis Malainey .name = RT5677_DRV_NAME,
51490e826e86SOder Chiou .probe = rt5677_probe,
51500e826e86SOder Chiou .remove = rt5677_remove,
51510e826e86SOder Chiou .suspend = rt5677_suspend,
51520e826e86SOder Chiou .resume = rt5677_resume,
51530e826e86SOder Chiou .set_bias_level = rt5677_set_bias_level,
51540e826e86SOder Chiou .controls = rt5677_snd_controls,
51550e826e86SOder Chiou .num_controls = ARRAY_SIZE(rt5677_snd_controls),
51560e826e86SOder Chiou .dapm_widgets = rt5677_dapm_widgets,
51570e826e86SOder Chiou .num_dapm_widgets = ARRAY_SIZE(rt5677_dapm_widgets),
51580e826e86SOder Chiou .dapm_routes = rt5677_dapm_routes,
51590e826e86SOder Chiou .num_dapm_routes = ARRAY_SIZE(rt5677_dapm_routes),
516079223bf1SKuninori Morimoto .use_pmdown_time = 1,
516179223bf1SKuninori Morimoto .endianness = 1,
51620e826e86SOder Chiou };
51630e826e86SOder Chiou
516419ba484dSOder Chiou static const struct regmap_config rt5677_regmap_physical = {
516519ba484dSOder Chiou .name = "physical",
516619ba484dSOder Chiou .reg_bits = 8,
516719ba484dSOder Chiou .val_bits = 16,
516819ba484dSOder Chiou
51696fe17da0SOder Chiou .max_register = RT5677_VENDOR_ID2 + 1 + (ARRAY_SIZE(rt5677_ranges) *
51706fe17da0SOder Chiou RT5677_PR_SPACING),
517119ba484dSOder Chiou .readable_reg = rt5677_readable_register,
517219ba484dSOder Chiou
517319ba484dSOder Chiou .cache_type = REGCACHE_NONE,
51746fe17da0SOder Chiou .ranges = rt5677_ranges,
51756fe17da0SOder Chiou .num_ranges = ARRAY_SIZE(rt5677_ranges),
517619ba484dSOder Chiou };
517719ba484dSOder Chiou
51780e826e86SOder Chiou static const struct regmap_config rt5677_regmap = {
51790e826e86SOder Chiou .reg_bits = 8,
51800e826e86SOder Chiou .val_bits = 16,
51810e826e86SOder Chiou
51820e826e86SOder Chiou .max_register = RT5677_VENDOR_ID2 + 1 + (ARRAY_SIZE(rt5677_ranges) *
51830e826e86SOder Chiou RT5677_PR_SPACING),
51840e826e86SOder Chiou
51850e826e86SOder Chiou .volatile_reg = rt5677_volatile_register,
51860e826e86SOder Chiou .readable_reg = rt5677_readable_register,
518719ba484dSOder Chiou .reg_read = rt5677_read,
518819ba484dSOder Chiou .reg_write = rt5677_write,
51890e826e86SOder Chiou
51900e826e86SOder Chiou .cache_type = REGCACHE_RBTREE,
51910e826e86SOder Chiou .reg_defaults = rt5677_reg,
51920e826e86SOder Chiou .num_reg_defaults = ARRAY_SIZE(rt5677_reg),
51930e826e86SOder Chiou .ranges = rt5677_ranges,
51940e826e86SOder Chiou .num_ranges = ARRAY_SIZE(rt5677_ranges),
51950e826e86SOder Chiou };
51960e826e86SOder Chiou
51977b87463eSJavier Martinez Canillas static const struct of_device_id rt5677_of_match[] = {
5198f861e3e2SMatthias Kaehlcke { .compatible = "realtek,rt5677", .data = (const void *)RT5677 },
51997b87463eSJavier Martinez Canillas { }
52007b87463eSJavier Martinez Canillas };
52017b87463eSJavier Martinez Canillas MODULE_DEVICE_TABLE(of, rt5677_of_match);
52027b87463eSJavier Martinez Canillas
5203a36afb0aSAndy Shevchenko static const struct acpi_device_id rt5677_acpi_match[] = {
5204a36afb0aSAndy Shevchenko { "RT5677CE", RT5677 },
5205a36afb0aSAndy Shevchenko { }
5206a36afb0aSAndy Shevchenko };
5207a36afb0aSAndy Shevchenko MODULE_DEVICE_TABLE(acpi, rt5677_acpi_match);
5208a36afb0aSAndy Shevchenko
rt5677_read_device_properties(struct rt5677_priv * rt5677,struct device * dev)52098893cba2SFletcher Woodruff static void rt5677_read_device_properties(struct rt5677_priv *rt5677,
521089128534SJohn Keeping struct device *dev)
521189128534SJohn Keeping {
521289128534SJohn Keeping u32 val;
521389128534SJohn Keeping
52148893cba2SFletcher Woodruff rt5677->pdata.in1_diff =
52158893cba2SFletcher Woodruff device_property_read_bool(dev, "IN1") ||
52168893cba2SFletcher Woodruff device_property_read_bool(dev, "realtek,in1-differential");
521789128534SJohn Keeping
52188893cba2SFletcher Woodruff rt5677->pdata.in2_diff =
52198893cba2SFletcher Woodruff device_property_read_bool(dev, "IN2") ||
52208893cba2SFletcher Woodruff device_property_read_bool(dev, "realtek,in2-differential");
522189128534SJohn Keeping
52228893cba2SFletcher Woodruff rt5677->pdata.lout1_diff =
52238893cba2SFletcher Woodruff device_property_read_bool(dev, "OUT1") ||
52248893cba2SFletcher Woodruff device_property_read_bool(dev, "realtek,lout1-differential");
522589128534SJohn Keeping
52268893cba2SFletcher Woodruff rt5677->pdata.lout2_diff =
52278893cba2SFletcher Woodruff device_property_read_bool(dev, "OUT2") ||
52288893cba2SFletcher Woodruff device_property_read_bool(dev, "realtek,lout2-differential");
52298893cba2SFletcher Woodruff
52308893cba2SFletcher Woodruff rt5677->pdata.lout3_diff =
52318893cba2SFletcher Woodruff device_property_read_bool(dev, "OUT3") ||
52328893cba2SFletcher Woodruff device_property_read_bool(dev, "realtek,lout3-differential");
52336f67c380SAnatol Pomozov
52349bfde721SBen Zhang device_property_read_u8_array(dev, "realtek,gpio-config",
52358893cba2SFletcher Woodruff rt5677->pdata.gpio_config,
52368893cba2SFletcher Woodruff RT5677_GPIO_NUM);
523740eb90a1SAnatol Pomozov
52388893cba2SFletcher Woodruff if (!device_property_read_u32(dev, "DCLK", &val) ||
52398893cba2SFletcher Woodruff !device_property_read_u32(dev, "realtek,dmic2_clk_pin", &val))
52408893cba2SFletcher Woodruff rt5677->pdata.dmic2_clk_pin = val;
52418893cba2SFletcher Woodruff
52428893cba2SFletcher Woodruff if (!device_property_read_u32(dev, "JD1", &val) ||
52438893cba2SFletcher Woodruff !device_property_read_u32(dev, "realtek,jd1-gpio", &val))
52448893cba2SFletcher Woodruff rt5677->pdata.jd1_gpio = val;
52458893cba2SFletcher Woodruff
52468893cba2SFletcher Woodruff if (!device_property_read_u32(dev, "JD2", &val) ||
52478893cba2SFletcher Woodruff !device_property_read_u32(dev, "realtek,jd2-gpio", &val))
52488893cba2SFletcher Woodruff rt5677->pdata.jd2_gpio = val;
52498893cba2SFletcher Woodruff
52508893cba2SFletcher Woodruff if (!device_property_read_u32(dev, "JD3", &val) ||
52518893cba2SFletcher Woodruff !device_property_read_u32(dev, "realtek,jd3-gpio", &val))
52528893cba2SFletcher Woodruff rt5677->pdata.jd3_gpio = val;
5253f9f6a592SAnatol Pomozov }
5254f9f6a592SAnatol Pomozov
52554f7b018bSBen Zhang struct rt5677_irq_desc {
52564f7b018bSBen Zhang unsigned int enable_mask;
52574f7b018bSBen Zhang unsigned int status_mask;
52584f7b018bSBen Zhang unsigned int polarity_mask;
52594f7b018bSBen Zhang };
52604f7b018bSBen Zhang
52614f7b018bSBen Zhang static const struct rt5677_irq_desc rt5677_irq_descs[] = {
52625e3363adSOder Chiou [RT5677_IRQ_JD1] = {
52634f7b018bSBen Zhang .enable_mask = RT5677_EN_IRQ_GPIO_JD1,
52644f7b018bSBen Zhang .status_mask = RT5677_STA_GPIO_JD1,
52654f7b018bSBen Zhang .polarity_mask = RT5677_INV_GPIO_JD1,
52665e3363adSOder Chiou },
52675e3363adSOder Chiou [RT5677_IRQ_JD2] = {
52684f7b018bSBen Zhang .enable_mask = RT5677_EN_IRQ_GPIO_JD2,
52694f7b018bSBen Zhang .status_mask = RT5677_STA_GPIO_JD2,
52704f7b018bSBen Zhang .polarity_mask = RT5677_INV_GPIO_JD2,
52715e3363adSOder Chiou },
52725e3363adSOder Chiou [RT5677_IRQ_JD3] = {
52734f7b018bSBen Zhang .enable_mask = RT5677_EN_IRQ_GPIO_JD3,
52744f7b018bSBen Zhang .status_mask = RT5677_STA_GPIO_JD3,
52754f7b018bSBen Zhang .polarity_mask = RT5677_INV_GPIO_JD3,
52765e3363adSOder Chiou },
52775e3363adSOder Chiou };
52785e3363adSOder Chiou
rt5677_check_hotword(struct rt5677_priv * rt5677)5279a3b9ed55Skbuild test robot static bool rt5677_check_hotword(struct rt5677_priv *rt5677)
528021c00e5dSBen Zhang {
528121c00e5dSBen Zhang int reg_gpio;
528221c00e5dSBen Zhang
528321c00e5dSBen Zhang if (!rt5677->is_dsp_mode)
528421c00e5dSBen Zhang return false;
528521c00e5dSBen Zhang
528621c00e5dSBen Zhang if (regmap_read(rt5677->regmap, RT5677_GPIO_CTRL1, ®_gpio))
528721c00e5dSBen Zhang return false;
528821c00e5dSBen Zhang
528921c00e5dSBen Zhang /* Firmware sets GPIO1 pin to be GPIO1 after hotword is detected */
529021c00e5dSBen Zhang if ((reg_gpio & RT5677_GPIO1_PIN_MASK) == RT5677_GPIO1_PIN_IRQ)
529121c00e5dSBen Zhang return false;
529221c00e5dSBen Zhang
529321c00e5dSBen Zhang /* Set GPIO1 pin back to be IRQ output for jack detect */
529421c00e5dSBen Zhang regmap_update_bits(rt5677->regmap, RT5677_GPIO_CTRL1,
529521c00e5dSBen Zhang RT5677_GPIO1_PIN_MASK, RT5677_GPIO1_PIN_IRQ);
529621c00e5dSBen Zhang
529721c00e5dSBen Zhang rt5677_spi_hotword_detected();
529821c00e5dSBen Zhang return true;
529921c00e5dSBen Zhang }
530021c00e5dSBen Zhang
rt5677_irq(int unused,void * data)53014f7b018bSBen Zhang static irqreturn_t rt5677_irq(int unused, void *data)
53024f7b018bSBen Zhang {
53034f7b018bSBen Zhang struct rt5677_priv *rt5677 = data;
530451cb94f6SPierre-Louis Bossart int ret, loop, i, reg_irq, virq;
53054f7b018bSBen Zhang bool irq_fired = false;
53065e3363adSOder Chiou
53074f7b018bSBen Zhang mutex_lock(&rt5677->irq_lock);
5308df9091e9SBen Zhang
5309df9091e9SBen Zhang /*
5310df9091e9SBen Zhang * Loop to handle interrupts until the last i2c read shows no pending
5311df9091e9SBen Zhang * irqs. The interrupt line is shared by multiple interrupt sources.
5312df9091e9SBen Zhang * After the regmap_read() below, a new interrupt source line may
5313df9091e9SBen Zhang * become high before the regmap_write() finishes, so there isn't a
5314df9091e9SBen Zhang * rising edge on the shared interrupt line for the new interrupt. Thus,
5315df9091e9SBen Zhang * the loop is needed to avoid missing irqs.
5316df9091e9SBen Zhang *
5317df9091e9SBen Zhang * A safeguard of 20 loops is used to avoid hanging in the irq handler
5318df9091e9SBen Zhang * if there is something wrong with the interrupt status update. The
5319df9091e9SBen Zhang * interrupt sources here are audio jack plug/unplug events which
5320df9091e9SBen Zhang * shouldn't happen at a high frequency for a long period of time.
5321df9091e9SBen Zhang * Empirically, more than 3 loops have never been seen.
5322df9091e9SBen Zhang */
5323df9091e9SBen Zhang for (loop = 0; loop < 20; loop++) {
53244f7b018bSBen Zhang /* Read interrupt status */
53254f7b018bSBen Zhang ret = regmap_read(rt5677->regmap, RT5677_IRQ_CTRL1, ®_irq);
53264f7b018bSBen Zhang if (ret) {
5327df9091e9SBen Zhang dev_err(rt5677->dev, "failed reading IRQ status: %d\n",
5328df9091e9SBen Zhang ret);
53294f7b018bSBen Zhang goto exit;
53304f7b018bSBen Zhang }
53314f7b018bSBen Zhang
5332ae032156SCurtis Malainey irq_fired = false;
53334f7b018bSBen Zhang for (i = 0; i < RT5677_IRQ_NUM; i++) {
53344f7b018bSBen Zhang if (reg_irq & rt5677_irq_descs[i].status_mask) {
53354f7b018bSBen Zhang irq_fired = true;
53364f7b018bSBen Zhang virq = irq_find_mapping(rt5677->domain, i);
53374f7b018bSBen Zhang if (virq)
53384f7b018bSBen Zhang handle_nested_irq(virq);
53394f7b018bSBen Zhang
5340df9091e9SBen Zhang /* Clear the interrupt by flipping the polarity
5341df9091e9SBen Zhang * of the interrupt source line that fired
53424f7b018bSBen Zhang */
53434f7b018bSBen Zhang reg_irq ^= rt5677_irq_descs[i].polarity_mask;
53444f7b018bSBen Zhang }
53454f7b018bSBen Zhang }
534621c00e5dSBen Zhang
534721c00e5dSBen Zhang /* Exit the loop only when we know for sure that GPIO1 pin
534821c00e5dSBen Zhang * was low at some point since irq_lock was acquired. Any event
534921c00e5dSBen Zhang * after that point creates a rising edge that triggers another
535021c00e5dSBen Zhang * call to rt5677_irq().
535121c00e5dSBen Zhang */
535221c00e5dSBen Zhang if (!irq_fired && !rt5677_check_hotword(rt5677))
53534f7b018bSBen Zhang goto exit;
53544f7b018bSBen Zhang
53554f7b018bSBen Zhang ret = regmap_write(rt5677->regmap, RT5677_IRQ_CTRL1, reg_irq);
53564f7b018bSBen Zhang if (ret) {
5357df9091e9SBen Zhang dev_err(rt5677->dev, "failed updating IRQ status: %d\n",
5358df9091e9SBen Zhang ret);
53594f7b018bSBen Zhang goto exit;
53604f7b018bSBen Zhang }
5361df9091e9SBen Zhang }
53624f7b018bSBen Zhang exit:
536321c00e5dSBen Zhang WARN_ON_ONCE(loop == 20);
53644f7b018bSBen Zhang mutex_unlock(&rt5677->irq_lock);
53654f7b018bSBen Zhang if (irq_fired)
53664f7b018bSBen Zhang return IRQ_HANDLED;
53674f7b018bSBen Zhang else
53684f7b018bSBen Zhang return IRQ_NONE;
53694f7b018bSBen Zhang }
53704f7b018bSBen Zhang
rt5677_resume_irq_check(struct work_struct * work)5371ee0be4a9SBen Zhang static void rt5677_resume_irq_check(struct work_struct *work)
5372ee0be4a9SBen Zhang {
5373ee0be4a9SBen Zhang int i, virq;
5374ee0be4a9SBen Zhang struct rt5677_priv *rt5677 =
5375ee0be4a9SBen Zhang container_of(work, struct rt5677_priv, resume_irq_check.work);
5376ee0be4a9SBen Zhang
5377ee0be4a9SBen Zhang /* This is needed to check and clear the interrupt status register
5378ee0be4a9SBen Zhang * at resume. If the headset is plugged/unplugged when the device is
5379ee0be4a9SBen Zhang * fully suspended, there won't be a rising edge at resume to trigger
5380ee0be4a9SBen Zhang * the interrupt. Without this, we miss the next unplug/plug event.
5381ee0be4a9SBen Zhang */
5382ee0be4a9SBen Zhang rt5677_irq(0, rt5677);
5383ee0be4a9SBen Zhang
5384ee0be4a9SBen Zhang /* Call all enabled jack detect irq handlers again. This is needed in
5385ee0be4a9SBen Zhang * addition to the above check for a corner case caused by jack gpio
5386ee0be4a9SBen Zhang * debounce. After codec irq is disabled at suspend, the delayed work
5387ee0be4a9SBen Zhang * scheduled by soc-jack may run and read wrong jack gpio values, since
5388ee0be4a9SBen Zhang * the regmap is in cache only mode. At resume, there is no irq because
5389ee0be4a9SBen Zhang * rt5677_irq has already ran and cleared the irq status at suspend.
5390ee0be4a9SBen Zhang * Without this explicit check, unplug the headset right after suspend
5391ee0be4a9SBen Zhang * starts, then after resume the headset is still shown as plugged in.
5392ee0be4a9SBen Zhang */
5393ee0be4a9SBen Zhang mutex_lock(&rt5677->irq_lock);
5394ee0be4a9SBen Zhang for (i = 0; i < RT5677_IRQ_NUM; i++) {
5395ee0be4a9SBen Zhang if (rt5677->irq_en & rt5677_irq_descs[i].enable_mask) {
5396ee0be4a9SBen Zhang virq = irq_find_mapping(rt5677->domain, i);
5397ee0be4a9SBen Zhang if (virq)
5398ee0be4a9SBen Zhang handle_nested_irq(virq);
5399ee0be4a9SBen Zhang }
5400ee0be4a9SBen Zhang }
5401ee0be4a9SBen Zhang mutex_unlock(&rt5677->irq_lock);
5402ee0be4a9SBen Zhang }
5403ee0be4a9SBen Zhang
rt5677_irq_bus_lock(struct irq_data * data)54044f7b018bSBen Zhang static void rt5677_irq_bus_lock(struct irq_data *data)
54054f7b018bSBen Zhang {
54064f7b018bSBen Zhang struct rt5677_priv *rt5677 = irq_data_get_irq_chip_data(data);
54074f7b018bSBen Zhang
54084f7b018bSBen Zhang mutex_lock(&rt5677->irq_lock);
54094f7b018bSBen Zhang }
54104f7b018bSBen Zhang
rt5677_irq_bus_sync_unlock(struct irq_data * data)54114f7b018bSBen Zhang static void rt5677_irq_bus_sync_unlock(struct irq_data *data)
54124f7b018bSBen Zhang {
54134f7b018bSBen Zhang struct rt5677_priv *rt5677 = irq_data_get_irq_chip_data(data);
54144f7b018bSBen Zhang
54154f7b018bSBen Zhang // Set the enable/disable bits for the jack detect IRQs.
54164f7b018bSBen Zhang regmap_update_bits(rt5677->regmap, RT5677_IRQ_CTRL1,
54174f7b018bSBen Zhang RT5677_EN_IRQ_GPIO_JD1 | RT5677_EN_IRQ_GPIO_JD2 |
54184f7b018bSBen Zhang RT5677_EN_IRQ_GPIO_JD3, rt5677->irq_en);
54194f7b018bSBen Zhang mutex_unlock(&rt5677->irq_lock);
54204f7b018bSBen Zhang }
54214f7b018bSBen Zhang
rt5677_irq_enable(struct irq_data * data)54224f7b018bSBen Zhang static void rt5677_irq_enable(struct irq_data *data)
54234f7b018bSBen Zhang {
54244f7b018bSBen Zhang struct rt5677_priv *rt5677 = irq_data_get_irq_chip_data(data);
54254f7b018bSBen Zhang
54264f7b018bSBen Zhang rt5677->irq_en |= rt5677_irq_descs[data->hwirq].enable_mask;
54274f7b018bSBen Zhang }
54284f7b018bSBen Zhang
rt5677_irq_disable(struct irq_data * data)54294f7b018bSBen Zhang static void rt5677_irq_disable(struct irq_data *data)
54304f7b018bSBen Zhang {
54314f7b018bSBen Zhang struct rt5677_priv *rt5677 = irq_data_get_irq_chip_data(data);
54324f7b018bSBen Zhang
54334f7b018bSBen Zhang rt5677->irq_en &= ~rt5677_irq_descs[data->hwirq].enable_mask;
54344f7b018bSBen Zhang }
54354f7b018bSBen Zhang
54364f7b018bSBen Zhang static struct irq_chip rt5677_irq_chip = {
54374f7b018bSBen Zhang .name = "rt5677_irq_chip",
54384f7b018bSBen Zhang .irq_bus_lock = rt5677_irq_bus_lock,
54394f7b018bSBen Zhang .irq_bus_sync_unlock = rt5677_irq_bus_sync_unlock,
54404f7b018bSBen Zhang .irq_disable = rt5677_irq_disable,
54414f7b018bSBen Zhang .irq_enable = rt5677_irq_enable,
54424f7b018bSBen Zhang };
54434f7b018bSBen Zhang
rt5677_irq_map(struct irq_domain * h,unsigned int virq,irq_hw_number_t hw)54444f7b018bSBen Zhang static int rt5677_irq_map(struct irq_domain *h, unsigned int virq,
54454f7b018bSBen Zhang irq_hw_number_t hw)
54464f7b018bSBen Zhang {
54474f7b018bSBen Zhang struct rt5677_priv *rt5677 = h->host_data;
54484f7b018bSBen Zhang
54494f7b018bSBen Zhang irq_set_chip_data(virq, rt5677);
54504f7b018bSBen Zhang irq_set_chip(virq, &rt5677_irq_chip);
54514f7b018bSBen Zhang irq_set_nested_thread(virq, 1);
54524f7b018bSBen Zhang irq_set_noprobe(virq);
54534f7b018bSBen Zhang return 0;
54544f7b018bSBen Zhang }
54554f7b018bSBen Zhang
54564f7b018bSBen Zhang
54574f7b018bSBen Zhang static const struct irq_domain_ops rt5677_domain_ops = {
54584f7b018bSBen Zhang .map = rt5677_irq_map,
54594f7b018bSBen Zhang .xlate = irq_domain_xlate_twocell,
54605e3363adSOder Chiou };
54615e3363adSOder Chiou
rt5677_init_irq(struct i2c_client * i2c)546235d40d10SOder Chiou static int rt5677_init_irq(struct i2c_client *i2c)
54635e3363adSOder Chiou {
54645e3363adSOder Chiou int ret;
54655e3363adSOder Chiou struct rt5677_priv *rt5677 = i2c_get_clientdata(i2c);
546624180064SFletcher Woodruff unsigned int jd_mask = 0, jd_val = 0;
54675e3363adSOder Chiou
54685e3363adSOder Chiou if (!rt5677->pdata.jd1_gpio &&
54695e3363adSOder Chiou !rt5677->pdata.jd2_gpio &&
54705e3363adSOder Chiou !rt5677->pdata.jd3_gpio)
54715e3363adSOder Chiou return 0;
54725e3363adSOder Chiou
54735e3363adSOder Chiou if (!i2c->irq) {
54745e3363adSOder Chiou dev_err(&i2c->dev, "No interrupt specified\n");
54755e3363adSOder Chiou return -EINVAL;
54765e3363adSOder Chiou }
54775e3363adSOder Chiou
54784f7b018bSBen Zhang mutex_init(&rt5677->irq_lock);
5479ee0be4a9SBen Zhang INIT_DELAYED_WORK(&rt5677->resume_irq_check, rt5677_resume_irq_check);
54804f7b018bSBen Zhang
548124180064SFletcher Woodruff /*
548224180064SFletcher Woodruff * Select RC as the debounce clock so that GPIO works even when
548324180064SFletcher Woodruff * MCLK is gated which happens when there is no audio stream
548424180064SFletcher Woodruff * (SND_SOC_BIAS_OFF).
548524180064SFletcher Woodruff */
548624180064SFletcher Woodruff regmap_update_bits(rt5677->regmap, RT5677_DIG_MISC,
548724180064SFletcher Woodruff RT5677_IRQ_DEBOUNCE_SEL_MASK,
548824180064SFletcher Woodruff RT5677_IRQ_DEBOUNCE_SEL_RC);
548924180064SFletcher Woodruff /* Enable auto power on RC when GPIO states are changed */
549024180064SFletcher Woodruff regmap_update_bits(rt5677->regmap, RT5677_GEN_CTRL1, 0xff, 0xff);
549124180064SFletcher Woodruff
549224180064SFletcher Woodruff /* Select and enable jack detection sources per platform data */
549324180064SFletcher Woodruff if (rt5677->pdata.jd1_gpio) {
549424180064SFletcher Woodruff jd_mask |= RT5677_SEL_GPIO_JD1_MASK;
549524180064SFletcher Woodruff jd_val |= rt5677->pdata.jd1_gpio << RT5677_SEL_GPIO_JD1_SFT;
549624180064SFletcher Woodruff }
549724180064SFletcher Woodruff if (rt5677->pdata.jd2_gpio) {
549824180064SFletcher Woodruff jd_mask |= RT5677_SEL_GPIO_JD2_MASK;
549924180064SFletcher Woodruff jd_val |= rt5677->pdata.jd2_gpio << RT5677_SEL_GPIO_JD2_SFT;
550024180064SFletcher Woodruff }
550124180064SFletcher Woodruff if (rt5677->pdata.jd3_gpio) {
550224180064SFletcher Woodruff jd_mask |= RT5677_SEL_GPIO_JD3_MASK;
550324180064SFletcher Woodruff jd_val |= rt5677->pdata.jd3_gpio << RT5677_SEL_GPIO_JD3_SFT;
550424180064SFletcher Woodruff }
550524180064SFletcher Woodruff regmap_update_bits(rt5677->regmap, RT5677_JD_CTRL1, jd_mask, jd_val);
550624180064SFletcher Woodruff
550724180064SFletcher Woodruff /* Set GPIO1 pin to be IRQ output */
550824180064SFletcher Woodruff regmap_update_bits(rt5677->regmap, RT5677_GPIO_CTRL1,
550924180064SFletcher Woodruff RT5677_GPIO1_PIN_MASK, RT5677_GPIO1_PIN_IRQ);
551024180064SFletcher Woodruff
55114f7b018bSBen Zhang /* Ready to listen for interrupts */
5512c3d42d7bSAndy Shevchenko rt5677->domain = irq_domain_create_linear(dev_fwnode(&i2c->dev),
55134f7b018bSBen Zhang RT5677_IRQ_NUM, &rt5677_domain_ops, rt5677);
55144f7b018bSBen Zhang if (!rt5677->domain) {
55154f7b018bSBen Zhang dev_err(&i2c->dev, "Failed to create IRQ domain\n");
55164f7b018bSBen Zhang return -ENOMEM;
55174f7b018bSBen Zhang }
55185e3363adSOder Chiou
55194f7b018bSBen Zhang ret = devm_request_threaded_irq(&i2c->dev, i2c->irq, NULL, rt5677_irq,
55204f7b018bSBen Zhang IRQF_TRIGGER_RISING | IRQF_ONESHOT,
55214f7b018bSBen Zhang "rt5677", rt5677);
55224f7b018bSBen Zhang if (ret)
55234f7b018bSBen Zhang dev_err(&i2c->dev, "Failed to request IRQ: %d\n", ret);
55244f7b018bSBen Zhang
5525ee0be4a9SBen Zhang rt5677->irq = i2c->irq;
5526ee0be4a9SBen Zhang
55275e3363adSOder Chiou return ret;
55285e3363adSOder Chiou }
55295e3363adSOder Chiou
rt5677_i2c_probe(struct i2c_client * i2c)55303a4f4f29SAndy Shevchenko static int rt5677_i2c_probe(struct i2c_client *i2c)
55310e826e86SOder Chiou {
5532043bb9c0SAndy Shevchenko struct device *dev = &i2c->dev;
55330e826e86SOder Chiou struct rt5677_priv *rt5677;
55340e826e86SOder Chiou int ret;
55350e826e86SOder Chiou unsigned int val;
55360e826e86SOder Chiou
55370e826e86SOder Chiou rt5677 = devm_kzalloc(&i2c->dev, sizeof(struct rt5677_priv),
55380e826e86SOder Chiou GFP_KERNEL);
55390e826e86SOder Chiou if (rt5677 == NULL)
55400e826e86SOder Chiou return -ENOMEM;
55410e826e86SOder Chiou
55424f7b018bSBen Zhang rt5677->dev = &i2c->dev;
5543461c6232SBen Zhang rt5677->set_dsp_vad = rt5677_set_dsp_vad;
5544461c6232SBen Zhang INIT_DELAYED_WORK(&rt5677->dsp_work, rt5677_dsp_work);
55450e826e86SOder Chiou i2c_set_clientdata(i2c, rt5677);
55460e826e86SOder Chiou
5547043bb9c0SAndy Shevchenko rt5677->type = (enum rt5677_type)(uintptr_t)device_get_match_data(dev);
5548043bb9c0SAndy Shevchenko if (rt5677->type == 0)
554989128534SJohn Keeping return -EINVAL;
55500e826e86SOder Chiou
55518893cba2SFletcher Woodruff rt5677_read_device_properties(rt5677, &i2c->dev);
55528893cba2SFletcher Woodruff
5553efd901eeSBen Zhang /* pow-ldo2 and reset are optional. The codec pins may be statically
5554efd901eeSBen Zhang * connected on the board without gpios. If the gpio device property
5555efd901eeSBen Zhang * isn't specified, devm_gpiod_get_optional returns NULL.
5556efd901eeSBen Zhang */
5557efd901eeSBen Zhang rt5677->pow_ldo2 = devm_gpiod_get_optional(&i2c->dev,
5558efd901eeSBen Zhang "realtek,pow-ldo2", GPIOD_OUT_HIGH);
5559efd901eeSBen Zhang if (IS_ERR(rt5677->pow_ldo2)) {
5560efd901eeSBen Zhang ret = PTR_ERR(rt5677->pow_ldo2);
5561efd901eeSBen Zhang dev_err(&i2c->dev, "Failed to request POW_LDO2: %d\n", ret);
5562f9f6a592SAnatol Pomozov return ret;
5563f9f6a592SAnatol Pomozov }
5564efd901eeSBen Zhang rt5677->reset_pin = devm_gpiod_get_optional(&i2c->dev,
5565cdab0d4eSAnatol Pomozov "realtek,reset", GPIOD_OUT_LOW);
5566efd901eeSBen Zhang if (IS_ERR(rt5677->reset_pin)) {
5567efd901eeSBen Zhang ret = PTR_ERR(rt5677->reset_pin);
5568efd901eeSBen Zhang dev_err(&i2c->dev, "Failed to request RESET: %d\n", ret);
5569f9f6a592SAnatol Pomozov return ret;
5570f9f6a592SAnatol Pomozov }
5571b3b10e99SAnatol Pomozov
5572efd901eeSBen Zhang if (rt5677->pow_ldo2 || rt5677->reset_pin) {
5573f9f6a592SAnatol Pomozov /* Wait a while until I2C bus becomes available. The datasheet
5574f9f6a592SAnatol Pomozov * does not specify the exact we should wait but startup
5575f9f6a592SAnatol Pomozov * sequence mentiones at least a few milliseconds.
5576f9f6a592SAnatol Pomozov */
5577f9f6a592SAnatol Pomozov msleep(10);
5578f9f6a592SAnatol Pomozov }
5579f9f6a592SAnatol Pomozov
558019ba484dSOder Chiou rt5677->regmap_physical = devm_regmap_init_i2c(i2c,
558119ba484dSOder Chiou &rt5677_regmap_physical);
558219ba484dSOder Chiou if (IS_ERR(rt5677->regmap_physical)) {
558319ba484dSOder Chiou ret = PTR_ERR(rt5677->regmap_physical);
558419ba484dSOder Chiou dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
558519ba484dSOder Chiou ret);
558619ba484dSOder Chiou return ret;
558719ba484dSOder Chiou }
558819ba484dSOder Chiou
558919ba484dSOder Chiou rt5677->regmap = devm_regmap_init(&i2c->dev, NULL, i2c, &rt5677_regmap);
55900e826e86SOder Chiou if (IS_ERR(rt5677->regmap)) {
55910e826e86SOder Chiou ret = PTR_ERR(rt5677->regmap);
55920e826e86SOder Chiou dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
55930e826e86SOder Chiou ret);
55940e826e86SOder Chiou return ret;
55950e826e86SOder Chiou }
55960e826e86SOder Chiou
55970e826e86SOder Chiou regmap_read(rt5677->regmap, RT5677_VENDOR_ID2, &val);
55980e826e86SOder Chiou if (val != RT5677_DEVICE_ID) {
55990e826e86SOder Chiou dev_err(&i2c->dev,
5600aa0bcc5cSJarkko Nikula "Device with ID register %#x is not rt5677\n", val);
56010e826e86SOder Chiou return -ENODEV;
56020e826e86SOder Chiou }
56030e826e86SOder Chiou
56040e826e86SOder Chiou regmap_write(rt5677->regmap, RT5677_RESET, 0x10ec);
56050e826e86SOder Chiou
56060e826e86SOder Chiou ret = regmap_register_patch(rt5677->regmap, init_list,
56070e826e86SOder Chiou ARRAY_SIZE(init_list));
56080e826e86SOder Chiou if (ret != 0)
56090e826e86SOder Chiou dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret);
56100e826e86SOder Chiou
56110e826e86SOder Chiou if (rt5677->pdata.in1_diff)
56120e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_IN1,
56130e826e86SOder Chiou RT5677_IN_DF1, RT5677_IN_DF1);
56140e826e86SOder Chiou
56150e826e86SOder Chiou if (rt5677->pdata.in2_diff)
56160e826e86SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_IN1,
56170e826e86SOder Chiou RT5677_IN_DF2, RT5677_IN_DF2);
56180e826e86SOder Chiou
56196f67c380SAnatol Pomozov if (rt5677->pdata.lout1_diff)
56206f67c380SAnatol Pomozov regmap_update_bits(rt5677->regmap, RT5677_LOUT1,
56216f67c380SAnatol Pomozov RT5677_LOUT1_L_DF, RT5677_LOUT1_L_DF);
56226f67c380SAnatol Pomozov
56236f67c380SAnatol Pomozov if (rt5677->pdata.lout2_diff)
56246f67c380SAnatol Pomozov regmap_update_bits(rt5677->regmap, RT5677_LOUT1,
56256f67c380SAnatol Pomozov RT5677_LOUT2_L_DF, RT5677_LOUT2_L_DF);
56266f67c380SAnatol Pomozov
56276f67c380SAnatol Pomozov if (rt5677->pdata.lout3_diff)
56286f67c380SAnatol Pomozov regmap_update_bits(rt5677->regmap, RT5677_LOUT1,
56296f67c380SAnatol Pomozov RT5677_LOUT3_L_DF, RT5677_LOUT3_L_DF);
56306f67c380SAnatol Pomozov
56312d15d974SBard Liao if (rt5677->pdata.dmic2_clk_pin == RT5677_DMIC_CLK2) {
56322d15d974SBard Liao regmap_update_bits(rt5677->regmap, RT5677_GEN_CTRL2,
56332d15d974SBard Liao RT5677_GPIO5_FUNC_MASK,
56342d15d974SBard Liao RT5677_GPIO5_FUNC_DMIC);
56355512ffd9SAndy Shevchenko rt5677_update_gpio_bits(rt5677, RT5677_GPIO5,
56365512ffd9SAndy Shevchenko RT5677_GPIOx_DIR_MASK,
56375512ffd9SAndy Shevchenko RT5677_GPIOx_DIR_OUT);
56382d15d974SBard Liao }
56392d15d974SBard Liao
5640277880a3SOder Chiou if (rt5677->pdata.micbias1_vdd_3v3)
5641277880a3SOder Chiou regmap_update_bits(rt5677->regmap, RT5677_MICBIAS,
5642277880a3SOder Chiou RT5677_MICBIAS1_CTRL_VDD_MASK,
5643277880a3SOder Chiou RT5677_MICBIAS1_CTRL_VDD_3_3V);
5644277880a3SOder Chiou
564544caf764SOder Chiou rt5677_init_gpio(i2c);
56464f7b018bSBen Zhang ret = rt5677_init_irq(i2c);
56474f7b018bSBen Zhang if (ret)
56484f7b018bSBen Zhang dev_err(&i2c->dev, "Failed to initialize irq: %d\n", ret);
564944caf764SOder Chiou
565079223bf1SKuninori Morimoto return devm_snd_soc_register_component(&i2c->dev,
565179223bf1SKuninori Morimoto &soc_component_dev_rt5677,
56520e826e86SOder Chiou rt5677_dai, ARRAY_SIZE(rt5677_dai));
56530e826e86SOder Chiou }
56540e826e86SOder Chiou
rt5677_i2c_remove(struct i2c_client * i2c)5655ed5c2f5fSUwe Kleine-König static void rt5677_i2c_remove(struct i2c_client *i2c)
56560e826e86SOder Chiou {
565744caf764SOder Chiou rt5677_free_gpio(i2c);
56580e826e86SOder Chiou }
56590e826e86SOder Chiou
56600e826e86SOder Chiou static struct i2c_driver rt5677_i2c_driver = {
56610e826e86SOder Chiou .driver = {
5662893d1a9cSCurtis Malainey .name = RT5677_DRV_NAME,
56637b87463eSJavier Martinez Canillas .of_match_table = rt5677_of_match,
5664043bb9c0SAndy Shevchenko .acpi_match_table = rt5677_acpi_match,
56650e826e86SOder Chiou },
56669abcd240SUwe Kleine-König .probe = rt5677_i2c_probe,
56670e826e86SOder Chiou .remove = rt5677_i2c_remove,
56680e826e86SOder Chiou };
5669c8cfbec8SAxel Lin module_i2c_driver(rt5677_i2c_driver);
56700e826e86SOder Chiou
56710e826e86SOder Chiou MODULE_DESCRIPTION("ASoC RT5677 driver");
56720e826e86SOder Chiou MODULE_AUTHOR("Oder Chiou <oder_chiou@realtek.com>");
56730e826e86SOder Chiou MODULE_LICENSE("GPL v2");
56740f9c14e5SJuerg Haefliger
56750f9c14e5SJuerg Haefliger MODULE_FIRMWARE("rt5677_elf_vad");
5676