brintos

brintos / linux-shallow public Read only

0
0
Text · 182.3 KiB · 0e70a3a Raw
5676 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * rt5677.c  --  RT5677 ALSA SoC audio codec driver4 *5 * Copyright 2013 Realtek Semiconductor Corp.6 * Author: Oder Chiou <oder_chiou@realtek.com>7 */8 9#include <linux/delay.h>10#include <linux/firmware.h>11#include <linux/fs.h>12#include <linux/i2c.h>13#include <linux/init.h>14#include <linux/interrupt.h>15#include <linux/irqdomain.h>16#include <linux/irq.h>17#include <linux/module.h>18#include <linux/moduleparam.h>19#include <linux/platform_device.h>20#include <linux/pm.h>21#include <linux/property.h>22#include <linux/regmap.h>23#include <linux/spi/spi.h>24#include <linux/workqueue.h>25#include <sound/core.h>26#include <sound/pcm.h>27#include <sound/pcm_params.h>28#include <sound/soc.h>29#include <sound/soc-dapm.h>30#include <sound/initval.h>31#include <sound/tlv.h>32 33#include "rl6231.h"34#include "rt5677.h"35#include "rt5677-spi.h"36 37#define RT5677_DEVICE_ID 0x632738 39/* Register controlling boot vector */40#define RT5677_DSP_BOOT_VECTOR		0x1801f09041#define RT5677_MODEL_ADDR		0x5FFC980042 43#define RT5677_PR_RANGE_BASE (0xff + 1)44#define RT5677_PR_SPACING 0x10045 46#define RT5677_PR_BASE (RT5677_PR_RANGE_BASE + (0 * RT5677_PR_SPACING))47 48static const struct regmap_range_cfg rt5677_ranges[] = {49	{50		.name = "PR",51		.range_min = RT5677_PR_BASE,52		.range_max = RT5677_PR_BASE + 0xfd,53		.selector_reg = RT5677_PRIV_INDEX,54		.selector_mask = 0xff,55		.selector_shift = 0x0,56		.window_start = RT5677_PRIV_DATA,57		.window_len = 0x1,58	},59};60 61static const struct reg_sequence init_list[] = {62	{RT5677_ASRC_12,	0x0018},63	{RT5677_PR_BASE + 0x3d,	0x364d},64	{RT5677_PR_BASE + 0x17,	0x4fc0},65	{RT5677_PR_BASE + 0x13,	0x0312},66	{RT5677_PR_BASE + 0x1e,	0x0000},67	{RT5677_PR_BASE + 0x12,	0x0eaa},68	{RT5677_PR_BASE + 0x14,	0x018a},69	{RT5677_PR_BASE + 0x15,	0x0490},70	{RT5677_PR_BASE + 0x38,	0x0f71},71	{RT5677_PR_BASE + 0x39,	0x0f71},72};73#define RT5677_INIT_REG_LEN ARRAY_SIZE(init_list)74 75static const struct reg_default rt5677_reg[] = {76	{RT5677_RESET			, 0x0000},77	{RT5677_LOUT1			, 0xa800},78	{RT5677_IN1			, 0x0000},79	{RT5677_MICBIAS			, 0x0000},80	{RT5677_SLIMBUS_PARAM		, 0x0000},81	{RT5677_SLIMBUS_RX		, 0x0000},82	{RT5677_SLIMBUS_CTRL		, 0x0000},83	{RT5677_SIDETONE_CTRL		, 0x000b},84	{RT5677_ANA_DAC1_2_3_SRC	, 0x0000},85	{RT5677_IF_DSP_DAC3_4_MIXER	, 0x1111},86	{RT5677_DAC4_DIG_VOL		, 0xafaf},87	{RT5677_DAC3_DIG_VOL		, 0xafaf},88	{RT5677_DAC1_DIG_VOL		, 0xafaf},89	{RT5677_DAC2_DIG_VOL		, 0xafaf},90	{RT5677_IF_DSP_DAC2_MIXER	, 0x0011},91	{RT5677_STO1_ADC_DIG_VOL	, 0x2f2f},92	{RT5677_MONO_ADC_DIG_VOL	, 0x2f2f},93	{RT5677_STO1_2_ADC_BST		, 0x0000},94	{RT5677_STO2_ADC_DIG_VOL	, 0x2f2f},95	{RT5677_ADC_BST_CTRL2		, 0x0000},96	{RT5677_STO3_4_ADC_BST		, 0x0000},97	{RT5677_STO3_ADC_DIG_VOL	, 0x2f2f},98	{RT5677_STO4_ADC_DIG_VOL	, 0x2f2f},99	{RT5677_STO4_ADC_MIXER		, 0xd4c0},100	{RT5677_STO3_ADC_MIXER		, 0xd4c0},101	{RT5677_STO2_ADC_MIXER		, 0xd4c0},102	{RT5677_STO1_ADC_MIXER		, 0xd4c0},103	{RT5677_MONO_ADC_MIXER		, 0xd4d1},104	{RT5677_ADC_IF_DSP_DAC1_MIXER	, 0x8080},105	{RT5677_STO1_DAC_MIXER		, 0xaaaa},106	{RT5677_MONO_DAC_MIXER		, 0xaaaa},107	{RT5677_DD1_MIXER		, 0xaaaa},108	{RT5677_DD2_MIXER		, 0xaaaa},109	{RT5677_IF3_DATA		, 0x0000},110	{RT5677_IF4_DATA		, 0x0000},111	{RT5677_PDM_OUT_CTRL		, 0x8888},112	{RT5677_PDM_DATA_CTRL1		, 0x0000},113	{RT5677_PDM_DATA_CTRL2		, 0x0000},114	{RT5677_PDM1_DATA_CTRL2		, 0x0000},115	{RT5677_PDM1_DATA_CTRL3		, 0x0000},116	{RT5677_PDM1_DATA_CTRL4		, 0x0000},117	{RT5677_PDM2_DATA_CTRL2		, 0x0000},118	{RT5677_PDM2_DATA_CTRL3		, 0x0000},119	{RT5677_PDM2_DATA_CTRL4		, 0x0000},120	{RT5677_TDM1_CTRL1		, 0x0300},121	{RT5677_TDM1_CTRL2		, 0x0000},122	{RT5677_TDM1_CTRL3		, 0x4000},123	{RT5677_TDM1_CTRL4		, 0x0123},124	{RT5677_TDM1_CTRL5		, 0x4567},125	{RT5677_TDM2_CTRL1		, 0x0300},126	{RT5677_TDM2_CTRL2		, 0x0000},127	{RT5677_TDM2_CTRL3		, 0x4000},128	{RT5677_TDM2_CTRL4		, 0x0123},129	{RT5677_TDM2_CTRL5		, 0x4567},130	{RT5677_I2C_MASTER_CTRL1	, 0x0001},131	{RT5677_I2C_MASTER_CTRL2	, 0x0000},132	{RT5677_I2C_MASTER_CTRL3	, 0x0000},133	{RT5677_I2C_MASTER_CTRL4	, 0x0000},134	{RT5677_I2C_MASTER_CTRL5	, 0x0000},135	{RT5677_I2C_MASTER_CTRL6	, 0x0000},136	{RT5677_I2C_MASTER_CTRL7	, 0x0000},137	{RT5677_I2C_MASTER_CTRL8	, 0x0000},138	{RT5677_DMIC_CTRL1		, 0x1505},139	{RT5677_DMIC_CTRL2		, 0x0055},140	{RT5677_HAP_GENE_CTRL1		, 0x0111},141	{RT5677_HAP_GENE_CTRL2		, 0x0064},142	{RT5677_HAP_GENE_CTRL3		, 0xef0e},143	{RT5677_HAP_GENE_CTRL4		, 0xf0f0},144	{RT5677_HAP_GENE_CTRL5		, 0xef0e},145	{RT5677_HAP_GENE_CTRL6		, 0xf0f0},146	{RT5677_HAP_GENE_CTRL7		, 0xef0e},147	{RT5677_HAP_GENE_CTRL8		, 0xf0f0},148	{RT5677_HAP_GENE_CTRL9		, 0xf000},149	{RT5677_HAP_GENE_CTRL10		, 0x0000},150	{RT5677_PWR_DIG1		, 0x0000},151	{RT5677_PWR_DIG2		, 0x0000},152	{RT5677_PWR_ANLG1		, 0x0055},153	{RT5677_PWR_ANLG2		, 0x0000},154	{RT5677_PWR_DSP1		, 0x0001},155	{RT5677_PWR_DSP_ST		, 0x0000},156	{RT5677_PWR_DSP2		, 0x0000},157	{RT5677_ADC_DAC_HPF_CTRL1	, 0x0e00},158	{RT5677_PRIV_INDEX		, 0x0000},159	{RT5677_PRIV_DATA		, 0x0000},160	{RT5677_I2S4_SDP		, 0x8000},161	{RT5677_I2S1_SDP		, 0x8000},162	{RT5677_I2S2_SDP		, 0x8000},163	{RT5677_I2S3_SDP		, 0x8000},164	{RT5677_CLK_TREE_CTRL1		, 0x1111},165	{RT5677_CLK_TREE_CTRL2		, 0x1111},166	{RT5677_CLK_TREE_CTRL3		, 0x0000},167	{RT5677_PLL1_CTRL1		, 0x0000},168	{RT5677_PLL1_CTRL2		, 0x0000},169	{RT5677_PLL2_CTRL1		, 0x0c60},170	{RT5677_PLL2_CTRL2		, 0x2000},171	{RT5677_GLB_CLK1		, 0x0000},172	{RT5677_GLB_CLK2		, 0x0000},173	{RT5677_ASRC_1			, 0x0000},174	{RT5677_ASRC_2			, 0x0000},175	{RT5677_ASRC_3			, 0x0000},176	{RT5677_ASRC_4			, 0x0000},177	{RT5677_ASRC_5			, 0x0000},178	{RT5677_ASRC_6			, 0x0000},179	{RT5677_ASRC_7			, 0x0000},180	{RT5677_ASRC_8			, 0x0000},181	{RT5677_ASRC_9			, 0x0000},182	{RT5677_ASRC_10			, 0x0000},183	{RT5677_ASRC_11			, 0x0000},184	{RT5677_ASRC_12			, 0x0018},185	{RT5677_ASRC_13			, 0x0000},186	{RT5677_ASRC_14			, 0x0000},187	{RT5677_ASRC_15			, 0x0000},188	{RT5677_ASRC_16			, 0x0000},189	{RT5677_ASRC_17			, 0x0000},190	{RT5677_ASRC_18			, 0x0000},191	{RT5677_ASRC_19			, 0x0000},192	{RT5677_ASRC_20			, 0x0000},193	{RT5677_ASRC_21			, 0x000c},194	{RT5677_ASRC_22			, 0x0000},195	{RT5677_ASRC_23			, 0x0000},196	{RT5677_VAD_CTRL1		, 0x2184},197	{RT5677_VAD_CTRL2		, 0x010a},198	{RT5677_VAD_CTRL3		, 0x0aea},199	{RT5677_VAD_CTRL4		, 0x000c},200	{RT5677_VAD_CTRL5		, 0x0000},201	{RT5677_DSP_INB_CTRL1		, 0x0000},202	{RT5677_DSP_INB_CTRL2		, 0x0000},203	{RT5677_DSP_IN_OUTB_CTRL	, 0x0000},204	{RT5677_DSP_OUTB0_1_DIG_VOL	, 0x2f2f},205	{RT5677_DSP_OUTB2_3_DIG_VOL	, 0x2f2f},206	{RT5677_DSP_OUTB4_5_DIG_VOL	, 0x2f2f},207	{RT5677_DSP_OUTB6_7_DIG_VOL	, 0x2f2f},208	{RT5677_ADC_EQ_CTRL1		, 0x6000},209	{RT5677_ADC_EQ_CTRL2		, 0x0000},210	{RT5677_EQ_CTRL1		, 0xc000},211	{RT5677_EQ_CTRL2		, 0x0000},212	{RT5677_EQ_CTRL3		, 0x0000},213	{RT5677_SOFT_VOL_ZERO_CROSS1	, 0x0009},214	{RT5677_JD_CTRL1		, 0x0000},215	{RT5677_JD_CTRL2		, 0x0000},216	{RT5677_JD_CTRL3		, 0x0000},217	{RT5677_IRQ_CTRL1		, 0x0000},218	{RT5677_IRQ_CTRL2		, 0x0000},219	{RT5677_GPIO_ST			, 0x0000},220	{RT5677_GPIO_CTRL1		, 0x0000},221	{RT5677_GPIO_CTRL2		, 0x0000},222	{RT5677_GPIO_CTRL3		, 0x0000},223	{RT5677_STO1_ADC_HI_FILTER1	, 0xb320},224	{RT5677_STO1_ADC_HI_FILTER2	, 0x0000},225	{RT5677_MONO_ADC_HI_FILTER1	, 0xb300},226	{RT5677_MONO_ADC_HI_FILTER2	, 0x0000},227	{RT5677_STO2_ADC_HI_FILTER1	, 0xb300},228	{RT5677_STO2_ADC_HI_FILTER2	, 0x0000},229	{RT5677_STO3_ADC_HI_FILTER1	, 0xb300},230	{RT5677_STO3_ADC_HI_FILTER2	, 0x0000},231	{RT5677_STO4_ADC_HI_FILTER1	, 0xb300},232	{RT5677_STO4_ADC_HI_FILTER2	, 0x0000},233	{RT5677_MB_DRC_CTRL1		, 0x0f20},234	{RT5677_DRC1_CTRL1		, 0x001f},235	{RT5677_DRC1_CTRL2		, 0x020c},236	{RT5677_DRC1_CTRL3		, 0x1f00},237	{RT5677_DRC1_CTRL4		, 0x0000},238	{RT5677_DRC1_CTRL5		, 0x0000},239	{RT5677_DRC1_CTRL6		, 0x0029},240	{RT5677_DRC2_CTRL1		, 0x001f},241	{RT5677_DRC2_CTRL2		, 0x020c},242	{RT5677_DRC2_CTRL3		, 0x1f00},243	{RT5677_DRC2_CTRL4		, 0x0000},244	{RT5677_DRC2_CTRL5		, 0x0000},245	{RT5677_DRC2_CTRL6		, 0x0029},246	{RT5677_DRC1_HL_CTRL1		, 0x8000},247	{RT5677_DRC1_HL_CTRL2		, 0x0200},248	{RT5677_DRC2_HL_CTRL1		, 0x8000},249	{RT5677_DRC2_HL_CTRL2		, 0x0200},250	{RT5677_DSP_INB1_SRC_CTRL1	, 0x5800},251	{RT5677_DSP_INB1_SRC_CTRL2	, 0x0000},252	{RT5677_DSP_INB1_SRC_CTRL3	, 0x0000},253	{RT5677_DSP_INB1_SRC_CTRL4	, 0x0800},254	{RT5677_DSP_INB2_SRC_CTRL1	, 0x5800},255	{RT5677_DSP_INB2_SRC_CTRL2	, 0x0000},256	{RT5677_DSP_INB2_SRC_CTRL3	, 0x0000},257	{RT5677_DSP_INB2_SRC_CTRL4	, 0x0800},258	{RT5677_DSP_INB3_SRC_CTRL1	, 0x5800},259	{RT5677_DSP_INB3_SRC_CTRL2	, 0x0000},260	{RT5677_DSP_INB3_SRC_CTRL3	, 0x0000},261	{RT5677_DSP_INB3_SRC_CTRL4	, 0x0800},262	{RT5677_DSP_OUTB1_SRC_CTRL1	, 0x5800},263	{RT5677_DSP_OUTB1_SRC_CTRL2	, 0x0000},264	{RT5677_DSP_OUTB1_SRC_CTRL3	, 0x0000},265	{RT5677_DSP_OUTB1_SRC_CTRL4	, 0x0800},266	{RT5677_DSP_OUTB2_SRC_CTRL1	, 0x5800},267	{RT5677_DSP_OUTB2_SRC_CTRL2	, 0x0000},268	{RT5677_DSP_OUTB2_SRC_CTRL3	, 0x0000},269	{RT5677_DSP_OUTB2_SRC_CTRL4	, 0x0800},270	{RT5677_DSP_OUTB_0123_MIXER_CTRL, 0xfefe},271	{RT5677_DSP_OUTB_45_MIXER_CTRL	, 0xfefe},272	{RT5677_DSP_OUTB_67_MIXER_CTRL	, 0xfefe},273	{RT5677_DIG_MISC		, 0x0000},274	{RT5677_GEN_CTRL1		, 0x0000},275	{RT5677_GEN_CTRL2		, 0x0000},276	{RT5677_VENDOR_ID		, 0x0000},277	{RT5677_VENDOR_ID1		, 0x10ec},278	{RT5677_VENDOR_ID2		, 0x6327},279};280 281static bool rt5677_volatile_register(struct device *dev, unsigned int reg)282{283	int i;284 285	for (i = 0; i < ARRAY_SIZE(rt5677_ranges); i++) {286		if (reg >= rt5677_ranges[i].range_min &&287			reg <= rt5677_ranges[i].range_max) {288			return true;289		}290	}291 292	switch (reg) {293	case RT5677_RESET:294	case RT5677_SLIMBUS_PARAM:295	case RT5677_PDM_DATA_CTRL1:296	case RT5677_PDM_DATA_CTRL2:297	case RT5677_PDM1_DATA_CTRL4:298	case RT5677_PDM2_DATA_CTRL4:299	case RT5677_I2C_MASTER_CTRL1:300	case RT5677_I2C_MASTER_CTRL7:301	case RT5677_I2C_MASTER_CTRL8:302	case RT5677_HAP_GENE_CTRL2:303	case RT5677_PWR_ANLG2: /* Modified by DSP firmware */304	case RT5677_PWR_DSP_ST:305	case RT5677_PRIV_DATA:306	case RT5677_ASRC_22:307	case RT5677_ASRC_23:308	case RT5677_VAD_CTRL5:309	case RT5677_ADC_EQ_CTRL1:310	case RT5677_EQ_CTRL1:311	case RT5677_IRQ_CTRL1:312	case RT5677_IRQ_CTRL2:313	case RT5677_GPIO_ST:314	case RT5677_GPIO_CTRL1: /* Modified by DSP firmware */315	case RT5677_GPIO_CTRL2: /* Modified by DSP firmware */316	case RT5677_DSP_INB1_SRC_CTRL4:317	case RT5677_DSP_INB2_SRC_CTRL4:318	case RT5677_DSP_INB3_SRC_CTRL4:319	case RT5677_DSP_OUTB1_SRC_CTRL4:320	case RT5677_DSP_OUTB2_SRC_CTRL4:321	case RT5677_VENDOR_ID:322	case RT5677_VENDOR_ID1:323	case RT5677_VENDOR_ID2:324		return true;325	default:326		return false;327	}328}329 330static bool rt5677_readable_register(struct device *dev, unsigned int reg)331{332	int i;333 334	for (i = 0; i < ARRAY_SIZE(rt5677_ranges); i++) {335		if (reg >= rt5677_ranges[i].range_min &&336			reg <= rt5677_ranges[i].range_max) {337			return true;338		}339	}340 341	switch (reg) {342	case RT5677_RESET:343	case RT5677_LOUT1:344	case RT5677_IN1:345	case RT5677_MICBIAS:346	case RT5677_SLIMBUS_PARAM:347	case RT5677_SLIMBUS_RX:348	case RT5677_SLIMBUS_CTRL:349	case RT5677_SIDETONE_CTRL:350	case RT5677_ANA_DAC1_2_3_SRC:351	case RT5677_IF_DSP_DAC3_4_MIXER:352	case RT5677_DAC4_DIG_VOL:353	case RT5677_DAC3_DIG_VOL:354	case RT5677_DAC1_DIG_VOL:355	case RT5677_DAC2_DIG_VOL:356	case RT5677_IF_DSP_DAC2_MIXER:357	case RT5677_STO1_ADC_DIG_VOL:358	case RT5677_MONO_ADC_DIG_VOL:359	case RT5677_STO1_2_ADC_BST:360	case RT5677_STO2_ADC_DIG_VOL:361	case RT5677_ADC_BST_CTRL2:362	case RT5677_STO3_4_ADC_BST:363	case RT5677_STO3_ADC_DIG_VOL:364	case RT5677_STO4_ADC_DIG_VOL:365	case RT5677_STO4_ADC_MIXER:366	case RT5677_STO3_ADC_MIXER:367	case RT5677_STO2_ADC_MIXER:368	case RT5677_STO1_ADC_MIXER:369	case RT5677_MONO_ADC_MIXER:370	case RT5677_ADC_IF_DSP_DAC1_MIXER:371	case RT5677_STO1_DAC_MIXER:372	case RT5677_MONO_DAC_MIXER:373	case RT5677_DD1_MIXER:374	case RT5677_DD2_MIXER:375	case RT5677_IF3_DATA:376	case RT5677_IF4_DATA:377	case RT5677_PDM_OUT_CTRL:378	case RT5677_PDM_DATA_CTRL1:379	case RT5677_PDM_DATA_CTRL2:380	case RT5677_PDM1_DATA_CTRL2:381	case RT5677_PDM1_DATA_CTRL3:382	case RT5677_PDM1_DATA_CTRL4:383	case RT5677_PDM2_DATA_CTRL2:384	case RT5677_PDM2_DATA_CTRL3:385	case RT5677_PDM2_DATA_CTRL4:386	case RT5677_TDM1_CTRL1:387	case RT5677_TDM1_CTRL2:388	case RT5677_TDM1_CTRL3:389	case RT5677_TDM1_CTRL4:390	case RT5677_TDM1_CTRL5:391	case RT5677_TDM2_CTRL1:392	case RT5677_TDM2_CTRL2:393	case RT5677_TDM2_CTRL3:394	case RT5677_TDM2_CTRL4:395	case RT5677_TDM2_CTRL5:396	case RT5677_I2C_MASTER_CTRL1:397	case RT5677_I2C_MASTER_CTRL2:398	case RT5677_I2C_MASTER_CTRL3:399	case RT5677_I2C_MASTER_CTRL4:400	case RT5677_I2C_MASTER_CTRL5:401	case RT5677_I2C_MASTER_CTRL6:402	case RT5677_I2C_MASTER_CTRL7:403	case RT5677_I2C_MASTER_CTRL8:404	case RT5677_DMIC_CTRL1:405	case RT5677_DMIC_CTRL2:406	case RT5677_HAP_GENE_CTRL1:407	case RT5677_HAP_GENE_CTRL2:408	case RT5677_HAP_GENE_CTRL3:409	case RT5677_HAP_GENE_CTRL4:410	case RT5677_HAP_GENE_CTRL5:411	case RT5677_HAP_GENE_CTRL6:412	case RT5677_HAP_GENE_CTRL7:413	case RT5677_HAP_GENE_CTRL8:414	case RT5677_HAP_GENE_CTRL9:415	case RT5677_HAP_GENE_CTRL10:416	case RT5677_PWR_DIG1:417	case RT5677_PWR_DIG2:418	case RT5677_PWR_ANLG1:419	case RT5677_PWR_ANLG2:420	case RT5677_PWR_DSP1:421	case RT5677_PWR_DSP_ST:422	case RT5677_PWR_DSP2:423	case RT5677_ADC_DAC_HPF_CTRL1:424	case RT5677_PRIV_INDEX:425	case RT5677_PRIV_DATA:426	case RT5677_I2S4_SDP:427	case RT5677_I2S1_SDP:428	case RT5677_I2S2_SDP:429	case RT5677_I2S3_SDP:430	case RT5677_CLK_TREE_CTRL1:431	case RT5677_CLK_TREE_CTRL2:432	case RT5677_CLK_TREE_CTRL3:433	case RT5677_PLL1_CTRL1:434	case RT5677_PLL1_CTRL2:435	case RT5677_PLL2_CTRL1:436	case RT5677_PLL2_CTRL2:437	case RT5677_GLB_CLK1:438	case RT5677_GLB_CLK2:439	case RT5677_ASRC_1:440	case RT5677_ASRC_2:441	case RT5677_ASRC_3:442	case RT5677_ASRC_4:443	case RT5677_ASRC_5:444	case RT5677_ASRC_6:445	case RT5677_ASRC_7:446	case RT5677_ASRC_8:447	case RT5677_ASRC_9:448	case RT5677_ASRC_10:449	case RT5677_ASRC_11:450	case RT5677_ASRC_12:451	case RT5677_ASRC_13:452	case RT5677_ASRC_14:453	case RT5677_ASRC_15:454	case RT5677_ASRC_16:455	case RT5677_ASRC_17:456	case RT5677_ASRC_18:457	case RT5677_ASRC_19:458	case RT5677_ASRC_20:459	case RT5677_ASRC_21:460	case RT5677_ASRC_22:461	case RT5677_ASRC_23:462	case RT5677_VAD_CTRL1:463	case RT5677_VAD_CTRL2:464	case RT5677_VAD_CTRL3:465	case RT5677_VAD_CTRL4:466	case RT5677_VAD_CTRL5:467	case RT5677_DSP_INB_CTRL1:468	case RT5677_DSP_INB_CTRL2:469	case RT5677_DSP_IN_OUTB_CTRL:470	case RT5677_DSP_OUTB0_1_DIG_VOL:471	case RT5677_DSP_OUTB2_3_DIG_VOL:472	case RT5677_DSP_OUTB4_5_DIG_VOL:473	case RT5677_DSP_OUTB6_7_DIG_VOL:474	case RT5677_ADC_EQ_CTRL1:475	case RT5677_ADC_EQ_CTRL2:476	case RT5677_EQ_CTRL1:477	case RT5677_EQ_CTRL2:478	case RT5677_EQ_CTRL3:479	case RT5677_SOFT_VOL_ZERO_CROSS1:480	case RT5677_JD_CTRL1:481	case RT5677_JD_CTRL2:482	case RT5677_JD_CTRL3:483	case RT5677_IRQ_CTRL1:484	case RT5677_IRQ_CTRL2:485	case RT5677_GPIO_ST:486	case RT5677_GPIO_CTRL1:487	case RT5677_GPIO_CTRL2:488	case RT5677_GPIO_CTRL3:489	case RT5677_STO1_ADC_HI_FILTER1:490	case RT5677_STO1_ADC_HI_FILTER2:491	case RT5677_MONO_ADC_HI_FILTER1:492	case RT5677_MONO_ADC_HI_FILTER2:493	case RT5677_STO2_ADC_HI_FILTER1:494	case RT5677_STO2_ADC_HI_FILTER2:495	case RT5677_STO3_ADC_HI_FILTER1:496	case RT5677_STO3_ADC_HI_FILTER2:497	case RT5677_STO4_ADC_HI_FILTER1:498	case RT5677_STO4_ADC_HI_FILTER2:499	case RT5677_MB_DRC_CTRL1:500	case RT5677_DRC1_CTRL1:501	case RT5677_DRC1_CTRL2:502	case RT5677_DRC1_CTRL3:503	case RT5677_DRC1_CTRL4:504	case RT5677_DRC1_CTRL5:505	case RT5677_DRC1_CTRL6:506	case RT5677_DRC2_CTRL1:507	case RT5677_DRC2_CTRL2:508	case RT5677_DRC2_CTRL3:509	case RT5677_DRC2_CTRL4:510	case RT5677_DRC2_CTRL5:511	case RT5677_DRC2_CTRL6:512	case RT5677_DRC1_HL_CTRL1:513	case RT5677_DRC1_HL_CTRL2:514	case RT5677_DRC2_HL_CTRL1:515	case RT5677_DRC2_HL_CTRL2:516	case RT5677_DSP_INB1_SRC_CTRL1:517	case RT5677_DSP_INB1_SRC_CTRL2:518	case RT5677_DSP_INB1_SRC_CTRL3:519	case RT5677_DSP_INB1_SRC_CTRL4:520	case RT5677_DSP_INB2_SRC_CTRL1:521	case RT5677_DSP_INB2_SRC_CTRL2:522	case RT5677_DSP_INB2_SRC_CTRL3:523	case RT5677_DSP_INB2_SRC_CTRL4:524	case RT5677_DSP_INB3_SRC_CTRL1:525	case RT5677_DSP_INB3_SRC_CTRL2:526	case RT5677_DSP_INB3_SRC_CTRL3:527	case RT5677_DSP_INB3_SRC_CTRL4:528	case RT5677_DSP_OUTB1_SRC_CTRL1:529	case RT5677_DSP_OUTB1_SRC_CTRL2:530	case RT5677_DSP_OUTB1_SRC_CTRL3:531	case RT5677_DSP_OUTB1_SRC_CTRL4:532	case RT5677_DSP_OUTB2_SRC_CTRL1:533	case RT5677_DSP_OUTB2_SRC_CTRL2:534	case RT5677_DSP_OUTB2_SRC_CTRL3:535	case RT5677_DSP_OUTB2_SRC_CTRL4:536	case RT5677_DSP_OUTB_0123_MIXER_CTRL:537	case RT5677_DSP_OUTB_45_MIXER_CTRL:538	case RT5677_DSP_OUTB_67_MIXER_CTRL:539	case RT5677_DIG_MISC:540	case RT5677_GEN_CTRL1:541	case RT5677_GEN_CTRL2:542	case RT5677_VENDOR_ID:543	case RT5677_VENDOR_ID1:544	case RT5677_VENDOR_ID2:545		return true;546	default:547		return false;548	}549}550 551/**552 * rt5677_dsp_mode_i2c_write_addr - Write value to address on DSP mode.553 * @rt5677: Private Data.554 * @addr: Address index.555 * @value: Address data.556 * @opcode: opcode value557 *558 * Returns 0 for success or negative error code.559 */560static int rt5677_dsp_mode_i2c_write_addr(struct rt5677_priv *rt5677,561		unsigned int addr, unsigned int value, unsigned int opcode)562{563	struct snd_soc_component *component = rt5677->component;564	int ret;565 566	mutex_lock(&rt5677->dsp_cmd_lock);567 568	ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_ADDR_MSB,569		addr >> 16);570	if (ret < 0) {571		dev_err(component->dev, "Failed to set addr msb value: %d\n", ret);572		goto err;573	}574 575	ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_ADDR_LSB,576		addr & 0xffff);577	if (ret < 0) {578		dev_err(component->dev, "Failed to set addr lsb value: %d\n", ret);579		goto err;580	}581 582	ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_DATA_MSB,583		value >> 16);584	if (ret < 0) {585		dev_err(component->dev, "Failed to set data msb value: %d\n", ret);586		goto err;587	}588 589	ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_DATA_LSB,590		value & 0xffff);591	if (ret < 0) {592		dev_err(component->dev, "Failed to set data lsb value: %d\n", ret);593		goto err;594	}595 596	ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_OP_CODE,597		opcode);598	if (ret < 0) {599		dev_err(component->dev, "Failed to set op code value: %d\n", ret);600		goto err;601	}602 603err:604	mutex_unlock(&rt5677->dsp_cmd_lock);605 606	return ret;607}608 609/**610 * rt5677_dsp_mode_i2c_read_addr - Read value from address on DSP mode.611 * @rt5677: Private Data.612 * @addr: Address index.613 * @value: Address data.614 *615 *616 * Returns 0 for success or negative error code.617 */618static int rt5677_dsp_mode_i2c_read_addr(619	struct rt5677_priv *rt5677, unsigned int addr, unsigned int *value)620{621	struct snd_soc_component *component = rt5677->component;622	int ret;623	unsigned int msb, lsb;624 625	mutex_lock(&rt5677->dsp_cmd_lock);626 627	ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_ADDR_MSB,628		addr >> 16);629	if (ret < 0) {630		dev_err(component->dev, "Failed to set addr msb value: %d\n", ret);631		goto err;632	}633 634	ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_ADDR_LSB,635		addr & 0xffff);636	if (ret < 0) {637		dev_err(component->dev, "Failed to set addr lsb value: %d\n", ret);638		goto err;639	}640 641	ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_OP_CODE,642		0x0002);643	if (ret < 0) {644		dev_err(component->dev, "Failed to set op code value: %d\n", ret);645		goto err;646	}647 648	regmap_read(rt5677->regmap_physical, RT5677_DSP_I2C_DATA_MSB, &msb);649	regmap_read(rt5677->regmap_physical, RT5677_DSP_I2C_DATA_LSB, &lsb);650	*value = (msb << 16) | lsb;651 652err:653	mutex_unlock(&rt5677->dsp_cmd_lock);654 655	return ret;656}657 658/**659 * rt5677_dsp_mode_i2c_write - Write register on DSP mode.660 * @rt5677: Private Data.661 * @reg: Register index.662 * @value: Register data.663 *664 *665 * Returns 0 for success or negative error code.666 */667static int rt5677_dsp_mode_i2c_write(struct rt5677_priv *rt5677,668		unsigned int reg, unsigned int value)669{670	return rt5677_dsp_mode_i2c_write_addr(rt5677, 0x18020000 + reg * 2,671		value, 0x0001);672}673 674/**675 * rt5677_dsp_mode_i2c_read - Read register on DSP mode.676 * @rt5677: Private Data677 * @reg: Register index.678 * @value: Register data.679 *680 *681 * Returns 0 for success or negative error code.682 */683static int rt5677_dsp_mode_i2c_read(684	struct rt5677_priv *rt5677, unsigned int reg, unsigned int *value)685{686	int ret = rt5677_dsp_mode_i2c_read_addr(rt5677, 0x18020000 + reg * 2,687		value);688 689	*value &= 0xffff;690 691	return ret;692}693 694static void rt5677_set_dsp_mode(struct rt5677_priv *rt5677, bool on)695{696	if (on) {697		regmap_update_bits(rt5677->regmap, RT5677_PWR_DSP1,698			RT5677_PWR_DSP, RT5677_PWR_DSP);699		rt5677->is_dsp_mode = true;700	} else {701		regmap_update_bits(rt5677->regmap, RT5677_PWR_DSP1,702			RT5677_PWR_DSP, 0x0);703		rt5677->is_dsp_mode = false;704	}705}706 707static unsigned int rt5677_set_vad_source(struct rt5677_priv *rt5677)708{709	struct snd_soc_dapm_context *dapm =710			snd_soc_component_get_dapm(rt5677->component);711	/* Force dapm to sync before we enable the712	 * DSP to prevent write corruption713	 */714	snd_soc_dapm_sync(dapm);715 716	/* DMIC1 power = enabled717	 * DMIC CLK = 256 * fs / 12718	 */719	regmap_update_bits(rt5677->regmap, RT5677_DMIC_CTRL1,720		RT5677_DMIC_CLK_MASK, 5 << RT5677_DMIC_CLK_SFT);721 722	/* I2S pre divide 2 = /6 (clk_sys2) */723	regmap_update_bits(rt5677->regmap, RT5677_CLK_TREE_CTRL1,724		RT5677_I2S_PD2_MASK, RT5677_I2S_PD2_6);725 726	/* DSP Clock = MCLK1 (bypassed PLL2) */727	regmap_write(rt5677->regmap, RT5677_GLB_CLK2,728		RT5677_DSP_CLK_SRC_BYPASS);729 730	/* SAD Threshold1 */731	regmap_write(rt5677->regmap, RT5677_VAD_CTRL2, 0x013f);732	/* SAD Threshold2 */733	regmap_write(rt5677->regmap, RT5677_VAD_CTRL3, 0x0ae5);734	/* SAD Sample Rate Converter = Up 6 (8K to 48K)735	 * SAD Output Sample Rate = Same as I2S736	 * SAD Threshold3737	 */738	regmap_update_bits(rt5677->regmap, RT5677_VAD_CTRL4,739		RT5677_VAD_OUT_SRC_RATE_MASK | RT5677_VAD_OUT_SRC_MASK |740		RT5677_VAD_LV_DIFF_MASK, 0x7f << RT5677_VAD_LV_DIFF_SFT);741	/* Minimum frame level within a pre-determined duration = 32 frames742	 * Bypass ADPCM Encoder/Decoder = Bypass ADPCM743	 * Automatic Push Data to SAD Buffer Once SAD Flag is triggered = enable744	 * SAD Buffer Over-Writing = enable745	 * SAD Buffer Pop Mode Control = disable746	 * SAD Buffer Push Mode Control = enable747	 * SAD Detector Control = enable748	 * SAD Function Control = enable749	 * SAD Function Reset = normal750	 */751	regmap_write(rt5677->regmap, RT5677_VAD_CTRL1,752		RT5677_VAD_FUNC_RESET | RT5677_VAD_FUNC_ENABLE |753		RT5677_VAD_DET_ENABLE | RT5677_VAD_BUF_PUSH |754		RT5677_VAD_BUF_OW | RT5677_VAD_FG2ENC |755		RT5677_VAD_ADPCM_BYPASS | 1 << RT5677_VAD_MIN_DUR_SFT);756 757	/* VAD/SAD is not routed to the IRQ output (i.e. MX-BE[14] = 0), but it758	 * is routed to DSP_IRQ_0, so DSP firmware may use it to sleep and save759	 * power. See ALC5677 datasheet section 9.17 "GPIO, Interrupt and Jack760	 * Detection" for more info.761	 */762 763	/* Private register, no doc */764	regmap_update_bits(rt5677->regmap, RT5677_PR_BASE + RT5677_BIAS_CUR4,765		0x0f00, 0x0100);766 767	/* LDO2 output = 1.2V768	 * LDO1 output = 1.2V (LDO_IN = 1.8V)769	 */770	regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG1,771		RT5677_LDO1_SEL_MASK | RT5677_LDO2_SEL_MASK,772		5 << RT5677_LDO1_SEL_SFT | 5 << RT5677_LDO2_SEL_SFT);773 774	/* Codec core power =  power on775	 * LDO1 power = power on776	 */777	regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,778		RT5677_PWR_CORE | RT5677_PWR_LDO1,779		RT5677_PWR_CORE | RT5677_PWR_LDO1);780 781	/* Isolation for DCVDD4 = normal (set during probe)782	 * Isolation for DCVDD2 = normal (set during probe)783	 * Isolation for DSP = normal784	 * Isolation for Band 0~7 = disable785	 * Isolation for InBound 4~10 and OutBound 4~10 = disable786	 */787	regmap_write(rt5677->regmap, RT5677_PWR_DSP2,788		RT5677_PWR_CORE_ISO | RT5677_PWR_DSP_ISO |789		RT5677_PWR_SR7_ISO | RT5677_PWR_SR6_ISO |790		RT5677_PWR_SR5_ISO | RT5677_PWR_SR4_ISO |791		RT5677_PWR_SR3_ISO | RT5677_PWR_SR2_ISO |792		RT5677_PWR_SR1_ISO | RT5677_PWR_SR0_ISO |793		RT5677_PWR_MLT_ISO);794 795	/* System Band 0~7 = power on796	 * InBound 4~10 and OutBound 4~10 = power on797	 * DSP = power on798	 * DSP CPU = stop (will be set to "run" after firmware loaded)799	 */800	regmap_write(rt5677->regmap, RT5677_PWR_DSP1,801		RT5677_PWR_SR7 | RT5677_PWR_SR6 |802		RT5677_PWR_SR5 | RT5677_PWR_SR4 |803		RT5677_PWR_SR3 | RT5677_PWR_SR2 |804		RT5677_PWR_SR1 | RT5677_PWR_SR0 |805		RT5677_PWR_MLT | RT5677_PWR_DSP |806		RT5677_PWR_DSP_CPU);807 808	return 0;809}810 811static int rt5677_parse_and_load_dsp(struct rt5677_priv *rt5677, const u8 *buf,812		unsigned int len)813{814	struct snd_soc_component *component = rt5677->component;815	Elf32_Ehdr *elf_hdr;816	Elf32_Phdr *pr_hdr;817	Elf32_Half i;818	int ret = 0;819 820	if (!buf || (len < sizeof(Elf32_Ehdr)))821		return -ENOMEM;822 823	elf_hdr = (Elf32_Ehdr *)buf;824#ifndef EM_XTENSA825#define EM_XTENSA	94826#endif827	if (strncmp(elf_hdr->e_ident, ELFMAG, sizeof(ELFMAG) - 1))828		dev_err(component->dev, "Wrong ELF header prefix\n");829	if (elf_hdr->e_ehsize != sizeof(Elf32_Ehdr))830		dev_err(component->dev, "Wrong ELF header size\n");831	if (elf_hdr->e_machine != EM_XTENSA)832		dev_err(component->dev, "Wrong DSP code file\n");833 834	if (len < elf_hdr->e_phoff)835		return -ENOMEM;836	pr_hdr = (Elf32_Phdr *)(buf + elf_hdr->e_phoff);837	for (i = 0; i < elf_hdr->e_phnum; i++) {838		/* TODO: handle p_memsz != p_filesz */839		if (pr_hdr->p_paddr && pr_hdr->p_filesz) {840			dev_info(component->dev, "Load 0x%x bytes to 0x%x\n",841					pr_hdr->p_filesz, pr_hdr->p_paddr);842 843			ret = rt5677_spi_write(pr_hdr->p_paddr,844					buf + pr_hdr->p_offset,845					pr_hdr->p_filesz);846			if (ret)847				dev_err(component->dev, "Load firmware failed %d\n",848						ret);849		}850		pr_hdr++;851	}852	return ret;853}854 855static int rt5677_load_dsp_from_file(struct rt5677_priv *rt5677)856{857	const struct firmware *fwp;858	struct device *dev = rt5677->component->dev;859	int ret = 0;860 861	/* Load dsp firmware from rt5677_elf_vad file */862	ret = request_firmware(&fwp, "rt5677_elf_vad", dev);863	if (ret) {864		dev_err(dev, "Request rt5677_elf_vad failed %d\n", ret);865		return ret;866	}867	dev_info(dev, "Requested rt5677_elf_vad (%zu)\n", fwp->size);868 869	ret = rt5677_parse_and_load_dsp(rt5677, fwp->data, fwp->size);870	release_firmware(fwp);871	return ret;872}873 874static int rt5677_set_dsp_vad(struct snd_soc_component *component, bool on)875{876	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);877	rt5677->dsp_vad_en_request = on;878	rt5677->dsp_vad_en = on;879 880	if (!IS_ENABLED(CONFIG_SND_SOC_RT5677_SPI))881		return -ENXIO;882 883	schedule_delayed_work(&rt5677->dsp_work, 0);884	return 0;885}886 887static void rt5677_dsp_work(struct work_struct *work)888{889	struct rt5677_priv *rt5677 =890		container_of(work, struct rt5677_priv, dsp_work.work);891	static bool activity;892	bool enable = rt5677->dsp_vad_en;893	int i, val;894 895 896	dev_info(rt5677->component->dev, "DSP VAD: enable=%d, activity=%d\n",897			enable, activity);898 899	if (enable && !activity) {900		activity = true;901 902		/* Before a hotword is detected, GPIO1 pin is configured as IRQ903		 * output so that jack detect works. When a hotword is detected,904		 * the DSP firmware configures the GPIO1 pin as GPIO1 and905		 * drives a 1. rt5677_irq() is called after a rising edge on906		 * the GPIO1 pin, due to either jack detect event or hotword907		 * event, or both. All possible events are checked and handled908		 * in rt5677_irq() where GPIO1 pin is configured back to IRQ909		 * output if a hotword is detected.910		 */911 912		rt5677_set_vad_source(rt5677);913		rt5677_set_dsp_mode(rt5677, true);914 915#define RT5677_BOOT_RETRY 20916		for (i = 0; i < RT5677_BOOT_RETRY; i++) {917			regmap_read(rt5677->regmap, RT5677_PWR_DSP_ST, &val);918			if (val == 0x3ff)919				break;920			udelay(500);921		}922		if (i == RT5677_BOOT_RETRY && val != 0x3ff) {923			dev_err(rt5677->component->dev, "DSP Boot Timed Out!");924			return;925		}926 927		/* Boot the firmware from IRAM instead of SRAM0. */928		rt5677_dsp_mode_i2c_write_addr(rt5677, RT5677_DSP_BOOT_VECTOR,929			0x0009, 0x0003);930		rt5677_dsp_mode_i2c_write_addr(rt5677, RT5677_DSP_BOOT_VECTOR,931			0x0019, 0x0003);932		rt5677_dsp_mode_i2c_write_addr(rt5677, RT5677_DSP_BOOT_VECTOR,933			0x0009, 0x0003);934 935		rt5677_load_dsp_from_file(rt5677);936 937		/* Set DSP CPU to Run */938		regmap_update_bits(rt5677->regmap, RT5677_PWR_DSP1,939			RT5677_PWR_DSP_CPU, 0x0);940	} else if (!enable && activity) {941		activity = false;942 943		/* Don't turn off the DSP while handling irqs */944		mutex_lock(&rt5677->irq_lock);945		/* Set DSP CPU to Stop */946		regmap_update_bits(rt5677->regmap, RT5677_PWR_DSP1,947			RT5677_PWR_DSP_CPU, RT5677_PWR_DSP_CPU);948 949		rt5677_set_dsp_mode(rt5677, false);950 951		/* Disable and clear VAD interrupt */952		regmap_write(rt5677->regmap, RT5677_VAD_CTRL1, 0x2184);953 954		/* Set GPIO1 pin back to be IRQ output for jack detect */955		regmap_update_bits(rt5677->regmap, RT5677_GPIO_CTRL1,956			RT5677_GPIO1_PIN_MASK, RT5677_GPIO1_PIN_IRQ);957 958		mutex_unlock(&rt5677->irq_lock);959	}960}961 962static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -6525, 75, 0);963static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -1725, 75, 0);964static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0);965static const DECLARE_TLV_DB_SCALE(st_vol_tlv, -4650, 150, 0);966 967/* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */968static const DECLARE_TLV_DB_RANGE(bst_tlv,969	0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),970	1, 1, TLV_DB_SCALE_ITEM(2000, 0, 0),971	2, 2, TLV_DB_SCALE_ITEM(2400, 0, 0),972	3, 5, TLV_DB_SCALE_ITEM(3000, 500, 0),973	6, 6, TLV_DB_SCALE_ITEM(4400, 0, 0),974	7, 7, TLV_DB_SCALE_ITEM(5000, 0, 0),975	8, 8, TLV_DB_SCALE_ITEM(5200, 0, 0)976);977 978static int rt5677_dsp_vad_get(struct snd_kcontrol *kcontrol,979		struct snd_ctl_elem_value *ucontrol)980{981	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);982	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);983 984	ucontrol->value.integer.value[0] = rt5677->dsp_vad_en_request;985 986	return 0;987}988 989static int rt5677_dsp_vad_put(struct snd_kcontrol *kcontrol,990		struct snd_ctl_elem_value *ucontrol)991{992	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);993 994	rt5677_set_dsp_vad(component, !!ucontrol->value.integer.value[0]);995 996	return 0;997}998 999static const struct snd_kcontrol_new rt5677_snd_controls[] = {1000	/* OUTPUT Control */1001	SOC_SINGLE("OUT1 Playback Switch", RT5677_LOUT1,1002		RT5677_LOUT1_L_MUTE_SFT, 1, 1),1003	SOC_SINGLE("OUT2 Playback Switch", RT5677_LOUT1,1004		RT5677_LOUT2_L_MUTE_SFT, 1, 1),1005	SOC_SINGLE("OUT3 Playback Switch", RT5677_LOUT1,1006		RT5677_LOUT3_L_MUTE_SFT, 1, 1),1007 1008	/* DAC Digital Volume */1009	SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5677_DAC1_DIG_VOL,1010		RT5677_L_VOL_SFT, RT5677_R_VOL_SFT, 127, 0, dac_vol_tlv),1011	SOC_DOUBLE_TLV("DAC2 Playback Volume", RT5677_DAC2_DIG_VOL,1012		RT5677_L_VOL_SFT, RT5677_R_VOL_SFT, 127, 0, dac_vol_tlv),1013	SOC_DOUBLE_TLV("DAC3 Playback Volume", RT5677_DAC3_DIG_VOL,1014		RT5677_L_VOL_SFT, RT5677_R_VOL_SFT, 127, 0, dac_vol_tlv),1015	SOC_DOUBLE_TLV("DAC4 Playback Volume", RT5677_DAC4_DIG_VOL,1016		RT5677_L_VOL_SFT, RT5677_R_VOL_SFT, 127, 0, dac_vol_tlv),1017 1018	/* IN1/IN2 Control */1019	SOC_SINGLE_TLV("IN1 Boost", RT5677_IN1, RT5677_BST_SFT1, 8, 0, bst_tlv),1020	SOC_SINGLE_TLV("IN2 Boost", RT5677_IN1, RT5677_BST_SFT2, 8, 0, bst_tlv),1021 1022	/* ADC Digital Volume Control */1023	SOC_DOUBLE("ADC1 Capture Switch", RT5677_STO1_ADC_DIG_VOL,1024		RT5677_L_MUTE_SFT, RT5677_R_MUTE_SFT, 1, 1),1025	SOC_DOUBLE("ADC2 Capture Switch", RT5677_STO2_ADC_DIG_VOL,1026		RT5677_L_MUTE_SFT, RT5677_R_MUTE_SFT, 1, 1),1027	SOC_DOUBLE("ADC3 Capture Switch", RT5677_STO3_ADC_DIG_VOL,1028		RT5677_L_MUTE_SFT, RT5677_R_MUTE_SFT, 1, 1),1029	SOC_DOUBLE("ADC4 Capture Switch", RT5677_STO4_ADC_DIG_VOL,1030		RT5677_L_MUTE_SFT, RT5677_R_MUTE_SFT, 1, 1),1031	SOC_DOUBLE("Mono ADC Capture Switch", RT5677_MONO_ADC_DIG_VOL,1032		RT5677_L_MUTE_SFT, RT5677_R_MUTE_SFT, 1, 1),1033 1034	SOC_DOUBLE_TLV("ADC1 Capture Volume", RT5677_STO1_ADC_DIG_VOL,1035		RT5677_STO1_ADC_L_VOL_SFT, RT5677_STO1_ADC_R_VOL_SFT, 63, 0,1036		adc_vol_tlv),1037	SOC_DOUBLE_TLV("ADC2 Capture Volume", RT5677_STO2_ADC_DIG_VOL,1038		RT5677_STO1_ADC_L_VOL_SFT, RT5677_STO1_ADC_R_VOL_SFT, 63, 0,1039		adc_vol_tlv),1040	SOC_DOUBLE_TLV("ADC3 Capture Volume", RT5677_STO3_ADC_DIG_VOL,1041		RT5677_STO1_ADC_L_VOL_SFT, RT5677_STO1_ADC_R_VOL_SFT, 63, 0,1042		adc_vol_tlv),1043	SOC_DOUBLE_TLV("ADC4 Capture Volume", RT5677_STO4_ADC_DIG_VOL,1044		RT5677_STO1_ADC_L_VOL_SFT, RT5677_STO1_ADC_R_VOL_SFT, 63, 0,1045		adc_vol_tlv),1046	SOC_DOUBLE_TLV("Mono ADC Capture Volume", RT5677_MONO_ADC_DIG_VOL,1047		RT5677_MONO_ADC_L_VOL_SFT, RT5677_MONO_ADC_R_VOL_SFT, 63, 0,1048		adc_vol_tlv),1049 1050	/* Sidetone Control */1051	SOC_SINGLE_TLV("Sidetone Volume", RT5677_SIDETONE_CTRL,1052		RT5677_ST_VOL_SFT, 31, 0, st_vol_tlv),1053 1054	/* ADC Boost Volume Control */1055	SOC_DOUBLE_TLV("STO1 ADC Boost Volume", RT5677_STO1_2_ADC_BST,1056		RT5677_STO1_ADC_L_BST_SFT, RT5677_STO1_ADC_R_BST_SFT, 3, 0,1057		adc_bst_tlv),1058	SOC_DOUBLE_TLV("STO2 ADC Boost Volume", RT5677_STO1_2_ADC_BST,1059		RT5677_STO2_ADC_L_BST_SFT, RT5677_STO2_ADC_R_BST_SFT, 3, 0,1060		adc_bst_tlv),1061	SOC_DOUBLE_TLV("STO3 ADC Boost Volume", RT5677_STO3_4_ADC_BST,1062		RT5677_STO3_ADC_L_BST_SFT, RT5677_STO3_ADC_R_BST_SFT, 3, 0,1063		adc_bst_tlv),1064	SOC_DOUBLE_TLV("STO4 ADC Boost Volume", RT5677_STO3_4_ADC_BST,1065		RT5677_STO4_ADC_L_BST_SFT, RT5677_STO4_ADC_R_BST_SFT, 3, 0,1066		adc_bst_tlv),1067	SOC_DOUBLE_TLV("Mono ADC Boost Volume", RT5677_ADC_BST_CTRL2,1068		RT5677_MONO_ADC_L_BST_SFT, RT5677_MONO_ADC_R_BST_SFT, 3, 0,1069		adc_bst_tlv),1070 1071	SOC_SINGLE_EXT("DSP VAD Switch", SND_SOC_NOPM, 0, 1, 0,1072		rt5677_dsp_vad_get, rt5677_dsp_vad_put),1073};1074 1075/**1076 * set_dmic_clk - Set parameter of dmic.1077 *1078 * @w: DAPM widget.1079 * @kcontrol: The kcontrol of this widget.1080 * @event: Event id.1081 *1082 * Choose dmic clock between 1MHz and 3MHz.1083 * It is better for clock to approximate 3MHz.1084 */1085static int set_dmic_clk(struct snd_soc_dapm_widget *w,1086	struct snd_kcontrol *kcontrol, int event)1087{1088	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);1089	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);1090	int idx, rate;1091 1092	rate = rt5677->sysclk / rl6231_get_pre_div(rt5677->regmap,1093		RT5677_CLK_TREE_CTRL1, RT5677_I2S_PD1_SFT);1094	idx = rl6231_calc_dmic_clk(rate);1095	if (idx < 0)1096		dev_err(component->dev, "Failed to set DMIC clock\n");1097	else1098		regmap_update_bits(rt5677->regmap, RT5677_DMIC_CTRL1,1099			RT5677_DMIC_CLK_MASK, idx << RT5677_DMIC_CLK_SFT);1100	return idx;1101}1102 1103static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *source,1104			 struct snd_soc_dapm_widget *sink)1105{1106	struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm);1107	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);1108	unsigned int val;1109 1110	regmap_read(rt5677->regmap, RT5677_GLB_CLK1, &val);1111	val &= RT5677_SCLK_SRC_MASK;1112	if (val == RT5677_SCLK_SRC_PLL1)1113		return 1;1114	else1115		return 0;1116}1117 1118static int is_using_asrc(struct snd_soc_dapm_widget *source,1119			 struct snd_soc_dapm_widget *sink)1120{1121	struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm);1122	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);1123	unsigned int reg, shift, val;1124 1125	if (source->reg == RT5677_ASRC_1) {1126		switch (source->shift) {1127		case 12:1128			reg = RT5677_ASRC_4;1129			shift = 0;1130			break;1131		case 13:1132			reg = RT5677_ASRC_4;1133			shift = 4;1134			break;1135		case 14:1136			reg = RT5677_ASRC_4;1137			shift = 8;1138			break;1139		case 15:1140			reg = RT5677_ASRC_4;1141			shift = 12;1142			break;1143		default:1144			return 0;1145		}1146	} else {1147		switch (source->shift) {1148		case 0:1149			reg = RT5677_ASRC_6;1150			shift = 8;1151			break;1152		case 1:1153			reg = RT5677_ASRC_6;1154			shift = 12;1155			break;1156		case 2:1157			reg = RT5677_ASRC_5;1158			shift = 0;1159			break;1160		case 3:1161			reg = RT5677_ASRC_5;1162			shift = 4;1163			break;1164		case 4:1165			reg = RT5677_ASRC_5;1166			shift = 8;1167			break;1168		case 5:1169			reg = RT5677_ASRC_5;1170			shift = 12;1171			break;1172		case 12:1173			reg = RT5677_ASRC_3;1174			shift = 0;1175			break;1176		case 13:1177			reg = RT5677_ASRC_3;1178			shift = 4;1179			break;1180		case 14:1181			reg = RT5677_ASRC_3;1182			shift = 12;1183			break;1184		default:1185			return 0;1186		}1187	}1188 1189	regmap_read(rt5677->regmap, reg, &val);1190	val = (val >> shift) & 0xf;1191 1192	switch (val) {1193	case 1 ... 6:1194		return 1;1195	default:1196		return 0;1197	}1198 1199}1200 1201static int can_use_asrc(struct snd_soc_dapm_widget *source,1202			 struct snd_soc_dapm_widget *sink)1203{1204	struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm);1205	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);1206 1207	if (rt5677->sysclk > rt5677->lrck[RT5677_AIF1] * 384)1208		return 1;1209 1210	return 0;1211}1212 1213/**1214 * rt5677_sel_asrc_clk_src - select ASRC clock source for a set of filters1215 * @component: SoC audio component device.1216 * @filter_mask: mask of filters.1217 * @clk_src: clock source1218 *1219 * The ASRC function is for asynchronous MCLK and LRCK. Also, since RT5677 can1220 * only support standard 32fs or 64fs i2s format, ASRC should be enabled to1221 * support special i2s clock format such as Intel's 100fs(100 * sampling rate).1222 * ASRC function will track i2s clock and generate a corresponding system clock1223 * for codec. This function provides an API to select the clock source for a1224 * set of filters specified by the mask. And the codec driver will turn on ASRC1225 * for these filters if ASRC is selected as their clock source.1226 */1227int rt5677_sel_asrc_clk_src(struct snd_soc_component *component,1228		unsigned int filter_mask, unsigned int clk_src)1229{1230	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);1231	unsigned int asrc3_mask = 0, asrc3_value = 0;1232	unsigned int asrc4_mask = 0, asrc4_value = 0;1233	unsigned int asrc5_mask = 0, asrc5_value = 0;1234	unsigned int asrc6_mask = 0, asrc6_value = 0;1235	unsigned int asrc7_mask = 0, asrc7_value = 0;1236	unsigned int asrc8_mask = 0, asrc8_value = 0;1237 1238	switch (clk_src) {1239	case RT5677_CLK_SEL_SYS:1240	case RT5677_CLK_SEL_I2S1_ASRC:1241	case RT5677_CLK_SEL_I2S2_ASRC:1242	case RT5677_CLK_SEL_I2S3_ASRC:1243	case RT5677_CLK_SEL_I2S4_ASRC:1244	case RT5677_CLK_SEL_I2S5_ASRC:1245	case RT5677_CLK_SEL_I2S6_ASRC:1246	case RT5677_CLK_SEL_SYS2:1247	case RT5677_CLK_SEL_SYS3:1248	case RT5677_CLK_SEL_SYS4:1249	case RT5677_CLK_SEL_SYS5:1250	case RT5677_CLK_SEL_SYS6:1251	case RT5677_CLK_SEL_SYS7:1252		break;1253 1254	default:1255		return -EINVAL;1256	}1257 1258	/* ASRC 3 */1259	if (filter_mask & RT5677_DA_STEREO_FILTER) {1260		asrc3_mask |= RT5677_DA_STO_CLK_SEL_MASK;1261		asrc3_value = (asrc3_value & ~RT5677_DA_STO_CLK_SEL_MASK)1262			| (clk_src << RT5677_DA_STO_CLK_SEL_SFT);1263	}1264 1265	if (filter_mask & RT5677_DA_MONO2_L_FILTER) {1266		asrc3_mask |= RT5677_DA_MONO2L_CLK_SEL_MASK;1267		asrc3_value = (asrc3_value & ~RT5677_DA_MONO2L_CLK_SEL_MASK)1268			| (clk_src << RT5677_DA_MONO2L_CLK_SEL_SFT);1269	}1270 1271	if (filter_mask & RT5677_DA_MONO2_R_FILTER) {1272		asrc3_mask |= RT5677_DA_MONO2R_CLK_SEL_MASK;1273		asrc3_value = (asrc3_value & ~RT5677_DA_MONO2R_CLK_SEL_MASK)1274			| (clk_src << RT5677_DA_MONO2R_CLK_SEL_SFT);1275	}1276 1277	if (asrc3_mask)1278		regmap_update_bits(rt5677->regmap, RT5677_ASRC_3, asrc3_mask,1279			asrc3_value);1280 1281	/* ASRC 4 */1282	if (filter_mask & RT5677_DA_MONO3_L_FILTER) {1283		asrc4_mask |= RT5677_DA_MONO3L_CLK_SEL_MASK;1284		asrc4_value = (asrc4_value & ~RT5677_DA_MONO3L_CLK_SEL_MASK)1285			| (clk_src << RT5677_DA_MONO3L_CLK_SEL_SFT);1286	}1287 1288	if (filter_mask & RT5677_DA_MONO3_R_FILTER) {1289		asrc4_mask |= RT5677_DA_MONO3R_CLK_SEL_MASK;1290		asrc4_value = (asrc4_value & ~RT5677_DA_MONO3R_CLK_SEL_MASK)1291			| (clk_src << RT5677_DA_MONO3R_CLK_SEL_SFT);1292	}1293 1294	if (filter_mask & RT5677_DA_MONO4_L_FILTER) {1295		asrc4_mask |= RT5677_DA_MONO4L_CLK_SEL_MASK;1296		asrc4_value = (asrc4_value & ~RT5677_DA_MONO4L_CLK_SEL_MASK)1297			| (clk_src << RT5677_DA_MONO4L_CLK_SEL_SFT);1298	}1299 1300	if (filter_mask & RT5677_DA_MONO4_R_FILTER) {1301		asrc4_mask |= RT5677_DA_MONO4R_CLK_SEL_MASK;1302		asrc4_value = (asrc4_value & ~RT5677_DA_MONO4R_CLK_SEL_MASK)1303			| (clk_src << RT5677_DA_MONO4R_CLK_SEL_SFT);1304	}1305 1306	if (asrc4_mask)1307		regmap_update_bits(rt5677->regmap, RT5677_ASRC_4, asrc4_mask,1308			asrc4_value);1309 1310	/* ASRC 5 */1311	if (filter_mask & RT5677_AD_STEREO1_FILTER) {1312		asrc5_mask |= RT5677_AD_STO1_CLK_SEL_MASK;1313		asrc5_value = (asrc5_value & ~RT5677_AD_STO1_CLK_SEL_MASK)1314			| (clk_src << RT5677_AD_STO1_CLK_SEL_SFT);1315	}1316 1317	if (filter_mask & RT5677_AD_STEREO2_FILTER) {1318		asrc5_mask |= RT5677_AD_STO2_CLK_SEL_MASK;1319		asrc5_value = (asrc5_value & ~RT5677_AD_STO2_CLK_SEL_MASK)1320			| (clk_src << RT5677_AD_STO2_CLK_SEL_SFT);1321	}1322 1323	if (filter_mask & RT5677_AD_STEREO3_FILTER) {1324		asrc5_mask |= RT5677_AD_STO3_CLK_SEL_MASK;1325		asrc5_value = (asrc5_value & ~RT5677_AD_STO3_CLK_SEL_MASK)1326			| (clk_src << RT5677_AD_STO3_CLK_SEL_SFT);1327	}1328 1329	if (filter_mask & RT5677_AD_STEREO4_FILTER) {1330		asrc5_mask |= RT5677_AD_STO4_CLK_SEL_MASK;1331		asrc5_value = (asrc5_value & ~RT5677_AD_STO4_CLK_SEL_MASK)1332			| (clk_src << RT5677_AD_STO4_CLK_SEL_SFT);1333	}1334 1335	if (asrc5_mask)1336		regmap_update_bits(rt5677->regmap, RT5677_ASRC_5, asrc5_mask,1337			asrc5_value);1338 1339	/* ASRC 6 */1340	if (filter_mask & RT5677_AD_MONO_L_FILTER) {1341		asrc6_mask |= RT5677_AD_MONOL_CLK_SEL_MASK;1342		asrc6_value = (asrc6_value & ~RT5677_AD_MONOL_CLK_SEL_MASK)1343			| (clk_src << RT5677_AD_MONOL_CLK_SEL_SFT);1344	}1345 1346	if (filter_mask & RT5677_AD_MONO_R_FILTER) {1347		asrc6_mask |= RT5677_AD_MONOR_CLK_SEL_MASK;1348		asrc6_value = (asrc6_value & ~RT5677_AD_MONOR_CLK_SEL_MASK)1349			| (clk_src << RT5677_AD_MONOR_CLK_SEL_SFT);1350	}1351 1352	if (asrc6_mask)1353		regmap_update_bits(rt5677->regmap, RT5677_ASRC_6, asrc6_mask,1354			asrc6_value);1355 1356	/* ASRC 7 */1357	if (filter_mask & RT5677_DSP_OB_0_3_FILTER) {1358		asrc7_mask |= RT5677_DSP_OB_0_3_CLK_SEL_MASK;1359		asrc7_value = (asrc7_value & ~RT5677_DSP_OB_0_3_CLK_SEL_MASK)1360			| (clk_src << RT5677_DSP_OB_0_3_CLK_SEL_SFT);1361	}1362 1363	if (filter_mask & RT5677_DSP_OB_4_7_FILTER) {1364		asrc7_mask |= RT5677_DSP_OB_4_7_CLK_SEL_MASK;1365		asrc7_value = (asrc7_value & ~RT5677_DSP_OB_4_7_CLK_SEL_MASK)1366			| (clk_src << RT5677_DSP_OB_4_7_CLK_SEL_SFT);1367	}1368 1369	if (asrc7_mask)1370		regmap_update_bits(rt5677->regmap, RT5677_ASRC_7, asrc7_mask,1371			asrc7_value);1372 1373	/* ASRC 8 */1374	if (filter_mask & RT5677_I2S1_SOURCE) {1375		asrc8_mask |= RT5677_I2S1_CLK_SEL_MASK;1376		asrc8_value = (asrc8_value & ~RT5677_I2S1_CLK_SEL_MASK)1377			| ((clk_src - 1) << RT5677_I2S1_CLK_SEL_SFT);1378	}1379 1380	if (filter_mask & RT5677_I2S2_SOURCE) {1381		asrc8_mask |= RT5677_I2S2_CLK_SEL_MASK;1382		asrc8_value = (asrc8_value & ~RT5677_I2S2_CLK_SEL_MASK)1383			| ((clk_src - 1) << RT5677_I2S2_CLK_SEL_SFT);1384	}1385 1386	if (filter_mask & RT5677_I2S3_SOURCE) {1387		asrc8_mask |= RT5677_I2S3_CLK_SEL_MASK;1388		asrc8_value = (asrc8_value & ~RT5677_I2S3_CLK_SEL_MASK)1389			| ((clk_src - 1) << RT5677_I2S3_CLK_SEL_SFT);1390	}1391 1392	if (filter_mask & RT5677_I2S4_SOURCE) {1393		asrc8_mask |= RT5677_I2S4_CLK_SEL_MASK;1394		asrc8_value = (asrc8_value & ~RT5677_I2S4_CLK_SEL_MASK)1395			| ((clk_src - 1) << RT5677_I2S4_CLK_SEL_SFT);1396	}1397 1398	if (asrc8_mask)1399		regmap_update_bits(rt5677->regmap, RT5677_ASRC_8, asrc8_mask,1400			asrc8_value);1401 1402	return 0;1403}1404EXPORT_SYMBOL_GPL(rt5677_sel_asrc_clk_src);1405 1406static int rt5677_dmic_use_asrc(struct snd_soc_dapm_widget *source,1407			 struct snd_soc_dapm_widget *sink)1408{1409	struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm);1410	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);1411	unsigned int asrc_setting;1412 1413	switch (source->shift) {1414	case 11:1415		regmap_read(rt5677->regmap, RT5677_ASRC_5, &asrc_setting);1416		asrc_setting = (asrc_setting & RT5677_AD_STO1_CLK_SEL_MASK) >>1417				RT5677_AD_STO1_CLK_SEL_SFT;1418		break;1419 1420	case 10:1421		regmap_read(rt5677->regmap, RT5677_ASRC_5, &asrc_setting);1422		asrc_setting = (asrc_setting & RT5677_AD_STO2_CLK_SEL_MASK) >>1423				RT5677_AD_STO2_CLK_SEL_SFT;1424		break;1425 1426	case 9:1427		regmap_read(rt5677->regmap, RT5677_ASRC_5, &asrc_setting);1428		asrc_setting = (asrc_setting & RT5677_AD_STO3_CLK_SEL_MASK) >>1429				RT5677_AD_STO3_CLK_SEL_SFT;1430		break;1431 1432	case 8:1433		regmap_read(rt5677->regmap, RT5677_ASRC_5, &asrc_setting);1434		asrc_setting = (asrc_setting & RT5677_AD_STO4_CLK_SEL_MASK) >>1435			RT5677_AD_STO4_CLK_SEL_SFT;1436		break;1437 1438	case 7:1439		regmap_read(rt5677->regmap, RT5677_ASRC_6, &asrc_setting);1440		asrc_setting = (asrc_setting & RT5677_AD_MONOL_CLK_SEL_MASK) >>1441			RT5677_AD_MONOL_CLK_SEL_SFT;1442		break;1443 1444	case 6:1445		regmap_read(rt5677->regmap, RT5677_ASRC_6, &asrc_setting);1446		asrc_setting = (asrc_setting & RT5677_AD_MONOR_CLK_SEL_MASK) >>1447			RT5677_AD_MONOR_CLK_SEL_SFT;1448		break;1449 1450	default:1451		return 0;1452	}1453 1454	if (asrc_setting >= RT5677_CLK_SEL_I2S1_ASRC &&1455	    asrc_setting <= RT5677_CLK_SEL_I2S6_ASRC)1456		return 1;1457 1458	return 0;1459}1460 1461/* Digital Mixer */1462static const struct snd_kcontrol_new rt5677_sto1_adc_l_mix[] = {1463	SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO1_ADC_MIXER,1464			RT5677_M_STO1_ADC_L1_SFT, 1, 1),1465	SOC_DAPM_SINGLE("ADC2 Switch", RT5677_STO1_ADC_MIXER,1466			RT5677_M_STO1_ADC_L2_SFT, 1, 1),1467};1468 1469static const struct snd_kcontrol_new rt5677_sto1_adc_r_mix[] = {1470	SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO1_ADC_MIXER,1471			RT5677_M_STO1_ADC_R1_SFT, 1, 1),1472	SOC_DAPM_SINGLE("ADC2 Switch", RT5677_STO1_ADC_MIXER,1473			RT5677_M_STO1_ADC_R2_SFT, 1, 1),1474};1475 1476static const struct snd_kcontrol_new rt5677_sto2_adc_l_mix[] = {1477	SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO2_ADC_MIXER,1478			RT5677_M_STO2_ADC_L1_SFT, 1, 1),1479	SOC_DAPM_SINGLE("ADC2 Switch", RT5677_STO2_ADC_MIXER,1480			RT5677_M_STO2_ADC_L2_SFT, 1, 1),1481};1482 1483static const struct snd_kcontrol_new rt5677_sto2_adc_r_mix[] = {1484	SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO2_ADC_MIXER,1485			RT5677_M_STO2_ADC_R1_SFT, 1, 1),1486	SOC_DAPM_SINGLE("ADC2 Switch", RT5677_STO2_ADC_MIXER,1487			RT5677_M_STO2_ADC_R2_SFT, 1, 1),1488};1489 1490static const struct snd_kcontrol_new rt5677_sto3_adc_l_mix[] = {1491	SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO3_ADC_MIXER,1492			RT5677_M_STO3_ADC_L1_SFT, 1, 1),1493	SOC_DAPM_SINGLE("ADC2 Switch", RT5677_STO3_ADC_MIXER,1494			RT5677_M_STO3_ADC_L2_SFT, 1, 1),1495};1496 1497static const struct snd_kcontrol_new rt5677_sto3_adc_r_mix[] = {1498	SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO3_ADC_MIXER,1499			RT5677_M_STO3_ADC_R1_SFT, 1, 1),1500	SOC_DAPM_SINGLE("ADC2 Switch", RT5677_STO3_ADC_MIXER,1501			RT5677_M_STO3_ADC_R2_SFT, 1, 1),1502};1503 1504static const struct snd_kcontrol_new rt5677_sto4_adc_l_mix[] = {1505	SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO4_ADC_MIXER,1506			RT5677_M_STO4_ADC_L1_SFT, 1, 1),1507	SOC_DAPM_SINGLE("ADC2 Switch", RT5677_STO4_ADC_MIXER,1508			RT5677_M_STO4_ADC_L2_SFT, 1, 1),1509};1510 1511static const struct snd_kcontrol_new rt5677_sto4_adc_r_mix[] = {1512	SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO4_ADC_MIXER,1513			RT5677_M_STO4_ADC_R1_SFT, 1, 1),1514	SOC_DAPM_SINGLE("ADC2 Switch", RT5677_STO4_ADC_MIXER,1515			RT5677_M_STO4_ADC_R2_SFT, 1, 1),1516};1517 1518static const struct snd_kcontrol_new rt5677_mono_adc_l_mix[] = {1519	SOC_DAPM_SINGLE("ADC1 Switch", RT5677_MONO_ADC_MIXER,1520			RT5677_M_MONO_ADC_L1_SFT, 1, 1),1521	SOC_DAPM_SINGLE("ADC2 Switch", RT5677_MONO_ADC_MIXER,1522			RT5677_M_MONO_ADC_L2_SFT, 1, 1),1523};1524 1525static const struct snd_kcontrol_new rt5677_mono_adc_r_mix[] = {1526	SOC_DAPM_SINGLE("ADC1 Switch", RT5677_MONO_ADC_MIXER,1527			RT5677_M_MONO_ADC_R1_SFT, 1, 1),1528	SOC_DAPM_SINGLE("ADC2 Switch", RT5677_MONO_ADC_MIXER,1529			RT5677_M_MONO_ADC_R2_SFT, 1, 1),1530};1531 1532static const struct snd_kcontrol_new rt5677_dac_l_mix[] = {1533	SOC_DAPM_SINGLE("Stereo ADC Switch", RT5677_ADC_IF_DSP_DAC1_MIXER,1534			RT5677_M_ADDA_MIXER1_L_SFT, 1, 1),1535	SOC_DAPM_SINGLE("DAC1 Switch", RT5677_ADC_IF_DSP_DAC1_MIXER,1536			RT5677_M_DAC1_L_SFT, 1, 1),1537};1538 1539static const struct snd_kcontrol_new rt5677_dac_r_mix[] = {1540	SOC_DAPM_SINGLE("Stereo ADC Switch", RT5677_ADC_IF_DSP_DAC1_MIXER,1541			RT5677_M_ADDA_MIXER1_R_SFT, 1, 1),1542	SOC_DAPM_SINGLE("DAC1 Switch", RT5677_ADC_IF_DSP_DAC1_MIXER,1543			RT5677_M_DAC1_R_SFT, 1, 1),1544};1545 1546static const struct snd_kcontrol_new rt5677_sto1_dac_l_mix[] = {1547	SOC_DAPM_SINGLE_AUTODISABLE("ST L Switch", RT5677_STO1_DAC_MIXER,1548			RT5677_M_ST_DAC1_L_SFT, 1, 1),1549	SOC_DAPM_SINGLE_AUTODISABLE("DAC1 L Switch", RT5677_STO1_DAC_MIXER,1550			RT5677_M_DAC1_L_STO_L_SFT, 1, 1),1551	SOC_DAPM_SINGLE_AUTODISABLE("DAC2 L Switch", RT5677_STO1_DAC_MIXER,1552			RT5677_M_DAC2_L_STO_L_SFT, 1, 1),1553	SOC_DAPM_SINGLE_AUTODISABLE("DAC1 R Switch", RT5677_STO1_DAC_MIXER,1554			RT5677_M_DAC1_R_STO_L_SFT, 1, 1),1555};1556 1557static const struct snd_kcontrol_new rt5677_sto1_dac_r_mix[] = {1558	SOC_DAPM_SINGLE_AUTODISABLE("ST R Switch", RT5677_STO1_DAC_MIXER,1559			RT5677_M_ST_DAC1_R_SFT, 1, 1),1560	SOC_DAPM_SINGLE_AUTODISABLE("DAC1 R Switch", RT5677_STO1_DAC_MIXER,1561			RT5677_M_DAC1_R_STO_R_SFT, 1, 1),1562	SOC_DAPM_SINGLE_AUTODISABLE("DAC2 R Switch", RT5677_STO1_DAC_MIXER,1563			RT5677_M_DAC2_R_STO_R_SFT, 1, 1),1564	SOC_DAPM_SINGLE_AUTODISABLE("DAC1 L Switch", RT5677_STO1_DAC_MIXER,1565			RT5677_M_DAC1_L_STO_R_SFT, 1, 1),1566};1567 1568static const struct snd_kcontrol_new rt5677_mono_dac_l_mix[] = {1569	SOC_DAPM_SINGLE_AUTODISABLE("ST L Switch", RT5677_MONO_DAC_MIXER,1570			RT5677_M_ST_DAC2_L_SFT, 1, 1),1571	SOC_DAPM_SINGLE_AUTODISABLE("DAC1 L Switch", RT5677_MONO_DAC_MIXER,1572			RT5677_M_DAC1_L_MONO_L_SFT, 1, 1),1573	SOC_DAPM_SINGLE_AUTODISABLE("DAC2 L Switch", RT5677_MONO_DAC_MIXER,1574			RT5677_M_DAC2_L_MONO_L_SFT, 1, 1),1575	SOC_DAPM_SINGLE_AUTODISABLE("DAC2 R Switch", RT5677_MONO_DAC_MIXER,1576			RT5677_M_DAC2_R_MONO_L_SFT, 1, 1),1577};1578 1579static const struct snd_kcontrol_new rt5677_mono_dac_r_mix[] = {1580	SOC_DAPM_SINGLE_AUTODISABLE("ST R Switch", RT5677_MONO_DAC_MIXER,1581			RT5677_M_ST_DAC2_R_SFT, 1, 1),1582	SOC_DAPM_SINGLE_AUTODISABLE("DAC1 R Switch", RT5677_MONO_DAC_MIXER,1583			RT5677_M_DAC1_R_MONO_R_SFT, 1, 1),1584	SOC_DAPM_SINGLE_AUTODISABLE("DAC2 R Switch", RT5677_MONO_DAC_MIXER,1585			RT5677_M_DAC2_R_MONO_R_SFT, 1, 1),1586	SOC_DAPM_SINGLE_AUTODISABLE("DAC2 L Switch", RT5677_MONO_DAC_MIXER,1587			RT5677_M_DAC2_L_MONO_R_SFT, 1, 1),1588};1589 1590static const struct snd_kcontrol_new rt5677_dd1_l_mix[] = {1591	SOC_DAPM_SINGLE_AUTODISABLE("Sto DAC Mix L Switch", RT5677_DD1_MIXER,1592			RT5677_M_STO_L_DD1_L_SFT, 1, 1),1593	SOC_DAPM_SINGLE_AUTODISABLE("Mono DAC Mix L Switch", RT5677_DD1_MIXER,1594			RT5677_M_MONO_L_DD1_L_SFT, 1, 1),1595	SOC_DAPM_SINGLE_AUTODISABLE("DAC3 L Switch", RT5677_DD1_MIXER,1596			RT5677_M_DAC3_L_DD1_L_SFT, 1, 1),1597	SOC_DAPM_SINGLE_AUTODISABLE("DAC3 R Switch", RT5677_DD1_MIXER,1598			RT5677_M_DAC3_R_DD1_L_SFT, 1, 1),1599};1600 1601static const struct snd_kcontrol_new rt5677_dd1_r_mix[] = {1602	SOC_DAPM_SINGLE_AUTODISABLE("Sto DAC Mix R Switch", RT5677_DD1_MIXER,1603			RT5677_M_STO_R_DD1_R_SFT, 1, 1),1604	SOC_DAPM_SINGLE_AUTODISABLE("Mono DAC Mix R Switch", RT5677_DD1_MIXER,1605			RT5677_M_MONO_R_DD1_R_SFT, 1, 1),1606	SOC_DAPM_SINGLE_AUTODISABLE("DAC3 R Switch", RT5677_DD1_MIXER,1607			RT5677_M_DAC3_R_DD1_R_SFT, 1, 1),1608	SOC_DAPM_SINGLE_AUTODISABLE("DAC3 L Switch", RT5677_DD1_MIXER,1609			RT5677_M_DAC3_L_DD1_R_SFT, 1, 1),1610};1611 1612static const struct snd_kcontrol_new rt5677_dd2_l_mix[] = {1613	SOC_DAPM_SINGLE_AUTODISABLE("Sto DAC Mix L Switch", RT5677_DD2_MIXER,1614			RT5677_M_STO_L_DD2_L_SFT, 1, 1),1615	SOC_DAPM_SINGLE_AUTODISABLE("Mono DAC Mix L Switch", RT5677_DD2_MIXER,1616			RT5677_M_MONO_L_DD2_L_SFT, 1, 1),1617	SOC_DAPM_SINGLE_AUTODISABLE("DAC4 L Switch", RT5677_DD2_MIXER,1618			RT5677_M_DAC4_L_DD2_L_SFT, 1, 1),1619	SOC_DAPM_SINGLE_AUTODISABLE("DAC4 R Switch", RT5677_DD2_MIXER,1620			RT5677_M_DAC4_R_DD2_L_SFT, 1, 1),1621};1622 1623static const struct snd_kcontrol_new rt5677_dd2_r_mix[] = {1624	SOC_DAPM_SINGLE_AUTODISABLE("Sto DAC Mix R Switch", RT5677_DD2_MIXER,1625			RT5677_M_STO_R_DD2_R_SFT, 1, 1),1626	SOC_DAPM_SINGLE_AUTODISABLE("Mono DAC Mix R Switch", RT5677_DD2_MIXER,1627			RT5677_M_MONO_R_DD2_R_SFT, 1, 1),1628	SOC_DAPM_SINGLE_AUTODISABLE("DAC4 R Switch", RT5677_DD2_MIXER,1629			RT5677_M_DAC4_R_DD2_R_SFT, 1, 1),1630	SOC_DAPM_SINGLE_AUTODISABLE("DAC4 L Switch", RT5677_DD2_MIXER,1631			RT5677_M_DAC4_L_DD2_R_SFT, 1, 1),1632};1633 1634static const struct snd_kcontrol_new rt5677_ob_01_mix[] = {1635	SOC_DAPM_SINGLE("IB01 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,1636			RT5677_DSP_IB_01_H_SFT, 1, 1),1637	SOC_DAPM_SINGLE("IB23 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,1638			RT5677_DSP_IB_23_H_SFT, 1, 1),1639	SOC_DAPM_SINGLE("IB45 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,1640			RT5677_DSP_IB_45_H_SFT, 1, 1),1641	SOC_DAPM_SINGLE("IB6 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,1642			RT5677_DSP_IB_6_H_SFT, 1, 1),1643	SOC_DAPM_SINGLE("IB7 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,1644			RT5677_DSP_IB_7_H_SFT, 1, 1),1645	SOC_DAPM_SINGLE("IB8 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,1646			RT5677_DSP_IB_8_H_SFT, 1, 1),1647	SOC_DAPM_SINGLE("IB9 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,1648			RT5677_DSP_IB_9_H_SFT, 1, 1),1649};1650 1651static const struct snd_kcontrol_new rt5677_ob_23_mix[] = {1652	SOC_DAPM_SINGLE("IB01 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,1653			RT5677_DSP_IB_01_L_SFT, 1, 1),1654	SOC_DAPM_SINGLE("IB23 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,1655			RT5677_DSP_IB_23_L_SFT, 1, 1),1656	SOC_DAPM_SINGLE("IB45 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,1657			RT5677_DSP_IB_45_L_SFT, 1, 1),1658	SOC_DAPM_SINGLE("IB6 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,1659			RT5677_DSP_IB_6_L_SFT, 1, 1),1660	SOC_DAPM_SINGLE("IB7 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,1661			RT5677_DSP_IB_7_L_SFT, 1, 1),1662	SOC_DAPM_SINGLE("IB8 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,1663			RT5677_DSP_IB_8_L_SFT, 1, 1),1664	SOC_DAPM_SINGLE("IB9 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,1665			RT5677_DSP_IB_9_L_SFT, 1, 1),1666};1667 1668static const struct snd_kcontrol_new rt5677_ob_4_mix[] = {1669	SOC_DAPM_SINGLE("IB01 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,1670			RT5677_DSP_IB_01_H_SFT, 1, 1),1671	SOC_DAPM_SINGLE("IB23 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,1672			RT5677_DSP_IB_23_H_SFT, 1, 1),1673	SOC_DAPM_SINGLE("IB45 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,1674			RT5677_DSP_IB_45_H_SFT, 1, 1),1675	SOC_DAPM_SINGLE("IB6 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,1676			RT5677_DSP_IB_6_H_SFT, 1, 1),1677	SOC_DAPM_SINGLE("IB7 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,1678			RT5677_DSP_IB_7_H_SFT, 1, 1),1679	SOC_DAPM_SINGLE("IB8 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,1680			RT5677_DSP_IB_8_H_SFT, 1, 1),1681	SOC_DAPM_SINGLE("IB9 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,1682			RT5677_DSP_IB_9_H_SFT, 1, 1),1683};1684 1685static const struct snd_kcontrol_new rt5677_ob_5_mix[] = {1686	SOC_DAPM_SINGLE("IB01 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,1687			RT5677_DSP_IB_01_L_SFT, 1, 1),1688	SOC_DAPM_SINGLE("IB23 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,1689			RT5677_DSP_IB_23_L_SFT, 1, 1),1690	SOC_DAPM_SINGLE("IB45 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,1691			RT5677_DSP_IB_45_L_SFT, 1, 1),1692	SOC_DAPM_SINGLE("IB6 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,1693			RT5677_DSP_IB_6_L_SFT, 1, 1),1694	SOC_DAPM_SINGLE("IB7 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,1695			RT5677_DSP_IB_7_L_SFT, 1, 1),1696	SOC_DAPM_SINGLE("IB8 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,1697			RT5677_DSP_IB_8_L_SFT, 1, 1),1698	SOC_DAPM_SINGLE("IB9 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,1699			RT5677_DSP_IB_9_L_SFT, 1, 1),1700};1701 1702static const struct snd_kcontrol_new rt5677_ob_6_mix[] = {1703	SOC_DAPM_SINGLE("IB01 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,1704			RT5677_DSP_IB_01_H_SFT, 1, 1),1705	SOC_DAPM_SINGLE("IB23 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,1706			RT5677_DSP_IB_23_H_SFT, 1, 1),1707	SOC_DAPM_SINGLE("IB45 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,1708			RT5677_DSP_IB_45_H_SFT, 1, 1),1709	SOC_DAPM_SINGLE("IB6 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,1710			RT5677_DSP_IB_6_H_SFT, 1, 1),1711	SOC_DAPM_SINGLE("IB7 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,1712			RT5677_DSP_IB_7_H_SFT, 1, 1),1713	SOC_DAPM_SINGLE("IB8 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,1714			RT5677_DSP_IB_8_H_SFT, 1, 1),1715	SOC_DAPM_SINGLE("IB9 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,1716			RT5677_DSP_IB_9_H_SFT, 1, 1),1717};1718 1719static const struct snd_kcontrol_new rt5677_ob_7_mix[] = {1720	SOC_DAPM_SINGLE("IB01 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,1721			RT5677_DSP_IB_01_L_SFT, 1, 1),1722	SOC_DAPM_SINGLE("IB23 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,1723			RT5677_DSP_IB_23_L_SFT, 1, 1),1724	SOC_DAPM_SINGLE("IB45 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,1725			RT5677_DSP_IB_45_L_SFT, 1, 1),1726	SOC_DAPM_SINGLE("IB6 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,1727			RT5677_DSP_IB_6_L_SFT, 1, 1),1728	SOC_DAPM_SINGLE("IB7 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,1729			RT5677_DSP_IB_7_L_SFT, 1, 1),1730	SOC_DAPM_SINGLE("IB8 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,1731			RT5677_DSP_IB_8_L_SFT, 1, 1),1732	SOC_DAPM_SINGLE("IB9 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,1733			RT5677_DSP_IB_9_L_SFT, 1, 1),1734};1735 1736 1737/* Mux */1738/* DAC1 L/R Source */ /* MX-29 [10:8] */1739static const char * const rt5677_dac1_src[] = {1740	"IF1 DAC 01", "IF2 DAC 01", "IF3 DAC LR", "IF4 DAC LR", "SLB DAC 01",1741	"OB 01"1742};1743 1744static SOC_ENUM_SINGLE_DECL(1745	rt5677_dac1_enum, RT5677_ADC_IF_DSP_DAC1_MIXER,1746	RT5677_DAC1_L_SEL_SFT, rt5677_dac1_src);1747 1748static const struct snd_kcontrol_new rt5677_dac1_mux =1749	SOC_DAPM_ENUM("DAC1 Source", rt5677_dac1_enum);1750 1751/* ADDA1 L/R Source */ /* MX-29 [1:0] */1752static const char * const rt5677_adda1_src[] = {1753	"STO1 ADC MIX", "STO2 ADC MIX", "OB 67",1754};1755 1756static SOC_ENUM_SINGLE_DECL(1757	rt5677_adda1_enum, RT5677_ADC_IF_DSP_DAC1_MIXER,1758	RT5677_ADDA1_SEL_SFT, rt5677_adda1_src);1759 1760static const struct snd_kcontrol_new rt5677_adda1_mux =1761	SOC_DAPM_ENUM("ADDA1 Source", rt5677_adda1_enum);1762 1763 1764/*DAC2 L/R Source*/ /* MX-1B [6:4] [2:0] */1765static const char * const rt5677_dac2l_src[] = {1766	"IF1 DAC 2", "IF2 DAC 2", "IF3 DAC L", "IF4 DAC L", "SLB DAC 2",1767	"OB 2",1768};1769 1770static SOC_ENUM_SINGLE_DECL(1771	rt5677_dac2l_enum, RT5677_IF_DSP_DAC2_MIXER,1772	RT5677_SEL_DAC2_L_SRC_SFT, rt5677_dac2l_src);1773 1774static const struct snd_kcontrol_new rt5677_dac2_l_mux =1775	SOC_DAPM_ENUM("DAC2 L Source", rt5677_dac2l_enum);1776 1777static const char * const rt5677_dac2r_src[] = {1778	"IF1 DAC 3", "IF2 DAC 3", "IF3 DAC R", "IF4 DAC R", "SLB DAC 3",1779	"OB 3", "Haptic Generator", "VAD ADC"1780};1781 1782static SOC_ENUM_SINGLE_DECL(1783	rt5677_dac2r_enum, RT5677_IF_DSP_DAC2_MIXER,1784	RT5677_SEL_DAC2_R_SRC_SFT, rt5677_dac2r_src);1785 1786static const struct snd_kcontrol_new rt5677_dac2_r_mux =1787	SOC_DAPM_ENUM("DAC2 R Source", rt5677_dac2r_enum);1788 1789/*DAC3 L/R Source*/ /* MX-16 [6:4] [2:0] */1790static const char * const rt5677_dac3l_src[] = {1791	"IF1 DAC 4", "IF2 DAC 4", "IF3 DAC L", "IF4 DAC L",1792	"SLB DAC 4", "OB 4"1793};1794 1795static SOC_ENUM_SINGLE_DECL(1796	rt5677_dac3l_enum, RT5677_IF_DSP_DAC3_4_MIXER,1797	RT5677_SEL_DAC3_L_SRC_SFT, rt5677_dac3l_src);1798 1799static const struct snd_kcontrol_new rt5677_dac3_l_mux =1800	SOC_DAPM_ENUM("DAC3 L Source", rt5677_dac3l_enum);1801 1802static const char * const rt5677_dac3r_src[] = {1803	"IF1 DAC 5", "IF2 DAC 5", "IF3 DAC R", "IF4 DAC R",1804	"SLB DAC 5", "OB 5"1805};1806 1807static SOC_ENUM_SINGLE_DECL(1808	rt5677_dac3r_enum, RT5677_IF_DSP_DAC3_4_MIXER,1809	RT5677_SEL_DAC3_R_SRC_SFT, rt5677_dac3r_src);1810 1811static const struct snd_kcontrol_new rt5677_dac3_r_mux =1812	SOC_DAPM_ENUM("DAC3 R Source", rt5677_dac3r_enum);1813 1814/*DAC4 L/R Source*/ /* MX-16 [14:12] [10:8] */1815static const char * const rt5677_dac4l_src[] = {1816	"IF1 DAC 6", "IF2 DAC 6", "IF3 DAC L", "IF4 DAC L",1817	"SLB DAC 6", "OB 6"1818};1819 1820static SOC_ENUM_SINGLE_DECL(1821	rt5677_dac4l_enum, RT5677_IF_DSP_DAC3_4_MIXER,1822	RT5677_SEL_DAC4_L_SRC_SFT, rt5677_dac4l_src);1823 1824static const struct snd_kcontrol_new rt5677_dac4_l_mux =1825	SOC_DAPM_ENUM("DAC4 L Source", rt5677_dac4l_enum);1826 1827static const char * const rt5677_dac4r_src[] = {1828	"IF1 DAC 7", "IF2 DAC 7", "IF3 DAC R", "IF4 DAC R",1829	"SLB DAC 7", "OB 7"1830};1831 1832static SOC_ENUM_SINGLE_DECL(1833	rt5677_dac4r_enum, RT5677_IF_DSP_DAC3_4_MIXER,1834	RT5677_SEL_DAC4_R_SRC_SFT, rt5677_dac4r_src);1835 1836static const struct snd_kcontrol_new rt5677_dac4_r_mux =1837	SOC_DAPM_ENUM("DAC4 R Source", rt5677_dac4r_enum);1838 1839/* In/OutBound Source Pass SRC */ /* MX-A5 [3] [4] [0] [1] [2] */1840static const char * const rt5677_iob_bypass_src[] = {1841	"Bypass", "Pass SRC"1842};1843 1844static SOC_ENUM_SINGLE_DECL(1845	rt5677_ob01_bypass_src_enum, RT5677_DSP_IN_OUTB_CTRL,1846	RT5677_SEL_SRC_OB01_SFT, rt5677_iob_bypass_src);1847 1848static const struct snd_kcontrol_new rt5677_ob01_bypass_src_mux =1849	SOC_DAPM_ENUM("OB01 Bypass Source", rt5677_ob01_bypass_src_enum);1850 1851static SOC_ENUM_SINGLE_DECL(1852	rt5677_ob23_bypass_src_enum, RT5677_DSP_IN_OUTB_CTRL,1853	RT5677_SEL_SRC_OB23_SFT, rt5677_iob_bypass_src);1854 1855static const struct snd_kcontrol_new rt5677_ob23_bypass_src_mux =1856	SOC_DAPM_ENUM("OB23 Bypass Source", rt5677_ob23_bypass_src_enum);1857 1858static SOC_ENUM_SINGLE_DECL(1859	rt5677_ib01_bypass_src_enum, RT5677_DSP_IN_OUTB_CTRL,1860	RT5677_SEL_SRC_IB01_SFT, rt5677_iob_bypass_src);1861 1862static const struct snd_kcontrol_new rt5677_ib01_bypass_src_mux =1863	SOC_DAPM_ENUM("IB01 Bypass Source", rt5677_ib01_bypass_src_enum);1864 1865static SOC_ENUM_SINGLE_DECL(1866	rt5677_ib23_bypass_src_enum, RT5677_DSP_IN_OUTB_CTRL,1867	RT5677_SEL_SRC_IB23_SFT, rt5677_iob_bypass_src);1868 1869static const struct snd_kcontrol_new rt5677_ib23_bypass_src_mux =1870	SOC_DAPM_ENUM("IB23 Bypass Source", rt5677_ib23_bypass_src_enum);1871 1872static SOC_ENUM_SINGLE_DECL(1873	rt5677_ib45_bypass_src_enum, RT5677_DSP_IN_OUTB_CTRL,1874	RT5677_SEL_SRC_IB45_SFT, rt5677_iob_bypass_src);1875 1876static const struct snd_kcontrol_new rt5677_ib45_bypass_src_mux =1877	SOC_DAPM_ENUM("IB45 Bypass Source", rt5677_ib45_bypass_src_enum);1878 1879/* Stereo ADC Source 2 */ /* MX-27 MX26 MX25 [11:10] */1880static const char * const rt5677_stereo_adc2_src[] = {1881	"DD MIX1", "DMIC", "Stereo DAC MIX"1882};1883 1884static SOC_ENUM_SINGLE_DECL(1885	rt5677_stereo1_adc2_enum, RT5677_STO1_ADC_MIXER,1886	RT5677_SEL_STO1_ADC2_SFT, rt5677_stereo_adc2_src);1887 1888static const struct snd_kcontrol_new rt5677_sto1_adc2_mux =1889	SOC_DAPM_ENUM("Stereo1 ADC2 Source", rt5677_stereo1_adc2_enum);1890 1891static SOC_ENUM_SINGLE_DECL(1892	rt5677_stereo2_adc2_enum, RT5677_STO2_ADC_MIXER,1893	RT5677_SEL_STO2_ADC2_SFT, rt5677_stereo_adc2_src);1894 1895static const struct snd_kcontrol_new rt5677_sto2_adc2_mux =1896	SOC_DAPM_ENUM("Stereo2 ADC2 Source", rt5677_stereo2_adc2_enum);1897 1898static SOC_ENUM_SINGLE_DECL(1899	rt5677_stereo3_adc2_enum, RT5677_STO3_ADC_MIXER,1900	RT5677_SEL_STO3_ADC2_SFT, rt5677_stereo_adc2_src);1901 1902static const struct snd_kcontrol_new rt5677_sto3_adc2_mux =1903	SOC_DAPM_ENUM("Stereo3 ADC2 Source", rt5677_stereo3_adc2_enum);1904 1905/* DMIC Source */ /* MX-28 [9:8][1:0] MX-27 MX-26 MX-25 MX-24 [9:8] */1906static const char * const rt5677_dmic_src[] = {1907	"DMIC1", "DMIC2", "DMIC3", "DMIC4"1908};1909 1910static SOC_ENUM_SINGLE_DECL(1911	rt5677_mono_dmic_l_enum, RT5677_MONO_ADC_MIXER,1912	RT5677_SEL_MONO_DMIC_L_SFT, rt5677_dmic_src);1913 1914static const struct snd_kcontrol_new rt5677_mono_dmic_l_mux =1915	SOC_DAPM_ENUM("Mono DMIC L Source", rt5677_mono_dmic_l_enum);1916 1917static SOC_ENUM_SINGLE_DECL(1918	rt5677_mono_dmic_r_enum, RT5677_MONO_ADC_MIXER,1919	RT5677_SEL_MONO_DMIC_R_SFT, rt5677_dmic_src);1920 1921static const struct snd_kcontrol_new rt5677_mono_dmic_r_mux =1922	SOC_DAPM_ENUM("Mono DMIC R Source", rt5677_mono_dmic_r_enum);1923 1924static SOC_ENUM_SINGLE_DECL(1925	rt5677_stereo1_dmic_enum, RT5677_STO1_ADC_MIXER,1926	RT5677_SEL_STO1_DMIC_SFT, rt5677_dmic_src);1927 1928static const struct snd_kcontrol_new rt5677_sto1_dmic_mux =1929	SOC_DAPM_ENUM("Stereo1 DMIC Source", rt5677_stereo1_dmic_enum);1930 1931static SOC_ENUM_SINGLE_DECL(1932	rt5677_stereo2_dmic_enum, RT5677_STO2_ADC_MIXER,1933	RT5677_SEL_STO2_DMIC_SFT, rt5677_dmic_src);1934 1935static const struct snd_kcontrol_new rt5677_sto2_dmic_mux =1936	SOC_DAPM_ENUM("Stereo2 DMIC Source", rt5677_stereo2_dmic_enum);1937 1938static SOC_ENUM_SINGLE_DECL(1939	rt5677_stereo3_dmic_enum, RT5677_STO3_ADC_MIXER,1940	RT5677_SEL_STO3_DMIC_SFT, rt5677_dmic_src);1941 1942static const struct snd_kcontrol_new rt5677_sto3_dmic_mux =1943	SOC_DAPM_ENUM("Stereo3 DMIC Source", rt5677_stereo3_dmic_enum);1944 1945static SOC_ENUM_SINGLE_DECL(1946	rt5677_stereo4_dmic_enum, RT5677_STO4_ADC_MIXER,1947	RT5677_SEL_STO4_DMIC_SFT, rt5677_dmic_src);1948 1949static const struct snd_kcontrol_new rt5677_sto4_dmic_mux =1950	SOC_DAPM_ENUM("Stereo4 DMIC Source", rt5677_stereo4_dmic_enum);1951 1952/* Stereo2 ADC Source */ /* MX-26 [0] */1953static const char * const rt5677_stereo2_adc_lr_src[] = {1954	"L", "LR"1955};1956 1957static SOC_ENUM_SINGLE_DECL(1958	rt5677_stereo2_adc_lr_enum, RT5677_STO2_ADC_MIXER,1959	RT5677_SEL_STO2_LR_MIX_SFT, rt5677_stereo2_adc_lr_src);1960 1961static const struct snd_kcontrol_new rt5677_sto2_adc_lr_mux =1962	SOC_DAPM_ENUM("Stereo2 ADC LR Source", rt5677_stereo2_adc_lr_enum);1963 1964/* Stereo1 ADC Source 1 */ /* MX-27 MX26 MX25 [13:12] */1965static const char * const rt5677_stereo_adc1_src[] = {1966	"DD MIX1", "ADC1/2", "Stereo DAC MIX"1967};1968 1969static SOC_ENUM_SINGLE_DECL(1970	rt5677_stereo1_adc1_enum, RT5677_STO1_ADC_MIXER,1971	RT5677_SEL_STO1_ADC1_SFT, rt5677_stereo_adc1_src);1972 1973static const struct snd_kcontrol_new rt5677_sto1_adc1_mux =1974	SOC_DAPM_ENUM("Stereo1 ADC1 Source", rt5677_stereo1_adc1_enum);1975 1976static SOC_ENUM_SINGLE_DECL(1977	rt5677_stereo2_adc1_enum, RT5677_STO2_ADC_MIXER,1978	RT5677_SEL_STO2_ADC1_SFT, rt5677_stereo_adc1_src);1979 1980static const struct snd_kcontrol_new rt5677_sto2_adc1_mux =1981	SOC_DAPM_ENUM("Stereo2 ADC1 Source", rt5677_stereo2_adc1_enum);1982 1983static SOC_ENUM_SINGLE_DECL(1984	rt5677_stereo3_adc1_enum, RT5677_STO3_ADC_MIXER,1985	RT5677_SEL_STO3_ADC1_SFT, rt5677_stereo_adc1_src);1986 1987static const struct snd_kcontrol_new rt5677_sto3_adc1_mux =1988	SOC_DAPM_ENUM("Stereo3 ADC1 Source", rt5677_stereo3_adc1_enum);1989 1990/* Mono ADC Left Source 2 */ /* MX-28 [11:10] */1991static const char * const rt5677_mono_adc2_l_src[] = {1992	"DD MIX1L", "DMIC", "MONO DAC MIXL"1993};1994 1995static SOC_ENUM_SINGLE_DECL(1996	rt5677_mono_adc2_l_enum, RT5677_MONO_ADC_MIXER,1997	RT5677_SEL_MONO_ADC_L2_SFT, rt5677_mono_adc2_l_src);1998 1999static const struct snd_kcontrol_new rt5677_mono_adc2_l_mux =2000	SOC_DAPM_ENUM("Mono ADC2 L Source", rt5677_mono_adc2_l_enum);2001 2002/* Mono ADC Left Source 1 */ /* MX-28 [13:12] */2003static const char * const rt5677_mono_adc1_l_src[] = {2004	"DD MIX1L", "ADC1", "MONO DAC MIXL"2005};2006 2007static SOC_ENUM_SINGLE_DECL(2008	rt5677_mono_adc1_l_enum, RT5677_MONO_ADC_MIXER,2009	RT5677_SEL_MONO_ADC_L1_SFT, rt5677_mono_adc1_l_src);2010 2011static const struct snd_kcontrol_new rt5677_mono_adc1_l_mux =2012	SOC_DAPM_ENUM("Mono ADC1 L Source", rt5677_mono_adc1_l_enum);2013 2014/* Mono ADC Right Source 2 */ /* MX-28 [3:2] */2015static const char * const rt5677_mono_adc2_r_src[] = {2016	"DD MIX1R", "DMIC", "MONO DAC MIXR"2017};2018 2019static SOC_ENUM_SINGLE_DECL(2020	rt5677_mono_adc2_r_enum, RT5677_MONO_ADC_MIXER,2021	RT5677_SEL_MONO_ADC_R2_SFT, rt5677_mono_adc2_r_src);2022 2023static const struct snd_kcontrol_new rt5677_mono_adc2_r_mux =2024	SOC_DAPM_ENUM("Mono ADC2 R Source", rt5677_mono_adc2_r_enum);2025 2026/* Mono ADC Right Source 1 */ /* MX-28 [5:4] */2027static const char * const rt5677_mono_adc1_r_src[] = {2028	"DD MIX1R", "ADC2", "MONO DAC MIXR"2029};2030 2031static SOC_ENUM_SINGLE_DECL(2032	rt5677_mono_adc1_r_enum, RT5677_MONO_ADC_MIXER,2033	RT5677_SEL_MONO_ADC_R1_SFT, rt5677_mono_adc1_r_src);2034 2035static const struct snd_kcontrol_new rt5677_mono_adc1_r_mux =2036	SOC_DAPM_ENUM("Mono ADC1 R Source", rt5677_mono_adc1_r_enum);2037 2038/* Stereo4 ADC Source 2 */ /* MX-24 [11:10] */2039static const char * const rt5677_stereo4_adc2_src[] = {2040	"DD MIX1", "DMIC", "DD MIX2"2041};2042 2043static SOC_ENUM_SINGLE_DECL(2044	rt5677_stereo4_adc2_enum, RT5677_STO4_ADC_MIXER,2045	RT5677_SEL_STO4_ADC2_SFT, rt5677_stereo4_adc2_src);2046 2047static const struct snd_kcontrol_new rt5677_sto4_adc2_mux =2048	SOC_DAPM_ENUM("Stereo4 ADC2 Source", rt5677_stereo4_adc2_enum);2049 2050 2051/* Stereo4 ADC Source 1 */ /* MX-24 [13:12] */2052static const char * const rt5677_stereo4_adc1_src[] = {2053	"DD MIX1", "ADC1/2", "DD MIX2"2054};2055 2056static SOC_ENUM_SINGLE_DECL(2057	rt5677_stereo4_adc1_enum, RT5677_STO4_ADC_MIXER,2058	RT5677_SEL_STO4_ADC1_SFT, rt5677_stereo4_adc1_src);2059 2060static const struct snd_kcontrol_new rt5677_sto4_adc1_mux =2061	SOC_DAPM_ENUM("Stereo4 ADC1 Source", rt5677_stereo4_adc1_enum);2062 2063/* InBound0/1 Source */ /* MX-A3 [14:12] */2064static const char * const rt5677_inbound01_src[] = {2065	"IF1 DAC 01", "IF2 DAC 01", "SLB DAC 01", "STO1 ADC MIX",2066	"VAD ADC/DAC1 FS"2067};2068 2069static SOC_ENUM_SINGLE_DECL(2070	rt5677_inbound01_enum, RT5677_DSP_INB_CTRL1,2071	RT5677_IB01_SRC_SFT, rt5677_inbound01_src);2072 2073static const struct snd_kcontrol_new rt5677_ib01_src_mux =2074	SOC_DAPM_ENUM("InBound0/1 Source", rt5677_inbound01_enum);2075 2076/* InBound2/3 Source */ /* MX-A3 [10:8] */2077static const char * const rt5677_inbound23_src[] = {2078	"IF1 DAC 23", "IF2 DAC 23", "SLB DAC 23", "STO2 ADC MIX",2079	"DAC1 FS", "IF4 DAC"2080};2081 2082static SOC_ENUM_SINGLE_DECL(2083	rt5677_inbound23_enum, RT5677_DSP_INB_CTRL1,2084	RT5677_IB23_SRC_SFT, rt5677_inbound23_src);2085 2086static const struct snd_kcontrol_new rt5677_ib23_src_mux =2087	SOC_DAPM_ENUM("InBound2/3 Source", rt5677_inbound23_enum);2088 2089/* InBound4/5 Source */ /* MX-A3 [6:4] */2090static const char * const rt5677_inbound45_src[] = {2091	"IF1 DAC 45", "IF2 DAC 45", "SLB DAC 45", "STO3 ADC MIX",2092	"IF3 DAC"2093};2094 2095static SOC_ENUM_SINGLE_DECL(2096	rt5677_inbound45_enum, RT5677_DSP_INB_CTRL1,2097	RT5677_IB45_SRC_SFT, rt5677_inbound45_src);2098 2099static const struct snd_kcontrol_new rt5677_ib45_src_mux =2100	SOC_DAPM_ENUM("InBound4/5 Source", rt5677_inbound45_enum);2101 2102/* InBound6 Source */ /* MX-A3 [2:0] */2103static const char * const rt5677_inbound6_src[] = {2104	"IF1 DAC 6", "IF2 DAC 6", "SLB DAC 6", "STO4 ADC MIX L",2105	"IF4 DAC L", "STO1 ADC MIX L", "STO2 ADC MIX L", "STO3 ADC MIX L"2106};2107 2108static SOC_ENUM_SINGLE_DECL(2109	rt5677_inbound6_enum, RT5677_DSP_INB_CTRL1,2110	RT5677_IB6_SRC_SFT, rt5677_inbound6_src);2111 2112static const struct snd_kcontrol_new rt5677_ib6_src_mux =2113	SOC_DAPM_ENUM("InBound6 Source", rt5677_inbound6_enum);2114 2115/* InBound7 Source */ /* MX-A4 [14:12] */2116static const char * const rt5677_inbound7_src[] = {2117	"IF1 DAC 7", "IF2 DAC 7", "SLB DAC 7", "STO4 ADC MIX R",2118	"IF4 DAC R", "STO1 ADC MIX R", "STO2 ADC MIX R", "STO3 ADC MIX R"2119};2120 2121static SOC_ENUM_SINGLE_DECL(2122	rt5677_inbound7_enum, RT5677_DSP_INB_CTRL2,2123	RT5677_IB7_SRC_SFT, rt5677_inbound7_src);2124 2125static const struct snd_kcontrol_new rt5677_ib7_src_mux =2126	SOC_DAPM_ENUM("InBound7 Source", rt5677_inbound7_enum);2127 2128/* InBound8 Source */ /* MX-A4 [10:8] */2129static const char * const rt5677_inbound8_src[] = {2130	"STO1 ADC MIX L", "STO2 ADC MIX L", "STO3 ADC MIX L", "STO4 ADC MIX L",2131	"MONO ADC MIX L", "DACL1 FS"2132};2133 2134static SOC_ENUM_SINGLE_DECL(2135	rt5677_inbound8_enum, RT5677_DSP_INB_CTRL2,2136	RT5677_IB8_SRC_SFT, rt5677_inbound8_src);2137 2138static const struct snd_kcontrol_new rt5677_ib8_src_mux =2139	SOC_DAPM_ENUM("InBound8 Source", rt5677_inbound8_enum);2140 2141/* InBound9 Source */ /* MX-A4 [6:4] */2142static const char * const rt5677_inbound9_src[] = {2143	"STO1 ADC MIX R", "STO2 ADC MIX R", "STO3 ADC MIX R", "STO4 ADC MIX R",2144	"MONO ADC MIX R", "DACR1 FS", "DAC1 FS"2145};2146 2147static SOC_ENUM_SINGLE_DECL(2148	rt5677_inbound9_enum, RT5677_DSP_INB_CTRL2,2149	RT5677_IB9_SRC_SFT, rt5677_inbound9_src);2150 2151static const struct snd_kcontrol_new rt5677_ib9_src_mux =2152	SOC_DAPM_ENUM("InBound9 Source", rt5677_inbound9_enum);2153 2154/* VAD Source */ /* MX-9F [6:4] */2155static const char * const rt5677_vad_src[] = {2156	"STO1 ADC MIX L", "MONO ADC MIX L", "MONO ADC MIX R", "STO2 ADC MIX L",2157	"STO3 ADC MIX L"2158};2159 2160static SOC_ENUM_SINGLE_DECL(2161	rt5677_vad_enum, RT5677_VAD_CTRL4,2162	RT5677_VAD_SRC_SFT, rt5677_vad_src);2163 2164static const struct snd_kcontrol_new rt5677_vad_src_mux =2165	SOC_DAPM_ENUM("VAD Source", rt5677_vad_enum);2166 2167/* Sidetone Source */ /* MX-13 [11:9] */2168static const char * const rt5677_sidetone_src[] = {2169	"DMIC1 L", "DMIC2 L", "DMIC3 L", "DMIC4 L", "ADC1", "ADC2"2170};2171 2172static SOC_ENUM_SINGLE_DECL(2173	rt5677_sidetone_enum, RT5677_SIDETONE_CTRL,2174	RT5677_ST_SEL_SFT, rt5677_sidetone_src);2175 2176static const struct snd_kcontrol_new rt5677_sidetone_mux =2177	SOC_DAPM_ENUM("Sidetone Source", rt5677_sidetone_enum);2178 2179/* DAC1/2 Source */ /* MX-15 [1:0] */2180static const char * const rt5677_dac12_src[] = {2181	"STO1 DAC MIX", "MONO DAC MIX", "DD MIX1", "DD MIX2"2182};2183 2184static SOC_ENUM_SINGLE_DECL(2185	rt5677_dac12_enum, RT5677_ANA_DAC1_2_3_SRC,2186	RT5677_ANA_DAC1_2_SRC_SEL_SFT, rt5677_dac12_src);2187 2188static const struct snd_kcontrol_new rt5677_dac12_mux =2189	SOC_DAPM_ENUM("Analog DAC1/2 Source", rt5677_dac12_enum);2190 2191/* DAC3 Source */ /* MX-15 [5:4] */2192static const char * const rt5677_dac3_src[] = {2193	"MONO DAC MIXL", "MONO DAC MIXR", "DD MIX1L", "DD MIX2L"2194};2195 2196static SOC_ENUM_SINGLE_DECL(2197	rt5677_dac3_enum, RT5677_ANA_DAC1_2_3_SRC,2198	RT5677_ANA_DAC3_SRC_SEL_SFT, rt5677_dac3_src);2199 2200static const struct snd_kcontrol_new rt5677_dac3_mux =2201	SOC_DAPM_ENUM("Analog DAC3 Source", rt5677_dac3_enum);2202 2203/* PDM channel Source */ /* MX-31 [13:12][9:8][5:4][1:0] */2204static const char * const rt5677_pdm_src[] = {2205	"STO1 DAC MIX", "MONO DAC MIX", "DD MIX1", "DD MIX2"2206};2207 2208static SOC_ENUM_SINGLE_DECL(2209	rt5677_pdm1_l_enum, RT5677_PDM_OUT_CTRL,2210	RT5677_SEL_PDM1_L_SFT, rt5677_pdm_src);2211 2212static const struct snd_kcontrol_new rt5677_pdm1_l_mux =2213	SOC_DAPM_ENUM("PDM1 Source", rt5677_pdm1_l_enum);2214 2215static SOC_ENUM_SINGLE_DECL(2216	rt5677_pdm2_l_enum, RT5677_PDM_OUT_CTRL,2217	RT5677_SEL_PDM2_L_SFT, rt5677_pdm_src);2218 2219static const struct snd_kcontrol_new rt5677_pdm2_l_mux =2220	SOC_DAPM_ENUM("PDM2 Source", rt5677_pdm2_l_enum);2221 2222static SOC_ENUM_SINGLE_DECL(2223	rt5677_pdm1_r_enum, RT5677_PDM_OUT_CTRL,2224	RT5677_SEL_PDM1_R_SFT, rt5677_pdm_src);2225 2226static const struct snd_kcontrol_new rt5677_pdm1_r_mux =2227	SOC_DAPM_ENUM("PDM1 Source", rt5677_pdm1_r_enum);2228 2229static SOC_ENUM_SINGLE_DECL(2230	rt5677_pdm2_r_enum, RT5677_PDM_OUT_CTRL,2231	RT5677_SEL_PDM2_R_SFT, rt5677_pdm_src);2232 2233static const struct snd_kcontrol_new rt5677_pdm2_r_mux =2234	SOC_DAPM_ENUM("PDM2 Source", rt5677_pdm2_r_enum);2235 2236/* TDM IF1/2 SLB ADC1 Data Selection */ /* MX-3C MX-41 [5:4] MX-08 [1:0] */2237static const char * const rt5677_if12_adc1_src[] = {2238	"STO1 ADC MIX", "OB01", "VAD ADC"2239};2240 2241static SOC_ENUM_SINGLE_DECL(2242	rt5677_if1_adc1_enum, RT5677_TDM1_CTRL2,2243	RT5677_IF1_ADC1_SFT, rt5677_if12_adc1_src);2244 2245static const struct snd_kcontrol_new rt5677_if1_adc1_mux =2246	SOC_DAPM_ENUM("IF1 ADC1 Source", rt5677_if1_adc1_enum);2247 2248static SOC_ENUM_SINGLE_DECL(2249	rt5677_if2_adc1_enum, RT5677_TDM2_CTRL2,2250	RT5677_IF2_ADC1_SFT, rt5677_if12_adc1_src);2251 2252static const struct snd_kcontrol_new rt5677_if2_adc1_mux =2253	SOC_DAPM_ENUM("IF2 ADC1 Source", rt5677_if2_adc1_enum);2254 2255static SOC_ENUM_SINGLE_DECL(2256	rt5677_slb_adc1_enum, RT5677_SLIMBUS_RX,2257	RT5677_SLB_ADC1_SFT, rt5677_if12_adc1_src);2258 2259static const struct snd_kcontrol_new rt5677_slb_adc1_mux =2260	SOC_DAPM_ENUM("SLB ADC1 Source", rt5677_slb_adc1_enum);2261 2262/* TDM IF1/2 SLB ADC2 Data Selection */ /* MX-3C MX-41 [7:6] MX-08 [3:2] */2263static const char * const rt5677_if12_adc2_src[] = {2264	"STO2 ADC MIX", "OB23"2265};2266 2267static SOC_ENUM_SINGLE_DECL(2268	rt5677_if1_adc2_enum, RT5677_TDM1_CTRL2,2269	RT5677_IF1_ADC2_SFT, rt5677_if12_adc2_src);2270 2271static const struct snd_kcontrol_new rt5677_if1_adc2_mux =2272	SOC_DAPM_ENUM("IF1 ADC2 Source", rt5677_if1_adc2_enum);2273 2274static SOC_ENUM_SINGLE_DECL(2275	rt5677_if2_adc2_enum, RT5677_TDM2_CTRL2,2276	RT5677_IF2_ADC2_SFT, rt5677_if12_adc2_src);2277 2278static const struct snd_kcontrol_new rt5677_if2_adc2_mux =2279	SOC_DAPM_ENUM("IF2 ADC2 Source", rt5677_if2_adc2_enum);2280 2281static SOC_ENUM_SINGLE_DECL(2282	rt5677_slb_adc2_enum, RT5677_SLIMBUS_RX,2283	RT5677_SLB_ADC2_SFT, rt5677_if12_adc2_src);2284 2285static const struct snd_kcontrol_new rt5677_slb_adc2_mux =2286	SOC_DAPM_ENUM("SLB ADC2 Source", rt5677_slb_adc2_enum);2287 2288/* TDM IF1/2 SLB ADC3 Data Selection */ /* MX-3C MX-41 [9:8] MX-08 [5:4] */2289static const char * const rt5677_if12_adc3_src[] = {2290	"STO3 ADC MIX", "MONO ADC MIX", "OB45"2291};2292 2293static SOC_ENUM_SINGLE_DECL(2294	rt5677_if1_adc3_enum, RT5677_TDM1_CTRL2,2295	RT5677_IF1_ADC3_SFT, rt5677_if12_adc3_src);2296 2297static const struct snd_kcontrol_new rt5677_if1_adc3_mux =2298	SOC_DAPM_ENUM("IF1 ADC3 Source", rt5677_if1_adc3_enum);2299 2300static SOC_ENUM_SINGLE_DECL(2301	rt5677_if2_adc3_enum, RT5677_TDM2_CTRL2,2302	RT5677_IF2_ADC3_SFT, rt5677_if12_adc3_src);2303 2304static const struct snd_kcontrol_new rt5677_if2_adc3_mux =2305	SOC_DAPM_ENUM("IF2 ADC3 Source", rt5677_if2_adc3_enum);2306 2307static SOC_ENUM_SINGLE_DECL(2308	rt5677_slb_adc3_enum, RT5677_SLIMBUS_RX,2309	RT5677_SLB_ADC3_SFT, rt5677_if12_adc3_src);2310 2311static const struct snd_kcontrol_new rt5677_slb_adc3_mux =2312	SOC_DAPM_ENUM("SLB ADC3 Source", rt5677_slb_adc3_enum);2313 2314/* TDM IF1/2 SLB ADC4 Data Selection */ /* MX-3C MX-41 [11:10] MX-08 [7:6] */2315static const char * const rt5677_if12_adc4_src[] = {2316	"STO4 ADC MIX", "OB67", "OB01"2317};2318 2319static SOC_ENUM_SINGLE_DECL(2320	rt5677_if1_adc4_enum, RT5677_TDM1_CTRL2,2321	RT5677_IF1_ADC4_SFT, rt5677_if12_adc4_src);2322 2323static const struct snd_kcontrol_new rt5677_if1_adc4_mux =2324	SOC_DAPM_ENUM("IF1 ADC4 Source", rt5677_if1_adc4_enum);2325 2326static SOC_ENUM_SINGLE_DECL(2327	rt5677_if2_adc4_enum, RT5677_TDM2_CTRL2,2328	RT5677_IF2_ADC4_SFT, rt5677_if12_adc4_src);2329 2330static const struct snd_kcontrol_new rt5677_if2_adc4_mux =2331	SOC_DAPM_ENUM("IF2 ADC4 Source", rt5677_if2_adc4_enum);2332 2333static SOC_ENUM_SINGLE_DECL(2334	rt5677_slb_adc4_enum, RT5677_SLIMBUS_RX,2335	RT5677_SLB_ADC4_SFT, rt5677_if12_adc4_src);2336 2337static const struct snd_kcontrol_new rt5677_slb_adc4_mux =2338	SOC_DAPM_ENUM("SLB ADC4 Source", rt5677_slb_adc4_enum);2339 2340/* Interface3/4 ADC Data Input */ /* MX-2F [3:0] MX-30 [7:4] */2341static const char * const rt5677_if34_adc_src[] = {2342	"STO1 ADC MIX", "STO2 ADC MIX", "STO3 ADC MIX", "STO4 ADC MIX",2343	"MONO ADC MIX", "OB01", "OB23", "VAD ADC"2344};2345 2346static SOC_ENUM_SINGLE_DECL(2347	rt5677_if3_adc_enum, RT5677_IF3_DATA,2348	RT5677_IF3_ADC_IN_SFT, rt5677_if34_adc_src);2349 2350static const struct snd_kcontrol_new rt5677_if3_adc_mux =2351	SOC_DAPM_ENUM("IF3 ADC Source", rt5677_if3_adc_enum);2352 2353static SOC_ENUM_SINGLE_DECL(2354	rt5677_if4_adc_enum, RT5677_IF4_DATA,2355	RT5677_IF4_ADC_IN_SFT, rt5677_if34_adc_src);2356 2357static const struct snd_kcontrol_new rt5677_if4_adc_mux =2358	SOC_DAPM_ENUM("IF4 ADC Source", rt5677_if4_adc_enum);2359 2360/* TDM IF1/2 ADC Data Selection */ /* MX-3B MX-40 [7:6][5:4][3:2][1:0] */2361static const char * const rt5677_if12_adc_swap_src[] = {2362	"L/R", "R/L", "L/L", "R/R"2363};2364 2365static SOC_ENUM_SINGLE_DECL(2366	rt5677_if1_adc1_swap_enum, RT5677_TDM1_CTRL1,2367	RT5677_IF1_ADC1_SWAP_SFT, rt5677_if12_adc_swap_src);2368 2369static const struct snd_kcontrol_new rt5677_if1_adc1_swap_mux =2370	SOC_DAPM_ENUM("IF1 ADC1 Swap Source", rt5677_if1_adc1_swap_enum);2371 2372static SOC_ENUM_SINGLE_DECL(2373	rt5677_if1_adc2_swap_enum, RT5677_TDM1_CTRL1,2374	RT5677_IF1_ADC2_SWAP_SFT, rt5677_if12_adc_swap_src);2375 2376static const struct snd_kcontrol_new rt5677_if1_adc2_swap_mux =2377	SOC_DAPM_ENUM("IF1 ADC2 Swap Source", rt5677_if1_adc2_swap_enum);2378 2379static SOC_ENUM_SINGLE_DECL(2380	rt5677_if1_adc3_swap_enum, RT5677_TDM1_CTRL1,2381	RT5677_IF1_ADC3_SWAP_SFT, rt5677_if12_adc_swap_src);2382 2383static const struct snd_kcontrol_new rt5677_if1_adc3_swap_mux =2384	SOC_DAPM_ENUM("IF1 ADC3 Swap Source", rt5677_if1_adc3_swap_enum);2385 2386static SOC_ENUM_SINGLE_DECL(2387	rt5677_if1_adc4_swap_enum, RT5677_TDM1_CTRL1,2388	RT5677_IF1_ADC4_SWAP_SFT, rt5677_if12_adc_swap_src);2389 2390static const struct snd_kcontrol_new rt5677_if1_adc4_swap_mux =2391	SOC_DAPM_ENUM("IF1 ADC4 Swap Source", rt5677_if1_adc4_swap_enum);2392 2393static SOC_ENUM_SINGLE_DECL(2394	rt5677_if2_adc1_swap_enum, RT5677_TDM2_CTRL1,2395	RT5677_IF1_ADC2_SWAP_SFT, rt5677_if12_adc_swap_src);2396 2397static const struct snd_kcontrol_new rt5677_if2_adc1_swap_mux =2398	SOC_DAPM_ENUM("IF1 ADC2 Swap Source", rt5677_if2_adc1_swap_enum);2399 2400static SOC_ENUM_SINGLE_DECL(2401	rt5677_if2_adc2_swap_enum, RT5677_TDM2_CTRL1,2402	RT5677_IF2_ADC2_SWAP_SFT, rt5677_if12_adc_swap_src);2403 2404static const struct snd_kcontrol_new rt5677_if2_adc2_swap_mux =2405	SOC_DAPM_ENUM("IF2 ADC2 Swap Source", rt5677_if2_adc2_swap_enum);2406 2407static SOC_ENUM_SINGLE_DECL(2408	rt5677_if2_adc3_swap_enum, RT5677_TDM2_CTRL1,2409	RT5677_IF2_ADC3_SWAP_SFT, rt5677_if12_adc_swap_src);2410 2411static const struct snd_kcontrol_new rt5677_if2_adc3_swap_mux =2412	SOC_DAPM_ENUM("IF2 ADC3 Swap Source", rt5677_if2_adc3_swap_enum);2413 2414static SOC_ENUM_SINGLE_DECL(2415	rt5677_if2_adc4_swap_enum, RT5677_TDM2_CTRL1,2416	RT5677_IF2_ADC4_SWAP_SFT, rt5677_if12_adc_swap_src);2417 2418static const struct snd_kcontrol_new rt5677_if2_adc4_swap_mux =2419	SOC_DAPM_ENUM("IF2 ADC4 Swap Source", rt5677_if2_adc4_swap_enum);2420 2421/* TDM IF1 ADC Data Selection */ /* MX-3C [2:0] */2422static const char * const rt5677_if1_adc_tdm_swap_src[] = {2423	"1/2/3/4", "2/1/3/4", "2/3/1/4", "4/1/2/3", "1/3/2/4", "1/4/2/3",2424	"3/1/2/4", "3/4/1/2"2425};2426 2427static SOC_ENUM_SINGLE_DECL(2428	rt5677_if1_adc_tdm_swap_enum, RT5677_TDM1_CTRL2,2429	RT5677_IF1_ADC_CTRL_SFT, rt5677_if1_adc_tdm_swap_src);2430 2431static const struct snd_kcontrol_new rt5677_if1_adc_tdm_swap_mux =2432	SOC_DAPM_ENUM("IF1 ADC TDM Swap Source", rt5677_if1_adc_tdm_swap_enum);2433 2434/* TDM IF2 ADC Data Selection */ /* MX-41[2:0] */2435static const char * const rt5677_if2_adc_tdm_swap_src[] = {2436	"1/2/3/4", "2/1/3/4", "3/1/2/4", "4/1/2/3", "1/3/2/4", "1/4/2/3",2437	"2/3/1/4", "3/4/1/2"2438};2439 2440static SOC_ENUM_SINGLE_DECL(2441	rt5677_if2_adc_tdm_swap_enum, RT5677_TDM2_CTRL2,2442	RT5677_IF2_ADC_CTRL_SFT, rt5677_if2_adc_tdm_swap_src);2443 2444static const struct snd_kcontrol_new rt5677_if2_adc_tdm_swap_mux =2445	SOC_DAPM_ENUM("IF2 ADC TDM Swap Source", rt5677_if2_adc_tdm_swap_enum);2446 2447/* TDM IF1/2 DAC Data Selection */ /* MX-3E[14:12][10:8][6:4][2:0]2448					MX-3F[14:12][10:8][6:4][2:0]2449					MX-43[14:12][10:8][6:4][2:0]2450					MX-44[14:12][10:8][6:4][2:0] */2451static const char * const rt5677_if12_dac_tdm_sel_src[] = {2452	"Slot0", "Slot1", "Slot2", "Slot3", "Slot4", "Slot5", "Slot6", "Slot7"2453};2454 2455static SOC_ENUM_SINGLE_DECL(2456	rt5677_if1_dac0_tdm_sel_enum, RT5677_TDM1_CTRL4,2457	RT5677_IF1_DAC0_SFT, rt5677_if12_dac_tdm_sel_src);2458 2459static const struct snd_kcontrol_new rt5677_if1_dac0_tdm_sel_mux =2460	SOC_DAPM_ENUM("IF1 DAC0 TDM Source", rt5677_if1_dac0_tdm_sel_enum);2461 2462static SOC_ENUM_SINGLE_DECL(2463	rt5677_if1_dac1_tdm_sel_enum, RT5677_TDM1_CTRL4,2464	RT5677_IF1_DAC1_SFT, rt5677_if12_dac_tdm_sel_src);2465 2466static const struct snd_kcontrol_new rt5677_if1_dac1_tdm_sel_mux =2467	SOC_DAPM_ENUM("IF1 DAC1 TDM Source", rt5677_if1_dac1_tdm_sel_enum);2468 2469static SOC_ENUM_SINGLE_DECL(2470	rt5677_if1_dac2_tdm_sel_enum, RT5677_TDM1_CTRL4,2471	RT5677_IF1_DAC2_SFT, rt5677_if12_dac_tdm_sel_src);2472 2473static const struct snd_kcontrol_new rt5677_if1_dac2_tdm_sel_mux =2474	SOC_DAPM_ENUM("IF1 DAC2 TDM Source", rt5677_if1_dac2_tdm_sel_enum);2475 2476static SOC_ENUM_SINGLE_DECL(2477	rt5677_if1_dac3_tdm_sel_enum, RT5677_TDM1_CTRL4,2478	RT5677_IF1_DAC3_SFT, rt5677_if12_dac_tdm_sel_src);2479 2480static const struct snd_kcontrol_new rt5677_if1_dac3_tdm_sel_mux =2481	SOC_DAPM_ENUM("IF1 DAC3 TDM Source", rt5677_if1_dac3_tdm_sel_enum);2482 2483static SOC_ENUM_SINGLE_DECL(2484	rt5677_if1_dac4_tdm_sel_enum, RT5677_TDM1_CTRL5,2485	RT5677_IF1_DAC4_SFT, rt5677_if12_dac_tdm_sel_src);2486 2487static const struct snd_kcontrol_new rt5677_if1_dac4_tdm_sel_mux =2488	SOC_DAPM_ENUM("IF1 DAC4 TDM Source", rt5677_if1_dac4_tdm_sel_enum);2489 2490static SOC_ENUM_SINGLE_DECL(2491	rt5677_if1_dac5_tdm_sel_enum, RT5677_TDM1_CTRL5,2492	RT5677_IF1_DAC5_SFT, rt5677_if12_dac_tdm_sel_src);2493 2494static const struct snd_kcontrol_new rt5677_if1_dac5_tdm_sel_mux =2495	SOC_DAPM_ENUM("IF1 DAC5 TDM Source", rt5677_if1_dac5_tdm_sel_enum);2496 2497static SOC_ENUM_SINGLE_DECL(2498	rt5677_if1_dac6_tdm_sel_enum, RT5677_TDM1_CTRL5,2499	RT5677_IF1_DAC6_SFT, rt5677_if12_dac_tdm_sel_src);2500 2501static const struct snd_kcontrol_new rt5677_if1_dac6_tdm_sel_mux =2502	SOC_DAPM_ENUM("IF1 DAC6 TDM Source", rt5677_if1_dac6_tdm_sel_enum);2503 2504static SOC_ENUM_SINGLE_DECL(2505	rt5677_if1_dac7_tdm_sel_enum, RT5677_TDM1_CTRL5,2506	RT5677_IF1_DAC7_SFT, rt5677_if12_dac_tdm_sel_src);2507 2508static const struct snd_kcontrol_new rt5677_if1_dac7_tdm_sel_mux =2509	SOC_DAPM_ENUM("IF1 DAC7 TDM Source", rt5677_if1_dac7_tdm_sel_enum);2510 2511static SOC_ENUM_SINGLE_DECL(2512	rt5677_if2_dac0_tdm_sel_enum, RT5677_TDM2_CTRL4,2513	RT5677_IF2_DAC0_SFT, rt5677_if12_dac_tdm_sel_src);2514 2515static const struct snd_kcontrol_new rt5677_if2_dac0_tdm_sel_mux =2516	SOC_DAPM_ENUM("IF2 DAC0 TDM Source", rt5677_if2_dac0_tdm_sel_enum);2517 2518static SOC_ENUM_SINGLE_DECL(2519	rt5677_if2_dac1_tdm_sel_enum, RT5677_TDM2_CTRL4,2520	RT5677_IF2_DAC1_SFT, rt5677_if12_dac_tdm_sel_src);2521 2522static const struct snd_kcontrol_new rt5677_if2_dac1_tdm_sel_mux =2523	SOC_DAPM_ENUM("IF2 DAC1 TDM Source", rt5677_if2_dac1_tdm_sel_enum);2524 2525static SOC_ENUM_SINGLE_DECL(2526	rt5677_if2_dac2_tdm_sel_enum, RT5677_TDM2_CTRL4,2527	RT5677_IF2_DAC2_SFT, rt5677_if12_dac_tdm_sel_src);2528 2529static const struct snd_kcontrol_new rt5677_if2_dac2_tdm_sel_mux =2530	SOC_DAPM_ENUM("IF2 DAC2 TDM Source", rt5677_if2_dac2_tdm_sel_enum);2531 2532static SOC_ENUM_SINGLE_DECL(2533	rt5677_if2_dac3_tdm_sel_enum, RT5677_TDM2_CTRL4,2534	RT5677_IF2_DAC3_SFT, rt5677_if12_dac_tdm_sel_src);2535 2536static const struct snd_kcontrol_new rt5677_if2_dac3_tdm_sel_mux =2537	SOC_DAPM_ENUM("IF2 DAC3 TDM Source", rt5677_if2_dac3_tdm_sel_enum);2538 2539static SOC_ENUM_SINGLE_DECL(2540	rt5677_if2_dac4_tdm_sel_enum, RT5677_TDM2_CTRL5,2541	RT5677_IF2_DAC4_SFT, rt5677_if12_dac_tdm_sel_src);2542 2543static const struct snd_kcontrol_new rt5677_if2_dac4_tdm_sel_mux =2544	SOC_DAPM_ENUM("IF2 DAC4 TDM Source", rt5677_if2_dac4_tdm_sel_enum);2545 2546static SOC_ENUM_SINGLE_DECL(2547	rt5677_if2_dac5_tdm_sel_enum, RT5677_TDM2_CTRL5,2548	RT5677_IF2_DAC5_SFT, rt5677_if12_dac_tdm_sel_src);2549 2550static const struct snd_kcontrol_new rt5677_if2_dac5_tdm_sel_mux =2551	SOC_DAPM_ENUM("IF2 DAC5 TDM Source", rt5677_if2_dac5_tdm_sel_enum);2552 2553static SOC_ENUM_SINGLE_DECL(2554	rt5677_if2_dac6_tdm_sel_enum, RT5677_TDM2_CTRL5,2555	RT5677_IF2_DAC6_SFT, rt5677_if12_dac_tdm_sel_src);2556 2557static const struct snd_kcontrol_new rt5677_if2_dac6_tdm_sel_mux =2558	SOC_DAPM_ENUM("IF2 DAC6 TDM Source", rt5677_if2_dac6_tdm_sel_enum);2559 2560static SOC_ENUM_SINGLE_DECL(2561	rt5677_if2_dac7_tdm_sel_enum, RT5677_TDM2_CTRL5,2562	RT5677_IF2_DAC7_SFT, rt5677_if12_dac_tdm_sel_src);2563 2564static const struct snd_kcontrol_new rt5677_if2_dac7_tdm_sel_mux =2565	SOC_DAPM_ENUM("IF2 DAC7 TDM Source", rt5677_if2_dac7_tdm_sel_enum);2566 2567static int rt5677_bst1_event(struct snd_soc_dapm_widget *w,2568	struct snd_kcontrol *kcontrol, int event)2569{2570	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);2571	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);2572 2573	switch (event) {2574	case SND_SOC_DAPM_POST_PMU:2575		regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,2576			RT5677_PWR_BST1_P, RT5677_PWR_BST1_P);2577		break;2578 2579	case SND_SOC_DAPM_PRE_PMD:2580		regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,2581			RT5677_PWR_BST1_P, 0);2582		break;2583 2584	default:2585		return 0;2586	}2587 2588	return 0;2589}2590 2591static int rt5677_bst2_event(struct snd_soc_dapm_widget *w,2592	struct snd_kcontrol *kcontrol, int event)2593{2594	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);2595	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);2596 2597	switch (event) {2598	case SND_SOC_DAPM_POST_PMU:2599		regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,2600			RT5677_PWR_BST2_P, RT5677_PWR_BST2_P);2601		break;2602 2603	case SND_SOC_DAPM_PRE_PMD:2604		regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,2605			RT5677_PWR_BST2_P, 0);2606		break;2607 2608	default:2609		return 0;2610	}2611 2612	return 0;2613}2614 2615static int rt5677_set_pll1_event(struct snd_soc_dapm_widget *w,2616	struct snd_kcontrol *kcontrol, int event)2617{2618	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);2619	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);2620 2621	switch (event) {2622	case SND_SOC_DAPM_PRE_PMU:2623		regmap_update_bits(rt5677->regmap, RT5677_PLL1_CTRL2, 0x2, 0x2);2624		break;2625 2626	case SND_SOC_DAPM_POST_PMU:2627		regmap_update_bits(rt5677->regmap, RT5677_PLL1_CTRL2, 0x2, 0x0);2628		break;2629 2630	default:2631		return 0;2632	}2633 2634	return 0;2635}2636 2637static int rt5677_set_pll2_event(struct snd_soc_dapm_widget *w,2638	struct snd_kcontrol *kcontrol, int event)2639{2640	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);2641	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);2642 2643	switch (event) {2644	case SND_SOC_DAPM_PRE_PMU:2645		regmap_update_bits(rt5677->regmap, RT5677_PLL2_CTRL2, 0x2, 0x2);2646		break;2647 2648	case SND_SOC_DAPM_POST_PMU:2649		regmap_update_bits(rt5677->regmap, RT5677_PLL2_CTRL2, 0x2, 0x0);2650		break;2651 2652	default:2653		return 0;2654	}2655 2656	return 0;2657}2658 2659static int rt5677_set_micbias1_event(struct snd_soc_dapm_widget *w,2660	struct snd_kcontrol *kcontrol, int event)2661{2662	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);2663	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);2664 2665	switch (event) {2666	case SND_SOC_DAPM_POST_PMU:2667		regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,2668			RT5677_PWR_CLK_MB1 | RT5677_PWR_PP_MB1 |2669			RT5677_PWR_CLK_MB, RT5677_PWR_CLK_MB1 |2670			RT5677_PWR_PP_MB1 | RT5677_PWR_CLK_MB);2671		break;2672 2673	case SND_SOC_DAPM_PRE_PMD:2674		regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,2675			RT5677_PWR_CLK_MB1 | RT5677_PWR_PP_MB1 |2676			RT5677_PWR_CLK_MB, 0);2677		break;2678 2679	default:2680		return 0;2681	}2682 2683	return 0;2684}2685 2686static int rt5677_if1_adc_tdm_event(struct snd_soc_dapm_widget *w,2687	struct snd_kcontrol *kcontrol, int event)2688{2689	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);2690	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);2691	unsigned int value;2692 2693	switch (event) {2694	case SND_SOC_DAPM_PRE_PMU:2695		regmap_read(rt5677->regmap, RT5677_TDM1_CTRL2, &value);2696		if (value & RT5677_IF1_ADC_CTRL_MASK)2697			regmap_update_bits(rt5677->regmap, RT5677_TDM1_CTRL1,2698				RT5677_IF1_ADC_MODE_MASK,2699				RT5677_IF1_ADC_MODE_TDM);2700		break;2701 2702	default:2703		return 0;2704	}2705 2706	return 0;2707}2708 2709static int rt5677_if2_adc_tdm_event(struct snd_soc_dapm_widget *w,2710	struct snd_kcontrol *kcontrol, int event)2711{2712	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);2713	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);2714	unsigned int value;2715 2716	switch (event) {2717	case SND_SOC_DAPM_PRE_PMU:2718		regmap_read(rt5677->regmap, RT5677_TDM2_CTRL2, &value);2719		if (value & RT5677_IF2_ADC_CTRL_MASK)2720			regmap_update_bits(rt5677->regmap, RT5677_TDM2_CTRL1,2721				RT5677_IF2_ADC_MODE_MASK,2722				RT5677_IF2_ADC_MODE_TDM);2723		break;2724 2725	default:2726		return 0;2727	}2728 2729	return 0;2730}2731 2732static int rt5677_vref_event(struct snd_soc_dapm_widget *w,2733	struct snd_kcontrol *kcontrol, int event)2734{2735	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);2736	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);2737 2738	switch (event) {2739	case SND_SOC_DAPM_POST_PMU:2740		if (snd_soc_component_get_bias_level(component) != SND_SOC_BIAS_ON &&2741			!rt5677->is_vref_slow) {2742			mdelay(20);2743			regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG1,2744				RT5677_PWR_FV1 | RT5677_PWR_FV2,2745				RT5677_PWR_FV1 | RT5677_PWR_FV2);2746			rt5677->is_vref_slow = true;2747		}2748		break;2749 2750	default:2751		return 0;2752	}2753 2754	return 0;2755}2756 2757static int rt5677_filter_power_event(struct snd_soc_dapm_widget *w,2758	struct snd_kcontrol *kcontrol, int event)2759{2760	switch (event) {2761	case SND_SOC_DAPM_POST_PMU:2762		msleep(50);2763		break;2764 2765	default:2766		return 0;2767	}2768 2769	return 0;2770}2771 2772static const struct snd_soc_dapm_widget rt5677_dapm_widgets[] = {2773	SND_SOC_DAPM_SUPPLY("PLL1", RT5677_PWR_ANLG2, RT5677_PWR_PLL1_BIT,2774		0, rt5677_set_pll1_event, SND_SOC_DAPM_PRE_PMU |2775		SND_SOC_DAPM_POST_PMU),2776	SND_SOC_DAPM_SUPPLY("PLL2", RT5677_PWR_ANLG2, RT5677_PWR_PLL2_BIT,2777		0, rt5677_set_pll2_event, SND_SOC_DAPM_PRE_PMU |2778		SND_SOC_DAPM_POST_PMU),2779 2780	/* ASRC */2781	SND_SOC_DAPM_SUPPLY_S("I2S1 ASRC", 1, RT5677_ASRC_1, 0, 0, NULL, 0),2782	SND_SOC_DAPM_SUPPLY_S("I2S2 ASRC", 1, RT5677_ASRC_1, 1, 0, NULL, 0),2783	SND_SOC_DAPM_SUPPLY_S("I2S3 ASRC", 1, RT5677_ASRC_1, 2, 0, NULL, 0),2784	SND_SOC_DAPM_SUPPLY_S("I2S4 ASRC", 1, RT5677_ASRC_1, 3, 0, NULL, 0),2785	SND_SOC_DAPM_SUPPLY_S("DAC STO ASRC", 1, RT5677_ASRC_2, 14, 0,2786		rt5677_filter_power_event, SND_SOC_DAPM_POST_PMU),2787	SND_SOC_DAPM_SUPPLY_S("DAC MONO2 L ASRC", 1, RT5677_ASRC_2, 13, 0, NULL,2788		0),2789	SND_SOC_DAPM_SUPPLY_S("DAC MONO2 R ASRC", 1, RT5677_ASRC_2, 12, 0, NULL,2790		0),2791	SND_SOC_DAPM_SUPPLY_S("DAC MONO3 L ASRC", 1, RT5677_ASRC_1, 15, 0, NULL,2792		0),2793	SND_SOC_DAPM_SUPPLY_S("DAC MONO3 R ASRC", 1, RT5677_ASRC_1, 14, 0, NULL,2794		0),2795	SND_SOC_DAPM_SUPPLY_S("DAC MONO4 L ASRC", 1, RT5677_ASRC_1, 13, 0, NULL,2796		0),2797	SND_SOC_DAPM_SUPPLY_S("DAC MONO4 R ASRC", 1, RT5677_ASRC_1, 12, 0, NULL,2798		0),2799	SND_SOC_DAPM_SUPPLY_S("DMIC STO1 ASRC", 1, RT5677_ASRC_2, 11, 0, NULL,2800		0),2801	SND_SOC_DAPM_SUPPLY_S("DMIC STO2 ASRC", 1, RT5677_ASRC_2, 10, 0, NULL,2802		0),2803	SND_SOC_DAPM_SUPPLY_S("DMIC STO3 ASRC", 1, RT5677_ASRC_2, 9, 0, NULL,2804		0),2805	SND_SOC_DAPM_SUPPLY_S("DMIC STO4 ASRC", 1, RT5677_ASRC_2, 8, 0, NULL,2806		0),2807	SND_SOC_DAPM_SUPPLY_S("DMIC MONO L ASRC", 1, RT5677_ASRC_2, 7, 0, NULL,2808		0),2809	SND_SOC_DAPM_SUPPLY_S("DMIC MONO R ASRC", 1, RT5677_ASRC_2, 6, 0, NULL,2810		0),2811	SND_SOC_DAPM_SUPPLY_S("ADC STO1 ASRC", 1, RT5677_ASRC_2, 5, 0, NULL, 0),2812	SND_SOC_DAPM_SUPPLY_S("ADC STO2 ASRC", 1, RT5677_ASRC_2, 4, 0, NULL, 0),2813	SND_SOC_DAPM_SUPPLY_S("ADC STO3 ASRC", 1, RT5677_ASRC_2, 3, 0, NULL, 0),2814	SND_SOC_DAPM_SUPPLY_S("ADC STO4 ASRC", 1, RT5677_ASRC_2, 2, 0, NULL, 0),2815	SND_SOC_DAPM_SUPPLY_S("ADC MONO L ASRC", 1, RT5677_ASRC_2, 1, 0, NULL,2816		0),2817	SND_SOC_DAPM_SUPPLY_S("ADC MONO R ASRC", 1, RT5677_ASRC_2, 0, 0, NULL,2818		0),2819 2820	/* Input Side */2821	/* micbias */2822	SND_SOC_DAPM_SUPPLY("MICBIAS1", RT5677_PWR_ANLG2, RT5677_PWR_MB1_BIT,2823		0, rt5677_set_micbias1_event, SND_SOC_DAPM_PRE_PMD |2824		SND_SOC_DAPM_POST_PMU),2825 2826	/* Input Lines */2827	SND_SOC_DAPM_INPUT("DMIC L1"),2828	SND_SOC_DAPM_INPUT("DMIC R1"),2829	SND_SOC_DAPM_INPUT("DMIC L2"),2830	SND_SOC_DAPM_INPUT("DMIC R2"),2831	SND_SOC_DAPM_INPUT("DMIC L3"),2832	SND_SOC_DAPM_INPUT("DMIC R3"),2833	SND_SOC_DAPM_INPUT("DMIC L4"),2834	SND_SOC_DAPM_INPUT("DMIC R4"),2835 2836	SND_SOC_DAPM_INPUT("IN1P"),2837	SND_SOC_DAPM_INPUT("IN1N"),2838	SND_SOC_DAPM_INPUT("IN2P"),2839	SND_SOC_DAPM_INPUT("IN2N"),2840 2841	SND_SOC_DAPM_INPUT("Haptic Generator"),2842 2843	SND_SOC_DAPM_PGA("DMIC1", SND_SOC_NOPM, 0, 0, NULL, 0),2844	SND_SOC_DAPM_PGA("DMIC2", SND_SOC_NOPM, 0, 0, NULL, 0),2845	SND_SOC_DAPM_PGA("DMIC3", SND_SOC_NOPM, 0, 0, NULL, 0),2846	SND_SOC_DAPM_PGA("DMIC4", SND_SOC_NOPM, 0, 0, NULL, 0),2847 2848	SND_SOC_DAPM_SUPPLY("DMIC1 power", RT5677_DMIC_CTRL1,2849		RT5677_DMIC_1_EN_SFT, 0, NULL, 0),2850	SND_SOC_DAPM_SUPPLY("DMIC2 power", RT5677_DMIC_CTRL1,2851		RT5677_DMIC_2_EN_SFT, 0, NULL, 0),2852	SND_SOC_DAPM_SUPPLY("DMIC3 power", RT5677_DMIC_CTRL1,2853		RT5677_DMIC_3_EN_SFT, 0, NULL, 0),2854	SND_SOC_DAPM_SUPPLY("DMIC4 power", RT5677_DMIC_CTRL2,2855		RT5677_DMIC_4_EN_SFT, 0, NULL, 0),2856 2857	SND_SOC_DAPM_SUPPLY("DMIC CLK", SND_SOC_NOPM, 0, 0,2858		set_dmic_clk, SND_SOC_DAPM_PRE_PMU),2859 2860	/* Boost */2861	SND_SOC_DAPM_PGA_E("BST1", RT5677_PWR_ANLG2,2862		RT5677_PWR_BST1_BIT, 0, NULL, 0, rt5677_bst1_event,2863		SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),2864	SND_SOC_DAPM_PGA_E("BST2", RT5677_PWR_ANLG2,2865		RT5677_PWR_BST2_BIT, 0, NULL, 0, rt5677_bst2_event,2866		SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),2867 2868	/* ADCs */2869	SND_SOC_DAPM_ADC("ADC 1", NULL, SND_SOC_NOPM,2870		0, 0),2871	SND_SOC_DAPM_ADC("ADC 2", NULL, SND_SOC_NOPM,2872		0, 0),2873	SND_SOC_DAPM_PGA("ADC 1_2", SND_SOC_NOPM, 0, 0, NULL, 0),2874 2875	SND_SOC_DAPM_SUPPLY("ADC 1 power", RT5677_PWR_DIG1,2876		RT5677_PWR_ADC_L_BIT, 0, NULL, 0),2877	SND_SOC_DAPM_SUPPLY("ADC 2 power", RT5677_PWR_DIG1,2878		RT5677_PWR_ADC_R_BIT, 0, NULL, 0),2879	SND_SOC_DAPM_SUPPLY("ADC1 clock", RT5677_PWR_DIG1,2880		RT5677_PWR_ADCFED1_BIT, 0, NULL, 0),2881	SND_SOC_DAPM_SUPPLY("ADC2 clock", RT5677_PWR_DIG1,2882		RT5677_PWR_ADCFED2_BIT, 0, NULL, 0),2883 2884	/* ADC Mux */2885	SND_SOC_DAPM_MUX("Stereo1 DMIC Mux", SND_SOC_NOPM, 0, 0,2886				&rt5677_sto1_dmic_mux),2887	SND_SOC_DAPM_MUX("Stereo1 ADC1 Mux", SND_SOC_NOPM, 0, 0,2888				&rt5677_sto1_adc1_mux),2889	SND_SOC_DAPM_MUX("Stereo1 ADC2 Mux", SND_SOC_NOPM, 0, 0,2890				&rt5677_sto1_adc2_mux),2891	SND_SOC_DAPM_MUX("Stereo2 DMIC Mux", SND_SOC_NOPM, 0, 0,2892				&rt5677_sto2_dmic_mux),2893	SND_SOC_DAPM_MUX("Stereo2 ADC1 Mux", SND_SOC_NOPM, 0, 0,2894				&rt5677_sto2_adc1_mux),2895	SND_SOC_DAPM_MUX("Stereo2 ADC2 Mux", SND_SOC_NOPM, 0, 0,2896				&rt5677_sto2_adc2_mux),2897	SND_SOC_DAPM_MUX("Stereo2 ADC LR Mux", SND_SOC_NOPM, 0, 0,2898				&rt5677_sto2_adc_lr_mux),2899	SND_SOC_DAPM_MUX("Stereo3 DMIC Mux", SND_SOC_NOPM, 0, 0,2900				&rt5677_sto3_dmic_mux),2901	SND_SOC_DAPM_MUX("Stereo3 ADC1 Mux", SND_SOC_NOPM, 0, 0,2902				&rt5677_sto3_adc1_mux),2903	SND_SOC_DAPM_MUX("Stereo3 ADC2 Mux", SND_SOC_NOPM, 0, 0,2904				&rt5677_sto3_adc2_mux),2905	SND_SOC_DAPM_MUX("Stereo4 DMIC Mux", SND_SOC_NOPM, 0, 0,2906				&rt5677_sto4_dmic_mux),2907	SND_SOC_DAPM_MUX("Stereo4 ADC1 Mux", SND_SOC_NOPM, 0, 0,2908				&rt5677_sto4_adc1_mux),2909	SND_SOC_DAPM_MUX("Stereo4 ADC2 Mux", SND_SOC_NOPM, 0, 0,2910				&rt5677_sto4_adc2_mux),2911	SND_SOC_DAPM_MUX("Mono DMIC L Mux", SND_SOC_NOPM, 0, 0,2912				&rt5677_mono_dmic_l_mux),2913	SND_SOC_DAPM_MUX("Mono DMIC R Mux", SND_SOC_NOPM, 0, 0,2914				&rt5677_mono_dmic_r_mux),2915	SND_SOC_DAPM_MUX("Mono ADC2 L Mux", SND_SOC_NOPM, 0, 0,2916				&rt5677_mono_adc2_l_mux),2917	SND_SOC_DAPM_MUX("Mono ADC1 L Mux", SND_SOC_NOPM, 0, 0,2918				&rt5677_mono_adc1_l_mux),2919	SND_SOC_DAPM_MUX("Mono ADC1 R Mux", SND_SOC_NOPM, 0, 0,2920				&rt5677_mono_adc1_r_mux),2921	SND_SOC_DAPM_MUX("Mono ADC2 R Mux", SND_SOC_NOPM, 0, 0,2922				&rt5677_mono_adc2_r_mux),2923 2924	/* ADC Mixer */2925	SND_SOC_DAPM_SUPPLY("adc stereo1 filter", RT5677_PWR_DIG2,2926		RT5677_PWR_ADC_S1F_BIT, 0, NULL, 0),2927	SND_SOC_DAPM_SUPPLY("adc stereo2 filter", RT5677_PWR_DIG2,2928		RT5677_PWR_ADC_S2F_BIT, 0, NULL, 0),2929	SND_SOC_DAPM_SUPPLY("adc stereo3 filter", RT5677_PWR_DIG2,2930		RT5677_PWR_ADC_S3F_BIT, 0, NULL, 0),2931	SND_SOC_DAPM_SUPPLY("adc stereo4 filter", RT5677_PWR_DIG2,2932		RT5677_PWR_ADC_S4F_BIT, 0, NULL, 0),2933	SND_SOC_DAPM_MIXER("Sto1 ADC MIXL", SND_SOC_NOPM, 0, 0,2934		rt5677_sto1_adc_l_mix, ARRAY_SIZE(rt5677_sto1_adc_l_mix)),2935	SND_SOC_DAPM_MIXER("Sto1 ADC MIXR", SND_SOC_NOPM, 0, 0,2936		rt5677_sto1_adc_r_mix, ARRAY_SIZE(rt5677_sto1_adc_r_mix)),2937	SND_SOC_DAPM_MIXER("Sto2 ADC MIXL", SND_SOC_NOPM, 0, 0,2938		rt5677_sto2_adc_l_mix, ARRAY_SIZE(rt5677_sto2_adc_l_mix)),2939	SND_SOC_DAPM_MIXER("Sto2 ADC MIXR", SND_SOC_NOPM, 0, 0,2940		rt5677_sto2_adc_r_mix, ARRAY_SIZE(rt5677_sto2_adc_r_mix)),2941	SND_SOC_DAPM_MIXER("Sto3 ADC MIXL", SND_SOC_NOPM, 0, 0,2942		rt5677_sto3_adc_l_mix, ARRAY_SIZE(rt5677_sto3_adc_l_mix)),2943	SND_SOC_DAPM_MIXER("Sto3 ADC MIXR", SND_SOC_NOPM, 0, 0,2944		rt5677_sto3_adc_r_mix, ARRAY_SIZE(rt5677_sto3_adc_r_mix)),2945	SND_SOC_DAPM_MIXER("Sto4 ADC MIXL", SND_SOC_NOPM, 0, 0,2946		rt5677_sto4_adc_l_mix, ARRAY_SIZE(rt5677_sto4_adc_l_mix)),2947	SND_SOC_DAPM_MIXER("Sto4 ADC MIXR", SND_SOC_NOPM, 0, 0,2948		rt5677_sto4_adc_r_mix, ARRAY_SIZE(rt5677_sto4_adc_r_mix)),2949	SND_SOC_DAPM_SUPPLY("adc mono left filter", RT5677_PWR_DIG2,2950		RT5677_PWR_ADC_MF_L_BIT, 0, NULL, 0),2951	SND_SOC_DAPM_MIXER("Mono ADC MIXL", SND_SOC_NOPM, 0, 0,2952		rt5677_mono_adc_l_mix, ARRAY_SIZE(rt5677_mono_adc_l_mix)),2953	SND_SOC_DAPM_SUPPLY("adc mono right filter", RT5677_PWR_DIG2,2954		RT5677_PWR_ADC_MF_R_BIT, 0, NULL, 0),2955	SND_SOC_DAPM_MIXER("Mono ADC MIXR", SND_SOC_NOPM, 0, 0,2956		rt5677_mono_adc_r_mix, ARRAY_SIZE(rt5677_mono_adc_r_mix)),2957 2958	/* ADC PGA */2959	SND_SOC_DAPM_PGA("Stereo1 ADC MIXL", SND_SOC_NOPM, 0, 0, NULL, 0),2960	SND_SOC_DAPM_PGA("Stereo1 ADC MIXR", SND_SOC_NOPM, 0, 0, NULL, 0),2961	SND_SOC_DAPM_PGA("Stereo1 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),2962	SND_SOC_DAPM_PGA("Stereo2 ADC MIXL", SND_SOC_NOPM, 0, 0, NULL, 0),2963	SND_SOC_DAPM_PGA("Stereo2 ADC MIXR", SND_SOC_NOPM, 0, 0, NULL, 0),2964	SND_SOC_DAPM_PGA("Stereo2 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),2965	SND_SOC_DAPM_PGA("Stereo3 ADC MIXL", SND_SOC_NOPM, 0, 0, NULL, 0),2966	SND_SOC_DAPM_PGA("Stereo3 ADC MIXR", SND_SOC_NOPM, 0, 0, NULL, 0),2967	SND_SOC_DAPM_PGA("Stereo3 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),2968	SND_SOC_DAPM_PGA("Stereo4 ADC MIXL", SND_SOC_NOPM, 0, 0, NULL, 0),2969	SND_SOC_DAPM_PGA("Stereo4 ADC MIXR", SND_SOC_NOPM, 0, 0, NULL, 0),2970	SND_SOC_DAPM_PGA("Stereo4 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),2971	SND_SOC_DAPM_PGA("Sto2 ADC LR MIX", SND_SOC_NOPM, 0, 0, NULL, 0),2972	SND_SOC_DAPM_PGA("Mono ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),2973	SND_SOC_DAPM_PGA("IF1 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),2974	SND_SOC_DAPM_PGA("IF2 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),2975 2976	/* DSP */2977	SND_SOC_DAPM_MUX("IB9 Mux", SND_SOC_NOPM, 0, 0,2978			&rt5677_ib9_src_mux),2979	SND_SOC_DAPM_MUX("IB8 Mux", SND_SOC_NOPM, 0, 0,2980			&rt5677_ib8_src_mux),2981	SND_SOC_DAPM_MUX("IB7 Mux", SND_SOC_NOPM, 0, 0,2982			&rt5677_ib7_src_mux),2983	SND_SOC_DAPM_MUX("IB6 Mux", SND_SOC_NOPM, 0, 0,2984			&rt5677_ib6_src_mux),2985	SND_SOC_DAPM_MUX("IB45 Mux", SND_SOC_NOPM, 0, 0,2986			&rt5677_ib45_src_mux),2987	SND_SOC_DAPM_MUX("IB23 Mux", SND_SOC_NOPM, 0, 0,2988			&rt5677_ib23_src_mux),2989	SND_SOC_DAPM_MUX("IB01 Mux", SND_SOC_NOPM, 0, 0,2990			&rt5677_ib01_src_mux),2991	SND_SOC_DAPM_MUX("IB45 Bypass Mux", SND_SOC_NOPM, 0, 0,2992			&rt5677_ib45_bypass_src_mux),2993	SND_SOC_DAPM_MUX("IB23 Bypass Mux", SND_SOC_NOPM, 0, 0,2994			&rt5677_ib23_bypass_src_mux),2995	SND_SOC_DAPM_MUX("IB01 Bypass Mux", SND_SOC_NOPM, 0, 0,2996			&rt5677_ib01_bypass_src_mux),2997	SND_SOC_DAPM_MUX("OB23 Bypass Mux", SND_SOC_NOPM, 0, 0,2998			&rt5677_ob23_bypass_src_mux),2999	SND_SOC_DAPM_MUX("OB01 Bypass Mux", SND_SOC_NOPM, 0, 0,3000			&rt5677_ob01_bypass_src_mux),3001 3002	SND_SOC_DAPM_PGA("OB45", SND_SOC_NOPM, 0, 0, NULL, 0),3003	SND_SOC_DAPM_PGA("OB67", SND_SOC_NOPM, 0, 0, NULL, 0),3004 3005	SND_SOC_DAPM_PGA("OutBound2", SND_SOC_NOPM, 0, 0, NULL, 0),3006	SND_SOC_DAPM_PGA("OutBound3", SND_SOC_NOPM, 0, 0, NULL, 0),3007	SND_SOC_DAPM_PGA("OutBound4", SND_SOC_NOPM, 0, 0, NULL, 0),3008	SND_SOC_DAPM_PGA("OutBound5", SND_SOC_NOPM, 0, 0, NULL, 0),3009	SND_SOC_DAPM_PGA("OutBound6", SND_SOC_NOPM, 0, 0, NULL, 0),3010	SND_SOC_DAPM_PGA("OutBound7", SND_SOC_NOPM, 0, 0, NULL, 0),3011 3012	/* Digital Interface */3013	SND_SOC_DAPM_SUPPLY("I2S1", RT5677_PWR_DIG1,3014		RT5677_PWR_I2S1_BIT, 0, NULL, 0),3015	SND_SOC_DAPM_PGA("IF1 DAC0", SND_SOC_NOPM, 0, 0, NULL, 0),3016	SND_SOC_DAPM_PGA("IF1 DAC1", SND_SOC_NOPM, 0, 0, NULL, 0),3017	SND_SOC_DAPM_PGA("IF1 DAC2", SND_SOC_NOPM, 0, 0, NULL, 0),3018	SND_SOC_DAPM_PGA("IF1 DAC3", SND_SOC_NOPM, 0, 0, NULL, 0),3019	SND_SOC_DAPM_PGA("IF1 DAC4", SND_SOC_NOPM, 0, 0, NULL, 0),3020	SND_SOC_DAPM_PGA("IF1 DAC5", SND_SOC_NOPM, 0, 0, NULL, 0),3021	SND_SOC_DAPM_PGA("IF1 DAC6", SND_SOC_NOPM, 0, 0, NULL, 0),3022	SND_SOC_DAPM_PGA("IF1 DAC7", SND_SOC_NOPM, 0, 0, NULL, 0),3023	SND_SOC_DAPM_PGA("IF1 DAC01", SND_SOC_NOPM, 0, 0, NULL, 0),3024	SND_SOC_DAPM_PGA("IF1 DAC23", SND_SOC_NOPM, 0, 0, NULL, 0),3025	SND_SOC_DAPM_PGA("IF1 DAC45", SND_SOC_NOPM, 0, 0, NULL, 0),3026	SND_SOC_DAPM_PGA("IF1 DAC67", SND_SOC_NOPM, 0, 0, NULL, 0),3027	SND_SOC_DAPM_PGA("IF1 ADC1", SND_SOC_NOPM, 0, 0, NULL, 0),3028	SND_SOC_DAPM_PGA("IF1 ADC2", SND_SOC_NOPM, 0, 0, NULL, 0),3029	SND_SOC_DAPM_PGA("IF1 ADC3", SND_SOC_NOPM, 0, 0, NULL, 0),3030	SND_SOC_DAPM_PGA("IF1 ADC4", SND_SOC_NOPM, 0, 0, NULL, 0),3031 3032	SND_SOC_DAPM_SUPPLY("I2S2", RT5677_PWR_DIG1,3033		RT5677_PWR_I2S2_BIT, 0, NULL, 0),3034	SND_SOC_DAPM_PGA("IF2 DAC0", SND_SOC_NOPM, 0, 0, NULL, 0),3035	SND_SOC_DAPM_PGA("IF2 DAC1", SND_SOC_NOPM, 0, 0, NULL, 0),3036	SND_SOC_DAPM_PGA("IF2 DAC2", SND_SOC_NOPM, 0, 0, NULL, 0),3037	SND_SOC_DAPM_PGA("IF2 DAC3", SND_SOC_NOPM, 0, 0, NULL, 0),3038	SND_SOC_DAPM_PGA("IF2 DAC4", SND_SOC_NOPM, 0, 0, NULL, 0),3039	SND_SOC_DAPM_PGA("IF2 DAC5", SND_SOC_NOPM, 0, 0, NULL, 0),3040	SND_SOC_DAPM_PGA("IF2 DAC6", SND_SOC_NOPM, 0, 0, NULL, 0),3041	SND_SOC_DAPM_PGA("IF2 DAC7", SND_SOC_NOPM, 0, 0, NULL, 0),3042	SND_SOC_DAPM_PGA("IF2 DAC01", SND_SOC_NOPM, 0, 0, NULL, 0),3043	SND_SOC_DAPM_PGA("IF2 DAC23", SND_SOC_NOPM, 0, 0, NULL, 0),3044	SND_SOC_DAPM_PGA("IF2 DAC45", SND_SOC_NOPM, 0, 0, NULL, 0),3045	SND_SOC_DAPM_PGA("IF2 DAC67", SND_SOC_NOPM, 0, 0, NULL, 0),3046	SND_SOC_DAPM_PGA("IF2 ADC1", SND_SOC_NOPM, 0, 0, NULL, 0),3047	SND_SOC_DAPM_PGA("IF2 ADC2", SND_SOC_NOPM, 0, 0, NULL, 0),3048	SND_SOC_DAPM_PGA("IF2 ADC3", SND_SOC_NOPM, 0, 0, NULL, 0),3049	SND_SOC_DAPM_PGA("IF2 ADC4", SND_SOC_NOPM, 0, 0, NULL, 0),3050 3051	SND_SOC_DAPM_SUPPLY("I2S3", RT5677_PWR_DIG1,3052		RT5677_PWR_I2S3_BIT, 0, NULL, 0),3053	SND_SOC_DAPM_PGA("IF3 DAC", SND_SOC_NOPM, 0, 0, NULL, 0),3054	SND_SOC_DAPM_PGA("IF3 DAC L", SND_SOC_NOPM, 0, 0, NULL, 0),3055	SND_SOC_DAPM_PGA("IF3 DAC R", SND_SOC_NOPM, 0, 0, NULL, 0),3056	SND_SOC_DAPM_PGA("IF3 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),3057	SND_SOC_DAPM_PGA("IF3 ADC L", SND_SOC_NOPM, 0, 0, NULL, 0),3058	SND_SOC_DAPM_PGA("IF3 ADC R", SND_SOC_NOPM, 0, 0, NULL, 0),3059 3060	SND_SOC_DAPM_SUPPLY("I2S4", RT5677_PWR_DIG1,3061		RT5677_PWR_I2S4_BIT, 0, NULL, 0),3062	SND_SOC_DAPM_PGA("IF4 DAC", SND_SOC_NOPM, 0, 0, NULL, 0),3063	SND_SOC_DAPM_PGA("IF4 DAC L", SND_SOC_NOPM, 0, 0, NULL, 0),3064	SND_SOC_DAPM_PGA("IF4 DAC R", SND_SOC_NOPM, 0, 0, NULL, 0),3065	SND_SOC_DAPM_PGA("IF4 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),3066	SND_SOC_DAPM_PGA("IF4 ADC L", SND_SOC_NOPM, 0, 0, NULL, 0),3067	SND_SOC_DAPM_PGA("IF4 ADC R", SND_SOC_NOPM, 0, 0, NULL, 0),3068 3069	SND_SOC_DAPM_SUPPLY("SLB", RT5677_PWR_DIG1,3070		RT5677_PWR_SLB_BIT, 0, NULL, 0),3071	SND_SOC_DAPM_PGA("SLB DAC0", SND_SOC_NOPM, 0, 0, NULL, 0),3072	SND_SOC_DAPM_PGA("SLB DAC1", SND_SOC_NOPM, 0, 0, NULL, 0),3073	SND_SOC_DAPM_PGA("SLB DAC2", SND_SOC_NOPM, 0, 0, NULL, 0),3074	SND_SOC_DAPM_PGA("SLB DAC3", SND_SOC_NOPM, 0, 0, NULL, 0),3075	SND_SOC_DAPM_PGA("SLB DAC4", SND_SOC_NOPM, 0, 0, NULL, 0),3076	SND_SOC_DAPM_PGA("SLB DAC5", SND_SOC_NOPM, 0, 0, NULL, 0),3077	SND_SOC_DAPM_PGA("SLB DAC6", SND_SOC_NOPM, 0, 0, NULL, 0),3078	SND_SOC_DAPM_PGA("SLB DAC7", SND_SOC_NOPM, 0, 0, NULL, 0),3079	SND_SOC_DAPM_PGA("SLB DAC01", SND_SOC_NOPM, 0, 0, NULL, 0),3080	SND_SOC_DAPM_PGA("SLB DAC23", SND_SOC_NOPM, 0, 0, NULL, 0),3081	SND_SOC_DAPM_PGA("SLB DAC45", SND_SOC_NOPM, 0, 0, NULL, 0),3082	SND_SOC_DAPM_PGA("SLB DAC67", SND_SOC_NOPM, 0, 0, NULL, 0),3083	SND_SOC_DAPM_PGA("SLB ADC1", SND_SOC_NOPM, 0, 0, NULL, 0),3084	SND_SOC_DAPM_PGA("SLB ADC2", SND_SOC_NOPM, 0, 0, NULL, 0),3085	SND_SOC_DAPM_PGA("SLB ADC3", SND_SOC_NOPM, 0, 0, NULL, 0),3086	SND_SOC_DAPM_PGA("SLB ADC4", SND_SOC_NOPM, 0, 0, NULL, 0),3087 3088	/* Digital Interface Select */3089	SND_SOC_DAPM_MUX("IF1 ADC1 Mux", SND_SOC_NOPM, 0, 0,3090			&rt5677_if1_adc1_mux),3091	SND_SOC_DAPM_MUX("IF1 ADC2 Mux", SND_SOC_NOPM, 0, 0,3092			&rt5677_if1_adc2_mux),3093	SND_SOC_DAPM_MUX("IF1 ADC3 Mux", SND_SOC_NOPM, 0, 0,3094			&rt5677_if1_adc3_mux),3095	SND_SOC_DAPM_MUX("IF1 ADC4 Mux", SND_SOC_NOPM, 0, 0,3096			&rt5677_if1_adc4_mux),3097	SND_SOC_DAPM_MUX("IF1 ADC1 Swap Mux", SND_SOC_NOPM, 0, 0,3098			&rt5677_if1_adc1_swap_mux),3099	SND_SOC_DAPM_MUX("IF1 ADC2 Swap Mux", SND_SOC_NOPM, 0, 0,3100			&rt5677_if1_adc2_swap_mux),3101	SND_SOC_DAPM_MUX("IF1 ADC3 Swap Mux", SND_SOC_NOPM, 0, 0,3102			&rt5677_if1_adc3_swap_mux),3103	SND_SOC_DAPM_MUX("IF1 ADC4 Swap Mux", SND_SOC_NOPM, 0, 0,3104			&rt5677_if1_adc4_swap_mux),3105	SND_SOC_DAPM_MUX_E("IF1 ADC TDM Swap Mux", SND_SOC_NOPM, 0, 0,3106			&rt5677_if1_adc_tdm_swap_mux, rt5677_if1_adc_tdm_event,3107			SND_SOC_DAPM_PRE_PMU),3108	SND_SOC_DAPM_MUX("IF2 ADC1 Mux", SND_SOC_NOPM, 0, 0,3109			&rt5677_if2_adc1_mux),3110	SND_SOC_DAPM_MUX("IF2 ADC2 Mux", SND_SOC_NOPM, 0, 0,3111			&rt5677_if2_adc2_mux),3112	SND_SOC_DAPM_MUX("IF2 ADC3 Mux", SND_SOC_NOPM, 0, 0,3113			&rt5677_if2_adc3_mux),3114	SND_SOC_DAPM_MUX("IF2 ADC4 Mux", SND_SOC_NOPM, 0, 0,3115			&rt5677_if2_adc4_mux),3116	SND_SOC_DAPM_MUX("IF2 ADC1 Swap Mux", SND_SOC_NOPM, 0, 0,3117			&rt5677_if2_adc1_swap_mux),3118	SND_SOC_DAPM_MUX("IF2 ADC2 Swap Mux", SND_SOC_NOPM, 0, 0,3119			&rt5677_if2_adc2_swap_mux),3120	SND_SOC_DAPM_MUX("IF2 ADC3 Swap Mux", SND_SOC_NOPM, 0, 0,3121			&rt5677_if2_adc3_swap_mux),3122	SND_SOC_DAPM_MUX("IF2 ADC4 Swap Mux", SND_SOC_NOPM, 0, 0,3123			&rt5677_if2_adc4_swap_mux),3124	SND_SOC_DAPM_MUX_E("IF2 ADC TDM Swap Mux", SND_SOC_NOPM, 0, 0,3125			&rt5677_if2_adc_tdm_swap_mux, rt5677_if2_adc_tdm_event,3126			SND_SOC_DAPM_PRE_PMU),3127	SND_SOC_DAPM_MUX("IF3 ADC Mux", SND_SOC_NOPM, 0, 0,3128			&rt5677_if3_adc_mux),3129	SND_SOC_DAPM_MUX("IF4 ADC Mux", SND_SOC_NOPM, 0, 0,3130			&rt5677_if4_adc_mux),3131	SND_SOC_DAPM_MUX("SLB ADC1 Mux", SND_SOC_NOPM, 0, 0,3132			&rt5677_slb_adc1_mux),3133	SND_SOC_DAPM_MUX("SLB ADC2 Mux", SND_SOC_NOPM, 0, 0,3134			&rt5677_slb_adc2_mux),3135	SND_SOC_DAPM_MUX("SLB ADC3 Mux", SND_SOC_NOPM, 0, 0,3136			&rt5677_slb_adc3_mux),3137	SND_SOC_DAPM_MUX("SLB ADC4 Mux", SND_SOC_NOPM, 0, 0,3138			&rt5677_slb_adc4_mux),3139 3140	SND_SOC_DAPM_MUX("IF1 DAC0 Mux", SND_SOC_NOPM, 0, 0,3141			&rt5677_if1_dac0_tdm_sel_mux),3142	SND_SOC_DAPM_MUX("IF1 DAC1 Mux", SND_SOC_NOPM, 0, 0,3143			&rt5677_if1_dac1_tdm_sel_mux),3144	SND_SOC_DAPM_MUX("IF1 DAC2 Mux", SND_SOC_NOPM, 0, 0,3145			&rt5677_if1_dac2_tdm_sel_mux),3146	SND_SOC_DAPM_MUX("IF1 DAC3 Mux", SND_SOC_NOPM, 0, 0,3147			&rt5677_if1_dac3_tdm_sel_mux),3148	SND_SOC_DAPM_MUX("IF1 DAC4 Mux", SND_SOC_NOPM, 0, 0,3149			&rt5677_if1_dac4_tdm_sel_mux),3150	SND_SOC_DAPM_MUX("IF1 DAC5 Mux", SND_SOC_NOPM, 0, 0,3151			&rt5677_if1_dac5_tdm_sel_mux),3152	SND_SOC_DAPM_MUX("IF1 DAC6 Mux", SND_SOC_NOPM, 0, 0,3153			&rt5677_if1_dac6_tdm_sel_mux),3154	SND_SOC_DAPM_MUX("IF1 DAC7 Mux", SND_SOC_NOPM, 0, 0,3155			&rt5677_if1_dac7_tdm_sel_mux),3156 3157	SND_SOC_DAPM_MUX("IF2 DAC0 Mux", SND_SOC_NOPM, 0, 0,3158			&rt5677_if2_dac0_tdm_sel_mux),3159	SND_SOC_DAPM_MUX("IF2 DAC1 Mux", SND_SOC_NOPM, 0, 0,3160			&rt5677_if2_dac1_tdm_sel_mux),3161	SND_SOC_DAPM_MUX("IF2 DAC2 Mux", SND_SOC_NOPM, 0, 0,3162			&rt5677_if2_dac2_tdm_sel_mux),3163	SND_SOC_DAPM_MUX("IF2 DAC3 Mux", SND_SOC_NOPM, 0, 0,3164			&rt5677_if2_dac3_tdm_sel_mux),3165	SND_SOC_DAPM_MUX("IF2 DAC4 Mux", SND_SOC_NOPM, 0, 0,3166			&rt5677_if2_dac4_tdm_sel_mux),3167	SND_SOC_DAPM_MUX("IF2 DAC5 Mux", SND_SOC_NOPM, 0, 0,3168			&rt5677_if2_dac5_tdm_sel_mux),3169	SND_SOC_DAPM_MUX("IF2 DAC6 Mux", SND_SOC_NOPM, 0, 0,3170			&rt5677_if2_dac6_tdm_sel_mux),3171	SND_SOC_DAPM_MUX("IF2 DAC7 Mux", SND_SOC_NOPM, 0, 0,3172			&rt5677_if2_dac7_tdm_sel_mux),3173 3174	/* Audio Interface */3175	SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0),3176	SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0),3177	SND_SOC_DAPM_AIF_IN("AIF2RX", "AIF2 Playback", 0, SND_SOC_NOPM, 0, 0),3178	SND_SOC_DAPM_AIF_OUT("AIF2TX", "AIF2 Capture", 0, SND_SOC_NOPM, 0, 0),3179	SND_SOC_DAPM_AIF_IN("AIF3RX", "AIF3 Playback", 0, SND_SOC_NOPM, 0, 0),3180	SND_SOC_DAPM_AIF_OUT("AIF3TX", "AIF3 Capture", 0, SND_SOC_NOPM, 0, 0),3181	SND_SOC_DAPM_AIF_IN("AIF4RX", "AIF4 Playback", 0, SND_SOC_NOPM, 0, 0),3182	SND_SOC_DAPM_AIF_OUT("AIF4TX", "AIF4 Capture", 0, SND_SOC_NOPM, 0, 0),3183	SND_SOC_DAPM_AIF_IN("SLBRX", "SLIMBus Playback", 0, SND_SOC_NOPM, 0, 0),3184	SND_SOC_DAPM_AIF_OUT("SLBTX", "SLIMBus Capture", 0, SND_SOC_NOPM, 0, 0),3185	SND_SOC_DAPM_AIF_OUT("DSPTX", "DSP Buffer", 0, SND_SOC_NOPM, 0, 0),3186 3187	/* Sidetone Mux */3188	SND_SOC_DAPM_MUX("Sidetone Mux", SND_SOC_NOPM, 0, 0,3189			&rt5677_sidetone_mux),3190	SND_SOC_DAPM_SUPPLY("Sidetone Power", RT5677_SIDETONE_CTRL,3191		RT5677_ST_EN_SFT, 0, NULL, 0),3192 3193	/* VAD Mux*/3194	SND_SOC_DAPM_MUX("VAD ADC Mux", SND_SOC_NOPM, 0, 0,3195			&rt5677_vad_src_mux),3196 3197	/* Tensilica DSP */3198	SND_SOC_DAPM_PGA("Tensilica DSP", SND_SOC_NOPM, 0, 0, NULL, 0),3199	SND_SOC_DAPM_MIXER("OB01 MIX", SND_SOC_NOPM, 0, 0,3200		rt5677_ob_01_mix, ARRAY_SIZE(rt5677_ob_01_mix)),3201	SND_SOC_DAPM_MIXER("OB23 MIX", SND_SOC_NOPM, 0, 0,3202		rt5677_ob_23_mix, ARRAY_SIZE(rt5677_ob_23_mix)),3203	SND_SOC_DAPM_MIXER("OB4 MIX", SND_SOC_NOPM, 0, 0,3204		rt5677_ob_4_mix, ARRAY_SIZE(rt5677_ob_4_mix)),3205	SND_SOC_DAPM_MIXER("OB5 MIX", SND_SOC_NOPM, 0, 0,3206		rt5677_ob_5_mix, ARRAY_SIZE(rt5677_ob_5_mix)),3207	SND_SOC_DAPM_MIXER("OB6 MIX", SND_SOC_NOPM, 0, 0,3208		rt5677_ob_6_mix, ARRAY_SIZE(rt5677_ob_6_mix)),3209	SND_SOC_DAPM_MIXER("OB7 MIX", SND_SOC_NOPM, 0, 0,3210		rt5677_ob_7_mix, ARRAY_SIZE(rt5677_ob_7_mix)),3211 3212	/* Output Side */3213	/* DAC mixer before sound effect */3214	SND_SOC_DAPM_MIXER("DAC1 MIXL", SND_SOC_NOPM, 0, 0,3215		rt5677_dac_l_mix, ARRAY_SIZE(rt5677_dac_l_mix)),3216	SND_SOC_DAPM_MIXER("DAC1 MIXR", SND_SOC_NOPM, 0, 0,3217		rt5677_dac_r_mix, ARRAY_SIZE(rt5677_dac_r_mix)),3218	SND_SOC_DAPM_PGA("DAC1 FS", SND_SOC_NOPM, 0, 0, NULL, 0),3219 3220	/* DAC Mux */3221	SND_SOC_DAPM_MUX("DAC1 Mux", SND_SOC_NOPM, 0, 0,3222				&rt5677_dac1_mux),3223	SND_SOC_DAPM_MUX("ADDA1 Mux", SND_SOC_NOPM, 0, 0,3224				&rt5677_adda1_mux),3225	SND_SOC_DAPM_MUX("DAC12 SRC Mux", SND_SOC_NOPM, 0, 0,3226				&rt5677_dac12_mux),3227	SND_SOC_DAPM_MUX("DAC3 SRC Mux", SND_SOC_NOPM, 0, 0,3228				&rt5677_dac3_mux),3229 3230	/* DAC2 channel Mux */3231	SND_SOC_DAPM_MUX("DAC2 L Mux", SND_SOC_NOPM, 0, 0,3232				&rt5677_dac2_l_mux),3233	SND_SOC_DAPM_MUX("DAC2 R Mux", SND_SOC_NOPM, 0, 0,3234				&rt5677_dac2_r_mux),3235 3236	/* DAC3 channel Mux */3237	SND_SOC_DAPM_MUX("DAC3 L Mux", SND_SOC_NOPM, 0, 0,3238			&rt5677_dac3_l_mux),3239	SND_SOC_DAPM_MUX("DAC3 R Mux", SND_SOC_NOPM, 0, 0,3240			&rt5677_dac3_r_mux),3241 3242	/* DAC4 channel Mux */3243	SND_SOC_DAPM_MUX("DAC4 L Mux", SND_SOC_NOPM, 0, 0,3244			&rt5677_dac4_l_mux),3245	SND_SOC_DAPM_MUX("DAC4 R Mux", SND_SOC_NOPM, 0, 0,3246			&rt5677_dac4_r_mux),3247 3248	/* DAC Mixer */3249	SND_SOC_DAPM_SUPPLY("dac stereo1 filter", RT5677_PWR_DIG2,3250		RT5677_PWR_DAC_S1F_BIT, 0, rt5677_filter_power_event,3251		SND_SOC_DAPM_POST_PMU),3252	SND_SOC_DAPM_SUPPLY("dac mono2 left filter", RT5677_PWR_DIG2,3253		RT5677_PWR_DAC_M2F_L_BIT, 0, rt5677_filter_power_event,3254		SND_SOC_DAPM_POST_PMU),3255	SND_SOC_DAPM_SUPPLY("dac mono2 right filter", RT5677_PWR_DIG2,3256		RT5677_PWR_DAC_M2F_R_BIT, 0, rt5677_filter_power_event,3257		SND_SOC_DAPM_POST_PMU),3258	SND_SOC_DAPM_SUPPLY("dac mono3 left filter", RT5677_PWR_DIG2,3259		RT5677_PWR_DAC_M3F_L_BIT, 0, rt5677_filter_power_event,3260		SND_SOC_DAPM_POST_PMU),3261	SND_SOC_DAPM_SUPPLY("dac mono3 right filter", RT5677_PWR_DIG2,3262		RT5677_PWR_DAC_M3F_R_BIT, 0, rt5677_filter_power_event,3263		SND_SOC_DAPM_POST_PMU),3264	SND_SOC_DAPM_SUPPLY("dac mono4 left filter", RT5677_PWR_DIG2,3265		RT5677_PWR_DAC_M4F_L_BIT, 0, rt5677_filter_power_event,3266		SND_SOC_DAPM_POST_PMU),3267	SND_SOC_DAPM_SUPPLY("dac mono4 right filter", RT5677_PWR_DIG2,3268		RT5677_PWR_DAC_M4F_R_BIT, 0, rt5677_filter_power_event,3269		SND_SOC_DAPM_POST_PMU),3270 3271	SND_SOC_DAPM_MIXER("Stereo DAC MIXL", SND_SOC_NOPM, 0, 0,3272		rt5677_sto1_dac_l_mix, ARRAY_SIZE(rt5677_sto1_dac_l_mix)),3273	SND_SOC_DAPM_MIXER("Stereo DAC MIXR", SND_SOC_NOPM, 0, 0,3274		rt5677_sto1_dac_r_mix, ARRAY_SIZE(rt5677_sto1_dac_r_mix)),3275	SND_SOC_DAPM_MIXER("Mono DAC MIXL", SND_SOC_NOPM, 0, 0,3276		rt5677_mono_dac_l_mix, ARRAY_SIZE(rt5677_mono_dac_l_mix)),3277	SND_SOC_DAPM_MIXER("Mono DAC MIXR", SND_SOC_NOPM, 0, 0,3278		rt5677_mono_dac_r_mix, ARRAY_SIZE(rt5677_mono_dac_r_mix)),3279	SND_SOC_DAPM_MIXER("DD1 MIXL", SND_SOC_NOPM, 0, 0,3280		rt5677_dd1_l_mix, ARRAY_SIZE(rt5677_dd1_l_mix)),3281	SND_SOC_DAPM_MIXER("DD1 MIXR", SND_SOC_NOPM, 0, 0,3282		rt5677_dd1_r_mix, ARRAY_SIZE(rt5677_dd1_r_mix)),3283	SND_SOC_DAPM_MIXER("DD2 MIXL", SND_SOC_NOPM, 0, 0,3284		rt5677_dd2_l_mix, ARRAY_SIZE(rt5677_dd2_l_mix)),3285	SND_SOC_DAPM_MIXER("DD2 MIXR", SND_SOC_NOPM, 0, 0,3286		rt5677_dd2_r_mix, ARRAY_SIZE(rt5677_dd2_r_mix)),3287	SND_SOC_DAPM_PGA("Stereo DAC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),3288	SND_SOC_DAPM_PGA("Mono DAC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),3289	SND_SOC_DAPM_PGA("DD1 MIX", SND_SOC_NOPM, 0, 0, NULL, 0),3290	SND_SOC_DAPM_PGA("DD2 MIX", SND_SOC_NOPM, 0, 0, NULL, 0),3291 3292	/* DACs */3293	SND_SOC_DAPM_DAC("DAC 1", NULL, RT5677_PWR_DIG1,3294		RT5677_PWR_DAC1_BIT, 0),3295	SND_SOC_DAPM_DAC("DAC 2", NULL, RT5677_PWR_DIG1,3296		RT5677_PWR_DAC2_BIT, 0),3297	SND_SOC_DAPM_DAC("DAC 3", NULL, RT5677_PWR_DIG1,3298		RT5677_PWR_DAC3_BIT, 0),3299 3300	/* PDM */3301	SND_SOC_DAPM_SUPPLY("PDM1 Power", RT5677_PWR_DIG2,3302		RT5677_PWR_PDM1_BIT, 0, NULL, 0),3303	SND_SOC_DAPM_SUPPLY("PDM2 Power", RT5677_PWR_DIG2,3304		RT5677_PWR_PDM2_BIT, 0, NULL, 0),3305 3306	SND_SOC_DAPM_MUX("PDM1 L Mux", RT5677_PDM_OUT_CTRL, RT5677_M_PDM1_L_SFT,3307		1, &rt5677_pdm1_l_mux),3308	SND_SOC_DAPM_MUX("PDM1 R Mux", RT5677_PDM_OUT_CTRL, RT5677_M_PDM1_R_SFT,3309		1, &rt5677_pdm1_r_mux),3310	SND_SOC_DAPM_MUX("PDM2 L Mux", RT5677_PDM_OUT_CTRL, RT5677_M_PDM2_L_SFT,3311		1, &rt5677_pdm2_l_mux),3312	SND_SOC_DAPM_MUX("PDM2 R Mux", RT5677_PDM_OUT_CTRL, RT5677_M_PDM2_R_SFT,3313		1, &rt5677_pdm2_r_mux),3314 3315	SND_SOC_DAPM_PGA_S("LOUT1 amp", 0, RT5677_PWR_ANLG1, RT5677_PWR_LO1_BIT,3316		0, NULL, 0),3317	SND_SOC_DAPM_PGA_S("LOUT2 amp", 0, RT5677_PWR_ANLG1, RT5677_PWR_LO2_BIT,3318		0, NULL, 0),3319	SND_SOC_DAPM_PGA_S("LOUT3 amp", 0, RT5677_PWR_ANLG1, RT5677_PWR_LO3_BIT,3320		0, NULL, 0),3321 3322	SND_SOC_DAPM_PGA_S("LOUT1 vref", 1, SND_SOC_NOPM, 0, 0,3323		rt5677_vref_event, SND_SOC_DAPM_POST_PMU),3324	SND_SOC_DAPM_PGA_S("LOUT2 vref", 1, SND_SOC_NOPM, 0, 0,3325		rt5677_vref_event, SND_SOC_DAPM_POST_PMU),3326	SND_SOC_DAPM_PGA_S("LOUT3 vref", 1, SND_SOC_NOPM, 0, 0,3327		rt5677_vref_event, SND_SOC_DAPM_POST_PMU),3328 3329	/* Output Lines */3330	SND_SOC_DAPM_OUTPUT("LOUT1"),3331	SND_SOC_DAPM_OUTPUT("LOUT2"),3332	SND_SOC_DAPM_OUTPUT("LOUT3"),3333	SND_SOC_DAPM_OUTPUT("PDM1L"),3334	SND_SOC_DAPM_OUTPUT("PDM1R"),3335	SND_SOC_DAPM_OUTPUT("PDM2L"),3336	SND_SOC_DAPM_OUTPUT("PDM2R"),3337 3338	SND_SOC_DAPM_POST("vref", rt5677_vref_event),3339};3340 3341static const struct snd_soc_dapm_route rt5677_dapm_routes[] = {3342	{ "Stereo1 DMIC Mux", NULL, "DMIC STO1 ASRC", rt5677_dmic_use_asrc },3343	{ "Stereo2 DMIC Mux", NULL, "DMIC STO2 ASRC", rt5677_dmic_use_asrc },3344	{ "Stereo3 DMIC Mux", NULL, "DMIC STO3 ASRC", rt5677_dmic_use_asrc },3345	{ "Stereo4 DMIC Mux", NULL, "DMIC STO4 ASRC", rt5677_dmic_use_asrc },3346	{ "Mono DMIC L Mux", NULL, "DMIC MONO L ASRC", rt5677_dmic_use_asrc },3347	{ "Mono DMIC R Mux", NULL, "DMIC MONO R ASRC", rt5677_dmic_use_asrc },3348	{ "I2S1", NULL, "I2S1 ASRC", can_use_asrc},3349	{ "I2S2", NULL, "I2S2 ASRC", can_use_asrc},3350	{ "I2S3", NULL, "I2S3 ASRC", can_use_asrc},3351	{ "I2S4", NULL, "I2S4 ASRC", can_use_asrc},3352 3353	{ "dac stereo1 filter", NULL, "DAC STO ASRC", is_using_asrc },3354	{ "dac mono2 left filter", NULL, "DAC MONO2 L ASRC", is_using_asrc },3355	{ "dac mono2 right filter", NULL, "DAC MONO2 R ASRC", is_using_asrc },3356	{ "dac mono3 left filter", NULL, "DAC MONO3 L ASRC", is_using_asrc },3357	{ "dac mono3 right filter", NULL, "DAC MONO3 R ASRC", is_using_asrc },3358	{ "dac mono4 left filter", NULL, "DAC MONO4 L ASRC", is_using_asrc },3359	{ "dac mono4 right filter", NULL, "DAC MONO4 R ASRC", is_using_asrc },3360	{ "adc stereo1 filter", NULL, "ADC STO1 ASRC", is_using_asrc },3361	{ "adc stereo2 filter", NULL, "ADC STO2 ASRC", is_using_asrc },3362	{ "adc stereo3 filter", NULL, "ADC STO3 ASRC", is_using_asrc },3363	{ "adc stereo4 filter", NULL, "ADC STO4 ASRC", is_using_asrc },3364	{ "adc mono left filter", NULL, "ADC MONO L ASRC", is_using_asrc },3365	{ "adc mono right filter", NULL, "ADC MONO R ASRC", is_using_asrc },3366 3367	{ "DMIC1", NULL, "DMIC L1" },3368	{ "DMIC1", NULL, "DMIC R1" },3369	{ "DMIC2", NULL, "DMIC L2" },3370	{ "DMIC2", NULL, "DMIC R2" },3371	{ "DMIC3", NULL, "DMIC L3" },3372	{ "DMIC3", NULL, "DMIC R3" },3373	{ "DMIC4", NULL, "DMIC L4" },3374	{ "DMIC4", NULL, "DMIC R4" },3375 3376	{ "DMIC L1", NULL, "DMIC CLK" },3377	{ "DMIC R1", NULL, "DMIC CLK" },3378	{ "DMIC L2", NULL, "DMIC CLK" },3379	{ "DMIC R2", NULL, "DMIC CLK" },3380	{ "DMIC L3", NULL, "DMIC CLK" },3381	{ "DMIC R3", NULL, "DMIC CLK" },3382	{ "DMIC L4", NULL, "DMIC CLK" },3383	{ "DMIC R4", NULL, "DMIC CLK" },3384 3385	{ "DMIC L1", NULL, "DMIC1 power" },3386	{ "DMIC R1", NULL, "DMIC1 power" },3387	{ "DMIC L3", NULL, "DMIC3 power" },3388	{ "DMIC R3", NULL, "DMIC3 power" },3389	{ "DMIC L4", NULL, "DMIC4 power" },3390	{ "DMIC R4", NULL, "DMIC4 power" },3391 3392	{ "BST1", NULL, "IN1P" },3393	{ "BST1", NULL, "IN1N" },3394	{ "BST2", NULL, "IN2P" },3395	{ "BST2", NULL, "IN2N" },3396 3397	{ "IN1P", NULL, "MICBIAS1" },3398	{ "IN1N", NULL, "MICBIAS1" },3399	{ "IN2P", NULL, "MICBIAS1" },3400	{ "IN2N", NULL, "MICBIAS1" },3401 3402	{ "ADC 1", NULL, "BST1" },3403	{ "ADC 1", NULL, "ADC 1 power" },3404	{ "ADC 1", NULL, "ADC1 clock" },3405	{ "ADC 2", NULL, "BST2" },3406	{ "ADC 2", NULL, "ADC 2 power" },3407	{ "ADC 2", NULL, "ADC2 clock" },3408 3409	{ "Stereo1 DMIC Mux", "DMIC1", "DMIC1" },3410	{ "Stereo1 DMIC Mux", "DMIC2", "DMIC2" },3411	{ "Stereo1 DMIC Mux", "DMIC3", "DMIC3" },3412	{ "Stereo1 DMIC Mux", "DMIC4", "DMIC4" },3413 3414	{ "Stereo2 DMIC Mux", "DMIC1", "DMIC1" },3415	{ "Stereo2 DMIC Mux", "DMIC2", "DMIC2" },3416	{ "Stereo2 DMIC Mux", "DMIC3", "DMIC3" },3417	{ "Stereo2 DMIC Mux", "DMIC4", "DMIC4" },3418 3419	{ "Stereo3 DMIC Mux", "DMIC1", "DMIC1" },3420	{ "Stereo3 DMIC Mux", "DMIC2", "DMIC2" },3421	{ "Stereo3 DMIC Mux", "DMIC3", "DMIC3" },3422	{ "Stereo3 DMIC Mux", "DMIC4", "DMIC4" },3423 3424	{ "Stereo4 DMIC Mux", "DMIC1", "DMIC1" },3425	{ "Stereo4 DMIC Mux", "DMIC2", "DMIC2" },3426	{ "Stereo4 DMIC Mux", "DMIC3", "DMIC3" },3427	{ "Stereo4 DMIC Mux", "DMIC4", "DMIC4" },3428 3429	{ "Mono DMIC L Mux", "DMIC1", "DMIC1" },3430	{ "Mono DMIC L Mux", "DMIC2", "DMIC2" },3431	{ "Mono DMIC L Mux", "DMIC3", "DMIC3" },3432	{ "Mono DMIC L Mux", "DMIC4", "DMIC4" },3433 3434	{ "Mono DMIC R Mux", "DMIC1", "DMIC1" },3435	{ "Mono DMIC R Mux", "DMIC2", "DMIC2" },3436	{ "Mono DMIC R Mux", "DMIC3", "DMIC3" },3437	{ "Mono DMIC R Mux", "DMIC4", "DMIC4" },3438 3439	{ "ADC 1_2", NULL, "ADC 1" },3440	{ "ADC 1_2", NULL, "ADC 2" },3441 3442	{ "Stereo1 ADC1 Mux", "DD MIX1", "DD1 MIX" },3443	{ "Stereo1 ADC1 Mux", "ADC1/2", "ADC 1_2" },3444	{ "Stereo1 ADC1 Mux", "Stereo DAC MIX", "Stereo DAC MIX" },3445 3446	{ "Stereo1 ADC2 Mux", "DD MIX1", "DD1 MIX" },3447	{ "Stereo1 ADC2 Mux", "DMIC", "Stereo1 DMIC Mux" },3448	{ "Stereo1 ADC2 Mux", "Stereo DAC MIX", "Stereo DAC MIX" },3449 3450	{ "Stereo2 ADC1 Mux", "DD MIX1", "DD1 MIX" },3451	{ "Stereo2 ADC1 Mux", "ADC1/2", "ADC 1_2" },3452	{ "Stereo2 ADC1 Mux", "Stereo DAC MIX", "Stereo DAC MIX" },3453 3454	{ "Stereo2 ADC2 Mux", "DD MIX1", "DD1 MIX" },3455	{ "Stereo2 ADC2 Mux", "DMIC", "Stereo2 DMIC Mux" },3456	{ "Stereo2 ADC2 Mux", "Stereo DAC MIX", "Stereo DAC MIX" },3457 3458	{ "Stereo3 ADC1 Mux", "DD MIX1", "DD1 MIX" },3459	{ "Stereo3 ADC1 Mux", "ADC1/2", "ADC 1_2" },3460	{ "Stereo3 ADC1 Mux", "Stereo DAC MIX", "Stereo DAC MIX" },3461 3462	{ "Stereo3 ADC2 Mux", "DD MIX1", "DD1 MIX" },3463	{ "Stereo3 ADC2 Mux", "DMIC", "Stereo3 DMIC Mux" },3464	{ "Stereo3 ADC2 Mux", "Stereo DAC MIX", "Stereo DAC MIX" },3465 3466	{ "Stereo4 ADC1 Mux", "DD MIX1", "DD1 MIX" },3467	{ "Stereo4 ADC1 Mux", "ADC1/2", "ADC 1_2" },3468	{ "Stereo4 ADC1 Mux", "DD MIX2", "DD2 MIX" },3469 3470	{ "Stereo4 ADC2 Mux", "DD MIX1", "DD1 MIX" },3471	{ "Stereo4 ADC2 Mux", "DMIC", "Stereo3 DMIC Mux" },3472	{ "Stereo4 ADC2 Mux", "DD MIX2", "DD2 MIX" },3473 3474	{ "Mono ADC2 L Mux", "DD MIX1L", "DD1 MIXL" },3475	{ "Mono ADC2 L Mux", "DMIC", "Mono DMIC L Mux" },3476	{ "Mono ADC2 L Mux", "MONO DAC MIXL", "Mono DAC MIXL" },3477 3478	{ "Mono ADC1 L Mux", "DD MIX1L", "DD1 MIXL" },3479	{ "Mono ADC1 L Mux", "ADC1", "ADC 1" },3480	{ "Mono ADC1 L Mux", "MONO DAC MIXL", "Mono DAC MIXL" },3481 3482	{ "Mono ADC1 R Mux", "DD MIX1R", "DD1 MIXR" },3483	{ "Mono ADC1 R Mux", "ADC2", "ADC 2" },3484	{ "Mono ADC1 R Mux", "MONO DAC MIXR", "Mono DAC MIXR" },3485 3486	{ "Mono ADC2 R Mux", "DD MIX1R", "DD1 MIXR" },3487	{ "Mono ADC2 R Mux", "DMIC", "Mono DMIC R Mux" },3488	{ "Mono ADC2 R Mux", "MONO DAC MIXR", "Mono DAC MIXR" },3489 3490	{ "Sto1 ADC MIXL", "ADC1 Switch", "Stereo1 ADC1 Mux" },3491	{ "Sto1 ADC MIXL", "ADC2 Switch", "Stereo1 ADC2 Mux" },3492	{ "Sto1 ADC MIXR", "ADC1 Switch", "Stereo1 ADC1 Mux" },3493	{ "Sto1 ADC MIXR", "ADC2 Switch", "Stereo1 ADC2 Mux" },3494 3495	{ "Stereo1 ADC MIXL", NULL, "Sto1 ADC MIXL" },3496	{ "Stereo1 ADC MIXL", NULL, "adc stereo1 filter" },3497	{ "Stereo1 ADC MIXR", NULL, "Sto1 ADC MIXR" },3498	{ "Stereo1 ADC MIXR", NULL, "adc stereo1 filter" },3499	{ "adc stereo1 filter", NULL, "PLL1", is_sys_clk_from_pll },3500 3501	{ "Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXL" },3502	{ "Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXR" },3503 3504	{ "Sto2 ADC MIXL", "ADC1 Switch", "Stereo2 ADC1 Mux" },3505	{ "Sto2 ADC MIXL", "ADC2 Switch", "Stereo2 ADC2 Mux" },3506	{ "Sto2 ADC MIXR", "ADC1 Switch", "Stereo2 ADC1 Mux" },3507	{ "Sto2 ADC MIXR", "ADC2 Switch", "Stereo2 ADC2 Mux" },3508 3509	{ "Sto2 ADC LR MIX", NULL, "Sto2 ADC MIXL" },3510	{ "Sto2 ADC LR MIX", NULL, "Sto2 ADC MIXR" },3511 3512	{ "Stereo2 ADC LR Mux", "L", "Sto2 ADC MIXL" },3513	{ "Stereo2 ADC LR Mux", "LR", "Sto2 ADC LR MIX" },3514 3515	{ "Stereo2 ADC MIXL", NULL, "Stereo2 ADC LR Mux" },3516	{ "Stereo2 ADC MIXL", NULL, "adc stereo2 filter" },3517	{ "Stereo2 ADC MIXR", NULL, "Sto2 ADC MIXR" },3518	{ "Stereo2 ADC MIXR", NULL, "adc stereo2 filter" },3519	{ "adc stereo2 filter", NULL, "PLL1", is_sys_clk_from_pll },3520 3521	{ "Stereo2 ADC MIX", NULL, "Stereo2 ADC MIXL" },3522	{ "Stereo2 ADC MIX", NULL, "Stereo2 ADC MIXR" },3523 3524	{ "Sto3 ADC MIXL", "ADC1 Switch", "Stereo3 ADC1 Mux" },3525	{ "Sto3 ADC MIXL", "ADC2 Switch", "Stereo3 ADC2 Mux" },3526	{ "Sto3 ADC MIXR", "ADC1 Switch", "Stereo3 ADC1 Mux" },3527	{ "Sto3 ADC MIXR", "ADC2 Switch", "Stereo3 ADC2 Mux" },3528 3529	{ "Stereo3 ADC MIXL", NULL, "Sto3 ADC MIXL" },3530	{ "Stereo3 ADC MIXL", NULL, "adc stereo3 filter" },3531	{ "Stereo3 ADC MIXR", NULL, "Sto3 ADC MIXR" },3532	{ "Stereo3 ADC MIXR", NULL, "adc stereo3 filter" },3533	{ "adc stereo3 filter", NULL, "PLL1", is_sys_clk_from_pll },3534 3535	{ "Stereo3 ADC MIX", NULL, "Stereo3 ADC MIXL" },3536	{ "Stereo3 ADC MIX", NULL, "Stereo3 ADC MIXR" },3537 3538	{ "Sto4 ADC MIXL", "ADC1 Switch", "Stereo4 ADC1 Mux" },3539	{ "Sto4 ADC MIXL", "ADC2 Switch", "Stereo4 ADC2 Mux" },3540	{ "Sto4 ADC MIXR", "ADC1 Switch", "Stereo4 ADC1 Mux" },3541	{ "Sto4 ADC MIXR", "ADC2 Switch", "Stereo4 ADC2 Mux" },3542 3543	{ "Stereo4 ADC MIXL", NULL, "Sto4 ADC MIXL" },3544	{ "Stereo4 ADC MIXL", NULL, "adc stereo4 filter" },3545	{ "Stereo4 ADC MIXR", NULL, "Sto4 ADC MIXR" },3546	{ "Stereo4 ADC MIXR", NULL, "adc stereo4 filter" },3547	{ "adc stereo4 filter", NULL, "PLL1", is_sys_clk_from_pll },3548 3549	{ "Stereo4 ADC MIX", NULL, "Stereo4 ADC MIXL" },3550	{ "Stereo4 ADC MIX", NULL, "Stereo4 ADC MIXR" },3551 3552	{ "Mono ADC MIXL", "ADC1 Switch", "Mono ADC1 L Mux" },3553	{ "Mono ADC MIXL", "ADC2 Switch", "Mono ADC2 L Mux" },3554	{ "Mono ADC MIXL", NULL, "adc mono left filter" },3555	{ "adc mono left filter", NULL, "PLL1", is_sys_clk_from_pll },3556 3557	{ "Mono ADC MIXR", "ADC1 Switch", "Mono ADC1 R Mux" },3558	{ "Mono ADC MIXR", "ADC2 Switch", "Mono ADC2 R Mux" },3559	{ "Mono ADC MIXR", NULL, "adc mono right filter" },3560	{ "adc mono right filter", NULL, "PLL1", is_sys_clk_from_pll },3561 3562	{ "Mono ADC MIX", NULL, "Mono ADC MIXL" },3563	{ "Mono ADC MIX", NULL, "Mono ADC MIXR" },3564 3565	{ "VAD ADC Mux", "STO1 ADC MIX L", "Stereo1 ADC MIXL" },3566	{ "VAD ADC Mux", "MONO ADC MIX L", "Mono ADC MIXL" },3567	{ "VAD ADC Mux", "MONO ADC MIX R", "Mono ADC MIXR" },3568	{ "VAD ADC Mux", "STO2 ADC MIX L", "Stereo2 ADC MIXL" },3569	{ "VAD ADC Mux", "STO3 ADC MIX L", "Stereo3 ADC MIXL" },3570 3571	{ "IF1 ADC1 Mux", "STO1 ADC MIX", "Stereo1 ADC MIX" },3572	{ "IF1 ADC1 Mux", "OB01", "OB01 Bypass Mux" },3573	{ "IF1 ADC1 Mux", "VAD ADC", "VAD ADC Mux" },3574 3575	{ "IF1 ADC2 Mux", "STO2 ADC MIX", "Stereo2 ADC MIX" },3576	{ "IF1 ADC2 Mux", "OB23", "OB23 Bypass Mux" },3577 3578	{ "IF1 ADC3 Mux", "STO3 ADC MIX", "Stereo3 ADC MIX" },3579	{ "IF1 ADC3 Mux", "MONO ADC MIX", "Mono ADC MIX" },3580	{ "IF1 ADC3 Mux", "OB45", "OB45" },3581 3582	{ "IF1 ADC4 Mux", "STO4 ADC MIX", "Stereo4 ADC MIX" },3583	{ "IF1 ADC4 Mux", "OB67", "OB67" },3584	{ "IF1 ADC4 Mux", "OB01", "OB01 Bypass Mux" },3585 3586	{ "IF1 ADC1 Swap Mux", "L/R", "IF1 ADC1 Mux" },3587	{ "IF1 ADC1 Swap Mux", "R/L", "IF1 ADC1 Mux" },3588	{ "IF1 ADC1 Swap Mux", "L/L", "IF1 ADC1 Mux" },3589	{ "IF1 ADC1 Swap Mux", "R/R", "IF1 ADC1 Mux" },3590 3591	{ "IF1 ADC2 Swap Mux", "L/R", "IF1 ADC2 Mux" },3592	{ "IF1 ADC2 Swap Mux", "R/L", "IF1 ADC2 Mux" },3593	{ "IF1 ADC2 Swap Mux", "L/L", "IF1 ADC2 Mux" },3594	{ "IF1 ADC2 Swap Mux", "R/R", "IF1 ADC2 Mux" },3595 3596	{ "IF1 ADC3 Swap Mux", "L/R", "IF1 ADC3 Mux" },3597	{ "IF1 ADC3 Swap Mux", "R/L", "IF1 ADC3 Mux" },3598	{ "IF1 ADC3 Swap Mux", "L/L", "IF1 ADC3 Mux" },3599	{ "IF1 ADC3 Swap Mux", "R/R", "IF1 ADC3 Mux" },3600 3601	{ "IF1 ADC4 Swap Mux", "L/R", "IF1 ADC4 Mux" },3602	{ "IF1 ADC4 Swap Mux", "R/L", "IF1 ADC4 Mux" },3603	{ "IF1 ADC4 Swap Mux", "L/L", "IF1 ADC4 Mux" },3604	{ "IF1 ADC4 Swap Mux", "R/R", "IF1 ADC4 Mux" },3605 3606	{ "IF1 ADC", NULL, "IF1 ADC1 Swap Mux" },3607	{ "IF1 ADC", NULL, "IF1 ADC2 Swap Mux" },3608	{ "IF1 ADC", NULL, "IF1 ADC3 Swap Mux" },3609	{ "IF1 ADC", NULL, "IF1 ADC4 Swap Mux" },3610 3611	{ "IF1 ADC TDM Swap Mux", "1/2/3/4", "IF1 ADC" },3612	{ "IF1 ADC TDM Swap Mux", "2/1/3/4", "IF1 ADC" },3613	{ "IF1 ADC TDM Swap Mux", "2/3/1/4", "IF1 ADC" },3614	{ "IF1 ADC TDM Swap Mux", "4/1/2/3", "IF1 ADC" },3615	{ "IF1 ADC TDM Swap Mux", "1/3/2/4", "IF1 ADC" },3616	{ "IF1 ADC TDM Swap Mux", "1/4/2/3", "IF1 ADC" },3617	{ "IF1 ADC TDM Swap Mux", "3/1/2/4", "IF1 ADC" },3618	{ "IF1 ADC TDM Swap Mux", "3/4/1/2", "IF1 ADC" },3619 3620	{ "AIF1TX", NULL, "I2S1" },3621	{ "AIF1TX", NULL, "IF1 ADC TDM Swap Mux" },3622 3623	{ "IF2 ADC1 Mux", "STO1 ADC MIX", "Stereo1 ADC MIX" },3624	{ "IF2 ADC1 Mux", "OB01", "OB01 Bypass Mux" },3625	{ "IF2 ADC1 Mux", "VAD ADC", "VAD ADC Mux" },3626 3627	{ "IF2 ADC2 Mux", "STO2 ADC MIX", "Stereo2 ADC MIX" },3628	{ "IF2 ADC2 Mux", "OB23", "OB23 Bypass Mux" },3629 3630	{ "IF2 ADC3 Mux", "STO3 ADC MIX", "Stereo3 ADC MIX" },3631	{ "IF2 ADC3 Mux", "MONO ADC MIX", "Mono ADC MIX" },3632	{ "IF2 ADC3 Mux", "OB45", "OB45" },3633 3634	{ "IF2 ADC4 Mux", "STO4 ADC MIX", "Stereo4 ADC MIX" },3635	{ "IF2 ADC4 Mux", "OB67", "OB67" },3636	{ "IF2 ADC4 Mux", "OB01", "OB01 Bypass Mux" },3637 3638	{ "IF2 ADC1 Swap Mux", "L/R", "IF2 ADC1 Mux" },3639	{ "IF2 ADC1 Swap Mux", "R/L", "IF2 ADC1 Mux" },3640	{ "IF2 ADC1 Swap Mux", "L/L", "IF2 ADC1 Mux" },3641	{ "IF2 ADC1 Swap Mux", "R/R", "IF2 ADC1 Mux" },3642 3643	{ "IF2 ADC2 Swap Mux", "L/R", "IF2 ADC2 Mux" },3644	{ "IF2 ADC2 Swap Mux", "R/L", "IF2 ADC2 Mux" },3645	{ "IF2 ADC2 Swap Mux", "L/L", "IF2 ADC2 Mux" },3646	{ "IF2 ADC2 Swap Mux", "R/R", "IF2 ADC2 Mux" },3647 3648	{ "IF2 ADC3 Swap Mux", "L/R", "IF2 ADC3 Mux" },3649	{ "IF2 ADC3 Swap Mux", "R/L", "IF2 ADC3 Mux" },3650	{ "IF2 ADC3 Swap Mux", "L/L", "IF2 ADC3 Mux" },3651	{ "IF2 ADC3 Swap Mux", "R/R", "IF2 ADC3 Mux" },3652 3653	{ "IF2 ADC4 Swap Mux", "L/R", "IF2 ADC4 Mux" },3654	{ "IF2 ADC4 Swap Mux", "R/L", "IF2 ADC4 Mux" },3655	{ "IF2 ADC4 Swap Mux", "L/L", "IF2 ADC4 Mux" },3656	{ "IF2 ADC4 Swap Mux", "R/R", "IF2 ADC4 Mux" },3657 3658	{ "IF2 ADC", NULL, "IF2 ADC1 Swap Mux" },3659	{ "IF2 ADC", NULL, "IF2 ADC2 Swap Mux" },3660	{ "IF2 ADC", NULL, "IF2 ADC3 Swap Mux" },3661	{ "IF2 ADC", NULL, "IF2 ADC4 Swap Mux" },3662 3663	{ "IF2 ADC TDM Swap Mux", "1/2/3/4", "IF2 ADC" },3664	{ "IF2 ADC TDM Swap Mux", "2/1/3/4", "IF2 ADC" },3665	{ "IF2 ADC TDM Swap Mux", "3/1/2/4", "IF2 ADC" },3666	{ "IF2 ADC TDM Swap Mux", "4/1/2/3", "IF2 ADC" },3667	{ "IF2 ADC TDM Swap Mux", "1/3/2/4", "IF2 ADC" },3668	{ "IF2 ADC TDM Swap Mux", "1/4/2/3", "IF2 ADC" },3669	{ "IF2 ADC TDM Swap Mux", "2/3/1/4", "IF2 ADC" },3670	{ "IF2 ADC TDM Swap Mux", "3/4/1/2", "IF2 ADC" },3671 3672	{ "AIF2TX", NULL, "I2S2" },3673	{ "AIF2TX", NULL, "IF2 ADC TDM Swap Mux" },3674 3675	{ "IF3 ADC Mux", "STO1 ADC MIX", "Stereo1 ADC MIX" },3676	{ "IF3 ADC Mux", "STO2 ADC MIX", "Stereo2 ADC MIX" },3677	{ "IF3 ADC Mux", "STO3 ADC MIX", "Stereo3 ADC MIX" },3678	{ "IF3 ADC Mux", "STO4 ADC MIX", "Stereo4 ADC MIX" },3679	{ "IF3 ADC Mux", "MONO ADC MIX", "Mono ADC MIX" },3680	{ "IF3 ADC Mux", "OB01", "OB01 Bypass Mux" },3681	{ "IF3 ADC Mux", "OB23", "OB23 Bypass Mux" },3682	{ "IF3 ADC Mux", "VAD ADC", "VAD ADC Mux" },3683 3684	{ "AIF3TX", NULL, "I2S3" },3685	{ "AIF3TX", NULL, "IF3 ADC Mux" },3686 3687	{ "IF4 ADC Mux", "STO1 ADC MIX", "Stereo1 ADC MIX" },3688	{ "IF4 ADC Mux", "STO2 ADC MIX", "Stereo2 ADC MIX" },3689	{ "IF4 ADC Mux", "STO3 ADC MIX", "Stereo3 ADC MIX" },3690	{ "IF4 ADC Mux", "STO4 ADC MIX", "Stereo4 ADC MIX" },3691	{ "IF4 ADC Mux", "MONO ADC MIX", "Mono ADC MIX" },3692	{ "IF4 ADC Mux", "OB01", "OB01 Bypass Mux" },3693	{ "IF4 ADC Mux", "OB23", "OB23 Bypass Mux" },3694	{ "IF4 ADC Mux", "VAD ADC", "VAD ADC Mux" },3695 3696	{ "AIF4TX", NULL, "I2S4" },3697	{ "AIF4TX", NULL, "IF4 ADC Mux" },3698 3699	{ "SLB ADC1 Mux", "STO1 ADC MIX", "Stereo1 ADC MIX" },3700	{ "SLB ADC1 Mux", "OB01", "OB01 Bypass Mux" },3701	{ "SLB ADC1 Mux", "VAD ADC", "VAD ADC Mux" },3702 3703	{ "SLB ADC2 Mux", "STO2 ADC MIX", "Stereo2 ADC MIX" },3704	{ "SLB ADC2 Mux", "OB23", "OB23 Bypass Mux" },3705 3706	{ "SLB ADC3 Mux", "STO3 ADC MIX", "Stereo3 ADC MIX" },3707	{ "SLB ADC3 Mux", "MONO ADC MIX", "Mono ADC MIX" },3708	{ "SLB ADC3 Mux", "OB45", "OB45" },3709 3710	{ "SLB ADC4 Mux", "STO4 ADC MIX", "Stereo4 ADC MIX" },3711	{ "SLB ADC4 Mux", "OB67", "OB67" },3712	{ "SLB ADC4 Mux", "OB01", "OB01 Bypass Mux" },3713 3714	{ "SLBTX", NULL, "SLB" },3715	{ "SLBTX", NULL, "SLB ADC1 Mux" },3716	{ "SLBTX", NULL, "SLB ADC2 Mux" },3717	{ "SLBTX", NULL, "SLB ADC3 Mux" },3718	{ "SLBTX", NULL, "SLB ADC4 Mux" },3719 3720	{ "DSPTX", NULL, "IB01 Bypass Mux" },3721 3722	{ "IB01 Mux", "IF1 DAC 01", "IF1 DAC01" },3723	{ "IB01 Mux", "IF2 DAC 01", "IF2 DAC01" },3724	{ "IB01 Mux", "SLB DAC 01", "SLB DAC01" },3725	{ "IB01 Mux", "STO1 ADC MIX", "Stereo1 ADC MIX" },3726	/* The IB01 Mux controls the source for InBound0 and InBound1.3727	 * When the mux option "VAD ADC/DAC1 FS" is selected, "VAD ADC" goes to3728	 * InBound0 and "DAC1 FS" goes to InBound1. "VAD ADC" is used for3729	 * hotwording. "DAC1 FS" is not used currently.3730	 *3731	 * Creating a common widget node for "VAD ADC" + "DAC1 FS" and3732	 * connecting the common widget to IB01 Mux causes the issue where3733	 * there is an active path going from system playback -> "DAC1 FS" ->3734	 * IB01 Mux -> DSP Buffer -> hotword stream. This wrong path confuses3735	 * DAPM. Therefore "DAC1 FS" is ignored for now.3736	 */3737	{ "IB01 Mux", "VAD ADC/DAC1 FS", "VAD ADC Mux" },3738 3739	{ "IB01 Bypass Mux", "Bypass", "IB01 Mux" },3740	{ "IB01 Bypass Mux", "Pass SRC", "IB01 Mux" },3741 3742	{ "IB23 Mux", "IF1 DAC 23", "IF1 DAC23" },3743	{ "IB23 Mux", "IF2 DAC 23", "IF2 DAC23" },3744	{ "IB23 Mux", "SLB DAC 23", "SLB DAC23" },3745	{ "IB23 Mux", "STO2 ADC MIX", "Stereo2 ADC MIX" },3746	{ "IB23 Mux", "DAC1 FS", "DAC1 FS" },3747	{ "IB23 Mux", "IF4 DAC", "IF4 DAC" },3748 3749	{ "IB23 Bypass Mux", "Bypass", "IB23 Mux" },3750	{ "IB23 Bypass Mux", "Pass SRC", "IB23 Mux" },3751 3752	{ "IB45 Mux", "IF1 DAC 45", "IF1 DAC45" },3753	{ "IB45 Mux", "IF2 DAC 45", "IF2 DAC45" },3754	{ "IB45 Mux", "SLB DAC 45", "SLB DAC45" },3755	{ "IB45 Mux", "STO3 ADC MIX", "Stereo3 ADC MIX" },3756	{ "IB45 Mux", "IF3 DAC", "IF3 DAC" },3757 3758	{ "IB45 Bypass Mux", "Bypass", "IB45 Mux" },3759	{ "IB45 Bypass Mux", "Pass SRC", "IB45 Mux" },3760 3761	{ "IB6 Mux", "IF1 DAC 6", "IF1 DAC6 Mux" },3762	{ "IB6 Mux", "IF2 DAC 6", "IF2 DAC6 Mux" },3763	{ "IB6 Mux", "SLB DAC 6", "SLB DAC6" },3764	{ "IB6 Mux", "STO4 ADC MIX L", "Stereo4 ADC MIXL" },3765	{ "IB6 Mux", "IF4 DAC L", "IF4 DAC L" },3766	{ "IB6 Mux", "STO1 ADC MIX L", "Stereo1 ADC MIXL" },3767	{ "IB6 Mux", "STO2 ADC MIX L", "Stereo2 ADC MIXL" },3768	{ "IB6 Mux", "STO3 ADC MIX L", "Stereo3 ADC MIXL" },3769 3770	{ "IB7 Mux", "IF1 DAC 7", "IF1 DAC7 Mux" },3771	{ "IB7 Mux", "IF2 DAC 7", "IF2 DAC7 Mux" },3772	{ "IB7 Mux", "SLB DAC 7", "SLB DAC7" },3773	{ "IB7 Mux", "STO4 ADC MIX R", "Stereo4 ADC MIXR" },3774	{ "IB7 Mux", "IF4 DAC R", "IF4 DAC R" },3775	{ "IB7 Mux", "STO1 ADC MIX R", "Stereo1 ADC MIXR" },3776	{ "IB7 Mux", "STO2 ADC MIX R", "Stereo2 ADC MIXR" },3777	{ "IB7 Mux", "STO3 ADC MIX R", "Stereo3 ADC MIXR" },3778 3779	{ "IB8 Mux", "STO1 ADC MIX L", "Stereo1 ADC MIXL" },3780	{ "IB8 Mux", "STO2 ADC MIX L", "Stereo2 ADC MIXL" },3781	{ "IB8 Mux", "STO3 ADC MIX L", "Stereo3 ADC MIXL" },3782	{ "IB8 Mux", "STO4 ADC MIX L", "Stereo4 ADC MIXL" },3783	{ "IB8 Mux", "MONO ADC MIX L", "Mono ADC MIXL" },3784	{ "IB8 Mux", "DACL1 FS", "DAC1 MIXL" },3785 3786	{ "IB9 Mux", "STO1 ADC MIX R", "Stereo1 ADC MIXR" },3787	{ "IB9 Mux", "STO2 ADC MIX R", "Stereo2 ADC MIXR" },3788	{ "IB9 Mux", "STO3 ADC MIX R", "Stereo3 ADC MIXR" },3789	{ "IB9 Mux", "STO4 ADC MIX R", "Stereo4 ADC MIXR" },3790	{ "IB9 Mux", "MONO ADC MIX R", "Mono ADC MIXR" },3791	{ "IB9 Mux", "DACR1 FS", "DAC1 MIXR" },3792	{ "IB9 Mux", "DAC1 FS", "DAC1 FS" },3793 3794	{ "OB01 MIX", "IB01 Switch", "IB01 Bypass Mux" },3795	{ "OB01 MIX", "IB23 Switch", "IB23 Bypass Mux" },3796	{ "OB01 MIX", "IB45 Switch", "IB45 Bypass Mux" },3797	{ "OB01 MIX", "IB6 Switch", "IB6 Mux" },3798	{ "OB01 MIX", "IB7 Switch", "IB7 Mux" },3799	{ "OB01 MIX", "IB8 Switch", "IB8 Mux" },3800	{ "OB01 MIX", "IB9 Switch", "IB9 Mux" },3801 3802	{ "OB23 MIX", "IB01 Switch", "IB01 Bypass Mux" },3803	{ "OB23 MIX", "IB23 Switch", "IB23 Bypass Mux" },3804	{ "OB23 MIX", "IB45 Switch", "IB45 Bypass Mux" },3805	{ "OB23 MIX", "IB6 Switch", "IB6 Mux" },3806	{ "OB23 MIX", "IB7 Switch", "IB7 Mux" },3807	{ "OB23 MIX", "IB8 Switch", "IB8 Mux" },3808	{ "OB23 MIX", "IB9 Switch", "IB9 Mux" },3809 3810	{ "OB4 MIX", "IB01 Switch", "IB01 Bypass Mux" },3811	{ "OB4 MIX", "IB23 Switch", "IB23 Bypass Mux" },3812	{ "OB4 MIX", "IB45 Switch", "IB45 Bypass Mux" },3813	{ "OB4 MIX", "IB6 Switch", "IB6 Mux" },3814	{ "OB4 MIX", "IB7 Switch", "IB7 Mux" },3815	{ "OB4 MIX", "IB8 Switch", "IB8 Mux" },3816	{ "OB4 MIX", "IB9 Switch", "IB9 Mux" },3817 3818	{ "OB5 MIX", "IB01 Switch", "IB01 Bypass Mux" },3819	{ "OB5 MIX", "IB23 Switch", "IB23 Bypass Mux" },3820	{ "OB5 MIX", "IB45 Switch", "IB45 Bypass Mux" },3821	{ "OB5 MIX", "IB6 Switch", "IB6 Mux" },3822	{ "OB5 MIX", "IB7 Switch", "IB7 Mux" },3823	{ "OB5 MIX", "IB8 Switch", "IB8 Mux" },3824	{ "OB5 MIX", "IB9 Switch", "IB9 Mux" },3825 3826	{ "OB6 MIX", "IB01 Switch", "IB01 Bypass Mux" },3827	{ "OB6 MIX", "IB23 Switch", "IB23 Bypass Mux" },3828	{ "OB6 MIX", "IB45 Switch", "IB45 Bypass Mux" },3829	{ "OB6 MIX", "IB6 Switch", "IB6 Mux" },3830	{ "OB6 MIX", "IB7 Switch", "IB7 Mux" },3831	{ "OB6 MIX", "IB8 Switch", "IB8 Mux" },3832	{ "OB6 MIX", "IB9 Switch", "IB9 Mux" },3833 3834	{ "OB7 MIX", "IB01 Switch", "IB01 Bypass Mux" },3835	{ "OB7 MIX", "IB23 Switch", "IB23 Bypass Mux" },3836	{ "OB7 MIX", "IB45 Switch", "IB45 Bypass Mux" },3837	{ "OB7 MIX", "IB6 Switch", "IB6 Mux" },3838	{ "OB7 MIX", "IB7 Switch", "IB7 Mux" },3839	{ "OB7 MIX", "IB8 Switch", "IB8 Mux" },3840	{ "OB7 MIX", "IB9 Switch", "IB9 Mux" },3841 3842	{ "OB01 Bypass Mux", "Bypass", "OB01 MIX" },3843	{ "OB01 Bypass Mux", "Pass SRC", "OB01 MIX" },3844	{ "OB23 Bypass Mux", "Bypass", "OB23 MIX" },3845	{ "OB23 Bypass Mux", "Pass SRC", "OB23 MIX" },3846 3847	{ "OutBound2", NULL, "OB23 Bypass Mux" },3848	{ "OutBound3", NULL, "OB23 Bypass Mux" },3849	{ "OutBound4", NULL, "OB4 MIX" },3850	{ "OutBound5", NULL, "OB5 MIX" },3851	{ "OutBound6", NULL, "OB6 MIX" },3852	{ "OutBound7", NULL, "OB7 MIX" },3853 3854	{ "OB45", NULL, "OutBound4" },3855	{ "OB45", NULL, "OutBound5" },3856	{ "OB67", NULL, "OutBound6" },3857	{ "OB67", NULL, "OutBound7" },3858 3859	{ "IF1 DAC0", NULL, "AIF1RX" },3860	{ "IF1 DAC1", NULL, "AIF1RX" },3861	{ "IF1 DAC2", NULL, "AIF1RX" },3862	{ "IF1 DAC3", NULL, "AIF1RX" },3863	{ "IF1 DAC4", NULL, "AIF1RX" },3864	{ "IF1 DAC5", NULL, "AIF1RX" },3865	{ "IF1 DAC6", NULL, "AIF1RX" },3866	{ "IF1 DAC7", NULL, "AIF1RX" },3867	{ "IF1 DAC0", NULL, "I2S1" },3868	{ "IF1 DAC1", NULL, "I2S1" },3869	{ "IF1 DAC2", NULL, "I2S1" },3870	{ "IF1 DAC3", NULL, "I2S1" },3871	{ "IF1 DAC4", NULL, "I2S1" },3872	{ "IF1 DAC5", NULL, "I2S1" },3873	{ "IF1 DAC6", NULL, "I2S1" },3874	{ "IF1 DAC7", NULL, "I2S1" },3875 3876	{ "IF1 DAC0 Mux", "Slot0", "IF1 DAC0" },3877	{ "IF1 DAC0 Mux", "Slot1", "IF1 DAC1" },3878	{ "IF1 DAC0 Mux", "Slot2", "IF1 DAC2" },3879	{ "IF1 DAC0 Mux", "Slot3", "IF1 DAC3" },3880	{ "IF1 DAC0 Mux", "Slot4", "IF1 DAC4" },3881	{ "IF1 DAC0 Mux", "Slot5", "IF1 DAC5" },3882	{ "IF1 DAC0 Mux", "Slot6", "IF1 DAC6" },3883	{ "IF1 DAC0 Mux", "Slot7", "IF1 DAC7" },3884 3885	{ "IF1 DAC1 Mux", "Slot0", "IF1 DAC0" },3886	{ "IF1 DAC1 Mux", "Slot1", "IF1 DAC1" },3887	{ "IF1 DAC1 Mux", "Slot2", "IF1 DAC2" },3888	{ "IF1 DAC1 Mux", "Slot3", "IF1 DAC3" },3889	{ "IF1 DAC1 Mux", "Slot4", "IF1 DAC4" },3890	{ "IF1 DAC1 Mux", "Slot5", "IF1 DAC5" },3891	{ "IF1 DAC1 Mux", "Slot6", "IF1 DAC6" },3892	{ "IF1 DAC1 Mux", "Slot7", "IF1 DAC7" },3893 3894	{ "IF1 DAC2 Mux", "Slot0", "IF1 DAC0" },3895	{ "IF1 DAC2 Mux", "Slot1", "IF1 DAC1" },3896	{ "IF1 DAC2 Mux", "Slot2", "IF1 DAC2" },3897	{ "IF1 DAC2 Mux", "Slot3", "IF1 DAC3" },3898	{ "IF1 DAC2 Mux", "Slot4", "IF1 DAC4" },3899	{ "IF1 DAC2 Mux", "Slot5", "IF1 DAC5" },3900	{ "IF1 DAC2 Mux", "Slot6", "IF1 DAC6" },3901	{ "IF1 DAC2 Mux", "Slot7", "IF1 DAC7" },3902 3903	{ "IF1 DAC3 Mux", "Slot0", "IF1 DAC0" },3904	{ "IF1 DAC3 Mux", "Slot1", "IF1 DAC1" },3905	{ "IF1 DAC3 Mux", "Slot2", "IF1 DAC2" },3906	{ "IF1 DAC3 Mux", "Slot3", "IF1 DAC3" },3907	{ "IF1 DAC3 Mux", "Slot4", "IF1 DAC4" },3908	{ "IF1 DAC3 Mux", "Slot5", "IF1 DAC5" },3909	{ "IF1 DAC3 Mux", "Slot6", "IF1 DAC6" },3910	{ "IF1 DAC3 Mux", "Slot7", "IF1 DAC7" },3911 3912	{ "IF1 DAC4 Mux", "Slot0", "IF1 DAC0" },3913	{ "IF1 DAC4 Mux", "Slot1", "IF1 DAC1" },3914	{ "IF1 DAC4 Mux", "Slot2", "IF1 DAC2" },3915	{ "IF1 DAC4 Mux", "Slot3", "IF1 DAC3" },3916	{ "IF1 DAC4 Mux", "Slot4", "IF1 DAC4" },3917	{ "IF1 DAC4 Mux", "Slot5", "IF1 DAC5" },3918	{ "IF1 DAC4 Mux", "Slot6", "IF1 DAC6" },3919	{ "IF1 DAC4 Mux", "Slot7", "IF1 DAC7" },3920 3921	{ "IF1 DAC5 Mux", "Slot0", "IF1 DAC0" },3922	{ "IF1 DAC5 Mux", "Slot1", "IF1 DAC1" },3923	{ "IF1 DAC5 Mux", "Slot2", "IF1 DAC2" },3924	{ "IF1 DAC5 Mux", "Slot3", "IF1 DAC3" },3925	{ "IF1 DAC5 Mux", "Slot4", "IF1 DAC4" },3926	{ "IF1 DAC5 Mux", "Slot5", "IF1 DAC5" },3927	{ "IF1 DAC5 Mux", "Slot6", "IF1 DAC6" },3928	{ "IF1 DAC5 Mux", "Slot7", "IF1 DAC7" },3929 3930	{ "IF1 DAC6 Mux", "Slot0", "IF1 DAC0" },3931	{ "IF1 DAC6 Mux", "Slot1", "IF1 DAC1" },3932	{ "IF1 DAC6 Mux", "Slot2", "IF1 DAC2" },3933	{ "IF1 DAC6 Mux", "Slot3", "IF1 DAC3" },3934	{ "IF1 DAC6 Mux", "Slot4", "IF1 DAC4" },3935	{ "IF1 DAC6 Mux", "Slot5", "IF1 DAC5" },3936	{ "IF1 DAC6 Mux", "Slot6", "IF1 DAC6" },3937	{ "IF1 DAC6 Mux", "Slot7", "IF1 DAC7" },3938 3939	{ "IF1 DAC7 Mux", "Slot0", "IF1 DAC0" },3940	{ "IF1 DAC7 Mux", "Slot1", "IF1 DAC1" },3941	{ "IF1 DAC7 Mux", "Slot2", "IF1 DAC2" },3942	{ "IF1 DAC7 Mux", "Slot3", "IF1 DAC3" },3943	{ "IF1 DAC7 Mux", "Slot4", "IF1 DAC4" },3944	{ "IF1 DAC7 Mux", "Slot5", "IF1 DAC5" },3945	{ "IF1 DAC7 Mux", "Slot6", "IF1 DAC6" },3946	{ "IF1 DAC7 Mux", "Slot7", "IF1 DAC7" },3947 3948	{ "IF1 DAC01", NULL, "IF1 DAC0 Mux" },3949	{ "IF1 DAC01", NULL, "IF1 DAC1 Mux" },3950	{ "IF1 DAC23", NULL, "IF1 DAC2 Mux" },3951	{ "IF1 DAC23", NULL, "IF1 DAC3 Mux" },3952	{ "IF1 DAC45", NULL, "IF1 DAC4 Mux" },3953	{ "IF1 DAC45", NULL, "IF1 DAC5 Mux" },3954	{ "IF1 DAC67", NULL, "IF1 DAC6 Mux" },3955	{ "IF1 DAC67", NULL, "IF1 DAC7 Mux" },3956 3957	{ "IF2 DAC0", NULL, "AIF2RX" },3958	{ "IF2 DAC1", NULL, "AIF2RX" },3959	{ "IF2 DAC2", NULL, "AIF2RX" },3960	{ "IF2 DAC3", NULL, "AIF2RX" },3961	{ "IF2 DAC4", NULL, "AIF2RX" },3962	{ "IF2 DAC5", NULL, "AIF2RX" },3963	{ "IF2 DAC6", NULL, "AIF2RX" },3964	{ "IF2 DAC7", NULL, "AIF2RX" },3965	{ "IF2 DAC0", NULL, "I2S2" },3966	{ "IF2 DAC1", NULL, "I2S2" },3967	{ "IF2 DAC2", NULL, "I2S2" },3968	{ "IF2 DAC3", NULL, "I2S2" },3969	{ "IF2 DAC4", NULL, "I2S2" },3970	{ "IF2 DAC5", NULL, "I2S2" },3971	{ "IF2 DAC6", NULL, "I2S2" },3972	{ "IF2 DAC7", NULL, "I2S2" },3973 3974	{ "IF2 DAC0 Mux", "Slot0", "IF2 DAC0" },3975	{ "IF2 DAC0 Mux", "Slot1", "IF2 DAC1" },3976	{ "IF2 DAC0 Mux", "Slot2", "IF2 DAC2" },3977	{ "IF2 DAC0 Mux", "Slot3", "IF2 DAC3" },3978	{ "IF2 DAC0 Mux", "Slot4", "IF2 DAC4" },3979	{ "IF2 DAC0 Mux", "Slot5", "IF2 DAC5" },3980	{ "IF2 DAC0 Mux", "Slot6", "IF2 DAC6" },3981	{ "IF2 DAC0 Mux", "Slot7", "IF2 DAC7" },3982 3983	{ "IF2 DAC1 Mux", "Slot0", "IF2 DAC0" },3984	{ "IF2 DAC1 Mux", "Slot1", "IF2 DAC1" },3985	{ "IF2 DAC1 Mux", "Slot2", "IF2 DAC2" },3986	{ "IF2 DAC1 Mux", "Slot3", "IF2 DAC3" },3987	{ "IF2 DAC1 Mux", "Slot4", "IF2 DAC4" },3988	{ "IF2 DAC1 Mux", "Slot5", "IF2 DAC5" },3989	{ "IF2 DAC1 Mux", "Slot6", "IF2 DAC6" },3990	{ "IF2 DAC1 Mux", "Slot7", "IF2 DAC7" },3991 3992	{ "IF2 DAC2 Mux", "Slot0", "IF2 DAC0" },3993	{ "IF2 DAC2 Mux", "Slot1", "IF2 DAC1" },3994	{ "IF2 DAC2 Mux", "Slot2", "IF2 DAC2" },3995	{ "IF2 DAC2 Mux", "Slot3", "IF2 DAC3" },3996	{ "IF2 DAC2 Mux", "Slot4", "IF2 DAC4" },3997	{ "IF2 DAC2 Mux", "Slot5", "IF2 DAC5" },3998	{ "IF2 DAC2 Mux", "Slot6", "IF2 DAC6" },3999	{ "IF2 DAC2 Mux", "Slot7", "IF2 DAC7" },4000 4001	{ "IF2 DAC3 Mux", "Slot0", "IF2 DAC0" },4002	{ "IF2 DAC3 Mux", "Slot1", "IF2 DAC1" },4003	{ "IF2 DAC3 Mux", "Slot2", "IF2 DAC2" },4004	{ "IF2 DAC3 Mux", "Slot3", "IF2 DAC3" },4005	{ "IF2 DAC3 Mux", "Slot4", "IF2 DAC4" },4006	{ "IF2 DAC3 Mux", "Slot5", "IF2 DAC5" },4007	{ "IF2 DAC3 Mux", "Slot6", "IF2 DAC6" },4008	{ "IF2 DAC3 Mux", "Slot7", "IF2 DAC7" },4009 4010	{ "IF2 DAC4 Mux", "Slot0", "IF2 DAC0" },4011	{ "IF2 DAC4 Mux", "Slot1", "IF2 DAC1" },4012	{ "IF2 DAC4 Mux", "Slot2", "IF2 DAC2" },4013	{ "IF2 DAC4 Mux", "Slot3", "IF2 DAC3" },4014	{ "IF2 DAC4 Mux", "Slot4", "IF2 DAC4" },4015	{ "IF2 DAC4 Mux", "Slot5", "IF2 DAC5" },4016	{ "IF2 DAC4 Mux", "Slot6", "IF2 DAC6" },4017	{ "IF2 DAC4 Mux", "Slot7", "IF2 DAC7" },4018 4019	{ "IF2 DAC5 Mux", "Slot0", "IF2 DAC0" },4020	{ "IF2 DAC5 Mux", "Slot1", "IF2 DAC1" },4021	{ "IF2 DAC5 Mux", "Slot2", "IF2 DAC2" },4022	{ "IF2 DAC5 Mux", "Slot3", "IF2 DAC3" },4023	{ "IF2 DAC5 Mux", "Slot4", "IF2 DAC4" },4024	{ "IF2 DAC5 Mux", "Slot5", "IF2 DAC5" },4025	{ "IF2 DAC5 Mux", "Slot6", "IF2 DAC6" },4026	{ "IF2 DAC5 Mux", "Slot7", "IF2 DAC7" },4027 4028	{ "IF2 DAC6 Mux", "Slot0", "IF2 DAC0" },4029	{ "IF2 DAC6 Mux", "Slot1", "IF2 DAC1" },4030	{ "IF2 DAC6 Mux", "Slot2", "IF2 DAC2" },4031	{ "IF2 DAC6 Mux", "Slot3", "IF2 DAC3" },4032	{ "IF2 DAC6 Mux", "Slot4", "IF2 DAC4" },4033	{ "IF2 DAC6 Mux", "Slot5", "IF2 DAC5" },4034	{ "IF2 DAC6 Mux", "Slot6", "IF2 DAC6" },4035	{ "IF2 DAC6 Mux", "Slot7", "IF2 DAC7" },4036 4037	{ "IF2 DAC7 Mux", "Slot0", "IF2 DAC0" },4038	{ "IF2 DAC7 Mux", "Slot1", "IF2 DAC1" },4039	{ "IF2 DAC7 Mux", "Slot2", "IF2 DAC2" },4040	{ "IF2 DAC7 Mux", "Slot3", "IF2 DAC3" },4041	{ "IF2 DAC7 Mux", "Slot4", "IF2 DAC4" },4042	{ "IF2 DAC7 Mux", "Slot5", "IF2 DAC5" },4043	{ "IF2 DAC7 Mux", "Slot6", "IF2 DAC6" },4044	{ "IF2 DAC7 Mux", "Slot7", "IF2 DAC7" },4045 4046	{ "IF2 DAC01", NULL, "IF2 DAC0 Mux" },4047	{ "IF2 DAC01", NULL, "IF2 DAC1 Mux" },4048	{ "IF2 DAC23", NULL, "IF2 DAC2 Mux" },4049	{ "IF2 DAC23", NULL, "IF2 DAC3 Mux" },4050	{ "IF2 DAC45", NULL, "IF2 DAC4 Mux" },4051	{ "IF2 DAC45", NULL, "IF2 DAC5 Mux" },4052	{ "IF2 DAC67", NULL, "IF2 DAC6 Mux" },4053	{ "IF2 DAC67", NULL, "IF2 DAC7 Mux" },4054 4055	{ "IF3 DAC", NULL, "AIF3RX" },4056	{ "IF3 DAC", NULL, "I2S3" },4057 4058	{ "IF4 DAC", NULL, "AIF4RX" },4059	{ "IF4 DAC", NULL, "I2S4" },4060 4061	{ "IF3 DAC L", NULL, "IF3 DAC" },4062	{ "IF3 DAC R", NULL, "IF3 DAC" },4063 4064	{ "IF4 DAC L", NULL, "IF4 DAC" },4065	{ "IF4 DAC R", NULL, "IF4 DAC" },4066 4067	{ "SLB DAC0", NULL, "SLBRX" },4068	{ "SLB DAC1", NULL, "SLBRX" },4069	{ "SLB DAC2", NULL, "SLBRX" },4070	{ "SLB DAC3", NULL, "SLBRX" },4071	{ "SLB DAC4", NULL, "SLBRX" },4072	{ "SLB DAC5", NULL, "SLBRX" },4073	{ "SLB DAC6", NULL, "SLBRX" },4074	{ "SLB DAC7", NULL, "SLBRX" },4075	{ "SLB DAC0", NULL, "SLB" },4076	{ "SLB DAC1", NULL, "SLB" },4077	{ "SLB DAC2", NULL, "SLB" },4078	{ "SLB DAC3", NULL, "SLB" },4079	{ "SLB DAC4", NULL, "SLB" },4080	{ "SLB DAC5", NULL, "SLB" },4081	{ "SLB DAC6", NULL, "SLB" },4082	{ "SLB DAC7", NULL, "SLB" },4083 4084	{ "SLB DAC01", NULL, "SLB DAC0" },4085	{ "SLB DAC01", NULL, "SLB DAC1" },4086	{ "SLB DAC23", NULL, "SLB DAC2" },4087	{ "SLB DAC23", NULL, "SLB DAC3" },4088	{ "SLB DAC45", NULL, "SLB DAC4" },4089	{ "SLB DAC45", NULL, "SLB DAC5" },4090	{ "SLB DAC67", NULL, "SLB DAC6" },4091	{ "SLB DAC67", NULL, "SLB DAC7" },4092 4093	{ "ADDA1 Mux", "STO1 ADC MIX", "Stereo1 ADC MIX" },4094	{ "ADDA1 Mux", "STO2 ADC MIX", "Stereo2 ADC MIX" },4095	{ "ADDA1 Mux", "OB 67", "OB67" },4096 4097	{ "DAC1 Mux", "IF1 DAC 01", "IF1 DAC01" },4098	{ "DAC1 Mux", "IF2 DAC 01", "IF2 DAC01" },4099	{ "DAC1 Mux", "IF3 DAC LR", "IF3 DAC" },4100	{ "DAC1 Mux", "IF4 DAC LR", "IF4 DAC" },4101	{ "DAC1 Mux", "SLB DAC 01", "SLB DAC01" },4102	{ "DAC1 Mux", "OB 01", "OB01 Bypass Mux" },4103 4104	{ "DAC1 MIXL", "Stereo ADC Switch", "ADDA1 Mux" },4105	{ "DAC1 MIXL", "DAC1 Switch", "DAC1 Mux" },4106	{ "DAC1 MIXR", "Stereo ADC Switch", "ADDA1 Mux" },4107	{ "DAC1 MIXR", "DAC1 Switch", "DAC1 Mux" },4108 4109	{ "DAC1 FS", NULL, "DAC1 MIXL" },4110	{ "DAC1 FS", NULL, "DAC1 MIXR" },4111 4112	{ "DAC2 L Mux", "IF1 DAC 2", "IF1 DAC2 Mux" },4113	{ "DAC2 L Mux", "IF2 DAC 2", "IF2 DAC2 Mux" },4114	{ "DAC2 L Mux", "IF3 DAC L", "IF3 DAC L" },4115	{ "DAC2 L Mux", "IF4 DAC L", "IF4 DAC L" },4116	{ "DAC2 L Mux", "SLB DAC 2", "SLB DAC2" },4117	{ "DAC2 L Mux", "OB 2", "OutBound2" },4118 4119	{ "DAC2 R Mux", "IF1 DAC 3", "IF1 DAC3 Mux" },4120	{ "DAC2 R Mux", "IF2 DAC 3", "IF2 DAC3 Mux" },4121	{ "DAC2 R Mux", "IF3 DAC R", "IF3 DAC R" },4122	{ "DAC2 R Mux", "IF4 DAC R", "IF4 DAC R" },4123	{ "DAC2 R Mux", "SLB DAC 3", "SLB DAC3" },4124	{ "DAC2 R Mux", "OB 3", "OutBound3" },4125	{ "DAC2 R Mux", "Haptic Generator", "Haptic Generator" },4126	{ "DAC2 R Mux", "VAD ADC", "VAD ADC Mux" },4127 4128	{ "DAC3 L Mux", "IF1 DAC 4", "IF1 DAC4 Mux" },4129	{ "DAC3 L Mux", "IF2 DAC 4", "IF2 DAC4 Mux" },4130	{ "DAC3 L Mux", "IF3 DAC L", "IF3 DAC L" },4131	{ "DAC3 L Mux", "IF4 DAC L", "IF4 DAC L" },4132	{ "DAC3 L Mux", "SLB DAC 4", "SLB DAC4" },4133	{ "DAC3 L Mux", "OB 4", "OutBound4" },4134 4135	{ "DAC3 R Mux", "IF1 DAC 5", "IF1 DAC5 Mux" },4136	{ "DAC3 R Mux", "IF2 DAC 5", "IF2 DAC5 Mux" },4137	{ "DAC3 R Mux", "IF3 DAC R", "IF3 DAC R" },4138	{ "DAC3 R Mux", "IF4 DAC R", "IF4 DAC R" },4139	{ "DAC3 R Mux", "SLB DAC 5", "SLB DAC5" },4140	{ "DAC3 R Mux", "OB 5", "OutBound5" },4141 4142	{ "DAC4 L Mux", "IF1 DAC 6", "IF1 DAC6 Mux" },4143	{ "DAC4 L Mux", "IF2 DAC 6", "IF2 DAC6 Mux" },4144	{ "DAC4 L Mux", "IF3 DAC L", "IF3 DAC L" },4145	{ "DAC4 L Mux", "IF4 DAC L", "IF4 DAC L" },4146	{ "DAC4 L Mux", "SLB DAC 6", "SLB DAC6" },4147	{ "DAC4 L Mux", "OB 6", "OutBound6" },4148 4149	{ "DAC4 R Mux", "IF1 DAC 7", "IF1 DAC7 Mux" },4150	{ "DAC4 R Mux", "IF2 DAC 7", "IF2 DAC7 Mux" },4151	{ "DAC4 R Mux", "IF3 DAC R", "IF3 DAC R" },4152	{ "DAC4 R Mux", "IF4 DAC R", "IF4 DAC R" },4153	{ "DAC4 R Mux", "SLB DAC 7", "SLB DAC7" },4154	{ "DAC4 R Mux", "OB 7", "OutBound7" },4155 4156	{ "Sidetone Mux", "DMIC1 L", "DMIC L1" },4157	{ "Sidetone Mux", "DMIC2 L", "DMIC L2" },4158	{ "Sidetone Mux", "DMIC3 L", "DMIC L3" },4159	{ "Sidetone Mux", "DMIC4 L", "DMIC L4" },4160	{ "Sidetone Mux", "ADC1", "ADC 1" },4161	{ "Sidetone Mux", "ADC2", "ADC 2" },4162	{ "Sidetone Mux", NULL, "Sidetone Power" },4163 4164	{ "Stereo DAC MIXL", "ST L Switch", "Sidetone Mux" },4165	{ "Stereo DAC MIXL", "DAC1 L Switch", "DAC1 MIXL" },4166	{ "Stereo DAC MIXL", "DAC2 L Switch", "DAC2 L Mux" },4167	{ "Stereo DAC MIXL", "DAC1 R Switch", "DAC1 MIXR" },4168	{ "Stereo DAC MIXL", NULL, "dac stereo1 filter" },4169	{ "Stereo DAC MIXR", "ST R Switch", "Sidetone Mux" },4170	{ "Stereo DAC MIXR", "DAC1 R Switch", "DAC1 MIXR" },4171	{ "Stereo DAC MIXR", "DAC2 R Switch", "DAC2 R Mux" },4172	{ "Stereo DAC MIXR", "DAC1 L Switch", "DAC1 MIXL" },4173	{ "Stereo DAC MIXR", NULL, "dac stereo1 filter" },4174	{ "dac stereo1 filter", NULL, "PLL1", is_sys_clk_from_pll },4175 4176	{ "Mono DAC MIXL", "ST L Switch", "Sidetone Mux" },4177	{ "Mono DAC MIXL", "DAC1 L Switch", "DAC1 MIXL" },4178	{ "Mono DAC MIXL", "DAC2 L Switch", "DAC2 L Mux" },4179	{ "Mono DAC MIXL", "DAC2 R Switch", "DAC2 R Mux" },4180	{ "Mono DAC MIXL", NULL, "dac mono2 left filter" },4181	{ "dac mono2 left filter", NULL, "PLL1", is_sys_clk_from_pll },4182	{ "Mono DAC MIXR", "ST R Switch", "Sidetone Mux" },4183	{ "Mono DAC MIXR", "DAC1 R Switch", "DAC1 MIXR" },4184	{ "Mono DAC MIXR", "DAC2 R Switch", "DAC2 R Mux" },4185	{ "Mono DAC MIXR", "DAC2 L Switch", "DAC2 L Mux" },4186	{ "Mono DAC MIXR", NULL, "dac mono2 right filter" },4187	{ "dac mono2 right filter", NULL, "PLL1", is_sys_clk_from_pll },4188 4189	{ "DD1 MIXL", "Sto DAC Mix L Switch", "Stereo DAC MIXL" },4190	{ "DD1 MIXL", "Mono DAC Mix L Switch", "Mono DAC MIXL" },4191	{ "DD1 MIXL", "DAC3 L Switch", "DAC3 L Mux" },4192	{ "DD1 MIXL", "DAC3 R Switch", "DAC3 R Mux" },4193	{ "DD1 MIXL", NULL, "dac mono3 left filter" },4194	{ "dac mono3 left filter", NULL, "PLL1", is_sys_clk_from_pll },4195	{ "DD1 MIXR", "Sto DAC Mix R Switch", "Stereo DAC MIXR" },4196	{ "DD1 MIXR", "Mono DAC Mix R Switch", "Mono DAC MIXR" },4197	{ "DD1 MIXR", "DAC3 L Switch", "DAC3 L Mux" },4198	{ "DD1 MIXR", "DAC3 R Switch", "DAC3 R Mux" },4199	{ "DD1 MIXR", NULL, "dac mono3 right filter" },4200	{ "dac mono3 right filter", NULL, "PLL1", is_sys_clk_from_pll },4201 4202	{ "DD2 MIXL", "Sto DAC Mix L Switch", "Stereo DAC MIXL" },4203	{ "DD2 MIXL", "Mono DAC Mix L Switch", "Mono DAC MIXL" },4204	{ "DD2 MIXL", "DAC4 L Switch", "DAC4 L Mux" },4205	{ "DD2 MIXL", "DAC4 R Switch", "DAC4 R Mux" },4206	{ "DD2 MIXL", NULL, "dac mono4 left filter" },4207	{ "dac mono4 left filter", NULL, "PLL1", is_sys_clk_from_pll },4208	{ "DD2 MIXR", "Sto DAC Mix R Switch", "Stereo DAC MIXR" },4209	{ "DD2 MIXR", "Mono DAC Mix R Switch", "Mono DAC MIXR" },4210	{ "DD2 MIXR", "DAC4 L Switch", "DAC4 L Mux" },4211	{ "DD2 MIXR", "DAC4 R Switch", "DAC4 R Mux" },4212	{ "DD2 MIXR", NULL, "dac mono4 right filter" },4213	{ "dac mono4 right filter", NULL, "PLL1", is_sys_clk_from_pll },4214 4215	{ "Stereo DAC MIX", NULL, "Stereo DAC MIXL" },4216	{ "Stereo DAC MIX", NULL, "Stereo DAC MIXR" },4217	{ "Mono DAC MIX", NULL, "Mono DAC MIXL" },4218	{ "Mono DAC MIX", NULL, "Mono DAC MIXR" },4219	{ "DD1 MIX", NULL, "DD1 MIXL" },4220	{ "DD1 MIX", NULL, "DD1 MIXR" },4221	{ "DD2 MIX", NULL, "DD2 MIXL" },4222	{ "DD2 MIX", NULL, "DD2 MIXR" },4223 4224	{ "DAC12 SRC Mux", "STO1 DAC MIX", "Stereo DAC MIX" },4225	{ "DAC12 SRC Mux", "MONO DAC MIX", "Mono DAC MIX" },4226	{ "DAC12 SRC Mux", "DD MIX1", "DD1 MIX" },4227	{ "DAC12 SRC Mux", "DD MIX2", "DD2 MIX" },4228 4229	{ "DAC3 SRC Mux", "MONO DAC MIXL", "Mono DAC MIXL" },4230	{ "DAC3 SRC Mux", "MONO DAC MIXR", "Mono DAC MIXR" },4231	{ "DAC3 SRC Mux", "DD MIX1L", "DD1 MIXL" },4232	{ "DAC3 SRC Mux", "DD MIX2L", "DD2 MIXL" },4233 4234	{ "DAC 1", NULL, "DAC12 SRC Mux" },4235	{ "DAC 2", NULL, "DAC12 SRC Mux" },4236	{ "DAC 3", NULL, "DAC3 SRC Mux" },4237 4238	{ "PDM1 L Mux", "STO1 DAC MIX", "Stereo DAC MIXL" },4239	{ "PDM1 L Mux", "MONO DAC MIX", "Mono DAC MIXL" },4240	{ "PDM1 L Mux", "DD MIX1", "DD1 MIXL" },4241	{ "PDM1 L Mux", "DD MIX2", "DD2 MIXL" },4242	{ "PDM1 L Mux", NULL, "PDM1 Power" },4243	{ "PDM1 R Mux", "STO1 DAC MIX", "Stereo DAC MIXR" },4244	{ "PDM1 R Mux", "MONO DAC MIX", "Mono DAC MIXR" },4245	{ "PDM1 R Mux", "DD MIX1", "DD1 MIXR" },4246	{ "PDM1 R Mux", "DD MIX2", "DD2 MIXR" },4247	{ "PDM1 R Mux", NULL, "PDM1 Power" },4248	{ "PDM2 L Mux", "STO1 DAC MIX", "Stereo DAC MIXL" },4249	{ "PDM2 L Mux", "MONO DAC MIX", "Mono DAC MIXL" },4250	{ "PDM2 L Mux", "DD MIX1", "DD1 MIXL" },4251	{ "PDM2 L Mux", "DD MIX2", "DD2 MIXL" },4252	{ "PDM2 L Mux", NULL, "PDM2 Power" },4253	{ "PDM2 R Mux", "STO1 DAC MIX", "Stereo DAC MIXR" },4254	{ "PDM2 R Mux", "MONO DAC MIX", "Mono DAC MIXR" },4255	{ "PDM2 R Mux", "DD MIX1", "DD1 MIXR" },4256	{ "PDM2 R Mux", "DD MIX1", "DD2 MIXR" },4257	{ "PDM2 R Mux", NULL, "PDM2 Power" },4258 4259	{ "LOUT1 amp", NULL, "DAC 1" },4260	{ "LOUT2 amp", NULL, "DAC 2" },4261	{ "LOUT3 amp", NULL, "DAC 3" },4262 4263	{ "LOUT1 vref", NULL, "LOUT1 amp" },4264	{ "LOUT2 vref", NULL, "LOUT2 amp" },4265	{ "LOUT3 vref", NULL, "LOUT3 amp" },4266 4267	{ "LOUT1", NULL, "LOUT1 vref" },4268	{ "LOUT2", NULL, "LOUT2 vref" },4269	{ "LOUT3", NULL, "LOUT3 vref" },4270 4271	{ "PDM1L", NULL, "PDM1 L Mux" },4272	{ "PDM1R", NULL, "PDM1 R Mux" },4273	{ "PDM2L", NULL, "PDM2 L Mux" },4274	{ "PDM2R", NULL, "PDM2 R Mux" },4275};4276 4277static const struct snd_soc_dapm_route rt5677_dmic2_clk_1[] = {4278	{ "DMIC L2", NULL, "DMIC1 power" },4279	{ "DMIC R2", NULL, "DMIC1 power" },4280};4281 4282static const struct snd_soc_dapm_route rt5677_dmic2_clk_2[] = {4283	{ "DMIC L2", NULL, "DMIC2 power" },4284	{ "DMIC R2", NULL, "DMIC2 power" },4285};4286 4287static int rt5677_hw_params(struct snd_pcm_substream *substream,4288	struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)4289{4290	struct snd_soc_component *component = dai->component;4291	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);4292	unsigned int val_len = 0, val_clk, mask_clk;4293	int pre_div, bclk_ms, frame_size;4294 4295	rt5677->lrck[dai->id] = params_rate(params);4296	pre_div = rl6231_get_clk_info(rt5677->sysclk, rt5677->lrck[dai->id]);4297	if (pre_div < 0) {4298		dev_err(component->dev, "Unsupported clock setting: sysclk=%dHz lrck=%dHz\n",4299			rt5677->sysclk, rt5677->lrck[dai->id]);4300		return -EINVAL;4301	}4302	frame_size = snd_soc_params_to_frame_size(params);4303	if (frame_size < 0) {4304		dev_err(component->dev, "Unsupported frame size: %d\n", frame_size);4305		return -EINVAL;4306	}4307	bclk_ms = frame_size > 32;4308	rt5677->bclk[dai->id] = rt5677->lrck[dai->id] * (32 << bclk_ms);4309 4310	dev_dbg(dai->dev, "bclk is %dHz and lrck is %dHz\n",4311		rt5677->bclk[dai->id], rt5677->lrck[dai->id]);4312	dev_dbg(dai->dev, "bclk_ms is %d and pre_div is %d for iis %d\n",4313				bclk_ms, pre_div, dai->id);4314 4315	switch (params_width(params)) {4316	case 16:4317		break;4318	case 20:4319		val_len |= RT5677_I2S_DL_20;4320		break;4321	case 24:4322		val_len |= RT5677_I2S_DL_24;4323		break;4324	case 8:4325		val_len |= RT5677_I2S_DL_8;4326		break;4327	default:4328		return -EINVAL;4329	}4330 4331	switch (dai->id) {4332	case RT5677_AIF1:4333		mask_clk = RT5677_I2S_PD1_MASK;4334		val_clk = pre_div << RT5677_I2S_PD1_SFT;4335		regmap_update_bits(rt5677->regmap, RT5677_I2S1_SDP,4336			RT5677_I2S_DL_MASK, val_len);4337		regmap_update_bits(rt5677->regmap, RT5677_CLK_TREE_CTRL1,4338			mask_clk, val_clk);4339		break;4340	case RT5677_AIF2:4341		mask_clk = RT5677_I2S_PD2_MASK;4342		val_clk = pre_div << RT5677_I2S_PD2_SFT;4343		regmap_update_bits(rt5677->regmap, RT5677_I2S2_SDP,4344			RT5677_I2S_DL_MASK, val_len);4345		regmap_update_bits(rt5677->regmap, RT5677_CLK_TREE_CTRL1,4346			mask_clk, val_clk);4347		break;4348	case RT5677_AIF3:4349		mask_clk = RT5677_I2S_BCLK_MS3_MASK | RT5677_I2S_PD3_MASK;4350		val_clk = bclk_ms << RT5677_I2S_BCLK_MS3_SFT |4351			pre_div << RT5677_I2S_PD3_SFT;4352		regmap_update_bits(rt5677->regmap, RT5677_I2S3_SDP,4353			RT5677_I2S_DL_MASK, val_len);4354		regmap_update_bits(rt5677->regmap, RT5677_CLK_TREE_CTRL1,4355			mask_clk, val_clk);4356		break;4357	case RT5677_AIF4:4358		mask_clk = RT5677_I2S_BCLK_MS4_MASK | RT5677_I2S_PD4_MASK;4359		val_clk = bclk_ms << RT5677_I2S_BCLK_MS4_SFT |4360			pre_div << RT5677_I2S_PD4_SFT;4361		regmap_update_bits(rt5677->regmap, RT5677_I2S4_SDP,4362			RT5677_I2S_DL_MASK, val_len);4363		regmap_update_bits(rt5677->regmap, RT5677_CLK_TREE_CTRL1,4364			mask_clk, val_clk);4365		break;4366	default:4367		break;4368	}4369 4370	return 0;4371}4372 4373static int rt5677_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)4374{4375	struct snd_soc_component *component = dai->component;4376	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);4377	unsigned int reg_val = 0;4378 4379	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {4380	case SND_SOC_DAIFMT_CBM_CFM:4381		rt5677->master[dai->id] = 1;4382		break;4383	case SND_SOC_DAIFMT_CBS_CFS:4384		reg_val |= RT5677_I2S_MS_S;4385		rt5677->master[dai->id] = 0;4386		break;4387	default:4388		return -EINVAL;4389	}4390 4391	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {4392	case SND_SOC_DAIFMT_NB_NF:4393		break;4394	case SND_SOC_DAIFMT_IB_NF:4395		reg_val |= RT5677_I2S_BP_INV;4396		break;4397	default:4398		return -EINVAL;4399	}4400 4401	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {4402	case SND_SOC_DAIFMT_I2S:4403		break;4404	case SND_SOC_DAIFMT_LEFT_J:4405		reg_val |= RT5677_I2S_DF_LEFT;4406		break;4407	case SND_SOC_DAIFMT_DSP_A:4408		reg_val |= RT5677_I2S_DF_PCM_A;4409		break;4410	case SND_SOC_DAIFMT_DSP_B:4411		reg_val |= RT5677_I2S_DF_PCM_B;4412		break;4413	default:4414		return -EINVAL;4415	}4416 4417	switch (dai->id) {4418	case RT5677_AIF1:4419		regmap_update_bits(rt5677->regmap, RT5677_I2S1_SDP,4420			RT5677_I2S_MS_MASK | RT5677_I2S_BP_MASK |4421			RT5677_I2S_DF_MASK, reg_val);4422		break;4423	case RT5677_AIF2:4424		regmap_update_bits(rt5677->regmap, RT5677_I2S2_SDP,4425			RT5677_I2S_MS_MASK | RT5677_I2S_BP_MASK |4426			RT5677_I2S_DF_MASK, reg_val);4427		break;4428	case RT5677_AIF3:4429		regmap_update_bits(rt5677->regmap, RT5677_I2S3_SDP,4430			RT5677_I2S_MS_MASK | RT5677_I2S_BP_MASK |4431			RT5677_I2S_DF_MASK, reg_val);4432		break;4433	case RT5677_AIF4:4434		regmap_update_bits(rt5677->regmap, RT5677_I2S4_SDP,4435			RT5677_I2S_MS_MASK | RT5677_I2S_BP_MASK |4436			RT5677_I2S_DF_MASK, reg_val);4437		break;4438	default:4439		break;4440	}4441 4442 4443	return 0;4444}4445 4446static int rt5677_set_dai_sysclk(struct snd_soc_dai *dai,4447		int clk_id, unsigned int freq, int dir)4448{4449	struct snd_soc_component *component = dai->component;4450	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);4451	unsigned int reg_val = 0;4452 4453	if (freq == rt5677->sysclk && clk_id == rt5677->sysclk_src)4454		return 0;4455 4456	switch (clk_id) {4457	case RT5677_SCLK_S_MCLK:4458		reg_val |= RT5677_SCLK_SRC_MCLK;4459		break;4460	case RT5677_SCLK_S_PLL1:4461		reg_val |= RT5677_SCLK_SRC_PLL1;4462		break;4463	case RT5677_SCLK_S_RCCLK:4464		reg_val |= RT5677_SCLK_SRC_RCCLK;4465		break;4466	default:4467		dev_err(component->dev, "Invalid clock id (%d)\n", clk_id);4468		return -EINVAL;4469	}4470	regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK1,4471		RT5677_SCLK_SRC_MASK, reg_val);4472	rt5677->sysclk = freq;4473	rt5677->sysclk_src = clk_id;4474 4475	dev_dbg(dai->dev, "Sysclk is %dHz and clock id is %d\n", freq, clk_id);4476 4477	return 0;4478}4479 4480/**4481 * rt5677_pll_calc - Calcualte PLL M/N/K code.4482 * @freq_in: external clock provided to codec.4483 * @freq_out: target clock which codec works on.4484 * @pll_code: Pointer to structure with M, N, K, bypass K and bypass M flag.4485 *4486 * Calcualte M/N/K code and bypass K/M flag to configure PLL for codec.4487 *4488 * Returns 0 for success or negative error code.4489 */4490static int rt5677_pll_calc(const unsigned int freq_in,4491	const unsigned int freq_out, struct rl6231_pll_code *pll_code)4492{4493	if (RT5677_PLL_INP_MIN > freq_in)4494		return -EINVAL;4495 4496	return rl6231_pll_calc(freq_in, freq_out, pll_code);4497}4498 4499static int rt5677_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source,4500			unsigned int freq_in, unsigned int freq_out)4501{4502	struct snd_soc_component *component = dai->component;4503	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);4504	struct rl6231_pll_code pll_code;4505	int ret;4506 4507	if (source == rt5677->pll_src && freq_in == rt5677->pll_in &&4508	    freq_out == rt5677->pll_out)4509		return 0;4510 4511	if (!freq_in || !freq_out) {4512		dev_dbg(component->dev, "PLL disabled\n");4513 4514		rt5677->pll_in = 0;4515		rt5677->pll_out = 0;4516		regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK1,4517			RT5677_SCLK_SRC_MASK, RT5677_SCLK_SRC_MCLK);4518		return 0;4519	}4520 4521	switch (source) {4522	case RT5677_PLL1_S_MCLK:4523		regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK1,4524			RT5677_PLL1_SRC_MASK, RT5677_PLL1_SRC_MCLK);4525		break;4526	case RT5677_PLL1_S_BCLK1:4527	case RT5677_PLL1_S_BCLK2:4528	case RT5677_PLL1_S_BCLK3:4529	case RT5677_PLL1_S_BCLK4:4530		switch (dai->id) {4531		case RT5677_AIF1:4532			regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK1,4533				RT5677_PLL1_SRC_MASK, RT5677_PLL1_SRC_BCLK1);4534			break;4535		case RT5677_AIF2:4536			regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK1,4537				RT5677_PLL1_SRC_MASK, RT5677_PLL1_SRC_BCLK2);4538			break;4539		case RT5677_AIF3:4540			regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK1,4541				RT5677_PLL1_SRC_MASK, RT5677_PLL1_SRC_BCLK3);4542			break;4543		case RT5677_AIF4:4544			regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK1,4545				RT5677_PLL1_SRC_MASK, RT5677_PLL1_SRC_BCLK4);4546			break;4547		default:4548			break;4549		}4550		break;4551	default:4552		dev_err(component->dev, "Unknown PLL source %d\n", source);4553		return -EINVAL;4554	}4555 4556	ret = rt5677_pll_calc(freq_in, freq_out, &pll_code);4557	if (ret < 0) {4558		dev_err(component->dev, "Unsupported input clock %d\n", freq_in);4559		return ret;4560	}4561 4562	dev_dbg(component->dev, "m_bypass=%d m=%d n=%d k=%d\n",4563		pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code),4564		pll_code.n_code, pll_code.k_code);4565 4566	regmap_write(rt5677->regmap, RT5677_PLL1_CTRL1,4567		pll_code.n_code << RT5677_PLL_N_SFT | pll_code.k_code);4568	regmap_write(rt5677->regmap, RT5677_PLL1_CTRL2,4569		((pll_code.m_bp ? 0 : pll_code.m_code) << RT5677_PLL_M_SFT) |4570		(pll_code.m_bp << RT5677_PLL_M_BP_SFT));4571 4572	rt5677->pll_in = freq_in;4573	rt5677->pll_out = freq_out;4574	rt5677->pll_src = source;4575 4576	return 0;4577}4578 4579static int rt5677_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,4580			unsigned int rx_mask, int slots, int slot_width)4581{4582	struct snd_soc_component *component = dai->component;4583	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);4584	unsigned int val = 0, slot_width_25 = 0;4585 4586	if (rx_mask || tx_mask)4587		val |= (1 << 12);4588 4589	switch (slots) {4590	case 4:4591		val |= (1 << 10);4592		break;4593	case 6:4594		val |= (2 << 10);4595		break;4596	case 8:4597		val |= (3 << 10);4598		break;4599	case 2:4600	default:4601		break;4602	}4603 4604	switch (slot_width) {4605	case 20:4606		val |= (1 << 8);4607		break;4608	case 25:4609		slot_width_25 = 0x8080;4610		fallthrough;4611	case 24:4612		val |= (2 << 8);4613		break;4614	case 32:4615		val |= (3 << 8);4616		break;4617	case 16:4618	default:4619		break;4620	}4621 4622	switch (dai->id) {4623	case RT5677_AIF1:4624		regmap_update_bits(rt5677->regmap, RT5677_TDM1_CTRL1, 0x1f00,4625			val);4626		regmap_update_bits(rt5677->regmap, RT5677_DIG_MISC, 0x8000,4627			slot_width_25);4628		break;4629	case RT5677_AIF2:4630		regmap_update_bits(rt5677->regmap, RT5677_TDM2_CTRL1, 0x1f00,4631			val);4632		regmap_update_bits(rt5677->regmap, RT5677_DIG_MISC, 0x80,4633			slot_width_25);4634		break;4635	default:4636		break;4637	}4638 4639	return 0;4640}4641 4642static int rt5677_set_bias_level(struct snd_soc_component *component,4643			enum snd_soc_bias_level level)4644{4645	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);4646	enum snd_soc_bias_level prev_bias =4647		snd_soc_component_get_bias_level(component);4648 4649	switch (level) {4650	case SND_SOC_BIAS_ON:4651		break;4652 4653	case SND_SOC_BIAS_PREPARE:4654		if (prev_bias == SND_SOC_BIAS_STANDBY) {4655 4656			regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG1,4657				RT5677_LDO1_SEL_MASK | RT5677_LDO2_SEL_MASK,4658				5 << RT5677_LDO1_SEL_SFT |4659				5 << RT5677_LDO2_SEL_SFT);4660			regmap_update_bits(rt5677->regmap,4661				RT5677_PR_BASE + RT5677_BIAS_CUR4,4662				0x0f00, 0x0f00);4663			regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG1,4664				RT5677_PWR_FV1 | RT5677_PWR_FV2 |4665				RT5677_PWR_VREF1 | RT5677_PWR_MB |4666				RT5677_PWR_BG | RT5677_PWR_VREF2,4667				RT5677_PWR_VREF1 | RT5677_PWR_MB |4668				RT5677_PWR_BG | RT5677_PWR_VREF2);4669			rt5677->is_vref_slow = false;4670			regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,4671				RT5677_PWR_CORE, RT5677_PWR_CORE);4672			regmap_update_bits(rt5677->regmap, RT5677_DIG_MISC,4673				0x1, 0x1);4674		}4675		break;4676 4677	case SND_SOC_BIAS_STANDBY:4678		if (prev_bias == SND_SOC_BIAS_OFF &&4679				rt5677->dsp_vad_en_request) {4680			/* Re-enable the DSP if it was turned off at suspend */4681			rt5677->dsp_vad_en = true;4682			/* The delay is to wait for MCLK */4683			schedule_delayed_work(&rt5677->dsp_work,4684					msecs_to_jiffies(1000));4685		}4686		break;4687 4688	case SND_SOC_BIAS_OFF:4689		flush_delayed_work(&rt5677->dsp_work);4690		if (rt5677->is_dsp_mode) {4691			/* Turn off the DSP before suspend */4692			rt5677->dsp_vad_en = false;4693			schedule_delayed_work(&rt5677->dsp_work, 0);4694			flush_delayed_work(&rt5677->dsp_work);4695		}4696 4697		regmap_update_bits(rt5677->regmap, RT5677_DIG_MISC, 0x1, 0x0);4698		regmap_write(rt5677->regmap, RT5677_PWR_DIG1, 0x0000);4699		regmap_write(rt5677->regmap, RT5677_PWR_ANLG1,4700			2 << RT5677_LDO1_SEL_SFT |4701			2 << RT5677_LDO2_SEL_SFT);4702		regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,4703			RT5677_PWR_CORE, 0);4704		regmap_update_bits(rt5677->regmap,4705			RT5677_PR_BASE + RT5677_BIAS_CUR4, 0x0f00, 0x0000);4706 4707		if (rt5677->dsp_vad_en)4708			rt5677_set_dsp_vad(component, true);4709		break;4710 4711	default:4712		break;4713	}4714 4715	return 0;4716}4717 4718static int rt5677_update_gpio_bits(struct rt5677_priv *rt5677, unsigned offset, int m, int v)4719{4720	unsigned int bank = offset / 5;4721	unsigned int shift = (offset % 5) * 3;4722	unsigned int reg = bank ? RT5677_GPIO_CTRL3 : RT5677_GPIO_CTRL2;4723 4724	return regmap_update_bits(rt5677->regmap, reg, m << shift, v << shift);4725}4726 4727#ifdef CONFIG_GPIOLIB4728static void rt5677_gpio_set(struct gpio_chip *chip, unsigned offset, int value)4729{4730	struct rt5677_priv *rt5677 = gpiochip_get_data(chip);4731	int level = value ? RT5677_GPIOx_OUT_HI : RT5677_GPIOx_OUT_LO;4732	int m = RT5677_GPIOx_OUT_MASK;4733 4734	rt5677_update_gpio_bits(rt5677, offset, m, level);4735}4736 4737static int rt5677_gpio_direction_out(struct gpio_chip *chip,4738				     unsigned offset, int value)4739{4740	struct rt5677_priv *rt5677 = gpiochip_get_data(chip);4741	int level = value ? RT5677_GPIOx_OUT_HI : RT5677_GPIOx_OUT_LO;4742	int m = RT5677_GPIOx_DIR_MASK | RT5677_GPIOx_OUT_MASK;4743	int v = RT5677_GPIOx_DIR_OUT | level;4744 4745	return rt5677_update_gpio_bits(rt5677, offset, m, v);4746}4747 4748static int rt5677_gpio_get(struct gpio_chip *chip, unsigned offset)4749{4750	struct rt5677_priv *rt5677 = gpiochip_get_data(chip);4751	int value, ret;4752 4753	ret = regmap_read(rt5677->regmap, RT5677_GPIO_ST, &value);4754	if (ret < 0)4755		return ret;4756 4757	return (value & (0x1 << offset)) >> offset;4758}4759 4760static int rt5677_gpio_direction_in(struct gpio_chip *chip, unsigned offset)4761{4762	struct rt5677_priv *rt5677 = gpiochip_get_data(chip);4763	int m = RT5677_GPIOx_DIR_MASK;4764	int v = RT5677_GPIOx_DIR_IN;4765 4766	return rt5677_update_gpio_bits(rt5677, offset, m, v);4767}4768 4769/*4770 * Configures the GPIO as4771 *   0 - floating4772 *   1 - pull down4773 *   2 - pull up4774 */4775static void rt5677_gpio_config(struct rt5677_priv *rt5677, unsigned offset,4776		int value)4777{4778	int shift;4779 4780	switch (offset) {4781	case RT5677_GPIO1 ... RT5677_GPIO2:4782		shift = 2 * (1 - offset);4783		regmap_update_bits(rt5677->regmap,4784			RT5677_PR_BASE + RT5677_DIG_IN_PIN_ST_CTRL2,4785			0x3 << shift,4786			(value & 0x3) << shift);4787		break;4788 4789	case RT5677_GPIO3 ... RT5677_GPIO6:4790		shift = 2 * (9 - offset);4791		regmap_update_bits(rt5677->regmap,4792			RT5677_PR_BASE + RT5677_DIG_IN_PIN_ST_CTRL3,4793			0x3 << shift,4794			(value & 0x3) << shift);4795		break;4796 4797	default:4798		break;4799	}4800}4801 4802static int rt5677_to_irq(struct gpio_chip *chip, unsigned offset)4803{4804	struct rt5677_priv *rt5677 = gpiochip_get_data(chip);4805	int irq;4806 4807	if ((rt5677->pdata.jd1_gpio == 1 && offset == RT5677_GPIO1) ||4808		(rt5677->pdata.jd1_gpio == 2 &&4809			offset == RT5677_GPIO2) ||4810		(rt5677->pdata.jd1_gpio == 3 &&4811			offset == RT5677_GPIO3)) {4812		irq = RT5677_IRQ_JD1;4813	} else if ((rt5677->pdata.jd2_gpio == 1 && offset == RT5677_GPIO4) ||4814		(rt5677->pdata.jd2_gpio == 2 &&4815			offset == RT5677_GPIO5) ||4816		(rt5677->pdata.jd2_gpio == 3 &&4817			offset == RT5677_GPIO6)) {4818		irq = RT5677_IRQ_JD2;4819	} else if ((rt5677->pdata.jd3_gpio == 1 &&4820			offset == RT5677_GPIO4) ||4821		(rt5677->pdata.jd3_gpio == 2 &&4822			offset == RT5677_GPIO5) ||4823		(rt5677->pdata.jd3_gpio == 3 &&4824			offset == RT5677_GPIO6)) {4825		irq = RT5677_IRQ_JD3;4826	} else {4827		return -ENXIO;4828	}4829 4830	return irq_create_mapping(rt5677->domain, irq);4831}4832 4833static const struct gpio_chip rt5677_template_chip = {4834	.label			= RT5677_DRV_NAME,4835	.owner			= THIS_MODULE,4836	.direction_output	= rt5677_gpio_direction_out,4837	.set			= rt5677_gpio_set,4838	.direction_input	= rt5677_gpio_direction_in,4839	.get			= rt5677_gpio_get,4840	.to_irq			= rt5677_to_irq,4841	.can_sleep		= 1,4842};4843 4844static void rt5677_init_gpio(struct i2c_client *i2c)4845{4846	struct rt5677_priv *rt5677 = i2c_get_clientdata(i2c);4847	int ret;4848 4849	rt5677->gpio_chip = rt5677_template_chip;4850	rt5677->gpio_chip.ngpio = RT5677_GPIO_NUM;4851	rt5677->gpio_chip.parent = &i2c->dev;4852	rt5677->gpio_chip.base = -1;4853 4854	ret = gpiochip_add_data(&rt5677->gpio_chip, rt5677);4855	if (ret != 0)4856		dev_err(&i2c->dev, "Failed to add GPIOs: %d\n", ret);4857}4858 4859static void rt5677_free_gpio(struct i2c_client *i2c)4860{4861	struct rt5677_priv *rt5677 = i2c_get_clientdata(i2c);4862 4863	gpiochip_remove(&rt5677->gpio_chip);4864}4865#else4866static void rt5677_gpio_config(struct rt5677_priv *rt5677, unsigned offset,4867		int value)4868{4869}4870 4871static void rt5677_init_gpio(struct i2c_client *i2c)4872{4873}4874 4875static void rt5677_free_gpio(struct i2c_client *i2c)4876{4877}4878#endif4879 4880static int rt5677_probe(struct snd_soc_component *component)4881{4882	struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);4883	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);4884	int i;4885 4886	rt5677->component = component;4887 4888	if (rt5677->pdata.dmic2_clk_pin == RT5677_DMIC_CLK2) {4889		snd_soc_dapm_add_routes(dapm,4890			rt5677_dmic2_clk_2,4891			ARRAY_SIZE(rt5677_dmic2_clk_2));4892	} else { /*use dmic1 clock by default*/4893		snd_soc_dapm_add_routes(dapm,4894			rt5677_dmic2_clk_1,4895			ARRAY_SIZE(rt5677_dmic2_clk_1));4896	}4897 4898	snd_soc_component_force_bias_level(component, SND_SOC_BIAS_OFF);4899 4900	regmap_update_bits(rt5677->regmap, RT5677_DIG_MISC,4901			~RT5677_IRQ_DEBOUNCE_SEL_MASK, 0x0020);4902	regmap_write(rt5677->regmap, RT5677_PWR_DSP2,4903			RT5677_PWR_SLIM_ISO | RT5677_PWR_CORE_ISO);4904 4905	for (i = 0; i < RT5677_GPIO_NUM; i++)4906		rt5677_gpio_config(rt5677, i, rt5677->pdata.gpio_config[i]);4907 4908	mutex_init(&rt5677->dsp_cmd_lock);4909	mutex_init(&rt5677->dsp_pri_lock);4910 4911	return 0;4912}4913 4914static void rt5677_remove(struct snd_soc_component *component)4915{4916	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);4917 4918	cancel_delayed_work_sync(&rt5677->dsp_work);4919 4920	regmap_write(rt5677->regmap, RT5677_RESET, 0x10ec);4921	gpiod_set_value_cansleep(rt5677->pow_ldo2, 0);4922	gpiod_set_value_cansleep(rt5677->reset_pin, 1);4923}4924 4925#ifdef CONFIG_PM4926static int rt5677_suspend(struct snd_soc_component *component)4927{4928	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);4929 4930	if (rt5677->irq) {4931		cancel_delayed_work_sync(&rt5677->resume_irq_check);4932		disable_irq(rt5677->irq);4933	}4934 4935	if (!rt5677->dsp_vad_en) {4936		regcache_cache_only(rt5677->regmap, true);4937		regcache_mark_dirty(rt5677->regmap);4938 4939		gpiod_set_value_cansleep(rt5677->pow_ldo2, 0);4940		gpiod_set_value_cansleep(rt5677->reset_pin, 1);4941	}4942 4943	return 0;4944}4945 4946static int rt5677_resume(struct snd_soc_component *component)4947{4948	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);4949 4950	if (!rt5677->dsp_vad_en) {4951		rt5677->pll_src = 0;4952		rt5677->pll_in = 0;4953		rt5677->pll_out = 0;4954		gpiod_set_value_cansleep(rt5677->pow_ldo2, 1);4955		gpiod_set_value_cansleep(rt5677->reset_pin, 0);4956		if (rt5677->pow_ldo2 || rt5677->reset_pin)4957			msleep(10);4958 4959		regcache_cache_only(rt5677->regmap, false);4960		regcache_sync(rt5677->regmap);4961	}4962 4963	if (rt5677->irq) {4964		enable_irq(rt5677->irq);4965		schedule_delayed_work(&rt5677->resume_irq_check, 0);4966	}4967 4968	return 0;4969}4970#else4971#define rt5677_suspend NULL4972#define rt5677_resume NULL4973#endif4974 4975static int rt5677_read(void *context, unsigned int reg, unsigned int *val)4976{4977	struct i2c_client *client = context;4978	struct rt5677_priv *rt5677 = i2c_get_clientdata(client);4979 4980	if (rt5677->is_dsp_mode) {4981		if (reg > 0xff) {4982			mutex_lock(&rt5677->dsp_pri_lock);4983			rt5677_dsp_mode_i2c_write(rt5677, RT5677_PRIV_INDEX,4984				reg & 0xff);4985			rt5677_dsp_mode_i2c_read(rt5677, RT5677_PRIV_DATA, val);4986			mutex_unlock(&rt5677->dsp_pri_lock);4987		} else {4988			rt5677_dsp_mode_i2c_read(rt5677, reg, val);4989		}4990	} else {4991		regmap_read(rt5677->regmap_physical, reg, val);4992	}4993 4994	return 0;4995}4996 4997static int rt5677_write(void *context, unsigned int reg, unsigned int val)4998{4999	struct i2c_client *client = context;5000	struct rt5677_priv *rt5677 = i2c_get_clientdata(client);5001 5002	if (rt5677->is_dsp_mode) {5003		if (reg > 0xff) {5004			mutex_lock(&rt5677->dsp_pri_lock);5005			rt5677_dsp_mode_i2c_write(rt5677, RT5677_PRIV_INDEX,5006				reg & 0xff);5007			rt5677_dsp_mode_i2c_write(rt5677, RT5677_PRIV_DATA,5008				val);5009			mutex_unlock(&rt5677->dsp_pri_lock);5010		} else {5011			rt5677_dsp_mode_i2c_write(rt5677, reg, val);5012		}5013	} else {5014		regmap_write(rt5677->regmap_physical, reg, val);5015	}5016 5017	return 0;5018}5019 5020#define RT5677_STEREO_RATES SNDRV_PCM_RATE_8000_960005021#define RT5677_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \5022			SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8)5023 5024static const struct snd_soc_dai_ops rt5677_aif_dai_ops = {5025	.hw_params = rt5677_hw_params,5026	.set_fmt = rt5677_set_dai_fmt,5027	.set_sysclk = rt5677_set_dai_sysclk,5028	.set_pll = rt5677_set_dai_pll,5029	.set_tdm_slot = rt5677_set_tdm_slot,5030};5031 5032static const struct snd_soc_dai_ops rt5677_dsp_dai_ops = {5033	.set_sysclk = rt5677_set_dai_sysclk,5034	.set_pll = rt5677_set_dai_pll,5035};5036 5037static struct snd_soc_dai_driver rt5677_dai[] = {5038	{5039		.name = "rt5677-aif1",5040		.id = RT5677_AIF1,5041		.playback = {5042			.stream_name = "AIF1 Playback",5043			.channels_min = 1,5044			.channels_max = 2,5045			.rates = RT5677_STEREO_RATES,5046			.formats = RT5677_FORMATS,5047		},5048		.capture = {5049			.stream_name = "AIF1 Capture",5050			.channels_min = 1,5051			.channels_max = 2,5052			.rates = RT5677_STEREO_RATES,5053			.formats = RT5677_FORMATS,5054		},5055		.ops = &rt5677_aif_dai_ops,5056	},5057	{5058		.name = "rt5677-aif2",5059		.id = RT5677_AIF2,5060		.playback = {5061			.stream_name = "AIF2 Playback",5062			.channels_min = 1,5063			.channels_max = 2,5064			.rates = RT5677_STEREO_RATES,5065			.formats = RT5677_FORMATS,5066		},5067		.capture = {5068			.stream_name = "AIF2 Capture",5069			.channels_min = 1,5070			.channels_max = 2,5071			.rates = RT5677_STEREO_RATES,5072			.formats = RT5677_FORMATS,5073		},5074		.ops = &rt5677_aif_dai_ops,5075	},5076	{5077		.name = "rt5677-aif3",5078		.id = RT5677_AIF3,5079		.playback = {5080			.stream_name = "AIF3 Playback",5081			.channels_min = 1,5082			.channels_max = 2,5083			.rates = RT5677_STEREO_RATES,5084			.formats = RT5677_FORMATS,5085		},5086		.capture = {5087			.stream_name = "AIF3 Capture",5088			.channels_min = 1,5089			.channels_max = 2,5090			.rates = RT5677_STEREO_RATES,5091			.formats = RT5677_FORMATS,5092		},5093		.ops = &rt5677_aif_dai_ops,5094	},5095	{5096		.name = "rt5677-aif4",5097		.id = RT5677_AIF4,5098		.playback = {5099			.stream_name = "AIF4 Playback",5100			.channels_min = 1,5101			.channels_max = 2,5102			.rates = RT5677_STEREO_RATES,5103			.formats = RT5677_FORMATS,5104		},5105		.capture = {5106			.stream_name = "AIF4 Capture",5107			.channels_min = 1,5108			.channels_max = 2,5109			.rates = RT5677_STEREO_RATES,5110			.formats = RT5677_FORMATS,5111		},5112		.ops = &rt5677_aif_dai_ops,5113	},5114	{5115		.name = "rt5677-slimbus",5116		.id = RT5677_AIF5,5117		.playback = {5118			.stream_name = "SLIMBus Playback",5119			.channels_min = 1,5120			.channels_max = 2,5121			.rates = RT5677_STEREO_RATES,5122			.formats = RT5677_FORMATS,5123		},5124		.capture = {5125			.stream_name = "SLIMBus Capture",5126			.channels_min = 1,5127			.channels_max = 2,5128			.rates = RT5677_STEREO_RATES,5129			.formats = RT5677_FORMATS,5130		},5131		.ops = &rt5677_aif_dai_ops,5132	},5133	{5134		.name = "rt5677-dspbuffer",5135		.id = RT5677_DSPBUFF,5136		.capture = {5137			.stream_name = "DSP Buffer",5138			.channels_min = 1,5139			.channels_max = 1,5140			.rates = SNDRV_PCM_RATE_16000,5141			.formats = SNDRV_PCM_FMTBIT_S16_LE,5142		},5143		.ops = &rt5677_dsp_dai_ops,5144	},5145};5146 5147static const struct snd_soc_component_driver soc_component_dev_rt5677 = {5148	.name			= RT5677_DRV_NAME,5149	.probe			= rt5677_probe,5150	.remove			= rt5677_remove,5151	.suspend		= rt5677_suspend,5152	.resume			= rt5677_resume,5153	.set_bias_level		= rt5677_set_bias_level,5154	.controls		= rt5677_snd_controls,5155	.num_controls		= ARRAY_SIZE(rt5677_snd_controls),5156	.dapm_widgets		= rt5677_dapm_widgets,5157	.num_dapm_widgets	= ARRAY_SIZE(rt5677_dapm_widgets),5158	.dapm_routes		= rt5677_dapm_routes,5159	.num_dapm_routes	= ARRAY_SIZE(rt5677_dapm_routes),5160	.use_pmdown_time	= 1,5161	.endianness		= 1,5162};5163 5164static const struct regmap_config rt5677_regmap_physical = {5165	.name = "physical",5166	.reg_bits = 8,5167	.val_bits = 16,5168 5169	.max_register = RT5677_VENDOR_ID2 + 1 + (ARRAY_SIZE(rt5677_ranges) *5170						RT5677_PR_SPACING),5171	.readable_reg = rt5677_readable_register,5172 5173	.cache_type = REGCACHE_NONE,5174	.ranges = rt5677_ranges,5175	.num_ranges = ARRAY_SIZE(rt5677_ranges),5176};5177 5178static const struct regmap_config rt5677_regmap = {5179	.reg_bits = 8,5180	.val_bits = 16,5181 5182	.max_register = RT5677_VENDOR_ID2 + 1 + (ARRAY_SIZE(rt5677_ranges) *5183						RT5677_PR_SPACING),5184 5185	.volatile_reg = rt5677_volatile_register,5186	.readable_reg = rt5677_readable_register,5187	.reg_read = rt5677_read,5188	.reg_write = rt5677_write,5189 5190	.cache_type = REGCACHE_RBTREE,5191	.reg_defaults = rt5677_reg,5192	.num_reg_defaults = ARRAY_SIZE(rt5677_reg),5193	.ranges = rt5677_ranges,5194	.num_ranges = ARRAY_SIZE(rt5677_ranges),5195};5196 5197static const struct of_device_id rt5677_of_match[] = {5198	{ .compatible = "realtek,rt5677", .data = (const void *)RT5677 },5199	{ }5200};5201MODULE_DEVICE_TABLE(of, rt5677_of_match);5202 5203static const struct acpi_device_id rt5677_acpi_match[] = {5204	{ "RT5677CE", RT5677 },5205	{ }5206};5207MODULE_DEVICE_TABLE(acpi, rt5677_acpi_match);5208 5209static void rt5677_read_device_properties(struct rt5677_priv *rt5677,5210		struct device *dev)5211{5212	u32 val;5213 5214	rt5677->pdata.in1_diff =5215		device_property_read_bool(dev, "IN1") ||5216		device_property_read_bool(dev, "realtek,in1-differential");5217 5218	rt5677->pdata.in2_diff =5219		device_property_read_bool(dev, "IN2") ||5220		device_property_read_bool(dev, "realtek,in2-differential");5221 5222	rt5677->pdata.lout1_diff =5223		device_property_read_bool(dev, "OUT1") ||5224		device_property_read_bool(dev, "realtek,lout1-differential");5225 5226	rt5677->pdata.lout2_diff =5227		device_property_read_bool(dev, "OUT2") ||5228		device_property_read_bool(dev, "realtek,lout2-differential");5229 5230	rt5677->pdata.lout3_diff =5231		device_property_read_bool(dev, "OUT3") ||5232		device_property_read_bool(dev, "realtek,lout3-differential");5233 5234	device_property_read_u8_array(dev, "realtek,gpio-config",5235				      rt5677->pdata.gpio_config,5236				      RT5677_GPIO_NUM);5237 5238	if (!device_property_read_u32(dev, "DCLK", &val) ||5239	    !device_property_read_u32(dev, "realtek,dmic2_clk_pin", &val))5240		rt5677->pdata.dmic2_clk_pin = val;5241 5242	if (!device_property_read_u32(dev, "JD1", &val) ||5243	    !device_property_read_u32(dev, "realtek,jd1-gpio", &val))5244		rt5677->pdata.jd1_gpio = val;5245 5246	if (!device_property_read_u32(dev, "JD2", &val) ||5247	    !device_property_read_u32(dev, "realtek,jd2-gpio", &val))5248		rt5677->pdata.jd2_gpio = val;5249 5250	if (!device_property_read_u32(dev, "JD3", &val) ||5251	    !device_property_read_u32(dev, "realtek,jd3-gpio", &val))5252		rt5677->pdata.jd3_gpio = val;5253}5254 5255struct rt5677_irq_desc {5256	unsigned int enable_mask;5257	unsigned int status_mask;5258	unsigned int polarity_mask;5259};5260 5261static const struct rt5677_irq_desc rt5677_irq_descs[] = {5262	[RT5677_IRQ_JD1] = {5263		.enable_mask = RT5677_EN_IRQ_GPIO_JD1,5264		.status_mask = RT5677_STA_GPIO_JD1,5265		.polarity_mask = RT5677_INV_GPIO_JD1,5266	},5267	[RT5677_IRQ_JD2] = {5268		.enable_mask = RT5677_EN_IRQ_GPIO_JD2,5269		.status_mask = RT5677_STA_GPIO_JD2,5270		.polarity_mask = RT5677_INV_GPIO_JD2,5271	},5272	[RT5677_IRQ_JD3] = {5273		.enable_mask = RT5677_EN_IRQ_GPIO_JD3,5274		.status_mask = RT5677_STA_GPIO_JD3,5275		.polarity_mask = RT5677_INV_GPIO_JD3,5276	},5277};5278 5279static bool rt5677_check_hotword(struct rt5677_priv *rt5677)5280{5281	int reg_gpio;5282 5283	if (!rt5677->is_dsp_mode)5284		return false;5285 5286	if (regmap_read(rt5677->regmap, RT5677_GPIO_CTRL1, &reg_gpio))5287		return false;5288 5289	/* Firmware sets GPIO1 pin to be GPIO1 after hotword is detected */5290	if ((reg_gpio & RT5677_GPIO1_PIN_MASK) == RT5677_GPIO1_PIN_IRQ)5291		return false;5292 5293	/* Set GPIO1 pin back to be IRQ output for jack detect */5294	regmap_update_bits(rt5677->regmap, RT5677_GPIO_CTRL1,5295			RT5677_GPIO1_PIN_MASK, RT5677_GPIO1_PIN_IRQ);5296 5297	rt5677_spi_hotword_detected();5298	return true;5299}5300 5301static irqreturn_t rt5677_irq(int unused, void *data)5302{5303	struct rt5677_priv *rt5677 = data;5304	int ret, loop, i, reg_irq, virq;5305	bool irq_fired = false;5306 5307	mutex_lock(&rt5677->irq_lock);5308 5309	/*5310	 * Loop to handle interrupts until the last i2c read shows no pending5311	 * irqs. The interrupt line is shared by multiple interrupt sources.5312	 * After the regmap_read() below, a new interrupt source line may5313	 * become high before the regmap_write() finishes, so there isn't a5314	 * rising edge on the shared interrupt line for the new interrupt. Thus,5315	 * the loop is needed to avoid missing irqs.5316	 *5317	 * A safeguard of 20 loops is used to avoid hanging in the irq handler5318	 * if there is something wrong with the interrupt status update. The5319	 * interrupt sources here are audio jack plug/unplug events which5320	 * shouldn't happen at a high frequency for a long period of time.5321	 * Empirically, more than 3 loops have never been seen.5322	 */5323	for (loop = 0; loop < 20; loop++) {5324		/* Read interrupt status */5325		ret = regmap_read(rt5677->regmap, RT5677_IRQ_CTRL1, &reg_irq);5326		if (ret) {5327			dev_err(rt5677->dev, "failed reading IRQ status: %d\n",5328				ret);5329			goto exit;5330		}5331 5332		irq_fired = false;5333		for (i = 0; i < RT5677_IRQ_NUM; i++) {5334			if (reg_irq & rt5677_irq_descs[i].status_mask) {5335				irq_fired = true;5336				virq = irq_find_mapping(rt5677->domain, i);5337				if (virq)5338					handle_nested_irq(virq);5339 5340				/* Clear the interrupt by flipping the polarity5341				 * of the interrupt source line that fired5342				 */5343				reg_irq ^= rt5677_irq_descs[i].polarity_mask;5344			}5345		}5346 5347		/* Exit the loop only when we know for sure that GPIO1 pin5348		 * was low at some point since irq_lock was acquired. Any event5349		 * after that point creates a rising edge that triggers another5350		 * call to rt5677_irq().5351		 */5352		if (!irq_fired && !rt5677_check_hotword(rt5677))5353			goto exit;5354 5355		ret = regmap_write(rt5677->regmap, RT5677_IRQ_CTRL1, reg_irq);5356		if (ret) {5357			dev_err(rt5677->dev, "failed updating IRQ status: %d\n",5358				ret);5359			goto exit;5360		}5361	}5362exit:5363	WARN_ON_ONCE(loop == 20);5364	mutex_unlock(&rt5677->irq_lock);5365	if (irq_fired)5366		return IRQ_HANDLED;5367	else5368		return IRQ_NONE;5369}5370 5371static void rt5677_resume_irq_check(struct work_struct *work)5372{5373	int i, virq;5374	struct rt5677_priv *rt5677 =5375		container_of(work, struct rt5677_priv, resume_irq_check.work);5376 5377	/* This is needed to check and clear the interrupt status register5378	 * at resume. If the headset is plugged/unplugged when the device is5379	 * fully suspended, there won't be a rising edge at resume to trigger5380	 * the interrupt. Without this, we miss the next unplug/plug event.5381	 */5382	rt5677_irq(0, rt5677);5383 5384	/* Call all enabled jack detect irq handlers again. This is needed in5385	 * addition to the above check for a corner case caused by jack gpio5386	 * debounce. After codec irq is disabled at suspend, the delayed work5387	 * scheduled by soc-jack may run and read wrong jack gpio values, since5388	 * the regmap is in cache only mode. At resume, there is no irq because5389	 * rt5677_irq has already ran and cleared the irq status at suspend.5390	 * Without this explicit check, unplug the headset right after suspend5391	 * starts, then after resume the headset is still shown as plugged in.5392	 */5393	mutex_lock(&rt5677->irq_lock);5394	for (i = 0; i < RT5677_IRQ_NUM; i++) {5395		if (rt5677->irq_en & rt5677_irq_descs[i].enable_mask) {5396			virq = irq_find_mapping(rt5677->domain, i);5397			if (virq)5398				handle_nested_irq(virq);5399		}5400	}5401	mutex_unlock(&rt5677->irq_lock);5402}5403 5404static void rt5677_irq_bus_lock(struct irq_data *data)5405{5406	struct rt5677_priv *rt5677 = irq_data_get_irq_chip_data(data);5407 5408	mutex_lock(&rt5677->irq_lock);5409}5410 5411static void rt5677_irq_bus_sync_unlock(struct irq_data *data)5412{5413	struct rt5677_priv *rt5677 = irq_data_get_irq_chip_data(data);5414 5415	// Set the enable/disable bits for the jack detect IRQs.5416	regmap_update_bits(rt5677->regmap, RT5677_IRQ_CTRL1,5417			RT5677_EN_IRQ_GPIO_JD1 | RT5677_EN_IRQ_GPIO_JD2 |5418			RT5677_EN_IRQ_GPIO_JD3, rt5677->irq_en);5419	mutex_unlock(&rt5677->irq_lock);5420}5421 5422static void rt5677_irq_enable(struct irq_data *data)5423{5424	struct rt5677_priv *rt5677 = irq_data_get_irq_chip_data(data);5425 5426	rt5677->irq_en |= rt5677_irq_descs[data->hwirq].enable_mask;5427}5428 5429static void rt5677_irq_disable(struct irq_data *data)5430{5431	struct rt5677_priv *rt5677 = irq_data_get_irq_chip_data(data);5432 5433	rt5677->irq_en &= ~rt5677_irq_descs[data->hwirq].enable_mask;5434}5435 5436static struct irq_chip rt5677_irq_chip = {5437	.name			= "rt5677_irq_chip",5438	.irq_bus_lock		= rt5677_irq_bus_lock,5439	.irq_bus_sync_unlock	= rt5677_irq_bus_sync_unlock,5440	.irq_disable		= rt5677_irq_disable,5441	.irq_enable		= rt5677_irq_enable,5442};5443 5444static int rt5677_irq_map(struct irq_domain *h, unsigned int virq,5445			  irq_hw_number_t hw)5446{5447	struct rt5677_priv *rt5677 = h->host_data;5448 5449	irq_set_chip_data(virq, rt5677);5450	irq_set_chip(virq, &rt5677_irq_chip);5451	irq_set_nested_thread(virq, 1);5452	irq_set_noprobe(virq);5453	return 0;5454}5455 5456 5457static const struct irq_domain_ops rt5677_domain_ops = {5458	.map	= rt5677_irq_map,5459	.xlate	= irq_domain_xlate_twocell,5460};5461 5462static int rt5677_init_irq(struct i2c_client *i2c)5463{5464	int ret;5465	struct rt5677_priv *rt5677 = i2c_get_clientdata(i2c);5466	unsigned int jd_mask = 0, jd_val = 0;5467 5468	if (!rt5677->pdata.jd1_gpio &&5469		!rt5677->pdata.jd2_gpio &&5470		!rt5677->pdata.jd3_gpio)5471		return 0;5472 5473	if (!i2c->irq) {5474		dev_err(&i2c->dev, "No interrupt specified\n");5475		return -EINVAL;5476	}5477 5478	mutex_init(&rt5677->irq_lock);5479	INIT_DELAYED_WORK(&rt5677->resume_irq_check, rt5677_resume_irq_check);5480 5481	/*5482	 * Select RC as the debounce clock so that GPIO works even when5483	 * MCLK is gated which happens when there is no audio stream5484	 * (SND_SOC_BIAS_OFF).5485	 */5486	regmap_update_bits(rt5677->regmap, RT5677_DIG_MISC,5487			RT5677_IRQ_DEBOUNCE_SEL_MASK,5488			RT5677_IRQ_DEBOUNCE_SEL_RC);5489	/* Enable auto power on RC when GPIO states are changed */5490	regmap_update_bits(rt5677->regmap, RT5677_GEN_CTRL1, 0xff, 0xff);5491 5492	/* Select and enable jack detection sources per platform data */5493	if (rt5677->pdata.jd1_gpio) {5494		jd_mask	|= RT5677_SEL_GPIO_JD1_MASK;5495		jd_val	|= rt5677->pdata.jd1_gpio << RT5677_SEL_GPIO_JD1_SFT;5496	}5497	if (rt5677->pdata.jd2_gpio) {5498		jd_mask	|= RT5677_SEL_GPIO_JD2_MASK;5499		jd_val	|= rt5677->pdata.jd2_gpio << RT5677_SEL_GPIO_JD2_SFT;5500	}5501	if (rt5677->pdata.jd3_gpio) {5502		jd_mask	|= RT5677_SEL_GPIO_JD3_MASK;5503		jd_val	|= rt5677->pdata.jd3_gpio << RT5677_SEL_GPIO_JD3_SFT;5504	}5505	regmap_update_bits(rt5677->regmap, RT5677_JD_CTRL1, jd_mask, jd_val);5506 5507	/* Set GPIO1 pin to be IRQ output */5508	regmap_update_bits(rt5677->regmap, RT5677_GPIO_CTRL1,5509			RT5677_GPIO1_PIN_MASK, RT5677_GPIO1_PIN_IRQ);5510 5511	/* Ready to listen for interrupts */5512	rt5677->domain = irq_domain_create_linear(dev_fwnode(&i2c->dev),5513			RT5677_IRQ_NUM, &rt5677_domain_ops, rt5677);5514	if (!rt5677->domain) {5515		dev_err(&i2c->dev, "Failed to create IRQ domain\n");5516		return -ENOMEM;5517	}5518 5519	ret = devm_request_threaded_irq(&i2c->dev, i2c->irq, NULL, rt5677_irq,5520			IRQF_TRIGGER_RISING | IRQF_ONESHOT,5521			"rt5677", rt5677);5522	if (ret)5523		dev_err(&i2c->dev, "Failed to request IRQ: %d\n", ret);5524 5525	rt5677->irq = i2c->irq;5526 5527	return ret;5528}5529 5530static int rt5677_i2c_probe(struct i2c_client *i2c)5531{5532	struct device *dev = &i2c->dev;5533	struct rt5677_priv *rt5677;5534	int ret;5535	unsigned int val;5536 5537	rt5677 = devm_kzalloc(&i2c->dev, sizeof(struct rt5677_priv),5538				GFP_KERNEL);5539	if (rt5677 == NULL)5540		return -ENOMEM;5541 5542	rt5677->dev = &i2c->dev;5543	rt5677->set_dsp_vad = rt5677_set_dsp_vad;5544	INIT_DELAYED_WORK(&rt5677->dsp_work, rt5677_dsp_work);5545	i2c_set_clientdata(i2c, rt5677);5546 5547	rt5677->type = (enum rt5677_type)(uintptr_t)device_get_match_data(dev);5548	if (rt5677->type == 0)5549		return -EINVAL;5550 5551	rt5677_read_device_properties(rt5677, &i2c->dev);5552 5553	/* pow-ldo2 and reset are optional. The codec pins may be statically5554	 * connected on the board without gpios. If the gpio device property5555	 * isn't specified, devm_gpiod_get_optional returns NULL.5556	 */5557	rt5677->pow_ldo2 = devm_gpiod_get_optional(&i2c->dev,5558			"realtek,pow-ldo2", GPIOD_OUT_HIGH);5559	if (IS_ERR(rt5677->pow_ldo2)) {5560		ret = PTR_ERR(rt5677->pow_ldo2);5561		dev_err(&i2c->dev, "Failed to request POW_LDO2: %d\n", ret);5562		return ret;5563	}5564	rt5677->reset_pin = devm_gpiod_get_optional(&i2c->dev,5565			"realtek,reset", GPIOD_OUT_LOW);5566	if (IS_ERR(rt5677->reset_pin)) {5567		ret = PTR_ERR(rt5677->reset_pin);5568		dev_err(&i2c->dev, "Failed to request RESET: %d\n", ret);5569		return ret;5570	}5571 5572	if (rt5677->pow_ldo2 || rt5677->reset_pin) {5573		/* Wait a while until I2C bus becomes available. The datasheet5574		 * does not specify the exact we should wait but startup5575		 * sequence mentiones at least a few milliseconds.5576		 */5577		msleep(10);5578	}5579 5580	rt5677->regmap_physical = devm_regmap_init_i2c(i2c,5581					&rt5677_regmap_physical);5582	if (IS_ERR(rt5677->regmap_physical)) {5583		ret = PTR_ERR(rt5677->regmap_physical);5584		dev_err(&i2c->dev, "Failed to allocate register map: %d\n",5585			ret);5586		return ret;5587	}5588 5589	rt5677->regmap = devm_regmap_init(&i2c->dev, NULL, i2c, &rt5677_regmap);5590	if (IS_ERR(rt5677->regmap)) {5591		ret = PTR_ERR(rt5677->regmap);5592		dev_err(&i2c->dev, "Failed to allocate register map: %d\n",5593			ret);5594		return ret;5595	}5596 5597	regmap_read(rt5677->regmap, RT5677_VENDOR_ID2, &val);5598	if (val != RT5677_DEVICE_ID) {5599		dev_err(&i2c->dev,5600			"Device with ID register %#x is not rt5677\n", val);5601		return -ENODEV;5602	}5603 5604	regmap_write(rt5677->regmap, RT5677_RESET, 0x10ec);5605 5606	ret = regmap_register_patch(rt5677->regmap, init_list,5607				    ARRAY_SIZE(init_list));5608	if (ret != 0)5609		dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret);5610 5611	if (rt5677->pdata.in1_diff)5612		regmap_update_bits(rt5677->regmap, RT5677_IN1,5613					RT5677_IN_DF1, RT5677_IN_DF1);5614 5615	if (rt5677->pdata.in2_diff)5616		regmap_update_bits(rt5677->regmap, RT5677_IN1,5617					RT5677_IN_DF2, RT5677_IN_DF2);5618 5619	if (rt5677->pdata.lout1_diff)5620		regmap_update_bits(rt5677->regmap, RT5677_LOUT1,5621					RT5677_LOUT1_L_DF, RT5677_LOUT1_L_DF);5622 5623	if (rt5677->pdata.lout2_diff)5624		regmap_update_bits(rt5677->regmap, RT5677_LOUT1,5625					RT5677_LOUT2_L_DF, RT5677_LOUT2_L_DF);5626 5627	if (rt5677->pdata.lout3_diff)5628		regmap_update_bits(rt5677->regmap, RT5677_LOUT1,5629					RT5677_LOUT3_L_DF, RT5677_LOUT3_L_DF);5630 5631	if (rt5677->pdata.dmic2_clk_pin == RT5677_DMIC_CLK2) {5632		regmap_update_bits(rt5677->regmap, RT5677_GEN_CTRL2,5633					RT5677_GPIO5_FUNC_MASK,5634					RT5677_GPIO5_FUNC_DMIC);5635		rt5677_update_gpio_bits(rt5677, RT5677_GPIO5,5636					RT5677_GPIOx_DIR_MASK,5637					RT5677_GPIOx_DIR_OUT);5638	}5639 5640	if (rt5677->pdata.micbias1_vdd_3v3)5641		regmap_update_bits(rt5677->regmap, RT5677_MICBIAS,5642			RT5677_MICBIAS1_CTRL_VDD_MASK,5643			RT5677_MICBIAS1_CTRL_VDD_3_3V);5644 5645	rt5677_init_gpio(i2c);5646	ret = rt5677_init_irq(i2c);5647	if (ret)5648		dev_err(&i2c->dev, "Failed to initialize irq: %d\n", ret);5649 5650	return devm_snd_soc_register_component(&i2c->dev,5651				      &soc_component_dev_rt5677,5652				      rt5677_dai, ARRAY_SIZE(rt5677_dai));5653}5654 5655static void rt5677_i2c_remove(struct i2c_client *i2c)5656{5657	rt5677_free_gpio(i2c);5658}5659 5660static struct i2c_driver rt5677_i2c_driver = {5661	.driver = {5662		.name = RT5677_DRV_NAME,5663		.of_match_table = rt5677_of_match,5664		.acpi_match_table = rt5677_acpi_match,5665	},5666	.probe    = rt5677_i2c_probe,5667	.remove   = rt5677_i2c_remove,5668};5669module_i2c_driver(rt5677_i2c_driver);5670 5671MODULE_DESCRIPTION("ASoC RT5677 driver");5672MODULE_AUTHOR("Oder Chiou <oder_chiou@realtek.com>");5673MODULE_LICENSE("GPL v2");5674 5675MODULE_FIRMWARE("rt5677_elf_vad");5676