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, ®_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, ®_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