162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * rt5677.c  --  RT5677 ALSA SoC audio codec driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright 2013 Realtek Semiconductor Corp.
662306a36Sopenharmony_ci * Author: Oder Chiou <oder_chiou@realtek.com>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/delay.h>
1062306a36Sopenharmony_ci#include <linux/firmware.h>
1162306a36Sopenharmony_ci#include <linux/fs.h>
1262306a36Sopenharmony_ci#include <linux/i2c.h>
1362306a36Sopenharmony_ci#include <linux/init.h>
1462306a36Sopenharmony_ci#include <linux/interrupt.h>
1562306a36Sopenharmony_ci#include <linux/irqdomain.h>
1662306a36Sopenharmony_ci#include <linux/irq.h>
1762306a36Sopenharmony_ci#include <linux/module.h>
1862306a36Sopenharmony_ci#include <linux/moduleparam.h>
1962306a36Sopenharmony_ci#include <linux/platform_device.h>
2062306a36Sopenharmony_ci#include <linux/pm.h>
2162306a36Sopenharmony_ci#include <linux/property.h>
2262306a36Sopenharmony_ci#include <linux/regmap.h>
2362306a36Sopenharmony_ci#include <linux/spi/spi.h>
2462306a36Sopenharmony_ci#include <linux/workqueue.h>
2562306a36Sopenharmony_ci#include <sound/core.h>
2662306a36Sopenharmony_ci#include <sound/pcm.h>
2762306a36Sopenharmony_ci#include <sound/pcm_params.h>
2862306a36Sopenharmony_ci#include <sound/soc.h>
2962306a36Sopenharmony_ci#include <sound/soc-dapm.h>
3062306a36Sopenharmony_ci#include <sound/initval.h>
3162306a36Sopenharmony_ci#include <sound/tlv.h>
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci#include "rl6231.h"
3462306a36Sopenharmony_ci#include "rt5677.h"
3562306a36Sopenharmony_ci#include "rt5677-spi.h"
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci#define RT5677_DEVICE_ID 0x6327
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci/* Register controlling boot vector */
4062306a36Sopenharmony_ci#define RT5677_DSP_BOOT_VECTOR		0x1801f090
4162306a36Sopenharmony_ci#define RT5677_MODEL_ADDR		0x5FFC9800
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci#define RT5677_PR_RANGE_BASE (0xff + 1)
4462306a36Sopenharmony_ci#define RT5677_PR_SPACING 0x100
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci#define RT5677_PR_BASE (RT5677_PR_RANGE_BASE + (0 * RT5677_PR_SPACING))
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cistatic const struct regmap_range_cfg rt5677_ranges[] = {
4962306a36Sopenharmony_ci	{
5062306a36Sopenharmony_ci		.name = "PR",
5162306a36Sopenharmony_ci		.range_min = RT5677_PR_BASE,
5262306a36Sopenharmony_ci		.range_max = RT5677_PR_BASE + 0xfd,
5362306a36Sopenharmony_ci		.selector_reg = RT5677_PRIV_INDEX,
5462306a36Sopenharmony_ci		.selector_mask = 0xff,
5562306a36Sopenharmony_ci		.selector_shift = 0x0,
5662306a36Sopenharmony_ci		.window_start = RT5677_PRIV_DATA,
5762306a36Sopenharmony_ci		.window_len = 0x1,
5862306a36Sopenharmony_ci	},
5962306a36Sopenharmony_ci};
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_cistatic const struct reg_sequence init_list[] = {
6262306a36Sopenharmony_ci	{RT5677_ASRC_12,	0x0018},
6362306a36Sopenharmony_ci	{RT5677_PR_BASE + 0x3d,	0x364d},
6462306a36Sopenharmony_ci	{RT5677_PR_BASE + 0x17,	0x4fc0},
6562306a36Sopenharmony_ci	{RT5677_PR_BASE + 0x13,	0x0312},
6662306a36Sopenharmony_ci	{RT5677_PR_BASE + 0x1e,	0x0000},
6762306a36Sopenharmony_ci	{RT5677_PR_BASE + 0x12,	0x0eaa},
6862306a36Sopenharmony_ci	{RT5677_PR_BASE + 0x14,	0x018a},
6962306a36Sopenharmony_ci	{RT5677_PR_BASE + 0x15,	0x0490},
7062306a36Sopenharmony_ci	{RT5677_PR_BASE + 0x38,	0x0f71},
7162306a36Sopenharmony_ci	{RT5677_PR_BASE + 0x39,	0x0f71},
7262306a36Sopenharmony_ci};
7362306a36Sopenharmony_ci#define RT5677_INIT_REG_LEN ARRAY_SIZE(init_list)
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_cistatic const struct reg_default rt5677_reg[] = {
7662306a36Sopenharmony_ci	{RT5677_RESET			, 0x0000},
7762306a36Sopenharmony_ci	{RT5677_LOUT1			, 0xa800},
7862306a36Sopenharmony_ci	{RT5677_IN1			, 0x0000},
7962306a36Sopenharmony_ci	{RT5677_MICBIAS			, 0x0000},
8062306a36Sopenharmony_ci	{RT5677_SLIMBUS_PARAM		, 0x0000},
8162306a36Sopenharmony_ci	{RT5677_SLIMBUS_RX		, 0x0000},
8262306a36Sopenharmony_ci	{RT5677_SLIMBUS_CTRL		, 0x0000},
8362306a36Sopenharmony_ci	{RT5677_SIDETONE_CTRL		, 0x000b},
8462306a36Sopenharmony_ci	{RT5677_ANA_DAC1_2_3_SRC	, 0x0000},
8562306a36Sopenharmony_ci	{RT5677_IF_DSP_DAC3_4_MIXER	, 0x1111},
8662306a36Sopenharmony_ci	{RT5677_DAC4_DIG_VOL		, 0xafaf},
8762306a36Sopenharmony_ci	{RT5677_DAC3_DIG_VOL		, 0xafaf},
8862306a36Sopenharmony_ci	{RT5677_DAC1_DIG_VOL		, 0xafaf},
8962306a36Sopenharmony_ci	{RT5677_DAC2_DIG_VOL		, 0xafaf},
9062306a36Sopenharmony_ci	{RT5677_IF_DSP_DAC2_MIXER	, 0x0011},
9162306a36Sopenharmony_ci	{RT5677_STO1_ADC_DIG_VOL	, 0x2f2f},
9262306a36Sopenharmony_ci	{RT5677_MONO_ADC_DIG_VOL	, 0x2f2f},
9362306a36Sopenharmony_ci	{RT5677_STO1_2_ADC_BST		, 0x0000},
9462306a36Sopenharmony_ci	{RT5677_STO2_ADC_DIG_VOL	, 0x2f2f},
9562306a36Sopenharmony_ci	{RT5677_ADC_BST_CTRL2		, 0x0000},
9662306a36Sopenharmony_ci	{RT5677_STO3_4_ADC_BST		, 0x0000},
9762306a36Sopenharmony_ci	{RT5677_STO3_ADC_DIG_VOL	, 0x2f2f},
9862306a36Sopenharmony_ci	{RT5677_STO4_ADC_DIG_VOL	, 0x2f2f},
9962306a36Sopenharmony_ci	{RT5677_STO4_ADC_MIXER		, 0xd4c0},
10062306a36Sopenharmony_ci	{RT5677_STO3_ADC_MIXER		, 0xd4c0},
10162306a36Sopenharmony_ci	{RT5677_STO2_ADC_MIXER		, 0xd4c0},
10262306a36Sopenharmony_ci	{RT5677_STO1_ADC_MIXER		, 0xd4c0},
10362306a36Sopenharmony_ci	{RT5677_MONO_ADC_MIXER		, 0xd4d1},
10462306a36Sopenharmony_ci	{RT5677_ADC_IF_DSP_DAC1_MIXER	, 0x8080},
10562306a36Sopenharmony_ci	{RT5677_STO1_DAC_MIXER		, 0xaaaa},
10662306a36Sopenharmony_ci	{RT5677_MONO_DAC_MIXER		, 0xaaaa},
10762306a36Sopenharmony_ci	{RT5677_DD1_MIXER		, 0xaaaa},
10862306a36Sopenharmony_ci	{RT5677_DD2_MIXER		, 0xaaaa},
10962306a36Sopenharmony_ci	{RT5677_IF3_DATA		, 0x0000},
11062306a36Sopenharmony_ci	{RT5677_IF4_DATA		, 0x0000},
11162306a36Sopenharmony_ci	{RT5677_PDM_OUT_CTRL		, 0x8888},
11262306a36Sopenharmony_ci	{RT5677_PDM_DATA_CTRL1		, 0x0000},
11362306a36Sopenharmony_ci	{RT5677_PDM_DATA_CTRL2		, 0x0000},
11462306a36Sopenharmony_ci	{RT5677_PDM1_DATA_CTRL2		, 0x0000},
11562306a36Sopenharmony_ci	{RT5677_PDM1_DATA_CTRL3		, 0x0000},
11662306a36Sopenharmony_ci	{RT5677_PDM1_DATA_CTRL4		, 0x0000},
11762306a36Sopenharmony_ci	{RT5677_PDM2_DATA_CTRL2		, 0x0000},
11862306a36Sopenharmony_ci	{RT5677_PDM2_DATA_CTRL3		, 0x0000},
11962306a36Sopenharmony_ci	{RT5677_PDM2_DATA_CTRL4		, 0x0000},
12062306a36Sopenharmony_ci	{RT5677_TDM1_CTRL1		, 0x0300},
12162306a36Sopenharmony_ci	{RT5677_TDM1_CTRL2		, 0x0000},
12262306a36Sopenharmony_ci	{RT5677_TDM1_CTRL3		, 0x4000},
12362306a36Sopenharmony_ci	{RT5677_TDM1_CTRL4		, 0x0123},
12462306a36Sopenharmony_ci	{RT5677_TDM1_CTRL5		, 0x4567},
12562306a36Sopenharmony_ci	{RT5677_TDM2_CTRL1		, 0x0300},
12662306a36Sopenharmony_ci	{RT5677_TDM2_CTRL2		, 0x0000},
12762306a36Sopenharmony_ci	{RT5677_TDM2_CTRL3		, 0x4000},
12862306a36Sopenharmony_ci	{RT5677_TDM2_CTRL4		, 0x0123},
12962306a36Sopenharmony_ci	{RT5677_TDM2_CTRL5		, 0x4567},
13062306a36Sopenharmony_ci	{RT5677_I2C_MASTER_CTRL1	, 0x0001},
13162306a36Sopenharmony_ci	{RT5677_I2C_MASTER_CTRL2	, 0x0000},
13262306a36Sopenharmony_ci	{RT5677_I2C_MASTER_CTRL3	, 0x0000},
13362306a36Sopenharmony_ci	{RT5677_I2C_MASTER_CTRL4	, 0x0000},
13462306a36Sopenharmony_ci	{RT5677_I2C_MASTER_CTRL5	, 0x0000},
13562306a36Sopenharmony_ci	{RT5677_I2C_MASTER_CTRL6	, 0x0000},
13662306a36Sopenharmony_ci	{RT5677_I2C_MASTER_CTRL7	, 0x0000},
13762306a36Sopenharmony_ci	{RT5677_I2C_MASTER_CTRL8	, 0x0000},
13862306a36Sopenharmony_ci	{RT5677_DMIC_CTRL1		, 0x1505},
13962306a36Sopenharmony_ci	{RT5677_DMIC_CTRL2		, 0x0055},
14062306a36Sopenharmony_ci	{RT5677_HAP_GENE_CTRL1		, 0x0111},
14162306a36Sopenharmony_ci	{RT5677_HAP_GENE_CTRL2		, 0x0064},
14262306a36Sopenharmony_ci	{RT5677_HAP_GENE_CTRL3		, 0xef0e},
14362306a36Sopenharmony_ci	{RT5677_HAP_GENE_CTRL4		, 0xf0f0},
14462306a36Sopenharmony_ci	{RT5677_HAP_GENE_CTRL5		, 0xef0e},
14562306a36Sopenharmony_ci	{RT5677_HAP_GENE_CTRL6		, 0xf0f0},
14662306a36Sopenharmony_ci	{RT5677_HAP_GENE_CTRL7		, 0xef0e},
14762306a36Sopenharmony_ci	{RT5677_HAP_GENE_CTRL8		, 0xf0f0},
14862306a36Sopenharmony_ci	{RT5677_HAP_GENE_CTRL9		, 0xf000},
14962306a36Sopenharmony_ci	{RT5677_HAP_GENE_CTRL10		, 0x0000},
15062306a36Sopenharmony_ci	{RT5677_PWR_DIG1		, 0x0000},
15162306a36Sopenharmony_ci	{RT5677_PWR_DIG2		, 0x0000},
15262306a36Sopenharmony_ci	{RT5677_PWR_ANLG1		, 0x0055},
15362306a36Sopenharmony_ci	{RT5677_PWR_ANLG2		, 0x0000},
15462306a36Sopenharmony_ci	{RT5677_PWR_DSP1		, 0x0001},
15562306a36Sopenharmony_ci	{RT5677_PWR_DSP_ST		, 0x0000},
15662306a36Sopenharmony_ci	{RT5677_PWR_DSP2		, 0x0000},
15762306a36Sopenharmony_ci	{RT5677_ADC_DAC_HPF_CTRL1	, 0x0e00},
15862306a36Sopenharmony_ci	{RT5677_PRIV_INDEX		, 0x0000},
15962306a36Sopenharmony_ci	{RT5677_PRIV_DATA		, 0x0000},
16062306a36Sopenharmony_ci	{RT5677_I2S4_SDP		, 0x8000},
16162306a36Sopenharmony_ci	{RT5677_I2S1_SDP		, 0x8000},
16262306a36Sopenharmony_ci	{RT5677_I2S2_SDP		, 0x8000},
16362306a36Sopenharmony_ci	{RT5677_I2S3_SDP		, 0x8000},
16462306a36Sopenharmony_ci	{RT5677_CLK_TREE_CTRL1		, 0x1111},
16562306a36Sopenharmony_ci	{RT5677_CLK_TREE_CTRL2		, 0x1111},
16662306a36Sopenharmony_ci	{RT5677_CLK_TREE_CTRL3		, 0x0000},
16762306a36Sopenharmony_ci	{RT5677_PLL1_CTRL1		, 0x0000},
16862306a36Sopenharmony_ci	{RT5677_PLL1_CTRL2		, 0x0000},
16962306a36Sopenharmony_ci	{RT5677_PLL2_CTRL1		, 0x0c60},
17062306a36Sopenharmony_ci	{RT5677_PLL2_CTRL2		, 0x2000},
17162306a36Sopenharmony_ci	{RT5677_GLB_CLK1		, 0x0000},
17262306a36Sopenharmony_ci	{RT5677_GLB_CLK2		, 0x0000},
17362306a36Sopenharmony_ci	{RT5677_ASRC_1			, 0x0000},
17462306a36Sopenharmony_ci	{RT5677_ASRC_2			, 0x0000},
17562306a36Sopenharmony_ci	{RT5677_ASRC_3			, 0x0000},
17662306a36Sopenharmony_ci	{RT5677_ASRC_4			, 0x0000},
17762306a36Sopenharmony_ci	{RT5677_ASRC_5			, 0x0000},
17862306a36Sopenharmony_ci	{RT5677_ASRC_6			, 0x0000},
17962306a36Sopenharmony_ci	{RT5677_ASRC_7			, 0x0000},
18062306a36Sopenharmony_ci	{RT5677_ASRC_8			, 0x0000},
18162306a36Sopenharmony_ci	{RT5677_ASRC_9			, 0x0000},
18262306a36Sopenharmony_ci	{RT5677_ASRC_10			, 0x0000},
18362306a36Sopenharmony_ci	{RT5677_ASRC_11			, 0x0000},
18462306a36Sopenharmony_ci	{RT5677_ASRC_12			, 0x0018},
18562306a36Sopenharmony_ci	{RT5677_ASRC_13			, 0x0000},
18662306a36Sopenharmony_ci	{RT5677_ASRC_14			, 0x0000},
18762306a36Sopenharmony_ci	{RT5677_ASRC_15			, 0x0000},
18862306a36Sopenharmony_ci	{RT5677_ASRC_16			, 0x0000},
18962306a36Sopenharmony_ci	{RT5677_ASRC_17			, 0x0000},
19062306a36Sopenharmony_ci	{RT5677_ASRC_18			, 0x0000},
19162306a36Sopenharmony_ci	{RT5677_ASRC_19			, 0x0000},
19262306a36Sopenharmony_ci	{RT5677_ASRC_20			, 0x0000},
19362306a36Sopenharmony_ci	{RT5677_ASRC_21			, 0x000c},
19462306a36Sopenharmony_ci	{RT5677_ASRC_22			, 0x0000},
19562306a36Sopenharmony_ci	{RT5677_ASRC_23			, 0x0000},
19662306a36Sopenharmony_ci	{RT5677_VAD_CTRL1		, 0x2184},
19762306a36Sopenharmony_ci	{RT5677_VAD_CTRL2		, 0x010a},
19862306a36Sopenharmony_ci	{RT5677_VAD_CTRL3		, 0x0aea},
19962306a36Sopenharmony_ci	{RT5677_VAD_CTRL4		, 0x000c},
20062306a36Sopenharmony_ci	{RT5677_VAD_CTRL5		, 0x0000},
20162306a36Sopenharmony_ci	{RT5677_DSP_INB_CTRL1		, 0x0000},
20262306a36Sopenharmony_ci	{RT5677_DSP_INB_CTRL2		, 0x0000},
20362306a36Sopenharmony_ci	{RT5677_DSP_IN_OUTB_CTRL	, 0x0000},
20462306a36Sopenharmony_ci	{RT5677_DSP_OUTB0_1_DIG_VOL	, 0x2f2f},
20562306a36Sopenharmony_ci	{RT5677_DSP_OUTB2_3_DIG_VOL	, 0x2f2f},
20662306a36Sopenharmony_ci	{RT5677_DSP_OUTB4_5_DIG_VOL	, 0x2f2f},
20762306a36Sopenharmony_ci	{RT5677_DSP_OUTB6_7_DIG_VOL	, 0x2f2f},
20862306a36Sopenharmony_ci	{RT5677_ADC_EQ_CTRL1		, 0x6000},
20962306a36Sopenharmony_ci	{RT5677_ADC_EQ_CTRL2		, 0x0000},
21062306a36Sopenharmony_ci	{RT5677_EQ_CTRL1		, 0xc000},
21162306a36Sopenharmony_ci	{RT5677_EQ_CTRL2		, 0x0000},
21262306a36Sopenharmony_ci	{RT5677_EQ_CTRL3		, 0x0000},
21362306a36Sopenharmony_ci	{RT5677_SOFT_VOL_ZERO_CROSS1	, 0x0009},
21462306a36Sopenharmony_ci	{RT5677_JD_CTRL1		, 0x0000},
21562306a36Sopenharmony_ci	{RT5677_JD_CTRL2		, 0x0000},
21662306a36Sopenharmony_ci	{RT5677_JD_CTRL3		, 0x0000},
21762306a36Sopenharmony_ci	{RT5677_IRQ_CTRL1		, 0x0000},
21862306a36Sopenharmony_ci	{RT5677_IRQ_CTRL2		, 0x0000},
21962306a36Sopenharmony_ci	{RT5677_GPIO_ST			, 0x0000},
22062306a36Sopenharmony_ci	{RT5677_GPIO_CTRL1		, 0x0000},
22162306a36Sopenharmony_ci	{RT5677_GPIO_CTRL2		, 0x0000},
22262306a36Sopenharmony_ci	{RT5677_GPIO_CTRL3		, 0x0000},
22362306a36Sopenharmony_ci	{RT5677_STO1_ADC_HI_FILTER1	, 0xb320},
22462306a36Sopenharmony_ci	{RT5677_STO1_ADC_HI_FILTER2	, 0x0000},
22562306a36Sopenharmony_ci	{RT5677_MONO_ADC_HI_FILTER1	, 0xb300},
22662306a36Sopenharmony_ci	{RT5677_MONO_ADC_HI_FILTER2	, 0x0000},
22762306a36Sopenharmony_ci	{RT5677_STO2_ADC_HI_FILTER1	, 0xb300},
22862306a36Sopenharmony_ci	{RT5677_STO2_ADC_HI_FILTER2	, 0x0000},
22962306a36Sopenharmony_ci	{RT5677_STO3_ADC_HI_FILTER1	, 0xb300},
23062306a36Sopenharmony_ci	{RT5677_STO3_ADC_HI_FILTER2	, 0x0000},
23162306a36Sopenharmony_ci	{RT5677_STO4_ADC_HI_FILTER1	, 0xb300},
23262306a36Sopenharmony_ci	{RT5677_STO4_ADC_HI_FILTER2	, 0x0000},
23362306a36Sopenharmony_ci	{RT5677_MB_DRC_CTRL1		, 0x0f20},
23462306a36Sopenharmony_ci	{RT5677_DRC1_CTRL1		, 0x001f},
23562306a36Sopenharmony_ci	{RT5677_DRC1_CTRL2		, 0x020c},
23662306a36Sopenharmony_ci	{RT5677_DRC1_CTRL3		, 0x1f00},
23762306a36Sopenharmony_ci	{RT5677_DRC1_CTRL4		, 0x0000},
23862306a36Sopenharmony_ci	{RT5677_DRC1_CTRL5		, 0x0000},
23962306a36Sopenharmony_ci	{RT5677_DRC1_CTRL6		, 0x0029},
24062306a36Sopenharmony_ci	{RT5677_DRC2_CTRL1		, 0x001f},
24162306a36Sopenharmony_ci	{RT5677_DRC2_CTRL2		, 0x020c},
24262306a36Sopenharmony_ci	{RT5677_DRC2_CTRL3		, 0x1f00},
24362306a36Sopenharmony_ci	{RT5677_DRC2_CTRL4		, 0x0000},
24462306a36Sopenharmony_ci	{RT5677_DRC2_CTRL5		, 0x0000},
24562306a36Sopenharmony_ci	{RT5677_DRC2_CTRL6		, 0x0029},
24662306a36Sopenharmony_ci	{RT5677_DRC1_HL_CTRL1		, 0x8000},
24762306a36Sopenharmony_ci	{RT5677_DRC1_HL_CTRL2		, 0x0200},
24862306a36Sopenharmony_ci	{RT5677_DRC2_HL_CTRL1		, 0x8000},
24962306a36Sopenharmony_ci	{RT5677_DRC2_HL_CTRL2		, 0x0200},
25062306a36Sopenharmony_ci	{RT5677_DSP_INB1_SRC_CTRL1	, 0x5800},
25162306a36Sopenharmony_ci	{RT5677_DSP_INB1_SRC_CTRL2	, 0x0000},
25262306a36Sopenharmony_ci	{RT5677_DSP_INB1_SRC_CTRL3	, 0x0000},
25362306a36Sopenharmony_ci	{RT5677_DSP_INB1_SRC_CTRL4	, 0x0800},
25462306a36Sopenharmony_ci	{RT5677_DSP_INB2_SRC_CTRL1	, 0x5800},
25562306a36Sopenharmony_ci	{RT5677_DSP_INB2_SRC_CTRL2	, 0x0000},
25662306a36Sopenharmony_ci	{RT5677_DSP_INB2_SRC_CTRL3	, 0x0000},
25762306a36Sopenharmony_ci	{RT5677_DSP_INB2_SRC_CTRL4	, 0x0800},
25862306a36Sopenharmony_ci	{RT5677_DSP_INB3_SRC_CTRL1	, 0x5800},
25962306a36Sopenharmony_ci	{RT5677_DSP_INB3_SRC_CTRL2	, 0x0000},
26062306a36Sopenharmony_ci	{RT5677_DSP_INB3_SRC_CTRL3	, 0x0000},
26162306a36Sopenharmony_ci	{RT5677_DSP_INB3_SRC_CTRL4	, 0x0800},
26262306a36Sopenharmony_ci	{RT5677_DSP_OUTB1_SRC_CTRL1	, 0x5800},
26362306a36Sopenharmony_ci	{RT5677_DSP_OUTB1_SRC_CTRL2	, 0x0000},
26462306a36Sopenharmony_ci	{RT5677_DSP_OUTB1_SRC_CTRL3	, 0x0000},
26562306a36Sopenharmony_ci	{RT5677_DSP_OUTB1_SRC_CTRL4	, 0x0800},
26662306a36Sopenharmony_ci	{RT5677_DSP_OUTB2_SRC_CTRL1	, 0x5800},
26762306a36Sopenharmony_ci	{RT5677_DSP_OUTB2_SRC_CTRL2	, 0x0000},
26862306a36Sopenharmony_ci	{RT5677_DSP_OUTB2_SRC_CTRL3	, 0x0000},
26962306a36Sopenharmony_ci	{RT5677_DSP_OUTB2_SRC_CTRL4	, 0x0800},
27062306a36Sopenharmony_ci	{RT5677_DSP_OUTB_0123_MIXER_CTRL, 0xfefe},
27162306a36Sopenharmony_ci	{RT5677_DSP_OUTB_45_MIXER_CTRL	, 0xfefe},
27262306a36Sopenharmony_ci	{RT5677_DSP_OUTB_67_MIXER_CTRL	, 0xfefe},
27362306a36Sopenharmony_ci	{RT5677_DIG_MISC		, 0x0000},
27462306a36Sopenharmony_ci	{RT5677_GEN_CTRL1		, 0x0000},
27562306a36Sopenharmony_ci	{RT5677_GEN_CTRL2		, 0x0000},
27662306a36Sopenharmony_ci	{RT5677_VENDOR_ID		, 0x0000},
27762306a36Sopenharmony_ci	{RT5677_VENDOR_ID1		, 0x10ec},
27862306a36Sopenharmony_ci	{RT5677_VENDOR_ID2		, 0x6327},
27962306a36Sopenharmony_ci};
28062306a36Sopenharmony_ci
28162306a36Sopenharmony_cistatic bool rt5677_volatile_register(struct device *dev, unsigned int reg)
28262306a36Sopenharmony_ci{
28362306a36Sopenharmony_ci	int i;
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(rt5677_ranges); i++) {
28662306a36Sopenharmony_ci		if (reg >= rt5677_ranges[i].range_min &&
28762306a36Sopenharmony_ci			reg <= rt5677_ranges[i].range_max) {
28862306a36Sopenharmony_ci			return true;
28962306a36Sopenharmony_ci		}
29062306a36Sopenharmony_ci	}
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_ci	switch (reg) {
29362306a36Sopenharmony_ci	case RT5677_RESET:
29462306a36Sopenharmony_ci	case RT5677_SLIMBUS_PARAM:
29562306a36Sopenharmony_ci	case RT5677_PDM_DATA_CTRL1:
29662306a36Sopenharmony_ci	case RT5677_PDM_DATA_CTRL2:
29762306a36Sopenharmony_ci	case RT5677_PDM1_DATA_CTRL4:
29862306a36Sopenharmony_ci	case RT5677_PDM2_DATA_CTRL4:
29962306a36Sopenharmony_ci	case RT5677_I2C_MASTER_CTRL1:
30062306a36Sopenharmony_ci	case RT5677_I2C_MASTER_CTRL7:
30162306a36Sopenharmony_ci	case RT5677_I2C_MASTER_CTRL8:
30262306a36Sopenharmony_ci	case RT5677_HAP_GENE_CTRL2:
30362306a36Sopenharmony_ci	case RT5677_PWR_ANLG2: /* Modified by DSP firmware */
30462306a36Sopenharmony_ci	case RT5677_PWR_DSP_ST:
30562306a36Sopenharmony_ci	case RT5677_PRIV_DATA:
30662306a36Sopenharmony_ci	case RT5677_ASRC_22:
30762306a36Sopenharmony_ci	case RT5677_ASRC_23:
30862306a36Sopenharmony_ci	case RT5677_VAD_CTRL5:
30962306a36Sopenharmony_ci	case RT5677_ADC_EQ_CTRL1:
31062306a36Sopenharmony_ci	case RT5677_EQ_CTRL1:
31162306a36Sopenharmony_ci	case RT5677_IRQ_CTRL1:
31262306a36Sopenharmony_ci	case RT5677_IRQ_CTRL2:
31362306a36Sopenharmony_ci	case RT5677_GPIO_ST:
31462306a36Sopenharmony_ci	case RT5677_GPIO_CTRL1: /* Modified by DSP firmware */
31562306a36Sopenharmony_ci	case RT5677_GPIO_CTRL2: /* Modified by DSP firmware */
31662306a36Sopenharmony_ci	case RT5677_DSP_INB1_SRC_CTRL4:
31762306a36Sopenharmony_ci	case RT5677_DSP_INB2_SRC_CTRL4:
31862306a36Sopenharmony_ci	case RT5677_DSP_INB3_SRC_CTRL4:
31962306a36Sopenharmony_ci	case RT5677_DSP_OUTB1_SRC_CTRL4:
32062306a36Sopenharmony_ci	case RT5677_DSP_OUTB2_SRC_CTRL4:
32162306a36Sopenharmony_ci	case RT5677_VENDOR_ID:
32262306a36Sopenharmony_ci	case RT5677_VENDOR_ID1:
32362306a36Sopenharmony_ci	case RT5677_VENDOR_ID2:
32462306a36Sopenharmony_ci		return true;
32562306a36Sopenharmony_ci	default:
32662306a36Sopenharmony_ci		return false;
32762306a36Sopenharmony_ci	}
32862306a36Sopenharmony_ci}
32962306a36Sopenharmony_ci
33062306a36Sopenharmony_cistatic bool rt5677_readable_register(struct device *dev, unsigned int reg)
33162306a36Sopenharmony_ci{
33262306a36Sopenharmony_ci	int i;
33362306a36Sopenharmony_ci
33462306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(rt5677_ranges); i++) {
33562306a36Sopenharmony_ci		if (reg >= rt5677_ranges[i].range_min &&
33662306a36Sopenharmony_ci			reg <= rt5677_ranges[i].range_max) {
33762306a36Sopenharmony_ci			return true;
33862306a36Sopenharmony_ci		}
33962306a36Sopenharmony_ci	}
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci	switch (reg) {
34262306a36Sopenharmony_ci	case RT5677_RESET:
34362306a36Sopenharmony_ci	case RT5677_LOUT1:
34462306a36Sopenharmony_ci	case RT5677_IN1:
34562306a36Sopenharmony_ci	case RT5677_MICBIAS:
34662306a36Sopenharmony_ci	case RT5677_SLIMBUS_PARAM:
34762306a36Sopenharmony_ci	case RT5677_SLIMBUS_RX:
34862306a36Sopenharmony_ci	case RT5677_SLIMBUS_CTRL:
34962306a36Sopenharmony_ci	case RT5677_SIDETONE_CTRL:
35062306a36Sopenharmony_ci	case RT5677_ANA_DAC1_2_3_SRC:
35162306a36Sopenharmony_ci	case RT5677_IF_DSP_DAC3_4_MIXER:
35262306a36Sopenharmony_ci	case RT5677_DAC4_DIG_VOL:
35362306a36Sopenharmony_ci	case RT5677_DAC3_DIG_VOL:
35462306a36Sopenharmony_ci	case RT5677_DAC1_DIG_VOL:
35562306a36Sopenharmony_ci	case RT5677_DAC2_DIG_VOL:
35662306a36Sopenharmony_ci	case RT5677_IF_DSP_DAC2_MIXER:
35762306a36Sopenharmony_ci	case RT5677_STO1_ADC_DIG_VOL:
35862306a36Sopenharmony_ci	case RT5677_MONO_ADC_DIG_VOL:
35962306a36Sopenharmony_ci	case RT5677_STO1_2_ADC_BST:
36062306a36Sopenharmony_ci	case RT5677_STO2_ADC_DIG_VOL:
36162306a36Sopenharmony_ci	case RT5677_ADC_BST_CTRL2:
36262306a36Sopenharmony_ci	case RT5677_STO3_4_ADC_BST:
36362306a36Sopenharmony_ci	case RT5677_STO3_ADC_DIG_VOL:
36462306a36Sopenharmony_ci	case RT5677_STO4_ADC_DIG_VOL:
36562306a36Sopenharmony_ci	case RT5677_STO4_ADC_MIXER:
36662306a36Sopenharmony_ci	case RT5677_STO3_ADC_MIXER:
36762306a36Sopenharmony_ci	case RT5677_STO2_ADC_MIXER:
36862306a36Sopenharmony_ci	case RT5677_STO1_ADC_MIXER:
36962306a36Sopenharmony_ci	case RT5677_MONO_ADC_MIXER:
37062306a36Sopenharmony_ci	case RT5677_ADC_IF_DSP_DAC1_MIXER:
37162306a36Sopenharmony_ci	case RT5677_STO1_DAC_MIXER:
37262306a36Sopenharmony_ci	case RT5677_MONO_DAC_MIXER:
37362306a36Sopenharmony_ci	case RT5677_DD1_MIXER:
37462306a36Sopenharmony_ci	case RT5677_DD2_MIXER:
37562306a36Sopenharmony_ci	case RT5677_IF3_DATA:
37662306a36Sopenharmony_ci	case RT5677_IF4_DATA:
37762306a36Sopenharmony_ci	case RT5677_PDM_OUT_CTRL:
37862306a36Sopenharmony_ci	case RT5677_PDM_DATA_CTRL1:
37962306a36Sopenharmony_ci	case RT5677_PDM_DATA_CTRL2:
38062306a36Sopenharmony_ci	case RT5677_PDM1_DATA_CTRL2:
38162306a36Sopenharmony_ci	case RT5677_PDM1_DATA_CTRL3:
38262306a36Sopenharmony_ci	case RT5677_PDM1_DATA_CTRL4:
38362306a36Sopenharmony_ci	case RT5677_PDM2_DATA_CTRL2:
38462306a36Sopenharmony_ci	case RT5677_PDM2_DATA_CTRL3:
38562306a36Sopenharmony_ci	case RT5677_PDM2_DATA_CTRL4:
38662306a36Sopenharmony_ci	case RT5677_TDM1_CTRL1:
38762306a36Sopenharmony_ci	case RT5677_TDM1_CTRL2:
38862306a36Sopenharmony_ci	case RT5677_TDM1_CTRL3:
38962306a36Sopenharmony_ci	case RT5677_TDM1_CTRL4:
39062306a36Sopenharmony_ci	case RT5677_TDM1_CTRL5:
39162306a36Sopenharmony_ci	case RT5677_TDM2_CTRL1:
39262306a36Sopenharmony_ci	case RT5677_TDM2_CTRL2:
39362306a36Sopenharmony_ci	case RT5677_TDM2_CTRL3:
39462306a36Sopenharmony_ci	case RT5677_TDM2_CTRL4:
39562306a36Sopenharmony_ci	case RT5677_TDM2_CTRL5:
39662306a36Sopenharmony_ci	case RT5677_I2C_MASTER_CTRL1:
39762306a36Sopenharmony_ci	case RT5677_I2C_MASTER_CTRL2:
39862306a36Sopenharmony_ci	case RT5677_I2C_MASTER_CTRL3:
39962306a36Sopenharmony_ci	case RT5677_I2C_MASTER_CTRL4:
40062306a36Sopenharmony_ci	case RT5677_I2C_MASTER_CTRL5:
40162306a36Sopenharmony_ci	case RT5677_I2C_MASTER_CTRL6:
40262306a36Sopenharmony_ci	case RT5677_I2C_MASTER_CTRL7:
40362306a36Sopenharmony_ci	case RT5677_I2C_MASTER_CTRL8:
40462306a36Sopenharmony_ci	case RT5677_DMIC_CTRL1:
40562306a36Sopenharmony_ci	case RT5677_DMIC_CTRL2:
40662306a36Sopenharmony_ci	case RT5677_HAP_GENE_CTRL1:
40762306a36Sopenharmony_ci	case RT5677_HAP_GENE_CTRL2:
40862306a36Sopenharmony_ci	case RT5677_HAP_GENE_CTRL3:
40962306a36Sopenharmony_ci	case RT5677_HAP_GENE_CTRL4:
41062306a36Sopenharmony_ci	case RT5677_HAP_GENE_CTRL5:
41162306a36Sopenharmony_ci	case RT5677_HAP_GENE_CTRL6:
41262306a36Sopenharmony_ci	case RT5677_HAP_GENE_CTRL7:
41362306a36Sopenharmony_ci	case RT5677_HAP_GENE_CTRL8:
41462306a36Sopenharmony_ci	case RT5677_HAP_GENE_CTRL9:
41562306a36Sopenharmony_ci	case RT5677_HAP_GENE_CTRL10:
41662306a36Sopenharmony_ci	case RT5677_PWR_DIG1:
41762306a36Sopenharmony_ci	case RT5677_PWR_DIG2:
41862306a36Sopenharmony_ci	case RT5677_PWR_ANLG1:
41962306a36Sopenharmony_ci	case RT5677_PWR_ANLG2:
42062306a36Sopenharmony_ci	case RT5677_PWR_DSP1:
42162306a36Sopenharmony_ci	case RT5677_PWR_DSP_ST:
42262306a36Sopenharmony_ci	case RT5677_PWR_DSP2:
42362306a36Sopenharmony_ci	case RT5677_ADC_DAC_HPF_CTRL1:
42462306a36Sopenharmony_ci	case RT5677_PRIV_INDEX:
42562306a36Sopenharmony_ci	case RT5677_PRIV_DATA:
42662306a36Sopenharmony_ci	case RT5677_I2S4_SDP:
42762306a36Sopenharmony_ci	case RT5677_I2S1_SDP:
42862306a36Sopenharmony_ci	case RT5677_I2S2_SDP:
42962306a36Sopenharmony_ci	case RT5677_I2S3_SDP:
43062306a36Sopenharmony_ci	case RT5677_CLK_TREE_CTRL1:
43162306a36Sopenharmony_ci	case RT5677_CLK_TREE_CTRL2:
43262306a36Sopenharmony_ci	case RT5677_CLK_TREE_CTRL3:
43362306a36Sopenharmony_ci	case RT5677_PLL1_CTRL1:
43462306a36Sopenharmony_ci	case RT5677_PLL1_CTRL2:
43562306a36Sopenharmony_ci	case RT5677_PLL2_CTRL1:
43662306a36Sopenharmony_ci	case RT5677_PLL2_CTRL2:
43762306a36Sopenharmony_ci	case RT5677_GLB_CLK1:
43862306a36Sopenharmony_ci	case RT5677_GLB_CLK2:
43962306a36Sopenharmony_ci	case RT5677_ASRC_1:
44062306a36Sopenharmony_ci	case RT5677_ASRC_2:
44162306a36Sopenharmony_ci	case RT5677_ASRC_3:
44262306a36Sopenharmony_ci	case RT5677_ASRC_4:
44362306a36Sopenharmony_ci	case RT5677_ASRC_5:
44462306a36Sopenharmony_ci	case RT5677_ASRC_6:
44562306a36Sopenharmony_ci	case RT5677_ASRC_7:
44662306a36Sopenharmony_ci	case RT5677_ASRC_8:
44762306a36Sopenharmony_ci	case RT5677_ASRC_9:
44862306a36Sopenharmony_ci	case RT5677_ASRC_10:
44962306a36Sopenharmony_ci	case RT5677_ASRC_11:
45062306a36Sopenharmony_ci	case RT5677_ASRC_12:
45162306a36Sopenharmony_ci	case RT5677_ASRC_13:
45262306a36Sopenharmony_ci	case RT5677_ASRC_14:
45362306a36Sopenharmony_ci	case RT5677_ASRC_15:
45462306a36Sopenharmony_ci	case RT5677_ASRC_16:
45562306a36Sopenharmony_ci	case RT5677_ASRC_17:
45662306a36Sopenharmony_ci	case RT5677_ASRC_18:
45762306a36Sopenharmony_ci	case RT5677_ASRC_19:
45862306a36Sopenharmony_ci	case RT5677_ASRC_20:
45962306a36Sopenharmony_ci	case RT5677_ASRC_21:
46062306a36Sopenharmony_ci	case RT5677_ASRC_22:
46162306a36Sopenharmony_ci	case RT5677_ASRC_23:
46262306a36Sopenharmony_ci	case RT5677_VAD_CTRL1:
46362306a36Sopenharmony_ci	case RT5677_VAD_CTRL2:
46462306a36Sopenharmony_ci	case RT5677_VAD_CTRL3:
46562306a36Sopenharmony_ci	case RT5677_VAD_CTRL4:
46662306a36Sopenharmony_ci	case RT5677_VAD_CTRL5:
46762306a36Sopenharmony_ci	case RT5677_DSP_INB_CTRL1:
46862306a36Sopenharmony_ci	case RT5677_DSP_INB_CTRL2:
46962306a36Sopenharmony_ci	case RT5677_DSP_IN_OUTB_CTRL:
47062306a36Sopenharmony_ci	case RT5677_DSP_OUTB0_1_DIG_VOL:
47162306a36Sopenharmony_ci	case RT5677_DSP_OUTB2_3_DIG_VOL:
47262306a36Sopenharmony_ci	case RT5677_DSP_OUTB4_5_DIG_VOL:
47362306a36Sopenharmony_ci	case RT5677_DSP_OUTB6_7_DIG_VOL:
47462306a36Sopenharmony_ci	case RT5677_ADC_EQ_CTRL1:
47562306a36Sopenharmony_ci	case RT5677_ADC_EQ_CTRL2:
47662306a36Sopenharmony_ci	case RT5677_EQ_CTRL1:
47762306a36Sopenharmony_ci	case RT5677_EQ_CTRL2:
47862306a36Sopenharmony_ci	case RT5677_EQ_CTRL3:
47962306a36Sopenharmony_ci	case RT5677_SOFT_VOL_ZERO_CROSS1:
48062306a36Sopenharmony_ci	case RT5677_JD_CTRL1:
48162306a36Sopenharmony_ci	case RT5677_JD_CTRL2:
48262306a36Sopenharmony_ci	case RT5677_JD_CTRL3:
48362306a36Sopenharmony_ci	case RT5677_IRQ_CTRL1:
48462306a36Sopenharmony_ci	case RT5677_IRQ_CTRL2:
48562306a36Sopenharmony_ci	case RT5677_GPIO_ST:
48662306a36Sopenharmony_ci	case RT5677_GPIO_CTRL1:
48762306a36Sopenharmony_ci	case RT5677_GPIO_CTRL2:
48862306a36Sopenharmony_ci	case RT5677_GPIO_CTRL3:
48962306a36Sopenharmony_ci	case RT5677_STO1_ADC_HI_FILTER1:
49062306a36Sopenharmony_ci	case RT5677_STO1_ADC_HI_FILTER2:
49162306a36Sopenharmony_ci	case RT5677_MONO_ADC_HI_FILTER1:
49262306a36Sopenharmony_ci	case RT5677_MONO_ADC_HI_FILTER2:
49362306a36Sopenharmony_ci	case RT5677_STO2_ADC_HI_FILTER1:
49462306a36Sopenharmony_ci	case RT5677_STO2_ADC_HI_FILTER2:
49562306a36Sopenharmony_ci	case RT5677_STO3_ADC_HI_FILTER1:
49662306a36Sopenharmony_ci	case RT5677_STO3_ADC_HI_FILTER2:
49762306a36Sopenharmony_ci	case RT5677_STO4_ADC_HI_FILTER1:
49862306a36Sopenharmony_ci	case RT5677_STO4_ADC_HI_FILTER2:
49962306a36Sopenharmony_ci	case RT5677_MB_DRC_CTRL1:
50062306a36Sopenharmony_ci	case RT5677_DRC1_CTRL1:
50162306a36Sopenharmony_ci	case RT5677_DRC1_CTRL2:
50262306a36Sopenharmony_ci	case RT5677_DRC1_CTRL3:
50362306a36Sopenharmony_ci	case RT5677_DRC1_CTRL4:
50462306a36Sopenharmony_ci	case RT5677_DRC1_CTRL5:
50562306a36Sopenharmony_ci	case RT5677_DRC1_CTRL6:
50662306a36Sopenharmony_ci	case RT5677_DRC2_CTRL1:
50762306a36Sopenharmony_ci	case RT5677_DRC2_CTRL2:
50862306a36Sopenharmony_ci	case RT5677_DRC2_CTRL3:
50962306a36Sopenharmony_ci	case RT5677_DRC2_CTRL4:
51062306a36Sopenharmony_ci	case RT5677_DRC2_CTRL5:
51162306a36Sopenharmony_ci	case RT5677_DRC2_CTRL6:
51262306a36Sopenharmony_ci	case RT5677_DRC1_HL_CTRL1:
51362306a36Sopenharmony_ci	case RT5677_DRC1_HL_CTRL2:
51462306a36Sopenharmony_ci	case RT5677_DRC2_HL_CTRL1:
51562306a36Sopenharmony_ci	case RT5677_DRC2_HL_CTRL2:
51662306a36Sopenharmony_ci	case RT5677_DSP_INB1_SRC_CTRL1:
51762306a36Sopenharmony_ci	case RT5677_DSP_INB1_SRC_CTRL2:
51862306a36Sopenharmony_ci	case RT5677_DSP_INB1_SRC_CTRL3:
51962306a36Sopenharmony_ci	case RT5677_DSP_INB1_SRC_CTRL4:
52062306a36Sopenharmony_ci	case RT5677_DSP_INB2_SRC_CTRL1:
52162306a36Sopenharmony_ci	case RT5677_DSP_INB2_SRC_CTRL2:
52262306a36Sopenharmony_ci	case RT5677_DSP_INB2_SRC_CTRL3:
52362306a36Sopenharmony_ci	case RT5677_DSP_INB2_SRC_CTRL4:
52462306a36Sopenharmony_ci	case RT5677_DSP_INB3_SRC_CTRL1:
52562306a36Sopenharmony_ci	case RT5677_DSP_INB3_SRC_CTRL2:
52662306a36Sopenharmony_ci	case RT5677_DSP_INB3_SRC_CTRL3:
52762306a36Sopenharmony_ci	case RT5677_DSP_INB3_SRC_CTRL4:
52862306a36Sopenharmony_ci	case RT5677_DSP_OUTB1_SRC_CTRL1:
52962306a36Sopenharmony_ci	case RT5677_DSP_OUTB1_SRC_CTRL2:
53062306a36Sopenharmony_ci	case RT5677_DSP_OUTB1_SRC_CTRL3:
53162306a36Sopenharmony_ci	case RT5677_DSP_OUTB1_SRC_CTRL4:
53262306a36Sopenharmony_ci	case RT5677_DSP_OUTB2_SRC_CTRL1:
53362306a36Sopenharmony_ci	case RT5677_DSP_OUTB2_SRC_CTRL2:
53462306a36Sopenharmony_ci	case RT5677_DSP_OUTB2_SRC_CTRL3:
53562306a36Sopenharmony_ci	case RT5677_DSP_OUTB2_SRC_CTRL4:
53662306a36Sopenharmony_ci	case RT5677_DSP_OUTB_0123_MIXER_CTRL:
53762306a36Sopenharmony_ci	case RT5677_DSP_OUTB_45_MIXER_CTRL:
53862306a36Sopenharmony_ci	case RT5677_DSP_OUTB_67_MIXER_CTRL:
53962306a36Sopenharmony_ci	case RT5677_DIG_MISC:
54062306a36Sopenharmony_ci	case RT5677_GEN_CTRL1:
54162306a36Sopenharmony_ci	case RT5677_GEN_CTRL2:
54262306a36Sopenharmony_ci	case RT5677_VENDOR_ID:
54362306a36Sopenharmony_ci	case RT5677_VENDOR_ID1:
54462306a36Sopenharmony_ci	case RT5677_VENDOR_ID2:
54562306a36Sopenharmony_ci		return true;
54662306a36Sopenharmony_ci	default:
54762306a36Sopenharmony_ci		return false;
54862306a36Sopenharmony_ci	}
54962306a36Sopenharmony_ci}
55062306a36Sopenharmony_ci
55162306a36Sopenharmony_ci/**
55262306a36Sopenharmony_ci * rt5677_dsp_mode_i2c_write_addr - Write value to address on DSP mode.
55362306a36Sopenharmony_ci * @rt5677: Private Data.
55462306a36Sopenharmony_ci * @addr: Address index.
55562306a36Sopenharmony_ci * @value: Address data.
55662306a36Sopenharmony_ci * @opcode: opcode value
55762306a36Sopenharmony_ci *
55862306a36Sopenharmony_ci * Returns 0 for success or negative error code.
55962306a36Sopenharmony_ci */
56062306a36Sopenharmony_cistatic int rt5677_dsp_mode_i2c_write_addr(struct rt5677_priv *rt5677,
56162306a36Sopenharmony_ci		unsigned int addr, unsigned int value, unsigned int opcode)
56262306a36Sopenharmony_ci{
56362306a36Sopenharmony_ci	struct snd_soc_component *component = rt5677->component;
56462306a36Sopenharmony_ci	int ret;
56562306a36Sopenharmony_ci
56662306a36Sopenharmony_ci	mutex_lock(&rt5677->dsp_cmd_lock);
56762306a36Sopenharmony_ci
56862306a36Sopenharmony_ci	ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_ADDR_MSB,
56962306a36Sopenharmony_ci		addr >> 16);
57062306a36Sopenharmony_ci	if (ret < 0) {
57162306a36Sopenharmony_ci		dev_err(component->dev, "Failed to set addr msb value: %d\n", ret);
57262306a36Sopenharmony_ci		goto err;
57362306a36Sopenharmony_ci	}
57462306a36Sopenharmony_ci
57562306a36Sopenharmony_ci	ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_ADDR_LSB,
57662306a36Sopenharmony_ci		addr & 0xffff);
57762306a36Sopenharmony_ci	if (ret < 0) {
57862306a36Sopenharmony_ci		dev_err(component->dev, "Failed to set addr lsb value: %d\n", ret);
57962306a36Sopenharmony_ci		goto err;
58062306a36Sopenharmony_ci	}
58162306a36Sopenharmony_ci
58262306a36Sopenharmony_ci	ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_DATA_MSB,
58362306a36Sopenharmony_ci		value >> 16);
58462306a36Sopenharmony_ci	if (ret < 0) {
58562306a36Sopenharmony_ci		dev_err(component->dev, "Failed to set data msb value: %d\n", ret);
58662306a36Sopenharmony_ci		goto err;
58762306a36Sopenharmony_ci	}
58862306a36Sopenharmony_ci
58962306a36Sopenharmony_ci	ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_DATA_LSB,
59062306a36Sopenharmony_ci		value & 0xffff);
59162306a36Sopenharmony_ci	if (ret < 0) {
59262306a36Sopenharmony_ci		dev_err(component->dev, "Failed to set data lsb value: %d\n", ret);
59362306a36Sopenharmony_ci		goto err;
59462306a36Sopenharmony_ci	}
59562306a36Sopenharmony_ci
59662306a36Sopenharmony_ci	ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_OP_CODE,
59762306a36Sopenharmony_ci		opcode);
59862306a36Sopenharmony_ci	if (ret < 0) {
59962306a36Sopenharmony_ci		dev_err(component->dev, "Failed to set op code value: %d\n", ret);
60062306a36Sopenharmony_ci		goto err;
60162306a36Sopenharmony_ci	}
60262306a36Sopenharmony_ci
60362306a36Sopenharmony_cierr:
60462306a36Sopenharmony_ci	mutex_unlock(&rt5677->dsp_cmd_lock);
60562306a36Sopenharmony_ci
60662306a36Sopenharmony_ci	return ret;
60762306a36Sopenharmony_ci}
60862306a36Sopenharmony_ci
60962306a36Sopenharmony_ci/**
61062306a36Sopenharmony_ci * rt5677_dsp_mode_i2c_read_addr - Read value from address on DSP mode.
61162306a36Sopenharmony_ci * @rt5677: Private Data.
61262306a36Sopenharmony_ci * @addr: Address index.
61362306a36Sopenharmony_ci * @value: Address data.
61462306a36Sopenharmony_ci *
61562306a36Sopenharmony_ci *
61662306a36Sopenharmony_ci * Returns 0 for success or negative error code.
61762306a36Sopenharmony_ci */
61862306a36Sopenharmony_cistatic int rt5677_dsp_mode_i2c_read_addr(
61962306a36Sopenharmony_ci	struct rt5677_priv *rt5677, unsigned int addr, unsigned int *value)
62062306a36Sopenharmony_ci{
62162306a36Sopenharmony_ci	struct snd_soc_component *component = rt5677->component;
62262306a36Sopenharmony_ci	int ret;
62362306a36Sopenharmony_ci	unsigned int msb, lsb;
62462306a36Sopenharmony_ci
62562306a36Sopenharmony_ci	mutex_lock(&rt5677->dsp_cmd_lock);
62662306a36Sopenharmony_ci
62762306a36Sopenharmony_ci	ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_ADDR_MSB,
62862306a36Sopenharmony_ci		addr >> 16);
62962306a36Sopenharmony_ci	if (ret < 0) {
63062306a36Sopenharmony_ci		dev_err(component->dev, "Failed to set addr msb value: %d\n", ret);
63162306a36Sopenharmony_ci		goto err;
63262306a36Sopenharmony_ci	}
63362306a36Sopenharmony_ci
63462306a36Sopenharmony_ci	ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_ADDR_LSB,
63562306a36Sopenharmony_ci		addr & 0xffff);
63662306a36Sopenharmony_ci	if (ret < 0) {
63762306a36Sopenharmony_ci		dev_err(component->dev, "Failed to set addr lsb value: %d\n", ret);
63862306a36Sopenharmony_ci		goto err;
63962306a36Sopenharmony_ci	}
64062306a36Sopenharmony_ci
64162306a36Sopenharmony_ci	ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_OP_CODE,
64262306a36Sopenharmony_ci		0x0002);
64362306a36Sopenharmony_ci	if (ret < 0) {
64462306a36Sopenharmony_ci		dev_err(component->dev, "Failed to set op code value: %d\n", ret);
64562306a36Sopenharmony_ci		goto err;
64662306a36Sopenharmony_ci	}
64762306a36Sopenharmony_ci
64862306a36Sopenharmony_ci	regmap_read(rt5677->regmap_physical, RT5677_DSP_I2C_DATA_MSB, &msb);
64962306a36Sopenharmony_ci	regmap_read(rt5677->regmap_physical, RT5677_DSP_I2C_DATA_LSB, &lsb);
65062306a36Sopenharmony_ci	*value = (msb << 16) | lsb;
65162306a36Sopenharmony_ci
65262306a36Sopenharmony_cierr:
65362306a36Sopenharmony_ci	mutex_unlock(&rt5677->dsp_cmd_lock);
65462306a36Sopenharmony_ci
65562306a36Sopenharmony_ci	return ret;
65662306a36Sopenharmony_ci}
65762306a36Sopenharmony_ci
65862306a36Sopenharmony_ci/**
65962306a36Sopenharmony_ci * rt5677_dsp_mode_i2c_write - Write register on DSP mode.
66062306a36Sopenharmony_ci * @rt5677: Private Data.
66162306a36Sopenharmony_ci * @reg: Register index.
66262306a36Sopenharmony_ci * @value: Register data.
66362306a36Sopenharmony_ci *
66462306a36Sopenharmony_ci *
66562306a36Sopenharmony_ci * Returns 0 for success or negative error code.
66662306a36Sopenharmony_ci */
66762306a36Sopenharmony_cistatic int rt5677_dsp_mode_i2c_write(struct rt5677_priv *rt5677,
66862306a36Sopenharmony_ci		unsigned int reg, unsigned int value)
66962306a36Sopenharmony_ci{
67062306a36Sopenharmony_ci	return rt5677_dsp_mode_i2c_write_addr(rt5677, 0x18020000 + reg * 2,
67162306a36Sopenharmony_ci		value, 0x0001);
67262306a36Sopenharmony_ci}
67362306a36Sopenharmony_ci
67462306a36Sopenharmony_ci/**
67562306a36Sopenharmony_ci * rt5677_dsp_mode_i2c_read - Read register on DSP mode.
67662306a36Sopenharmony_ci * @rt5677: Private Data
67762306a36Sopenharmony_ci * @reg: Register index.
67862306a36Sopenharmony_ci * @value: Register data.
67962306a36Sopenharmony_ci *
68062306a36Sopenharmony_ci *
68162306a36Sopenharmony_ci * Returns 0 for success or negative error code.
68262306a36Sopenharmony_ci */
68362306a36Sopenharmony_cistatic int rt5677_dsp_mode_i2c_read(
68462306a36Sopenharmony_ci	struct rt5677_priv *rt5677, unsigned int reg, unsigned int *value)
68562306a36Sopenharmony_ci{
68662306a36Sopenharmony_ci	int ret = rt5677_dsp_mode_i2c_read_addr(rt5677, 0x18020000 + reg * 2,
68762306a36Sopenharmony_ci		value);
68862306a36Sopenharmony_ci
68962306a36Sopenharmony_ci	*value &= 0xffff;
69062306a36Sopenharmony_ci
69162306a36Sopenharmony_ci	return ret;
69262306a36Sopenharmony_ci}
69362306a36Sopenharmony_ci
69462306a36Sopenharmony_cistatic void rt5677_set_dsp_mode(struct rt5677_priv *rt5677, bool on)
69562306a36Sopenharmony_ci{
69662306a36Sopenharmony_ci	if (on) {
69762306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_PWR_DSP1,
69862306a36Sopenharmony_ci			RT5677_PWR_DSP, RT5677_PWR_DSP);
69962306a36Sopenharmony_ci		rt5677->is_dsp_mode = true;
70062306a36Sopenharmony_ci	} else {
70162306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_PWR_DSP1,
70262306a36Sopenharmony_ci			RT5677_PWR_DSP, 0x0);
70362306a36Sopenharmony_ci		rt5677->is_dsp_mode = false;
70462306a36Sopenharmony_ci	}
70562306a36Sopenharmony_ci}
70662306a36Sopenharmony_ci
70762306a36Sopenharmony_cistatic unsigned int rt5677_set_vad_source(struct rt5677_priv *rt5677)
70862306a36Sopenharmony_ci{
70962306a36Sopenharmony_ci	struct snd_soc_dapm_context *dapm =
71062306a36Sopenharmony_ci			snd_soc_component_get_dapm(rt5677->component);
71162306a36Sopenharmony_ci	/* Force dapm to sync before we enable the
71262306a36Sopenharmony_ci	 * DSP to prevent write corruption
71362306a36Sopenharmony_ci	 */
71462306a36Sopenharmony_ci	snd_soc_dapm_sync(dapm);
71562306a36Sopenharmony_ci
71662306a36Sopenharmony_ci	/* DMIC1 power = enabled
71762306a36Sopenharmony_ci	 * DMIC CLK = 256 * fs / 12
71862306a36Sopenharmony_ci	 */
71962306a36Sopenharmony_ci	regmap_update_bits(rt5677->regmap, RT5677_DMIC_CTRL1,
72062306a36Sopenharmony_ci		RT5677_DMIC_CLK_MASK, 5 << RT5677_DMIC_CLK_SFT);
72162306a36Sopenharmony_ci
72262306a36Sopenharmony_ci	/* I2S pre divide 2 = /6 (clk_sys2) */
72362306a36Sopenharmony_ci	regmap_update_bits(rt5677->regmap, RT5677_CLK_TREE_CTRL1,
72462306a36Sopenharmony_ci		RT5677_I2S_PD2_MASK, RT5677_I2S_PD2_6);
72562306a36Sopenharmony_ci
72662306a36Sopenharmony_ci	/* DSP Clock = MCLK1 (bypassed PLL2) */
72762306a36Sopenharmony_ci	regmap_write(rt5677->regmap, RT5677_GLB_CLK2,
72862306a36Sopenharmony_ci		RT5677_DSP_CLK_SRC_BYPASS);
72962306a36Sopenharmony_ci
73062306a36Sopenharmony_ci	/* SAD Threshold1 */
73162306a36Sopenharmony_ci	regmap_write(rt5677->regmap, RT5677_VAD_CTRL2, 0x013f);
73262306a36Sopenharmony_ci	/* SAD Threshold2 */
73362306a36Sopenharmony_ci	regmap_write(rt5677->regmap, RT5677_VAD_CTRL3, 0x0ae5);
73462306a36Sopenharmony_ci	/* SAD Sample Rate Converter = Up 6 (8K to 48K)
73562306a36Sopenharmony_ci	 * SAD Output Sample Rate = Same as I2S
73662306a36Sopenharmony_ci	 * SAD Threshold3
73762306a36Sopenharmony_ci	 */
73862306a36Sopenharmony_ci	regmap_update_bits(rt5677->regmap, RT5677_VAD_CTRL4,
73962306a36Sopenharmony_ci		RT5677_VAD_OUT_SRC_RATE_MASK | RT5677_VAD_OUT_SRC_MASK |
74062306a36Sopenharmony_ci		RT5677_VAD_LV_DIFF_MASK, 0x7f << RT5677_VAD_LV_DIFF_SFT);
74162306a36Sopenharmony_ci	/* Minimum frame level within a pre-determined duration = 32 frames
74262306a36Sopenharmony_ci	 * Bypass ADPCM Encoder/Decoder = Bypass ADPCM
74362306a36Sopenharmony_ci	 * Automatic Push Data to SAD Buffer Once SAD Flag is triggered = enable
74462306a36Sopenharmony_ci	 * SAD Buffer Over-Writing = enable
74562306a36Sopenharmony_ci	 * SAD Buffer Pop Mode Control = disable
74662306a36Sopenharmony_ci	 * SAD Buffer Push Mode Control = enable
74762306a36Sopenharmony_ci	 * SAD Detector Control = enable
74862306a36Sopenharmony_ci	 * SAD Function Control = enable
74962306a36Sopenharmony_ci	 * SAD Function Reset = normal
75062306a36Sopenharmony_ci	 */
75162306a36Sopenharmony_ci	regmap_write(rt5677->regmap, RT5677_VAD_CTRL1,
75262306a36Sopenharmony_ci		RT5677_VAD_FUNC_RESET | RT5677_VAD_FUNC_ENABLE |
75362306a36Sopenharmony_ci		RT5677_VAD_DET_ENABLE | RT5677_VAD_BUF_PUSH |
75462306a36Sopenharmony_ci		RT5677_VAD_BUF_OW | RT5677_VAD_FG2ENC |
75562306a36Sopenharmony_ci		RT5677_VAD_ADPCM_BYPASS | 1 << RT5677_VAD_MIN_DUR_SFT);
75662306a36Sopenharmony_ci
75762306a36Sopenharmony_ci	/* VAD/SAD is not routed to the IRQ output (i.e. MX-BE[14] = 0), but it
75862306a36Sopenharmony_ci	 * is routed to DSP_IRQ_0, so DSP firmware may use it to sleep and save
75962306a36Sopenharmony_ci	 * power. See ALC5677 datasheet section 9.17 "GPIO, Interrupt and Jack
76062306a36Sopenharmony_ci	 * Detection" for more info.
76162306a36Sopenharmony_ci	 */
76262306a36Sopenharmony_ci
76362306a36Sopenharmony_ci	/* Private register, no doc */
76462306a36Sopenharmony_ci	regmap_update_bits(rt5677->regmap, RT5677_PR_BASE + RT5677_BIAS_CUR4,
76562306a36Sopenharmony_ci		0x0f00, 0x0100);
76662306a36Sopenharmony_ci
76762306a36Sopenharmony_ci	/* LDO2 output = 1.2V
76862306a36Sopenharmony_ci	 * LDO1 output = 1.2V (LDO_IN = 1.8V)
76962306a36Sopenharmony_ci	 */
77062306a36Sopenharmony_ci	regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG1,
77162306a36Sopenharmony_ci		RT5677_LDO1_SEL_MASK | RT5677_LDO2_SEL_MASK,
77262306a36Sopenharmony_ci		5 << RT5677_LDO1_SEL_SFT | 5 << RT5677_LDO2_SEL_SFT);
77362306a36Sopenharmony_ci
77462306a36Sopenharmony_ci	/* Codec core power =  power on
77562306a36Sopenharmony_ci	 * LDO1 power = power on
77662306a36Sopenharmony_ci	 */
77762306a36Sopenharmony_ci	regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,
77862306a36Sopenharmony_ci		RT5677_PWR_CORE | RT5677_PWR_LDO1,
77962306a36Sopenharmony_ci		RT5677_PWR_CORE | RT5677_PWR_LDO1);
78062306a36Sopenharmony_ci
78162306a36Sopenharmony_ci	/* Isolation for DCVDD4 = normal (set during probe)
78262306a36Sopenharmony_ci	 * Isolation for DCVDD2 = normal (set during probe)
78362306a36Sopenharmony_ci	 * Isolation for DSP = normal
78462306a36Sopenharmony_ci	 * Isolation for Band 0~7 = disable
78562306a36Sopenharmony_ci	 * Isolation for InBound 4~10 and OutBound 4~10 = disable
78662306a36Sopenharmony_ci	 */
78762306a36Sopenharmony_ci	regmap_write(rt5677->regmap, RT5677_PWR_DSP2,
78862306a36Sopenharmony_ci		RT5677_PWR_CORE_ISO | RT5677_PWR_DSP_ISO |
78962306a36Sopenharmony_ci		RT5677_PWR_SR7_ISO | RT5677_PWR_SR6_ISO |
79062306a36Sopenharmony_ci		RT5677_PWR_SR5_ISO | RT5677_PWR_SR4_ISO |
79162306a36Sopenharmony_ci		RT5677_PWR_SR3_ISO | RT5677_PWR_SR2_ISO |
79262306a36Sopenharmony_ci		RT5677_PWR_SR1_ISO | RT5677_PWR_SR0_ISO |
79362306a36Sopenharmony_ci		RT5677_PWR_MLT_ISO);
79462306a36Sopenharmony_ci
79562306a36Sopenharmony_ci	/* System Band 0~7 = power on
79662306a36Sopenharmony_ci	 * InBound 4~10 and OutBound 4~10 = power on
79762306a36Sopenharmony_ci	 * DSP = power on
79862306a36Sopenharmony_ci	 * DSP CPU = stop (will be set to "run" after firmware loaded)
79962306a36Sopenharmony_ci	 */
80062306a36Sopenharmony_ci	regmap_write(rt5677->regmap, RT5677_PWR_DSP1,
80162306a36Sopenharmony_ci		RT5677_PWR_SR7 | RT5677_PWR_SR6 |
80262306a36Sopenharmony_ci		RT5677_PWR_SR5 | RT5677_PWR_SR4 |
80362306a36Sopenharmony_ci		RT5677_PWR_SR3 | RT5677_PWR_SR2 |
80462306a36Sopenharmony_ci		RT5677_PWR_SR1 | RT5677_PWR_SR0 |
80562306a36Sopenharmony_ci		RT5677_PWR_MLT | RT5677_PWR_DSP |
80662306a36Sopenharmony_ci		RT5677_PWR_DSP_CPU);
80762306a36Sopenharmony_ci
80862306a36Sopenharmony_ci	return 0;
80962306a36Sopenharmony_ci}
81062306a36Sopenharmony_ci
81162306a36Sopenharmony_cistatic int rt5677_parse_and_load_dsp(struct rt5677_priv *rt5677, const u8 *buf,
81262306a36Sopenharmony_ci		unsigned int len)
81362306a36Sopenharmony_ci{
81462306a36Sopenharmony_ci	struct snd_soc_component *component = rt5677->component;
81562306a36Sopenharmony_ci	Elf32_Ehdr *elf_hdr;
81662306a36Sopenharmony_ci	Elf32_Phdr *pr_hdr;
81762306a36Sopenharmony_ci	Elf32_Half i;
81862306a36Sopenharmony_ci	int ret = 0;
81962306a36Sopenharmony_ci
82062306a36Sopenharmony_ci	if (!buf || (len < sizeof(Elf32_Ehdr)))
82162306a36Sopenharmony_ci		return -ENOMEM;
82262306a36Sopenharmony_ci
82362306a36Sopenharmony_ci	elf_hdr = (Elf32_Ehdr *)buf;
82462306a36Sopenharmony_ci#ifndef EM_XTENSA
82562306a36Sopenharmony_ci#define EM_XTENSA	94
82662306a36Sopenharmony_ci#endif
82762306a36Sopenharmony_ci	if (strncmp(elf_hdr->e_ident, ELFMAG, sizeof(ELFMAG) - 1))
82862306a36Sopenharmony_ci		dev_err(component->dev, "Wrong ELF header prefix\n");
82962306a36Sopenharmony_ci	if (elf_hdr->e_ehsize != sizeof(Elf32_Ehdr))
83062306a36Sopenharmony_ci		dev_err(component->dev, "Wrong ELF header size\n");
83162306a36Sopenharmony_ci	if (elf_hdr->e_machine != EM_XTENSA)
83262306a36Sopenharmony_ci		dev_err(component->dev, "Wrong DSP code file\n");
83362306a36Sopenharmony_ci
83462306a36Sopenharmony_ci	if (len < elf_hdr->e_phoff)
83562306a36Sopenharmony_ci		return -ENOMEM;
83662306a36Sopenharmony_ci	pr_hdr = (Elf32_Phdr *)(buf + elf_hdr->e_phoff);
83762306a36Sopenharmony_ci	for (i = 0; i < elf_hdr->e_phnum; i++) {
83862306a36Sopenharmony_ci		/* TODO: handle p_memsz != p_filesz */
83962306a36Sopenharmony_ci		if (pr_hdr->p_paddr && pr_hdr->p_filesz) {
84062306a36Sopenharmony_ci			dev_info(component->dev, "Load 0x%x bytes to 0x%x\n",
84162306a36Sopenharmony_ci					pr_hdr->p_filesz, pr_hdr->p_paddr);
84262306a36Sopenharmony_ci
84362306a36Sopenharmony_ci			ret = rt5677_spi_write(pr_hdr->p_paddr,
84462306a36Sopenharmony_ci					buf + pr_hdr->p_offset,
84562306a36Sopenharmony_ci					pr_hdr->p_filesz);
84662306a36Sopenharmony_ci			if (ret)
84762306a36Sopenharmony_ci				dev_err(component->dev, "Load firmware failed %d\n",
84862306a36Sopenharmony_ci						ret);
84962306a36Sopenharmony_ci		}
85062306a36Sopenharmony_ci		pr_hdr++;
85162306a36Sopenharmony_ci	}
85262306a36Sopenharmony_ci	return ret;
85362306a36Sopenharmony_ci}
85462306a36Sopenharmony_ci
85562306a36Sopenharmony_cistatic int rt5677_load_dsp_from_file(struct rt5677_priv *rt5677)
85662306a36Sopenharmony_ci{
85762306a36Sopenharmony_ci	const struct firmware *fwp;
85862306a36Sopenharmony_ci	struct device *dev = rt5677->component->dev;
85962306a36Sopenharmony_ci	int ret = 0;
86062306a36Sopenharmony_ci
86162306a36Sopenharmony_ci	/* Load dsp firmware from rt5677_elf_vad file */
86262306a36Sopenharmony_ci	ret = request_firmware(&fwp, "rt5677_elf_vad", dev);
86362306a36Sopenharmony_ci	if (ret) {
86462306a36Sopenharmony_ci		dev_err(dev, "Request rt5677_elf_vad failed %d\n", ret);
86562306a36Sopenharmony_ci		return ret;
86662306a36Sopenharmony_ci	}
86762306a36Sopenharmony_ci	dev_info(dev, "Requested rt5677_elf_vad (%zu)\n", fwp->size);
86862306a36Sopenharmony_ci
86962306a36Sopenharmony_ci	ret = rt5677_parse_and_load_dsp(rt5677, fwp->data, fwp->size);
87062306a36Sopenharmony_ci	release_firmware(fwp);
87162306a36Sopenharmony_ci	return ret;
87262306a36Sopenharmony_ci}
87362306a36Sopenharmony_ci
87462306a36Sopenharmony_cistatic int rt5677_set_dsp_vad(struct snd_soc_component *component, bool on)
87562306a36Sopenharmony_ci{
87662306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
87762306a36Sopenharmony_ci	rt5677->dsp_vad_en_request = on;
87862306a36Sopenharmony_ci	rt5677->dsp_vad_en = on;
87962306a36Sopenharmony_ci
88062306a36Sopenharmony_ci	if (!IS_ENABLED(CONFIG_SND_SOC_RT5677_SPI))
88162306a36Sopenharmony_ci		return -ENXIO;
88262306a36Sopenharmony_ci
88362306a36Sopenharmony_ci	schedule_delayed_work(&rt5677->dsp_work, 0);
88462306a36Sopenharmony_ci	return 0;
88562306a36Sopenharmony_ci}
88662306a36Sopenharmony_ci
88762306a36Sopenharmony_cistatic void rt5677_dsp_work(struct work_struct *work)
88862306a36Sopenharmony_ci{
88962306a36Sopenharmony_ci	struct rt5677_priv *rt5677 =
89062306a36Sopenharmony_ci		container_of(work, struct rt5677_priv, dsp_work.work);
89162306a36Sopenharmony_ci	static bool activity;
89262306a36Sopenharmony_ci	bool enable = rt5677->dsp_vad_en;
89362306a36Sopenharmony_ci	int i, val;
89462306a36Sopenharmony_ci
89562306a36Sopenharmony_ci
89662306a36Sopenharmony_ci	dev_info(rt5677->component->dev, "DSP VAD: enable=%d, activity=%d\n",
89762306a36Sopenharmony_ci			enable, activity);
89862306a36Sopenharmony_ci
89962306a36Sopenharmony_ci	if (enable && !activity) {
90062306a36Sopenharmony_ci		activity = true;
90162306a36Sopenharmony_ci
90262306a36Sopenharmony_ci		/* Before a hotword is detected, GPIO1 pin is configured as IRQ
90362306a36Sopenharmony_ci		 * output so that jack detect works. When a hotword is detected,
90462306a36Sopenharmony_ci		 * the DSP firmware configures the GPIO1 pin as GPIO1 and
90562306a36Sopenharmony_ci		 * drives a 1. rt5677_irq() is called after a rising edge on
90662306a36Sopenharmony_ci		 * the GPIO1 pin, due to either jack detect event or hotword
90762306a36Sopenharmony_ci		 * event, or both. All possible events are checked and handled
90862306a36Sopenharmony_ci		 * in rt5677_irq() where GPIO1 pin is configured back to IRQ
90962306a36Sopenharmony_ci		 * output if a hotword is detected.
91062306a36Sopenharmony_ci		 */
91162306a36Sopenharmony_ci
91262306a36Sopenharmony_ci		rt5677_set_vad_source(rt5677);
91362306a36Sopenharmony_ci		rt5677_set_dsp_mode(rt5677, true);
91462306a36Sopenharmony_ci
91562306a36Sopenharmony_ci#define RT5677_BOOT_RETRY 20
91662306a36Sopenharmony_ci		for (i = 0; i < RT5677_BOOT_RETRY; i++) {
91762306a36Sopenharmony_ci			regmap_read(rt5677->regmap, RT5677_PWR_DSP_ST, &val);
91862306a36Sopenharmony_ci			if (val == 0x3ff)
91962306a36Sopenharmony_ci				break;
92062306a36Sopenharmony_ci			udelay(500);
92162306a36Sopenharmony_ci		}
92262306a36Sopenharmony_ci		if (i == RT5677_BOOT_RETRY && val != 0x3ff) {
92362306a36Sopenharmony_ci			dev_err(rt5677->component->dev, "DSP Boot Timed Out!");
92462306a36Sopenharmony_ci			return;
92562306a36Sopenharmony_ci		}
92662306a36Sopenharmony_ci
92762306a36Sopenharmony_ci		/* Boot the firmware from IRAM instead of SRAM0. */
92862306a36Sopenharmony_ci		rt5677_dsp_mode_i2c_write_addr(rt5677, RT5677_DSP_BOOT_VECTOR,
92962306a36Sopenharmony_ci			0x0009, 0x0003);
93062306a36Sopenharmony_ci		rt5677_dsp_mode_i2c_write_addr(rt5677, RT5677_DSP_BOOT_VECTOR,
93162306a36Sopenharmony_ci			0x0019, 0x0003);
93262306a36Sopenharmony_ci		rt5677_dsp_mode_i2c_write_addr(rt5677, RT5677_DSP_BOOT_VECTOR,
93362306a36Sopenharmony_ci			0x0009, 0x0003);
93462306a36Sopenharmony_ci
93562306a36Sopenharmony_ci		rt5677_load_dsp_from_file(rt5677);
93662306a36Sopenharmony_ci
93762306a36Sopenharmony_ci		/* Set DSP CPU to Run */
93862306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_PWR_DSP1,
93962306a36Sopenharmony_ci			RT5677_PWR_DSP_CPU, 0x0);
94062306a36Sopenharmony_ci	} else if (!enable && activity) {
94162306a36Sopenharmony_ci		activity = false;
94262306a36Sopenharmony_ci
94362306a36Sopenharmony_ci		/* Don't turn off the DSP while handling irqs */
94462306a36Sopenharmony_ci		mutex_lock(&rt5677->irq_lock);
94562306a36Sopenharmony_ci		/* Set DSP CPU to Stop */
94662306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_PWR_DSP1,
94762306a36Sopenharmony_ci			RT5677_PWR_DSP_CPU, RT5677_PWR_DSP_CPU);
94862306a36Sopenharmony_ci
94962306a36Sopenharmony_ci		rt5677_set_dsp_mode(rt5677, false);
95062306a36Sopenharmony_ci
95162306a36Sopenharmony_ci		/* Disable and clear VAD interrupt */
95262306a36Sopenharmony_ci		regmap_write(rt5677->regmap, RT5677_VAD_CTRL1, 0x2184);
95362306a36Sopenharmony_ci
95462306a36Sopenharmony_ci		/* Set GPIO1 pin back to be IRQ output for jack detect */
95562306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_GPIO_CTRL1,
95662306a36Sopenharmony_ci			RT5677_GPIO1_PIN_MASK, RT5677_GPIO1_PIN_IRQ);
95762306a36Sopenharmony_ci
95862306a36Sopenharmony_ci		mutex_unlock(&rt5677->irq_lock);
95962306a36Sopenharmony_ci	}
96062306a36Sopenharmony_ci}
96162306a36Sopenharmony_ci
96262306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -6525, 75, 0);
96362306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -1725, 75, 0);
96462306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0);
96562306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(st_vol_tlv, -4650, 150, 0);
96662306a36Sopenharmony_ci
96762306a36Sopenharmony_ci/* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */
96862306a36Sopenharmony_cistatic const DECLARE_TLV_DB_RANGE(bst_tlv,
96962306a36Sopenharmony_ci	0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
97062306a36Sopenharmony_ci	1, 1, TLV_DB_SCALE_ITEM(2000, 0, 0),
97162306a36Sopenharmony_ci	2, 2, TLV_DB_SCALE_ITEM(2400, 0, 0),
97262306a36Sopenharmony_ci	3, 5, TLV_DB_SCALE_ITEM(3000, 500, 0),
97362306a36Sopenharmony_ci	6, 6, TLV_DB_SCALE_ITEM(4400, 0, 0),
97462306a36Sopenharmony_ci	7, 7, TLV_DB_SCALE_ITEM(5000, 0, 0),
97562306a36Sopenharmony_ci	8, 8, TLV_DB_SCALE_ITEM(5200, 0, 0)
97662306a36Sopenharmony_ci);
97762306a36Sopenharmony_ci
97862306a36Sopenharmony_cistatic int rt5677_dsp_vad_get(struct snd_kcontrol *kcontrol,
97962306a36Sopenharmony_ci		struct snd_ctl_elem_value *ucontrol)
98062306a36Sopenharmony_ci{
98162306a36Sopenharmony_ci	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
98262306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
98362306a36Sopenharmony_ci
98462306a36Sopenharmony_ci	ucontrol->value.integer.value[0] = rt5677->dsp_vad_en_request;
98562306a36Sopenharmony_ci
98662306a36Sopenharmony_ci	return 0;
98762306a36Sopenharmony_ci}
98862306a36Sopenharmony_ci
98962306a36Sopenharmony_cistatic int rt5677_dsp_vad_put(struct snd_kcontrol *kcontrol,
99062306a36Sopenharmony_ci		struct snd_ctl_elem_value *ucontrol)
99162306a36Sopenharmony_ci{
99262306a36Sopenharmony_ci	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
99362306a36Sopenharmony_ci
99462306a36Sopenharmony_ci	rt5677_set_dsp_vad(component, !!ucontrol->value.integer.value[0]);
99562306a36Sopenharmony_ci
99662306a36Sopenharmony_ci	return 0;
99762306a36Sopenharmony_ci}
99862306a36Sopenharmony_ci
99962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_snd_controls[] = {
100062306a36Sopenharmony_ci	/* OUTPUT Control */
100162306a36Sopenharmony_ci	SOC_SINGLE("OUT1 Playback Switch", RT5677_LOUT1,
100262306a36Sopenharmony_ci		RT5677_LOUT1_L_MUTE_SFT, 1, 1),
100362306a36Sopenharmony_ci	SOC_SINGLE("OUT2 Playback Switch", RT5677_LOUT1,
100462306a36Sopenharmony_ci		RT5677_LOUT2_L_MUTE_SFT, 1, 1),
100562306a36Sopenharmony_ci	SOC_SINGLE("OUT3 Playback Switch", RT5677_LOUT1,
100662306a36Sopenharmony_ci		RT5677_LOUT3_L_MUTE_SFT, 1, 1),
100762306a36Sopenharmony_ci
100862306a36Sopenharmony_ci	/* DAC Digital Volume */
100962306a36Sopenharmony_ci	SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5677_DAC1_DIG_VOL,
101062306a36Sopenharmony_ci		RT5677_L_VOL_SFT, RT5677_R_VOL_SFT, 127, 0, dac_vol_tlv),
101162306a36Sopenharmony_ci	SOC_DOUBLE_TLV("DAC2 Playback Volume", RT5677_DAC2_DIG_VOL,
101262306a36Sopenharmony_ci		RT5677_L_VOL_SFT, RT5677_R_VOL_SFT, 127, 0, dac_vol_tlv),
101362306a36Sopenharmony_ci	SOC_DOUBLE_TLV("DAC3 Playback Volume", RT5677_DAC3_DIG_VOL,
101462306a36Sopenharmony_ci		RT5677_L_VOL_SFT, RT5677_R_VOL_SFT, 127, 0, dac_vol_tlv),
101562306a36Sopenharmony_ci	SOC_DOUBLE_TLV("DAC4 Playback Volume", RT5677_DAC4_DIG_VOL,
101662306a36Sopenharmony_ci		RT5677_L_VOL_SFT, RT5677_R_VOL_SFT, 127, 0, dac_vol_tlv),
101762306a36Sopenharmony_ci
101862306a36Sopenharmony_ci	/* IN1/IN2 Control */
101962306a36Sopenharmony_ci	SOC_SINGLE_TLV("IN1 Boost", RT5677_IN1, RT5677_BST_SFT1, 8, 0, bst_tlv),
102062306a36Sopenharmony_ci	SOC_SINGLE_TLV("IN2 Boost", RT5677_IN1, RT5677_BST_SFT2, 8, 0, bst_tlv),
102162306a36Sopenharmony_ci
102262306a36Sopenharmony_ci	/* ADC Digital Volume Control */
102362306a36Sopenharmony_ci	SOC_DOUBLE("ADC1 Capture Switch", RT5677_STO1_ADC_DIG_VOL,
102462306a36Sopenharmony_ci		RT5677_L_MUTE_SFT, RT5677_R_MUTE_SFT, 1, 1),
102562306a36Sopenharmony_ci	SOC_DOUBLE("ADC2 Capture Switch", RT5677_STO2_ADC_DIG_VOL,
102662306a36Sopenharmony_ci		RT5677_L_MUTE_SFT, RT5677_R_MUTE_SFT, 1, 1),
102762306a36Sopenharmony_ci	SOC_DOUBLE("ADC3 Capture Switch", RT5677_STO3_ADC_DIG_VOL,
102862306a36Sopenharmony_ci		RT5677_L_MUTE_SFT, RT5677_R_MUTE_SFT, 1, 1),
102962306a36Sopenharmony_ci	SOC_DOUBLE("ADC4 Capture Switch", RT5677_STO4_ADC_DIG_VOL,
103062306a36Sopenharmony_ci		RT5677_L_MUTE_SFT, RT5677_R_MUTE_SFT, 1, 1),
103162306a36Sopenharmony_ci	SOC_DOUBLE("Mono ADC Capture Switch", RT5677_MONO_ADC_DIG_VOL,
103262306a36Sopenharmony_ci		RT5677_L_MUTE_SFT, RT5677_R_MUTE_SFT, 1, 1),
103362306a36Sopenharmony_ci
103462306a36Sopenharmony_ci	SOC_DOUBLE_TLV("ADC1 Capture Volume", RT5677_STO1_ADC_DIG_VOL,
103562306a36Sopenharmony_ci		RT5677_STO1_ADC_L_VOL_SFT, RT5677_STO1_ADC_R_VOL_SFT, 63, 0,
103662306a36Sopenharmony_ci		adc_vol_tlv),
103762306a36Sopenharmony_ci	SOC_DOUBLE_TLV("ADC2 Capture Volume", RT5677_STO2_ADC_DIG_VOL,
103862306a36Sopenharmony_ci		RT5677_STO1_ADC_L_VOL_SFT, RT5677_STO1_ADC_R_VOL_SFT, 63, 0,
103962306a36Sopenharmony_ci		adc_vol_tlv),
104062306a36Sopenharmony_ci	SOC_DOUBLE_TLV("ADC3 Capture Volume", RT5677_STO3_ADC_DIG_VOL,
104162306a36Sopenharmony_ci		RT5677_STO1_ADC_L_VOL_SFT, RT5677_STO1_ADC_R_VOL_SFT, 63, 0,
104262306a36Sopenharmony_ci		adc_vol_tlv),
104362306a36Sopenharmony_ci	SOC_DOUBLE_TLV("ADC4 Capture Volume", RT5677_STO4_ADC_DIG_VOL,
104462306a36Sopenharmony_ci		RT5677_STO1_ADC_L_VOL_SFT, RT5677_STO1_ADC_R_VOL_SFT, 63, 0,
104562306a36Sopenharmony_ci		adc_vol_tlv),
104662306a36Sopenharmony_ci	SOC_DOUBLE_TLV("Mono ADC Capture Volume", RT5677_MONO_ADC_DIG_VOL,
104762306a36Sopenharmony_ci		RT5677_MONO_ADC_L_VOL_SFT, RT5677_MONO_ADC_R_VOL_SFT, 63, 0,
104862306a36Sopenharmony_ci		adc_vol_tlv),
104962306a36Sopenharmony_ci
105062306a36Sopenharmony_ci	/* Sidetone Control */
105162306a36Sopenharmony_ci	SOC_SINGLE_TLV("Sidetone Volume", RT5677_SIDETONE_CTRL,
105262306a36Sopenharmony_ci		RT5677_ST_VOL_SFT, 31, 0, st_vol_tlv),
105362306a36Sopenharmony_ci
105462306a36Sopenharmony_ci	/* ADC Boost Volume Control */
105562306a36Sopenharmony_ci	SOC_DOUBLE_TLV("STO1 ADC Boost Volume", RT5677_STO1_2_ADC_BST,
105662306a36Sopenharmony_ci		RT5677_STO1_ADC_L_BST_SFT, RT5677_STO1_ADC_R_BST_SFT, 3, 0,
105762306a36Sopenharmony_ci		adc_bst_tlv),
105862306a36Sopenharmony_ci	SOC_DOUBLE_TLV("STO2 ADC Boost Volume", RT5677_STO1_2_ADC_BST,
105962306a36Sopenharmony_ci		RT5677_STO2_ADC_L_BST_SFT, RT5677_STO2_ADC_R_BST_SFT, 3, 0,
106062306a36Sopenharmony_ci		adc_bst_tlv),
106162306a36Sopenharmony_ci	SOC_DOUBLE_TLV("STO3 ADC Boost Volume", RT5677_STO3_4_ADC_BST,
106262306a36Sopenharmony_ci		RT5677_STO3_ADC_L_BST_SFT, RT5677_STO3_ADC_R_BST_SFT, 3, 0,
106362306a36Sopenharmony_ci		adc_bst_tlv),
106462306a36Sopenharmony_ci	SOC_DOUBLE_TLV("STO4 ADC Boost Volume", RT5677_STO3_4_ADC_BST,
106562306a36Sopenharmony_ci		RT5677_STO4_ADC_L_BST_SFT, RT5677_STO4_ADC_R_BST_SFT, 3, 0,
106662306a36Sopenharmony_ci		adc_bst_tlv),
106762306a36Sopenharmony_ci	SOC_DOUBLE_TLV("Mono ADC Boost Volume", RT5677_ADC_BST_CTRL2,
106862306a36Sopenharmony_ci		RT5677_MONO_ADC_L_BST_SFT, RT5677_MONO_ADC_R_BST_SFT, 3, 0,
106962306a36Sopenharmony_ci		adc_bst_tlv),
107062306a36Sopenharmony_ci
107162306a36Sopenharmony_ci	SOC_SINGLE_EXT("DSP VAD Switch", SND_SOC_NOPM, 0, 1, 0,
107262306a36Sopenharmony_ci		rt5677_dsp_vad_get, rt5677_dsp_vad_put),
107362306a36Sopenharmony_ci};
107462306a36Sopenharmony_ci
107562306a36Sopenharmony_ci/**
107662306a36Sopenharmony_ci * set_dmic_clk - Set parameter of dmic.
107762306a36Sopenharmony_ci *
107862306a36Sopenharmony_ci * @w: DAPM widget.
107962306a36Sopenharmony_ci * @kcontrol: The kcontrol of this widget.
108062306a36Sopenharmony_ci * @event: Event id.
108162306a36Sopenharmony_ci *
108262306a36Sopenharmony_ci * Choose dmic clock between 1MHz and 3MHz.
108362306a36Sopenharmony_ci * It is better for clock to approximate 3MHz.
108462306a36Sopenharmony_ci */
108562306a36Sopenharmony_cistatic int set_dmic_clk(struct snd_soc_dapm_widget *w,
108662306a36Sopenharmony_ci	struct snd_kcontrol *kcontrol, int event)
108762306a36Sopenharmony_ci{
108862306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
108962306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
109062306a36Sopenharmony_ci	int idx, rate;
109162306a36Sopenharmony_ci
109262306a36Sopenharmony_ci	rate = rt5677->sysclk / rl6231_get_pre_div(rt5677->regmap,
109362306a36Sopenharmony_ci		RT5677_CLK_TREE_CTRL1, RT5677_I2S_PD1_SFT);
109462306a36Sopenharmony_ci	idx = rl6231_calc_dmic_clk(rate);
109562306a36Sopenharmony_ci	if (idx < 0)
109662306a36Sopenharmony_ci		dev_err(component->dev, "Failed to set DMIC clock\n");
109762306a36Sopenharmony_ci	else
109862306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_DMIC_CTRL1,
109962306a36Sopenharmony_ci			RT5677_DMIC_CLK_MASK, idx << RT5677_DMIC_CLK_SFT);
110062306a36Sopenharmony_ci	return idx;
110162306a36Sopenharmony_ci}
110262306a36Sopenharmony_ci
110362306a36Sopenharmony_cistatic int is_sys_clk_from_pll(struct snd_soc_dapm_widget *source,
110462306a36Sopenharmony_ci			 struct snd_soc_dapm_widget *sink)
110562306a36Sopenharmony_ci{
110662306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm);
110762306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
110862306a36Sopenharmony_ci	unsigned int val;
110962306a36Sopenharmony_ci
111062306a36Sopenharmony_ci	regmap_read(rt5677->regmap, RT5677_GLB_CLK1, &val);
111162306a36Sopenharmony_ci	val &= RT5677_SCLK_SRC_MASK;
111262306a36Sopenharmony_ci	if (val == RT5677_SCLK_SRC_PLL1)
111362306a36Sopenharmony_ci		return 1;
111462306a36Sopenharmony_ci	else
111562306a36Sopenharmony_ci		return 0;
111662306a36Sopenharmony_ci}
111762306a36Sopenharmony_ci
111862306a36Sopenharmony_cistatic int is_using_asrc(struct snd_soc_dapm_widget *source,
111962306a36Sopenharmony_ci			 struct snd_soc_dapm_widget *sink)
112062306a36Sopenharmony_ci{
112162306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm);
112262306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
112362306a36Sopenharmony_ci	unsigned int reg, shift, val;
112462306a36Sopenharmony_ci
112562306a36Sopenharmony_ci	if (source->reg == RT5677_ASRC_1) {
112662306a36Sopenharmony_ci		switch (source->shift) {
112762306a36Sopenharmony_ci		case 12:
112862306a36Sopenharmony_ci			reg = RT5677_ASRC_4;
112962306a36Sopenharmony_ci			shift = 0;
113062306a36Sopenharmony_ci			break;
113162306a36Sopenharmony_ci		case 13:
113262306a36Sopenharmony_ci			reg = RT5677_ASRC_4;
113362306a36Sopenharmony_ci			shift = 4;
113462306a36Sopenharmony_ci			break;
113562306a36Sopenharmony_ci		case 14:
113662306a36Sopenharmony_ci			reg = RT5677_ASRC_4;
113762306a36Sopenharmony_ci			shift = 8;
113862306a36Sopenharmony_ci			break;
113962306a36Sopenharmony_ci		case 15:
114062306a36Sopenharmony_ci			reg = RT5677_ASRC_4;
114162306a36Sopenharmony_ci			shift = 12;
114262306a36Sopenharmony_ci			break;
114362306a36Sopenharmony_ci		default:
114462306a36Sopenharmony_ci			return 0;
114562306a36Sopenharmony_ci		}
114662306a36Sopenharmony_ci	} else {
114762306a36Sopenharmony_ci		switch (source->shift) {
114862306a36Sopenharmony_ci		case 0:
114962306a36Sopenharmony_ci			reg = RT5677_ASRC_6;
115062306a36Sopenharmony_ci			shift = 8;
115162306a36Sopenharmony_ci			break;
115262306a36Sopenharmony_ci		case 1:
115362306a36Sopenharmony_ci			reg = RT5677_ASRC_6;
115462306a36Sopenharmony_ci			shift = 12;
115562306a36Sopenharmony_ci			break;
115662306a36Sopenharmony_ci		case 2:
115762306a36Sopenharmony_ci			reg = RT5677_ASRC_5;
115862306a36Sopenharmony_ci			shift = 0;
115962306a36Sopenharmony_ci			break;
116062306a36Sopenharmony_ci		case 3:
116162306a36Sopenharmony_ci			reg = RT5677_ASRC_5;
116262306a36Sopenharmony_ci			shift = 4;
116362306a36Sopenharmony_ci			break;
116462306a36Sopenharmony_ci		case 4:
116562306a36Sopenharmony_ci			reg = RT5677_ASRC_5;
116662306a36Sopenharmony_ci			shift = 8;
116762306a36Sopenharmony_ci			break;
116862306a36Sopenharmony_ci		case 5:
116962306a36Sopenharmony_ci			reg = RT5677_ASRC_5;
117062306a36Sopenharmony_ci			shift = 12;
117162306a36Sopenharmony_ci			break;
117262306a36Sopenharmony_ci		case 12:
117362306a36Sopenharmony_ci			reg = RT5677_ASRC_3;
117462306a36Sopenharmony_ci			shift = 0;
117562306a36Sopenharmony_ci			break;
117662306a36Sopenharmony_ci		case 13:
117762306a36Sopenharmony_ci			reg = RT5677_ASRC_3;
117862306a36Sopenharmony_ci			shift = 4;
117962306a36Sopenharmony_ci			break;
118062306a36Sopenharmony_ci		case 14:
118162306a36Sopenharmony_ci			reg = RT5677_ASRC_3;
118262306a36Sopenharmony_ci			shift = 12;
118362306a36Sopenharmony_ci			break;
118462306a36Sopenharmony_ci		default:
118562306a36Sopenharmony_ci			return 0;
118662306a36Sopenharmony_ci		}
118762306a36Sopenharmony_ci	}
118862306a36Sopenharmony_ci
118962306a36Sopenharmony_ci	regmap_read(rt5677->regmap, reg, &val);
119062306a36Sopenharmony_ci	val = (val >> shift) & 0xf;
119162306a36Sopenharmony_ci
119262306a36Sopenharmony_ci	switch (val) {
119362306a36Sopenharmony_ci	case 1 ... 6:
119462306a36Sopenharmony_ci		return 1;
119562306a36Sopenharmony_ci	default:
119662306a36Sopenharmony_ci		return 0;
119762306a36Sopenharmony_ci	}
119862306a36Sopenharmony_ci
119962306a36Sopenharmony_ci}
120062306a36Sopenharmony_ci
120162306a36Sopenharmony_cistatic int can_use_asrc(struct snd_soc_dapm_widget *source,
120262306a36Sopenharmony_ci			 struct snd_soc_dapm_widget *sink)
120362306a36Sopenharmony_ci{
120462306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm);
120562306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
120662306a36Sopenharmony_ci
120762306a36Sopenharmony_ci	if (rt5677->sysclk > rt5677->lrck[RT5677_AIF1] * 384)
120862306a36Sopenharmony_ci		return 1;
120962306a36Sopenharmony_ci
121062306a36Sopenharmony_ci	return 0;
121162306a36Sopenharmony_ci}
121262306a36Sopenharmony_ci
121362306a36Sopenharmony_ci/**
121462306a36Sopenharmony_ci * rt5677_sel_asrc_clk_src - select ASRC clock source for a set of filters
121562306a36Sopenharmony_ci * @component: SoC audio component device.
121662306a36Sopenharmony_ci * @filter_mask: mask of filters.
121762306a36Sopenharmony_ci * @clk_src: clock source
121862306a36Sopenharmony_ci *
121962306a36Sopenharmony_ci * The ASRC function is for asynchronous MCLK and LRCK. Also, since RT5677 can
122062306a36Sopenharmony_ci * only support standard 32fs or 64fs i2s format, ASRC should be enabled to
122162306a36Sopenharmony_ci * support special i2s clock format such as Intel's 100fs(100 * sampling rate).
122262306a36Sopenharmony_ci * ASRC function will track i2s clock and generate a corresponding system clock
122362306a36Sopenharmony_ci * for codec. This function provides an API to select the clock source for a
122462306a36Sopenharmony_ci * set of filters specified by the mask. And the codec driver will turn on ASRC
122562306a36Sopenharmony_ci * for these filters if ASRC is selected as their clock source.
122662306a36Sopenharmony_ci */
122762306a36Sopenharmony_ciint rt5677_sel_asrc_clk_src(struct snd_soc_component *component,
122862306a36Sopenharmony_ci		unsigned int filter_mask, unsigned int clk_src)
122962306a36Sopenharmony_ci{
123062306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
123162306a36Sopenharmony_ci	unsigned int asrc3_mask = 0, asrc3_value = 0;
123262306a36Sopenharmony_ci	unsigned int asrc4_mask = 0, asrc4_value = 0;
123362306a36Sopenharmony_ci	unsigned int asrc5_mask = 0, asrc5_value = 0;
123462306a36Sopenharmony_ci	unsigned int asrc6_mask = 0, asrc6_value = 0;
123562306a36Sopenharmony_ci	unsigned int asrc7_mask = 0, asrc7_value = 0;
123662306a36Sopenharmony_ci	unsigned int asrc8_mask = 0, asrc8_value = 0;
123762306a36Sopenharmony_ci
123862306a36Sopenharmony_ci	switch (clk_src) {
123962306a36Sopenharmony_ci	case RT5677_CLK_SEL_SYS:
124062306a36Sopenharmony_ci	case RT5677_CLK_SEL_I2S1_ASRC:
124162306a36Sopenharmony_ci	case RT5677_CLK_SEL_I2S2_ASRC:
124262306a36Sopenharmony_ci	case RT5677_CLK_SEL_I2S3_ASRC:
124362306a36Sopenharmony_ci	case RT5677_CLK_SEL_I2S4_ASRC:
124462306a36Sopenharmony_ci	case RT5677_CLK_SEL_I2S5_ASRC:
124562306a36Sopenharmony_ci	case RT5677_CLK_SEL_I2S6_ASRC:
124662306a36Sopenharmony_ci	case RT5677_CLK_SEL_SYS2:
124762306a36Sopenharmony_ci	case RT5677_CLK_SEL_SYS3:
124862306a36Sopenharmony_ci	case RT5677_CLK_SEL_SYS4:
124962306a36Sopenharmony_ci	case RT5677_CLK_SEL_SYS5:
125062306a36Sopenharmony_ci	case RT5677_CLK_SEL_SYS6:
125162306a36Sopenharmony_ci	case RT5677_CLK_SEL_SYS7:
125262306a36Sopenharmony_ci		break;
125362306a36Sopenharmony_ci
125462306a36Sopenharmony_ci	default:
125562306a36Sopenharmony_ci		return -EINVAL;
125662306a36Sopenharmony_ci	}
125762306a36Sopenharmony_ci
125862306a36Sopenharmony_ci	/* ASRC 3 */
125962306a36Sopenharmony_ci	if (filter_mask & RT5677_DA_STEREO_FILTER) {
126062306a36Sopenharmony_ci		asrc3_mask |= RT5677_DA_STO_CLK_SEL_MASK;
126162306a36Sopenharmony_ci		asrc3_value = (asrc3_value & ~RT5677_DA_STO_CLK_SEL_MASK)
126262306a36Sopenharmony_ci			| (clk_src << RT5677_DA_STO_CLK_SEL_SFT);
126362306a36Sopenharmony_ci	}
126462306a36Sopenharmony_ci
126562306a36Sopenharmony_ci	if (filter_mask & RT5677_DA_MONO2_L_FILTER) {
126662306a36Sopenharmony_ci		asrc3_mask |= RT5677_DA_MONO2L_CLK_SEL_MASK;
126762306a36Sopenharmony_ci		asrc3_value = (asrc3_value & ~RT5677_DA_MONO2L_CLK_SEL_MASK)
126862306a36Sopenharmony_ci			| (clk_src << RT5677_DA_MONO2L_CLK_SEL_SFT);
126962306a36Sopenharmony_ci	}
127062306a36Sopenharmony_ci
127162306a36Sopenharmony_ci	if (filter_mask & RT5677_DA_MONO2_R_FILTER) {
127262306a36Sopenharmony_ci		asrc3_mask |= RT5677_DA_MONO2R_CLK_SEL_MASK;
127362306a36Sopenharmony_ci		asrc3_value = (asrc3_value & ~RT5677_DA_MONO2R_CLK_SEL_MASK)
127462306a36Sopenharmony_ci			| (clk_src << RT5677_DA_MONO2R_CLK_SEL_SFT);
127562306a36Sopenharmony_ci	}
127662306a36Sopenharmony_ci
127762306a36Sopenharmony_ci	if (asrc3_mask)
127862306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_ASRC_3, asrc3_mask,
127962306a36Sopenharmony_ci			asrc3_value);
128062306a36Sopenharmony_ci
128162306a36Sopenharmony_ci	/* ASRC 4 */
128262306a36Sopenharmony_ci	if (filter_mask & RT5677_DA_MONO3_L_FILTER) {
128362306a36Sopenharmony_ci		asrc4_mask |= RT5677_DA_MONO3L_CLK_SEL_MASK;
128462306a36Sopenharmony_ci		asrc4_value = (asrc4_value & ~RT5677_DA_MONO3L_CLK_SEL_MASK)
128562306a36Sopenharmony_ci			| (clk_src << RT5677_DA_MONO3L_CLK_SEL_SFT);
128662306a36Sopenharmony_ci	}
128762306a36Sopenharmony_ci
128862306a36Sopenharmony_ci	if (filter_mask & RT5677_DA_MONO3_R_FILTER) {
128962306a36Sopenharmony_ci		asrc4_mask |= RT5677_DA_MONO3R_CLK_SEL_MASK;
129062306a36Sopenharmony_ci		asrc4_value = (asrc4_value & ~RT5677_DA_MONO3R_CLK_SEL_MASK)
129162306a36Sopenharmony_ci			| (clk_src << RT5677_DA_MONO3R_CLK_SEL_SFT);
129262306a36Sopenharmony_ci	}
129362306a36Sopenharmony_ci
129462306a36Sopenharmony_ci	if (filter_mask & RT5677_DA_MONO4_L_FILTER) {
129562306a36Sopenharmony_ci		asrc4_mask |= RT5677_DA_MONO4L_CLK_SEL_MASK;
129662306a36Sopenharmony_ci		asrc4_value = (asrc4_value & ~RT5677_DA_MONO4L_CLK_SEL_MASK)
129762306a36Sopenharmony_ci			| (clk_src << RT5677_DA_MONO4L_CLK_SEL_SFT);
129862306a36Sopenharmony_ci	}
129962306a36Sopenharmony_ci
130062306a36Sopenharmony_ci	if (filter_mask & RT5677_DA_MONO4_R_FILTER) {
130162306a36Sopenharmony_ci		asrc4_mask |= RT5677_DA_MONO4R_CLK_SEL_MASK;
130262306a36Sopenharmony_ci		asrc4_value = (asrc4_value & ~RT5677_DA_MONO4R_CLK_SEL_MASK)
130362306a36Sopenharmony_ci			| (clk_src << RT5677_DA_MONO4R_CLK_SEL_SFT);
130462306a36Sopenharmony_ci	}
130562306a36Sopenharmony_ci
130662306a36Sopenharmony_ci	if (asrc4_mask)
130762306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_ASRC_4, asrc4_mask,
130862306a36Sopenharmony_ci			asrc4_value);
130962306a36Sopenharmony_ci
131062306a36Sopenharmony_ci	/* ASRC 5 */
131162306a36Sopenharmony_ci	if (filter_mask & RT5677_AD_STEREO1_FILTER) {
131262306a36Sopenharmony_ci		asrc5_mask |= RT5677_AD_STO1_CLK_SEL_MASK;
131362306a36Sopenharmony_ci		asrc5_value = (asrc5_value & ~RT5677_AD_STO1_CLK_SEL_MASK)
131462306a36Sopenharmony_ci			| (clk_src << RT5677_AD_STO1_CLK_SEL_SFT);
131562306a36Sopenharmony_ci	}
131662306a36Sopenharmony_ci
131762306a36Sopenharmony_ci	if (filter_mask & RT5677_AD_STEREO2_FILTER) {
131862306a36Sopenharmony_ci		asrc5_mask |= RT5677_AD_STO2_CLK_SEL_MASK;
131962306a36Sopenharmony_ci		asrc5_value = (asrc5_value & ~RT5677_AD_STO2_CLK_SEL_MASK)
132062306a36Sopenharmony_ci			| (clk_src << RT5677_AD_STO2_CLK_SEL_SFT);
132162306a36Sopenharmony_ci	}
132262306a36Sopenharmony_ci
132362306a36Sopenharmony_ci	if (filter_mask & RT5677_AD_STEREO3_FILTER) {
132462306a36Sopenharmony_ci		asrc5_mask |= RT5677_AD_STO3_CLK_SEL_MASK;
132562306a36Sopenharmony_ci		asrc5_value = (asrc5_value & ~RT5677_AD_STO3_CLK_SEL_MASK)
132662306a36Sopenharmony_ci			| (clk_src << RT5677_AD_STO3_CLK_SEL_SFT);
132762306a36Sopenharmony_ci	}
132862306a36Sopenharmony_ci
132962306a36Sopenharmony_ci	if (filter_mask & RT5677_AD_STEREO4_FILTER) {
133062306a36Sopenharmony_ci		asrc5_mask |= RT5677_AD_STO4_CLK_SEL_MASK;
133162306a36Sopenharmony_ci		asrc5_value = (asrc5_value & ~RT5677_AD_STO4_CLK_SEL_MASK)
133262306a36Sopenharmony_ci			| (clk_src << RT5677_AD_STO4_CLK_SEL_SFT);
133362306a36Sopenharmony_ci	}
133462306a36Sopenharmony_ci
133562306a36Sopenharmony_ci	if (asrc5_mask)
133662306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_ASRC_5, asrc5_mask,
133762306a36Sopenharmony_ci			asrc5_value);
133862306a36Sopenharmony_ci
133962306a36Sopenharmony_ci	/* ASRC 6 */
134062306a36Sopenharmony_ci	if (filter_mask & RT5677_AD_MONO_L_FILTER) {
134162306a36Sopenharmony_ci		asrc6_mask |= RT5677_AD_MONOL_CLK_SEL_MASK;
134262306a36Sopenharmony_ci		asrc6_value = (asrc6_value & ~RT5677_AD_MONOL_CLK_SEL_MASK)
134362306a36Sopenharmony_ci			| (clk_src << RT5677_AD_MONOL_CLK_SEL_SFT);
134462306a36Sopenharmony_ci	}
134562306a36Sopenharmony_ci
134662306a36Sopenharmony_ci	if (filter_mask & RT5677_AD_MONO_R_FILTER) {
134762306a36Sopenharmony_ci		asrc6_mask |= RT5677_AD_MONOR_CLK_SEL_MASK;
134862306a36Sopenharmony_ci		asrc6_value = (asrc6_value & ~RT5677_AD_MONOR_CLK_SEL_MASK)
134962306a36Sopenharmony_ci			| (clk_src << RT5677_AD_MONOR_CLK_SEL_SFT);
135062306a36Sopenharmony_ci	}
135162306a36Sopenharmony_ci
135262306a36Sopenharmony_ci	if (asrc6_mask)
135362306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_ASRC_6, asrc6_mask,
135462306a36Sopenharmony_ci			asrc6_value);
135562306a36Sopenharmony_ci
135662306a36Sopenharmony_ci	/* ASRC 7 */
135762306a36Sopenharmony_ci	if (filter_mask & RT5677_DSP_OB_0_3_FILTER) {
135862306a36Sopenharmony_ci		asrc7_mask |= RT5677_DSP_OB_0_3_CLK_SEL_MASK;
135962306a36Sopenharmony_ci		asrc7_value = (asrc7_value & ~RT5677_DSP_OB_0_3_CLK_SEL_MASK)
136062306a36Sopenharmony_ci			| (clk_src << RT5677_DSP_OB_0_3_CLK_SEL_SFT);
136162306a36Sopenharmony_ci	}
136262306a36Sopenharmony_ci
136362306a36Sopenharmony_ci	if (filter_mask & RT5677_DSP_OB_4_7_FILTER) {
136462306a36Sopenharmony_ci		asrc7_mask |= RT5677_DSP_OB_4_7_CLK_SEL_MASK;
136562306a36Sopenharmony_ci		asrc7_value = (asrc7_value & ~RT5677_DSP_OB_4_7_CLK_SEL_MASK)
136662306a36Sopenharmony_ci			| (clk_src << RT5677_DSP_OB_4_7_CLK_SEL_SFT);
136762306a36Sopenharmony_ci	}
136862306a36Sopenharmony_ci
136962306a36Sopenharmony_ci	if (asrc7_mask)
137062306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_ASRC_7, asrc7_mask,
137162306a36Sopenharmony_ci			asrc7_value);
137262306a36Sopenharmony_ci
137362306a36Sopenharmony_ci	/* ASRC 8 */
137462306a36Sopenharmony_ci	if (filter_mask & RT5677_I2S1_SOURCE) {
137562306a36Sopenharmony_ci		asrc8_mask |= RT5677_I2S1_CLK_SEL_MASK;
137662306a36Sopenharmony_ci		asrc8_value = (asrc8_value & ~RT5677_I2S1_CLK_SEL_MASK)
137762306a36Sopenharmony_ci			| ((clk_src - 1) << RT5677_I2S1_CLK_SEL_SFT);
137862306a36Sopenharmony_ci	}
137962306a36Sopenharmony_ci
138062306a36Sopenharmony_ci	if (filter_mask & RT5677_I2S2_SOURCE) {
138162306a36Sopenharmony_ci		asrc8_mask |= RT5677_I2S2_CLK_SEL_MASK;
138262306a36Sopenharmony_ci		asrc8_value = (asrc8_value & ~RT5677_I2S2_CLK_SEL_MASK)
138362306a36Sopenharmony_ci			| ((clk_src - 1) << RT5677_I2S2_CLK_SEL_SFT);
138462306a36Sopenharmony_ci	}
138562306a36Sopenharmony_ci
138662306a36Sopenharmony_ci	if (filter_mask & RT5677_I2S3_SOURCE) {
138762306a36Sopenharmony_ci		asrc8_mask |= RT5677_I2S3_CLK_SEL_MASK;
138862306a36Sopenharmony_ci		asrc8_value = (asrc8_value & ~RT5677_I2S3_CLK_SEL_MASK)
138962306a36Sopenharmony_ci			| ((clk_src - 1) << RT5677_I2S3_CLK_SEL_SFT);
139062306a36Sopenharmony_ci	}
139162306a36Sopenharmony_ci
139262306a36Sopenharmony_ci	if (filter_mask & RT5677_I2S4_SOURCE) {
139362306a36Sopenharmony_ci		asrc8_mask |= RT5677_I2S4_CLK_SEL_MASK;
139462306a36Sopenharmony_ci		asrc8_value = (asrc8_value & ~RT5677_I2S4_CLK_SEL_MASK)
139562306a36Sopenharmony_ci			| ((clk_src - 1) << RT5677_I2S4_CLK_SEL_SFT);
139662306a36Sopenharmony_ci	}
139762306a36Sopenharmony_ci
139862306a36Sopenharmony_ci	if (asrc8_mask)
139962306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_ASRC_8, asrc8_mask,
140062306a36Sopenharmony_ci			asrc8_value);
140162306a36Sopenharmony_ci
140262306a36Sopenharmony_ci	return 0;
140362306a36Sopenharmony_ci}
140462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5677_sel_asrc_clk_src);
140562306a36Sopenharmony_ci
140662306a36Sopenharmony_cistatic int rt5677_dmic_use_asrc(struct snd_soc_dapm_widget *source,
140762306a36Sopenharmony_ci			 struct snd_soc_dapm_widget *sink)
140862306a36Sopenharmony_ci{
140962306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm);
141062306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
141162306a36Sopenharmony_ci	unsigned int asrc_setting;
141262306a36Sopenharmony_ci
141362306a36Sopenharmony_ci	switch (source->shift) {
141462306a36Sopenharmony_ci	case 11:
141562306a36Sopenharmony_ci		regmap_read(rt5677->regmap, RT5677_ASRC_5, &asrc_setting);
141662306a36Sopenharmony_ci		asrc_setting = (asrc_setting & RT5677_AD_STO1_CLK_SEL_MASK) >>
141762306a36Sopenharmony_ci				RT5677_AD_STO1_CLK_SEL_SFT;
141862306a36Sopenharmony_ci		break;
141962306a36Sopenharmony_ci
142062306a36Sopenharmony_ci	case 10:
142162306a36Sopenharmony_ci		regmap_read(rt5677->regmap, RT5677_ASRC_5, &asrc_setting);
142262306a36Sopenharmony_ci		asrc_setting = (asrc_setting & RT5677_AD_STO2_CLK_SEL_MASK) >>
142362306a36Sopenharmony_ci				RT5677_AD_STO2_CLK_SEL_SFT;
142462306a36Sopenharmony_ci		break;
142562306a36Sopenharmony_ci
142662306a36Sopenharmony_ci	case 9:
142762306a36Sopenharmony_ci		regmap_read(rt5677->regmap, RT5677_ASRC_5, &asrc_setting);
142862306a36Sopenharmony_ci		asrc_setting = (asrc_setting & RT5677_AD_STO3_CLK_SEL_MASK) >>
142962306a36Sopenharmony_ci				RT5677_AD_STO3_CLK_SEL_SFT;
143062306a36Sopenharmony_ci		break;
143162306a36Sopenharmony_ci
143262306a36Sopenharmony_ci	case 8:
143362306a36Sopenharmony_ci		regmap_read(rt5677->regmap, RT5677_ASRC_5, &asrc_setting);
143462306a36Sopenharmony_ci		asrc_setting = (asrc_setting & RT5677_AD_STO4_CLK_SEL_MASK) >>
143562306a36Sopenharmony_ci			RT5677_AD_STO4_CLK_SEL_SFT;
143662306a36Sopenharmony_ci		break;
143762306a36Sopenharmony_ci
143862306a36Sopenharmony_ci	case 7:
143962306a36Sopenharmony_ci		regmap_read(rt5677->regmap, RT5677_ASRC_6, &asrc_setting);
144062306a36Sopenharmony_ci		asrc_setting = (asrc_setting & RT5677_AD_MONOL_CLK_SEL_MASK) >>
144162306a36Sopenharmony_ci			RT5677_AD_MONOL_CLK_SEL_SFT;
144262306a36Sopenharmony_ci		break;
144362306a36Sopenharmony_ci
144462306a36Sopenharmony_ci	case 6:
144562306a36Sopenharmony_ci		regmap_read(rt5677->regmap, RT5677_ASRC_6, &asrc_setting);
144662306a36Sopenharmony_ci		asrc_setting = (asrc_setting & RT5677_AD_MONOR_CLK_SEL_MASK) >>
144762306a36Sopenharmony_ci			RT5677_AD_MONOR_CLK_SEL_SFT;
144862306a36Sopenharmony_ci		break;
144962306a36Sopenharmony_ci
145062306a36Sopenharmony_ci	default:
145162306a36Sopenharmony_ci		return 0;
145262306a36Sopenharmony_ci	}
145362306a36Sopenharmony_ci
145462306a36Sopenharmony_ci	if (asrc_setting >= RT5677_CLK_SEL_I2S1_ASRC &&
145562306a36Sopenharmony_ci	    asrc_setting <= RT5677_CLK_SEL_I2S6_ASRC)
145662306a36Sopenharmony_ci		return 1;
145762306a36Sopenharmony_ci
145862306a36Sopenharmony_ci	return 0;
145962306a36Sopenharmony_ci}
146062306a36Sopenharmony_ci
146162306a36Sopenharmony_ci/* Digital Mixer */
146262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_sto1_adc_l_mix[] = {
146362306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO1_ADC_MIXER,
146462306a36Sopenharmony_ci			RT5677_M_STO1_ADC_L1_SFT, 1, 1),
146562306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC2 Switch", RT5677_STO1_ADC_MIXER,
146662306a36Sopenharmony_ci			RT5677_M_STO1_ADC_L2_SFT, 1, 1),
146762306a36Sopenharmony_ci};
146862306a36Sopenharmony_ci
146962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_sto1_adc_r_mix[] = {
147062306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO1_ADC_MIXER,
147162306a36Sopenharmony_ci			RT5677_M_STO1_ADC_R1_SFT, 1, 1),
147262306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC2 Switch", RT5677_STO1_ADC_MIXER,
147362306a36Sopenharmony_ci			RT5677_M_STO1_ADC_R2_SFT, 1, 1),
147462306a36Sopenharmony_ci};
147562306a36Sopenharmony_ci
147662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_sto2_adc_l_mix[] = {
147762306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO2_ADC_MIXER,
147862306a36Sopenharmony_ci			RT5677_M_STO2_ADC_L1_SFT, 1, 1),
147962306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC2 Switch", RT5677_STO2_ADC_MIXER,
148062306a36Sopenharmony_ci			RT5677_M_STO2_ADC_L2_SFT, 1, 1),
148162306a36Sopenharmony_ci};
148262306a36Sopenharmony_ci
148362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_sto2_adc_r_mix[] = {
148462306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO2_ADC_MIXER,
148562306a36Sopenharmony_ci			RT5677_M_STO2_ADC_R1_SFT, 1, 1),
148662306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC2 Switch", RT5677_STO2_ADC_MIXER,
148762306a36Sopenharmony_ci			RT5677_M_STO2_ADC_R2_SFT, 1, 1),
148862306a36Sopenharmony_ci};
148962306a36Sopenharmony_ci
149062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_sto3_adc_l_mix[] = {
149162306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO3_ADC_MIXER,
149262306a36Sopenharmony_ci			RT5677_M_STO3_ADC_L1_SFT, 1, 1),
149362306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC2 Switch", RT5677_STO3_ADC_MIXER,
149462306a36Sopenharmony_ci			RT5677_M_STO3_ADC_L2_SFT, 1, 1),
149562306a36Sopenharmony_ci};
149662306a36Sopenharmony_ci
149762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_sto3_adc_r_mix[] = {
149862306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO3_ADC_MIXER,
149962306a36Sopenharmony_ci			RT5677_M_STO3_ADC_R1_SFT, 1, 1),
150062306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC2 Switch", RT5677_STO3_ADC_MIXER,
150162306a36Sopenharmony_ci			RT5677_M_STO3_ADC_R2_SFT, 1, 1),
150262306a36Sopenharmony_ci};
150362306a36Sopenharmony_ci
150462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_sto4_adc_l_mix[] = {
150562306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO4_ADC_MIXER,
150662306a36Sopenharmony_ci			RT5677_M_STO4_ADC_L1_SFT, 1, 1),
150762306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC2 Switch", RT5677_STO4_ADC_MIXER,
150862306a36Sopenharmony_ci			RT5677_M_STO4_ADC_L2_SFT, 1, 1),
150962306a36Sopenharmony_ci};
151062306a36Sopenharmony_ci
151162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_sto4_adc_r_mix[] = {
151262306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO4_ADC_MIXER,
151362306a36Sopenharmony_ci			RT5677_M_STO4_ADC_R1_SFT, 1, 1),
151462306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC2 Switch", RT5677_STO4_ADC_MIXER,
151562306a36Sopenharmony_ci			RT5677_M_STO4_ADC_R2_SFT, 1, 1),
151662306a36Sopenharmony_ci};
151762306a36Sopenharmony_ci
151862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_mono_adc_l_mix[] = {
151962306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC1 Switch", RT5677_MONO_ADC_MIXER,
152062306a36Sopenharmony_ci			RT5677_M_MONO_ADC_L1_SFT, 1, 1),
152162306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC2 Switch", RT5677_MONO_ADC_MIXER,
152262306a36Sopenharmony_ci			RT5677_M_MONO_ADC_L2_SFT, 1, 1),
152362306a36Sopenharmony_ci};
152462306a36Sopenharmony_ci
152562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_mono_adc_r_mix[] = {
152662306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC1 Switch", RT5677_MONO_ADC_MIXER,
152762306a36Sopenharmony_ci			RT5677_M_MONO_ADC_R1_SFT, 1, 1),
152862306a36Sopenharmony_ci	SOC_DAPM_SINGLE("ADC2 Switch", RT5677_MONO_ADC_MIXER,
152962306a36Sopenharmony_ci			RT5677_M_MONO_ADC_R2_SFT, 1, 1),
153062306a36Sopenharmony_ci};
153162306a36Sopenharmony_ci
153262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_dac_l_mix[] = {
153362306a36Sopenharmony_ci	SOC_DAPM_SINGLE("Stereo ADC Switch", RT5677_ADC_IF_DSP_DAC1_MIXER,
153462306a36Sopenharmony_ci			RT5677_M_ADDA_MIXER1_L_SFT, 1, 1),
153562306a36Sopenharmony_ci	SOC_DAPM_SINGLE("DAC1 Switch", RT5677_ADC_IF_DSP_DAC1_MIXER,
153662306a36Sopenharmony_ci			RT5677_M_DAC1_L_SFT, 1, 1),
153762306a36Sopenharmony_ci};
153862306a36Sopenharmony_ci
153962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_dac_r_mix[] = {
154062306a36Sopenharmony_ci	SOC_DAPM_SINGLE("Stereo ADC Switch", RT5677_ADC_IF_DSP_DAC1_MIXER,
154162306a36Sopenharmony_ci			RT5677_M_ADDA_MIXER1_R_SFT, 1, 1),
154262306a36Sopenharmony_ci	SOC_DAPM_SINGLE("DAC1 Switch", RT5677_ADC_IF_DSP_DAC1_MIXER,
154362306a36Sopenharmony_ci			RT5677_M_DAC1_R_SFT, 1, 1),
154462306a36Sopenharmony_ci};
154562306a36Sopenharmony_ci
154662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_sto1_dac_l_mix[] = {
154762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("ST L Switch", RT5677_STO1_DAC_MIXER,
154862306a36Sopenharmony_ci			RT5677_M_ST_DAC1_L_SFT, 1, 1),
154962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DAC1 L Switch", RT5677_STO1_DAC_MIXER,
155062306a36Sopenharmony_ci			RT5677_M_DAC1_L_STO_L_SFT, 1, 1),
155162306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DAC2 L Switch", RT5677_STO1_DAC_MIXER,
155262306a36Sopenharmony_ci			RT5677_M_DAC2_L_STO_L_SFT, 1, 1),
155362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DAC1 R Switch", RT5677_STO1_DAC_MIXER,
155462306a36Sopenharmony_ci			RT5677_M_DAC1_R_STO_L_SFT, 1, 1),
155562306a36Sopenharmony_ci};
155662306a36Sopenharmony_ci
155762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_sto1_dac_r_mix[] = {
155862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("ST R Switch", RT5677_STO1_DAC_MIXER,
155962306a36Sopenharmony_ci			RT5677_M_ST_DAC1_R_SFT, 1, 1),
156062306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DAC1 R Switch", RT5677_STO1_DAC_MIXER,
156162306a36Sopenharmony_ci			RT5677_M_DAC1_R_STO_R_SFT, 1, 1),
156262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DAC2 R Switch", RT5677_STO1_DAC_MIXER,
156362306a36Sopenharmony_ci			RT5677_M_DAC2_R_STO_R_SFT, 1, 1),
156462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DAC1 L Switch", RT5677_STO1_DAC_MIXER,
156562306a36Sopenharmony_ci			RT5677_M_DAC1_L_STO_R_SFT, 1, 1),
156662306a36Sopenharmony_ci};
156762306a36Sopenharmony_ci
156862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_mono_dac_l_mix[] = {
156962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("ST L Switch", RT5677_MONO_DAC_MIXER,
157062306a36Sopenharmony_ci			RT5677_M_ST_DAC2_L_SFT, 1, 1),
157162306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DAC1 L Switch", RT5677_MONO_DAC_MIXER,
157262306a36Sopenharmony_ci			RT5677_M_DAC1_L_MONO_L_SFT, 1, 1),
157362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DAC2 L Switch", RT5677_MONO_DAC_MIXER,
157462306a36Sopenharmony_ci			RT5677_M_DAC2_L_MONO_L_SFT, 1, 1),
157562306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DAC2 R Switch", RT5677_MONO_DAC_MIXER,
157662306a36Sopenharmony_ci			RT5677_M_DAC2_R_MONO_L_SFT, 1, 1),
157762306a36Sopenharmony_ci};
157862306a36Sopenharmony_ci
157962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_mono_dac_r_mix[] = {
158062306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("ST R Switch", RT5677_MONO_DAC_MIXER,
158162306a36Sopenharmony_ci			RT5677_M_ST_DAC2_R_SFT, 1, 1),
158262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DAC1 R Switch", RT5677_MONO_DAC_MIXER,
158362306a36Sopenharmony_ci			RT5677_M_DAC1_R_MONO_R_SFT, 1, 1),
158462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DAC2 R Switch", RT5677_MONO_DAC_MIXER,
158562306a36Sopenharmony_ci			RT5677_M_DAC2_R_MONO_R_SFT, 1, 1),
158662306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DAC2 L Switch", RT5677_MONO_DAC_MIXER,
158762306a36Sopenharmony_ci			RT5677_M_DAC2_L_MONO_R_SFT, 1, 1),
158862306a36Sopenharmony_ci};
158962306a36Sopenharmony_ci
159062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_dd1_l_mix[] = {
159162306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("Sto DAC Mix L Switch", RT5677_DD1_MIXER,
159262306a36Sopenharmony_ci			RT5677_M_STO_L_DD1_L_SFT, 1, 1),
159362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("Mono DAC Mix L Switch", RT5677_DD1_MIXER,
159462306a36Sopenharmony_ci			RT5677_M_MONO_L_DD1_L_SFT, 1, 1),
159562306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DAC3 L Switch", RT5677_DD1_MIXER,
159662306a36Sopenharmony_ci			RT5677_M_DAC3_L_DD1_L_SFT, 1, 1),
159762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DAC3 R Switch", RT5677_DD1_MIXER,
159862306a36Sopenharmony_ci			RT5677_M_DAC3_R_DD1_L_SFT, 1, 1),
159962306a36Sopenharmony_ci};
160062306a36Sopenharmony_ci
160162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_dd1_r_mix[] = {
160262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("Sto DAC Mix R Switch", RT5677_DD1_MIXER,
160362306a36Sopenharmony_ci			RT5677_M_STO_R_DD1_R_SFT, 1, 1),
160462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("Mono DAC Mix R Switch", RT5677_DD1_MIXER,
160562306a36Sopenharmony_ci			RT5677_M_MONO_R_DD1_R_SFT, 1, 1),
160662306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DAC3 R Switch", RT5677_DD1_MIXER,
160762306a36Sopenharmony_ci			RT5677_M_DAC3_R_DD1_R_SFT, 1, 1),
160862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DAC3 L Switch", RT5677_DD1_MIXER,
160962306a36Sopenharmony_ci			RT5677_M_DAC3_L_DD1_R_SFT, 1, 1),
161062306a36Sopenharmony_ci};
161162306a36Sopenharmony_ci
161262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_dd2_l_mix[] = {
161362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("Sto DAC Mix L Switch", RT5677_DD2_MIXER,
161462306a36Sopenharmony_ci			RT5677_M_STO_L_DD2_L_SFT, 1, 1),
161562306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("Mono DAC Mix L Switch", RT5677_DD2_MIXER,
161662306a36Sopenharmony_ci			RT5677_M_MONO_L_DD2_L_SFT, 1, 1),
161762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DAC4 L Switch", RT5677_DD2_MIXER,
161862306a36Sopenharmony_ci			RT5677_M_DAC4_L_DD2_L_SFT, 1, 1),
161962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DAC4 R Switch", RT5677_DD2_MIXER,
162062306a36Sopenharmony_ci			RT5677_M_DAC4_R_DD2_L_SFT, 1, 1),
162162306a36Sopenharmony_ci};
162262306a36Sopenharmony_ci
162362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_dd2_r_mix[] = {
162462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("Sto DAC Mix R Switch", RT5677_DD2_MIXER,
162562306a36Sopenharmony_ci			RT5677_M_STO_R_DD2_R_SFT, 1, 1),
162662306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("Mono DAC Mix R Switch", RT5677_DD2_MIXER,
162762306a36Sopenharmony_ci			RT5677_M_MONO_R_DD2_R_SFT, 1, 1),
162862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DAC4 R Switch", RT5677_DD2_MIXER,
162962306a36Sopenharmony_ci			RT5677_M_DAC4_R_DD2_R_SFT, 1, 1),
163062306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DAC4 L Switch", RT5677_DD2_MIXER,
163162306a36Sopenharmony_ci			RT5677_M_DAC4_L_DD2_R_SFT, 1, 1),
163262306a36Sopenharmony_ci};
163362306a36Sopenharmony_ci
163462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_ob_01_mix[] = {
163562306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB01 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
163662306a36Sopenharmony_ci			RT5677_DSP_IB_01_H_SFT, 1, 1),
163762306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB23 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
163862306a36Sopenharmony_ci			RT5677_DSP_IB_23_H_SFT, 1, 1),
163962306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB45 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
164062306a36Sopenharmony_ci			RT5677_DSP_IB_45_H_SFT, 1, 1),
164162306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB6 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
164262306a36Sopenharmony_ci			RT5677_DSP_IB_6_H_SFT, 1, 1),
164362306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB7 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
164462306a36Sopenharmony_ci			RT5677_DSP_IB_7_H_SFT, 1, 1),
164562306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB8 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
164662306a36Sopenharmony_ci			RT5677_DSP_IB_8_H_SFT, 1, 1),
164762306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB9 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
164862306a36Sopenharmony_ci			RT5677_DSP_IB_9_H_SFT, 1, 1),
164962306a36Sopenharmony_ci};
165062306a36Sopenharmony_ci
165162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_ob_23_mix[] = {
165262306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB01 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
165362306a36Sopenharmony_ci			RT5677_DSP_IB_01_L_SFT, 1, 1),
165462306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB23 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
165562306a36Sopenharmony_ci			RT5677_DSP_IB_23_L_SFT, 1, 1),
165662306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB45 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
165762306a36Sopenharmony_ci			RT5677_DSP_IB_45_L_SFT, 1, 1),
165862306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB6 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
165962306a36Sopenharmony_ci			RT5677_DSP_IB_6_L_SFT, 1, 1),
166062306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB7 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
166162306a36Sopenharmony_ci			RT5677_DSP_IB_7_L_SFT, 1, 1),
166262306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB8 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
166362306a36Sopenharmony_ci			RT5677_DSP_IB_8_L_SFT, 1, 1),
166462306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB9 Switch", RT5677_DSP_OUTB_0123_MIXER_CTRL,
166562306a36Sopenharmony_ci			RT5677_DSP_IB_9_L_SFT, 1, 1),
166662306a36Sopenharmony_ci};
166762306a36Sopenharmony_ci
166862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_ob_4_mix[] = {
166962306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB01 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
167062306a36Sopenharmony_ci			RT5677_DSP_IB_01_H_SFT, 1, 1),
167162306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB23 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
167262306a36Sopenharmony_ci			RT5677_DSP_IB_23_H_SFT, 1, 1),
167362306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB45 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
167462306a36Sopenharmony_ci			RT5677_DSP_IB_45_H_SFT, 1, 1),
167562306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB6 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
167662306a36Sopenharmony_ci			RT5677_DSP_IB_6_H_SFT, 1, 1),
167762306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB7 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
167862306a36Sopenharmony_ci			RT5677_DSP_IB_7_H_SFT, 1, 1),
167962306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB8 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
168062306a36Sopenharmony_ci			RT5677_DSP_IB_8_H_SFT, 1, 1),
168162306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB9 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
168262306a36Sopenharmony_ci			RT5677_DSP_IB_9_H_SFT, 1, 1),
168362306a36Sopenharmony_ci};
168462306a36Sopenharmony_ci
168562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_ob_5_mix[] = {
168662306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB01 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
168762306a36Sopenharmony_ci			RT5677_DSP_IB_01_L_SFT, 1, 1),
168862306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB23 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
168962306a36Sopenharmony_ci			RT5677_DSP_IB_23_L_SFT, 1, 1),
169062306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB45 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
169162306a36Sopenharmony_ci			RT5677_DSP_IB_45_L_SFT, 1, 1),
169262306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB6 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
169362306a36Sopenharmony_ci			RT5677_DSP_IB_6_L_SFT, 1, 1),
169462306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB7 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
169562306a36Sopenharmony_ci			RT5677_DSP_IB_7_L_SFT, 1, 1),
169662306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB8 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
169762306a36Sopenharmony_ci			RT5677_DSP_IB_8_L_SFT, 1, 1),
169862306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB9 Switch", RT5677_DSP_OUTB_45_MIXER_CTRL,
169962306a36Sopenharmony_ci			RT5677_DSP_IB_9_L_SFT, 1, 1),
170062306a36Sopenharmony_ci};
170162306a36Sopenharmony_ci
170262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_ob_6_mix[] = {
170362306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB01 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
170462306a36Sopenharmony_ci			RT5677_DSP_IB_01_H_SFT, 1, 1),
170562306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB23 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
170662306a36Sopenharmony_ci			RT5677_DSP_IB_23_H_SFT, 1, 1),
170762306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB45 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
170862306a36Sopenharmony_ci			RT5677_DSP_IB_45_H_SFT, 1, 1),
170962306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB6 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
171062306a36Sopenharmony_ci			RT5677_DSP_IB_6_H_SFT, 1, 1),
171162306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB7 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
171262306a36Sopenharmony_ci			RT5677_DSP_IB_7_H_SFT, 1, 1),
171362306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB8 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
171462306a36Sopenharmony_ci			RT5677_DSP_IB_8_H_SFT, 1, 1),
171562306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB9 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
171662306a36Sopenharmony_ci			RT5677_DSP_IB_9_H_SFT, 1, 1),
171762306a36Sopenharmony_ci};
171862306a36Sopenharmony_ci
171962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_ob_7_mix[] = {
172062306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB01 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
172162306a36Sopenharmony_ci			RT5677_DSP_IB_01_L_SFT, 1, 1),
172262306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB23 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
172362306a36Sopenharmony_ci			RT5677_DSP_IB_23_L_SFT, 1, 1),
172462306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB45 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
172562306a36Sopenharmony_ci			RT5677_DSP_IB_45_L_SFT, 1, 1),
172662306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB6 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
172762306a36Sopenharmony_ci			RT5677_DSP_IB_6_L_SFT, 1, 1),
172862306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB7 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
172962306a36Sopenharmony_ci			RT5677_DSP_IB_7_L_SFT, 1, 1),
173062306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB8 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
173162306a36Sopenharmony_ci			RT5677_DSP_IB_8_L_SFT, 1, 1),
173262306a36Sopenharmony_ci	SOC_DAPM_SINGLE("IB9 Switch", RT5677_DSP_OUTB_67_MIXER_CTRL,
173362306a36Sopenharmony_ci			RT5677_DSP_IB_9_L_SFT, 1, 1),
173462306a36Sopenharmony_ci};
173562306a36Sopenharmony_ci
173662306a36Sopenharmony_ci
173762306a36Sopenharmony_ci/* Mux */
173862306a36Sopenharmony_ci/* DAC1 L/R Source */ /* MX-29 [10:8] */
173962306a36Sopenharmony_cistatic const char * const rt5677_dac1_src[] = {
174062306a36Sopenharmony_ci	"IF1 DAC 01", "IF2 DAC 01", "IF3 DAC LR", "IF4 DAC LR", "SLB DAC 01",
174162306a36Sopenharmony_ci	"OB 01"
174262306a36Sopenharmony_ci};
174362306a36Sopenharmony_ci
174462306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
174562306a36Sopenharmony_ci	rt5677_dac1_enum, RT5677_ADC_IF_DSP_DAC1_MIXER,
174662306a36Sopenharmony_ci	RT5677_DAC1_L_SEL_SFT, rt5677_dac1_src);
174762306a36Sopenharmony_ci
174862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_dac1_mux =
174962306a36Sopenharmony_ci	SOC_DAPM_ENUM("DAC1 Source", rt5677_dac1_enum);
175062306a36Sopenharmony_ci
175162306a36Sopenharmony_ci/* ADDA1 L/R Source */ /* MX-29 [1:0] */
175262306a36Sopenharmony_cistatic const char * const rt5677_adda1_src[] = {
175362306a36Sopenharmony_ci	"STO1 ADC MIX", "STO2 ADC MIX", "OB 67",
175462306a36Sopenharmony_ci};
175562306a36Sopenharmony_ci
175662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
175762306a36Sopenharmony_ci	rt5677_adda1_enum, RT5677_ADC_IF_DSP_DAC1_MIXER,
175862306a36Sopenharmony_ci	RT5677_ADDA1_SEL_SFT, rt5677_adda1_src);
175962306a36Sopenharmony_ci
176062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_adda1_mux =
176162306a36Sopenharmony_ci	SOC_DAPM_ENUM("ADDA1 Source", rt5677_adda1_enum);
176262306a36Sopenharmony_ci
176362306a36Sopenharmony_ci
176462306a36Sopenharmony_ci/*DAC2 L/R Source*/ /* MX-1B [6:4] [2:0] */
176562306a36Sopenharmony_cistatic const char * const rt5677_dac2l_src[] = {
176662306a36Sopenharmony_ci	"IF1 DAC 2", "IF2 DAC 2", "IF3 DAC L", "IF4 DAC L", "SLB DAC 2",
176762306a36Sopenharmony_ci	"OB 2",
176862306a36Sopenharmony_ci};
176962306a36Sopenharmony_ci
177062306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
177162306a36Sopenharmony_ci	rt5677_dac2l_enum, RT5677_IF_DSP_DAC2_MIXER,
177262306a36Sopenharmony_ci	RT5677_SEL_DAC2_L_SRC_SFT, rt5677_dac2l_src);
177362306a36Sopenharmony_ci
177462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_dac2_l_mux =
177562306a36Sopenharmony_ci	SOC_DAPM_ENUM("DAC2 L Source", rt5677_dac2l_enum);
177662306a36Sopenharmony_ci
177762306a36Sopenharmony_cistatic const char * const rt5677_dac2r_src[] = {
177862306a36Sopenharmony_ci	"IF1 DAC 3", "IF2 DAC 3", "IF3 DAC R", "IF4 DAC R", "SLB DAC 3",
177962306a36Sopenharmony_ci	"OB 3", "Haptic Generator", "VAD ADC"
178062306a36Sopenharmony_ci};
178162306a36Sopenharmony_ci
178262306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
178362306a36Sopenharmony_ci	rt5677_dac2r_enum, RT5677_IF_DSP_DAC2_MIXER,
178462306a36Sopenharmony_ci	RT5677_SEL_DAC2_R_SRC_SFT, rt5677_dac2r_src);
178562306a36Sopenharmony_ci
178662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_dac2_r_mux =
178762306a36Sopenharmony_ci	SOC_DAPM_ENUM("DAC2 R Source", rt5677_dac2r_enum);
178862306a36Sopenharmony_ci
178962306a36Sopenharmony_ci/*DAC3 L/R Source*/ /* MX-16 [6:4] [2:0] */
179062306a36Sopenharmony_cistatic const char * const rt5677_dac3l_src[] = {
179162306a36Sopenharmony_ci	"IF1 DAC 4", "IF2 DAC 4", "IF3 DAC L", "IF4 DAC L",
179262306a36Sopenharmony_ci	"SLB DAC 4", "OB 4"
179362306a36Sopenharmony_ci};
179462306a36Sopenharmony_ci
179562306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
179662306a36Sopenharmony_ci	rt5677_dac3l_enum, RT5677_IF_DSP_DAC3_4_MIXER,
179762306a36Sopenharmony_ci	RT5677_SEL_DAC3_L_SRC_SFT, rt5677_dac3l_src);
179862306a36Sopenharmony_ci
179962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_dac3_l_mux =
180062306a36Sopenharmony_ci	SOC_DAPM_ENUM("DAC3 L Source", rt5677_dac3l_enum);
180162306a36Sopenharmony_ci
180262306a36Sopenharmony_cistatic const char * const rt5677_dac3r_src[] = {
180362306a36Sopenharmony_ci	"IF1 DAC 5", "IF2 DAC 5", "IF3 DAC R", "IF4 DAC R",
180462306a36Sopenharmony_ci	"SLB DAC 5", "OB 5"
180562306a36Sopenharmony_ci};
180662306a36Sopenharmony_ci
180762306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
180862306a36Sopenharmony_ci	rt5677_dac3r_enum, RT5677_IF_DSP_DAC3_4_MIXER,
180962306a36Sopenharmony_ci	RT5677_SEL_DAC3_R_SRC_SFT, rt5677_dac3r_src);
181062306a36Sopenharmony_ci
181162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_dac3_r_mux =
181262306a36Sopenharmony_ci	SOC_DAPM_ENUM("DAC3 R Source", rt5677_dac3r_enum);
181362306a36Sopenharmony_ci
181462306a36Sopenharmony_ci/*DAC4 L/R Source*/ /* MX-16 [14:12] [10:8] */
181562306a36Sopenharmony_cistatic const char * const rt5677_dac4l_src[] = {
181662306a36Sopenharmony_ci	"IF1 DAC 6", "IF2 DAC 6", "IF3 DAC L", "IF4 DAC L",
181762306a36Sopenharmony_ci	"SLB DAC 6", "OB 6"
181862306a36Sopenharmony_ci};
181962306a36Sopenharmony_ci
182062306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
182162306a36Sopenharmony_ci	rt5677_dac4l_enum, RT5677_IF_DSP_DAC3_4_MIXER,
182262306a36Sopenharmony_ci	RT5677_SEL_DAC4_L_SRC_SFT, rt5677_dac4l_src);
182362306a36Sopenharmony_ci
182462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_dac4_l_mux =
182562306a36Sopenharmony_ci	SOC_DAPM_ENUM("DAC4 L Source", rt5677_dac4l_enum);
182662306a36Sopenharmony_ci
182762306a36Sopenharmony_cistatic const char * const rt5677_dac4r_src[] = {
182862306a36Sopenharmony_ci	"IF1 DAC 7", "IF2 DAC 7", "IF3 DAC R", "IF4 DAC R",
182962306a36Sopenharmony_ci	"SLB DAC 7", "OB 7"
183062306a36Sopenharmony_ci};
183162306a36Sopenharmony_ci
183262306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
183362306a36Sopenharmony_ci	rt5677_dac4r_enum, RT5677_IF_DSP_DAC3_4_MIXER,
183462306a36Sopenharmony_ci	RT5677_SEL_DAC4_R_SRC_SFT, rt5677_dac4r_src);
183562306a36Sopenharmony_ci
183662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_dac4_r_mux =
183762306a36Sopenharmony_ci	SOC_DAPM_ENUM("DAC4 R Source", rt5677_dac4r_enum);
183862306a36Sopenharmony_ci
183962306a36Sopenharmony_ci/* In/OutBound Source Pass SRC */ /* MX-A5 [3] [4] [0] [1] [2] */
184062306a36Sopenharmony_cistatic const char * const rt5677_iob_bypass_src[] = {
184162306a36Sopenharmony_ci	"Bypass", "Pass SRC"
184262306a36Sopenharmony_ci};
184362306a36Sopenharmony_ci
184462306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
184562306a36Sopenharmony_ci	rt5677_ob01_bypass_src_enum, RT5677_DSP_IN_OUTB_CTRL,
184662306a36Sopenharmony_ci	RT5677_SEL_SRC_OB01_SFT, rt5677_iob_bypass_src);
184762306a36Sopenharmony_ci
184862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_ob01_bypass_src_mux =
184962306a36Sopenharmony_ci	SOC_DAPM_ENUM("OB01 Bypass Source", rt5677_ob01_bypass_src_enum);
185062306a36Sopenharmony_ci
185162306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
185262306a36Sopenharmony_ci	rt5677_ob23_bypass_src_enum, RT5677_DSP_IN_OUTB_CTRL,
185362306a36Sopenharmony_ci	RT5677_SEL_SRC_OB23_SFT, rt5677_iob_bypass_src);
185462306a36Sopenharmony_ci
185562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_ob23_bypass_src_mux =
185662306a36Sopenharmony_ci	SOC_DAPM_ENUM("OB23 Bypass Source", rt5677_ob23_bypass_src_enum);
185762306a36Sopenharmony_ci
185862306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
185962306a36Sopenharmony_ci	rt5677_ib01_bypass_src_enum, RT5677_DSP_IN_OUTB_CTRL,
186062306a36Sopenharmony_ci	RT5677_SEL_SRC_IB01_SFT, rt5677_iob_bypass_src);
186162306a36Sopenharmony_ci
186262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_ib01_bypass_src_mux =
186362306a36Sopenharmony_ci	SOC_DAPM_ENUM("IB01 Bypass Source", rt5677_ib01_bypass_src_enum);
186462306a36Sopenharmony_ci
186562306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
186662306a36Sopenharmony_ci	rt5677_ib23_bypass_src_enum, RT5677_DSP_IN_OUTB_CTRL,
186762306a36Sopenharmony_ci	RT5677_SEL_SRC_IB23_SFT, rt5677_iob_bypass_src);
186862306a36Sopenharmony_ci
186962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_ib23_bypass_src_mux =
187062306a36Sopenharmony_ci	SOC_DAPM_ENUM("IB23 Bypass Source", rt5677_ib23_bypass_src_enum);
187162306a36Sopenharmony_ci
187262306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
187362306a36Sopenharmony_ci	rt5677_ib45_bypass_src_enum, RT5677_DSP_IN_OUTB_CTRL,
187462306a36Sopenharmony_ci	RT5677_SEL_SRC_IB45_SFT, rt5677_iob_bypass_src);
187562306a36Sopenharmony_ci
187662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_ib45_bypass_src_mux =
187762306a36Sopenharmony_ci	SOC_DAPM_ENUM("IB45 Bypass Source", rt5677_ib45_bypass_src_enum);
187862306a36Sopenharmony_ci
187962306a36Sopenharmony_ci/* Stereo ADC Source 2 */ /* MX-27 MX26 MX25 [11:10] */
188062306a36Sopenharmony_cistatic const char * const rt5677_stereo_adc2_src[] = {
188162306a36Sopenharmony_ci	"DD MIX1", "DMIC", "Stereo DAC MIX"
188262306a36Sopenharmony_ci};
188362306a36Sopenharmony_ci
188462306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
188562306a36Sopenharmony_ci	rt5677_stereo1_adc2_enum, RT5677_STO1_ADC_MIXER,
188662306a36Sopenharmony_ci	RT5677_SEL_STO1_ADC2_SFT, rt5677_stereo_adc2_src);
188762306a36Sopenharmony_ci
188862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_sto1_adc2_mux =
188962306a36Sopenharmony_ci	SOC_DAPM_ENUM("Stereo1 ADC2 Source", rt5677_stereo1_adc2_enum);
189062306a36Sopenharmony_ci
189162306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
189262306a36Sopenharmony_ci	rt5677_stereo2_adc2_enum, RT5677_STO2_ADC_MIXER,
189362306a36Sopenharmony_ci	RT5677_SEL_STO2_ADC2_SFT, rt5677_stereo_adc2_src);
189462306a36Sopenharmony_ci
189562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_sto2_adc2_mux =
189662306a36Sopenharmony_ci	SOC_DAPM_ENUM("Stereo2 ADC2 Source", rt5677_stereo2_adc2_enum);
189762306a36Sopenharmony_ci
189862306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
189962306a36Sopenharmony_ci	rt5677_stereo3_adc2_enum, RT5677_STO3_ADC_MIXER,
190062306a36Sopenharmony_ci	RT5677_SEL_STO3_ADC2_SFT, rt5677_stereo_adc2_src);
190162306a36Sopenharmony_ci
190262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_sto3_adc2_mux =
190362306a36Sopenharmony_ci	SOC_DAPM_ENUM("Stereo3 ADC2 Source", rt5677_stereo3_adc2_enum);
190462306a36Sopenharmony_ci
190562306a36Sopenharmony_ci/* DMIC Source */ /* MX-28 [9:8][1:0] MX-27 MX-26 MX-25 MX-24 [9:8] */
190662306a36Sopenharmony_cistatic const char * const rt5677_dmic_src[] = {
190762306a36Sopenharmony_ci	"DMIC1", "DMIC2", "DMIC3", "DMIC4"
190862306a36Sopenharmony_ci};
190962306a36Sopenharmony_ci
191062306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
191162306a36Sopenharmony_ci	rt5677_mono_dmic_l_enum, RT5677_MONO_ADC_MIXER,
191262306a36Sopenharmony_ci	RT5677_SEL_MONO_DMIC_L_SFT, rt5677_dmic_src);
191362306a36Sopenharmony_ci
191462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_mono_dmic_l_mux =
191562306a36Sopenharmony_ci	SOC_DAPM_ENUM("Mono DMIC L Source", rt5677_mono_dmic_l_enum);
191662306a36Sopenharmony_ci
191762306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
191862306a36Sopenharmony_ci	rt5677_mono_dmic_r_enum, RT5677_MONO_ADC_MIXER,
191962306a36Sopenharmony_ci	RT5677_SEL_MONO_DMIC_R_SFT, rt5677_dmic_src);
192062306a36Sopenharmony_ci
192162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_mono_dmic_r_mux =
192262306a36Sopenharmony_ci	SOC_DAPM_ENUM("Mono DMIC R Source", rt5677_mono_dmic_r_enum);
192362306a36Sopenharmony_ci
192462306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
192562306a36Sopenharmony_ci	rt5677_stereo1_dmic_enum, RT5677_STO1_ADC_MIXER,
192662306a36Sopenharmony_ci	RT5677_SEL_STO1_DMIC_SFT, rt5677_dmic_src);
192762306a36Sopenharmony_ci
192862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_sto1_dmic_mux =
192962306a36Sopenharmony_ci	SOC_DAPM_ENUM("Stereo1 DMIC Source", rt5677_stereo1_dmic_enum);
193062306a36Sopenharmony_ci
193162306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
193262306a36Sopenharmony_ci	rt5677_stereo2_dmic_enum, RT5677_STO2_ADC_MIXER,
193362306a36Sopenharmony_ci	RT5677_SEL_STO2_DMIC_SFT, rt5677_dmic_src);
193462306a36Sopenharmony_ci
193562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_sto2_dmic_mux =
193662306a36Sopenharmony_ci	SOC_DAPM_ENUM("Stereo2 DMIC Source", rt5677_stereo2_dmic_enum);
193762306a36Sopenharmony_ci
193862306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
193962306a36Sopenharmony_ci	rt5677_stereo3_dmic_enum, RT5677_STO3_ADC_MIXER,
194062306a36Sopenharmony_ci	RT5677_SEL_STO3_DMIC_SFT, rt5677_dmic_src);
194162306a36Sopenharmony_ci
194262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_sto3_dmic_mux =
194362306a36Sopenharmony_ci	SOC_DAPM_ENUM("Stereo3 DMIC Source", rt5677_stereo3_dmic_enum);
194462306a36Sopenharmony_ci
194562306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
194662306a36Sopenharmony_ci	rt5677_stereo4_dmic_enum, RT5677_STO4_ADC_MIXER,
194762306a36Sopenharmony_ci	RT5677_SEL_STO4_DMIC_SFT, rt5677_dmic_src);
194862306a36Sopenharmony_ci
194962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_sto4_dmic_mux =
195062306a36Sopenharmony_ci	SOC_DAPM_ENUM("Stereo4 DMIC Source", rt5677_stereo4_dmic_enum);
195162306a36Sopenharmony_ci
195262306a36Sopenharmony_ci/* Stereo2 ADC Source */ /* MX-26 [0] */
195362306a36Sopenharmony_cistatic const char * const rt5677_stereo2_adc_lr_src[] = {
195462306a36Sopenharmony_ci	"L", "LR"
195562306a36Sopenharmony_ci};
195662306a36Sopenharmony_ci
195762306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
195862306a36Sopenharmony_ci	rt5677_stereo2_adc_lr_enum, RT5677_STO2_ADC_MIXER,
195962306a36Sopenharmony_ci	RT5677_SEL_STO2_LR_MIX_SFT, rt5677_stereo2_adc_lr_src);
196062306a36Sopenharmony_ci
196162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_sto2_adc_lr_mux =
196262306a36Sopenharmony_ci	SOC_DAPM_ENUM("Stereo2 ADC LR Source", rt5677_stereo2_adc_lr_enum);
196362306a36Sopenharmony_ci
196462306a36Sopenharmony_ci/* Stereo1 ADC Source 1 */ /* MX-27 MX26 MX25 [13:12] */
196562306a36Sopenharmony_cistatic const char * const rt5677_stereo_adc1_src[] = {
196662306a36Sopenharmony_ci	"DD MIX1", "ADC1/2", "Stereo DAC MIX"
196762306a36Sopenharmony_ci};
196862306a36Sopenharmony_ci
196962306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
197062306a36Sopenharmony_ci	rt5677_stereo1_adc1_enum, RT5677_STO1_ADC_MIXER,
197162306a36Sopenharmony_ci	RT5677_SEL_STO1_ADC1_SFT, rt5677_stereo_adc1_src);
197262306a36Sopenharmony_ci
197362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_sto1_adc1_mux =
197462306a36Sopenharmony_ci	SOC_DAPM_ENUM("Stereo1 ADC1 Source", rt5677_stereo1_adc1_enum);
197562306a36Sopenharmony_ci
197662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
197762306a36Sopenharmony_ci	rt5677_stereo2_adc1_enum, RT5677_STO2_ADC_MIXER,
197862306a36Sopenharmony_ci	RT5677_SEL_STO2_ADC1_SFT, rt5677_stereo_adc1_src);
197962306a36Sopenharmony_ci
198062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_sto2_adc1_mux =
198162306a36Sopenharmony_ci	SOC_DAPM_ENUM("Stereo2 ADC1 Source", rt5677_stereo2_adc1_enum);
198262306a36Sopenharmony_ci
198362306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
198462306a36Sopenharmony_ci	rt5677_stereo3_adc1_enum, RT5677_STO3_ADC_MIXER,
198562306a36Sopenharmony_ci	RT5677_SEL_STO3_ADC1_SFT, rt5677_stereo_adc1_src);
198662306a36Sopenharmony_ci
198762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_sto3_adc1_mux =
198862306a36Sopenharmony_ci	SOC_DAPM_ENUM("Stereo3 ADC1 Source", rt5677_stereo3_adc1_enum);
198962306a36Sopenharmony_ci
199062306a36Sopenharmony_ci/* Mono ADC Left Source 2 */ /* MX-28 [11:10] */
199162306a36Sopenharmony_cistatic const char * const rt5677_mono_adc2_l_src[] = {
199262306a36Sopenharmony_ci	"DD MIX1L", "DMIC", "MONO DAC MIXL"
199362306a36Sopenharmony_ci};
199462306a36Sopenharmony_ci
199562306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
199662306a36Sopenharmony_ci	rt5677_mono_adc2_l_enum, RT5677_MONO_ADC_MIXER,
199762306a36Sopenharmony_ci	RT5677_SEL_MONO_ADC_L2_SFT, rt5677_mono_adc2_l_src);
199862306a36Sopenharmony_ci
199962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_mono_adc2_l_mux =
200062306a36Sopenharmony_ci	SOC_DAPM_ENUM("Mono ADC2 L Source", rt5677_mono_adc2_l_enum);
200162306a36Sopenharmony_ci
200262306a36Sopenharmony_ci/* Mono ADC Left Source 1 */ /* MX-28 [13:12] */
200362306a36Sopenharmony_cistatic const char * const rt5677_mono_adc1_l_src[] = {
200462306a36Sopenharmony_ci	"DD MIX1L", "ADC1", "MONO DAC MIXL"
200562306a36Sopenharmony_ci};
200662306a36Sopenharmony_ci
200762306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
200862306a36Sopenharmony_ci	rt5677_mono_adc1_l_enum, RT5677_MONO_ADC_MIXER,
200962306a36Sopenharmony_ci	RT5677_SEL_MONO_ADC_L1_SFT, rt5677_mono_adc1_l_src);
201062306a36Sopenharmony_ci
201162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_mono_adc1_l_mux =
201262306a36Sopenharmony_ci	SOC_DAPM_ENUM("Mono ADC1 L Source", rt5677_mono_adc1_l_enum);
201362306a36Sopenharmony_ci
201462306a36Sopenharmony_ci/* Mono ADC Right Source 2 */ /* MX-28 [3:2] */
201562306a36Sopenharmony_cistatic const char * const rt5677_mono_adc2_r_src[] = {
201662306a36Sopenharmony_ci	"DD MIX1R", "DMIC", "MONO DAC MIXR"
201762306a36Sopenharmony_ci};
201862306a36Sopenharmony_ci
201962306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
202062306a36Sopenharmony_ci	rt5677_mono_adc2_r_enum, RT5677_MONO_ADC_MIXER,
202162306a36Sopenharmony_ci	RT5677_SEL_MONO_ADC_R2_SFT, rt5677_mono_adc2_r_src);
202262306a36Sopenharmony_ci
202362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_mono_adc2_r_mux =
202462306a36Sopenharmony_ci	SOC_DAPM_ENUM("Mono ADC2 R Source", rt5677_mono_adc2_r_enum);
202562306a36Sopenharmony_ci
202662306a36Sopenharmony_ci/* Mono ADC Right Source 1 */ /* MX-28 [5:4] */
202762306a36Sopenharmony_cistatic const char * const rt5677_mono_adc1_r_src[] = {
202862306a36Sopenharmony_ci	"DD MIX1R", "ADC2", "MONO DAC MIXR"
202962306a36Sopenharmony_ci};
203062306a36Sopenharmony_ci
203162306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
203262306a36Sopenharmony_ci	rt5677_mono_adc1_r_enum, RT5677_MONO_ADC_MIXER,
203362306a36Sopenharmony_ci	RT5677_SEL_MONO_ADC_R1_SFT, rt5677_mono_adc1_r_src);
203462306a36Sopenharmony_ci
203562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_mono_adc1_r_mux =
203662306a36Sopenharmony_ci	SOC_DAPM_ENUM("Mono ADC1 R Source", rt5677_mono_adc1_r_enum);
203762306a36Sopenharmony_ci
203862306a36Sopenharmony_ci/* Stereo4 ADC Source 2 */ /* MX-24 [11:10] */
203962306a36Sopenharmony_cistatic const char * const rt5677_stereo4_adc2_src[] = {
204062306a36Sopenharmony_ci	"DD MIX1", "DMIC", "DD MIX2"
204162306a36Sopenharmony_ci};
204262306a36Sopenharmony_ci
204362306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
204462306a36Sopenharmony_ci	rt5677_stereo4_adc2_enum, RT5677_STO4_ADC_MIXER,
204562306a36Sopenharmony_ci	RT5677_SEL_STO4_ADC2_SFT, rt5677_stereo4_adc2_src);
204662306a36Sopenharmony_ci
204762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_sto4_adc2_mux =
204862306a36Sopenharmony_ci	SOC_DAPM_ENUM("Stereo4 ADC2 Source", rt5677_stereo4_adc2_enum);
204962306a36Sopenharmony_ci
205062306a36Sopenharmony_ci
205162306a36Sopenharmony_ci/* Stereo4 ADC Source 1 */ /* MX-24 [13:12] */
205262306a36Sopenharmony_cistatic const char * const rt5677_stereo4_adc1_src[] = {
205362306a36Sopenharmony_ci	"DD MIX1", "ADC1/2", "DD MIX2"
205462306a36Sopenharmony_ci};
205562306a36Sopenharmony_ci
205662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
205762306a36Sopenharmony_ci	rt5677_stereo4_adc1_enum, RT5677_STO4_ADC_MIXER,
205862306a36Sopenharmony_ci	RT5677_SEL_STO4_ADC1_SFT, rt5677_stereo4_adc1_src);
205962306a36Sopenharmony_ci
206062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_sto4_adc1_mux =
206162306a36Sopenharmony_ci	SOC_DAPM_ENUM("Stereo4 ADC1 Source", rt5677_stereo4_adc1_enum);
206262306a36Sopenharmony_ci
206362306a36Sopenharmony_ci/* InBound0/1 Source */ /* MX-A3 [14:12] */
206462306a36Sopenharmony_cistatic const char * const rt5677_inbound01_src[] = {
206562306a36Sopenharmony_ci	"IF1 DAC 01", "IF2 DAC 01", "SLB DAC 01", "STO1 ADC MIX",
206662306a36Sopenharmony_ci	"VAD ADC/DAC1 FS"
206762306a36Sopenharmony_ci};
206862306a36Sopenharmony_ci
206962306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
207062306a36Sopenharmony_ci	rt5677_inbound01_enum, RT5677_DSP_INB_CTRL1,
207162306a36Sopenharmony_ci	RT5677_IB01_SRC_SFT, rt5677_inbound01_src);
207262306a36Sopenharmony_ci
207362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_ib01_src_mux =
207462306a36Sopenharmony_ci	SOC_DAPM_ENUM("InBound0/1 Source", rt5677_inbound01_enum);
207562306a36Sopenharmony_ci
207662306a36Sopenharmony_ci/* InBound2/3 Source */ /* MX-A3 [10:8] */
207762306a36Sopenharmony_cistatic const char * const rt5677_inbound23_src[] = {
207862306a36Sopenharmony_ci	"IF1 DAC 23", "IF2 DAC 23", "SLB DAC 23", "STO2 ADC MIX",
207962306a36Sopenharmony_ci	"DAC1 FS", "IF4 DAC"
208062306a36Sopenharmony_ci};
208162306a36Sopenharmony_ci
208262306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
208362306a36Sopenharmony_ci	rt5677_inbound23_enum, RT5677_DSP_INB_CTRL1,
208462306a36Sopenharmony_ci	RT5677_IB23_SRC_SFT, rt5677_inbound23_src);
208562306a36Sopenharmony_ci
208662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_ib23_src_mux =
208762306a36Sopenharmony_ci	SOC_DAPM_ENUM("InBound2/3 Source", rt5677_inbound23_enum);
208862306a36Sopenharmony_ci
208962306a36Sopenharmony_ci/* InBound4/5 Source */ /* MX-A3 [6:4] */
209062306a36Sopenharmony_cistatic const char * const rt5677_inbound45_src[] = {
209162306a36Sopenharmony_ci	"IF1 DAC 45", "IF2 DAC 45", "SLB DAC 45", "STO3 ADC MIX",
209262306a36Sopenharmony_ci	"IF3 DAC"
209362306a36Sopenharmony_ci};
209462306a36Sopenharmony_ci
209562306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
209662306a36Sopenharmony_ci	rt5677_inbound45_enum, RT5677_DSP_INB_CTRL1,
209762306a36Sopenharmony_ci	RT5677_IB45_SRC_SFT, rt5677_inbound45_src);
209862306a36Sopenharmony_ci
209962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_ib45_src_mux =
210062306a36Sopenharmony_ci	SOC_DAPM_ENUM("InBound4/5 Source", rt5677_inbound45_enum);
210162306a36Sopenharmony_ci
210262306a36Sopenharmony_ci/* InBound6 Source */ /* MX-A3 [2:0] */
210362306a36Sopenharmony_cistatic const char * const rt5677_inbound6_src[] = {
210462306a36Sopenharmony_ci	"IF1 DAC 6", "IF2 DAC 6", "SLB DAC 6", "STO4 ADC MIX L",
210562306a36Sopenharmony_ci	"IF4 DAC L", "STO1 ADC MIX L", "STO2 ADC MIX L", "STO3 ADC MIX L"
210662306a36Sopenharmony_ci};
210762306a36Sopenharmony_ci
210862306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
210962306a36Sopenharmony_ci	rt5677_inbound6_enum, RT5677_DSP_INB_CTRL1,
211062306a36Sopenharmony_ci	RT5677_IB6_SRC_SFT, rt5677_inbound6_src);
211162306a36Sopenharmony_ci
211262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_ib6_src_mux =
211362306a36Sopenharmony_ci	SOC_DAPM_ENUM("InBound6 Source", rt5677_inbound6_enum);
211462306a36Sopenharmony_ci
211562306a36Sopenharmony_ci/* InBound7 Source */ /* MX-A4 [14:12] */
211662306a36Sopenharmony_cistatic const char * const rt5677_inbound7_src[] = {
211762306a36Sopenharmony_ci	"IF1 DAC 7", "IF2 DAC 7", "SLB DAC 7", "STO4 ADC MIX R",
211862306a36Sopenharmony_ci	"IF4 DAC R", "STO1 ADC MIX R", "STO2 ADC MIX R", "STO3 ADC MIX R"
211962306a36Sopenharmony_ci};
212062306a36Sopenharmony_ci
212162306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
212262306a36Sopenharmony_ci	rt5677_inbound7_enum, RT5677_DSP_INB_CTRL2,
212362306a36Sopenharmony_ci	RT5677_IB7_SRC_SFT, rt5677_inbound7_src);
212462306a36Sopenharmony_ci
212562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_ib7_src_mux =
212662306a36Sopenharmony_ci	SOC_DAPM_ENUM("InBound7 Source", rt5677_inbound7_enum);
212762306a36Sopenharmony_ci
212862306a36Sopenharmony_ci/* InBound8 Source */ /* MX-A4 [10:8] */
212962306a36Sopenharmony_cistatic const char * const rt5677_inbound8_src[] = {
213062306a36Sopenharmony_ci	"STO1 ADC MIX L", "STO2 ADC MIX L", "STO3 ADC MIX L", "STO4 ADC MIX L",
213162306a36Sopenharmony_ci	"MONO ADC MIX L", "DACL1 FS"
213262306a36Sopenharmony_ci};
213362306a36Sopenharmony_ci
213462306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
213562306a36Sopenharmony_ci	rt5677_inbound8_enum, RT5677_DSP_INB_CTRL2,
213662306a36Sopenharmony_ci	RT5677_IB8_SRC_SFT, rt5677_inbound8_src);
213762306a36Sopenharmony_ci
213862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_ib8_src_mux =
213962306a36Sopenharmony_ci	SOC_DAPM_ENUM("InBound8 Source", rt5677_inbound8_enum);
214062306a36Sopenharmony_ci
214162306a36Sopenharmony_ci/* InBound9 Source */ /* MX-A4 [6:4] */
214262306a36Sopenharmony_cistatic const char * const rt5677_inbound9_src[] = {
214362306a36Sopenharmony_ci	"STO1 ADC MIX R", "STO2 ADC MIX R", "STO3 ADC MIX R", "STO4 ADC MIX R",
214462306a36Sopenharmony_ci	"MONO ADC MIX R", "DACR1 FS", "DAC1 FS"
214562306a36Sopenharmony_ci};
214662306a36Sopenharmony_ci
214762306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
214862306a36Sopenharmony_ci	rt5677_inbound9_enum, RT5677_DSP_INB_CTRL2,
214962306a36Sopenharmony_ci	RT5677_IB9_SRC_SFT, rt5677_inbound9_src);
215062306a36Sopenharmony_ci
215162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_ib9_src_mux =
215262306a36Sopenharmony_ci	SOC_DAPM_ENUM("InBound9 Source", rt5677_inbound9_enum);
215362306a36Sopenharmony_ci
215462306a36Sopenharmony_ci/* VAD Source */ /* MX-9F [6:4] */
215562306a36Sopenharmony_cistatic const char * const rt5677_vad_src[] = {
215662306a36Sopenharmony_ci	"STO1 ADC MIX L", "MONO ADC MIX L", "MONO ADC MIX R", "STO2 ADC MIX L",
215762306a36Sopenharmony_ci	"STO3 ADC MIX L"
215862306a36Sopenharmony_ci};
215962306a36Sopenharmony_ci
216062306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
216162306a36Sopenharmony_ci	rt5677_vad_enum, RT5677_VAD_CTRL4,
216262306a36Sopenharmony_ci	RT5677_VAD_SRC_SFT, rt5677_vad_src);
216362306a36Sopenharmony_ci
216462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_vad_src_mux =
216562306a36Sopenharmony_ci	SOC_DAPM_ENUM("VAD Source", rt5677_vad_enum);
216662306a36Sopenharmony_ci
216762306a36Sopenharmony_ci/* Sidetone Source */ /* MX-13 [11:9] */
216862306a36Sopenharmony_cistatic const char * const rt5677_sidetone_src[] = {
216962306a36Sopenharmony_ci	"DMIC1 L", "DMIC2 L", "DMIC3 L", "DMIC4 L", "ADC1", "ADC2"
217062306a36Sopenharmony_ci};
217162306a36Sopenharmony_ci
217262306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
217362306a36Sopenharmony_ci	rt5677_sidetone_enum, RT5677_SIDETONE_CTRL,
217462306a36Sopenharmony_ci	RT5677_ST_SEL_SFT, rt5677_sidetone_src);
217562306a36Sopenharmony_ci
217662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_sidetone_mux =
217762306a36Sopenharmony_ci	SOC_DAPM_ENUM("Sidetone Source", rt5677_sidetone_enum);
217862306a36Sopenharmony_ci
217962306a36Sopenharmony_ci/* DAC1/2 Source */ /* MX-15 [1:0] */
218062306a36Sopenharmony_cistatic const char * const rt5677_dac12_src[] = {
218162306a36Sopenharmony_ci	"STO1 DAC MIX", "MONO DAC MIX", "DD MIX1", "DD MIX2"
218262306a36Sopenharmony_ci};
218362306a36Sopenharmony_ci
218462306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
218562306a36Sopenharmony_ci	rt5677_dac12_enum, RT5677_ANA_DAC1_2_3_SRC,
218662306a36Sopenharmony_ci	RT5677_ANA_DAC1_2_SRC_SEL_SFT, rt5677_dac12_src);
218762306a36Sopenharmony_ci
218862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_dac12_mux =
218962306a36Sopenharmony_ci	SOC_DAPM_ENUM("Analog DAC1/2 Source", rt5677_dac12_enum);
219062306a36Sopenharmony_ci
219162306a36Sopenharmony_ci/* DAC3 Source */ /* MX-15 [5:4] */
219262306a36Sopenharmony_cistatic const char * const rt5677_dac3_src[] = {
219362306a36Sopenharmony_ci	"MONO DAC MIXL", "MONO DAC MIXR", "DD MIX1L", "DD MIX2L"
219462306a36Sopenharmony_ci};
219562306a36Sopenharmony_ci
219662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
219762306a36Sopenharmony_ci	rt5677_dac3_enum, RT5677_ANA_DAC1_2_3_SRC,
219862306a36Sopenharmony_ci	RT5677_ANA_DAC3_SRC_SEL_SFT, rt5677_dac3_src);
219962306a36Sopenharmony_ci
220062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_dac3_mux =
220162306a36Sopenharmony_ci	SOC_DAPM_ENUM("Analog DAC3 Source", rt5677_dac3_enum);
220262306a36Sopenharmony_ci
220362306a36Sopenharmony_ci/* PDM channel Source */ /* MX-31 [13:12][9:8][5:4][1:0] */
220462306a36Sopenharmony_cistatic const char * const rt5677_pdm_src[] = {
220562306a36Sopenharmony_ci	"STO1 DAC MIX", "MONO DAC MIX", "DD MIX1", "DD MIX2"
220662306a36Sopenharmony_ci};
220762306a36Sopenharmony_ci
220862306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
220962306a36Sopenharmony_ci	rt5677_pdm1_l_enum, RT5677_PDM_OUT_CTRL,
221062306a36Sopenharmony_ci	RT5677_SEL_PDM1_L_SFT, rt5677_pdm_src);
221162306a36Sopenharmony_ci
221262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_pdm1_l_mux =
221362306a36Sopenharmony_ci	SOC_DAPM_ENUM("PDM1 Source", rt5677_pdm1_l_enum);
221462306a36Sopenharmony_ci
221562306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
221662306a36Sopenharmony_ci	rt5677_pdm2_l_enum, RT5677_PDM_OUT_CTRL,
221762306a36Sopenharmony_ci	RT5677_SEL_PDM2_L_SFT, rt5677_pdm_src);
221862306a36Sopenharmony_ci
221962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_pdm2_l_mux =
222062306a36Sopenharmony_ci	SOC_DAPM_ENUM("PDM2 Source", rt5677_pdm2_l_enum);
222162306a36Sopenharmony_ci
222262306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
222362306a36Sopenharmony_ci	rt5677_pdm1_r_enum, RT5677_PDM_OUT_CTRL,
222462306a36Sopenharmony_ci	RT5677_SEL_PDM1_R_SFT, rt5677_pdm_src);
222562306a36Sopenharmony_ci
222662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_pdm1_r_mux =
222762306a36Sopenharmony_ci	SOC_DAPM_ENUM("PDM1 Source", rt5677_pdm1_r_enum);
222862306a36Sopenharmony_ci
222962306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
223062306a36Sopenharmony_ci	rt5677_pdm2_r_enum, RT5677_PDM_OUT_CTRL,
223162306a36Sopenharmony_ci	RT5677_SEL_PDM2_R_SFT, rt5677_pdm_src);
223262306a36Sopenharmony_ci
223362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_pdm2_r_mux =
223462306a36Sopenharmony_ci	SOC_DAPM_ENUM("PDM2 Source", rt5677_pdm2_r_enum);
223562306a36Sopenharmony_ci
223662306a36Sopenharmony_ci/* TDM IF1/2 SLB ADC1 Data Selection */ /* MX-3C MX-41 [5:4] MX-08 [1:0] */
223762306a36Sopenharmony_cistatic const char * const rt5677_if12_adc1_src[] = {
223862306a36Sopenharmony_ci	"STO1 ADC MIX", "OB01", "VAD ADC"
223962306a36Sopenharmony_ci};
224062306a36Sopenharmony_ci
224162306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
224262306a36Sopenharmony_ci	rt5677_if1_adc1_enum, RT5677_TDM1_CTRL2,
224362306a36Sopenharmony_ci	RT5677_IF1_ADC1_SFT, rt5677_if12_adc1_src);
224462306a36Sopenharmony_ci
224562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if1_adc1_mux =
224662306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 ADC1 Source", rt5677_if1_adc1_enum);
224762306a36Sopenharmony_ci
224862306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
224962306a36Sopenharmony_ci	rt5677_if2_adc1_enum, RT5677_TDM2_CTRL2,
225062306a36Sopenharmony_ci	RT5677_IF2_ADC1_SFT, rt5677_if12_adc1_src);
225162306a36Sopenharmony_ci
225262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if2_adc1_mux =
225362306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF2 ADC1 Source", rt5677_if2_adc1_enum);
225462306a36Sopenharmony_ci
225562306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
225662306a36Sopenharmony_ci	rt5677_slb_adc1_enum, RT5677_SLIMBUS_RX,
225762306a36Sopenharmony_ci	RT5677_SLB_ADC1_SFT, rt5677_if12_adc1_src);
225862306a36Sopenharmony_ci
225962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_slb_adc1_mux =
226062306a36Sopenharmony_ci	SOC_DAPM_ENUM("SLB ADC1 Source", rt5677_slb_adc1_enum);
226162306a36Sopenharmony_ci
226262306a36Sopenharmony_ci/* TDM IF1/2 SLB ADC2 Data Selection */ /* MX-3C MX-41 [7:6] MX-08 [3:2] */
226362306a36Sopenharmony_cistatic const char * const rt5677_if12_adc2_src[] = {
226462306a36Sopenharmony_ci	"STO2 ADC MIX", "OB23"
226562306a36Sopenharmony_ci};
226662306a36Sopenharmony_ci
226762306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
226862306a36Sopenharmony_ci	rt5677_if1_adc2_enum, RT5677_TDM1_CTRL2,
226962306a36Sopenharmony_ci	RT5677_IF1_ADC2_SFT, rt5677_if12_adc2_src);
227062306a36Sopenharmony_ci
227162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if1_adc2_mux =
227262306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 ADC2 Source", rt5677_if1_adc2_enum);
227362306a36Sopenharmony_ci
227462306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
227562306a36Sopenharmony_ci	rt5677_if2_adc2_enum, RT5677_TDM2_CTRL2,
227662306a36Sopenharmony_ci	RT5677_IF2_ADC2_SFT, rt5677_if12_adc2_src);
227762306a36Sopenharmony_ci
227862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if2_adc2_mux =
227962306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF2 ADC2 Source", rt5677_if2_adc2_enum);
228062306a36Sopenharmony_ci
228162306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
228262306a36Sopenharmony_ci	rt5677_slb_adc2_enum, RT5677_SLIMBUS_RX,
228362306a36Sopenharmony_ci	RT5677_SLB_ADC2_SFT, rt5677_if12_adc2_src);
228462306a36Sopenharmony_ci
228562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_slb_adc2_mux =
228662306a36Sopenharmony_ci	SOC_DAPM_ENUM("SLB ADC2 Source", rt5677_slb_adc2_enum);
228762306a36Sopenharmony_ci
228862306a36Sopenharmony_ci/* TDM IF1/2 SLB ADC3 Data Selection */ /* MX-3C MX-41 [9:8] MX-08 [5:4] */
228962306a36Sopenharmony_cistatic const char * const rt5677_if12_adc3_src[] = {
229062306a36Sopenharmony_ci	"STO3 ADC MIX", "MONO ADC MIX", "OB45"
229162306a36Sopenharmony_ci};
229262306a36Sopenharmony_ci
229362306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
229462306a36Sopenharmony_ci	rt5677_if1_adc3_enum, RT5677_TDM1_CTRL2,
229562306a36Sopenharmony_ci	RT5677_IF1_ADC3_SFT, rt5677_if12_adc3_src);
229662306a36Sopenharmony_ci
229762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if1_adc3_mux =
229862306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 ADC3 Source", rt5677_if1_adc3_enum);
229962306a36Sopenharmony_ci
230062306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
230162306a36Sopenharmony_ci	rt5677_if2_adc3_enum, RT5677_TDM2_CTRL2,
230262306a36Sopenharmony_ci	RT5677_IF2_ADC3_SFT, rt5677_if12_adc3_src);
230362306a36Sopenharmony_ci
230462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if2_adc3_mux =
230562306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF2 ADC3 Source", rt5677_if2_adc3_enum);
230662306a36Sopenharmony_ci
230762306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
230862306a36Sopenharmony_ci	rt5677_slb_adc3_enum, RT5677_SLIMBUS_RX,
230962306a36Sopenharmony_ci	RT5677_SLB_ADC3_SFT, rt5677_if12_adc3_src);
231062306a36Sopenharmony_ci
231162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_slb_adc3_mux =
231262306a36Sopenharmony_ci	SOC_DAPM_ENUM("SLB ADC3 Source", rt5677_slb_adc3_enum);
231362306a36Sopenharmony_ci
231462306a36Sopenharmony_ci/* TDM IF1/2 SLB ADC4 Data Selection */ /* MX-3C MX-41 [11:10] MX-08 [7:6] */
231562306a36Sopenharmony_cistatic const char * const rt5677_if12_adc4_src[] = {
231662306a36Sopenharmony_ci	"STO4 ADC MIX", "OB67", "OB01"
231762306a36Sopenharmony_ci};
231862306a36Sopenharmony_ci
231962306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
232062306a36Sopenharmony_ci	rt5677_if1_adc4_enum, RT5677_TDM1_CTRL2,
232162306a36Sopenharmony_ci	RT5677_IF1_ADC4_SFT, rt5677_if12_adc4_src);
232262306a36Sopenharmony_ci
232362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if1_adc4_mux =
232462306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 ADC4 Source", rt5677_if1_adc4_enum);
232562306a36Sopenharmony_ci
232662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
232762306a36Sopenharmony_ci	rt5677_if2_adc4_enum, RT5677_TDM2_CTRL2,
232862306a36Sopenharmony_ci	RT5677_IF2_ADC4_SFT, rt5677_if12_adc4_src);
232962306a36Sopenharmony_ci
233062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if2_adc4_mux =
233162306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF2 ADC4 Source", rt5677_if2_adc4_enum);
233262306a36Sopenharmony_ci
233362306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
233462306a36Sopenharmony_ci	rt5677_slb_adc4_enum, RT5677_SLIMBUS_RX,
233562306a36Sopenharmony_ci	RT5677_SLB_ADC4_SFT, rt5677_if12_adc4_src);
233662306a36Sopenharmony_ci
233762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_slb_adc4_mux =
233862306a36Sopenharmony_ci	SOC_DAPM_ENUM("SLB ADC4 Source", rt5677_slb_adc4_enum);
233962306a36Sopenharmony_ci
234062306a36Sopenharmony_ci/* Interface3/4 ADC Data Input */ /* MX-2F [3:0] MX-30 [7:4] */
234162306a36Sopenharmony_cistatic const char * const rt5677_if34_adc_src[] = {
234262306a36Sopenharmony_ci	"STO1 ADC MIX", "STO2 ADC MIX", "STO3 ADC MIX", "STO4 ADC MIX",
234362306a36Sopenharmony_ci	"MONO ADC MIX", "OB01", "OB23", "VAD ADC"
234462306a36Sopenharmony_ci};
234562306a36Sopenharmony_ci
234662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
234762306a36Sopenharmony_ci	rt5677_if3_adc_enum, RT5677_IF3_DATA,
234862306a36Sopenharmony_ci	RT5677_IF3_ADC_IN_SFT, rt5677_if34_adc_src);
234962306a36Sopenharmony_ci
235062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if3_adc_mux =
235162306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF3 ADC Source", rt5677_if3_adc_enum);
235262306a36Sopenharmony_ci
235362306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
235462306a36Sopenharmony_ci	rt5677_if4_adc_enum, RT5677_IF4_DATA,
235562306a36Sopenharmony_ci	RT5677_IF4_ADC_IN_SFT, rt5677_if34_adc_src);
235662306a36Sopenharmony_ci
235762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if4_adc_mux =
235862306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF4 ADC Source", rt5677_if4_adc_enum);
235962306a36Sopenharmony_ci
236062306a36Sopenharmony_ci/* TDM IF1/2 ADC Data Selection */ /* MX-3B MX-40 [7:6][5:4][3:2][1:0] */
236162306a36Sopenharmony_cistatic const char * const rt5677_if12_adc_swap_src[] = {
236262306a36Sopenharmony_ci	"L/R", "R/L", "L/L", "R/R"
236362306a36Sopenharmony_ci};
236462306a36Sopenharmony_ci
236562306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
236662306a36Sopenharmony_ci	rt5677_if1_adc1_swap_enum, RT5677_TDM1_CTRL1,
236762306a36Sopenharmony_ci	RT5677_IF1_ADC1_SWAP_SFT, rt5677_if12_adc_swap_src);
236862306a36Sopenharmony_ci
236962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if1_adc1_swap_mux =
237062306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 ADC1 Swap Source", rt5677_if1_adc1_swap_enum);
237162306a36Sopenharmony_ci
237262306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
237362306a36Sopenharmony_ci	rt5677_if1_adc2_swap_enum, RT5677_TDM1_CTRL1,
237462306a36Sopenharmony_ci	RT5677_IF1_ADC2_SWAP_SFT, rt5677_if12_adc_swap_src);
237562306a36Sopenharmony_ci
237662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if1_adc2_swap_mux =
237762306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 ADC2 Swap Source", rt5677_if1_adc2_swap_enum);
237862306a36Sopenharmony_ci
237962306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
238062306a36Sopenharmony_ci	rt5677_if1_adc3_swap_enum, RT5677_TDM1_CTRL1,
238162306a36Sopenharmony_ci	RT5677_IF1_ADC3_SWAP_SFT, rt5677_if12_adc_swap_src);
238262306a36Sopenharmony_ci
238362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if1_adc3_swap_mux =
238462306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 ADC3 Swap Source", rt5677_if1_adc3_swap_enum);
238562306a36Sopenharmony_ci
238662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
238762306a36Sopenharmony_ci	rt5677_if1_adc4_swap_enum, RT5677_TDM1_CTRL1,
238862306a36Sopenharmony_ci	RT5677_IF1_ADC4_SWAP_SFT, rt5677_if12_adc_swap_src);
238962306a36Sopenharmony_ci
239062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if1_adc4_swap_mux =
239162306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 ADC4 Swap Source", rt5677_if1_adc4_swap_enum);
239262306a36Sopenharmony_ci
239362306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
239462306a36Sopenharmony_ci	rt5677_if2_adc1_swap_enum, RT5677_TDM2_CTRL1,
239562306a36Sopenharmony_ci	RT5677_IF1_ADC2_SWAP_SFT, rt5677_if12_adc_swap_src);
239662306a36Sopenharmony_ci
239762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if2_adc1_swap_mux =
239862306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 ADC2 Swap Source", rt5677_if2_adc1_swap_enum);
239962306a36Sopenharmony_ci
240062306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
240162306a36Sopenharmony_ci	rt5677_if2_adc2_swap_enum, RT5677_TDM2_CTRL1,
240262306a36Sopenharmony_ci	RT5677_IF2_ADC2_SWAP_SFT, rt5677_if12_adc_swap_src);
240362306a36Sopenharmony_ci
240462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if2_adc2_swap_mux =
240562306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF2 ADC2 Swap Source", rt5677_if2_adc2_swap_enum);
240662306a36Sopenharmony_ci
240762306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
240862306a36Sopenharmony_ci	rt5677_if2_adc3_swap_enum, RT5677_TDM2_CTRL1,
240962306a36Sopenharmony_ci	RT5677_IF2_ADC3_SWAP_SFT, rt5677_if12_adc_swap_src);
241062306a36Sopenharmony_ci
241162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if2_adc3_swap_mux =
241262306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF2 ADC3 Swap Source", rt5677_if2_adc3_swap_enum);
241362306a36Sopenharmony_ci
241462306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
241562306a36Sopenharmony_ci	rt5677_if2_adc4_swap_enum, RT5677_TDM2_CTRL1,
241662306a36Sopenharmony_ci	RT5677_IF2_ADC4_SWAP_SFT, rt5677_if12_adc_swap_src);
241762306a36Sopenharmony_ci
241862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if2_adc4_swap_mux =
241962306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF2 ADC4 Swap Source", rt5677_if2_adc4_swap_enum);
242062306a36Sopenharmony_ci
242162306a36Sopenharmony_ci/* TDM IF1 ADC Data Selection */ /* MX-3C [2:0] */
242262306a36Sopenharmony_cistatic const char * const rt5677_if1_adc_tdm_swap_src[] = {
242362306a36Sopenharmony_ci	"1/2/3/4", "2/1/3/4", "2/3/1/4", "4/1/2/3", "1/3/2/4", "1/4/2/3",
242462306a36Sopenharmony_ci	"3/1/2/4", "3/4/1/2"
242562306a36Sopenharmony_ci};
242662306a36Sopenharmony_ci
242762306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
242862306a36Sopenharmony_ci	rt5677_if1_adc_tdm_swap_enum, RT5677_TDM1_CTRL2,
242962306a36Sopenharmony_ci	RT5677_IF1_ADC_CTRL_SFT, rt5677_if1_adc_tdm_swap_src);
243062306a36Sopenharmony_ci
243162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if1_adc_tdm_swap_mux =
243262306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 ADC TDM Swap Source", rt5677_if1_adc_tdm_swap_enum);
243362306a36Sopenharmony_ci
243462306a36Sopenharmony_ci/* TDM IF2 ADC Data Selection */ /* MX-41[2:0] */
243562306a36Sopenharmony_cistatic const char * const rt5677_if2_adc_tdm_swap_src[] = {
243662306a36Sopenharmony_ci	"1/2/3/4", "2/1/3/4", "3/1/2/4", "4/1/2/3", "1/3/2/4", "1/4/2/3",
243762306a36Sopenharmony_ci	"2/3/1/4", "3/4/1/2"
243862306a36Sopenharmony_ci};
243962306a36Sopenharmony_ci
244062306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
244162306a36Sopenharmony_ci	rt5677_if2_adc_tdm_swap_enum, RT5677_TDM2_CTRL2,
244262306a36Sopenharmony_ci	RT5677_IF2_ADC_CTRL_SFT, rt5677_if2_adc_tdm_swap_src);
244362306a36Sopenharmony_ci
244462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if2_adc_tdm_swap_mux =
244562306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF2 ADC TDM Swap Source", rt5677_if2_adc_tdm_swap_enum);
244662306a36Sopenharmony_ci
244762306a36Sopenharmony_ci/* TDM IF1/2 DAC Data Selection */ /* MX-3E[14:12][10:8][6:4][2:0]
244862306a36Sopenharmony_ci					MX-3F[14:12][10:8][6:4][2:0]
244962306a36Sopenharmony_ci					MX-43[14:12][10:8][6:4][2:0]
245062306a36Sopenharmony_ci					MX-44[14:12][10:8][6:4][2:0] */
245162306a36Sopenharmony_cistatic const char * const rt5677_if12_dac_tdm_sel_src[] = {
245262306a36Sopenharmony_ci	"Slot0", "Slot1", "Slot2", "Slot3", "Slot4", "Slot5", "Slot6", "Slot7"
245362306a36Sopenharmony_ci};
245462306a36Sopenharmony_ci
245562306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
245662306a36Sopenharmony_ci	rt5677_if1_dac0_tdm_sel_enum, RT5677_TDM1_CTRL4,
245762306a36Sopenharmony_ci	RT5677_IF1_DAC0_SFT, rt5677_if12_dac_tdm_sel_src);
245862306a36Sopenharmony_ci
245962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if1_dac0_tdm_sel_mux =
246062306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 DAC0 TDM Source", rt5677_if1_dac0_tdm_sel_enum);
246162306a36Sopenharmony_ci
246262306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
246362306a36Sopenharmony_ci	rt5677_if1_dac1_tdm_sel_enum, RT5677_TDM1_CTRL4,
246462306a36Sopenharmony_ci	RT5677_IF1_DAC1_SFT, rt5677_if12_dac_tdm_sel_src);
246562306a36Sopenharmony_ci
246662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if1_dac1_tdm_sel_mux =
246762306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 DAC1 TDM Source", rt5677_if1_dac1_tdm_sel_enum);
246862306a36Sopenharmony_ci
246962306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
247062306a36Sopenharmony_ci	rt5677_if1_dac2_tdm_sel_enum, RT5677_TDM1_CTRL4,
247162306a36Sopenharmony_ci	RT5677_IF1_DAC2_SFT, rt5677_if12_dac_tdm_sel_src);
247262306a36Sopenharmony_ci
247362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if1_dac2_tdm_sel_mux =
247462306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 DAC2 TDM Source", rt5677_if1_dac2_tdm_sel_enum);
247562306a36Sopenharmony_ci
247662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
247762306a36Sopenharmony_ci	rt5677_if1_dac3_tdm_sel_enum, RT5677_TDM1_CTRL4,
247862306a36Sopenharmony_ci	RT5677_IF1_DAC3_SFT, rt5677_if12_dac_tdm_sel_src);
247962306a36Sopenharmony_ci
248062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if1_dac3_tdm_sel_mux =
248162306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 DAC3 TDM Source", rt5677_if1_dac3_tdm_sel_enum);
248262306a36Sopenharmony_ci
248362306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
248462306a36Sopenharmony_ci	rt5677_if1_dac4_tdm_sel_enum, RT5677_TDM1_CTRL5,
248562306a36Sopenharmony_ci	RT5677_IF1_DAC4_SFT, rt5677_if12_dac_tdm_sel_src);
248662306a36Sopenharmony_ci
248762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if1_dac4_tdm_sel_mux =
248862306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 DAC4 TDM Source", rt5677_if1_dac4_tdm_sel_enum);
248962306a36Sopenharmony_ci
249062306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
249162306a36Sopenharmony_ci	rt5677_if1_dac5_tdm_sel_enum, RT5677_TDM1_CTRL5,
249262306a36Sopenharmony_ci	RT5677_IF1_DAC5_SFT, rt5677_if12_dac_tdm_sel_src);
249362306a36Sopenharmony_ci
249462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if1_dac5_tdm_sel_mux =
249562306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 DAC5 TDM Source", rt5677_if1_dac5_tdm_sel_enum);
249662306a36Sopenharmony_ci
249762306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
249862306a36Sopenharmony_ci	rt5677_if1_dac6_tdm_sel_enum, RT5677_TDM1_CTRL5,
249962306a36Sopenharmony_ci	RT5677_IF1_DAC6_SFT, rt5677_if12_dac_tdm_sel_src);
250062306a36Sopenharmony_ci
250162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if1_dac6_tdm_sel_mux =
250262306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 DAC6 TDM Source", rt5677_if1_dac6_tdm_sel_enum);
250362306a36Sopenharmony_ci
250462306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
250562306a36Sopenharmony_ci	rt5677_if1_dac7_tdm_sel_enum, RT5677_TDM1_CTRL5,
250662306a36Sopenharmony_ci	RT5677_IF1_DAC7_SFT, rt5677_if12_dac_tdm_sel_src);
250762306a36Sopenharmony_ci
250862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if1_dac7_tdm_sel_mux =
250962306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF1 DAC7 TDM Source", rt5677_if1_dac7_tdm_sel_enum);
251062306a36Sopenharmony_ci
251162306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
251262306a36Sopenharmony_ci	rt5677_if2_dac0_tdm_sel_enum, RT5677_TDM2_CTRL4,
251362306a36Sopenharmony_ci	RT5677_IF2_DAC0_SFT, rt5677_if12_dac_tdm_sel_src);
251462306a36Sopenharmony_ci
251562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if2_dac0_tdm_sel_mux =
251662306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF2 DAC0 TDM Source", rt5677_if2_dac0_tdm_sel_enum);
251762306a36Sopenharmony_ci
251862306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
251962306a36Sopenharmony_ci	rt5677_if2_dac1_tdm_sel_enum, RT5677_TDM2_CTRL4,
252062306a36Sopenharmony_ci	RT5677_IF2_DAC1_SFT, rt5677_if12_dac_tdm_sel_src);
252162306a36Sopenharmony_ci
252262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if2_dac1_tdm_sel_mux =
252362306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF2 DAC1 TDM Source", rt5677_if2_dac1_tdm_sel_enum);
252462306a36Sopenharmony_ci
252562306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
252662306a36Sopenharmony_ci	rt5677_if2_dac2_tdm_sel_enum, RT5677_TDM2_CTRL4,
252762306a36Sopenharmony_ci	RT5677_IF2_DAC2_SFT, rt5677_if12_dac_tdm_sel_src);
252862306a36Sopenharmony_ci
252962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if2_dac2_tdm_sel_mux =
253062306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF2 DAC2 TDM Source", rt5677_if2_dac2_tdm_sel_enum);
253162306a36Sopenharmony_ci
253262306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
253362306a36Sopenharmony_ci	rt5677_if2_dac3_tdm_sel_enum, RT5677_TDM2_CTRL4,
253462306a36Sopenharmony_ci	RT5677_IF2_DAC3_SFT, rt5677_if12_dac_tdm_sel_src);
253562306a36Sopenharmony_ci
253662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if2_dac3_tdm_sel_mux =
253762306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF2 DAC3 TDM Source", rt5677_if2_dac3_tdm_sel_enum);
253862306a36Sopenharmony_ci
253962306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
254062306a36Sopenharmony_ci	rt5677_if2_dac4_tdm_sel_enum, RT5677_TDM2_CTRL5,
254162306a36Sopenharmony_ci	RT5677_IF2_DAC4_SFT, rt5677_if12_dac_tdm_sel_src);
254262306a36Sopenharmony_ci
254362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if2_dac4_tdm_sel_mux =
254462306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF2 DAC4 TDM Source", rt5677_if2_dac4_tdm_sel_enum);
254562306a36Sopenharmony_ci
254662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
254762306a36Sopenharmony_ci	rt5677_if2_dac5_tdm_sel_enum, RT5677_TDM2_CTRL5,
254862306a36Sopenharmony_ci	RT5677_IF2_DAC5_SFT, rt5677_if12_dac_tdm_sel_src);
254962306a36Sopenharmony_ci
255062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if2_dac5_tdm_sel_mux =
255162306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF2 DAC5 TDM Source", rt5677_if2_dac5_tdm_sel_enum);
255262306a36Sopenharmony_ci
255362306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
255462306a36Sopenharmony_ci	rt5677_if2_dac6_tdm_sel_enum, RT5677_TDM2_CTRL5,
255562306a36Sopenharmony_ci	RT5677_IF2_DAC6_SFT, rt5677_if12_dac_tdm_sel_src);
255662306a36Sopenharmony_ci
255762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if2_dac6_tdm_sel_mux =
255862306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF2 DAC6 TDM Source", rt5677_if2_dac6_tdm_sel_enum);
255962306a36Sopenharmony_ci
256062306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(
256162306a36Sopenharmony_ci	rt5677_if2_dac7_tdm_sel_enum, RT5677_TDM2_CTRL5,
256262306a36Sopenharmony_ci	RT5677_IF2_DAC7_SFT, rt5677_if12_dac_tdm_sel_src);
256362306a36Sopenharmony_ci
256462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5677_if2_dac7_tdm_sel_mux =
256562306a36Sopenharmony_ci	SOC_DAPM_ENUM("IF2 DAC7 TDM Source", rt5677_if2_dac7_tdm_sel_enum);
256662306a36Sopenharmony_ci
256762306a36Sopenharmony_cistatic int rt5677_bst1_event(struct snd_soc_dapm_widget *w,
256862306a36Sopenharmony_ci	struct snd_kcontrol *kcontrol, int event)
256962306a36Sopenharmony_ci{
257062306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
257162306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
257262306a36Sopenharmony_ci
257362306a36Sopenharmony_ci	switch (event) {
257462306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
257562306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,
257662306a36Sopenharmony_ci			RT5677_PWR_BST1_P, RT5677_PWR_BST1_P);
257762306a36Sopenharmony_ci		break;
257862306a36Sopenharmony_ci
257962306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMD:
258062306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,
258162306a36Sopenharmony_ci			RT5677_PWR_BST1_P, 0);
258262306a36Sopenharmony_ci		break;
258362306a36Sopenharmony_ci
258462306a36Sopenharmony_ci	default:
258562306a36Sopenharmony_ci		return 0;
258662306a36Sopenharmony_ci	}
258762306a36Sopenharmony_ci
258862306a36Sopenharmony_ci	return 0;
258962306a36Sopenharmony_ci}
259062306a36Sopenharmony_ci
259162306a36Sopenharmony_cistatic int rt5677_bst2_event(struct snd_soc_dapm_widget *w,
259262306a36Sopenharmony_ci	struct snd_kcontrol *kcontrol, int event)
259362306a36Sopenharmony_ci{
259462306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
259562306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
259662306a36Sopenharmony_ci
259762306a36Sopenharmony_ci	switch (event) {
259862306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
259962306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,
260062306a36Sopenharmony_ci			RT5677_PWR_BST2_P, RT5677_PWR_BST2_P);
260162306a36Sopenharmony_ci		break;
260262306a36Sopenharmony_ci
260362306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMD:
260462306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,
260562306a36Sopenharmony_ci			RT5677_PWR_BST2_P, 0);
260662306a36Sopenharmony_ci		break;
260762306a36Sopenharmony_ci
260862306a36Sopenharmony_ci	default:
260962306a36Sopenharmony_ci		return 0;
261062306a36Sopenharmony_ci	}
261162306a36Sopenharmony_ci
261262306a36Sopenharmony_ci	return 0;
261362306a36Sopenharmony_ci}
261462306a36Sopenharmony_ci
261562306a36Sopenharmony_cistatic int rt5677_set_pll1_event(struct snd_soc_dapm_widget *w,
261662306a36Sopenharmony_ci	struct snd_kcontrol *kcontrol, int event)
261762306a36Sopenharmony_ci{
261862306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
261962306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
262062306a36Sopenharmony_ci
262162306a36Sopenharmony_ci	switch (event) {
262262306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
262362306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_PLL1_CTRL2, 0x2, 0x2);
262462306a36Sopenharmony_ci		break;
262562306a36Sopenharmony_ci
262662306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
262762306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_PLL1_CTRL2, 0x2, 0x0);
262862306a36Sopenharmony_ci		break;
262962306a36Sopenharmony_ci
263062306a36Sopenharmony_ci	default:
263162306a36Sopenharmony_ci		return 0;
263262306a36Sopenharmony_ci	}
263362306a36Sopenharmony_ci
263462306a36Sopenharmony_ci	return 0;
263562306a36Sopenharmony_ci}
263662306a36Sopenharmony_ci
263762306a36Sopenharmony_cistatic int rt5677_set_pll2_event(struct snd_soc_dapm_widget *w,
263862306a36Sopenharmony_ci	struct snd_kcontrol *kcontrol, int event)
263962306a36Sopenharmony_ci{
264062306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
264162306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
264262306a36Sopenharmony_ci
264362306a36Sopenharmony_ci	switch (event) {
264462306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
264562306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_PLL2_CTRL2, 0x2, 0x2);
264662306a36Sopenharmony_ci		break;
264762306a36Sopenharmony_ci
264862306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
264962306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_PLL2_CTRL2, 0x2, 0x0);
265062306a36Sopenharmony_ci		break;
265162306a36Sopenharmony_ci
265262306a36Sopenharmony_ci	default:
265362306a36Sopenharmony_ci		return 0;
265462306a36Sopenharmony_ci	}
265562306a36Sopenharmony_ci
265662306a36Sopenharmony_ci	return 0;
265762306a36Sopenharmony_ci}
265862306a36Sopenharmony_ci
265962306a36Sopenharmony_cistatic int rt5677_set_micbias1_event(struct snd_soc_dapm_widget *w,
266062306a36Sopenharmony_ci	struct snd_kcontrol *kcontrol, int event)
266162306a36Sopenharmony_ci{
266262306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
266362306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
266462306a36Sopenharmony_ci
266562306a36Sopenharmony_ci	switch (event) {
266662306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
266762306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,
266862306a36Sopenharmony_ci			RT5677_PWR_CLK_MB1 | RT5677_PWR_PP_MB1 |
266962306a36Sopenharmony_ci			RT5677_PWR_CLK_MB, RT5677_PWR_CLK_MB1 |
267062306a36Sopenharmony_ci			RT5677_PWR_PP_MB1 | RT5677_PWR_CLK_MB);
267162306a36Sopenharmony_ci		break;
267262306a36Sopenharmony_ci
267362306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMD:
267462306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,
267562306a36Sopenharmony_ci			RT5677_PWR_CLK_MB1 | RT5677_PWR_PP_MB1 |
267662306a36Sopenharmony_ci			RT5677_PWR_CLK_MB, 0);
267762306a36Sopenharmony_ci		break;
267862306a36Sopenharmony_ci
267962306a36Sopenharmony_ci	default:
268062306a36Sopenharmony_ci		return 0;
268162306a36Sopenharmony_ci	}
268262306a36Sopenharmony_ci
268362306a36Sopenharmony_ci	return 0;
268462306a36Sopenharmony_ci}
268562306a36Sopenharmony_ci
268662306a36Sopenharmony_cistatic int rt5677_if1_adc_tdm_event(struct snd_soc_dapm_widget *w,
268762306a36Sopenharmony_ci	struct snd_kcontrol *kcontrol, int event)
268862306a36Sopenharmony_ci{
268962306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
269062306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
269162306a36Sopenharmony_ci	unsigned int value;
269262306a36Sopenharmony_ci
269362306a36Sopenharmony_ci	switch (event) {
269462306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
269562306a36Sopenharmony_ci		regmap_read(rt5677->regmap, RT5677_TDM1_CTRL2, &value);
269662306a36Sopenharmony_ci		if (value & RT5677_IF1_ADC_CTRL_MASK)
269762306a36Sopenharmony_ci			regmap_update_bits(rt5677->regmap, RT5677_TDM1_CTRL1,
269862306a36Sopenharmony_ci				RT5677_IF1_ADC_MODE_MASK,
269962306a36Sopenharmony_ci				RT5677_IF1_ADC_MODE_TDM);
270062306a36Sopenharmony_ci		break;
270162306a36Sopenharmony_ci
270262306a36Sopenharmony_ci	default:
270362306a36Sopenharmony_ci		return 0;
270462306a36Sopenharmony_ci	}
270562306a36Sopenharmony_ci
270662306a36Sopenharmony_ci	return 0;
270762306a36Sopenharmony_ci}
270862306a36Sopenharmony_ci
270962306a36Sopenharmony_cistatic int rt5677_if2_adc_tdm_event(struct snd_soc_dapm_widget *w,
271062306a36Sopenharmony_ci	struct snd_kcontrol *kcontrol, int event)
271162306a36Sopenharmony_ci{
271262306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
271362306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
271462306a36Sopenharmony_ci	unsigned int value;
271562306a36Sopenharmony_ci
271662306a36Sopenharmony_ci	switch (event) {
271762306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
271862306a36Sopenharmony_ci		regmap_read(rt5677->regmap, RT5677_TDM2_CTRL2, &value);
271962306a36Sopenharmony_ci		if (value & RT5677_IF2_ADC_CTRL_MASK)
272062306a36Sopenharmony_ci			regmap_update_bits(rt5677->regmap, RT5677_TDM2_CTRL1,
272162306a36Sopenharmony_ci				RT5677_IF2_ADC_MODE_MASK,
272262306a36Sopenharmony_ci				RT5677_IF2_ADC_MODE_TDM);
272362306a36Sopenharmony_ci		break;
272462306a36Sopenharmony_ci
272562306a36Sopenharmony_ci	default:
272662306a36Sopenharmony_ci		return 0;
272762306a36Sopenharmony_ci	}
272862306a36Sopenharmony_ci
272962306a36Sopenharmony_ci	return 0;
273062306a36Sopenharmony_ci}
273162306a36Sopenharmony_ci
273262306a36Sopenharmony_cistatic int rt5677_vref_event(struct snd_soc_dapm_widget *w,
273362306a36Sopenharmony_ci	struct snd_kcontrol *kcontrol, int event)
273462306a36Sopenharmony_ci{
273562306a36Sopenharmony_ci	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
273662306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
273762306a36Sopenharmony_ci
273862306a36Sopenharmony_ci	switch (event) {
273962306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
274062306a36Sopenharmony_ci		if (snd_soc_component_get_bias_level(component) != SND_SOC_BIAS_ON &&
274162306a36Sopenharmony_ci			!rt5677->is_vref_slow) {
274262306a36Sopenharmony_ci			mdelay(20);
274362306a36Sopenharmony_ci			regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG1,
274462306a36Sopenharmony_ci				RT5677_PWR_FV1 | RT5677_PWR_FV2,
274562306a36Sopenharmony_ci				RT5677_PWR_FV1 | RT5677_PWR_FV2);
274662306a36Sopenharmony_ci			rt5677->is_vref_slow = true;
274762306a36Sopenharmony_ci		}
274862306a36Sopenharmony_ci		break;
274962306a36Sopenharmony_ci
275062306a36Sopenharmony_ci	default:
275162306a36Sopenharmony_ci		return 0;
275262306a36Sopenharmony_ci	}
275362306a36Sopenharmony_ci
275462306a36Sopenharmony_ci	return 0;
275562306a36Sopenharmony_ci}
275662306a36Sopenharmony_ci
275762306a36Sopenharmony_cistatic int rt5677_filter_power_event(struct snd_soc_dapm_widget *w,
275862306a36Sopenharmony_ci	struct snd_kcontrol *kcontrol, int event)
275962306a36Sopenharmony_ci{
276062306a36Sopenharmony_ci	switch (event) {
276162306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
276262306a36Sopenharmony_ci		msleep(50);
276362306a36Sopenharmony_ci		break;
276462306a36Sopenharmony_ci
276562306a36Sopenharmony_ci	default:
276662306a36Sopenharmony_ci		return 0;
276762306a36Sopenharmony_ci	}
276862306a36Sopenharmony_ci
276962306a36Sopenharmony_ci	return 0;
277062306a36Sopenharmony_ci}
277162306a36Sopenharmony_ci
277262306a36Sopenharmony_cistatic const struct snd_soc_dapm_widget rt5677_dapm_widgets[] = {
277362306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("PLL1", RT5677_PWR_ANLG2, RT5677_PWR_PLL1_BIT,
277462306a36Sopenharmony_ci		0, rt5677_set_pll1_event, SND_SOC_DAPM_PRE_PMU |
277562306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMU),
277662306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("PLL2", RT5677_PWR_ANLG2, RT5677_PWR_PLL2_BIT,
277762306a36Sopenharmony_ci		0, rt5677_set_pll2_event, SND_SOC_DAPM_PRE_PMU |
277862306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMU),
277962306a36Sopenharmony_ci
278062306a36Sopenharmony_ci	/* ASRC */
278162306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("I2S1 ASRC", 1, RT5677_ASRC_1, 0, 0, NULL, 0),
278262306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("I2S2 ASRC", 1, RT5677_ASRC_1, 1, 0, NULL, 0),
278362306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("I2S3 ASRC", 1, RT5677_ASRC_1, 2, 0, NULL, 0),
278462306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("I2S4 ASRC", 1, RT5677_ASRC_1, 3, 0, NULL, 0),
278562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("DAC STO ASRC", 1, RT5677_ASRC_2, 14, 0,
278662306a36Sopenharmony_ci		rt5677_filter_power_event, SND_SOC_DAPM_POST_PMU),
278762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("DAC MONO2 L ASRC", 1, RT5677_ASRC_2, 13, 0, NULL,
278862306a36Sopenharmony_ci		0),
278962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("DAC MONO2 R ASRC", 1, RT5677_ASRC_2, 12, 0, NULL,
279062306a36Sopenharmony_ci		0),
279162306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("DAC MONO3 L ASRC", 1, RT5677_ASRC_1, 15, 0, NULL,
279262306a36Sopenharmony_ci		0),
279362306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("DAC MONO3 R ASRC", 1, RT5677_ASRC_1, 14, 0, NULL,
279462306a36Sopenharmony_ci		0),
279562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("DAC MONO4 L ASRC", 1, RT5677_ASRC_1, 13, 0, NULL,
279662306a36Sopenharmony_ci		0),
279762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("DAC MONO4 R ASRC", 1, RT5677_ASRC_1, 12, 0, NULL,
279862306a36Sopenharmony_ci		0),
279962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("DMIC STO1 ASRC", 1, RT5677_ASRC_2, 11, 0, NULL,
280062306a36Sopenharmony_ci		0),
280162306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("DMIC STO2 ASRC", 1, RT5677_ASRC_2, 10, 0, NULL,
280262306a36Sopenharmony_ci		0),
280362306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("DMIC STO3 ASRC", 1, RT5677_ASRC_2, 9, 0, NULL,
280462306a36Sopenharmony_ci		0),
280562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("DMIC STO4 ASRC", 1, RT5677_ASRC_2, 8, 0, NULL,
280662306a36Sopenharmony_ci		0),
280762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("DMIC MONO L ASRC", 1, RT5677_ASRC_2, 7, 0, NULL,
280862306a36Sopenharmony_ci		0),
280962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("DMIC MONO R ASRC", 1, RT5677_ASRC_2, 6, 0, NULL,
281062306a36Sopenharmony_ci		0),
281162306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("ADC STO1 ASRC", 1, RT5677_ASRC_2, 5, 0, NULL, 0),
281262306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("ADC STO2 ASRC", 1, RT5677_ASRC_2, 4, 0, NULL, 0),
281362306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("ADC STO3 ASRC", 1, RT5677_ASRC_2, 3, 0, NULL, 0),
281462306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("ADC STO4 ASRC", 1, RT5677_ASRC_2, 2, 0, NULL, 0),
281562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("ADC MONO L ASRC", 1, RT5677_ASRC_2, 1, 0, NULL,
281662306a36Sopenharmony_ci		0),
281762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("ADC MONO R ASRC", 1, RT5677_ASRC_2, 0, 0, NULL,
281862306a36Sopenharmony_ci		0),
281962306a36Sopenharmony_ci
282062306a36Sopenharmony_ci	/* Input Side */
282162306a36Sopenharmony_ci	/* micbias */
282262306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("MICBIAS1", RT5677_PWR_ANLG2, RT5677_PWR_MB1_BIT,
282362306a36Sopenharmony_ci		0, rt5677_set_micbias1_event, SND_SOC_DAPM_PRE_PMD |
282462306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMU),
282562306a36Sopenharmony_ci
282662306a36Sopenharmony_ci	/* Input Lines */
282762306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("DMIC L1"),
282862306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("DMIC R1"),
282962306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("DMIC L2"),
283062306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("DMIC R2"),
283162306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("DMIC L3"),
283262306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("DMIC R3"),
283362306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("DMIC L4"),
283462306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("DMIC R4"),
283562306a36Sopenharmony_ci
283662306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("IN1P"),
283762306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("IN1N"),
283862306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("IN2P"),
283962306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("IN2N"),
284062306a36Sopenharmony_ci
284162306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("Haptic Generator"),
284262306a36Sopenharmony_ci
284362306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("DMIC1", SND_SOC_NOPM, 0, 0, NULL, 0),
284462306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("DMIC2", SND_SOC_NOPM, 0, 0, NULL, 0),
284562306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("DMIC3", SND_SOC_NOPM, 0, 0, NULL, 0),
284662306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("DMIC4", SND_SOC_NOPM, 0, 0, NULL, 0),
284762306a36Sopenharmony_ci
284862306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("DMIC1 power", RT5677_DMIC_CTRL1,
284962306a36Sopenharmony_ci		RT5677_DMIC_1_EN_SFT, 0, NULL, 0),
285062306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("DMIC2 power", RT5677_DMIC_CTRL1,
285162306a36Sopenharmony_ci		RT5677_DMIC_2_EN_SFT, 0, NULL, 0),
285262306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("DMIC3 power", RT5677_DMIC_CTRL1,
285362306a36Sopenharmony_ci		RT5677_DMIC_3_EN_SFT, 0, NULL, 0),
285462306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("DMIC4 power", RT5677_DMIC_CTRL2,
285562306a36Sopenharmony_ci		RT5677_DMIC_4_EN_SFT, 0, NULL, 0),
285662306a36Sopenharmony_ci
285762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("DMIC CLK", SND_SOC_NOPM, 0, 0,
285862306a36Sopenharmony_ci		set_dmic_clk, SND_SOC_DAPM_PRE_PMU),
285962306a36Sopenharmony_ci
286062306a36Sopenharmony_ci	/* Boost */
286162306a36Sopenharmony_ci	SND_SOC_DAPM_PGA_E("BST1", RT5677_PWR_ANLG2,
286262306a36Sopenharmony_ci		RT5677_PWR_BST1_BIT, 0, NULL, 0, rt5677_bst1_event,
286362306a36Sopenharmony_ci		SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
286462306a36Sopenharmony_ci	SND_SOC_DAPM_PGA_E("BST2", RT5677_PWR_ANLG2,
286562306a36Sopenharmony_ci		RT5677_PWR_BST2_BIT, 0, NULL, 0, rt5677_bst2_event,
286662306a36Sopenharmony_ci		SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
286762306a36Sopenharmony_ci
286862306a36Sopenharmony_ci	/* ADCs */
286962306a36Sopenharmony_ci	SND_SOC_DAPM_ADC("ADC 1", NULL, SND_SOC_NOPM,
287062306a36Sopenharmony_ci		0, 0),
287162306a36Sopenharmony_ci	SND_SOC_DAPM_ADC("ADC 2", NULL, SND_SOC_NOPM,
287262306a36Sopenharmony_ci		0, 0),
287362306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("ADC 1_2", SND_SOC_NOPM, 0, 0, NULL, 0),
287462306a36Sopenharmony_ci
287562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("ADC 1 power", RT5677_PWR_DIG1,
287662306a36Sopenharmony_ci		RT5677_PWR_ADC_L_BIT, 0, NULL, 0),
287762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("ADC 2 power", RT5677_PWR_DIG1,
287862306a36Sopenharmony_ci		RT5677_PWR_ADC_R_BIT, 0, NULL, 0),
287962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("ADC1 clock", RT5677_PWR_DIG1,
288062306a36Sopenharmony_ci		RT5677_PWR_ADCFED1_BIT, 0, NULL, 0),
288162306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("ADC2 clock", RT5677_PWR_DIG1,
288262306a36Sopenharmony_ci		RT5677_PWR_ADCFED2_BIT, 0, NULL, 0),
288362306a36Sopenharmony_ci
288462306a36Sopenharmony_ci	/* ADC Mux */
288562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Stereo1 DMIC Mux", SND_SOC_NOPM, 0, 0,
288662306a36Sopenharmony_ci				&rt5677_sto1_dmic_mux),
288762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Stereo1 ADC1 Mux", SND_SOC_NOPM, 0, 0,
288862306a36Sopenharmony_ci				&rt5677_sto1_adc1_mux),
288962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Stereo1 ADC2 Mux", SND_SOC_NOPM, 0, 0,
289062306a36Sopenharmony_ci				&rt5677_sto1_adc2_mux),
289162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Stereo2 DMIC Mux", SND_SOC_NOPM, 0, 0,
289262306a36Sopenharmony_ci				&rt5677_sto2_dmic_mux),
289362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Stereo2 ADC1 Mux", SND_SOC_NOPM, 0, 0,
289462306a36Sopenharmony_ci				&rt5677_sto2_adc1_mux),
289562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Stereo2 ADC2 Mux", SND_SOC_NOPM, 0, 0,
289662306a36Sopenharmony_ci				&rt5677_sto2_adc2_mux),
289762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Stereo2 ADC LR Mux", SND_SOC_NOPM, 0, 0,
289862306a36Sopenharmony_ci				&rt5677_sto2_adc_lr_mux),
289962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Stereo3 DMIC Mux", SND_SOC_NOPM, 0, 0,
290062306a36Sopenharmony_ci				&rt5677_sto3_dmic_mux),
290162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Stereo3 ADC1 Mux", SND_SOC_NOPM, 0, 0,
290262306a36Sopenharmony_ci				&rt5677_sto3_adc1_mux),
290362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Stereo3 ADC2 Mux", SND_SOC_NOPM, 0, 0,
290462306a36Sopenharmony_ci				&rt5677_sto3_adc2_mux),
290562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Stereo4 DMIC Mux", SND_SOC_NOPM, 0, 0,
290662306a36Sopenharmony_ci				&rt5677_sto4_dmic_mux),
290762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Stereo4 ADC1 Mux", SND_SOC_NOPM, 0, 0,
290862306a36Sopenharmony_ci				&rt5677_sto4_adc1_mux),
290962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Stereo4 ADC2 Mux", SND_SOC_NOPM, 0, 0,
291062306a36Sopenharmony_ci				&rt5677_sto4_adc2_mux),
291162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Mono DMIC L Mux", SND_SOC_NOPM, 0, 0,
291262306a36Sopenharmony_ci				&rt5677_mono_dmic_l_mux),
291362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Mono DMIC R Mux", SND_SOC_NOPM, 0, 0,
291462306a36Sopenharmony_ci				&rt5677_mono_dmic_r_mux),
291562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Mono ADC2 L Mux", SND_SOC_NOPM, 0, 0,
291662306a36Sopenharmony_ci				&rt5677_mono_adc2_l_mux),
291762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Mono ADC1 L Mux", SND_SOC_NOPM, 0, 0,
291862306a36Sopenharmony_ci				&rt5677_mono_adc1_l_mux),
291962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Mono ADC1 R Mux", SND_SOC_NOPM, 0, 0,
292062306a36Sopenharmony_ci				&rt5677_mono_adc1_r_mux),
292162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Mono ADC2 R Mux", SND_SOC_NOPM, 0, 0,
292262306a36Sopenharmony_ci				&rt5677_mono_adc2_r_mux),
292362306a36Sopenharmony_ci
292462306a36Sopenharmony_ci	/* ADC Mixer */
292562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("adc stereo1 filter", RT5677_PWR_DIG2,
292662306a36Sopenharmony_ci		RT5677_PWR_ADC_S1F_BIT, 0, NULL, 0),
292762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("adc stereo2 filter", RT5677_PWR_DIG2,
292862306a36Sopenharmony_ci		RT5677_PWR_ADC_S2F_BIT, 0, NULL, 0),
292962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("adc stereo3 filter", RT5677_PWR_DIG2,
293062306a36Sopenharmony_ci		RT5677_PWR_ADC_S3F_BIT, 0, NULL, 0),
293162306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("adc stereo4 filter", RT5677_PWR_DIG2,
293262306a36Sopenharmony_ci		RT5677_PWR_ADC_S4F_BIT, 0, NULL, 0),
293362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("Sto1 ADC MIXL", SND_SOC_NOPM, 0, 0,
293462306a36Sopenharmony_ci		rt5677_sto1_adc_l_mix, ARRAY_SIZE(rt5677_sto1_adc_l_mix)),
293562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("Sto1 ADC MIXR", SND_SOC_NOPM, 0, 0,
293662306a36Sopenharmony_ci		rt5677_sto1_adc_r_mix, ARRAY_SIZE(rt5677_sto1_adc_r_mix)),
293762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("Sto2 ADC MIXL", SND_SOC_NOPM, 0, 0,
293862306a36Sopenharmony_ci		rt5677_sto2_adc_l_mix, ARRAY_SIZE(rt5677_sto2_adc_l_mix)),
293962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("Sto2 ADC MIXR", SND_SOC_NOPM, 0, 0,
294062306a36Sopenharmony_ci		rt5677_sto2_adc_r_mix, ARRAY_SIZE(rt5677_sto2_adc_r_mix)),
294162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("Sto3 ADC MIXL", SND_SOC_NOPM, 0, 0,
294262306a36Sopenharmony_ci		rt5677_sto3_adc_l_mix, ARRAY_SIZE(rt5677_sto3_adc_l_mix)),
294362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("Sto3 ADC MIXR", SND_SOC_NOPM, 0, 0,
294462306a36Sopenharmony_ci		rt5677_sto3_adc_r_mix, ARRAY_SIZE(rt5677_sto3_adc_r_mix)),
294562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("Sto4 ADC MIXL", SND_SOC_NOPM, 0, 0,
294662306a36Sopenharmony_ci		rt5677_sto4_adc_l_mix, ARRAY_SIZE(rt5677_sto4_adc_l_mix)),
294762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("Sto4 ADC MIXR", SND_SOC_NOPM, 0, 0,
294862306a36Sopenharmony_ci		rt5677_sto4_adc_r_mix, ARRAY_SIZE(rt5677_sto4_adc_r_mix)),
294962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("adc mono left filter", RT5677_PWR_DIG2,
295062306a36Sopenharmony_ci		RT5677_PWR_ADC_MF_L_BIT, 0, NULL, 0),
295162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("Mono ADC MIXL", SND_SOC_NOPM, 0, 0,
295262306a36Sopenharmony_ci		rt5677_mono_adc_l_mix, ARRAY_SIZE(rt5677_mono_adc_l_mix)),
295362306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("adc mono right filter", RT5677_PWR_DIG2,
295462306a36Sopenharmony_ci		RT5677_PWR_ADC_MF_R_BIT, 0, NULL, 0),
295562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("Mono ADC MIXR", SND_SOC_NOPM, 0, 0,
295662306a36Sopenharmony_ci		rt5677_mono_adc_r_mix, ARRAY_SIZE(rt5677_mono_adc_r_mix)),
295762306a36Sopenharmony_ci
295862306a36Sopenharmony_ci	/* ADC PGA */
295962306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("Stereo1 ADC MIXL", SND_SOC_NOPM, 0, 0, NULL, 0),
296062306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("Stereo1 ADC MIXR", SND_SOC_NOPM, 0, 0, NULL, 0),
296162306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("Stereo1 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
296262306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("Stereo2 ADC MIXL", SND_SOC_NOPM, 0, 0, NULL, 0),
296362306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("Stereo2 ADC MIXR", SND_SOC_NOPM, 0, 0, NULL, 0),
296462306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("Stereo2 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
296562306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("Stereo3 ADC MIXL", SND_SOC_NOPM, 0, 0, NULL, 0),
296662306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("Stereo3 ADC MIXR", SND_SOC_NOPM, 0, 0, NULL, 0),
296762306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("Stereo3 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
296862306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("Stereo4 ADC MIXL", SND_SOC_NOPM, 0, 0, NULL, 0),
296962306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("Stereo4 ADC MIXR", SND_SOC_NOPM, 0, 0, NULL, 0),
297062306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("Stereo4 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
297162306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("Sto2 ADC LR MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
297262306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("Mono ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
297362306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF1 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
297462306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF2 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
297562306a36Sopenharmony_ci
297662306a36Sopenharmony_ci	/* DSP */
297762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IB9 Mux", SND_SOC_NOPM, 0, 0,
297862306a36Sopenharmony_ci			&rt5677_ib9_src_mux),
297962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IB8 Mux", SND_SOC_NOPM, 0, 0,
298062306a36Sopenharmony_ci			&rt5677_ib8_src_mux),
298162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IB7 Mux", SND_SOC_NOPM, 0, 0,
298262306a36Sopenharmony_ci			&rt5677_ib7_src_mux),
298362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IB6 Mux", SND_SOC_NOPM, 0, 0,
298462306a36Sopenharmony_ci			&rt5677_ib6_src_mux),
298562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IB45 Mux", SND_SOC_NOPM, 0, 0,
298662306a36Sopenharmony_ci			&rt5677_ib45_src_mux),
298762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IB23 Mux", SND_SOC_NOPM, 0, 0,
298862306a36Sopenharmony_ci			&rt5677_ib23_src_mux),
298962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IB01 Mux", SND_SOC_NOPM, 0, 0,
299062306a36Sopenharmony_ci			&rt5677_ib01_src_mux),
299162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IB45 Bypass Mux", SND_SOC_NOPM, 0, 0,
299262306a36Sopenharmony_ci			&rt5677_ib45_bypass_src_mux),
299362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IB23 Bypass Mux", SND_SOC_NOPM, 0, 0,
299462306a36Sopenharmony_ci			&rt5677_ib23_bypass_src_mux),
299562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IB01 Bypass Mux", SND_SOC_NOPM, 0, 0,
299662306a36Sopenharmony_ci			&rt5677_ib01_bypass_src_mux),
299762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("OB23 Bypass Mux", SND_SOC_NOPM, 0, 0,
299862306a36Sopenharmony_ci			&rt5677_ob23_bypass_src_mux),
299962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("OB01 Bypass Mux", SND_SOC_NOPM, 0, 0,
300062306a36Sopenharmony_ci			&rt5677_ob01_bypass_src_mux),
300162306a36Sopenharmony_ci
300262306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("OB45", SND_SOC_NOPM, 0, 0, NULL, 0),
300362306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("OB67", SND_SOC_NOPM, 0, 0, NULL, 0),
300462306a36Sopenharmony_ci
300562306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("OutBound2", SND_SOC_NOPM, 0, 0, NULL, 0),
300662306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("OutBound3", SND_SOC_NOPM, 0, 0, NULL, 0),
300762306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("OutBound4", SND_SOC_NOPM, 0, 0, NULL, 0),
300862306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("OutBound5", SND_SOC_NOPM, 0, 0, NULL, 0),
300962306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("OutBound6", SND_SOC_NOPM, 0, 0, NULL, 0),
301062306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("OutBound7", SND_SOC_NOPM, 0, 0, NULL, 0),
301162306a36Sopenharmony_ci
301262306a36Sopenharmony_ci	/* Digital Interface */
301362306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("I2S1", RT5677_PWR_DIG1,
301462306a36Sopenharmony_ci		RT5677_PWR_I2S1_BIT, 0, NULL, 0),
301562306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF1 DAC0", SND_SOC_NOPM, 0, 0, NULL, 0),
301662306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF1 DAC1", SND_SOC_NOPM, 0, 0, NULL, 0),
301762306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF1 DAC2", SND_SOC_NOPM, 0, 0, NULL, 0),
301862306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF1 DAC3", SND_SOC_NOPM, 0, 0, NULL, 0),
301962306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF1 DAC4", SND_SOC_NOPM, 0, 0, NULL, 0),
302062306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF1 DAC5", SND_SOC_NOPM, 0, 0, NULL, 0),
302162306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF1 DAC6", SND_SOC_NOPM, 0, 0, NULL, 0),
302262306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF1 DAC7", SND_SOC_NOPM, 0, 0, NULL, 0),
302362306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF1 DAC01", SND_SOC_NOPM, 0, 0, NULL, 0),
302462306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF1 DAC23", SND_SOC_NOPM, 0, 0, NULL, 0),
302562306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF1 DAC45", SND_SOC_NOPM, 0, 0, NULL, 0),
302662306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF1 DAC67", SND_SOC_NOPM, 0, 0, NULL, 0),
302762306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF1 ADC1", SND_SOC_NOPM, 0, 0, NULL, 0),
302862306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF1 ADC2", SND_SOC_NOPM, 0, 0, NULL, 0),
302962306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF1 ADC3", SND_SOC_NOPM, 0, 0, NULL, 0),
303062306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF1 ADC4", SND_SOC_NOPM, 0, 0, NULL, 0),
303162306a36Sopenharmony_ci
303262306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("I2S2", RT5677_PWR_DIG1,
303362306a36Sopenharmony_ci		RT5677_PWR_I2S2_BIT, 0, NULL, 0),
303462306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF2 DAC0", SND_SOC_NOPM, 0, 0, NULL, 0),
303562306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF2 DAC1", SND_SOC_NOPM, 0, 0, NULL, 0),
303662306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF2 DAC2", SND_SOC_NOPM, 0, 0, NULL, 0),
303762306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF2 DAC3", SND_SOC_NOPM, 0, 0, NULL, 0),
303862306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF2 DAC4", SND_SOC_NOPM, 0, 0, NULL, 0),
303962306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF2 DAC5", SND_SOC_NOPM, 0, 0, NULL, 0),
304062306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF2 DAC6", SND_SOC_NOPM, 0, 0, NULL, 0),
304162306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF2 DAC7", SND_SOC_NOPM, 0, 0, NULL, 0),
304262306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF2 DAC01", SND_SOC_NOPM, 0, 0, NULL, 0),
304362306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF2 DAC23", SND_SOC_NOPM, 0, 0, NULL, 0),
304462306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF2 DAC45", SND_SOC_NOPM, 0, 0, NULL, 0),
304562306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF2 DAC67", SND_SOC_NOPM, 0, 0, NULL, 0),
304662306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF2 ADC1", SND_SOC_NOPM, 0, 0, NULL, 0),
304762306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF2 ADC2", SND_SOC_NOPM, 0, 0, NULL, 0),
304862306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF2 ADC3", SND_SOC_NOPM, 0, 0, NULL, 0),
304962306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF2 ADC4", SND_SOC_NOPM, 0, 0, NULL, 0),
305062306a36Sopenharmony_ci
305162306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("I2S3", RT5677_PWR_DIG1,
305262306a36Sopenharmony_ci		RT5677_PWR_I2S3_BIT, 0, NULL, 0),
305362306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF3 DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
305462306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF3 DAC L", SND_SOC_NOPM, 0, 0, NULL, 0),
305562306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF3 DAC R", SND_SOC_NOPM, 0, 0, NULL, 0),
305662306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF3 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
305762306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF3 ADC L", SND_SOC_NOPM, 0, 0, NULL, 0),
305862306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF3 ADC R", SND_SOC_NOPM, 0, 0, NULL, 0),
305962306a36Sopenharmony_ci
306062306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("I2S4", RT5677_PWR_DIG1,
306162306a36Sopenharmony_ci		RT5677_PWR_I2S4_BIT, 0, NULL, 0),
306262306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF4 DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
306362306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF4 DAC L", SND_SOC_NOPM, 0, 0, NULL, 0),
306462306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF4 DAC R", SND_SOC_NOPM, 0, 0, NULL, 0),
306562306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF4 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
306662306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF4 ADC L", SND_SOC_NOPM, 0, 0, NULL, 0),
306762306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("IF4 ADC R", SND_SOC_NOPM, 0, 0, NULL, 0),
306862306a36Sopenharmony_ci
306962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("SLB", RT5677_PWR_DIG1,
307062306a36Sopenharmony_ci		RT5677_PWR_SLB_BIT, 0, NULL, 0),
307162306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("SLB DAC0", SND_SOC_NOPM, 0, 0, NULL, 0),
307262306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("SLB DAC1", SND_SOC_NOPM, 0, 0, NULL, 0),
307362306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("SLB DAC2", SND_SOC_NOPM, 0, 0, NULL, 0),
307462306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("SLB DAC3", SND_SOC_NOPM, 0, 0, NULL, 0),
307562306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("SLB DAC4", SND_SOC_NOPM, 0, 0, NULL, 0),
307662306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("SLB DAC5", SND_SOC_NOPM, 0, 0, NULL, 0),
307762306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("SLB DAC6", SND_SOC_NOPM, 0, 0, NULL, 0),
307862306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("SLB DAC7", SND_SOC_NOPM, 0, 0, NULL, 0),
307962306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("SLB DAC01", SND_SOC_NOPM, 0, 0, NULL, 0),
308062306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("SLB DAC23", SND_SOC_NOPM, 0, 0, NULL, 0),
308162306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("SLB DAC45", SND_SOC_NOPM, 0, 0, NULL, 0),
308262306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("SLB DAC67", SND_SOC_NOPM, 0, 0, NULL, 0),
308362306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("SLB ADC1", SND_SOC_NOPM, 0, 0, NULL, 0),
308462306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("SLB ADC2", SND_SOC_NOPM, 0, 0, NULL, 0),
308562306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("SLB ADC3", SND_SOC_NOPM, 0, 0, NULL, 0),
308662306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("SLB ADC4", SND_SOC_NOPM, 0, 0, NULL, 0),
308762306a36Sopenharmony_ci
308862306a36Sopenharmony_ci	/* Digital Interface Select */
308962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1 ADC1 Mux", SND_SOC_NOPM, 0, 0,
309062306a36Sopenharmony_ci			&rt5677_if1_adc1_mux),
309162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1 ADC2 Mux", SND_SOC_NOPM, 0, 0,
309262306a36Sopenharmony_ci			&rt5677_if1_adc2_mux),
309362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1 ADC3 Mux", SND_SOC_NOPM, 0, 0,
309462306a36Sopenharmony_ci			&rt5677_if1_adc3_mux),
309562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1 ADC4 Mux", SND_SOC_NOPM, 0, 0,
309662306a36Sopenharmony_ci			&rt5677_if1_adc4_mux),
309762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1 ADC1 Swap Mux", SND_SOC_NOPM, 0, 0,
309862306a36Sopenharmony_ci			&rt5677_if1_adc1_swap_mux),
309962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1 ADC2 Swap Mux", SND_SOC_NOPM, 0, 0,
310062306a36Sopenharmony_ci			&rt5677_if1_adc2_swap_mux),
310162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1 ADC3 Swap Mux", SND_SOC_NOPM, 0, 0,
310262306a36Sopenharmony_ci			&rt5677_if1_adc3_swap_mux),
310362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1 ADC4 Swap Mux", SND_SOC_NOPM, 0, 0,
310462306a36Sopenharmony_ci			&rt5677_if1_adc4_swap_mux),
310562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("IF1 ADC TDM Swap Mux", SND_SOC_NOPM, 0, 0,
310662306a36Sopenharmony_ci			&rt5677_if1_adc_tdm_swap_mux, rt5677_if1_adc_tdm_event,
310762306a36Sopenharmony_ci			SND_SOC_DAPM_PRE_PMU),
310862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF2 ADC1 Mux", SND_SOC_NOPM, 0, 0,
310962306a36Sopenharmony_ci			&rt5677_if2_adc1_mux),
311062306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF2 ADC2 Mux", SND_SOC_NOPM, 0, 0,
311162306a36Sopenharmony_ci			&rt5677_if2_adc2_mux),
311262306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF2 ADC3 Mux", SND_SOC_NOPM, 0, 0,
311362306a36Sopenharmony_ci			&rt5677_if2_adc3_mux),
311462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF2 ADC4 Mux", SND_SOC_NOPM, 0, 0,
311562306a36Sopenharmony_ci			&rt5677_if2_adc4_mux),
311662306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF2 ADC1 Swap Mux", SND_SOC_NOPM, 0, 0,
311762306a36Sopenharmony_ci			&rt5677_if2_adc1_swap_mux),
311862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF2 ADC2 Swap Mux", SND_SOC_NOPM, 0, 0,
311962306a36Sopenharmony_ci			&rt5677_if2_adc2_swap_mux),
312062306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF2 ADC3 Swap Mux", SND_SOC_NOPM, 0, 0,
312162306a36Sopenharmony_ci			&rt5677_if2_adc3_swap_mux),
312262306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF2 ADC4 Swap Mux", SND_SOC_NOPM, 0, 0,
312362306a36Sopenharmony_ci			&rt5677_if2_adc4_swap_mux),
312462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("IF2 ADC TDM Swap Mux", SND_SOC_NOPM, 0, 0,
312562306a36Sopenharmony_ci			&rt5677_if2_adc_tdm_swap_mux, rt5677_if2_adc_tdm_event,
312662306a36Sopenharmony_ci			SND_SOC_DAPM_PRE_PMU),
312762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF3 ADC Mux", SND_SOC_NOPM, 0, 0,
312862306a36Sopenharmony_ci			&rt5677_if3_adc_mux),
312962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF4 ADC Mux", SND_SOC_NOPM, 0, 0,
313062306a36Sopenharmony_ci			&rt5677_if4_adc_mux),
313162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("SLB ADC1 Mux", SND_SOC_NOPM, 0, 0,
313262306a36Sopenharmony_ci			&rt5677_slb_adc1_mux),
313362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("SLB ADC2 Mux", SND_SOC_NOPM, 0, 0,
313462306a36Sopenharmony_ci			&rt5677_slb_adc2_mux),
313562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("SLB ADC3 Mux", SND_SOC_NOPM, 0, 0,
313662306a36Sopenharmony_ci			&rt5677_slb_adc3_mux),
313762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("SLB ADC4 Mux", SND_SOC_NOPM, 0, 0,
313862306a36Sopenharmony_ci			&rt5677_slb_adc4_mux),
313962306a36Sopenharmony_ci
314062306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1 DAC0 Mux", SND_SOC_NOPM, 0, 0,
314162306a36Sopenharmony_ci			&rt5677_if1_dac0_tdm_sel_mux),
314262306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1 DAC1 Mux", SND_SOC_NOPM, 0, 0,
314362306a36Sopenharmony_ci			&rt5677_if1_dac1_tdm_sel_mux),
314462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1 DAC2 Mux", SND_SOC_NOPM, 0, 0,
314562306a36Sopenharmony_ci			&rt5677_if1_dac2_tdm_sel_mux),
314662306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1 DAC3 Mux", SND_SOC_NOPM, 0, 0,
314762306a36Sopenharmony_ci			&rt5677_if1_dac3_tdm_sel_mux),
314862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1 DAC4 Mux", SND_SOC_NOPM, 0, 0,
314962306a36Sopenharmony_ci			&rt5677_if1_dac4_tdm_sel_mux),
315062306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1 DAC5 Mux", SND_SOC_NOPM, 0, 0,
315162306a36Sopenharmony_ci			&rt5677_if1_dac5_tdm_sel_mux),
315262306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1 DAC6 Mux", SND_SOC_NOPM, 0, 0,
315362306a36Sopenharmony_ci			&rt5677_if1_dac6_tdm_sel_mux),
315462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF1 DAC7 Mux", SND_SOC_NOPM, 0, 0,
315562306a36Sopenharmony_ci			&rt5677_if1_dac7_tdm_sel_mux),
315662306a36Sopenharmony_ci
315762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF2 DAC0 Mux", SND_SOC_NOPM, 0, 0,
315862306a36Sopenharmony_ci			&rt5677_if2_dac0_tdm_sel_mux),
315962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF2 DAC1 Mux", SND_SOC_NOPM, 0, 0,
316062306a36Sopenharmony_ci			&rt5677_if2_dac1_tdm_sel_mux),
316162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF2 DAC2 Mux", SND_SOC_NOPM, 0, 0,
316262306a36Sopenharmony_ci			&rt5677_if2_dac2_tdm_sel_mux),
316362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF2 DAC3 Mux", SND_SOC_NOPM, 0, 0,
316462306a36Sopenharmony_ci			&rt5677_if2_dac3_tdm_sel_mux),
316562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF2 DAC4 Mux", SND_SOC_NOPM, 0, 0,
316662306a36Sopenharmony_ci			&rt5677_if2_dac4_tdm_sel_mux),
316762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF2 DAC5 Mux", SND_SOC_NOPM, 0, 0,
316862306a36Sopenharmony_ci			&rt5677_if2_dac5_tdm_sel_mux),
316962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF2 DAC6 Mux", SND_SOC_NOPM, 0, 0,
317062306a36Sopenharmony_ci			&rt5677_if2_dac6_tdm_sel_mux),
317162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("IF2 DAC7 Mux", SND_SOC_NOPM, 0, 0,
317262306a36Sopenharmony_ci			&rt5677_if2_dac7_tdm_sel_mux),
317362306a36Sopenharmony_ci
317462306a36Sopenharmony_ci	/* Audio Interface */
317562306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0),
317662306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0),
317762306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_IN("AIF2RX", "AIF2 Playback", 0, SND_SOC_NOPM, 0, 0),
317862306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_OUT("AIF2TX", "AIF2 Capture", 0, SND_SOC_NOPM, 0, 0),
317962306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_IN("AIF3RX", "AIF3 Playback", 0, SND_SOC_NOPM, 0, 0),
318062306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_OUT("AIF3TX", "AIF3 Capture", 0, SND_SOC_NOPM, 0, 0),
318162306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_IN("AIF4RX", "AIF4 Playback", 0, SND_SOC_NOPM, 0, 0),
318262306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_OUT("AIF4TX", "AIF4 Capture", 0, SND_SOC_NOPM, 0, 0),
318362306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_IN("SLBRX", "SLIMBus Playback", 0, SND_SOC_NOPM, 0, 0),
318462306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_OUT("SLBTX", "SLIMBus Capture", 0, SND_SOC_NOPM, 0, 0),
318562306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_OUT("DSPTX", "DSP Buffer", 0, SND_SOC_NOPM, 0, 0),
318662306a36Sopenharmony_ci
318762306a36Sopenharmony_ci	/* Sidetone Mux */
318862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Sidetone Mux", SND_SOC_NOPM, 0, 0,
318962306a36Sopenharmony_ci			&rt5677_sidetone_mux),
319062306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("Sidetone Power", RT5677_SIDETONE_CTRL,
319162306a36Sopenharmony_ci		RT5677_ST_EN_SFT, 0, NULL, 0),
319262306a36Sopenharmony_ci
319362306a36Sopenharmony_ci	/* VAD Mux*/
319462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("VAD ADC Mux", SND_SOC_NOPM, 0, 0,
319562306a36Sopenharmony_ci			&rt5677_vad_src_mux),
319662306a36Sopenharmony_ci
319762306a36Sopenharmony_ci	/* Tensilica DSP */
319862306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("Tensilica DSP", SND_SOC_NOPM, 0, 0, NULL, 0),
319962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("OB01 MIX", SND_SOC_NOPM, 0, 0,
320062306a36Sopenharmony_ci		rt5677_ob_01_mix, ARRAY_SIZE(rt5677_ob_01_mix)),
320162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("OB23 MIX", SND_SOC_NOPM, 0, 0,
320262306a36Sopenharmony_ci		rt5677_ob_23_mix, ARRAY_SIZE(rt5677_ob_23_mix)),
320362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("OB4 MIX", SND_SOC_NOPM, 0, 0,
320462306a36Sopenharmony_ci		rt5677_ob_4_mix, ARRAY_SIZE(rt5677_ob_4_mix)),
320562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("OB5 MIX", SND_SOC_NOPM, 0, 0,
320662306a36Sopenharmony_ci		rt5677_ob_5_mix, ARRAY_SIZE(rt5677_ob_5_mix)),
320762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("OB6 MIX", SND_SOC_NOPM, 0, 0,
320862306a36Sopenharmony_ci		rt5677_ob_6_mix, ARRAY_SIZE(rt5677_ob_6_mix)),
320962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("OB7 MIX", SND_SOC_NOPM, 0, 0,
321062306a36Sopenharmony_ci		rt5677_ob_7_mix, ARRAY_SIZE(rt5677_ob_7_mix)),
321162306a36Sopenharmony_ci
321262306a36Sopenharmony_ci	/* Output Side */
321362306a36Sopenharmony_ci	/* DAC mixer before sound effect */
321462306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("DAC1 MIXL", SND_SOC_NOPM, 0, 0,
321562306a36Sopenharmony_ci		rt5677_dac_l_mix, ARRAY_SIZE(rt5677_dac_l_mix)),
321662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("DAC1 MIXR", SND_SOC_NOPM, 0, 0,
321762306a36Sopenharmony_ci		rt5677_dac_r_mix, ARRAY_SIZE(rt5677_dac_r_mix)),
321862306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("DAC1 FS", SND_SOC_NOPM, 0, 0, NULL, 0),
321962306a36Sopenharmony_ci
322062306a36Sopenharmony_ci	/* DAC Mux */
322162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DAC1 Mux", SND_SOC_NOPM, 0, 0,
322262306a36Sopenharmony_ci				&rt5677_dac1_mux),
322362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("ADDA1 Mux", SND_SOC_NOPM, 0, 0,
322462306a36Sopenharmony_ci				&rt5677_adda1_mux),
322562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DAC12 SRC Mux", SND_SOC_NOPM, 0, 0,
322662306a36Sopenharmony_ci				&rt5677_dac12_mux),
322762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DAC3 SRC Mux", SND_SOC_NOPM, 0, 0,
322862306a36Sopenharmony_ci				&rt5677_dac3_mux),
322962306a36Sopenharmony_ci
323062306a36Sopenharmony_ci	/* DAC2 channel Mux */
323162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DAC2 L Mux", SND_SOC_NOPM, 0, 0,
323262306a36Sopenharmony_ci				&rt5677_dac2_l_mux),
323362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DAC2 R Mux", SND_SOC_NOPM, 0, 0,
323462306a36Sopenharmony_ci				&rt5677_dac2_r_mux),
323562306a36Sopenharmony_ci
323662306a36Sopenharmony_ci	/* DAC3 channel Mux */
323762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DAC3 L Mux", SND_SOC_NOPM, 0, 0,
323862306a36Sopenharmony_ci			&rt5677_dac3_l_mux),
323962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DAC3 R Mux", SND_SOC_NOPM, 0, 0,
324062306a36Sopenharmony_ci			&rt5677_dac3_r_mux),
324162306a36Sopenharmony_ci
324262306a36Sopenharmony_ci	/* DAC4 channel Mux */
324362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DAC4 L Mux", SND_SOC_NOPM, 0, 0,
324462306a36Sopenharmony_ci			&rt5677_dac4_l_mux),
324562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DAC4 R Mux", SND_SOC_NOPM, 0, 0,
324662306a36Sopenharmony_ci			&rt5677_dac4_r_mux),
324762306a36Sopenharmony_ci
324862306a36Sopenharmony_ci	/* DAC Mixer */
324962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("dac stereo1 filter", RT5677_PWR_DIG2,
325062306a36Sopenharmony_ci		RT5677_PWR_DAC_S1F_BIT, 0, rt5677_filter_power_event,
325162306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMU),
325262306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("dac mono2 left filter", RT5677_PWR_DIG2,
325362306a36Sopenharmony_ci		RT5677_PWR_DAC_M2F_L_BIT, 0, rt5677_filter_power_event,
325462306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMU),
325562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("dac mono2 right filter", RT5677_PWR_DIG2,
325662306a36Sopenharmony_ci		RT5677_PWR_DAC_M2F_R_BIT, 0, rt5677_filter_power_event,
325762306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMU),
325862306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("dac mono3 left filter", RT5677_PWR_DIG2,
325962306a36Sopenharmony_ci		RT5677_PWR_DAC_M3F_L_BIT, 0, rt5677_filter_power_event,
326062306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMU),
326162306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("dac mono3 right filter", RT5677_PWR_DIG2,
326262306a36Sopenharmony_ci		RT5677_PWR_DAC_M3F_R_BIT, 0, rt5677_filter_power_event,
326362306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMU),
326462306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("dac mono4 left filter", RT5677_PWR_DIG2,
326562306a36Sopenharmony_ci		RT5677_PWR_DAC_M4F_L_BIT, 0, rt5677_filter_power_event,
326662306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMU),
326762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("dac mono4 right filter", RT5677_PWR_DIG2,
326862306a36Sopenharmony_ci		RT5677_PWR_DAC_M4F_R_BIT, 0, rt5677_filter_power_event,
326962306a36Sopenharmony_ci		SND_SOC_DAPM_POST_PMU),
327062306a36Sopenharmony_ci
327162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("Stereo DAC MIXL", SND_SOC_NOPM, 0, 0,
327262306a36Sopenharmony_ci		rt5677_sto1_dac_l_mix, ARRAY_SIZE(rt5677_sto1_dac_l_mix)),
327362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("Stereo DAC MIXR", SND_SOC_NOPM, 0, 0,
327462306a36Sopenharmony_ci		rt5677_sto1_dac_r_mix, ARRAY_SIZE(rt5677_sto1_dac_r_mix)),
327562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("Mono DAC MIXL", SND_SOC_NOPM, 0, 0,
327662306a36Sopenharmony_ci		rt5677_mono_dac_l_mix, ARRAY_SIZE(rt5677_mono_dac_l_mix)),
327762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("Mono DAC MIXR", SND_SOC_NOPM, 0, 0,
327862306a36Sopenharmony_ci		rt5677_mono_dac_r_mix, ARRAY_SIZE(rt5677_mono_dac_r_mix)),
327962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("DD1 MIXL", SND_SOC_NOPM, 0, 0,
328062306a36Sopenharmony_ci		rt5677_dd1_l_mix, ARRAY_SIZE(rt5677_dd1_l_mix)),
328162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("DD1 MIXR", SND_SOC_NOPM, 0, 0,
328262306a36Sopenharmony_ci		rt5677_dd1_r_mix, ARRAY_SIZE(rt5677_dd1_r_mix)),
328362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("DD2 MIXL", SND_SOC_NOPM, 0, 0,
328462306a36Sopenharmony_ci		rt5677_dd2_l_mix, ARRAY_SIZE(rt5677_dd2_l_mix)),
328562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("DD2 MIXR", SND_SOC_NOPM, 0, 0,
328662306a36Sopenharmony_ci		rt5677_dd2_r_mix, ARRAY_SIZE(rt5677_dd2_r_mix)),
328762306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("Stereo DAC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
328862306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("Mono DAC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
328962306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("DD1 MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
329062306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("DD2 MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
329162306a36Sopenharmony_ci
329262306a36Sopenharmony_ci	/* DACs */
329362306a36Sopenharmony_ci	SND_SOC_DAPM_DAC("DAC 1", NULL, RT5677_PWR_DIG1,
329462306a36Sopenharmony_ci		RT5677_PWR_DAC1_BIT, 0),
329562306a36Sopenharmony_ci	SND_SOC_DAPM_DAC("DAC 2", NULL, RT5677_PWR_DIG1,
329662306a36Sopenharmony_ci		RT5677_PWR_DAC2_BIT, 0),
329762306a36Sopenharmony_ci	SND_SOC_DAPM_DAC("DAC 3", NULL, RT5677_PWR_DIG1,
329862306a36Sopenharmony_ci		RT5677_PWR_DAC3_BIT, 0),
329962306a36Sopenharmony_ci
330062306a36Sopenharmony_ci	/* PDM */
330162306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("PDM1 Power", RT5677_PWR_DIG2,
330262306a36Sopenharmony_ci		RT5677_PWR_PDM1_BIT, 0, NULL, 0),
330362306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("PDM2 Power", RT5677_PWR_DIG2,
330462306a36Sopenharmony_ci		RT5677_PWR_PDM2_BIT, 0, NULL, 0),
330562306a36Sopenharmony_ci
330662306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("PDM1 L Mux", RT5677_PDM_OUT_CTRL, RT5677_M_PDM1_L_SFT,
330762306a36Sopenharmony_ci		1, &rt5677_pdm1_l_mux),
330862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("PDM1 R Mux", RT5677_PDM_OUT_CTRL, RT5677_M_PDM1_R_SFT,
330962306a36Sopenharmony_ci		1, &rt5677_pdm1_r_mux),
331062306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("PDM2 L Mux", RT5677_PDM_OUT_CTRL, RT5677_M_PDM2_L_SFT,
331162306a36Sopenharmony_ci		1, &rt5677_pdm2_l_mux),
331262306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("PDM2 R Mux", RT5677_PDM_OUT_CTRL, RT5677_M_PDM2_R_SFT,
331362306a36Sopenharmony_ci		1, &rt5677_pdm2_r_mux),
331462306a36Sopenharmony_ci
331562306a36Sopenharmony_ci	SND_SOC_DAPM_PGA_S("LOUT1 amp", 0, RT5677_PWR_ANLG1, RT5677_PWR_LO1_BIT,
331662306a36Sopenharmony_ci		0, NULL, 0),
331762306a36Sopenharmony_ci	SND_SOC_DAPM_PGA_S("LOUT2 amp", 0, RT5677_PWR_ANLG1, RT5677_PWR_LO2_BIT,
331862306a36Sopenharmony_ci		0, NULL, 0),
331962306a36Sopenharmony_ci	SND_SOC_DAPM_PGA_S("LOUT3 amp", 0, RT5677_PWR_ANLG1, RT5677_PWR_LO3_BIT,
332062306a36Sopenharmony_ci		0, NULL, 0),
332162306a36Sopenharmony_ci
332262306a36Sopenharmony_ci	SND_SOC_DAPM_PGA_S("LOUT1 vref", 1, SND_SOC_NOPM, 0, 0,
332362306a36Sopenharmony_ci		rt5677_vref_event, SND_SOC_DAPM_POST_PMU),
332462306a36Sopenharmony_ci	SND_SOC_DAPM_PGA_S("LOUT2 vref", 1, SND_SOC_NOPM, 0, 0,
332562306a36Sopenharmony_ci		rt5677_vref_event, SND_SOC_DAPM_POST_PMU),
332662306a36Sopenharmony_ci	SND_SOC_DAPM_PGA_S("LOUT3 vref", 1, SND_SOC_NOPM, 0, 0,
332762306a36Sopenharmony_ci		rt5677_vref_event, SND_SOC_DAPM_POST_PMU),
332862306a36Sopenharmony_ci
332962306a36Sopenharmony_ci	/* Output Lines */
333062306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("LOUT1"),
333162306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("LOUT2"),
333262306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("LOUT3"),
333362306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("PDM1L"),
333462306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("PDM1R"),
333562306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("PDM2L"),
333662306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("PDM2R"),
333762306a36Sopenharmony_ci
333862306a36Sopenharmony_ci	SND_SOC_DAPM_POST("vref", rt5677_vref_event),
333962306a36Sopenharmony_ci};
334062306a36Sopenharmony_ci
334162306a36Sopenharmony_cistatic const struct snd_soc_dapm_route rt5677_dapm_routes[] = {
334262306a36Sopenharmony_ci	{ "Stereo1 DMIC Mux", NULL, "DMIC STO1 ASRC", rt5677_dmic_use_asrc },
334362306a36Sopenharmony_ci	{ "Stereo2 DMIC Mux", NULL, "DMIC STO2 ASRC", rt5677_dmic_use_asrc },
334462306a36Sopenharmony_ci	{ "Stereo3 DMIC Mux", NULL, "DMIC STO3 ASRC", rt5677_dmic_use_asrc },
334562306a36Sopenharmony_ci	{ "Stereo4 DMIC Mux", NULL, "DMIC STO4 ASRC", rt5677_dmic_use_asrc },
334662306a36Sopenharmony_ci	{ "Mono DMIC L Mux", NULL, "DMIC MONO L ASRC", rt5677_dmic_use_asrc },
334762306a36Sopenharmony_ci	{ "Mono DMIC R Mux", NULL, "DMIC MONO R ASRC", rt5677_dmic_use_asrc },
334862306a36Sopenharmony_ci	{ "I2S1", NULL, "I2S1 ASRC", can_use_asrc},
334962306a36Sopenharmony_ci	{ "I2S2", NULL, "I2S2 ASRC", can_use_asrc},
335062306a36Sopenharmony_ci	{ "I2S3", NULL, "I2S3 ASRC", can_use_asrc},
335162306a36Sopenharmony_ci	{ "I2S4", NULL, "I2S4 ASRC", can_use_asrc},
335262306a36Sopenharmony_ci
335362306a36Sopenharmony_ci	{ "dac stereo1 filter", NULL, "DAC STO ASRC", is_using_asrc },
335462306a36Sopenharmony_ci	{ "dac mono2 left filter", NULL, "DAC MONO2 L ASRC", is_using_asrc },
335562306a36Sopenharmony_ci	{ "dac mono2 right filter", NULL, "DAC MONO2 R ASRC", is_using_asrc },
335662306a36Sopenharmony_ci	{ "dac mono3 left filter", NULL, "DAC MONO3 L ASRC", is_using_asrc },
335762306a36Sopenharmony_ci	{ "dac mono3 right filter", NULL, "DAC MONO3 R ASRC", is_using_asrc },
335862306a36Sopenharmony_ci	{ "dac mono4 left filter", NULL, "DAC MONO4 L ASRC", is_using_asrc },
335962306a36Sopenharmony_ci	{ "dac mono4 right filter", NULL, "DAC MONO4 R ASRC", is_using_asrc },
336062306a36Sopenharmony_ci	{ "adc stereo1 filter", NULL, "ADC STO1 ASRC", is_using_asrc },
336162306a36Sopenharmony_ci	{ "adc stereo2 filter", NULL, "ADC STO2 ASRC", is_using_asrc },
336262306a36Sopenharmony_ci	{ "adc stereo3 filter", NULL, "ADC STO3 ASRC", is_using_asrc },
336362306a36Sopenharmony_ci	{ "adc stereo4 filter", NULL, "ADC STO4 ASRC", is_using_asrc },
336462306a36Sopenharmony_ci	{ "adc mono left filter", NULL, "ADC MONO L ASRC", is_using_asrc },
336562306a36Sopenharmony_ci	{ "adc mono right filter", NULL, "ADC MONO R ASRC", is_using_asrc },
336662306a36Sopenharmony_ci
336762306a36Sopenharmony_ci	{ "DMIC1", NULL, "DMIC L1" },
336862306a36Sopenharmony_ci	{ "DMIC1", NULL, "DMIC R1" },
336962306a36Sopenharmony_ci	{ "DMIC2", NULL, "DMIC L2" },
337062306a36Sopenharmony_ci	{ "DMIC2", NULL, "DMIC R2" },
337162306a36Sopenharmony_ci	{ "DMIC3", NULL, "DMIC L3" },
337262306a36Sopenharmony_ci	{ "DMIC3", NULL, "DMIC R3" },
337362306a36Sopenharmony_ci	{ "DMIC4", NULL, "DMIC L4" },
337462306a36Sopenharmony_ci	{ "DMIC4", NULL, "DMIC R4" },
337562306a36Sopenharmony_ci
337662306a36Sopenharmony_ci	{ "DMIC L1", NULL, "DMIC CLK" },
337762306a36Sopenharmony_ci	{ "DMIC R1", NULL, "DMIC CLK" },
337862306a36Sopenharmony_ci	{ "DMIC L2", NULL, "DMIC CLK" },
337962306a36Sopenharmony_ci	{ "DMIC R2", NULL, "DMIC CLK" },
338062306a36Sopenharmony_ci	{ "DMIC L3", NULL, "DMIC CLK" },
338162306a36Sopenharmony_ci	{ "DMIC R3", NULL, "DMIC CLK" },
338262306a36Sopenharmony_ci	{ "DMIC L4", NULL, "DMIC CLK" },
338362306a36Sopenharmony_ci	{ "DMIC R4", NULL, "DMIC CLK" },
338462306a36Sopenharmony_ci
338562306a36Sopenharmony_ci	{ "DMIC L1", NULL, "DMIC1 power" },
338662306a36Sopenharmony_ci	{ "DMIC R1", NULL, "DMIC1 power" },
338762306a36Sopenharmony_ci	{ "DMIC L3", NULL, "DMIC3 power" },
338862306a36Sopenharmony_ci	{ "DMIC R3", NULL, "DMIC3 power" },
338962306a36Sopenharmony_ci	{ "DMIC L4", NULL, "DMIC4 power" },
339062306a36Sopenharmony_ci	{ "DMIC R4", NULL, "DMIC4 power" },
339162306a36Sopenharmony_ci
339262306a36Sopenharmony_ci	{ "BST1", NULL, "IN1P" },
339362306a36Sopenharmony_ci	{ "BST1", NULL, "IN1N" },
339462306a36Sopenharmony_ci	{ "BST2", NULL, "IN2P" },
339562306a36Sopenharmony_ci	{ "BST2", NULL, "IN2N" },
339662306a36Sopenharmony_ci
339762306a36Sopenharmony_ci	{ "IN1P", NULL, "MICBIAS1" },
339862306a36Sopenharmony_ci	{ "IN1N", NULL, "MICBIAS1" },
339962306a36Sopenharmony_ci	{ "IN2P", NULL, "MICBIAS1" },
340062306a36Sopenharmony_ci	{ "IN2N", NULL, "MICBIAS1" },
340162306a36Sopenharmony_ci
340262306a36Sopenharmony_ci	{ "ADC 1", NULL, "BST1" },
340362306a36Sopenharmony_ci	{ "ADC 1", NULL, "ADC 1 power" },
340462306a36Sopenharmony_ci	{ "ADC 1", NULL, "ADC1 clock" },
340562306a36Sopenharmony_ci	{ "ADC 2", NULL, "BST2" },
340662306a36Sopenharmony_ci	{ "ADC 2", NULL, "ADC 2 power" },
340762306a36Sopenharmony_ci	{ "ADC 2", NULL, "ADC2 clock" },
340862306a36Sopenharmony_ci
340962306a36Sopenharmony_ci	{ "Stereo1 DMIC Mux", "DMIC1", "DMIC1" },
341062306a36Sopenharmony_ci	{ "Stereo1 DMIC Mux", "DMIC2", "DMIC2" },
341162306a36Sopenharmony_ci	{ "Stereo1 DMIC Mux", "DMIC3", "DMIC3" },
341262306a36Sopenharmony_ci	{ "Stereo1 DMIC Mux", "DMIC4", "DMIC4" },
341362306a36Sopenharmony_ci
341462306a36Sopenharmony_ci	{ "Stereo2 DMIC Mux", "DMIC1", "DMIC1" },
341562306a36Sopenharmony_ci	{ "Stereo2 DMIC Mux", "DMIC2", "DMIC2" },
341662306a36Sopenharmony_ci	{ "Stereo2 DMIC Mux", "DMIC3", "DMIC3" },
341762306a36Sopenharmony_ci	{ "Stereo2 DMIC Mux", "DMIC4", "DMIC4" },
341862306a36Sopenharmony_ci
341962306a36Sopenharmony_ci	{ "Stereo3 DMIC Mux", "DMIC1", "DMIC1" },
342062306a36Sopenharmony_ci	{ "Stereo3 DMIC Mux", "DMIC2", "DMIC2" },
342162306a36Sopenharmony_ci	{ "Stereo3 DMIC Mux", "DMIC3", "DMIC3" },
342262306a36Sopenharmony_ci	{ "Stereo3 DMIC Mux", "DMIC4", "DMIC4" },
342362306a36Sopenharmony_ci
342462306a36Sopenharmony_ci	{ "Stereo4 DMIC Mux", "DMIC1", "DMIC1" },
342562306a36Sopenharmony_ci	{ "Stereo4 DMIC Mux", "DMIC2", "DMIC2" },
342662306a36Sopenharmony_ci	{ "Stereo4 DMIC Mux", "DMIC3", "DMIC3" },
342762306a36Sopenharmony_ci	{ "Stereo4 DMIC Mux", "DMIC4", "DMIC4" },
342862306a36Sopenharmony_ci
342962306a36Sopenharmony_ci	{ "Mono DMIC L Mux", "DMIC1", "DMIC1" },
343062306a36Sopenharmony_ci	{ "Mono DMIC L Mux", "DMIC2", "DMIC2" },
343162306a36Sopenharmony_ci	{ "Mono DMIC L Mux", "DMIC3", "DMIC3" },
343262306a36Sopenharmony_ci	{ "Mono DMIC L Mux", "DMIC4", "DMIC4" },
343362306a36Sopenharmony_ci
343462306a36Sopenharmony_ci	{ "Mono DMIC R Mux", "DMIC1", "DMIC1" },
343562306a36Sopenharmony_ci	{ "Mono DMIC R Mux", "DMIC2", "DMIC2" },
343662306a36Sopenharmony_ci	{ "Mono DMIC R Mux", "DMIC3", "DMIC3" },
343762306a36Sopenharmony_ci	{ "Mono DMIC R Mux", "DMIC4", "DMIC4" },
343862306a36Sopenharmony_ci
343962306a36Sopenharmony_ci	{ "ADC 1_2", NULL, "ADC 1" },
344062306a36Sopenharmony_ci	{ "ADC 1_2", NULL, "ADC 2" },
344162306a36Sopenharmony_ci
344262306a36Sopenharmony_ci	{ "Stereo1 ADC1 Mux", "DD MIX1", "DD1 MIX" },
344362306a36Sopenharmony_ci	{ "Stereo1 ADC1 Mux", "ADC1/2", "ADC 1_2" },
344462306a36Sopenharmony_ci	{ "Stereo1 ADC1 Mux", "Stereo DAC MIX", "Stereo DAC MIX" },
344562306a36Sopenharmony_ci
344662306a36Sopenharmony_ci	{ "Stereo1 ADC2 Mux", "DD MIX1", "DD1 MIX" },
344762306a36Sopenharmony_ci	{ "Stereo1 ADC2 Mux", "DMIC", "Stereo1 DMIC Mux" },
344862306a36Sopenharmony_ci	{ "Stereo1 ADC2 Mux", "Stereo DAC MIX", "Stereo DAC MIX" },
344962306a36Sopenharmony_ci
345062306a36Sopenharmony_ci	{ "Stereo2 ADC1 Mux", "DD MIX1", "DD1 MIX" },
345162306a36Sopenharmony_ci	{ "Stereo2 ADC1 Mux", "ADC1/2", "ADC 1_2" },
345262306a36Sopenharmony_ci	{ "Stereo2 ADC1 Mux", "Stereo DAC MIX", "Stereo DAC MIX" },
345362306a36Sopenharmony_ci
345462306a36Sopenharmony_ci	{ "Stereo2 ADC2 Mux", "DD MIX1", "DD1 MIX" },
345562306a36Sopenharmony_ci	{ "Stereo2 ADC2 Mux", "DMIC", "Stereo2 DMIC Mux" },
345662306a36Sopenharmony_ci	{ "Stereo2 ADC2 Mux", "Stereo DAC MIX", "Stereo DAC MIX" },
345762306a36Sopenharmony_ci
345862306a36Sopenharmony_ci	{ "Stereo3 ADC1 Mux", "DD MIX1", "DD1 MIX" },
345962306a36Sopenharmony_ci	{ "Stereo3 ADC1 Mux", "ADC1/2", "ADC 1_2" },
346062306a36Sopenharmony_ci	{ "Stereo3 ADC1 Mux", "Stereo DAC MIX", "Stereo DAC MIX" },
346162306a36Sopenharmony_ci
346262306a36Sopenharmony_ci	{ "Stereo3 ADC2 Mux", "DD MIX1", "DD1 MIX" },
346362306a36Sopenharmony_ci	{ "Stereo3 ADC2 Mux", "DMIC", "Stereo3 DMIC Mux" },
346462306a36Sopenharmony_ci	{ "Stereo3 ADC2 Mux", "Stereo DAC MIX", "Stereo DAC MIX" },
346562306a36Sopenharmony_ci
346662306a36Sopenharmony_ci	{ "Stereo4 ADC1 Mux", "DD MIX1", "DD1 MIX" },
346762306a36Sopenharmony_ci	{ "Stereo4 ADC1 Mux", "ADC1/2", "ADC 1_2" },
346862306a36Sopenharmony_ci	{ "Stereo4 ADC1 Mux", "DD MIX2", "DD2 MIX" },
346962306a36Sopenharmony_ci
347062306a36Sopenharmony_ci	{ "Stereo4 ADC2 Mux", "DD MIX1", "DD1 MIX" },
347162306a36Sopenharmony_ci	{ "Stereo4 ADC2 Mux", "DMIC", "Stereo3 DMIC Mux" },
347262306a36Sopenharmony_ci	{ "Stereo4 ADC2 Mux", "DD MIX2", "DD2 MIX" },
347362306a36Sopenharmony_ci
347462306a36Sopenharmony_ci	{ "Mono ADC2 L Mux", "DD MIX1L", "DD1 MIXL" },
347562306a36Sopenharmony_ci	{ "Mono ADC2 L Mux", "DMIC", "Mono DMIC L Mux" },
347662306a36Sopenharmony_ci	{ "Mono ADC2 L Mux", "MONO DAC MIXL", "Mono DAC MIXL" },
347762306a36Sopenharmony_ci
347862306a36Sopenharmony_ci	{ "Mono ADC1 L Mux", "DD MIX1L", "DD1 MIXL" },
347962306a36Sopenharmony_ci	{ "Mono ADC1 L Mux", "ADC1", "ADC 1" },
348062306a36Sopenharmony_ci	{ "Mono ADC1 L Mux", "MONO DAC MIXL", "Mono DAC MIXL" },
348162306a36Sopenharmony_ci
348262306a36Sopenharmony_ci	{ "Mono ADC1 R Mux", "DD MIX1R", "DD1 MIXR" },
348362306a36Sopenharmony_ci	{ "Mono ADC1 R Mux", "ADC2", "ADC 2" },
348462306a36Sopenharmony_ci	{ "Mono ADC1 R Mux", "MONO DAC MIXR", "Mono DAC MIXR" },
348562306a36Sopenharmony_ci
348662306a36Sopenharmony_ci	{ "Mono ADC2 R Mux", "DD MIX1R", "DD1 MIXR" },
348762306a36Sopenharmony_ci	{ "Mono ADC2 R Mux", "DMIC", "Mono DMIC R Mux" },
348862306a36Sopenharmony_ci	{ "Mono ADC2 R Mux", "MONO DAC MIXR", "Mono DAC MIXR" },
348962306a36Sopenharmony_ci
349062306a36Sopenharmony_ci	{ "Sto1 ADC MIXL", "ADC1 Switch", "Stereo1 ADC1 Mux" },
349162306a36Sopenharmony_ci	{ "Sto1 ADC MIXL", "ADC2 Switch", "Stereo1 ADC2 Mux" },
349262306a36Sopenharmony_ci	{ "Sto1 ADC MIXR", "ADC1 Switch", "Stereo1 ADC1 Mux" },
349362306a36Sopenharmony_ci	{ "Sto1 ADC MIXR", "ADC2 Switch", "Stereo1 ADC2 Mux" },
349462306a36Sopenharmony_ci
349562306a36Sopenharmony_ci	{ "Stereo1 ADC MIXL", NULL, "Sto1 ADC MIXL" },
349662306a36Sopenharmony_ci	{ "Stereo1 ADC MIXL", NULL, "adc stereo1 filter" },
349762306a36Sopenharmony_ci	{ "Stereo1 ADC MIXR", NULL, "Sto1 ADC MIXR" },
349862306a36Sopenharmony_ci	{ "Stereo1 ADC MIXR", NULL, "adc stereo1 filter" },
349962306a36Sopenharmony_ci	{ "adc stereo1 filter", NULL, "PLL1", is_sys_clk_from_pll },
350062306a36Sopenharmony_ci
350162306a36Sopenharmony_ci	{ "Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXL" },
350262306a36Sopenharmony_ci	{ "Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXR" },
350362306a36Sopenharmony_ci
350462306a36Sopenharmony_ci	{ "Sto2 ADC MIXL", "ADC1 Switch", "Stereo2 ADC1 Mux" },
350562306a36Sopenharmony_ci	{ "Sto2 ADC MIXL", "ADC2 Switch", "Stereo2 ADC2 Mux" },
350662306a36Sopenharmony_ci	{ "Sto2 ADC MIXR", "ADC1 Switch", "Stereo2 ADC1 Mux" },
350762306a36Sopenharmony_ci	{ "Sto2 ADC MIXR", "ADC2 Switch", "Stereo2 ADC2 Mux" },
350862306a36Sopenharmony_ci
350962306a36Sopenharmony_ci	{ "Sto2 ADC LR MIX", NULL, "Sto2 ADC MIXL" },
351062306a36Sopenharmony_ci	{ "Sto2 ADC LR MIX", NULL, "Sto2 ADC MIXR" },
351162306a36Sopenharmony_ci
351262306a36Sopenharmony_ci	{ "Stereo2 ADC LR Mux", "L", "Sto2 ADC MIXL" },
351362306a36Sopenharmony_ci	{ "Stereo2 ADC LR Mux", "LR", "Sto2 ADC LR MIX" },
351462306a36Sopenharmony_ci
351562306a36Sopenharmony_ci	{ "Stereo2 ADC MIXL", NULL, "Stereo2 ADC LR Mux" },
351662306a36Sopenharmony_ci	{ "Stereo2 ADC MIXL", NULL, "adc stereo2 filter" },
351762306a36Sopenharmony_ci	{ "Stereo2 ADC MIXR", NULL, "Sto2 ADC MIXR" },
351862306a36Sopenharmony_ci	{ "Stereo2 ADC MIXR", NULL, "adc stereo2 filter" },
351962306a36Sopenharmony_ci	{ "adc stereo2 filter", NULL, "PLL1", is_sys_clk_from_pll },
352062306a36Sopenharmony_ci
352162306a36Sopenharmony_ci	{ "Stereo2 ADC MIX", NULL, "Stereo2 ADC MIXL" },
352262306a36Sopenharmony_ci	{ "Stereo2 ADC MIX", NULL, "Stereo2 ADC MIXR" },
352362306a36Sopenharmony_ci
352462306a36Sopenharmony_ci	{ "Sto3 ADC MIXL", "ADC1 Switch", "Stereo3 ADC1 Mux" },
352562306a36Sopenharmony_ci	{ "Sto3 ADC MIXL", "ADC2 Switch", "Stereo3 ADC2 Mux" },
352662306a36Sopenharmony_ci	{ "Sto3 ADC MIXR", "ADC1 Switch", "Stereo3 ADC1 Mux" },
352762306a36Sopenharmony_ci	{ "Sto3 ADC MIXR", "ADC2 Switch", "Stereo3 ADC2 Mux" },
352862306a36Sopenharmony_ci
352962306a36Sopenharmony_ci	{ "Stereo3 ADC MIXL", NULL, "Sto3 ADC MIXL" },
353062306a36Sopenharmony_ci	{ "Stereo3 ADC MIXL", NULL, "adc stereo3 filter" },
353162306a36Sopenharmony_ci	{ "Stereo3 ADC MIXR", NULL, "Sto3 ADC MIXR" },
353262306a36Sopenharmony_ci	{ "Stereo3 ADC MIXR", NULL, "adc stereo3 filter" },
353362306a36Sopenharmony_ci	{ "adc stereo3 filter", NULL, "PLL1", is_sys_clk_from_pll },
353462306a36Sopenharmony_ci
353562306a36Sopenharmony_ci	{ "Stereo3 ADC MIX", NULL, "Stereo3 ADC MIXL" },
353662306a36Sopenharmony_ci	{ "Stereo3 ADC MIX", NULL, "Stereo3 ADC MIXR" },
353762306a36Sopenharmony_ci
353862306a36Sopenharmony_ci	{ "Sto4 ADC MIXL", "ADC1 Switch", "Stereo4 ADC1 Mux" },
353962306a36Sopenharmony_ci	{ "Sto4 ADC MIXL", "ADC2 Switch", "Stereo4 ADC2 Mux" },
354062306a36Sopenharmony_ci	{ "Sto4 ADC MIXR", "ADC1 Switch", "Stereo4 ADC1 Mux" },
354162306a36Sopenharmony_ci	{ "Sto4 ADC MIXR", "ADC2 Switch", "Stereo4 ADC2 Mux" },
354262306a36Sopenharmony_ci
354362306a36Sopenharmony_ci	{ "Stereo4 ADC MIXL", NULL, "Sto4 ADC MIXL" },
354462306a36Sopenharmony_ci	{ "Stereo4 ADC MIXL", NULL, "adc stereo4 filter" },
354562306a36Sopenharmony_ci	{ "Stereo4 ADC MIXR", NULL, "Sto4 ADC MIXR" },
354662306a36Sopenharmony_ci	{ "Stereo4 ADC MIXR", NULL, "adc stereo4 filter" },
354762306a36Sopenharmony_ci	{ "adc stereo4 filter", NULL, "PLL1", is_sys_clk_from_pll },
354862306a36Sopenharmony_ci
354962306a36Sopenharmony_ci	{ "Stereo4 ADC MIX", NULL, "Stereo4 ADC MIXL" },
355062306a36Sopenharmony_ci	{ "Stereo4 ADC MIX", NULL, "Stereo4 ADC MIXR" },
355162306a36Sopenharmony_ci
355262306a36Sopenharmony_ci	{ "Mono ADC MIXL", "ADC1 Switch", "Mono ADC1 L Mux" },
355362306a36Sopenharmony_ci	{ "Mono ADC MIXL", "ADC2 Switch", "Mono ADC2 L Mux" },
355462306a36Sopenharmony_ci	{ "Mono ADC MIXL", NULL, "adc mono left filter" },
355562306a36Sopenharmony_ci	{ "adc mono left filter", NULL, "PLL1", is_sys_clk_from_pll },
355662306a36Sopenharmony_ci
355762306a36Sopenharmony_ci	{ "Mono ADC MIXR", "ADC1 Switch", "Mono ADC1 R Mux" },
355862306a36Sopenharmony_ci	{ "Mono ADC MIXR", "ADC2 Switch", "Mono ADC2 R Mux" },
355962306a36Sopenharmony_ci	{ "Mono ADC MIXR", NULL, "adc mono right filter" },
356062306a36Sopenharmony_ci	{ "adc mono right filter", NULL, "PLL1", is_sys_clk_from_pll },
356162306a36Sopenharmony_ci
356262306a36Sopenharmony_ci	{ "Mono ADC MIX", NULL, "Mono ADC MIXL" },
356362306a36Sopenharmony_ci	{ "Mono ADC MIX", NULL, "Mono ADC MIXR" },
356462306a36Sopenharmony_ci
356562306a36Sopenharmony_ci	{ "VAD ADC Mux", "STO1 ADC MIX L", "Stereo1 ADC MIXL" },
356662306a36Sopenharmony_ci	{ "VAD ADC Mux", "MONO ADC MIX L", "Mono ADC MIXL" },
356762306a36Sopenharmony_ci	{ "VAD ADC Mux", "MONO ADC MIX R", "Mono ADC MIXR" },
356862306a36Sopenharmony_ci	{ "VAD ADC Mux", "STO2 ADC MIX L", "Stereo2 ADC MIXL" },
356962306a36Sopenharmony_ci	{ "VAD ADC Mux", "STO3 ADC MIX L", "Stereo3 ADC MIXL" },
357062306a36Sopenharmony_ci
357162306a36Sopenharmony_ci	{ "IF1 ADC1 Mux", "STO1 ADC MIX", "Stereo1 ADC MIX" },
357262306a36Sopenharmony_ci	{ "IF1 ADC1 Mux", "OB01", "OB01 Bypass Mux" },
357362306a36Sopenharmony_ci	{ "IF1 ADC1 Mux", "VAD ADC", "VAD ADC Mux" },
357462306a36Sopenharmony_ci
357562306a36Sopenharmony_ci	{ "IF1 ADC2 Mux", "STO2 ADC MIX", "Stereo2 ADC MIX" },
357662306a36Sopenharmony_ci	{ "IF1 ADC2 Mux", "OB23", "OB23 Bypass Mux" },
357762306a36Sopenharmony_ci
357862306a36Sopenharmony_ci	{ "IF1 ADC3 Mux", "STO3 ADC MIX", "Stereo3 ADC MIX" },
357962306a36Sopenharmony_ci	{ "IF1 ADC3 Mux", "MONO ADC MIX", "Mono ADC MIX" },
358062306a36Sopenharmony_ci	{ "IF1 ADC3 Mux", "OB45", "OB45" },
358162306a36Sopenharmony_ci
358262306a36Sopenharmony_ci	{ "IF1 ADC4 Mux", "STO4 ADC MIX", "Stereo4 ADC MIX" },
358362306a36Sopenharmony_ci	{ "IF1 ADC4 Mux", "OB67", "OB67" },
358462306a36Sopenharmony_ci	{ "IF1 ADC4 Mux", "OB01", "OB01 Bypass Mux" },
358562306a36Sopenharmony_ci
358662306a36Sopenharmony_ci	{ "IF1 ADC1 Swap Mux", "L/R", "IF1 ADC1 Mux" },
358762306a36Sopenharmony_ci	{ "IF1 ADC1 Swap Mux", "R/L", "IF1 ADC1 Mux" },
358862306a36Sopenharmony_ci	{ "IF1 ADC1 Swap Mux", "L/L", "IF1 ADC1 Mux" },
358962306a36Sopenharmony_ci	{ "IF1 ADC1 Swap Mux", "R/R", "IF1 ADC1 Mux" },
359062306a36Sopenharmony_ci
359162306a36Sopenharmony_ci	{ "IF1 ADC2 Swap Mux", "L/R", "IF1 ADC2 Mux" },
359262306a36Sopenharmony_ci	{ "IF1 ADC2 Swap Mux", "R/L", "IF1 ADC2 Mux" },
359362306a36Sopenharmony_ci	{ "IF1 ADC2 Swap Mux", "L/L", "IF1 ADC2 Mux" },
359462306a36Sopenharmony_ci	{ "IF1 ADC2 Swap Mux", "R/R", "IF1 ADC2 Mux" },
359562306a36Sopenharmony_ci
359662306a36Sopenharmony_ci	{ "IF1 ADC3 Swap Mux", "L/R", "IF1 ADC3 Mux" },
359762306a36Sopenharmony_ci	{ "IF1 ADC3 Swap Mux", "R/L", "IF1 ADC3 Mux" },
359862306a36Sopenharmony_ci	{ "IF1 ADC3 Swap Mux", "L/L", "IF1 ADC3 Mux" },
359962306a36Sopenharmony_ci	{ "IF1 ADC3 Swap Mux", "R/R", "IF1 ADC3 Mux" },
360062306a36Sopenharmony_ci
360162306a36Sopenharmony_ci	{ "IF1 ADC4 Swap Mux", "L/R", "IF1 ADC4 Mux" },
360262306a36Sopenharmony_ci	{ "IF1 ADC4 Swap Mux", "R/L", "IF1 ADC4 Mux" },
360362306a36Sopenharmony_ci	{ "IF1 ADC4 Swap Mux", "L/L", "IF1 ADC4 Mux" },
360462306a36Sopenharmony_ci	{ "IF1 ADC4 Swap Mux", "R/R", "IF1 ADC4 Mux" },
360562306a36Sopenharmony_ci
360662306a36Sopenharmony_ci	{ "IF1 ADC", NULL, "IF1 ADC1 Swap Mux" },
360762306a36Sopenharmony_ci	{ "IF1 ADC", NULL, "IF1 ADC2 Swap Mux" },
360862306a36Sopenharmony_ci	{ "IF1 ADC", NULL, "IF1 ADC3 Swap Mux" },
360962306a36Sopenharmony_ci	{ "IF1 ADC", NULL, "IF1 ADC4 Swap Mux" },
361062306a36Sopenharmony_ci
361162306a36Sopenharmony_ci	{ "IF1 ADC TDM Swap Mux", "1/2/3/4", "IF1 ADC" },
361262306a36Sopenharmony_ci	{ "IF1 ADC TDM Swap Mux", "2/1/3/4", "IF1 ADC" },
361362306a36Sopenharmony_ci	{ "IF1 ADC TDM Swap Mux", "2/3/1/4", "IF1 ADC" },
361462306a36Sopenharmony_ci	{ "IF1 ADC TDM Swap Mux", "4/1/2/3", "IF1 ADC" },
361562306a36Sopenharmony_ci	{ "IF1 ADC TDM Swap Mux", "1/3/2/4", "IF1 ADC" },
361662306a36Sopenharmony_ci	{ "IF1 ADC TDM Swap Mux", "1/4/2/3", "IF1 ADC" },
361762306a36Sopenharmony_ci	{ "IF1 ADC TDM Swap Mux", "3/1/2/4", "IF1 ADC" },
361862306a36Sopenharmony_ci	{ "IF1 ADC TDM Swap Mux", "3/4/1/2", "IF1 ADC" },
361962306a36Sopenharmony_ci
362062306a36Sopenharmony_ci	{ "AIF1TX", NULL, "I2S1" },
362162306a36Sopenharmony_ci	{ "AIF1TX", NULL, "IF1 ADC TDM Swap Mux" },
362262306a36Sopenharmony_ci
362362306a36Sopenharmony_ci	{ "IF2 ADC1 Mux", "STO1 ADC MIX", "Stereo1 ADC MIX" },
362462306a36Sopenharmony_ci	{ "IF2 ADC1 Mux", "OB01", "OB01 Bypass Mux" },
362562306a36Sopenharmony_ci	{ "IF2 ADC1 Mux", "VAD ADC", "VAD ADC Mux" },
362662306a36Sopenharmony_ci
362762306a36Sopenharmony_ci	{ "IF2 ADC2 Mux", "STO2 ADC MIX", "Stereo2 ADC MIX" },
362862306a36Sopenharmony_ci	{ "IF2 ADC2 Mux", "OB23", "OB23 Bypass Mux" },
362962306a36Sopenharmony_ci
363062306a36Sopenharmony_ci	{ "IF2 ADC3 Mux", "STO3 ADC MIX", "Stereo3 ADC MIX" },
363162306a36Sopenharmony_ci	{ "IF2 ADC3 Mux", "MONO ADC MIX", "Mono ADC MIX" },
363262306a36Sopenharmony_ci	{ "IF2 ADC3 Mux", "OB45", "OB45" },
363362306a36Sopenharmony_ci
363462306a36Sopenharmony_ci	{ "IF2 ADC4 Mux", "STO4 ADC MIX", "Stereo4 ADC MIX" },
363562306a36Sopenharmony_ci	{ "IF2 ADC4 Mux", "OB67", "OB67" },
363662306a36Sopenharmony_ci	{ "IF2 ADC4 Mux", "OB01", "OB01 Bypass Mux" },
363762306a36Sopenharmony_ci
363862306a36Sopenharmony_ci	{ "IF2 ADC1 Swap Mux", "L/R", "IF2 ADC1 Mux" },
363962306a36Sopenharmony_ci	{ "IF2 ADC1 Swap Mux", "R/L", "IF2 ADC1 Mux" },
364062306a36Sopenharmony_ci	{ "IF2 ADC1 Swap Mux", "L/L", "IF2 ADC1 Mux" },
364162306a36Sopenharmony_ci	{ "IF2 ADC1 Swap Mux", "R/R", "IF2 ADC1 Mux" },
364262306a36Sopenharmony_ci
364362306a36Sopenharmony_ci	{ "IF2 ADC2 Swap Mux", "L/R", "IF2 ADC2 Mux" },
364462306a36Sopenharmony_ci	{ "IF2 ADC2 Swap Mux", "R/L", "IF2 ADC2 Mux" },
364562306a36Sopenharmony_ci	{ "IF2 ADC2 Swap Mux", "L/L", "IF2 ADC2 Mux" },
364662306a36Sopenharmony_ci	{ "IF2 ADC2 Swap Mux", "R/R", "IF2 ADC2 Mux" },
364762306a36Sopenharmony_ci
364862306a36Sopenharmony_ci	{ "IF2 ADC3 Swap Mux", "L/R", "IF2 ADC3 Mux" },
364962306a36Sopenharmony_ci	{ "IF2 ADC3 Swap Mux", "R/L", "IF2 ADC3 Mux" },
365062306a36Sopenharmony_ci	{ "IF2 ADC3 Swap Mux", "L/L", "IF2 ADC3 Mux" },
365162306a36Sopenharmony_ci	{ "IF2 ADC3 Swap Mux", "R/R", "IF2 ADC3 Mux" },
365262306a36Sopenharmony_ci
365362306a36Sopenharmony_ci	{ "IF2 ADC4 Swap Mux", "L/R", "IF2 ADC4 Mux" },
365462306a36Sopenharmony_ci	{ "IF2 ADC4 Swap Mux", "R/L", "IF2 ADC4 Mux" },
365562306a36Sopenharmony_ci	{ "IF2 ADC4 Swap Mux", "L/L", "IF2 ADC4 Mux" },
365662306a36Sopenharmony_ci	{ "IF2 ADC4 Swap Mux", "R/R", "IF2 ADC4 Mux" },
365762306a36Sopenharmony_ci
365862306a36Sopenharmony_ci	{ "IF2 ADC", NULL, "IF2 ADC1 Swap Mux" },
365962306a36Sopenharmony_ci	{ "IF2 ADC", NULL, "IF2 ADC2 Swap Mux" },
366062306a36Sopenharmony_ci	{ "IF2 ADC", NULL, "IF2 ADC3 Swap Mux" },
366162306a36Sopenharmony_ci	{ "IF2 ADC", NULL, "IF2 ADC4 Swap Mux" },
366262306a36Sopenharmony_ci
366362306a36Sopenharmony_ci	{ "IF2 ADC TDM Swap Mux", "1/2/3/4", "IF2 ADC" },
366462306a36Sopenharmony_ci	{ "IF2 ADC TDM Swap Mux", "2/1/3/4", "IF2 ADC" },
366562306a36Sopenharmony_ci	{ "IF2 ADC TDM Swap Mux", "3/1/2/4", "IF2 ADC" },
366662306a36Sopenharmony_ci	{ "IF2 ADC TDM Swap Mux", "4/1/2/3", "IF2 ADC" },
366762306a36Sopenharmony_ci	{ "IF2 ADC TDM Swap Mux", "1/3/2/4", "IF2 ADC" },
366862306a36Sopenharmony_ci	{ "IF2 ADC TDM Swap Mux", "1/4/2/3", "IF2 ADC" },
366962306a36Sopenharmony_ci	{ "IF2 ADC TDM Swap Mux", "2/3/1/4", "IF2 ADC" },
367062306a36Sopenharmony_ci	{ "IF2 ADC TDM Swap Mux", "3/4/1/2", "IF2 ADC" },
367162306a36Sopenharmony_ci
367262306a36Sopenharmony_ci	{ "AIF2TX", NULL, "I2S2" },
367362306a36Sopenharmony_ci	{ "AIF2TX", NULL, "IF2 ADC TDM Swap Mux" },
367462306a36Sopenharmony_ci
367562306a36Sopenharmony_ci	{ "IF3 ADC Mux", "STO1 ADC MIX", "Stereo1 ADC MIX" },
367662306a36Sopenharmony_ci	{ "IF3 ADC Mux", "STO2 ADC MIX", "Stereo2 ADC MIX" },
367762306a36Sopenharmony_ci	{ "IF3 ADC Mux", "STO3 ADC MIX", "Stereo3 ADC MIX" },
367862306a36Sopenharmony_ci	{ "IF3 ADC Mux", "STO4 ADC MIX", "Stereo4 ADC MIX" },
367962306a36Sopenharmony_ci	{ "IF3 ADC Mux", "MONO ADC MIX", "Mono ADC MIX" },
368062306a36Sopenharmony_ci	{ "IF3 ADC Mux", "OB01", "OB01 Bypass Mux" },
368162306a36Sopenharmony_ci	{ "IF3 ADC Mux", "OB23", "OB23 Bypass Mux" },
368262306a36Sopenharmony_ci	{ "IF3 ADC Mux", "VAD ADC", "VAD ADC Mux" },
368362306a36Sopenharmony_ci
368462306a36Sopenharmony_ci	{ "AIF3TX", NULL, "I2S3" },
368562306a36Sopenharmony_ci	{ "AIF3TX", NULL, "IF3 ADC Mux" },
368662306a36Sopenharmony_ci
368762306a36Sopenharmony_ci	{ "IF4 ADC Mux", "STO1 ADC MIX", "Stereo1 ADC MIX" },
368862306a36Sopenharmony_ci	{ "IF4 ADC Mux", "STO2 ADC MIX", "Stereo2 ADC MIX" },
368962306a36Sopenharmony_ci	{ "IF4 ADC Mux", "STO3 ADC MIX", "Stereo3 ADC MIX" },
369062306a36Sopenharmony_ci	{ "IF4 ADC Mux", "STO4 ADC MIX", "Stereo4 ADC MIX" },
369162306a36Sopenharmony_ci	{ "IF4 ADC Mux", "MONO ADC MIX", "Mono ADC MIX" },
369262306a36Sopenharmony_ci	{ "IF4 ADC Mux", "OB01", "OB01 Bypass Mux" },
369362306a36Sopenharmony_ci	{ "IF4 ADC Mux", "OB23", "OB23 Bypass Mux" },
369462306a36Sopenharmony_ci	{ "IF4 ADC Mux", "VAD ADC", "VAD ADC Mux" },
369562306a36Sopenharmony_ci
369662306a36Sopenharmony_ci	{ "AIF4TX", NULL, "I2S4" },
369762306a36Sopenharmony_ci	{ "AIF4TX", NULL, "IF4 ADC Mux" },
369862306a36Sopenharmony_ci
369962306a36Sopenharmony_ci	{ "SLB ADC1 Mux", "STO1 ADC MIX", "Stereo1 ADC MIX" },
370062306a36Sopenharmony_ci	{ "SLB ADC1 Mux", "OB01", "OB01 Bypass Mux" },
370162306a36Sopenharmony_ci	{ "SLB ADC1 Mux", "VAD ADC", "VAD ADC Mux" },
370262306a36Sopenharmony_ci
370362306a36Sopenharmony_ci	{ "SLB ADC2 Mux", "STO2 ADC MIX", "Stereo2 ADC MIX" },
370462306a36Sopenharmony_ci	{ "SLB ADC2 Mux", "OB23", "OB23 Bypass Mux" },
370562306a36Sopenharmony_ci
370662306a36Sopenharmony_ci	{ "SLB ADC3 Mux", "STO3 ADC MIX", "Stereo3 ADC MIX" },
370762306a36Sopenharmony_ci	{ "SLB ADC3 Mux", "MONO ADC MIX", "Mono ADC MIX" },
370862306a36Sopenharmony_ci	{ "SLB ADC3 Mux", "OB45", "OB45" },
370962306a36Sopenharmony_ci
371062306a36Sopenharmony_ci	{ "SLB ADC4 Mux", "STO4 ADC MIX", "Stereo4 ADC MIX" },
371162306a36Sopenharmony_ci	{ "SLB ADC4 Mux", "OB67", "OB67" },
371262306a36Sopenharmony_ci	{ "SLB ADC4 Mux", "OB01", "OB01 Bypass Mux" },
371362306a36Sopenharmony_ci
371462306a36Sopenharmony_ci	{ "SLBTX", NULL, "SLB" },
371562306a36Sopenharmony_ci	{ "SLBTX", NULL, "SLB ADC1 Mux" },
371662306a36Sopenharmony_ci	{ "SLBTX", NULL, "SLB ADC2 Mux" },
371762306a36Sopenharmony_ci	{ "SLBTX", NULL, "SLB ADC3 Mux" },
371862306a36Sopenharmony_ci	{ "SLBTX", NULL, "SLB ADC4 Mux" },
371962306a36Sopenharmony_ci
372062306a36Sopenharmony_ci	{ "DSPTX", NULL, "IB01 Bypass Mux" },
372162306a36Sopenharmony_ci
372262306a36Sopenharmony_ci	{ "IB01 Mux", "IF1 DAC 01", "IF1 DAC01" },
372362306a36Sopenharmony_ci	{ "IB01 Mux", "IF2 DAC 01", "IF2 DAC01" },
372462306a36Sopenharmony_ci	{ "IB01 Mux", "SLB DAC 01", "SLB DAC01" },
372562306a36Sopenharmony_ci	{ "IB01 Mux", "STO1 ADC MIX", "Stereo1 ADC MIX" },
372662306a36Sopenharmony_ci	/* The IB01 Mux controls the source for InBound0 and InBound1.
372762306a36Sopenharmony_ci	 * When the mux option "VAD ADC/DAC1 FS" is selected, "VAD ADC" goes to
372862306a36Sopenharmony_ci	 * InBound0 and "DAC1 FS" goes to InBound1. "VAD ADC" is used for
372962306a36Sopenharmony_ci	 * hotwording. "DAC1 FS" is not used currently.
373062306a36Sopenharmony_ci	 *
373162306a36Sopenharmony_ci	 * Creating a common widget node for "VAD ADC" + "DAC1 FS" and
373262306a36Sopenharmony_ci	 * connecting the common widget to IB01 Mux causes the issue where
373362306a36Sopenharmony_ci	 * there is an active path going from system playback -> "DAC1 FS" ->
373462306a36Sopenharmony_ci	 * IB01 Mux -> DSP Buffer -> hotword stream. This wrong path confuses
373562306a36Sopenharmony_ci	 * DAPM. Therefore "DAC1 FS" is ignored for now.
373662306a36Sopenharmony_ci	 */
373762306a36Sopenharmony_ci	{ "IB01 Mux", "VAD ADC/DAC1 FS", "VAD ADC Mux" },
373862306a36Sopenharmony_ci
373962306a36Sopenharmony_ci	{ "IB01 Bypass Mux", "Bypass", "IB01 Mux" },
374062306a36Sopenharmony_ci	{ "IB01 Bypass Mux", "Pass SRC", "IB01 Mux" },
374162306a36Sopenharmony_ci
374262306a36Sopenharmony_ci	{ "IB23 Mux", "IF1 DAC 23", "IF1 DAC23" },
374362306a36Sopenharmony_ci	{ "IB23 Mux", "IF2 DAC 23", "IF2 DAC23" },
374462306a36Sopenharmony_ci	{ "IB23 Mux", "SLB DAC 23", "SLB DAC23" },
374562306a36Sopenharmony_ci	{ "IB23 Mux", "STO2 ADC MIX", "Stereo2 ADC MIX" },
374662306a36Sopenharmony_ci	{ "IB23 Mux", "DAC1 FS", "DAC1 FS" },
374762306a36Sopenharmony_ci	{ "IB23 Mux", "IF4 DAC", "IF4 DAC" },
374862306a36Sopenharmony_ci
374962306a36Sopenharmony_ci	{ "IB23 Bypass Mux", "Bypass", "IB23 Mux" },
375062306a36Sopenharmony_ci	{ "IB23 Bypass Mux", "Pass SRC", "IB23 Mux" },
375162306a36Sopenharmony_ci
375262306a36Sopenharmony_ci	{ "IB45 Mux", "IF1 DAC 45", "IF1 DAC45" },
375362306a36Sopenharmony_ci	{ "IB45 Mux", "IF2 DAC 45", "IF2 DAC45" },
375462306a36Sopenharmony_ci	{ "IB45 Mux", "SLB DAC 45", "SLB DAC45" },
375562306a36Sopenharmony_ci	{ "IB45 Mux", "STO3 ADC MIX", "Stereo3 ADC MIX" },
375662306a36Sopenharmony_ci	{ "IB45 Mux", "IF3 DAC", "IF3 DAC" },
375762306a36Sopenharmony_ci
375862306a36Sopenharmony_ci	{ "IB45 Bypass Mux", "Bypass", "IB45 Mux" },
375962306a36Sopenharmony_ci	{ "IB45 Bypass Mux", "Pass SRC", "IB45 Mux" },
376062306a36Sopenharmony_ci
376162306a36Sopenharmony_ci	{ "IB6 Mux", "IF1 DAC 6", "IF1 DAC6 Mux" },
376262306a36Sopenharmony_ci	{ "IB6 Mux", "IF2 DAC 6", "IF2 DAC6 Mux" },
376362306a36Sopenharmony_ci	{ "IB6 Mux", "SLB DAC 6", "SLB DAC6" },
376462306a36Sopenharmony_ci	{ "IB6 Mux", "STO4 ADC MIX L", "Stereo4 ADC MIXL" },
376562306a36Sopenharmony_ci	{ "IB6 Mux", "IF4 DAC L", "IF4 DAC L" },
376662306a36Sopenharmony_ci	{ "IB6 Mux", "STO1 ADC MIX L", "Stereo1 ADC MIXL" },
376762306a36Sopenharmony_ci	{ "IB6 Mux", "STO2 ADC MIX L", "Stereo2 ADC MIXL" },
376862306a36Sopenharmony_ci	{ "IB6 Mux", "STO3 ADC MIX L", "Stereo3 ADC MIXL" },
376962306a36Sopenharmony_ci
377062306a36Sopenharmony_ci	{ "IB7 Mux", "IF1 DAC 7", "IF1 DAC7 Mux" },
377162306a36Sopenharmony_ci	{ "IB7 Mux", "IF2 DAC 7", "IF2 DAC7 Mux" },
377262306a36Sopenharmony_ci	{ "IB7 Mux", "SLB DAC 7", "SLB DAC7" },
377362306a36Sopenharmony_ci	{ "IB7 Mux", "STO4 ADC MIX R", "Stereo4 ADC MIXR" },
377462306a36Sopenharmony_ci	{ "IB7 Mux", "IF4 DAC R", "IF4 DAC R" },
377562306a36Sopenharmony_ci	{ "IB7 Mux", "STO1 ADC MIX R", "Stereo1 ADC MIXR" },
377662306a36Sopenharmony_ci	{ "IB7 Mux", "STO2 ADC MIX R", "Stereo2 ADC MIXR" },
377762306a36Sopenharmony_ci	{ "IB7 Mux", "STO3 ADC MIX R", "Stereo3 ADC MIXR" },
377862306a36Sopenharmony_ci
377962306a36Sopenharmony_ci	{ "IB8 Mux", "STO1 ADC MIX L", "Stereo1 ADC MIXL" },
378062306a36Sopenharmony_ci	{ "IB8 Mux", "STO2 ADC MIX L", "Stereo2 ADC MIXL" },
378162306a36Sopenharmony_ci	{ "IB8 Mux", "STO3 ADC MIX L", "Stereo3 ADC MIXL" },
378262306a36Sopenharmony_ci	{ "IB8 Mux", "STO4 ADC MIX L", "Stereo4 ADC MIXL" },
378362306a36Sopenharmony_ci	{ "IB8 Mux", "MONO ADC MIX L", "Mono ADC MIXL" },
378462306a36Sopenharmony_ci	{ "IB8 Mux", "DACL1 FS", "DAC1 MIXL" },
378562306a36Sopenharmony_ci
378662306a36Sopenharmony_ci	{ "IB9 Mux", "STO1 ADC MIX R", "Stereo1 ADC MIXR" },
378762306a36Sopenharmony_ci	{ "IB9 Mux", "STO2 ADC MIX R", "Stereo2 ADC MIXR" },
378862306a36Sopenharmony_ci	{ "IB9 Mux", "STO3 ADC MIX R", "Stereo3 ADC MIXR" },
378962306a36Sopenharmony_ci	{ "IB9 Mux", "STO4 ADC MIX R", "Stereo4 ADC MIXR" },
379062306a36Sopenharmony_ci	{ "IB9 Mux", "MONO ADC MIX R", "Mono ADC MIXR" },
379162306a36Sopenharmony_ci	{ "IB9 Mux", "DACR1 FS", "DAC1 MIXR" },
379262306a36Sopenharmony_ci	{ "IB9 Mux", "DAC1 FS", "DAC1 FS" },
379362306a36Sopenharmony_ci
379462306a36Sopenharmony_ci	{ "OB01 MIX", "IB01 Switch", "IB01 Bypass Mux" },
379562306a36Sopenharmony_ci	{ "OB01 MIX", "IB23 Switch", "IB23 Bypass Mux" },
379662306a36Sopenharmony_ci	{ "OB01 MIX", "IB45 Switch", "IB45 Bypass Mux" },
379762306a36Sopenharmony_ci	{ "OB01 MIX", "IB6 Switch", "IB6 Mux" },
379862306a36Sopenharmony_ci	{ "OB01 MIX", "IB7 Switch", "IB7 Mux" },
379962306a36Sopenharmony_ci	{ "OB01 MIX", "IB8 Switch", "IB8 Mux" },
380062306a36Sopenharmony_ci	{ "OB01 MIX", "IB9 Switch", "IB9 Mux" },
380162306a36Sopenharmony_ci
380262306a36Sopenharmony_ci	{ "OB23 MIX", "IB01 Switch", "IB01 Bypass Mux" },
380362306a36Sopenharmony_ci	{ "OB23 MIX", "IB23 Switch", "IB23 Bypass Mux" },
380462306a36Sopenharmony_ci	{ "OB23 MIX", "IB45 Switch", "IB45 Bypass Mux" },
380562306a36Sopenharmony_ci	{ "OB23 MIX", "IB6 Switch", "IB6 Mux" },
380662306a36Sopenharmony_ci	{ "OB23 MIX", "IB7 Switch", "IB7 Mux" },
380762306a36Sopenharmony_ci	{ "OB23 MIX", "IB8 Switch", "IB8 Mux" },
380862306a36Sopenharmony_ci	{ "OB23 MIX", "IB9 Switch", "IB9 Mux" },
380962306a36Sopenharmony_ci
381062306a36Sopenharmony_ci	{ "OB4 MIX", "IB01 Switch", "IB01 Bypass Mux" },
381162306a36Sopenharmony_ci	{ "OB4 MIX", "IB23 Switch", "IB23 Bypass Mux" },
381262306a36Sopenharmony_ci	{ "OB4 MIX", "IB45 Switch", "IB45 Bypass Mux" },
381362306a36Sopenharmony_ci	{ "OB4 MIX", "IB6 Switch", "IB6 Mux" },
381462306a36Sopenharmony_ci	{ "OB4 MIX", "IB7 Switch", "IB7 Mux" },
381562306a36Sopenharmony_ci	{ "OB4 MIX", "IB8 Switch", "IB8 Mux" },
381662306a36Sopenharmony_ci	{ "OB4 MIX", "IB9 Switch", "IB9 Mux" },
381762306a36Sopenharmony_ci
381862306a36Sopenharmony_ci	{ "OB5 MIX", "IB01 Switch", "IB01 Bypass Mux" },
381962306a36Sopenharmony_ci	{ "OB5 MIX", "IB23 Switch", "IB23 Bypass Mux" },
382062306a36Sopenharmony_ci	{ "OB5 MIX", "IB45 Switch", "IB45 Bypass Mux" },
382162306a36Sopenharmony_ci	{ "OB5 MIX", "IB6 Switch", "IB6 Mux" },
382262306a36Sopenharmony_ci	{ "OB5 MIX", "IB7 Switch", "IB7 Mux" },
382362306a36Sopenharmony_ci	{ "OB5 MIX", "IB8 Switch", "IB8 Mux" },
382462306a36Sopenharmony_ci	{ "OB5 MIX", "IB9 Switch", "IB9 Mux" },
382562306a36Sopenharmony_ci
382662306a36Sopenharmony_ci	{ "OB6 MIX", "IB01 Switch", "IB01 Bypass Mux" },
382762306a36Sopenharmony_ci	{ "OB6 MIX", "IB23 Switch", "IB23 Bypass Mux" },
382862306a36Sopenharmony_ci	{ "OB6 MIX", "IB45 Switch", "IB45 Bypass Mux" },
382962306a36Sopenharmony_ci	{ "OB6 MIX", "IB6 Switch", "IB6 Mux" },
383062306a36Sopenharmony_ci	{ "OB6 MIX", "IB7 Switch", "IB7 Mux" },
383162306a36Sopenharmony_ci	{ "OB6 MIX", "IB8 Switch", "IB8 Mux" },
383262306a36Sopenharmony_ci	{ "OB6 MIX", "IB9 Switch", "IB9 Mux" },
383362306a36Sopenharmony_ci
383462306a36Sopenharmony_ci	{ "OB7 MIX", "IB01 Switch", "IB01 Bypass Mux" },
383562306a36Sopenharmony_ci	{ "OB7 MIX", "IB23 Switch", "IB23 Bypass Mux" },
383662306a36Sopenharmony_ci	{ "OB7 MIX", "IB45 Switch", "IB45 Bypass Mux" },
383762306a36Sopenharmony_ci	{ "OB7 MIX", "IB6 Switch", "IB6 Mux" },
383862306a36Sopenharmony_ci	{ "OB7 MIX", "IB7 Switch", "IB7 Mux" },
383962306a36Sopenharmony_ci	{ "OB7 MIX", "IB8 Switch", "IB8 Mux" },
384062306a36Sopenharmony_ci	{ "OB7 MIX", "IB9 Switch", "IB9 Mux" },
384162306a36Sopenharmony_ci
384262306a36Sopenharmony_ci	{ "OB01 Bypass Mux", "Bypass", "OB01 MIX" },
384362306a36Sopenharmony_ci	{ "OB01 Bypass Mux", "Pass SRC", "OB01 MIX" },
384462306a36Sopenharmony_ci	{ "OB23 Bypass Mux", "Bypass", "OB23 MIX" },
384562306a36Sopenharmony_ci	{ "OB23 Bypass Mux", "Pass SRC", "OB23 MIX" },
384662306a36Sopenharmony_ci
384762306a36Sopenharmony_ci	{ "OutBound2", NULL, "OB23 Bypass Mux" },
384862306a36Sopenharmony_ci	{ "OutBound3", NULL, "OB23 Bypass Mux" },
384962306a36Sopenharmony_ci	{ "OutBound4", NULL, "OB4 MIX" },
385062306a36Sopenharmony_ci	{ "OutBound5", NULL, "OB5 MIX" },
385162306a36Sopenharmony_ci	{ "OutBound6", NULL, "OB6 MIX" },
385262306a36Sopenharmony_ci	{ "OutBound7", NULL, "OB7 MIX" },
385362306a36Sopenharmony_ci
385462306a36Sopenharmony_ci	{ "OB45", NULL, "OutBound4" },
385562306a36Sopenharmony_ci	{ "OB45", NULL, "OutBound5" },
385662306a36Sopenharmony_ci	{ "OB67", NULL, "OutBound6" },
385762306a36Sopenharmony_ci	{ "OB67", NULL, "OutBound7" },
385862306a36Sopenharmony_ci
385962306a36Sopenharmony_ci	{ "IF1 DAC0", NULL, "AIF1RX" },
386062306a36Sopenharmony_ci	{ "IF1 DAC1", NULL, "AIF1RX" },
386162306a36Sopenharmony_ci	{ "IF1 DAC2", NULL, "AIF1RX" },
386262306a36Sopenharmony_ci	{ "IF1 DAC3", NULL, "AIF1RX" },
386362306a36Sopenharmony_ci	{ "IF1 DAC4", NULL, "AIF1RX" },
386462306a36Sopenharmony_ci	{ "IF1 DAC5", NULL, "AIF1RX" },
386562306a36Sopenharmony_ci	{ "IF1 DAC6", NULL, "AIF1RX" },
386662306a36Sopenharmony_ci	{ "IF1 DAC7", NULL, "AIF1RX" },
386762306a36Sopenharmony_ci	{ "IF1 DAC0", NULL, "I2S1" },
386862306a36Sopenharmony_ci	{ "IF1 DAC1", NULL, "I2S1" },
386962306a36Sopenharmony_ci	{ "IF1 DAC2", NULL, "I2S1" },
387062306a36Sopenharmony_ci	{ "IF1 DAC3", NULL, "I2S1" },
387162306a36Sopenharmony_ci	{ "IF1 DAC4", NULL, "I2S1" },
387262306a36Sopenharmony_ci	{ "IF1 DAC5", NULL, "I2S1" },
387362306a36Sopenharmony_ci	{ "IF1 DAC6", NULL, "I2S1" },
387462306a36Sopenharmony_ci	{ "IF1 DAC7", NULL, "I2S1" },
387562306a36Sopenharmony_ci
387662306a36Sopenharmony_ci	{ "IF1 DAC0 Mux", "Slot0", "IF1 DAC0" },
387762306a36Sopenharmony_ci	{ "IF1 DAC0 Mux", "Slot1", "IF1 DAC1" },
387862306a36Sopenharmony_ci	{ "IF1 DAC0 Mux", "Slot2", "IF1 DAC2" },
387962306a36Sopenharmony_ci	{ "IF1 DAC0 Mux", "Slot3", "IF1 DAC3" },
388062306a36Sopenharmony_ci	{ "IF1 DAC0 Mux", "Slot4", "IF1 DAC4" },
388162306a36Sopenharmony_ci	{ "IF1 DAC0 Mux", "Slot5", "IF1 DAC5" },
388262306a36Sopenharmony_ci	{ "IF1 DAC0 Mux", "Slot6", "IF1 DAC6" },
388362306a36Sopenharmony_ci	{ "IF1 DAC0 Mux", "Slot7", "IF1 DAC7" },
388462306a36Sopenharmony_ci
388562306a36Sopenharmony_ci	{ "IF1 DAC1 Mux", "Slot0", "IF1 DAC0" },
388662306a36Sopenharmony_ci	{ "IF1 DAC1 Mux", "Slot1", "IF1 DAC1" },
388762306a36Sopenharmony_ci	{ "IF1 DAC1 Mux", "Slot2", "IF1 DAC2" },
388862306a36Sopenharmony_ci	{ "IF1 DAC1 Mux", "Slot3", "IF1 DAC3" },
388962306a36Sopenharmony_ci	{ "IF1 DAC1 Mux", "Slot4", "IF1 DAC4" },
389062306a36Sopenharmony_ci	{ "IF1 DAC1 Mux", "Slot5", "IF1 DAC5" },
389162306a36Sopenharmony_ci	{ "IF1 DAC1 Mux", "Slot6", "IF1 DAC6" },
389262306a36Sopenharmony_ci	{ "IF1 DAC1 Mux", "Slot7", "IF1 DAC7" },
389362306a36Sopenharmony_ci
389462306a36Sopenharmony_ci	{ "IF1 DAC2 Mux", "Slot0", "IF1 DAC0" },
389562306a36Sopenharmony_ci	{ "IF1 DAC2 Mux", "Slot1", "IF1 DAC1" },
389662306a36Sopenharmony_ci	{ "IF1 DAC2 Mux", "Slot2", "IF1 DAC2" },
389762306a36Sopenharmony_ci	{ "IF1 DAC2 Mux", "Slot3", "IF1 DAC3" },
389862306a36Sopenharmony_ci	{ "IF1 DAC2 Mux", "Slot4", "IF1 DAC4" },
389962306a36Sopenharmony_ci	{ "IF1 DAC2 Mux", "Slot5", "IF1 DAC5" },
390062306a36Sopenharmony_ci	{ "IF1 DAC2 Mux", "Slot6", "IF1 DAC6" },
390162306a36Sopenharmony_ci	{ "IF1 DAC2 Mux", "Slot7", "IF1 DAC7" },
390262306a36Sopenharmony_ci
390362306a36Sopenharmony_ci	{ "IF1 DAC3 Mux", "Slot0", "IF1 DAC0" },
390462306a36Sopenharmony_ci	{ "IF1 DAC3 Mux", "Slot1", "IF1 DAC1" },
390562306a36Sopenharmony_ci	{ "IF1 DAC3 Mux", "Slot2", "IF1 DAC2" },
390662306a36Sopenharmony_ci	{ "IF1 DAC3 Mux", "Slot3", "IF1 DAC3" },
390762306a36Sopenharmony_ci	{ "IF1 DAC3 Mux", "Slot4", "IF1 DAC4" },
390862306a36Sopenharmony_ci	{ "IF1 DAC3 Mux", "Slot5", "IF1 DAC5" },
390962306a36Sopenharmony_ci	{ "IF1 DAC3 Mux", "Slot6", "IF1 DAC6" },
391062306a36Sopenharmony_ci	{ "IF1 DAC3 Mux", "Slot7", "IF1 DAC7" },
391162306a36Sopenharmony_ci
391262306a36Sopenharmony_ci	{ "IF1 DAC4 Mux", "Slot0", "IF1 DAC0" },
391362306a36Sopenharmony_ci	{ "IF1 DAC4 Mux", "Slot1", "IF1 DAC1" },
391462306a36Sopenharmony_ci	{ "IF1 DAC4 Mux", "Slot2", "IF1 DAC2" },
391562306a36Sopenharmony_ci	{ "IF1 DAC4 Mux", "Slot3", "IF1 DAC3" },
391662306a36Sopenharmony_ci	{ "IF1 DAC4 Mux", "Slot4", "IF1 DAC4" },
391762306a36Sopenharmony_ci	{ "IF1 DAC4 Mux", "Slot5", "IF1 DAC5" },
391862306a36Sopenharmony_ci	{ "IF1 DAC4 Mux", "Slot6", "IF1 DAC6" },
391962306a36Sopenharmony_ci	{ "IF1 DAC4 Mux", "Slot7", "IF1 DAC7" },
392062306a36Sopenharmony_ci
392162306a36Sopenharmony_ci	{ "IF1 DAC5 Mux", "Slot0", "IF1 DAC0" },
392262306a36Sopenharmony_ci	{ "IF1 DAC5 Mux", "Slot1", "IF1 DAC1" },
392362306a36Sopenharmony_ci	{ "IF1 DAC5 Mux", "Slot2", "IF1 DAC2" },
392462306a36Sopenharmony_ci	{ "IF1 DAC5 Mux", "Slot3", "IF1 DAC3" },
392562306a36Sopenharmony_ci	{ "IF1 DAC5 Mux", "Slot4", "IF1 DAC4" },
392662306a36Sopenharmony_ci	{ "IF1 DAC5 Mux", "Slot5", "IF1 DAC5" },
392762306a36Sopenharmony_ci	{ "IF1 DAC5 Mux", "Slot6", "IF1 DAC6" },
392862306a36Sopenharmony_ci	{ "IF1 DAC5 Mux", "Slot7", "IF1 DAC7" },
392962306a36Sopenharmony_ci
393062306a36Sopenharmony_ci	{ "IF1 DAC6 Mux", "Slot0", "IF1 DAC0" },
393162306a36Sopenharmony_ci	{ "IF1 DAC6 Mux", "Slot1", "IF1 DAC1" },
393262306a36Sopenharmony_ci	{ "IF1 DAC6 Mux", "Slot2", "IF1 DAC2" },
393362306a36Sopenharmony_ci	{ "IF1 DAC6 Mux", "Slot3", "IF1 DAC3" },
393462306a36Sopenharmony_ci	{ "IF1 DAC6 Mux", "Slot4", "IF1 DAC4" },
393562306a36Sopenharmony_ci	{ "IF1 DAC6 Mux", "Slot5", "IF1 DAC5" },
393662306a36Sopenharmony_ci	{ "IF1 DAC6 Mux", "Slot6", "IF1 DAC6" },
393762306a36Sopenharmony_ci	{ "IF1 DAC6 Mux", "Slot7", "IF1 DAC7" },
393862306a36Sopenharmony_ci
393962306a36Sopenharmony_ci	{ "IF1 DAC7 Mux", "Slot0", "IF1 DAC0" },
394062306a36Sopenharmony_ci	{ "IF1 DAC7 Mux", "Slot1", "IF1 DAC1" },
394162306a36Sopenharmony_ci	{ "IF1 DAC7 Mux", "Slot2", "IF1 DAC2" },
394262306a36Sopenharmony_ci	{ "IF1 DAC7 Mux", "Slot3", "IF1 DAC3" },
394362306a36Sopenharmony_ci	{ "IF1 DAC7 Mux", "Slot4", "IF1 DAC4" },
394462306a36Sopenharmony_ci	{ "IF1 DAC7 Mux", "Slot5", "IF1 DAC5" },
394562306a36Sopenharmony_ci	{ "IF1 DAC7 Mux", "Slot6", "IF1 DAC6" },
394662306a36Sopenharmony_ci	{ "IF1 DAC7 Mux", "Slot7", "IF1 DAC7" },
394762306a36Sopenharmony_ci
394862306a36Sopenharmony_ci	{ "IF1 DAC01", NULL, "IF1 DAC0 Mux" },
394962306a36Sopenharmony_ci	{ "IF1 DAC01", NULL, "IF1 DAC1 Mux" },
395062306a36Sopenharmony_ci	{ "IF1 DAC23", NULL, "IF1 DAC2 Mux" },
395162306a36Sopenharmony_ci	{ "IF1 DAC23", NULL, "IF1 DAC3 Mux" },
395262306a36Sopenharmony_ci	{ "IF1 DAC45", NULL, "IF1 DAC4 Mux" },
395362306a36Sopenharmony_ci	{ "IF1 DAC45", NULL, "IF1 DAC5 Mux" },
395462306a36Sopenharmony_ci	{ "IF1 DAC67", NULL, "IF1 DAC6 Mux" },
395562306a36Sopenharmony_ci	{ "IF1 DAC67", NULL, "IF1 DAC7 Mux" },
395662306a36Sopenharmony_ci
395762306a36Sopenharmony_ci	{ "IF2 DAC0", NULL, "AIF2RX" },
395862306a36Sopenharmony_ci	{ "IF2 DAC1", NULL, "AIF2RX" },
395962306a36Sopenharmony_ci	{ "IF2 DAC2", NULL, "AIF2RX" },
396062306a36Sopenharmony_ci	{ "IF2 DAC3", NULL, "AIF2RX" },
396162306a36Sopenharmony_ci	{ "IF2 DAC4", NULL, "AIF2RX" },
396262306a36Sopenharmony_ci	{ "IF2 DAC5", NULL, "AIF2RX" },
396362306a36Sopenharmony_ci	{ "IF2 DAC6", NULL, "AIF2RX" },
396462306a36Sopenharmony_ci	{ "IF2 DAC7", NULL, "AIF2RX" },
396562306a36Sopenharmony_ci	{ "IF2 DAC0", NULL, "I2S2" },
396662306a36Sopenharmony_ci	{ "IF2 DAC1", NULL, "I2S2" },
396762306a36Sopenharmony_ci	{ "IF2 DAC2", NULL, "I2S2" },
396862306a36Sopenharmony_ci	{ "IF2 DAC3", NULL, "I2S2" },
396962306a36Sopenharmony_ci	{ "IF2 DAC4", NULL, "I2S2" },
397062306a36Sopenharmony_ci	{ "IF2 DAC5", NULL, "I2S2" },
397162306a36Sopenharmony_ci	{ "IF2 DAC6", NULL, "I2S2" },
397262306a36Sopenharmony_ci	{ "IF2 DAC7", NULL, "I2S2" },
397362306a36Sopenharmony_ci
397462306a36Sopenharmony_ci	{ "IF2 DAC0 Mux", "Slot0", "IF2 DAC0" },
397562306a36Sopenharmony_ci	{ "IF2 DAC0 Mux", "Slot1", "IF2 DAC1" },
397662306a36Sopenharmony_ci	{ "IF2 DAC0 Mux", "Slot2", "IF2 DAC2" },
397762306a36Sopenharmony_ci	{ "IF2 DAC0 Mux", "Slot3", "IF2 DAC3" },
397862306a36Sopenharmony_ci	{ "IF2 DAC0 Mux", "Slot4", "IF2 DAC4" },
397962306a36Sopenharmony_ci	{ "IF2 DAC0 Mux", "Slot5", "IF2 DAC5" },
398062306a36Sopenharmony_ci	{ "IF2 DAC0 Mux", "Slot6", "IF2 DAC6" },
398162306a36Sopenharmony_ci	{ "IF2 DAC0 Mux", "Slot7", "IF2 DAC7" },
398262306a36Sopenharmony_ci
398362306a36Sopenharmony_ci	{ "IF2 DAC1 Mux", "Slot0", "IF2 DAC0" },
398462306a36Sopenharmony_ci	{ "IF2 DAC1 Mux", "Slot1", "IF2 DAC1" },
398562306a36Sopenharmony_ci	{ "IF2 DAC1 Mux", "Slot2", "IF2 DAC2" },
398662306a36Sopenharmony_ci	{ "IF2 DAC1 Mux", "Slot3", "IF2 DAC3" },
398762306a36Sopenharmony_ci	{ "IF2 DAC1 Mux", "Slot4", "IF2 DAC4" },
398862306a36Sopenharmony_ci	{ "IF2 DAC1 Mux", "Slot5", "IF2 DAC5" },
398962306a36Sopenharmony_ci	{ "IF2 DAC1 Mux", "Slot6", "IF2 DAC6" },
399062306a36Sopenharmony_ci	{ "IF2 DAC1 Mux", "Slot7", "IF2 DAC7" },
399162306a36Sopenharmony_ci
399262306a36Sopenharmony_ci	{ "IF2 DAC2 Mux", "Slot0", "IF2 DAC0" },
399362306a36Sopenharmony_ci	{ "IF2 DAC2 Mux", "Slot1", "IF2 DAC1" },
399462306a36Sopenharmony_ci	{ "IF2 DAC2 Mux", "Slot2", "IF2 DAC2" },
399562306a36Sopenharmony_ci	{ "IF2 DAC2 Mux", "Slot3", "IF2 DAC3" },
399662306a36Sopenharmony_ci	{ "IF2 DAC2 Mux", "Slot4", "IF2 DAC4" },
399762306a36Sopenharmony_ci	{ "IF2 DAC2 Mux", "Slot5", "IF2 DAC5" },
399862306a36Sopenharmony_ci	{ "IF2 DAC2 Mux", "Slot6", "IF2 DAC6" },
399962306a36Sopenharmony_ci	{ "IF2 DAC2 Mux", "Slot7", "IF2 DAC7" },
400062306a36Sopenharmony_ci
400162306a36Sopenharmony_ci	{ "IF2 DAC3 Mux", "Slot0", "IF2 DAC0" },
400262306a36Sopenharmony_ci	{ "IF2 DAC3 Mux", "Slot1", "IF2 DAC1" },
400362306a36Sopenharmony_ci	{ "IF2 DAC3 Mux", "Slot2", "IF2 DAC2" },
400462306a36Sopenharmony_ci	{ "IF2 DAC3 Mux", "Slot3", "IF2 DAC3" },
400562306a36Sopenharmony_ci	{ "IF2 DAC3 Mux", "Slot4", "IF2 DAC4" },
400662306a36Sopenharmony_ci	{ "IF2 DAC3 Mux", "Slot5", "IF2 DAC5" },
400762306a36Sopenharmony_ci	{ "IF2 DAC3 Mux", "Slot6", "IF2 DAC6" },
400862306a36Sopenharmony_ci	{ "IF2 DAC3 Mux", "Slot7", "IF2 DAC7" },
400962306a36Sopenharmony_ci
401062306a36Sopenharmony_ci	{ "IF2 DAC4 Mux", "Slot0", "IF2 DAC0" },
401162306a36Sopenharmony_ci	{ "IF2 DAC4 Mux", "Slot1", "IF2 DAC1" },
401262306a36Sopenharmony_ci	{ "IF2 DAC4 Mux", "Slot2", "IF2 DAC2" },
401362306a36Sopenharmony_ci	{ "IF2 DAC4 Mux", "Slot3", "IF2 DAC3" },
401462306a36Sopenharmony_ci	{ "IF2 DAC4 Mux", "Slot4", "IF2 DAC4" },
401562306a36Sopenharmony_ci	{ "IF2 DAC4 Mux", "Slot5", "IF2 DAC5" },
401662306a36Sopenharmony_ci	{ "IF2 DAC4 Mux", "Slot6", "IF2 DAC6" },
401762306a36Sopenharmony_ci	{ "IF2 DAC4 Mux", "Slot7", "IF2 DAC7" },
401862306a36Sopenharmony_ci
401962306a36Sopenharmony_ci	{ "IF2 DAC5 Mux", "Slot0", "IF2 DAC0" },
402062306a36Sopenharmony_ci	{ "IF2 DAC5 Mux", "Slot1", "IF2 DAC1" },
402162306a36Sopenharmony_ci	{ "IF2 DAC5 Mux", "Slot2", "IF2 DAC2" },
402262306a36Sopenharmony_ci	{ "IF2 DAC5 Mux", "Slot3", "IF2 DAC3" },
402362306a36Sopenharmony_ci	{ "IF2 DAC5 Mux", "Slot4", "IF2 DAC4" },
402462306a36Sopenharmony_ci	{ "IF2 DAC5 Mux", "Slot5", "IF2 DAC5" },
402562306a36Sopenharmony_ci	{ "IF2 DAC5 Mux", "Slot6", "IF2 DAC6" },
402662306a36Sopenharmony_ci	{ "IF2 DAC5 Mux", "Slot7", "IF2 DAC7" },
402762306a36Sopenharmony_ci
402862306a36Sopenharmony_ci	{ "IF2 DAC6 Mux", "Slot0", "IF2 DAC0" },
402962306a36Sopenharmony_ci	{ "IF2 DAC6 Mux", "Slot1", "IF2 DAC1" },
403062306a36Sopenharmony_ci	{ "IF2 DAC6 Mux", "Slot2", "IF2 DAC2" },
403162306a36Sopenharmony_ci	{ "IF2 DAC6 Mux", "Slot3", "IF2 DAC3" },
403262306a36Sopenharmony_ci	{ "IF2 DAC6 Mux", "Slot4", "IF2 DAC4" },
403362306a36Sopenharmony_ci	{ "IF2 DAC6 Mux", "Slot5", "IF2 DAC5" },
403462306a36Sopenharmony_ci	{ "IF2 DAC6 Mux", "Slot6", "IF2 DAC6" },
403562306a36Sopenharmony_ci	{ "IF2 DAC6 Mux", "Slot7", "IF2 DAC7" },
403662306a36Sopenharmony_ci
403762306a36Sopenharmony_ci	{ "IF2 DAC7 Mux", "Slot0", "IF2 DAC0" },
403862306a36Sopenharmony_ci	{ "IF2 DAC7 Mux", "Slot1", "IF2 DAC1" },
403962306a36Sopenharmony_ci	{ "IF2 DAC7 Mux", "Slot2", "IF2 DAC2" },
404062306a36Sopenharmony_ci	{ "IF2 DAC7 Mux", "Slot3", "IF2 DAC3" },
404162306a36Sopenharmony_ci	{ "IF2 DAC7 Mux", "Slot4", "IF2 DAC4" },
404262306a36Sopenharmony_ci	{ "IF2 DAC7 Mux", "Slot5", "IF2 DAC5" },
404362306a36Sopenharmony_ci	{ "IF2 DAC7 Mux", "Slot6", "IF2 DAC6" },
404462306a36Sopenharmony_ci	{ "IF2 DAC7 Mux", "Slot7", "IF2 DAC7" },
404562306a36Sopenharmony_ci
404662306a36Sopenharmony_ci	{ "IF2 DAC01", NULL, "IF2 DAC0 Mux" },
404762306a36Sopenharmony_ci	{ "IF2 DAC01", NULL, "IF2 DAC1 Mux" },
404862306a36Sopenharmony_ci	{ "IF2 DAC23", NULL, "IF2 DAC2 Mux" },
404962306a36Sopenharmony_ci	{ "IF2 DAC23", NULL, "IF2 DAC3 Mux" },
405062306a36Sopenharmony_ci	{ "IF2 DAC45", NULL, "IF2 DAC4 Mux" },
405162306a36Sopenharmony_ci	{ "IF2 DAC45", NULL, "IF2 DAC5 Mux" },
405262306a36Sopenharmony_ci	{ "IF2 DAC67", NULL, "IF2 DAC6 Mux" },
405362306a36Sopenharmony_ci	{ "IF2 DAC67", NULL, "IF2 DAC7 Mux" },
405462306a36Sopenharmony_ci
405562306a36Sopenharmony_ci	{ "IF3 DAC", NULL, "AIF3RX" },
405662306a36Sopenharmony_ci	{ "IF3 DAC", NULL, "I2S3" },
405762306a36Sopenharmony_ci
405862306a36Sopenharmony_ci	{ "IF4 DAC", NULL, "AIF4RX" },
405962306a36Sopenharmony_ci	{ "IF4 DAC", NULL, "I2S4" },
406062306a36Sopenharmony_ci
406162306a36Sopenharmony_ci	{ "IF3 DAC L", NULL, "IF3 DAC" },
406262306a36Sopenharmony_ci	{ "IF3 DAC R", NULL, "IF3 DAC" },
406362306a36Sopenharmony_ci
406462306a36Sopenharmony_ci	{ "IF4 DAC L", NULL, "IF4 DAC" },
406562306a36Sopenharmony_ci	{ "IF4 DAC R", NULL, "IF4 DAC" },
406662306a36Sopenharmony_ci
406762306a36Sopenharmony_ci	{ "SLB DAC0", NULL, "SLBRX" },
406862306a36Sopenharmony_ci	{ "SLB DAC1", NULL, "SLBRX" },
406962306a36Sopenharmony_ci	{ "SLB DAC2", NULL, "SLBRX" },
407062306a36Sopenharmony_ci	{ "SLB DAC3", NULL, "SLBRX" },
407162306a36Sopenharmony_ci	{ "SLB DAC4", NULL, "SLBRX" },
407262306a36Sopenharmony_ci	{ "SLB DAC5", NULL, "SLBRX" },
407362306a36Sopenharmony_ci	{ "SLB DAC6", NULL, "SLBRX" },
407462306a36Sopenharmony_ci	{ "SLB DAC7", NULL, "SLBRX" },
407562306a36Sopenharmony_ci	{ "SLB DAC0", NULL, "SLB" },
407662306a36Sopenharmony_ci	{ "SLB DAC1", NULL, "SLB" },
407762306a36Sopenharmony_ci	{ "SLB DAC2", NULL, "SLB" },
407862306a36Sopenharmony_ci	{ "SLB DAC3", NULL, "SLB" },
407962306a36Sopenharmony_ci	{ "SLB DAC4", NULL, "SLB" },
408062306a36Sopenharmony_ci	{ "SLB DAC5", NULL, "SLB" },
408162306a36Sopenharmony_ci	{ "SLB DAC6", NULL, "SLB" },
408262306a36Sopenharmony_ci	{ "SLB DAC7", NULL, "SLB" },
408362306a36Sopenharmony_ci
408462306a36Sopenharmony_ci	{ "SLB DAC01", NULL, "SLB DAC0" },
408562306a36Sopenharmony_ci	{ "SLB DAC01", NULL, "SLB DAC1" },
408662306a36Sopenharmony_ci	{ "SLB DAC23", NULL, "SLB DAC2" },
408762306a36Sopenharmony_ci	{ "SLB DAC23", NULL, "SLB DAC3" },
408862306a36Sopenharmony_ci	{ "SLB DAC45", NULL, "SLB DAC4" },
408962306a36Sopenharmony_ci	{ "SLB DAC45", NULL, "SLB DAC5" },
409062306a36Sopenharmony_ci	{ "SLB DAC67", NULL, "SLB DAC6" },
409162306a36Sopenharmony_ci	{ "SLB DAC67", NULL, "SLB DAC7" },
409262306a36Sopenharmony_ci
409362306a36Sopenharmony_ci	{ "ADDA1 Mux", "STO1 ADC MIX", "Stereo1 ADC MIX" },
409462306a36Sopenharmony_ci	{ "ADDA1 Mux", "STO2 ADC MIX", "Stereo2 ADC MIX" },
409562306a36Sopenharmony_ci	{ "ADDA1 Mux", "OB 67", "OB67" },
409662306a36Sopenharmony_ci
409762306a36Sopenharmony_ci	{ "DAC1 Mux", "IF1 DAC 01", "IF1 DAC01" },
409862306a36Sopenharmony_ci	{ "DAC1 Mux", "IF2 DAC 01", "IF2 DAC01" },
409962306a36Sopenharmony_ci	{ "DAC1 Mux", "IF3 DAC LR", "IF3 DAC" },
410062306a36Sopenharmony_ci	{ "DAC1 Mux", "IF4 DAC LR", "IF4 DAC" },
410162306a36Sopenharmony_ci	{ "DAC1 Mux", "SLB DAC 01", "SLB DAC01" },
410262306a36Sopenharmony_ci	{ "DAC1 Mux", "OB 01", "OB01 Bypass Mux" },
410362306a36Sopenharmony_ci
410462306a36Sopenharmony_ci	{ "DAC1 MIXL", "Stereo ADC Switch", "ADDA1 Mux" },
410562306a36Sopenharmony_ci	{ "DAC1 MIXL", "DAC1 Switch", "DAC1 Mux" },
410662306a36Sopenharmony_ci	{ "DAC1 MIXR", "Stereo ADC Switch", "ADDA1 Mux" },
410762306a36Sopenharmony_ci	{ "DAC1 MIXR", "DAC1 Switch", "DAC1 Mux" },
410862306a36Sopenharmony_ci
410962306a36Sopenharmony_ci	{ "DAC1 FS", NULL, "DAC1 MIXL" },
411062306a36Sopenharmony_ci	{ "DAC1 FS", NULL, "DAC1 MIXR" },
411162306a36Sopenharmony_ci
411262306a36Sopenharmony_ci	{ "DAC2 L Mux", "IF1 DAC 2", "IF1 DAC2 Mux" },
411362306a36Sopenharmony_ci	{ "DAC2 L Mux", "IF2 DAC 2", "IF2 DAC2 Mux" },
411462306a36Sopenharmony_ci	{ "DAC2 L Mux", "IF3 DAC L", "IF3 DAC L" },
411562306a36Sopenharmony_ci	{ "DAC2 L Mux", "IF4 DAC L", "IF4 DAC L" },
411662306a36Sopenharmony_ci	{ "DAC2 L Mux", "SLB DAC 2", "SLB DAC2" },
411762306a36Sopenharmony_ci	{ "DAC2 L Mux", "OB 2", "OutBound2" },
411862306a36Sopenharmony_ci
411962306a36Sopenharmony_ci	{ "DAC2 R Mux", "IF1 DAC 3", "IF1 DAC3 Mux" },
412062306a36Sopenharmony_ci	{ "DAC2 R Mux", "IF2 DAC 3", "IF2 DAC3 Mux" },
412162306a36Sopenharmony_ci	{ "DAC2 R Mux", "IF3 DAC R", "IF3 DAC R" },
412262306a36Sopenharmony_ci	{ "DAC2 R Mux", "IF4 DAC R", "IF4 DAC R" },
412362306a36Sopenharmony_ci	{ "DAC2 R Mux", "SLB DAC 3", "SLB DAC3" },
412462306a36Sopenharmony_ci	{ "DAC2 R Mux", "OB 3", "OutBound3" },
412562306a36Sopenharmony_ci	{ "DAC2 R Mux", "Haptic Generator", "Haptic Generator" },
412662306a36Sopenharmony_ci	{ "DAC2 R Mux", "VAD ADC", "VAD ADC Mux" },
412762306a36Sopenharmony_ci
412862306a36Sopenharmony_ci	{ "DAC3 L Mux", "IF1 DAC 4", "IF1 DAC4 Mux" },
412962306a36Sopenharmony_ci	{ "DAC3 L Mux", "IF2 DAC 4", "IF2 DAC4 Mux" },
413062306a36Sopenharmony_ci	{ "DAC3 L Mux", "IF3 DAC L", "IF3 DAC L" },
413162306a36Sopenharmony_ci	{ "DAC3 L Mux", "IF4 DAC L", "IF4 DAC L" },
413262306a36Sopenharmony_ci	{ "DAC3 L Mux", "SLB DAC 4", "SLB DAC4" },
413362306a36Sopenharmony_ci	{ "DAC3 L Mux", "OB 4", "OutBound4" },
413462306a36Sopenharmony_ci
413562306a36Sopenharmony_ci	{ "DAC3 R Mux", "IF1 DAC 5", "IF1 DAC5 Mux" },
413662306a36Sopenharmony_ci	{ "DAC3 R Mux", "IF2 DAC 5", "IF2 DAC5 Mux" },
413762306a36Sopenharmony_ci	{ "DAC3 R Mux", "IF3 DAC R", "IF3 DAC R" },
413862306a36Sopenharmony_ci	{ "DAC3 R Mux", "IF4 DAC R", "IF4 DAC R" },
413962306a36Sopenharmony_ci	{ "DAC3 R Mux", "SLB DAC 5", "SLB DAC5" },
414062306a36Sopenharmony_ci	{ "DAC3 R Mux", "OB 5", "OutBound5" },
414162306a36Sopenharmony_ci
414262306a36Sopenharmony_ci	{ "DAC4 L Mux", "IF1 DAC 6", "IF1 DAC6 Mux" },
414362306a36Sopenharmony_ci	{ "DAC4 L Mux", "IF2 DAC 6", "IF2 DAC6 Mux" },
414462306a36Sopenharmony_ci	{ "DAC4 L Mux", "IF3 DAC L", "IF3 DAC L" },
414562306a36Sopenharmony_ci	{ "DAC4 L Mux", "IF4 DAC L", "IF4 DAC L" },
414662306a36Sopenharmony_ci	{ "DAC4 L Mux", "SLB DAC 6", "SLB DAC6" },
414762306a36Sopenharmony_ci	{ "DAC4 L Mux", "OB 6", "OutBound6" },
414862306a36Sopenharmony_ci
414962306a36Sopenharmony_ci	{ "DAC4 R Mux", "IF1 DAC 7", "IF1 DAC7 Mux" },
415062306a36Sopenharmony_ci	{ "DAC4 R Mux", "IF2 DAC 7", "IF2 DAC7 Mux" },
415162306a36Sopenharmony_ci	{ "DAC4 R Mux", "IF3 DAC R", "IF3 DAC R" },
415262306a36Sopenharmony_ci	{ "DAC4 R Mux", "IF4 DAC R", "IF4 DAC R" },
415362306a36Sopenharmony_ci	{ "DAC4 R Mux", "SLB DAC 7", "SLB DAC7" },
415462306a36Sopenharmony_ci	{ "DAC4 R Mux", "OB 7", "OutBound7" },
415562306a36Sopenharmony_ci
415662306a36Sopenharmony_ci	{ "Sidetone Mux", "DMIC1 L", "DMIC L1" },
415762306a36Sopenharmony_ci	{ "Sidetone Mux", "DMIC2 L", "DMIC L2" },
415862306a36Sopenharmony_ci	{ "Sidetone Mux", "DMIC3 L", "DMIC L3" },
415962306a36Sopenharmony_ci	{ "Sidetone Mux", "DMIC4 L", "DMIC L4" },
416062306a36Sopenharmony_ci	{ "Sidetone Mux", "ADC1", "ADC 1" },
416162306a36Sopenharmony_ci	{ "Sidetone Mux", "ADC2", "ADC 2" },
416262306a36Sopenharmony_ci	{ "Sidetone Mux", NULL, "Sidetone Power" },
416362306a36Sopenharmony_ci
416462306a36Sopenharmony_ci	{ "Stereo DAC MIXL", "ST L Switch", "Sidetone Mux" },
416562306a36Sopenharmony_ci	{ "Stereo DAC MIXL", "DAC1 L Switch", "DAC1 MIXL" },
416662306a36Sopenharmony_ci	{ "Stereo DAC MIXL", "DAC2 L Switch", "DAC2 L Mux" },
416762306a36Sopenharmony_ci	{ "Stereo DAC MIXL", "DAC1 R Switch", "DAC1 MIXR" },
416862306a36Sopenharmony_ci	{ "Stereo DAC MIXL", NULL, "dac stereo1 filter" },
416962306a36Sopenharmony_ci	{ "Stereo DAC MIXR", "ST R Switch", "Sidetone Mux" },
417062306a36Sopenharmony_ci	{ "Stereo DAC MIXR", "DAC1 R Switch", "DAC1 MIXR" },
417162306a36Sopenharmony_ci	{ "Stereo DAC MIXR", "DAC2 R Switch", "DAC2 R Mux" },
417262306a36Sopenharmony_ci	{ "Stereo DAC MIXR", "DAC1 L Switch", "DAC1 MIXL" },
417362306a36Sopenharmony_ci	{ "Stereo DAC MIXR", NULL, "dac stereo1 filter" },
417462306a36Sopenharmony_ci	{ "dac stereo1 filter", NULL, "PLL1", is_sys_clk_from_pll },
417562306a36Sopenharmony_ci
417662306a36Sopenharmony_ci	{ "Mono DAC MIXL", "ST L Switch", "Sidetone Mux" },
417762306a36Sopenharmony_ci	{ "Mono DAC MIXL", "DAC1 L Switch", "DAC1 MIXL" },
417862306a36Sopenharmony_ci	{ "Mono DAC MIXL", "DAC2 L Switch", "DAC2 L Mux" },
417962306a36Sopenharmony_ci	{ "Mono DAC MIXL", "DAC2 R Switch", "DAC2 R Mux" },
418062306a36Sopenharmony_ci	{ "Mono DAC MIXL", NULL, "dac mono2 left filter" },
418162306a36Sopenharmony_ci	{ "dac mono2 left filter", NULL, "PLL1", is_sys_clk_from_pll },
418262306a36Sopenharmony_ci	{ "Mono DAC MIXR", "ST R Switch", "Sidetone Mux" },
418362306a36Sopenharmony_ci	{ "Mono DAC MIXR", "DAC1 R Switch", "DAC1 MIXR" },
418462306a36Sopenharmony_ci	{ "Mono DAC MIXR", "DAC2 R Switch", "DAC2 R Mux" },
418562306a36Sopenharmony_ci	{ "Mono DAC MIXR", "DAC2 L Switch", "DAC2 L Mux" },
418662306a36Sopenharmony_ci	{ "Mono DAC MIXR", NULL, "dac mono2 right filter" },
418762306a36Sopenharmony_ci	{ "dac mono2 right filter", NULL, "PLL1", is_sys_clk_from_pll },
418862306a36Sopenharmony_ci
418962306a36Sopenharmony_ci	{ "DD1 MIXL", "Sto DAC Mix L Switch", "Stereo DAC MIXL" },
419062306a36Sopenharmony_ci	{ "DD1 MIXL", "Mono DAC Mix L Switch", "Mono DAC MIXL" },
419162306a36Sopenharmony_ci	{ "DD1 MIXL", "DAC3 L Switch", "DAC3 L Mux" },
419262306a36Sopenharmony_ci	{ "DD1 MIXL", "DAC3 R Switch", "DAC3 R Mux" },
419362306a36Sopenharmony_ci	{ "DD1 MIXL", NULL, "dac mono3 left filter" },
419462306a36Sopenharmony_ci	{ "dac mono3 left filter", NULL, "PLL1", is_sys_clk_from_pll },
419562306a36Sopenharmony_ci	{ "DD1 MIXR", "Sto DAC Mix R Switch", "Stereo DAC MIXR" },
419662306a36Sopenharmony_ci	{ "DD1 MIXR", "Mono DAC Mix R Switch", "Mono DAC MIXR" },
419762306a36Sopenharmony_ci	{ "DD1 MIXR", "DAC3 L Switch", "DAC3 L Mux" },
419862306a36Sopenharmony_ci	{ "DD1 MIXR", "DAC3 R Switch", "DAC3 R Mux" },
419962306a36Sopenharmony_ci	{ "DD1 MIXR", NULL, "dac mono3 right filter" },
420062306a36Sopenharmony_ci	{ "dac mono3 right filter", NULL, "PLL1", is_sys_clk_from_pll },
420162306a36Sopenharmony_ci
420262306a36Sopenharmony_ci	{ "DD2 MIXL", "Sto DAC Mix L Switch", "Stereo DAC MIXL" },
420362306a36Sopenharmony_ci	{ "DD2 MIXL", "Mono DAC Mix L Switch", "Mono DAC MIXL" },
420462306a36Sopenharmony_ci	{ "DD2 MIXL", "DAC4 L Switch", "DAC4 L Mux" },
420562306a36Sopenharmony_ci	{ "DD2 MIXL", "DAC4 R Switch", "DAC4 R Mux" },
420662306a36Sopenharmony_ci	{ "DD2 MIXL", NULL, "dac mono4 left filter" },
420762306a36Sopenharmony_ci	{ "dac mono4 left filter", NULL, "PLL1", is_sys_clk_from_pll },
420862306a36Sopenharmony_ci	{ "DD2 MIXR", "Sto DAC Mix R Switch", "Stereo DAC MIXR" },
420962306a36Sopenharmony_ci	{ "DD2 MIXR", "Mono DAC Mix R Switch", "Mono DAC MIXR" },
421062306a36Sopenharmony_ci	{ "DD2 MIXR", "DAC4 L Switch", "DAC4 L Mux" },
421162306a36Sopenharmony_ci	{ "DD2 MIXR", "DAC4 R Switch", "DAC4 R Mux" },
421262306a36Sopenharmony_ci	{ "DD2 MIXR", NULL, "dac mono4 right filter" },
421362306a36Sopenharmony_ci	{ "dac mono4 right filter", NULL, "PLL1", is_sys_clk_from_pll },
421462306a36Sopenharmony_ci
421562306a36Sopenharmony_ci	{ "Stereo DAC MIX", NULL, "Stereo DAC MIXL" },
421662306a36Sopenharmony_ci	{ "Stereo DAC MIX", NULL, "Stereo DAC MIXR" },
421762306a36Sopenharmony_ci	{ "Mono DAC MIX", NULL, "Mono DAC MIXL" },
421862306a36Sopenharmony_ci	{ "Mono DAC MIX", NULL, "Mono DAC MIXR" },
421962306a36Sopenharmony_ci	{ "DD1 MIX", NULL, "DD1 MIXL" },
422062306a36Sopenharmony_ci	{ "DD1 MIX", NULL, "DD1 MIXR" },
422162306a36Sopenharmony_ci	{ "DD2 MIX", NULL, "DD2 MIXL" },
422262306a36Sopenharmony_ci	{ "DD2 MIX", NULL, "DD2 MIXR" },
422362306a36Sopenharmony_ci
422462306a36Sopenharmony_ci	{ "DAC12 SRC Mux", "STO1 DAC MIX", "Stereo DAC MIX" },
422562306a36Sopenharmony_ci	{ "DAC12 SRC Mux", "MONO DAC MIX", "Mono DAC MIX" },
422662306a36Sopenharmony_ci	{ "DAC12 SRC Mux", "DD MIX1", "DD1 MIX" },
422762306a36Sopenharmony_ci	{ "DAC12 SRC Mux", "DD MIX2", "DD2 MIX" },
422862306a36Sopenharmony_ci
422962306a36Sopenharmony_ci	{ "DAC3 SRC Mux", "MONO DAC MIXL", "Mono DAC MIXL" },
423062306a36Sopenharmony_ci	{ "DAC3 SRC Mux", "MONO DAC MIXR", "Mono DAC MIXR" },
423162306a36Sopenharmony_ci	{ "DAC3 SRC Mux", "DD MIX1L", "DD1 MIXL" },
423262306a36Sopenharmony_ci	{ "DAC3 SRC Mux", "DD MIX2L", "DD2 MIXL" },
423362306a36Sopenharmony_ci
423462306a36Sopenharmony_ci	{ "DAC 1", NULL, "DAC12 SRC Mux" },
423562306a36Sopenharmony_ci	{ "DAC 2", NULL, "DAC12 SRC Mux" },
423662306a36Sopenharmony_ci	{ "DAC 3", NULL, "DAC3 SRC Mux" },
423762306a36Sopenharmony_ci
423862306a36Sopenharmony_ci	{ "PDM1 L Mux", "STO1 DAC MIX", "Stereo DAC MIXL" },
423962306a36Sopenharmony_ci	{ "PDM1 L Mux", "MONO DAC MIX", "Mono DAC MIXL" },
424062306a36Sopenharmony_ci	{ "PDM1 L Mux", "DD MIX1", "DD1 MIXL" },
424162306a36Sopenharmony_ci	{ "PDM1 L Mux", "DD MIX2", "DD2 MIXL" },
424262306a36Sopenharmony_ci	{ "PDM1 L Mux", NULL, "PDM1 Power" },
424362306a36Sopenharmony_ci	{ "PDM1 R Mux", "STO1 DAC MIX", "Stereo DAC MIXR" },
424462306a36Sopenharmony_ci	{ "PDM1 R Mux", "MONO DAC MIX", "Mono DAC MIXR" },
424562306a36Sopenharmony_ci	{ "PDM1 R Mux", "DD MIX1", "DD1 MIXR" },
424662306a36Sopenharmony_ci	{ "PDM1 R Mux", "DD MIX2", "DD2 MIXR" },
424762306a36Sopenharmony_ci	{ "PDM1 R Mux", NULL, "PDM1 Power" },
424862306a36Sopenharmony_ci	{ "PDM2 L Mux", "STO1 DAC MIX", "Stereo DAC MIXL" },
424962306a36Sopenharmony_ci	{ "PDM2 L Mux", "MONO DAC MIX", "Mono DAC MIXL" },
425062306a36Sopenharmony_ci	{ "PDM2 L Mux", "DD MIX1", "DD1 MIXL" },
425162306a36Sopenharmony_ci	{ "PDM2 L Mux", "DD MIX2", "DD2 MIXL" },
425262306a36Sopenharmony_ci	{ "PDM2 L Mux", NULL, "PDM2 Power" },
425362306a36Sopenharmony_ci	{ "PDM2 R Mux", "STO1 DAC MIX", "Stereo DAC MIXR" },
425462306a36Sopenharmony_ci	{ "PDM2 R Mux", "MONO DAC MIX", "Mono DAC MIXR" },
425562306a36Sopenharmony_ci	{ "PDM2 R Mux", "DD MIX1", "DD1 MIXR" },
425662306a36Sopenharmony_ci	{ "PDM2 R Mux", "DD MIX1", "DD2 MIXR" },
425762306a36Sopenharmony_ci	{ "PDM2 R Mux", NULL, "PDM2 Power" },
425862306a36Sopenharmony_ci
425962306a36Sopenharmony_ci	{ "LOUT1 amp", NULL, "DAC 1" },
426062306a36Sopenharmony_ci	{ "LOUT2 amp", NULL, "DAC 2" },
426162306a36Sopenharmony_ci	{ "LOUT3 amp", NULL, "DAC 3" },
426262306a36Sopenharmony_ci
426362306a36Sopenharmony_ci	{ "LOUT1 vref", NULL, "LOUT1 amp" },
426462306a36Sopenharmony_ci	{ "LOUT2 vref", NULL, "LOUT2 amp" },
426562306a36Sopenharmony_ci	{ "LOUT3 vref", NULL, "LOUT3 amp" },
426662306a36Sopenharmony_ci
426762306a36Sopenharmony_ci	{ "LOUT1", NULL, "LOUT1 vref" },
426862306a36Sopenharmony_ci	{ "LOUT2", NULL, "LOUT2 vref" },
426962306a36Sopenharmony_ci	{ "LOUT3", NULL, "LOUT3 vref" },
427062306a36Sopenharmony_ci
427162306a36Sopenharmony_ci	{ "PDM1L", NULL, "PDM1 L Mux" },
427262306a36Sopenharmony_ci	{ "PDM1R", NULL, "PDM1 R Mux" },
427362306a36Sopenharmony_ci	{ "PDM2L", NULL, "PDM2 L Mux" },
427462306a36Sopenharmony_ci	{ "PDM2R", NULL, "PDM2 R Mux" },
427562306a36Sopenharmony_ci};
427662306a36Sopenharmony_ci
427762306a36Sopenharmony_cistatic const struct snd_soc_dapm_route rt5677_dmic2_clk_1[] = {
427862306a36Sopenharmony_ci	{ "DMIC L2", NULL, "DMIC1 power" },
427962306a36Sopenharmony_ci	{ "DMIC R2", NULL, "DMIC1 power" },
428062306a36Sopenharmony_ci};
428162306a36Sopenharmony_ci
428262306a36Sopenharmony_cistatic const struct snd_soc_dapm_route rt5677_dmic2_clk_2[] = {
428362306a36Sopenharmony_ci	{ "DMIC L2", NULL, "DMIC2 power" },
428462306a36Sopenharmony_ci	{ "DMIC R2", NULL, "DMIC2 power" },
428562306a36Sopenharmony_ci};
428662306a36Sopenharmony_ci
428762306a36Sopenharmony_cistatic int rt5677_hw_params(struct snd_pcm_substream *substream,
428862306a36Sopenharmony_ci	struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
428962306a36Sopenharmony_ci{
429062306a36Sopenharmony_ci	struct snd_soc_component *component = dai->component;
429162306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
429262306a36Sopenharmony_ci	unsigned int val_len = 0, val_clk, mask_clk;
429362306a36Sopenharmony_ci	int pre_div, bclk_ms, frame_size;
429462306a36Sopenharmony_ci
429562306a36Sopenharmony_ci	rt5677->lrck[dai->id] = params_rate(params);
429662306a36Sopenharmony_ci	pre_div = rl6231_get_clk_info(rt5677->sysclk, rt5677->lrck[dai->id]);
429762306a36Sopenharmony_ci	if (pre_div < 0) {
429862306a36Sopenharmony_ci		dev_err(component->dev, "Unsupported clock setting: sysclk=%dHz lrck=%dHz\n",
429962306a36Sopenharmony_ci			rt5677->sysclk, rt5677->lrck[dai->id]);
430062306a36Sopenharmony_ci		return -EINVAL;
430162306a36Sopenharmony_ci	}
430262306a36Sopenharmony_ci	frame_size = snd_soc_params_to_frame_size(params);
430362306a36Sopenharmony_ci	if (frame_size < 0) {
430462306a36Sopenharmony_ci		dev_err(component->dev, "Unsupported frame size: %d\n", frame_size);
430562306a36Sopenharmony_ci		return -EINVAL;
430662306a36Sopenharmony_ci	}
430762306a36Sopenharmony_ci	bclk_ms = frame_size > 32;
430862306a36Sopenharmony_ci	rt5677->bclk[dai->id] = rt5677->lrck[dai->id] * (32 << bclk_ms);
430962306a36Sopenharmony_ci
431062306a36Sopenharmony_ci	dev_dbg(dai->dev, "bclk is %dHz and lrck is %dHz\n",
431162306a36Sopenharmony_ci		rt5677->bclk[dai->id], rt5677->lrck[dai->id]);
431262306a36Sopenharmony_ci	dev_dbg(dai->dev, "bclk_ms is %d and pre_div is %d for iis %d\n",
431362306a36Sopenharmony_ci				bclk_ms, pre_div, dai->id);
431462306a36Sopenharmony_ci
431562306a36Sopenharmony_ci	switch (params_width(params)) {
431662306a36Sopenharmony_ci	case 16:
431762306a36Sopenharmony_ci		break;
431862306a36Sopenharmony_ci	case 20:
431962306a36Sopenharmony_ci		val_len |= RT5677_I2S_DL_20;
432062306a36Sopenharmony_ci		break;
432162306a36Sopenharmony_ci	case 24:
432262306a36Sopenharmony_ci		val_len |= RT5677_I2S_DL_24;
432362306a36Sopenharmony_ci		break;
432462306a36Sopenharmony_ci	case 8:
432562306a36Sopenharmony_ci		val_len |= RT5677_I2S_DL_8;
432662306a36Sopenharmony_ci		break;
432762306a36Sopenharmony_ci	default:
432862306a36Sopenharmony_ci		return -EINVAL;
432962306a36Sopenharmony_ci	}
433062306a36Sopenharmony_ci
433162306a36Sopenharmony_ci	switch (dai->id) {
433262306a36Sopenharmony_ci	case RT5677_AIF1:
433362306a36Sopenharmony_ci		mask_clk = RT5677_I2S_PD1_MASK;
433462306a36Sopenharmony_ci		val_clk = pre_div << RT5677_I2S_PD1_SFT;
433562306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_I2S1_SDP,
433662306a36Sopenharmony_ci			RT5677_I2S_DL_MASK, val_len);
433762306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_CLK_TREE_CTRL1,
433862306a36Sopenharmony_ci			mask_clk, val_clk);
433962306a36Sopenharmony_ci		break;
434062306a36Sopenharmony_ci	case RT5677_AIF2:
434162306a36Sopenharmony_ci		mask_clk = RT5677_I2S_PD2_MASK;
434262306a36Sopenharmony_ci		val_clk = pre_div << RT5677_I2S_PD2_SFT;
434362306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_I2S2_SDP,
434462306a36Sopenharmony_ci			RT5677_I2S_DL_MASK, val_len);
434562306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_CLK_TREE_CTRL1,
434662306a36Sopenharmony_ci			mask_clk, val_clk);
434762306a36Sopenharmony_ci		break;
434862306a36Sopenharmony_ci	case RT5677_AIF3:
434962306a36Sopenharmony_ci		mask_clk = RT5677_I2S_BCLK_MS3_MASK | RT5677_I2S_PD3_MASK;
435062306a36Sopenharmony_ci		val_clk = bclk_ms << RT5677_I2S_BCLK_MS3_SFT |
435162306a36Sopenharmony_ci			pre_div << RT5677_I2S_PD3_SFT;
435262306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_I2S3_SDP,
435362306a36Sopenharmony_ci			RT5677_I2S_DL_MASK, val_len);
435462306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_CLK_TREE_CTRL1,
435562306a36Sopenharmony_ci			mask_clk, val_clk);
435662306a36Sopenharmony_ci		break;
435762306a36Sopenharmony_ci	case RT5677_AIF4:
435862306a36Sopenharmony_ci		mask_clk = RT5677_I2S_BCLK_MS4_MASK | RT5677_I2S_PD4_MASK;
435962306a36Sopenharmony_ci		val_clk = bclk_ms << RT5677_I2S_BCLK_MS4_SFT |
436062306a36Sopenharmony_ci			pre_div << RT5677_I2S_PD4_SFT;
436162306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_I2S4_SDP,
436262306a36Sopenharmony_ci			RT5677_I2S_DL_MASK, val_len);
436362306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_CLK_TREE_CTRL1,
436462306a36Sopenharmony_ci			mask_clk, val_clk);
436562306a36Sopenharmony_ci		break;
436662306a36Sopenharmony_ci	default:
436762306a36Sopenharmony_ci		break;
436862306a36Sopenharmony_ci	}
436962306a36Sopenharmony_ci
437062306a36Sopenharmony_ci	return 0;
437162306a36Sopenharmony_ci}
437262306a36Sopenharmony_ci
437362306a36Sopenharmony_cistatic int rt5677_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
437462306a36Sopenharmony_ci{
437562306a36Sopenharmony_ci	struct snd_soc_component *component = dai->component;
437662306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
437762306a36Sopenharmony_ci	unsigned int reg_val = 0;
437862306a36Sopenharmony_ci
437962306a36Sopenharmony_ci	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
438062306a36Sopenharmony_ci	case SND_SOC_DAIFMT_CBM_CFM:
438162306a36Sopenharmony_ci		rt5677->master[dai->id] = 1;
438262306a36Sopenharmony_ci		break;
438362306a36Sopenharmony_ci	case SND_SOC_DAIFMT_CBS_CFS:
438462306a36Sopenharmony_ci		reg_val |= RT5677_I2S_MS_S;
438562306a36Sopenharmony_ci		rt5677->master[dai->id] = 0;
438662306a36Sopenharmony_ci		break;
438762306a36Sopenharmony_ci	default:
438862306a36Sopenharmony_ci		return -EINVAL;
438962306a36Sopenharmony_ci	}
439062306a36Sopenharmony_ci
439162306a36Sopenharmony_ci	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
439262306a36Sopenharmony_ci	case SND_SOC_DAIFMT_NB_NF:
439362306a36Sopenharmony_ci		break;
439462306a36Sopenharmony_ci	case SND_SOC_DAIFMT_IB_NF:
439562306a36Sopenharmony_ci		reg_val |= RT5677_I2S_BP_INV;
439662306a36Sopenharmony_ci		break;
439762306a36Sopenharmony_ci	default:
439862306a36Sopenharmony_ci		return -EINVAL;
439962306a36Sopenharmony_ci	}
440062306a36Sopenharmony_ci
440162306a36Sopenharmony_ci	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
440262306a36Sopenharmony_ci	case SND_SOC_DAIFMT_I2S:
440362306a36Sopenharmony_ci		break;
440462306a36Sopenharmony_ci	case SND_SOC_DAIFMT_LEFT_J:
440562306a36Sopenharmony_ci		reg_val |= RT5677_I2S_DF_LEFT;
440662306a36Sopenharmony_ci		break;
440762306a36Sopenharmony_ci	case SND_SOC_DAIFMT_DSP_A:
440862306a36Sopenharmony_ci		reg_val |= RT5677_I2S_DF_PCM_A;
440962306a36Sopenharmony_ci		break;
441062306a36Sopenharmony_ci	case SND_SOC_DAIFMT_DSP_B:
441162306a36Sopenharmony_ci		reg_val |= RT5677_I2S_DF_PCM_B;
441262306a36Sopenharmony_ci		break;
441362306a36Sopenharmony_ci	default:
441462306a36Sopenharmony_ci		return -EINVAL;
441562306a36Sopenharmony_ci	}
441662306a36Sopenharmony_ci
441762306a36Sopenharmony_ci	switch (dai->id) {
441862306a36Sopenharmony_ci	case RT5677_AIF1:
441962306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_I2S1_SDP,
442062306a36Sopenharmony_ci			RT5677_I2S_MS_MASK | RT5677_I2S_BP_MASK |
442162306a36Sopenharmony_ci			RT5677_I2S_DF_MASK, reg_val);
442262306a36Sopenharmony_ci		break;
442362306a36Sopenharmony_ci	case RT5677_AIF2:
442462306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_I2S2_SDP,
442562306a36Sopenharmony_ci			RT5677_I2S_MS_MASK | RT5677_I2S_BP_MASK |
442662306a36Sopenharmony_ci			RT5677_I2S_DF_MASK, reg_val);
442762306a36Sopenharmony_ci		break;
442862306a36Sopenharmony_ci	case RT5677_AIF3:
442962306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_I2S3_SDP,
443062306a36Sopenharmony_ci			RT5677_I2S_MS_MASK | RT5677_I2S_BP_MASK |
443162306a36Sopenharmony_ci			RT5677_I2S_DF_MASK, reg_val);
443262306a36Sopenharmony_ci		break;
443362306a36Sopenharmony_ci	case RT5677_AIF4:
443462306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_I2S4_SDP,
443562306a36Sopenharmony_ci			RT5677_I2S_MS_MASK | RT5677_I2S_BP_MASK |
443662306a36Sopenharmony_ci			RT5677_I2S_DF_MASK, reg_val);
443762306a36Sopenharmony_ci		break;
443862306a36Sopenharmony_ci	default:
443962306a36Sopenharmony_ci		break;
444062306a36Sopenharmony_ci	}
444162306a36Sopenharmony_ci
444262306a36Sopenharmony_ci
444362306a36Sopenharmony_ci	return 0;
444462306a36Sopenharmony_ci}
444562306a36Sopenharmony_ci
444662306a36Sopenharmony_cistatic int rt5677_set_dai_sysclk(struct snd_soc_dai *dai,
444762306a36Sopenharmony_ci		int clk_id, unsigned int freq, int dir)
444862306a36Sopenharmony_ci{
444962306a36Sopenharmony_ci	struct snd_soc_component *component = dai->component;
445062306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
445162306a36Sopenharmony_ci	unsigned int reg_val = 0;
445262306a36Sopenharmony_ci
445362306a36Sopenharmony_ci	if (freq == rt5677->sysclk && clk_id == rt5677->sysclk_src)
445462306a36Sopenharmony_ci		return 0;
445562306a36Sopenharmony_ci
445662306a36Sopenharmony_ci	switch (clk_id) {
445762306a36Sopenharmony_ci	case RT5677_SCLK_S_MCLK:
445862306a36Sopenharmony_ci		reg_val |= RT5677_SCLK_SRC_MCLK;
445962306a36Sopenharmony_ci		break;
446062306a36Sopenharmony_ci	case RT5677_SCLK_S_PLL1:
446162306a36Sopenharmony_ci		reg_val |= RT5677_SCLK_SRC_PLL1;
446262306a36Sopenharmony_ci		break;
446362306a36Sopenharmony_ci	case RT5677_SCLK_S_RCCLK:
446462306a36Sopenharmony_ci		reg_val |= RT5677_SCLK_SRC_RCCLK;
446562306a36Sopenharmony_ci		break;
446662306a36Sopenharmony_ci	default:
446762306a36Sopenharmony_ci		dev_err(component->dev, "Invalid clock id (%d)\n", clk_id);
446862306a36Sopenharmony_ci		return -EINVAL;
446962306a36Sopenharmony_ci	}
447062306a36Sopenharmony_ci	regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK1,
447162306a36Sopenharmony_ci		RT5677_SCLK_SRC_MASK, reg_val);
447262306a36Sopenharmony_ci	rt5677->sysclk = freq;
447362306a36Sopenharmony_ci	rt5677->sysclk_src = clk_id;
447462306a36Sopenharmony_ci
447562306a36Sopenharmony_ci	dev_dbg(dai->dev, "Sysclk is %dHz and clock id is %d\n", freq, clk_id);
447662306a36Sopenharmony_ci
447762306a36Sopenharmony_ci	return 0;
447862306a36Sopenharmony_ci}
447962306a36Sopenharmony_ci
448062306a36Sopenharmony_ci/**
448162306a36Sopenharmony_ci * rt5677_pll_calc - Calcualte PLL M/N/K code.
448262306a36Sopenharmony_ci * @freq_in: external clock provided to codec.
448362306a36Sopenharmony_ci * @freq_out: target clock which codec works on.
448462306a36Sopenharmony_ci * @pll_code: Pointer to structure with M, N, K, bypass K and bypass M flag.
448562306a36Sopenharmony_ci *
448662306a36Sopenharmony_ci * Calcualte M/N/K code and bypass K/M flag to configure PLL for codec.
448762306a36Sopenharmony_ci *
448862306a36Sopenharmony_ci * Returns 0 for success or negative error code.
448962306a36Sopenharmony_ci */
449062306a36Sopenharmony_cistatic int rt5677_pll_calc(const unsigned int freq_in,
449162306a36Sopenharmony_ci	const unsigned int freq_out, struct rl6231_pll_code *pll_code)
449262306a36Sopenharmony_ci{
449362306a36Sopenharmony_ci	if (RT5677_PLL_INP_MIN > freq_in)
449462306a36Sopenharmony_ci		return -EINVAL;
449562306a36Sopenharmony_ci
449662306a36Sopenharmony_ci	return rl6231_pll_calc(freq_in, freq_out, pll_code);
449762306a36Sopenharmony_ci}
449862306a36Sopenharmony_ci
449962306a36Sopenharmony_cistatic int rt5677_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source,
450062306a36Sopenharmony_ci			unsigned int freq_in, unsigned int freq_out)
450162306a36Sopenharmony_ci{
450262306a36Sopenharmony_ci	struct snd_soc_component *component = dai->component;
450362306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
450462306a36Sopenharmony_ci	struct rl6231_pll_code pll_code;
450562306a36Sopenharmony_ci	int ret;
450662306a36Sopenharmony_ci
450762306a36Sopenharmony_ci	if (source == rt5677->pll_src && freq_in == rt5677->pll_in &&
450862306a36Sopenharmony_ci	    freq_out == rt5677->pll_out)
450962306a36Sopenharmony_ci		return 0;
451062306a36Sopenharmony_ci
451162306a36Sopenharmony_ci	if (!freq_in || !freq_out) {
451262306a36Sopenharmony_ci		dev_dbg(component->dev, "PLL disabled\n");
451362306a36Sopenharmony_ci
451462306a36Sopenharmony_ci		rt5677->pll_in = 0;
451562306a36Sopenharmony_ci		rt5677->pll_out = 0;
451662306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK1,
451762306a36Sopenharmony_ci			RT5677_SCLK_SRC_MASK, RT5677_SCLK_SRC_MCLK);
451862306a36Sopenharmony_ci		return 0;
451962306a36Sopenharmony_ci	}
452062306a36Sopenharmony_ci
452162306a36Sopenharmony_ci	switch (source) {
452262306a36Sopenharmony_ci	case RT5677_PLL1_S_MCLK:
452362306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK1,
452462306a36Sopenharmony_ci			RT5677_PLL1_SRC_MASK, RT5677_PLL1_SRC_MCLK);
452562306a36Sopenharmony_ci		break;
452662306a36Sopenharmony_ci	case RT5677_PLL1_S_BCLK1:
452762306a36Sopenharmony_ci	case RT5677_PLL1_S_BCLK2:
452862306a36Sopenharmony_ci	case RT5677_PLL1_S_BCLK3:
452962306a36Sopenharmony_ci	case RT5677_PLL1_S_BCLK4:
453062306a36Sopenharmony_ci		switch (dai->id) {
453162306a36Sopenharmony_ci		case RT5677_AIF1:
453262306a36Sopenharmony_ci			regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK1,
453362306a36Sopenharmony_ci				RT5677_PLL1_SRC_MASK, RT5677_PLL1_SRC_BCLK1);
453462306a36Sopenharmony_ci			break;
453562306a36Sopenharmony_ci		case RT5677_AIF2:
453662306a36Sopenharmony_ci			regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK1,
453762306a36Sopenharmony_ci				RT5677_PLL1_SRC_MASK, RT5677_PLL1_SRC_BCLK2);
453862306a36Sopenharmony_ci			break;
453962306a36Sopenharmony_ci		case RT5677_AIF3:
454062306a36Sopenharmony_ci			regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK1,
454162306a36Sopenharmony_ci				RT5677_PLL1_SRC_MASK, RT5677_PLL1_SRC_BCLK3);
454262306a36Sopenharmony_ci			break;
454362306a36Sopenharmony_ci		case RT5677_AIF4:
454462306a36Sopenharmony_ci			regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK1,
454562306a36Sopenharmony_ci				RT5677_PLL1_SRC_MASK, RT5677_PLL1_SRC_BCLK4);
454662306a36Sopenharmony_ci			break;
454762306a36Sopenharmony_ci		default:
454862306a36Sopenharmony_ci			break;
454962306a36Sopenharmony_ci		}
455062306a36Sopenharmony_ci		break;
455162306a36Sopenharmony_ci	default:
455262306a36Sopenharmony_ci		dev_err(component->dev, "Unknown PLL source %d\n", source);
455362306a36Sopenharmony_ci		return -EINVAL;
455462306a36Sopenharmony_ci	}
455562306a36Sopenharmony_ci
455662306a36Sopenharmony_ci	ret = rt5677_pll_calc(freq_in, freq_out, &pll_code);
455762306a36Sopenharmony_ci	if (ret < 0) {
455862306a36Sopenharmony_ci		dev_err(component->dev, "Unsupported input clock %d\n", freq_in);
455962306a36Sopenharmony_ci		return ret;
456062306a36Sopenharmony_ci	}
456162306a36Sopenharmony_ci
456262306a36Sopenharmony_ci	dev_dbg(component->dev, "m_bypass=%d m=%d n=%d k=%d\n",
456362306a36Sopenharmony_ci		pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code),
456462306a36Sopenharmony_ci		pll_code.n_code, pll_code.k_code);
456562306a36Sopenharmony_ci
456662306a36Sopenharmony_ci	regmap_write(rt5677->regmap, RT5677_PLL1_CTRL1,
456762306a36Sopenharmony_ci		pll_code.n_code << RT5677_PLL_N_SFT | pll_code.k_code);
456862306a36Sopenharmony_ci	regmap_write(rt5677->regmap, RT5677_PLL1_CTRL2,
456962306a36Sopenharmony_ci		((pll_code.m_bp ? 0 : pll_code.m_code) << RT5677_PLL_M_SFT) |
457062306a36Sopenharmony_ci		(pll_code.m_bp << RT5677_PLL_M_BP_SFT));
457162306a36Sopenharmony_ci
457262306a36Sopenharmony_ci	rt5677->pll_in = freq_in;
457362306a36Sopenharmony_ci	rt5677->pll_out = freq_out;
457462306a36Sopenharmony_ci	rt5677->pll_src = source;
457562306a36Sopenharmony_ci
457662306a36Sopenharmony_ci	return 0;
457762306a36Sopenharmony_ci}
457862306a36Sopenharmony_ci
457962306a36Sopenharmony_cistatic int rt5677_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
458062306a36Sopenharmony_ci			unsigned int rx_mask, int slots, int slot_width)
458162306a36Sopenharmony_ci{
458262306a36Sopenharmony_ci	struct snd_soc_component *component = dai->component;
458362306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
458462306a36Sopenharmony_ci	unsigned int val = 0, slot_width_25 = 0;
458562306a36Sopenharmony_ci
458662306a36Sopenharmony_ci	if (rx_mask || tx_mask)
458762306a36Sopenharmony_ci		val |= (1 << 12);
458862306a36Sopenharmony_ci
458962306a36Sopenharmony_ci	switch (slots) {
459062306a36Sopenharmony_ci	case 4:
459162306a36Sopenharmony_ci		val |= (1 << 10);
459262306a36Sopenharmony_ci		break;
459362306a36Sopenharmony_ci	case 6:
459462306a36Sopenharmony_ci		val |= (2 << 10);
459562306a36Sopenharmony_ci		break;
459662306a36Sopenharmony_ci	case 8:
459762306a36Sopenharmony_ci		val |= (3 << 10);
459862306a36Sopenharmony_ci		break;
459962306a36Sopenharmony_ci	case 2:
460062306a36Sopenharmony_ci	default:
460162306a36Sopenharmony_ci		break;
460262306a36Sopenharmony_ci	}
460362306a36Sopenharmony_ci
460462306a36Sopenharmony_ci	switch (slot_width) {
460562306a36Sopenharmony_ci	case 20:
460662306a36Sopenharmony_ci		val |= (1 << 8);
460762306a36Sopenharmony_ci		break;
460862306a36Sopenharmony_ci	case 25:
460962306a36Sopenharmony_ci		slot_width_25 = 0x8080;
461062306a36Sopenharmony_ci		fallthrough;
461162306a36Sopenharmony_ci	case 24:
461262306a36Sopenharmony_ci		val |= (2 << 8);
461362306a36Sopenharmony_ci		break;
461462306a36Sopenharmony_ci	case 32:
461562306a36Sopenharmony_ci		val |= (3 << 8);
461662306a36Sopenharmony_ci		break;
461762306a36Sopenharmony_ci	case 16:
461862306a36Sopenharmony_ci	default:
461962306a36Sopenharmony_ci		break;
462062306a36Sopenharmony_ci	}
462162306a36Sopenharmony_ci
462262306a36Sopenharmony_ci	switch (dai->id) {
462362306a36Sopenharmony_ci	case RT5677_AIF1:
462462306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_TDM1_CTRL1, 0x1f00,
462562306a36Sopenharmony_ci			val);
462662306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_DIG_MISC, 0x8000,
462762306a36Sopenharmony_ci			slot_width_25);
462862306a36Sopenharmony_ci		break;
462962306a36Sopenharmony_ci	case RT5677_AIF2:
463062306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_TDM2_CTRL1, 0x1f00,
463162306a36Sopenharmony_ci			val);
463262306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_DIG_MISC, 0x80,
463362306a36Sopenharmony_ci			slot_width_25);
463462306a36Sopenharmony_ci		break;
463562306a36Sopenharmony_ci	default:
463662306a36Sopenharmony_ci		break;
463762306a36Sopenharmony_ci	}
463862306a36Sopenharmony_ci
463962306a36Sopenharmony_ci	return 0;
464062306a36Sopenharmony_ci}
464162306a36Sopenharmony_ci
464262306a36Sopenharmony_cistatic int rt5677_set_bias_level(struct snd_soc_component *component,
464362306a36Sopenharmony_ci			enum snd_soc_bias_level level)
464462306a36Sopenharmony_ci{
464562306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
464662306a36Sopenharmony_ci	enum snd_soc_bias_level prev_bias =
464762306a36Sopenharmony_ci		snd_soc_component_get_bias_level(component);
464862306a36Sopenharmony_ci
464962306a36Sopenharmony_ci	switch (level) {
465062306a36Sopenharmony_ci	case SND_SOC_BIAS_ON:
465162306a36Sopenharmony_ci		break;
465262306a36Sopenharmony_ci
465362306a36Sopenharmony_ci	case SND_SOC_BIAS_PREPARE:
465462306a36Sopenharmony_ci		if (prev_bias == SND_SOC_BIAS_STANDBY) {
465562306a36Sopenharmony_ci
465662306a36Sopenharmony_ci			regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG1,
465762306a36Sopenharmony_ci				RT5677_LDO1_SEL_MASK | RT5677_LDO2_SEL_MASK,
465862306a36Sopenharmony_ci				5 << RT5677_LDO1_SEL_SFT |
465962306a36Sopenharmony_ci				5 << RT5677_LDO2_SEL_SFT);
466062306a36Sopenharmony_ci			regmap_update_bits(rt5677->regmap,
466162306a36Sopenharmony_ci				RT5677_PR_BASE + RT5677_BIAS_CUR4,
466262306a36Sopenharmony_ci				0x0f00, 0x0f00);
466362306a36Sopenharmony_ci			regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG1,
466462306a36Sopenharmony_ci				RT5677_PWR_FV1 | RT5677_PWR_FV2 |
466562306a36Sopenharmony_ci				RT5677_PWR_VREF1 | RT5677_PWR_MB |
466662306a36Sopenharmony_ci				RT5677_PWR_BG | RT5677_PWR_VREF2,
466762306a36Sopenharmony_ci				RT5677_PWR_VREF1 | RT5677_PWR_MB |
466862306a36Sopenharmony_ci				RT5677_PWR_BG | RT5677_PWR_VREF2);
466962306a36Sopenharmony_ci			rt5677->is_vref_slow = false;
467062306a36Sopenharmony_ci			regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,
467162306a36Sopenharmony_ci				RT5677_PWR_CORE, RT5677_PWR_CORE);
467262306a36Sopenharmony_ci			regmap_update_bits(rt5677->regmap, RT5677_DIG_MISC,
467362306a36Sopenharmony_ci				0x1, 0x1);
467462306a36Sopenharmony_ci		}
467562306a36Sopenharmony_ci		break;
467662306a36Sopenharmony_ci
467762306a36Sopenharmony_ci	case SND_SOC_BIAS_STANDBY:
467862306a36Sopenharmony_ci		if (prev_bias == SND_SOC_BIAS_OFF &&
467962306a36Sopenharmony_ci				rt5677->dsp_vad_en_request) {
468062306a36Sopenharmony_ci			/* Re-enable the DSP if it was turned off at suspend */
468162306a36Sopenharmony_ci			rt5677->dsp_vad_en = true;
468262306a36Sopenharmony_ci			/* The delay is to wait for MCLK */
468362306a36Sopenharmony_ci			schedule_delayed_work(&rt5677->dsp_work,
468462306a36Sopenharmony_ci					msecs_to_jiffies(1000));
468562306a36Sopenharmony_ci		}
468662306a36Sopenharmony_ci		break;
468762306a36Sopenharmony_ci
468862306a36Sopenharmony_ci	case SND_SOC_BIAS_OFF:
468962306a36Sopenharmony_ci		flush_delayed_work(&rt5677->dsp_work);
469062306a36Sopenharmony_ci		if (rt5677->is_dsp_mode) {
469162306a36Sopenharmony_ci			/* Turn off the DSP before suspend */
469262306a36Sopenharmony_ci			rt5677->dsp_vad_en = false;
469362306a36Sopenharmony_ci			schedule_delayed_work(&rt5677->dsp_work, 0);
469462306a36Sopenharmony_ci			flush_delayed_work(&rt5677->dsp_work);
469562306a36Sopenharmony_ci		}
469662306a36Sopenharmony_ci
469762306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_DIG_MISC, 0x1, 0x0);
469862306a36Sopenharmony_ci		regmap_write(rt5677->regmap, RT5677_PWR_DIG1, 0x0000);
469962306a36Sopenharmony_ci		regmap_write(rt5677->regmap, RT5677_PWR_ANLG1,
470062306a36Sopenharmony_ci			2 << RT5677_LDO1_SEL_SFT |
470162306a36Sopenharmony_ci			2 << RT5677_LDO2_SEL_SFT);
470262306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,
470362306a36Sopenharmony_ci			RT5677_PWR_CORE, 0);
470462306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap,
470562306a36Sopenharmony_ci			RT5677_PR_BASE + RT5677_BIAS_CUR4, 0x0f00, 0x0000);
470662306a36Sopenharmony_ci
470762306a36Sopenharmony_ci		if (rt5677->dsp_vad_en)
470862306a36Sopenharmony_ci			rt5677_set_dsp_vad(component, true);
470962306a36Sopenharmony_ci		break;
471062306a36Sopenharmony_ci
471162306a36Sopenharmony_ci	default:
471262306a36Sopenharmony_ci		break;
471362306a36Sopenharmony_ci	}
471462306a36Sopenharmony_ci
471562306a36Sopenharmony_ci	return 0;
471662306a36Sopenharmony_ci}
471762306a36Sopenharmony_ci
471862306a36Sopenharmony_cistatic int rt5677_update_gpio_bits(struct rt5677_priv *rt5677, unsigned offset, int m, int v)
471962306a36Sopenharmony_ci{
472062306a36Sopenharmony_ci	unsigned int bank = offset / 5;
472162306a36Sopenharmony_ci	unsigned int shift = (offset % 5) * 3;
472262306a36Sopenharmony_ci	unsigned int reg = bank ? RT5677_GPIO_CTRL3 : RT5677_GPIO_CTRL2;
472362306a36Sopenharmony_ci
472462306a36Sopenharmony_ci	return regmap_update_bits(rt5677->regmap, reg, m << shift, v << shift);
472562306a36Sopenharmony_ci}
472662306a36Sopenharmony_ci
472762306a36Sopenharmony_ci#ifdef CONFIG_GPIOLIB
472862306a36Sopenharmony_cistatic void rt5677_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
472962306a36Sopenharmony_ci{
473062306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = gpiochip_get_data(chip);
473162306a36Sopenharmony_ci	int level = value ? RT5677_GPIOx_OUT_HI : RT5677_GPIOx_OUT_LO;
473262306a36Sopenharmony_ci	int m = RT5677_GPIOx_OUT_MASK;
473362306a36Sopenharmony_ci
473462306a36Sopenharmony_ci	rt5677_update_gpio_bits(rt5677, offset, m, level);
473562306a36Sopenharmony_ci}
473662306a36Sopenharmony_ci
473762306a36Sopenharmony_cistatic int rt5677_gpio_direction_out(struct gpio_chip *chip,
473862306a36Sopenharmony_ci				     unsigned offset, int value)
473962306a36Sopenharmony_ci{
474062306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = gpiochip_get_data(chip);
474162306a36Sopenharmony_ci	int level = value ? RT5677_GPIOx_OUT_HI : RT5677_GPIOx_OUT_LO;
474262306a36Sopenharmony_ci	int m = RT5677_GPIOx_DIR_MASK | RT5677_GPIOx_OUT_MASK;
474362306a36Sopenharmony_ci	int v = RT5677_GPIOx_DIR_OUT | level;
474462306a36Sopenharmony_ci
474562306a36Sopenharmony_ci	return rt5677_update_gpio_bits(rt5677, offset, m, v);
474662306a36Sopenharmony_ci}
474762306a36Sopenharmony_ci
474862306a36Sopenharmony_cistatic int rt5677_gpio_get(struct gpio_chip *chip, unsigned offset)
474962306a36Sopenharmony_ci{
475062306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = gpiochip_get_data(chip);
475162306a36Sopenharmony_ci	int value, ret;
475262306a36Sopenharmony_ci
475362306a36Sopenharmony_ci	ret = regmap_read(rt5677->regmap, RT5677_GPIO_ST, &value);
475462306a36Sopenharmony_ci	if (ret < 0)
475562306a36Sopenharmony_ci		return ret;
475662306a36Sopenharmony_ci
475762306a36Sopenharmony_ci	return (value & (0x1 << offset)) >> offset;
475862306a36Sopenharmony_ci}
475962306a36Sopenharmony_ci
476062306a36Sopenharmony_cistatic int rt5677_gpio_direction_in(struct gpio_chip *chip, unsigned offset)
476162306a36Sopenharmony_ci{
476262306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = gpiochip_get_data(chip);
476362306a36Sopenharmony_ci	int m = RT5677_GPIOx_DIR_MASK;
476462306a36Sopenharmony_ci	int v = RT5677_GPIOx_DIR_IN;
476562306a36Sopenharmony_ci
476662306a36Sopenharmony_ci	return rt5677_update_gpio_bits(rt5677, offset, m, v);
476762306a36Sopenharmony_ci}
476862306a36Sopenharmony_ci
476962306a36Sopenharmony_ci/*
477062306a36Sopenharmony_ci * Configures the GPIO as
477162306a36Sopenharmony_ci *   0 - floating
477262306a36Sopenharmony_ci *   1 - pull down
477362306a36Sopenharmony_ci *   2 - pull up
477462306a36Sopenharmony_ci */
477562306a36Sopenharmony_cistatic void rt5677_gpio_config(struct rt5677_priv *rt5677, unsigned offset,
477662306a36Sopenharmony_ci		int value)
477762306a36Sopenharmony_ci{
477862306a36Sopenharmony_ci	int shift;
477962306a36Sopenharmony_ci
478062306a36Sopenharmony_ci	switch (offset) {
478162306a36Sopenharmony_ci	case RT5677_GPIO1 ... RT5677_GPIO2:
478262306a36Sopenharmony_ci		shift = 2 * (1 - offset);
478362306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap,
478462306a36Sopenharmony_ci			RT5677_PR_BASE + RT5677_DIG_IN_PIN_ST_CTRL2,
478562306a36Sopenharmony_ci			0x3 << shift,
478662306a36Sopenharmony_ci			(value & 0x3) << shift);
478762306a36Sopenharmony_ci		break;
478862306a36Sopenharmony_ci
478962306a36Sopenharmony_ci	case RT5677_GPIO3 ... RT5677_GPIO6:
479062306a36Sopenharmony_ci		shift = 2 * (9 - offset);
479162306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap,
479262306a36Sopenharmony_ci			RT5677_PR_BASE + RT5677_DIG_IN_PIN_ST_CTRL3,
479362306a36Sopenharmony_ci			0x3 << shift,
479462306a36Sopenharmony_ci			(value & 0x3) << shift);
479562306a36Sopenharmony_ci		break;
479662306a36Sopenharmony_ci
479762306a36Sopenharmony_ci	default:
479862306a36Sopenharmony_ci		break;
479962306a36Sopenharmony_ci	}
480062306a36Sopenharmony_ci}
480162306a36Sopenharmony_ci
480262306a36Sopenharmony_cistatic int rt5677_to_irq(struct gpio_chip *chip, unsigned offset)
480362306a36Sopenharmony_ci{
480462306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = gpiochip_get_data(chip);
480562306a36Sopenharmony_ci	int irq;
480662306a36Sopenharmony_ci
480762306a36Sopenharmony_ci	if ((rt5677->pdata.jd1_gpio == 1 && offset == RT5677_GPIO1) ||
480862306a36Sopenharmony_ci		(rt5677->pdata.jd1_gpio == 2 &&
480962306a36Sopenharmony_ci			offset == RT5677_GPIO2) ||
481062306a36Sopenharmony_ci		(rt5677->pdata.jd1_gpio == 3 &&
481162306a36Sopenharmony_ci			offset == RT5677_GPIO3)) {
481262306a36Sopenharmony_ci		irq = RT5677_IRQ_JD1;
481362306a36Sopenharmony_ci	} else if ((rt5677->pdata.jd2_gpio == 1 && offset == RT5677_GPIO4) ||
481462306a36Sopenharmony_ci		(rt5677->pdata.jd2_gpio == 2 &&
481562306a36Sopenharmony_ci			offset == RT5677_GPIO5) ||
481662306a36Sopenharmony_ci		(rt5677->pdata.jd2_gpio == 3 &&
481762306a36Sopenharmony_ci			offset == RT5677_GPIO6)) {
481862306a36Sopenharmony_ci		irq = RT5677_IRQ_JD2;
481962306a36Sopenharmony_ci	} else if ((rt5677->pdata.jd3_gpio == 1 &&
482062306a36Sopenharmony_ci			offset == RT5677_GPIO4) ||
482162306a36Sopenharmony_ci		(rt5677->pdata.jd3_gpio == 2 &&
482262306a36Sopenharmony_ci			offset == RT5677_GPIO5) ||
482362306a36Sopenharmony_ci		(rt5677->pdata.jd3_gpio == 3 &&
482462306a36Sopenharmony_ci			offset == RT5677_GPIO6)) {
482562306a36Sopenharmony_ci		irq = RT5677_IRQ_JD3;
482662306a36Sopenharmony_ci	} else {
482762306a36Sopenharmony_ci		return -ENXIO;
482862306a36Sopenharmony_ci	}
482962306a36Sopenharmony_ci
483062306a36Sopenharmony_ci	return irq_create_mapping(rt5677->domain, irq);
483162306a36Sopenharmony_ci}
483262306a36Sopenharmony_ci
483362306a36Sopenharmony_cistatic const struct gpio_chip rt5677_template_chip = {
483462306a36Sopenharmony_ci	.label			= RT5677_DRV_NAME,
483562306a36Sopenharmony_ci	.owner			= THIS_MODULE,
483662306a36Sopenharmony_ci	.direction_output	= rt5677_gpio_direction_out,
483762306a36Sopenharmony_ci	.set			= rt5677_gpio_set,
483862306a36Sopenharmony_ci	.direction_input	= rt5677_gpio_direction_in,
483962306a36Sopenharmony_ci	.get			= rt5677_gpio_get,
484062306a36Sopenharmony_ci	.to_irq			= rt5677_to_irq,
484162306a36Sopenharmony_ci	.can_sleep		= 1,
484262306a36Sopenharmony_ci};
484362306a36Sopenharmony_ci
484462306a36Sopenharmony_cistatic void rt5677_init_gpio(struct i2c_client *i2c)
484562306a36Sopenharmony_ci{
484662306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = i2c_get_clientdata(i2c);
484762306a36Sopenharmony_ci	int ret;
484862306a36Sopenharmony_ci
484962306a36Sopenharmony_ci	rt5677->gpio_chip = rt5677_template_chip;
485062306a36Sopenharmony_ci	rt5677->gpio_chip.ngpio = RT5677_GPIO_NUM;
485162306a36Sopenharmony_ci	rt5677->gpio_chip.parent = &i2c->dev;
485262306a36Sopenharmony_ci	rt5677->gpio_chip.base = -1;
485362306a36Sopenharmony_ci
485462306a36Sopenharmony_ci	ret = gpiochip_add_data(&rt5677->gpio_chip, rt5677);
485562306a36Sopenharmony_ci	if (ret != 0)
485662306a36Sopenharmony_ci		dev_err(&i2c->dev, "Failed to add GPIOs: %d\n", ret);
485762306a36Sopenharmony_ci}
485862306a36Sopenharmony_ci
485962306a36Sopenharmony_cistatic void rt5677_free_gpio(struct i2c_client *i2c)
486062306a36Sopenharmony_ci{
486162306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = i2c_get_clientdata(i2c);
486262306a36Sopenharmony_ci
486362306a36Sopenharmony_ci	gpiochip_remove(&rt5677->gpio_chip);
486462306a36Sopenharmony_ci}
486562306a36Sopenharmony_ci#else
486662306a36Sopenharmony_cistatic void rt5677_gpio_config(struct rt5677_priv *rt5677, unsigned offset,
486762306a36Sopenharmony_ci		int value)
486862306a36Sopenharmony_ci{
486962306a36Sopenharmony_ci}
487062306a36Sopenharmony_ci
487162306a36Sopenharmony_cistatic void rt5677_init_gpio(struct i2c_client *i2c)
487262306a36Sopenharmony_ci{
487362306a36Sopenharmony_ci}
487462306a36Sopenharmony_ci
487562306a36Sopenharmony_cistatic void rt5677_free_gpio(struct i2c_client *i2c)
487662306a36Sopenharmony_ci{
487762306a36Sopenharmony_ci}
487862306a36Sopenharmony_ci#endif
487962306a36Sopenharmony_ci
488062306a36Sopenharmony_cistatic int rt5677_probe(struct snd_soc_component *component)
488162306a36Sopenharmony_ci{
488262306a36Sopenharmony_ci	struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
488362306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
488462306a36Sopenharmony_ci	int i;
488562306a36Sopenharmony_ci
488662306a36Sopenharmony_ci	rt5677->component = component;
488762306a36Sopenharmony_ci
488862306a36Sopenharmony_ci	if (rt5677->pdata.dmic2_clk_pin == RT5677_DMIC_CLK2) {
488962306a36Sopenharmony_ci		snd_soc_dapm_add_routes(dapm,
489062306a36Sopenharmony_ci			rt5677_dmic2_clk_2,
489162306a36Sopenharmony_ci			ARRAY_SIZE(rt5677_dmic2_clk_2));
489262306a36Sopenharmony_ci	} else { /*use dmic1 clock by default*/
489362306a36Sopenharmony_ci		snd_soc_dapm_add_routes(dapm,
489462306a36Sopenharmony_ci			rt5677_dmic2_clk_1,
489562306a36Sopenharmony_ci			ARRAY_SIZE(rt5677_dmic2_clk_1));
489662306a36Sopenharmony_ci	}
489762306a36Sopenharmony_ci
489862306a36Sopenharmony_ci	snd_soc_component_force_bias_level(component, SND_SOC_BIAS_OFF);
489962306a36Sopenharmony_ci
490062306a36Sopenharmony_ci	regmap_update_bits(rt5677->regmap, RT5677_DIG_MISC,
490162306a36Sopenharmony_ci			~RT5677_IRQ_DEBOUNCE_SEL_MASK, 0x0020);
490262306a36Sopenharmony_ci	regmap_write(rt5677->regmap, RT5677_PWR_DSP2,
490362306a36Sopenharmony_ci			RT5677_PWR_SLIM_ISO | RT5677_PWR_CORE_ISO);
490462306a36Sopenharmony_ci
490562306a36Sopenharmony_ci	for (i = 0; i < RT5677_GPIO_NUM; i++)
490662306a36Sopenharmony_ci		rt5677_gpio_config(rt5677, i, rt5677->pdata.gpio_config[i]);
490762306a36Sopenharmony_ci
490862306a36Sopenharmony_ci	mutex_init(&rt5677->dsp_cmd_lock);
490962306a36Sopenharmony_ci	mutex_init(&rt5677->dsp_pri_lock);
491062306a36Sopenharmony_ci
491162306a36Sopenharmony_ci	return 0;
491262306a36Sopenharmony_ci}
491362306a36Sopenharmony_ci
491462306a36Sopenharmony_cistatic void rt5677_remove(struct snd_soc_component *component)
491562306a36Sopenharmony_ci{
491662306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
491762306a36Sopenharmony_ci
491862306a36Sopenharmony_ci	cancel_delayed_work_sync(&rt5677->dsp_work);
491962306a36Sopenharmony_ci
492062306a36Sopenharmony_ci	regmap_write(rt5677->regmap, RT5677_RESET, 0x10ec);
492162306a36Sopenharmony_ci	gpiod_set_value_cansleep(rt5677->pow_ldo2, 0);
492262306a36Sopenharmony_ci	gpiod_set_value_cansleep(rt5677->reset_pin, 1);
492362306a36Sopenharmony_ci}
492462306a36Sopenharmony_ci
492562306a36Sopenharmony_ci#ifdef CONFIG_PM
492662306a36Sopenharmony_cistatic int rt5677_suspend(struct snd_soc_component *component)
492762306a36Sopenharmony_ci{
492862306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
492962306a36Sopenharmony_ci
493062306a36Sopenharmony_ci	if (rt5677->irq) {
493162306a36Sopenharmony_ci		cancel_delayed_work_sync(&rt5677->resume_irq_check);
493262306a36Sopenharmony_ci		disable_irq(rt5677->irq);
493362306a36Sopenharmony_ci	}
493462306a36Sopenharmony_ci
493562306a36Sopenharmony_ci	if (!rt5677->dsp_vad_en) {
493662306a36Sopenharmony_ci		regcache_cache_only(rt5677->regmap, true);
493762306a36Sopenharmony_ci		regcache_mark_dirty(rt5677->regmap);
493862306a36Sopenharmony_ci
493962306a36Sopenharmony_ci		gpiod_set_value_cansleep(rt5677->pow_ldo2, 0);
494062306a36Sopenharmony_ci		gpiod_set_value_cansleep(rt5677->reset_pin, 1);
494162306a36Sopenharmony_ci	}
494262306a36Sopenharmony_ci
494362306a36Sopenharmony_ci	return 0;
494462306a36Sopenharmony_ci}
494562306a36Sopenharmony_ci
494662306a36Sopenharmony_cistatic int rt5677_resume(struct snd_soc_component *component)
494762306a36Sopenharmony_ci{
494862306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component);
494962306a36Sopenharmony_ci
495062306a36Sopenharmony_ci	if (!rt5677->dsp_vad_en) {
495162306a36Sopenharmony_ci		rt5677->pll_src = 0;
495262306a36Sopenharmony_ci		rt5677->pll_in = 0;
495362306a36Sopenharmony_ci		rt5677->pll_out = 0;
495462306a36Sopenharmony_ci		gpiod_set_value_cansleep(rt5677->pow_ldo2, 1);
495562306a36Sopenharmony_ci		gpiod_set_value_cansleep(rt5677->reset_pin, 0);
495662306a36Sopenharmony_ci		if (rt5677->pow_ldo2 || rt5677->reset_pin)
495762306a36Sopenharmony_ci			msleep(10);
495862306a36Sopenharmony_ci
495962306a36Sopenharmony_ci		regcache_cache_only(rt5677->regmap, false);
496062306a36Sopenharmony_ci		regcache_sync(rt5677->regmap);
496162306a36Sopenharmony_ci	}
496262306a36Sopenharmony_ci
496362306a36Sopenharmony_ci	if (rt5677->irq) {
496462306a36Sopenharmony_ci		enable_irq(rt5677->irq);
496562306a36Sopenharmony_ci		schedule_delayed_work(&rt5677->resume_irq_check, 0);
496662306a36Sopenharmony_ci	}
496762306a36Sopenharmony_ci
496862306a36Sopenharmony_ci	return 0;
496962306a36Sopenharmony_ci}
497062306a36Sopenharmony_ci#else
497162306a36Sopenharmony_ci#define rt5677_suspend NULL
497262306a36Sopenharmony_ci#define rt5677_resume NULL
497362306a36Sopenharmony_ci#endif
497462306a36Sopenharmony_ci
497562306a36Sopenharmony_cistatic int rt5677_read(void *context, unsigned int reg, unsigned int *val)
497662306a36Sopenharmony_ci{
497762306a36Sopenharmony_ci	struct i2c_client *client = context;
497862306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = i2c_get_clientdata(client);
497962306a36Sopenharmony_ci
498062306a36Sopenharmony_ci	if (rt5677->is_dsp_mode) {
498162306a36Sopenharmony_ci		if (reg > 0xff) {
498262306a36Sopenharmony_ci			mutex_lock(&rt5677->dsp_pri_lock);
498362306a36Sopenharmony_ci			rt5677_dsp_mode_i2c_write(rt5677, RT5677_PRIV_INDEX,
498462306a36Sopenharmony_ci				reg & 0xff);
498562306a36Sopenharmony_ci			rt5677_dsp_mode_i2c_read(rt5677, RT5677_PRIV_DATA, val);
498662306a36Sopenharmony_ci			mutex_unlock(&rt5677->dsp_pri_lock);
498762306a36Sopenharmony_ci		} else {
498862306a36Sopenharmony_ci			rt5677_dsp_mode_i2c_read(rt5677, reg, val);
498962306a36Sopenharmony_ci		}
499062306a36Sopenharmony_ci	} else {
499162306a36Sopenharmony_ci		regmap_read(rt5677->regmap_physical, reg, val);
499262306a36Sopenharmony_ci	}
499362306a36Sopenharmony_ci
499462306a36Sopenharmony_ci	return 0;
499562306a36Sopenharmony_ci}
499662306a36Sopenharmony_ci
499762306a36Sopenharmony_cistatic int rt5677_write(void *context, unsigned int reg, unsigned int val)
499862306a36Sopenharmony_ci{
499962306a36Sopenharmony_ci	struct i2c_client *client = context;
500062306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = i2c_get_clientdata(client);
500162306a36Sopenharmony_ci
500262306a36Sopenharmony_ci	if (rt5677->is_dsp_mode) {
500362306a36Sopenharmony_ci		if (reg > 0xff) {
500462306a36Sopenharmony_ci			mutex_lock(&rt5677->dsp_pri_lock);
500562306a36Sopenharmony_ci			rt5677_dsp_mode_i2c_write(rt5677, RT5677_PRIV_INDEX,
500662306a36Sopenharmony_ci				reg & 0xff);
500762306a36Sopenharmony_ci			rt5677_dsp_mode_i2c_write(rt5677, RT5677_PRIV_DATA,
500862306a36Sopenharmony_ci				val);
500962306a36Sopenharmony_ci			mutex_unlock(&rt5677->dsp_pri_lock);
501062306a36Sopenharmony_ci		} else {
501162306a36Sopenharmony_ci			rt5677_dsp_mode_i2c_write(rt5677, reg, val);
501262306a36Sopenharmony_ci		}
501362306a36Sopenharmony_ci	} else {
501462306a36Sopenharmony_ci		regmap_write(rt5677->regmap_physical, reg, val);
501562306a36Sopenharmony_ci	}
501662306a36Sopenharmony_ci
501762306a36Sopenharmony_ci	return 0;
501862306a36Sopenharmony_ci}
501962306a36Sopenharmony_ci
502062306a36Sopenharmony_ci#define RT5677_STEREO_RATES SNDRV_PCM_RATE_8000_96000
502162306a36Sopenharmony_ci#define RT5677_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
502262306a36Sopenharmony_ci			SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8)
502362306a36Sopenharmony_ci
502462306a36Sopenharmony_cistatic const struct snd_soc_dai_ops rt5677_aif_dai_ops = {
502562306a36Sopenharmony_ci	.hw_params = rt5677_hw_params,
502662306a36Sopenharmony_ci	.set_fmt = rt5677_set_dai_fmt,
502762306a36Sopenharmony_ci	.set_sysclk = rt5677_set_dai_sysclk,
502862306a36Sopenharmony_ci	.set_pll = rt5677_set_dai_pll,
502962306a36Sopenharmony_ci	.set_tdm_slot = rt5677_set_tdm_slot,
503062306a36Sopenharmony_ci};
503162306a36Sopenharmony_ci
503262306a36Sopenharmony_cistatic const struct snd_soc_dai_ops rt5677_dsp_dai_ops = {
503362306a36Sopenharmony_ci	.set_sysclk = rt5677_set_dai_sysclk,
503462306a36Sopenharmony_ci	.set_pll = rt5677_set_dai_pll,
503562306a36Sopenharmony_ci};
503662306a36Sopenharmony_ci
503762306a36Sopenharmony_cistatic struct snd_soc_dai_driver rt5677_dai[] = {
503862306a36Sopenharmony_ci	{
503962306a36Sopenharmony_ci		.name = "rt5677-aif1",
504062306a36Sopenharmony_ci		.id = RT5677_AIF1,
504162306a36Sopenharmony_ci		.playback = {
504262306a36Sopenharmony_ci			.stream_name = "AIF1 Playback",
504362306a36Sopenharmony_ci			.channels_min = 1,
504462306a36Sopenharmony_ci			.channels_max = 2,
504562306a36Sopenharmony_ci			.rates = RT5677_STEREO_RATES,
504662306a36Sopenharmony_ci			.formats = RT5677_FORMATS,
504762306a36Sopenharmony_ci		},
504862306a36Sopenharmony_ci		.capture = {
504962306a36Sopenharmony_ci			.stream_name = "AIF1 Capture",
505062306a36Sopenharmony_ci			.channels_min = 1,
505162306a36Sopenharmony_ci			.channels_max = 2,
505262306a36Sopenharmony_ci			.rates = RT5677_STEREO_RATES,
505362306a36Sopenharmony_ci			.formats = RT5677_FORMATS,
505462306a36Sopenharmony_ci		},
505562306a36Sopenharmony_ci		.ops = &rt5677_aif_dai_ops,
505662306a36Sopenharmony_ci	},
505762306a36Sopenharmony_ci	{
505862306a36Sopenharmony_ci		.name = "rt5677-aif2",
505962306a36Sopenharmony_ci		.id = RT5677_AIF2,
506062306a36Sopenharmony_ci		.playback = {
506162306a36Sopenharmony_ci			.stream_name = "AIF2 Playback",
506262306a36Sopenharmony_ci			.channels_min = 1,
506362306a36Sopenharmony_ci			.channels_max = 2,
506462306a36Sopenharmony_ci			.rates = RT5677_STEREO_RATES,
506562306a36Sopenharmony_ci			.formats = RT5677_FORMATS,
506662306a36Sopenharmony_ci		},
506762306a36Sopenharmony_ci		.capture = {
506862306a36Sopenharmony_ci			.stream_name = "AIF2 Capture",
506962306a36Sopenharmony_ci			.channels_min = 1,
507062306a36Sopenharmony_ci			.channels_max = 2,
507162306a36Sopenharmony_ci			.rates = RT5677_STEREO_RATES,
507262306a36Sopenharmony_ci			.formats = RT5677_FORMATS,
507362306a36Sopenharmony_ci		},
507462306a36Sopenharmony_ci		.ops = &rt5677_aif_dai_ops,
507562306a36Sopenharmony_ci	},
507662306a36Sopenharmony_ci	{
507762306a36Sopenharmony_ci		.name = "rt5677-aif3",
507862306a36Sopenharmony_ci		.id = RT5677_AIF3,
507962306a36Sopenharmony_ci		.playback = {
508062306a36Sopenharmony_ci			.stream_name = "AIF3 Playback",
508162306a36Sopenharmony_ci			.channels_min = 1,
508262306a36Sopenharmony_ci			.channels_max = 2,
508362306a36Sopenharmony_ci			.rates = RT5677_STEREO_RATES,
508462306a36Sopenharmony_ci			.formats = RT5677_FORMATS,
508562306a36Sopenharmony_ci		},
508662306a36Sopenharmony_ci		.capture = {
508762306a36Sopenharmony_ci			.stream_name = "AIF3 Capture",
508862306a36Sopenharmony_ci			.channels_min = 1,
508962306a36Sopenharmony_ci			.channels_max = 2,
509062306a36Sopenharmony_ci			.rates = RT5677_STEREO_RATES,
509162306a36Sopenharmony_ci			.formats = RT5677_FORMATS,
509262306a36Sopenharmony_ci		},
509362306a36Sopenharmony_ci		.ops = &rt5677_aif_dai_ops,
509462306a36Sopenharmony_ci	},
509562306a36Sopenharmony_ci	{
509662306a36Sopenharmony_ci		.name = "rt5677-aif4",
509762306a36Sopenharmony_ci		.id = RT5677_AIF4,
509862306a36Sopenharmony_ci		.playback = {
509962306a36Sopenharmony_ci			.stream_name = "AIF4 Playback",
510062306a36Sopenharmony_ci			.channels_min = 1,
510162306a36Sopenharmony_ci			.channels_max = 2,
510262306a36Sopenharmony_ci			.rates = RT5677_STEREO_RATES,
510362306a36Sopenharmony_ci			.formats = RT5677_FORMATS,
510462306a36Sopenharmony_ci		},
510562306a36Sopenharmony_ci		.capture = {
510662306a36Sopenharmony_ci			.stream_name = "AIF4 Capture",
510762306a36Sopenharmony_ci			.channels_min = 1,
510862306a36Sopenharmony_ci			.channels_max = 2,
510962306a36Sopenharmony_ci			.rates = RT5677_STEREO_RATES,
511062306a36Sopenharmony_ci			.formats = RT5677_FORMATS,
511162306a36Sopenharmony_ci		},
511262306a36Sopenharmony_ci		.ops = &rt5677_aif_dai_ops,
511362306a36Sopenharmony_ci	},
511462306a36Sopenharmony_ci	{
511562306a36Sopenharmony_ci		.name = "rt5677-slimbus",
511662306a36Sopenharmony_ci		.id = RT5677_AIF5,
511762306a36Sopenharmony_ci		.playback = {
511862306a36Sopenharmony_ci			.stream_name = "SLIMBus Playback",
511962306a36Sopenharmony_ci			.channels_min = 1,
512062306a36Sopenharmony_ci			.channels_max = 2,
512162306a36Sopenharmony_ci			.rates = RT5677_STEREO_RATES,
512262306a36Sopenharmony_ci			.formats = RT5677_FORMATS,
512362306a36Sopenharmony_ci		},
512462306a36Sopenharmony_ci		.capture = {
512562306a36Sopenharmony_ci			.stream_name = "SLIMBus Capture",
512662306a36Sopenharmony_ci			.channels_min = 1,
512762306a36Sopenharmony_ci			.channels_max = 2,
512862306a36Sopenharmony_ci			.rates = RT5677_STEREO_RATES,
512962306a36Sopenharmony_ci			.formats = RT5677_FORMATS,
513062306a36Sopenharmony_ci		},
513162306a36Sopenharmony_ci		.ops = &rt5677_aif_dai_ops,
513262306a36Sopenharmony_ci	},
513362306a36Sopenharmony_ci	{
513462306a36Sopenharmony_ci		.name = "rt5677-dspbuffer",
513562306a36Sopenharmony_ci		.id = RT5677_DSPBUFF,
513662306a36Sopenharmony_ci		.capture = {
513762306a36Sopenharmony_ci			.stream_name = "DSP Buffer",
513862306a36Sopenharmony_ci			.channels_min = 1,
513962306a36Sopenharmony_ci			.channels_max = 1,
514062306a36Sopenharmony_ci			.rates = SNDRV_PCM_RATE_16000,
514162306a36Sopenharmony_ci			.formats = SNDRV_PCM_FMTBIT_S16_LE,
514262306a36Sopenharmony_ci		},
514362306a36Sopenharmony_ci		.ops = &rt5677_dsp_dai_ops,
514462306a36Sopenharmony_ci	},
514562306a36Sopenharmony_ci};
514662306a36Sopenharmony_ci
514762306a36Sopenharmony_cistatic const struct snd_soc_component_driver soc_component_dev_rt5677 = {
514862306a36Sopenharmony_ci	.name			= RT5677_DRV_NAME,
514962306a36Sopenharmony_ci	.probe			= rt5677_probe,
515062306a36Sopenharmony_ci	.remove			= rt5677_remove,
515162306a36Sopenharmony_ci	.suspend		= rt5677_suspend,
515262306a36Sopenharmony_ci	.resume			= rt5677_resume,
515362306a36Sopenharmony_ci	.set_bias_level		= rt5677_set_bias_level,
515462306a36Sopenharmony_ci	.controls		= rt5677_snd_controls,
515562306a36Sopenharmony_ci	.num_controls		= ARRAY_SIZE(rt5677_snd_controls),
515662306a36Sopenharmony_ci	.dapm_widgets		= rt5677_dapm_widgets,
515762306a36Sopenharmony_ci	.num_dapm_widgets	= ARRAY_SIZE(rt5677_dapm_widgets),
515862306a36Sopenharmony_ci	.dapm_routes		= rt5677_dapm_routes,
515962306a36Sopenharmony_ci	.num_dapm_routes	= ARRAY_SIZE(rt5677_dapm_routes),
516062306a36Sopenharmony_ci	.use_pmdown_time	= 1,
516162306a36Sopenharmony_ci	.endianness		= 1,
516262306a36Sopenharmony_ci};
516362306a36Sopenharmony_ci
516462306a36Sopenharmony_cistatic const struct regmap_config rt5677_regmap_physical = {
516562306a36Sopenharmony_ci	.name = "physical",
516662306a36Sopenharmony_ci	.reg_bits = 8,
516762306a36Sopenharmony_ci	.val_bits = 16,
516862306a36Sopenharmony_ci
516962306a36Sopenharmony_ci	.max_register = RT5677_VENDOR_ID2 + 1 + (ARRAY_SIZE(rt5677_ranges) *
517062306a36Sopenharmony_ci						RT5677_PR_SPACING),
517162306a36Sopenharmony_ci	.readable_reg = rt5677_readable_register,
517262306a36Sopenharmony_ci
517362306a36Sopenharmony_ci	.cache_type = REGCACHE_NONE,
517462306a36Sopenharmony_ci	.ranges = rt5677_ranges,
517562306a36Sopenharmony_ci	.num_ranges = ARRAY_SIZE(rt5677_ranges),
517662306a36Sopenharmony_ci};
517762306a36Sopenharmony_ci
517862306a36Sopenharmony_cistatic const struct regmap_config rt5677_regmap = {
517962306a36Sopenharmony_ci	.reg_bits = 8,
518062306a36Sopenharmony_ci	.val_bits = 16,
518162306a36Sopenharmony_ci
518262306a36Sopenharmony_ci	.max_register = RT5677_VENDOR_ID2 + 1 + (ARRAY_SIZE(rt5677_ranges) *
518362306a36Sopenharmony_ci						RT5677_PR_SPACING),
518462306a36Sopenharmony_ci
518562306a36Sopenharmony_ci	.volatile_reg = rt5677_volatile_register,
518662306a36Sopenharmony_ci	.readable_reg = rt5677_readable_register,
518762306a36Sopenharmony_ci	.reg_read = rt5677_read,
518862306a36Sopenharmony_ci	.reg_write = rt5677_write,
518962306a36Sopenharmony_ci
519062306a36Sopenharmony_ci	.cache_type = REGCACHE_RBTREE,
519162306a36Sopenharmony_ci	.reg_defaults = rt5677_reg,
519262306a36Sopenharmony_ci	.num_reg_defaults = ARRAY_SIZE(rt5677_reg),
519362306a36Sopenharmony_ci	.ranges = rt5677_ranges,
519462306a36Sopenharmony_ci	.num_ranges = ARRAY_SIZE(rt5677_ranges),
519562306a36Sopenharmony_ci};
519662306a36Sopenharmony_ci
519762306a36Sopenharmony_cistatic const struct of_device_id rt5677_of_match[] = {
519862306a36Sopenharmony_ci	{ .compatible = "realtek,rt5677", .data = (const void *)RT5677 },
519962306a36Sopenharmony_ci	{ }
520062306a36Sopenharmony_ci};
520162306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, rt5677_of_match);
520262306a36Sopenharmony_ci
520362306a36Sopenharmony_cistatic const struct acpi_device_id rt5677_acpi_match[] = {
520462306a36Sopenharmony_ci	{ "RT5677CE", RT5677 },
520562306a36Sopenharmony_ci	{ }
520662306a36Sopenharmony_ci};
520762306a36Sopenharmony_ciMODULE_DEVICE_TABLE(acpi, rt5677_acpi_match);
520862306a36Sopenharmony_ci
520962306a36Sopenharmony_cistatic void rt5677_read_device_properties(struct rt5677_priv *rt5677,
521062306a36Sopenharmony_ci		struct device *dev)
521162306a36Sopenharmony_ci{
521262306a36Sopenharmony_ci	u32 val;
521362306a36Sopenharmony_ci
521462306a36Sopenharmony_ci	rt5677->pdata.in1_diff =
521562306a36Sopenharmony_ci		device_property_read_bool(dev, "IN1") ||
521662306a36Sopenharmony_ci		device_property_read_bool(dev, "realtek,in1-differential");
521762306a36Sopenharmony_ci
521862306a36Sopenharmony_ci	rt5677->pdata.in2_diff =
521962306a36Sopenharmony_ci		device_property_read_bool(dev, "IN2") ||
522062306a36Sopenharmony_ci		device_property_read_bool(dev, "realtek,in2-differential");
522162306a36Sopenharmony_ci
522262306a36Sopenharmony_ci	rt5677->pdata.lout1_diff =
522362306a36Sopenharmony_ci		device_property_read_bool(dev, "OUT1") ||
522462306a36Sopenharmony_ci		device_property_read_bool(dev, "realtek,lout1-differential");
522562306a36Sopenharmony_ci
522662306a36Sopenharmony_ci	rt5677->pdata.lout2_diff =
522762306a36Sopenharmony_ci		device_property_read_bool(dev, "OUT2") ||
522862306a36Sopenharmony_ci		device_property_read_bool(dev, "realtek,lout2-differential");
522962306a36Sopenharmony_ci
523062306a36Sopenharmony_ci	rt5677->pdata.lout3_diff =
523162306a36Sopenharmony_ci		device_property_read_bool(dev, "OUT3") ||
523262306a36Sopenharmony_ci		device_property_read_bool(dev, "realtek,lout3-differential");
523362306a36Sopenharmony_ci
523462306a36Sopenharmony_ci	device_property_read_u8_array(dev, "realtek,gpio-config",
523562306a36Sopenharmony_ci				      rt5677->pdata.gpio_config,
523662306a36Sopenharmony_ci				      RT5677_GPIO_NUM);
523762306a36Sopenharmony_ci
523862306a36Sopenharmony_ci	if (!device_property_read_u32(dev, "DCLK", &val) ||
523962306a36Sopenharmony_ci	    !device_property_read_u32(dev, "realtek,dmic2_clk_pin", &val))
524062306a36Sopenharmony_ci		rt5677->pdata.dmic2_clk_pin = val;
524162306a36Sopenharmony_ci
524262306a36Sopenharmony_ci	if (!device_property_read_u32(dev, "JD1", &val) ||
524362306a36Sopenharmony_ci	    !device_property_read_u32(dev, "realtek,jd1-gpio", &val))
524462306a36Sopenharmony_ci		rt5677->pdata.jd1_gpio = val;
524562306a36Sopenharmony_ci
524662306a36Sopenharmony_ci	if (!device_property_read_u32(dev, "JD2", &val) ||
524762306a36Sopenharmony_ci	    !device_property_read_u32(dev, "realtek,jd2-gpio", &val))
524862306a36Sopenharmony_ci		rt5677->pdata.jd2_gpio = val;
524962306a36Sopenharmony_ci
525062306a36Sopenharmony_ci	if (!device_property_read_u32(dev, "JD3", &val) ||
525162306a36Sopenharmony_ci	    !device_property_read_u32(dev, "realtek,jd3-gpio", &val))
525262306a36Sopenharmony_ci		rt5677->pdata.jd3_gpio = val;
525362306a36Sopenharmony_ci}
525462306a36Sopenharmony_ci
525562306a36Sopenharmony_cistruct rt5677_irq_desc {
525662306a36Sopenharmony_ci	unsigned int enable_mask;
525762306a36Sopenharmony_ci	unsigned int status_mask;
525862306a36Sopenharmony_ci	unsigned int polarity_mask;
525962306a36Sopenharmony_ci};
526062306a36Sopenharmony_ci
526162306a36Sopenharmony_cistatic const struct rt5677_irq_desc rt5677_irq_descs[] = {
526262306a36Sopenharmony_ci	[RT5677_IRQ_JD1] = {
526362306a36Sopenharmony_ci		.enable_mask = RT5677_EN_IRQ_GPIO_JD1,
526462306a36Sopenharmony_ci		.status_mask = RT5677_STA_GPIO_JD1,
526562306a36Sopenharmony_ci		.polarity_mask = RT5677_INV_GPIO_JD1,
526662306a36Sopenharmony_ci	},
526762306a36Sopenharmony_ci	[RT5677_IRQ_JD2] = {
526862306a36Sopenharmony_ci		.enable_mask = RT5677_EN_IRQ_GPIO_JD2,
526962306a36Sopenharmony_ci		.status_mask = RT5677_STA_GPIO_JD2,
527062306a36Sopenharmony_ci		.polarity_mask = RT5677_INV_GPIO_JD2,
527162306a36Sopenharmony_ci	},
527262306a36Sopenharmony_ci	[RT5677_IRQ_JD3] = {
527362306a36Sopenharmony_ci		.enable_mask = RT5677_EN_IRQ_GPIO_JD3,
527462306a36Sopenharmony_ci		.status_mask = RT5677_STA_GPIO_JD3,
527562306a36Sopenharmony_ci		.polarity_mask = RT5677_INV_GPIO_JD3,
527662306a36Sopenharmony_ci	},
527762306a36Sopenharmony_ci};
527862306a36Sopenharmony_ci
527962306a36Sopenharmony_cistatic bool rt5677_check_hotword(struct rt5677_priv *rt5677)
528062306a36Sopenharmony_ci{
528162306a36Sopenharmony_ci	int reg_gpio;
528262306a36Sopenharmony_ci
528362306a36Sopenharmony_ci	if (!rt5677->is_dsp_mode)
528462306a36Sopenharmony_ci		return false;
528562306a36Sopenharmony_ci
528662306a36Sopenharmony_ci	if (regmap_read(rt5677->regmap, RT5677_GPIO_CTRL1, &reg_gpio))
528762306a36Sopenharmony_ci		return false;
528862306a36Sopenharmony_ci
528962306a36Sopenharmony_ci	/* Firmware sets GPIO1 pin to be GPIO1 after hotword is detected */
529062306a36Sopenharmony_ci	if ((reg_gpio & RT5677_GPIO1_PIN_MASK) == RT5677_GPIO1_PIN_IRQ)
529162306a36Sopenharmony_ci		return false;
529262306a36Sopenharmony_ci
529362306a36Sopenharmony_ci	/* Set GPIO1 pin back to be IRQ output for jack detect */
529462306a36Sopenharmony_ci	regmap_update_bits(rt5677->regmap, RT5677_GPIO_CTRL1,
529562306a36Sopenharmony_ci			RT5677_GPIO1_PIN_MASK, RT5677_GPIO1_PIN_IRQ);
529662306a36Sopenharmony_ci
529762306a36Sopenharmony_ci	rt5677_spi_hotword_detected();
529862306a36Sopenharmony_ci	return true;
529962306a36Sopenharmony_ci}
530062306a36Sopenharmony_ci
530162306a36Sopenharmony_cistatic irqreturn_t rt5677_irq(int unused, void *data)
530262306a36Sopenharmony_ci{
530362306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = data;
530462306a36Sopenharmony_ci	int ret, loop, i, reg_irq, virq;
530562306a36Sopenharmony_ci	bool irq_fired = false;
530662306a36Sopenharmony_ci
530762306a36Sopenharmony_ci	mutex_lock(&rt5677->irq_lock);
530862306a36Sopenharmony_ci
530962306a36Sopenharmony_ci	/*
531062306a36Sopenharmony_ci	 * Loop to handle interrupts until the last i2c read shows no pending
531162306a36Sopenharmony_ci	 * irqs. The interrupt line is shared by multiple interrupt sources.
531262306a36Sopenharmony_ci	 * After the regmap_read() below, a new interrupt source line may
531362306a36Sopenharmony_ci	 * become high before the regmap_write() finishes, so there isn't a
531462306a36Sopenharmony_ci	 * rising edge on the shared interrupt line for the new interrupt. Thus,
531562306a36Sopenharmony_ci	 * the loop is needed to avoid missing irqs.
531662306a36Sopenharmony_ci	 *
531762306a36Sopenharmony_ci	 * A safeguard of 20 loops is used to avoid hanging in the irq handler
531862306a36Sopenharmony_ci	 * if there is something wrong with the interrupt status update. The
531962306a36Sopenharmony_ci	 * interrupt sources here are audio jack plug/unplug events which
532062306a36Sopenharmony_ci	 * shouldn't happen at a high frequency for a long period of time.
532162306a36Sopenharmony_ci	 * Empirically, more than 3 loops have never been seen.
532262306a36Sopenharmony_ci	 */
532362306a36Sopenharmony_ci	for (loop = 0; loop < 20; loop++) {
532462306a36Sopenharmony_ci		/* Read interrupt status */
532562306a36Sopenharmony_ci		ret = regmap_read(rt5677->regmap, RT5677_IRQ_CTRL1, &reg_irq);
532662306a36Sopenharmony_ci		if (ret) {
532762306a36Sopenharmony_ci			dev_err(rt5677->dev, "failed reading IRQ status: %d\n",
532862306a36Sopenharmony_ci				ret);
532962306a36Sopenharmony_ci			goto exit;
533062306a36Sopenharmony_ci		}
533162306a36Sopenharmony_ci
533262306a36Sopenharmony_ci		irq_fired = false;
533362306a36Sopenharmony_ci		for (i = 0; i < RT5677_IRQ_NUM; i++) {
533462306a36Sopenharmony_ci			if (reg_irq & rt5677_irq_descs[i].status_mask) {
533562306a36Sopenharmony_ci				irq_fired = true;
533662306a36Sopenharmony_ci				virq = irq_find_mapping(rt5677->domain, i);
533762306a36Sopenharmony_ci				if (virq)
533862306a36Sopenharmony_ci					handle_nested_irq(virq);
533962306a36Sopenharmony_ci
534062306a36Sopenharmony_ci				/* Clear the interrupt by flipping the polarity
534162306a36Sopenharmony_ci				 * of the interrupt source line that fired
534262306a36Sopenharmony_ci				 */
534362306a36Sopenharmony_ci				reg_irq ^= rt5677_irq_descs[i].polarity_mask;
534462306a36Sopenharmony_ci			}
534562306a36Sopenharmony_ci		}
534662306a36Sopenharmony_ci
534762306a36Sopenharmony_ci		/* Exit the loop only when we know for sure that GPIO1 pin
534862306a36Sopenharmony_ci		 * was low at some point since irq_lock was acquired. Any event
534962306a36Sopenharmony_ci		 * after that point creates a rising edge that triggers another
535062306a36Sopenharmony_ci		 * call to rt5677_irq().
535162306a36Sopenharmony_ci		 */
535262306a36Sopenharmony_ci		if (!irq_fired && !rt5677_check_hotword(rt5677))
535362306a36Sopenharmony_ci			goto exit;
535462306a36Sopenharmony_ci
535562306a36Sopenharmony_ci		ret = regmap_write(rt5677->regmap, RT5677_IRQ_CTRL1, reg_irq);
535662306a36Sopenharmony_ci		if (ret) {
535762306a36Sopenharmony_ci			dev_err(rt5677->dev, "failed updating IRQ status: %d\n",
535862306a36Sopenharmony_ci				ret);
535962306a36Sopenharmony_ci			goto exit;
536062306a36Sopenharmony_ci		}
536162306a36Sopenharmony_ci	}
536262306a36Sopenharmony_ciexit:
536362306a36Sopenharmony_ci	WARN_ON_ONCE(loop == 20);
536462306a36Sopenharmony_ci	mutex_unlock(&rt5677->irq_lock);
536562306a36Sopenharmony_ci	if (irq_fired)
536662306a36Sopenharmony_ci		return IRQ_HANDLED;
536762306a36Sopenharmony_ci	else
536862306a36Sopenharmony_ci		return IRQ_NONE;
536962306a36Sopenharmony_ci}
537062306a36Sopenharmony_ci
537162306a36Sopenharmony_cistatic void rt5677_resume_irq_check(struct work_struct *work)
537262306a36Sopenharmony_ci{
537362306a36Sopenharmony_ci	int i, virq;
537462306a36Sopenharmony_ci	struct rt5677_priv *rt5677 =
537562306a36Sopenharmony_ci		container_of(work, struct rt5677_priv, resume_irq_check.work);
537662306a36Sopenharmony_ci
537762306a36Sopenharmony_ci	/* This is needed to check and clear the interrupt status register
537862306a36Sopenharmony_ci	 * at resume. If the headset is plugged/unplugged when the device is
537962306a36Sopenharmony_ci	 * fully suspended, there won't be a rising edge at resume to trigger
538062306a36Sopenharmony_ci	 * the interrupt. Without this, we miss the next unplug/plug event.
538162306a36Sopenharmony_ci	 */
538262306a36Sopenharmony_ci	rt5677_irq(0, rt5677);
538362306a36Sopenharmony_ci
538462306a36Sopenharmony_ci	/* Call all enabled jack detect irq handlers again. This is needed in
538562306a36Sopenharmony_ci	 * addition to the above check for a corner case caused by jack gpio
538662306a36Sopenharmony_ci	 * debounce. After codec irq is disabled at suspend, the delayed work
538762306a36Sopenharmony_ci	 * scheduled by soc-jack may run and read wrong jack gpio values, since
538862306a36Sopenharmony_ci	 * the regmap is in cache only mode. At resume, there is no irq because
538962306a36Sopenharmony_ci	 * rt5677_irq has already ran and cleared the irq status at suspend.
539062306a36Sopenharmony_ci	 * Without this explicit check, unplug the headset right after suspend
539162306a36Sopenharmony_ci	 * starts, then after resume the headset is still shown as plugged in.
539262306a36Sopenharmony_ci	 */
539362306a36Sopenharmony_ci	mutex_lock(&rt5677->irq_lock);
539462306a36Sopenharmony_ci	for (i = 0; i < RT5677_IRQ_NUM; i++) {
539562306a36Sopenharmony_ci		if (rt5677->irq_en & rt5677_irq_descs[i].enable_mask) {
539662306a36Sopenharmony_ci			virq = irq_find_mapping(rt5677->domain, i);
539762306a36Sopenharmony_ci			if (virq)
539862306a36Sopenharmony_ci				handle_nested_irq(virq);
539962306a36Sopenharmony_ci		}
540062306a36Sopenharmony_ci	}
540162306a36Sopenharmony_ci	mutex_unlock(&rt5677->irq_lock);
540262306a36Sopenharmony_ci}
540362306a36Sopenharmony_ci
540462306a36Sopenharmony_cistatic void rt5677_irq_bus_lock(struct irq_data *data)
540562306a36Sopenharmony_ci{
540662306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = irq_data_get_irq_chip_data(data);
540762306a36Sopenharmony_ci
540862306a36Sopenharmony_ci	mutex_lock(&rt5677->irq_lock);
540962306a36Sopenharmony_ci}
541062306a36Sopenharmony_ci
541162306a36Sopenharmony_cistatic void rt5677_irq_bus_sync_unlock(struct irq_data *data)
541262306a36Sopenharmony_ci{
541362306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = irq_data_get_irq_chip_data(data);
541462306a36Sopenharmony_ci
541562306a36Sopenharmony_ci	// Set the enable/disable bits for the jack detect IRQs.
541662306a36Sopenharmony_ci	regmap_update_bits(rt5677->regmap, RT5677_IRQ_CTRL1,
541762306a36Sopenharmony_ci			RT5677_EN_IRQ_GPIO_JD1 | RT5677_EN_IRQ_GPIO_JD2 |
541862306a36Sopenharmony_ci			RT5677_EN_IRQ_GPIO_JD3, rt5677->irq_en);
541962306a36Sopenharmony_ci	mutex_unlock(&rt5677->irq_lock);
542062306a36Sopenharmony_ci}
542162306a36Sopenharmony_ci
542262306a36Sopenharmony_cistatic void rt5677_irq_enable(struct irq_data *data)
542362306a36Sopenharmony_ci{
542462306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = irq_data_get_irq_chip_data(data);
542562306a36Sopenharmony_ci
542662306a36Sopenharmony_ci	rt5677->irq_en |= rt5677_irq_descs[data->hwirq].enable_mask;
542762306a36Sopenharmony_ci}
542862306a36Sopenharmony_ci
542962306a36Sopenharmony_cistatic void rt5677_irq_disable(struct irq_data *data)
543062306a36Sopenharmony_ci{
543162306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = irq_data_get_irq_chip_data(data);
543262306a36Sopenharmony_ci
543362306a36Sopenharmony_ci	rt5677->irq_en &= ~rt5677_irq_descs[data->hwirq].enable_mask;
543462306a36Sopenharmony_ci}
543562306a36Sopenharmony_ci
543662306a36Sopenharmony_cistatic struct irq_chip rt5677_irq_chip = {
543762306a36Sopenharmony_ci	.name			= "rt5677_irq_chip",
543862306a36Sopenharmony_ci	.irq_bus_lock		= rt5677_irq_bus_lock,
543962306a36Sopenharmony_ci	.irq_bus_sync_unlock	= rt5677_irq_bus_sync_unlock,
544062306a36Sopenharmony_ci	.irq_disable		= rt5677_irq_disable,
544162306a36Sopenharmony_ci	.irq_enable		= rt5677_irq_enable,
544262306a36Sopenharmony_ci};
544362306a36Sopenharmony_ci
544462306a36Sopenharmony_cistatic int rt5677_irq_map(struct irq_domain *h, unsigned int virq,
544562306a36Sopenharmony_ci			  irq_hw_number_t hw)
544662306a36Sopenharmony_ci{
544762306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = h->host_data;
544862306a36Sopenharmony_ci
544962306a36Sopenharmony_ci	irq_set_chip_data(virq, rt5677);
545062306a36Sopenharmony_ci	irq_set_chip(virq, &rt5677_irq_chip);
545162306a36Sopenharmony_ci	irq_set_nested_thread(virq, 1);
545262306a36Sopenharmony_ci	irq_set_noprobe(virq);
545362306a36Sopenharmony_ci	return 0;
545462306a36Sopenharmony_ci}
545562306a36Sopenharmony_ci
545662306a36Sopenharmony_ci
545762306a36Sopenharmony_cistatic const struct irq_domain_ops rt5677_domain_ops = {
545862306a36Sopenharmony_ci	.map	= rt5677_irq_map,
545962306a36Sopenharmony_ci	.xlate	= irq_domain_xlate_twocell,
546062306a36Sopenharmony_ci};
546162306a36Sopenharmony_ci
546262306a36Sopenharmony_cistatic int rt5677_init_irq(struct i2c_client *i2c)
546362306a36Sopenharmony_ci{
546462306a36Sopenharmony_ci	int ret;
546562306a36Sopenharmony_ci	struct rt5677_priv *rt5677 = i2c_get_clientdata(i2c);
546662306a36Sopenharmony_ci	unsigned int jd_mask = 0, jd_val = 0;
546762306a36Sopenharmony_ci
546862306a36Sopenharmony_ci	if (!rt5677->pdata.jd1_gpio &&
546962306a36Sopenharmony_ci		!rt5677->pdata.jd2_gpio &&
547062306a36Sopenharmony_ci		!rt5677->pdata.jd3_gpio)
547162306a36Sopenharmony_ci		return 0;
547262306a36Sopenharmony_ci
547362306a36Sopenharmony_ci	if (!i2c->irq) {
547462306a36Sopenharmony_ci		dev_err(&i2c->dev, "No interrupt specified\n");
547562306a36Sopenharmony_ci		return -EINVAL;
547662306a36Sopenharmony_ci	}
547762306a36Sopenharmony_ci
547862306a36Sopenharmony_ci	mutex_init(&rt5677->irq_lock);
547962306a36Sopenharmony_ci	INIT_DELAYED_WORK(&rt5677->resume_irq_check, rt5677_resume_irq_check);
548062306a36Sopenharmony_ci
548162306a36Sopenharmony_ci	/*
548262306a36Sopenharmony_ci	 * Select RC as the debounce clock so that GPIO works even when
548362306a36Sopenharmony_ci	 * MCLK is gated which happens when there is no audio stream
548462306a36Sopenharmony_ci	 * (SND_SOC_BIAS_OFF).
548562306a36Sopenharmony_ci	 */
548662306a36Sopenharmony_ci	regmap_update_bits(rt5677->regmap, RT5677_DIG_MISC,
548762306a36Sopenharmony_ci			RT5677_IRQ_DEBOUNCE_SEL_MASK,
548862306a36Sopenharmony_ci			RT5677_IRQ_DEBOUNCE_SEL_RC);
548962306a36Sopenharmony_ci	/* Enable auto power on RC when GPIO states are changed */
549062306a36Sopenharmony_ci	regmap_update_bits(rt5677->regmap, RT5677_GEN_CTRL1, 0xff, 0xff);
549162306a36Sopenharmony_ci
549262306a36Sopenharmony_ci	/* Select and enable jack detection sources per platform data */
549362306a36Sopenharmony_ci	if (rt5677->pdata.jd1_gpio) {
549462306a36Sopenharmony_ci		jd_mask	|= RT5677_SEL_GPIO_JD1_MASK;
549562306a36Sopenharmony_ci		jd_val	|= rt5677->pdata.jd1_gpio << RT5677_SEL_GPIO_JD1_SFT;
549662306a36Sopenharmony_ci	}
549762306a36Sopenharmony_ci	if (rt5677->pdata.jd2_gpio) {
549862306a36Sopenharmony_ci		jd_mask	|= RT5677_SEL_GPIO_JD2_MASK;
549962306a36Sopenharmony_ci		jd_val	|= rt5677->pdata.jd2_gpio << RT5677_SEL_GPIO_JD2_SFT;
550062306a36Sopenharmony_ci	}
550162306a36Sopenharmony_ci	if (rt5677->pdata.jd3_gpio) {
550262306a36Sopenharmony_ci		jd_mask	|= RT5677_SEL_GPIO_JD3_MASK;
550362306a36Sopenharmony_ci		jd_val	|= rt5677->pdata.jd3_gpio << RT5677_SEL_GPIO_JD3_SFT;
550462306a36Sopenharmony_ci	}
550562306a36Sopenharmony_ci	regmap_update_bits(rt5677->regmap, RT5677_JD_CTRL1, jd_mask, jd_val);
550662306a36Sopenharmony_ci
550762306a36Sopenharmony_ci	/* Set GPIO1 pin to be IRQ output */
550862306a36Sopenharmony_ci	regmap_update_bits(rt5677->regmap, RT5677_GPIO_CTRL1,
550962306a36Sopenharmony_ci			RT5677_GPIO1_PIN_MASK, RT5677_GPIO1_PIN_IRQ);
551062306a36Sopenharmony_ci
551162306a36Sopenharmony_ci	/* Ready to listen for interrupts */
551262306a36Sopenharmony_ci	rt5677->domain = irq_domain_create_linear(dev_fwnode(&i2c->dev),
551362306a36Sopenharmony_ci			RT5677_IRQ_NUM, &rt5677_domain_ops, rt5677);
551462306a36Sopenharmony_ci	if (!rt5677->domain) {
551562306a36Sopenharmony_ci		dev_err(&i2c->dev, "Failed to create IRQ domain\n");
551662306a36Sopenharmony_ci		return -ENOMEM;
551762306a36Sopenharmony_ci	}
551862306a36Sopenharmony_ci
551962306a36Sopenharmony_ci	ret = devm_request_threaded_irq(&i2c->dev, i2c->irq, NULL, rt5677_irq,
552062306a36Sopenharmony_ci			IRQF_TRIGGER_RISING | IRQF_ONESHOT,
552162306a36Sopenharmony_ci			"rt5677", rt5677);
552262306a36Sopenharmony_ci	if (ret)
552362306a36Sopenharmony_ci		dev_err(&i2c->dev, "Failed to request IRQ: %d\n", ret);
552462306a36Sopenharmony_ci
552562306a36Sopenharmony_ci	rt5677->irq = i2c->irq;
552662306a36Sopenharmony_ci
552762306a36Sopenharmony_ci	return ret;
552862306a36Sopenharmony_ci}
552962306a36Sopenharmony_ci
553062306a36Sopenharmony_cistatic int rt5677_i2c_probe(struct i2c_client *i2c)
553162306a36Sopenharmony_ci{
553262306a36Sopenharmony_ci	struct device *dev = &i2c->dev;
553362306a36Sopenharmony_ci	struct rt5677_priv *rt5677;
553462306a36Sopenharmony_ci	int ret;
553562306a36Sopenharmony_ci	unsigned int val;
553662306a36Sopenharmony_ci
553762306a36Sopenharmony_ci	rt5677 = devm_kzalloc(&i2c->dev, sizeof(struct rt5677_priv),
553862306a36Sopenharmony_ci				GFP_KERNEL);
553962306a36Sopenharmony_ci	if (rt5677 == NULL)
554062306a36Sopenharmony_ci		return -ENOMEM;
554162306a36Sopenharmony_ci
554262306a36Sopenharmony_ci	rt5677->dev = &i2c->dev;
554362306a36Sopenharmony_ci	rt5677->set_dsp_vad = rt5677_set_dsp_vad;
554462306a36Sopenharmony_ci	INIT_DELAYED_WORK(&rt5677->dsp_work, rt5677_dsp_work);
554562306a36Sopenharmony_ci	i2c_set_clientdata(i2c, rt5677);
554662306a36Sopenharmony_ci
554762306a36Sopenharmony_ci	rt5677->type = (enum rt5677_type)(uintptr_t)device_get_match_data(dev);
554862306a36Sopenharmony_ci	if (rt5677->type == 0)
554962306a36Sopenharmony_ci		return -EINVAL;
555062306a36Sopenharmony_ci
555162306a36Sopenharmony_ci	rt5677_read_device_properties(rt5677, &i2c->dev);
555262306a36Sopenharmony_ci
555362306a36Sopenharmony_ci	/* pow-ldo2 and reset are optional. The codec pins may be statically
555462306a36Sopenharmony_ci	 * connected on the board without gpios. If the gpio device property
555562306a36Sopenharmony_ci	 * isn't specified, devm_gpiod_get_optional returns NULL.
555662306a36Sopenharmony_ci	 */
555762306a36Sopenharmony_ci	rt5677->pow_ldo2 = devm_gpiod_get_optional(&i2c->dev,
555862306a36Sopenharmony_ci			"realtek,pow-ldo2", GPIOD_OUT_HIGH);
555962306a36Sopenharmony_ci	if (IS_ERR(rt5677->pow_ldo2)) {
556062306a36Sopenharmony_ci		ret = PTR_ERR(rt5677->pow_ldo2);
556162306a36Sopenharmony_ci		dev_err(&i2c->dev, "Failed to request POW_LDO2: %d\n", ret);
556262306a36Sopenharmony_ci		return ret;
556362306a36Sopenharmony_ci	}
556462306a36Sopenharmony_ci	rt5677->reset_pin = devm_gpiod_get_optional(&i2c->dev,
556562306a36Sopenharmony_ci			"realtek,reset", GPIOD_OUT_LOW);
556662306a36Sopenharmony_ci	if (IS_ERR(rt5677->reset_pin)) {
556762306a36Sopenharmony_ci		ret = PTR_ERR(rt5677->reset_pin);
556862306a36Sopenharmony_ci		dev_err(&i2c->dev, "Failed to request RESET: %d\n", ret);
556962306a36Sopenharmony_ci		return ret;
557062306a36Sopenharmony_ci	}
557162306a36Sopenharmony_ci
557262306a36Sopenharmony_ci	if (rt5677->pow_ldo2 || rt5677->reset_pin) {
557362306a36Sopenharmony_ci		/* Wait a while until I2C bus becomes available. The datasheet
557462306a36Sopenharmony_ci		 * does not specify the exact we should wait but startup
557562306a36Sopenharmony_ci		 * sequence mentiones at least a few milliseconds.
557662306a36Sopenharmony_ci		 */
557762306a36Sopenharmony_ci		msleep(10);
557862306a36Sopenharmony_ci	}
557962306a36Sopenharmony_ci
558062306a36Sopenharmony_ci	rt5677->regmap_physical = devm_regmap_init_i2c(i2c,
558162306a36Sopenharmony_ci					&rt5677_regmap_physical);
558262306a36Sopenharmony_ci	if (IS_ERR(rt5677->regmap_physical)) {
558362306a36Sopenharmony_ci		ret = PTR_ERR(rt5677->regmap_physical);
558462306a36Sopenharmony_ci		dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
558562306a36Sopenharmony_ci			ret);
558662306a36Sopenharmony_ci		return ret;
558762306a36Sopenharmony_ci	}
558862306a36Sopenharmony_ci
558962306a36Sopenharmony_ci	rt5677->regmap = devm_regmap_init(&i2c->dev, NULL, i2c, &rt5677_regmap);
559062306a36Sopenharmony_ci	if (IS_ERR(rt5677->regmap)) {
559162306a36Sopenharmony_ci		ret = PTR_ERR(rt5677->regmap);
559262306a36Sopenharmony_ci		dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
559362306a36Sopenharmony_ci			ret);
559462306a36Sopenharmony_ci		return ret;
559562306a36Sopenharmony_ci	}
559662306a36Sopenharmony_ci
559762306a36Sopenharmony_ci	regmap_read(rt5677->regmap, RT5677_VENDOR_ID2, &val);
559862306a36Sopenharmony_ci	if (val != RT5677_DEVICE_ID) {
559962306a36Sopenharmony_ci		dev_err(&i2c->dev,
560062306a36Sopenharmony_ci			"Device with ID register %#x is not rt5677\n", val);
560162306a36Sopenharmony_ci		return -ENODEV;
560262306a36Sopenharmony_ci	}
560362306a36Sopenharmony_ci
560462306a36Sopenharmony_ci	regmap_write(rt5677->regmap, RT5677_RESET, 0x10ec);
560562306a36Sopenharmony_ci
560662306a36Sopenharmony_ci	ret = regmap_register_patch(rt5677->regmap, init_list,
560762306a36Sopenharmony_ci				    ARRAY_SIZE(init_list));
560862306a36Sopenharmony_ci	if (ret != 0)
560962306a36Sopenharmony_ci		dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret);
561062306a36Sopenharmony_ci
561162306a36Sopenharmony_ci	if (rt5677->pdata.in1_diff)
561262306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_IN1,
561362306a36Sopenharmony_ci					RT5677_IN_DF1, RT5677_IN_DF1);
561462306a36Sopenharmony_ci
561562306a36Sopenharmony_ci	if (rt5677->pdata.in2_diff)
561662306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_IN1,
561762306a36Sopenharmony_ci					RT5677_IN_DF2, RT5677_IN_DF2);
561862306a36Sopenharmony_ci
561962306a36Sopenharmony_ci	if (rt5677->pdata.lout1_diff)
562062306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_LOUT1,
562162306a36Sopenharmony_ci					RT5677_LOUT1_L_DF, RT5677_LOUT1_L_DF);
562262306a36Sopenharmony_ci
562362306a36Sopenharmony_ci	if (rt5677->pdata.lout2_diff)
562462306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_LOUT1,
562562306a36Sopenharmony_ci					RT5677_LOUT2_L_DF, RT5677_LOUT2_L_DF);
562662306a36Sopenharmony_ci
562762306a36Sopenharmony_ci	if (rt5677->pdata.lout3_diff)
562862306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_LOUT1,
562962306a36Sopenharmony_ci					RT5677_LOUT3_L_DF, RT5677_LOUT3_L_DF);
563062306a36Sopenharmony_ci
563162306a36Sopenharmony_ci	if (rt5677->pdata.dmic2_clk_pin == RT5677_DMIC_CLK2) {
563262306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_GEN_CTRL2,
563362306a36Sopenharmony_ci					RT5677_GPIO5_FUNC_MASK,
563462306a36Sopenharmony_ci					RT5677_GPIO5_FUNC_DMIC);
563562306a36Sopenharmony_ci		rt5677_update_gpio_bits(rt5677, RT5677_GPIO5,
563662306a36Sopenharmony_ci					RT5677_GPIOx_DIR_MASK,
563762306a36Sopenharmony_ci					RT5677_GPIOx_DIR_OUT);
563862306a36Sopenharmony_ci	}
563962306a36Sopenharmony_ci
564062306a36Sopenharmony_ci	if (rt5677->pdata.micbias1_vdd_3v3)
564162306a36Sopenharmony_ci		regmap_update_bits(rt5677->regmap, RT5677_MICBIAS,
564262306a36Sopenharmony_ci			RT5677_MICBIAS1_CTRL_VDD_MASK,
564362306a36Sopenharmony_ci			RT5677_MICBIAS1_CTRL_VDD_3_3V);
564462306a36Sopenharmony_ci
564562306a36Sopenharmony_ci	rt5677_init_gpio(i2c);
564662306a36Sopenharmony_ci	ret = rt5677_init_irq(i2c);
564762306a36Sopenharmony_ci	if (ret)
564862306a36Sopenharmony_ci		dev_err(&i2c->dev, "Failed to initialize irq: %d\n", ret);
564962306a36Sopenharmony_ci
565062306a36Sopenharmony_ci	return devm_snd_soc_register_component(&i2c->dev,
565162306a36Sopenharmony_ci				      &soc_component_dev_rt5677,
565262306a36Sopenharmony_ci				      rt5677_dai, ARRAY_SIZE(rt5677_dai));
565362306a36Sopenharmony_ci}
565462306a36Sopenharmony_ci
565562306a36Sopenharmony_cistatic void rt5677_i2c_remove(struct i2c_client *i2c)
565662306a36Sopenharmony_ci{
565762306a36Sopenharmony_ci	rt5677_free_gpio(i2c);
565862306a36Sopenharmony_ci}
565962306a36Sopenharmony_ci
566062306a36Sopenharmony_cistatic struct i2c_driver rt5677_i2c_driver = {
566162306a36Sopenharmony_ci	.driver = {
566262306a36Sopenharmony_ci		.name = RT5677_DRV_NAME,
566362306a36Sopenharmony_ci		.of_match_table = rt5677_of_match,
566462306a36Sopenharmony_ci		.acpi_match_table = rt5677_acpi_match,
566562306a36Sopenharmony_ci	},
566662306a36Sopenharmony_ci	.probe    = rt5677_i2c_probe,
566762306a36Sopenharmony_ci	.remove   = rt5677_i2c_remove,
566862306a36Sopenharmony_ci};
566962306a36Sopenharmony_cimodule_i2c_driver(rt5677_i2c_driver);
567062306a36Sopenharmony_ci
567162306a36Sopenharmony_ciMODULE_DESCRIPTION("ASoC RT5677 driver");
567262306a36Sopenharmony_ciMODULE_AUTHOR("Oder Chiou <oder_chiou@realtek.com>");
567362306a36Sopenharmony_ciMODULE_LICENSE("GPL v2");
567462306a36Sopenharmony_ci
567562306a36Sopenharmony_ciMODULE_FIRMWARE("rt5677_elf_vad");
5676