162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * MediaTek ALSA SoC Audio DAI eTDM Control 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 2021 MediaTek Inc. 662306a36Sopenharmony_ci * Author: Bicycle Tsai <bicycle.tsai@mediatek.com> 762306a36Sopenharmony_ci * Trevor Wu <trevor.wu@mediatek.com> 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/delay.h> 1162306a36Sopenharmony_ci#include <linux/pm_runtime.h> 1262306a36Sopenharmony_ci#include <linux/regmap.h> 1362306a36Sopenharmony_ci#include <sound/pcm_params.h> 1462306a36Sopenharmony_ci#include "mt8195-afe-clk.h" 1562306a36Sopenharmony_ci#include "mt8195-afe-common.h" 1662306a36Sopenharmony_ci#include "mt8195-reg.h" 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define MT8195_ETDM_MAX_CHANNELS 24 1962306a36Sopenharmony_ci#define MT8195_ETDM_NORMAL_MAX_BCK_RATE 24576000 2062306a36Sopenharmony_ci#define ETDM_TO_DAI_ID(x) ((x) + MT8195_AFE_IO_ETDM_START) 2162306a36Sopenharmony_ci#define ENUM_TO_STR(x) #x 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cienum { 2462306a36Sopenharmony_ci MTK_DAI_ETDM_FORMAT_I2S = 0, 2562306a36Sopenharmony_ci MTK_DAI_ETDM_FORMAT_LJ, 2662306a36Sopenharmony_ci MTK_DAI_ETDM_FORMAT_RJ, 2762306a36Sopenharmony_ci MTK_DAI_ETDM_FORMAT_EIAJ, 2862306a36Sopenharmony_ci MTK_DAI_ETDM_FORMAT_DSPA, 2962306a36Sopenharmony_ci MTK_DAI_ETDM_FORMAT_DSPB, 3062306a36Sopenharmony_ci}; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_cienum { 3362306a36Sopenharmony_ci MTK_DAI_ETDM_DATA_ONE_PIN = 0, 3462306a36Sopenharmony_ci MTK_DAI_ETDM_DATA_MULTI_PIN, 3562306a36Sopenharmony_ci}; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_cienum { 3862306a36Sopenharmony_ci ETDM_IN, 3962306a36Sopenharmony_ci ETDM_OUT, 4062306a36Sopenharmony_ci}; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cienum { 4362306a36Sopenharmony_ci ETDM_IN_FROM_PAD, 4462306a36Sopenharmony_ci ETDM_IN_FROM_ETDM_OUT1, 4562306a36Sopenharmony_ci ETDM_IN_FROM_ETDM_OUT2, 4662306a36Sopenharmony_ci}; 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_cienum { 4962306a36Sopenharmony_ci ETDM_IN_SLAVE_FROM_PAD, 5062306a36Sopenharmony_ci ETDM_IN_SLAVE_FROM_ETDM_OUT1, 5162306a36Sopenharmony_ci ETDM_IN_SLAVE_FROM_ETDM_OUT2, 5262306a36Sopenharmony_ci}; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_cienum { 5562306a36Sopenharmony_ci ETDM_OUT_SLAVE_FROM_PAD, 5662306a36Sopenharmony_ci ETDM_OUT_SLAVE_FROM_ETDM_IN1, 5762306a36Sopenharmony_ci ETDM_OUT_SLAVE_FROM_ETDM_IN2, 5862306a36Sopenharmony_ci}; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cienum { 6162306a36Sopenharmony_ci COWORK_ETDM_NONE = 0, 6262306a36Sopenharmony_ci COWORK_ETDM_IN1_M = 2, 6362306a36Sopenharmony_ci COWORK_ETDM_IN1_S = 3, 6462306a36Sopenharmony_ci COWORK_ETDM_IN2_M = 4, 6562306a36Sopenharmony_ci COWORK_ETDM_IN2_S = 5, 6662306a36Sopenharmony_ci COWORK_ETDM_OUT1_M = 10, 6762306a36Sopenharmony_ci COWORK_ETDM_OUT1_S = 11, 6862306a36Sopenharmony_ci COWORK_ETDM_OUT2_M = 12, 6962306a36Sopenharmony_ci COWORK_ETDM_OUT2_S = 13, 7062306a36Sopenharmony_ci COWORK_ETDM_OUT3_M = 14, 7162306a36Sopenharmony_ci COWORK_ETDM_OUT3_S = 15, 7262306a36Sopenharmony_ci}; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_cienum { 7562306a36Sopenharmony_ci ETDM_RELATCH_TIMING_A1A2SYS, 7662306a36Sopenharmony_ci ETDM_RELATCH_TIMING_A3SYS, 7762306a36Sopenharmony_ci ETDM_RELATCH_TIMING_A4SYS, 7862306a36Sopenharmony_ci}; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_cienum { 8162306a36Sopenharmony_ci ETDM_SYNC_NONE, 8262306a36Sopenharmony_ci ETDM_SYNC_FROM_IN1, 8362306a36Sopenharmony_ci ETDM_SYNC_FROM_IN2, 8462306a36Sopenharmony_ci ETDM_SYNC_FROM_OUT1, 8562306a36Sopenharmony_ci ETDM_SYNC_FROM_OUT2, 8662306a36Sopenharmony_ci ETDM_SYNC_FROM_OUT3, 8762306a36Sopenharmony_ci}; 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_cistruct etdm_con_reg { 9062306a36Sopenharmony_ci unsigned int con0; 9162306a36Sopenharmony_ci unsigned int con1; 9262306a36Sopenharmony_ci unsigned int con2; 9362306a36Sopenharmony_ci unsigned int con3; 9462306a36Sopenharmony_ci unsigned int con4; 9562306a36Sopenharmony_ci unsigned int con5; 9662306a36Sopenharmony_ci}; 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_cistruct mtk_dai_etdm_rate { 9962306a36Sopenharmony_ci unsigned int rate; 10062306a36Sopenharmony_ci unsigned int reg_value; 10162306a36Sopenharmony_ci}; 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_cistruct mtk_dai_etdm_priv { 10462306a36Sopenharmony_ci unsigned int clock_mode; 10562306a36Sopenharmony_ci unsigned int data_mode; 10662306a36Sopenharmony_ci bool slave_mode; 10762306a36Sopenharmony_ci bool lrck_inv; 10862306a36Sopenharmony_ci bool bck_inv; 10962306a36Sopenharmony_ci unsigned int format; 11062306a36Sopenharmony_ci unsigned int slots; 11162306a36Sopenharmony_ci unsigned int lrck_width; 11262306a36Sopenharmony_ci unsigned int mclk_freq; 11362306a36Sopenharmony_ci unsigned int mclk_apll; 11462306a36Sopenharmony_ci unsigned int mclk_dir; 11562306a36Sopenharmony_ci int cowork_source_id; //dai id 11662306a36Sopenharmony_ci unsigned int cowork_slv_count; 11762306a36Sopenharmony_ci int cowork_slv_id[MT8195_AFE_IO_ETDM_NUM - 1]; //dai_id 11862306a36Sopenharmony_ci bool in_disable_ch[MT8195_ETDM_MAX_CHANNELS]; 11962306a36Sopenharmony_ci unsigned int en_ref_cnt; 12062306a36Sopenharmony_ci}; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_cistatic const struct mtk_dai_etdm_rate mt8195_etdm_rates[] = { 12362306a36Sopenharmony_ci { .rate = 8000, .reg_value = 0, }, 12462306a36Sopenharmony_ci { .rate = 12000, .reg_value = 1, }, 12562306a36Sopenharmony_ci { .rate = 16000, .reg_value = 2, }, 12662306a36Sopenharmony_ci { .rate = 24000, .reg_value = 3, }, 12762306a36Sopenharmony_ci { .rate = 32000, .reg_value = 4, }, 12862306a36Sopenharmony_ci { .rate = 48000, .reg_value = 5, }, 12962306a36Sopenharmony_ci { .rate = 96000, .reg_value = 7, }, 13062306a36Sopenharmony_ci { .rate = 192000, .reg_value = 9, }, 13162306a36Sopenharmony_ci { .rate = 384000, .reg_value = 11, }, 13262306a36Sopenharmony_ci { .rate = 11025, .reg_value = 16, }, 13362306a36Sopenharmony_ci { .rate = 22050, .reg_value = 17, }, 13462306a36Sopenharmony_ci { .rate = 44100, .reg_value = 18, }, 13562306a36Sopenharmony_ci { .rate = 88200, .reg_value = 19, }, 13662306a36Sopenharmony_ci { .rate = 176400, .reg_value = 20, }, 13762306a36Sopenharmony_ci { .rate = 352800, .reg_value = 21, }, 13862306a36Sopenharmony_ci}; 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_cistatic bool mt8195_afe_etdm_is_valid(int id) 14162306a36Sopenharmony_ci{ 14262306a36Sopenharmony_ci switch (id) { 14362306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM1_IN: 14462306a36Sopenharmony_ci fallthrough; 14562306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM2_IN: 14662306a36Sopenharmony_ci fallthrough; 14762306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM1_OUT: 14862306a36Sopenharmony_ci fallthrough; 14962306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM2_OUT: 15062306a36Sopenharmony_ci fallthrough; 15162306a36Sopenharmony_ci case MT8195_AFE_IO_DPTX: 15262306a36Sopenharmony_ci fallthrough; 15362306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM3_OUT: 15462306a36Sopenharmony_ci return true; 15562306a36Sopenharmony_ci default: 15662306a36Sopenharmony_ci return false; 15762306a36Sopenharmony_ci } 15862306a36Sopenharmony_ci} 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_cistatic bool mt8195_afe_hdmitx_dptx_is_valid(int id) 16162306a36Sopenharmony_ci{ 16262306a36Sopenharmony_ci switch (id) { 16362306a36Sopenharmony_ci case MT8195_AFE_IO_DPTX: 16462306a36Sopenharmony_ci fallthrough; 16562306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM3_OUT: 16662306a36Sopenharmony_ci return true; 16762306a36Sopenharmony_ci default: 16862306a36Sopenharmony_ci return false; 16962306a36Sopenharmony_ci } 17062306a36Sopenharmony_ci} 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_cistatic int get_etdm_fs_timing(unsigned int rate) 17362306a36Sopenharmony_ci{ 17462306a36Sopenharmony_ci int i; 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(mt8195_etdm_rates); i++) 17762306a36Sopenharmony_ci if (mt8195_etdm_rates[i].rate == rate) 17862306a36Sopenharmony_ci return mt8195_etdm_rates[i].reg_value; 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci return -EINVAL; 18162306a36Sopenharmony_ci} 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_cistatic unsigned int get_etdm_ch_fixup(unsigned int channels) 18462306a36Sopenharmony_ci{ 18562306a36Sopenharmony_ci if (channels > 16) 18662306a36Sopenharmony_ci return 24; 18762306a36Sopenharmony_ci else if (channels > 8) 18862306a36Sopenharmony_ci return 16; 18962306a36Sopenharmony_ci else if (channels > 4) 19062306a36Sopenharmony_ci return 8; 19162306a36Sopenharmony_ci else if (channels > 2) 19262306a36Sopenharmony_ci return 4; 19362306a36Sopenharmony_ci else 19462306a36Sopenharmony_ci return 2; 19562306a36Sopenharmony_ci} 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_cistatic int get_etdm_reg(unsigned int dai_id, struct etdm_con_reg *etdm_reg) 19862306a36Sopenharmony_ci{ 19962306a36Sopenharmony_ci switch (dai_id) { 20062306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM1_IN: 20162306a36Sopenharmony_ci etdm_reg->con0 = ETDM_IN1_CON0; 20262306a36Sopenharmony_ci etdm_reg->con1 = ETDM_IN1_CON1; 20362306a36Sopenharmony_ci etdm_reg->con2 = ETDM_IN1_CON2; 20462306a36Sopenharmony_ci etdm_reg->con3 = ETDM_IN1_CON3; 20562306a36Sopenharmony_ci etdm_reg->con4 = ETDM_IN1_CON4; 20662306a36Sopenharmony_ci etdm_reg->con5 = ETDM_IN1_CON5; 20762306a36Sopenharmony_ci break; 20862306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM2_IN: 20962306a36Sopenharmony_ci etdm_reg->con0 = ETDM_IN2_CON0; 21062306a36Sopenharmony_ci etdm_reg->con1 = ETDM_IN2_CON1; 21162306a36Sopenharmony_ci etdm_reg->con2 = ETDM_IN2_CON2; 21262306a36Sopenharmony_ci etdm_reg->con3 = ETDM_IN2_CON3; 21362306a36Sopenharmony_ci etdm_reg->con4 = ETDM_IN2_CON4; 21462306a36Sopenharmony_ci etdm_reg->con5 = ETDM_IN2_CON5; 21562306a36Sopenharmony_ci break; 21662306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM1_OUT: 21762306a36Sopenharmony_ci etdm_reg->con0 = ETDM_OUT1_CON0; 21862306a36Sopenharmony_ci etdm_reg->con1 = ETDM_OUT1_CON1; 21962306a36Sopenharmony_ci etdm_reg->con2 = ETDM_OUT1_CON2; 22062306a36Sopenharmony_ci etdm_reg->con3 = ETDM_OUT1_CON3; 22162306a36Sopenharmony_ci etdm_reg->con4 = ETDM_OUT1_CON4; 22262306a36Sopenharmony_ci etdm_reg->con5 = ETDM_OUT1_CON5; 22362306a36Sopenharmony_ci break; 22462306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM2_OUT: 22562306a36Sopenharmony_ci etdm_reg->con0 = ETDM_OUT2_CON0; 22662306a36Sopenharmony_ci etdm_reg->con1 = ETDM_OUT2_CON1; 22762306a36Sopenharmony_ci etdm_reg->con2 = ETDM_OUT2_CON2; 22862306a36Sopenharmony_ci etdm_reg->con3 = ETDM_OUT2_CON3; 22962306a36Sopenharmony_ci etdm_reg->con4 = ETDM_OUT2_CON4; 23062306a36Sopenharmony_ci etdm_reg->con5 = ETDM_OUT2_CON5; 23162306a36Sopenharmony_ci break; 23262306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM3_OUT: 23362306a36Sopenharmony_ci case MT8195_AFE_IO_DPTX: 23462306a36Sopenharmony_ci etdm_reg->con0 = ETDM_OUT3_CON0; 23562306a36Sopenharmony_ci etdm_reg->con1 = ETDM_OUT3_CON1; 23662306a36Sopenharmony_ci etdm_reg->con2 = ETDM_OUT3_CON2; 23762306a36Sopenharmony_ci etdm_reg->con3 = ETDM_OUT3_CON3; 23862306a36Sopenharmony_ci etdm_reg->con4 = ETDM_OUT3_CON4; 23962306a36Sopenharmony_ci etdm_reg->con5 = ETDM_OUT3_CON5; 24062306a36Sopenharmony_ci break; 24162306a36Sopenharmony_ci default: 24262306a36Sopenharmony_ci return -EINVAL; 24362306a36Sopenharmony_ci } 24462306a36Sopenharmony_ci return 0; 24562306a36Sopenharmony_ci} 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_cistatic int get_etdm_dir(unsigned int dai_id) 24862306a36Sopenharmony_ci{ 24962306a36Sopenharmony_ci switch (dai_id) { 25062306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM1_IN: 25162306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM2_IN: 25262306a36Sopenharmony_ci return ETDM_IN; 25362306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM1_OUT: 25462306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM2_OUT: 25562306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM3_OUT: 25662306a36Sopenharmony_ci return ETDM_OUT; 25762306a36Sopenharmony_ci default: 25862306a36Sopenharmony_ci return -EINVAL; 25962306a36Sopenharmony_ci } 26062306a36Sopenharmony_ci} 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_cistatic int get_etdm_wlen(unsigned int bitwidth) 26362306a36Sopenharmony_ci{ 26462306a36Sopenharmony_ci return bitwidth <= 16 ? 16 : 32; 26562306a36Sopenharmony_ci} 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_cistatic int is_cowork_mode(struct snd_soc_dai *dai) 26862306a36Sopenharmony_ci{ 26962306a36Sopenharmony_ci struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 27062306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 27162306a36Sopenharmony_ci struct mtk_dai_etdm_priv *etdm_data; 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci if (!mt8195_afe_etdm_is_valid(dai->id)) 27462306a36Sopenharmony_ci return -EINVAL; 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci etdm_data = afe_priv->dai_priv[dai->id]; 27762306a36Sopenharmony_ci return (etdm_data->cowork_slv_count > 0 || 27862306a36Sopenharmony_ci etdm_data->cowork_source_id != COWORK_ETDM_NONE); 27962306a36Sopenharmony_ci} 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_cistatic int sync_to_dai_id(int source_sel) 28262306a36Sopenharmony_ci{ 28362306a36Sopenharmony_ci switch (source_sel) { 28462306a36Sopenharmony_ci case ETDM_SYNC_FROM_IN1: 28562306a36Sopenharmony_ci return MT8195_AFE_IO_ETDM1_IN; 28662306a36Sopenharmony_ci case ETDM_SYNC_FROM_IN2: 28762306a36Sopenharmony_ci return MT8195_AFE_IO_ETDM2_IN; 28862306a36Sopenharmony_ci case ETDM_SYNC_FROM_OUT1: 28962306a36Sopenharmony_ci return MT8195_AFE_IO_ETDM1_OUT; 29062306a36Sopenharmony_ci case ETDM_SYNC_FROM_OUT2: 29162306a36Sopenharmony_ci return MT8195_AFE_IO_ETDM2_OUT; 29262306a36Sopenharmony_ci case ETDM_SYNC_FROM_OUT3: 29362306a36Sopenharmony_ci return MT8195_AFE_IO_ETDM3_OUT; 29462306a36Sopenharmony_ci default: 29562306a36Sopenharmony_ci return 0; 29662306a36Sopenharmony_ci } 29762306a36Sopenharmony_ci} 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_cistatic int get_etdm_cowork_master_id(struct snd_soc_dai *dai) 30062306a36Sopenharmony_ci{ 30162306a36Sopenharmony_ci struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 30262306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 30362306a36Sopenharmony_ci struct mtk_dai_etdm_priv *etdm_data; 30462306a36Sopenharmony_ci int dai_id; 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ci if (!mt8195_afe_etdm_is_valid(dai->id)) 30762306a36Sopenharmony_ci return -EINVAL; 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci etdm_data = afe_priv->dai_priv[dai->id]; 31062306a36Sopenharmony_ci dai_id = etdm_data->cowork_source_id; 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_ci if (dai_id == COWORK_ETDM_NONE) 31362306a36Sopenharmony_ci dai_id = dai->id; 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_ci return dai_id; 31662306a36Sopenharmony_ci} 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o048_mix[] = { 31962306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN48, 20, 1, 0), 32062306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN48, 22, 1, 0), 32162306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN48_1, 14, 1, 0), 32262306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN48_2, 6, 1, 0), 32362306a36Sopenharmony_ci}; 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o049_mix[] = { 32662306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN49, 21, 1, 0), 32762306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN49, 23, 1, 0), 32862306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN49_1, 15, 1, 0), 32962306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN49_2, 7, 1, 0), 33062306a36Sopenharmony_ci}; 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o050_mix[] = { 33362306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN50, 24, 1, 0), 33462306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN50_1, 16, 1, 0), 33562306a36Sopenharmony_ci}; 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o051_mix[] = { 33862306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN51, 25, 1, 0), 33962306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN51_1, 17, 1, 0), 34062306a36Sopenharmony_ci}; 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o052_mix[] = { 34362306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN52, 26, 1, 0), 34462306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN52_1, 18, 1, 0), 34562306a36Sopenharmony_ci}; 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o053_mix[] = { 34862306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN53, 27, 1, 0), 34962306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN53_1, 19, 1, 0), 35062306a36Sopenharmony_ci}; 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o054_mix[] = { 35362306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN54, 28, 1, 0), 35462306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN54_1, 20, 1, 0), 35562306a36Sopenharmony_ci}; 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o055_mix[] = { 35862306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN55, 29, 1, 0), 35962306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN55_1, 21, 1, 0), 36062306a36Sopenharmony_ci}; 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o056_mix[] = { 36362306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I030 Switch", AFE_CONN56, 30, 1, 0), 36462306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I054 Switch", AFE_CONN56_1, 22, 1, 0), 36562306a36Sopenharmony_ci}; 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o057_mix[] = { 36862306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I031 Switch", AFE_CONN57, 31, 1, 0), 36962306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I055 Switch", AFE_CONN57_1, 23, 1, 0), 37062306a36Sopenharmony_ci}; 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o058_mix[] = { 37362306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I032 Switch", AFE_CONN58_1, 0, 1, 0), 37462306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I056 Switch", AFE_CONN58_1, 24, 1, 0), 37562306a36Sopenharmony_ci}; 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o059_mix[] = { 37862306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I033 Switch", AFE_CONN59_1, 1, 1, 0), 37962306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I057 Switch", AFE_CONN59_1, 25, 1, 0), 38062306a36Sopenharmony_ci}; 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o060_mix[] = { 38362306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I034 Switch", AFE_CONN60_1, 2, 1, 0), 38462306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I058 Switch", AFE_CONN60_1, 26, 1, 0), 38562306a36Sopenharmony_ci}; 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o061_mix[] = { 38862306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I035 Switch", AFE_CONN61_1, 3, 1, 0), 38962306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I059 Switch", AFE_CONN61_1, 27, 1, 0), 39062306a36Sopenharmony_ci}; 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o062_mix[] = { 39362306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I036 Switch", AFE_CONN62_1, 4, 1, 0), 39462306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I060 Switch", AFE_CONN62_1, 28, 1, 0), 39562306a36Sopenharmony_ci}; 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o063_mix[] = { 39862306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I037 Switch", AFE_CONN63_1, 5, 1, 0), 39962306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I061 Switch", AFE_CONN63_1, 29, 1, 0), 40062306a36Sopenharmony_ci}; 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o064_mix[] = { 40362306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I038 Switch", AFE_CONN64_1, 6, 1, 0), 40462306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I062 Switch", AFE_CONN64_1, 30, 1, 0), 40562306a36Sopenharmony_ci}; 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o065_mix[] = { 40862306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I039 Switch", AFE_CONN65_1, 7, 1, 0), 40962306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I063 Switch", AFE_CONN65_1, 31, 1, 0), 41062306a36Sopenharmony_ci}; 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o066_mix[] = { 41362306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I040 Switch", AFE_CONN66_1, 8, 1, 0), 41462306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I064 Switch", AFE_CONN66_2, 0, 1, 0), 41562306a36Sopenharmony_ci}; 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o067_mix[] = { 41862306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I041 Switch", AFE_CONN67_1, 9, 1, 0), 41962306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I065 Switch", AFE_CONN67_2, 1, 1, 0), 42062306a36Sopenharmony_ci}; 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o068_mix[] = { 42362306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I042 Switch", AFE_CONN68_1, 10, 1, 0), 42462306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I066 Switch", AFE_CONN68_2, 2, 1, 0), 42562306a36Sopenharmony_ci}; 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o069_mix[] = { 42862306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I043 Switch", AFE_CONN69_1, 11, 1, 0), 42962306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I067 Switch", AFE_CONN69_2, 3, 1, 0), 43062306a36Sopenharmony_ci}; 43162306a36Sopenharmony_ci 43262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o070_mix[] = { 43362306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I044 Switch", AFE_CONN70_1, 12, 1, 0), 43462306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I068 Switch", AFE_CONN70_2, 4, 1, 0), 43562306a36Sopenharmony_ci}; 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o071_mix[] = { 43862306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I045 Switch", AFE_CONN71_1, 13, 1, 0), 43962306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I069 Switch", AFE_CONN71_2, 5, 1, 0), 44062306a36Sopenharmony_ci}; 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o072_mix[] = { 44362306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN72, 20, 1, 0), 44462306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN72, 22, 1, 0), 44562306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN72_1, 14, 1, 0), 44662306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN72_2, 6, 1, 0), 44762306a36Sopenharmony_ci}; 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o073_mix[] = { 45062306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN73, 21, 1, 0), 45162306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN73, 23, 1, 0), 45262306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN73_1, 15, 1, 0), 45362306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN73_2, 7, 1, 0), 45462306a36Sopenharmony_ci}; 45562306a36Sopenharmony_ci 45662306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o074_mix[] = { 45762306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN74, 24, 1, 0), 45862306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN74_1, 16, 1, 0), 45962306a36Sopenharmony_ci}; 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o075_mix[] = { 46262306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN75, 25, 1, 0), 46362306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN75_1, 17, 1, 0), 46462306a36Sopenharmony_ci}; 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o076_mix[] = { 46762306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN76, 26, 1, 0), 46862306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN76_1, 18, 1, 0), 46962306a36Sopenharmony_ci}; 47062306a36Sopenharmony_ci 47162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o077_mix[] = { 47262306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN77, 27, 1, 0), 47362306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN77_1, 19, 1, 0), 47462306a36Sopenharmony_ci}; 47562306a36Sopenharmony_ci 47662306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o078_mix[] = { 47762306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN78, 28, 1, 0), 47862306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN78_1, 20, 1, 0), 47962306a36Sopenharmony_ci}; 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o079_mix[] = { 48262306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN79, 29, 1, 0), 48362306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN79_1, 21, 1, 0), 48462306a36Sopenharmony_ci}; 48562306a36Sopenharmony_ci 48662306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o080_mix[] = { 48762306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I030 Switch", AFE_CONN80, 30, 1, 0), 48862306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I054 Switch", AFE_CONN80_1, 22, 1, 0), 48962306a36Sopenharmony_ci}; 49062306a36Sopenharmony_ci 49162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o081_mix[] = { 49262306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I031 Switch", AFE_CONN81, 31, 1, 0), 49362306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I055 Switch", AFE_CONN81_1, 23, 1, 0), 49462306a36Sopenharmony_ci}; 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o082_mix[] = { 49762306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I032 Switch", AFE_CONN82_1, 0, 1, 0), 49862306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I056 Switch", AFE_CONN82_1, 24, 1, 0), 49962306a36Sopenharmony_ci}; 50062306a36Sopenharmony_ci 50162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o083_mix[] = { 50262306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I033 Switch", AFE_CONN83_1, 1, 1, 0), 50362306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I057 Switch", AFE_CONN83_1, 25, 1, 0), 50462306a36Sopenharmony_ci}; 50562306a36Sopenharmony_ci 50662306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o084_mix[] = { 50762306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I034 Switch", AFE_CONN84_1, 2, 1, 0), 50862306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I058 Switch", AFE_CONN84_1, 26, 1, 0), 50962306a36Sopenharmony_ci}; 51062306a36Sopenharmony_ci 51162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o085_mix[] = { 51262306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I035 Switch", AFE_CONN85_1, 3, 1, 0), 51362306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I059 Switch", AFE_CONN85_1, 27, 1, 0), 51462306a36Sopenharmony_ci}; 51562306a36Sopenharmony_ci 51662306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o086_mix[] = { 51762306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I036 Switch", AFE_CONN86_1, 4, 1, 0), 51862306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I060 Switch", AFE_CONN86_1, 28, 1, 0), 51962306a36Sopenharmony_ci}; 52062306a36Sopenharmony_ci 52162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o087_mix[] = { 52262306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I037 Switch", AFE_CONN87_1, 5, 1, 0), 52362306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I061 Switch", AFE_CONN87_1, 29, 1, 0), 52462306a36Sopenharmony_ci}; 52562306a36Sopenharmony_ci 52662306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o088_mix[] = { 52762306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I038 Switch", AFE_CONN88_1, 6, 1, 0), 52862306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I062 Switch", AFE_CONN88_1, 30, 1, 0), 52962306a36Sopenharmony_ci}; 53062306a36Sopenharmony_ci 53162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o089_mix[] = { 53262306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I039 Switch", AFE_CONN89_1, 7, 1, 0), 53362306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I063 Switch", AFE_CONN89_1, 31, 1, 0), 53462306a36Sopenharmony_ci}; 53562306a36Sopenharmony_ci 53662306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o090_mix[] = { 53762306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I040 Switch", AFE_CONN90_1, 8, 1, 0), 53862306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I064 Switch", AFE_CONN90_2, 0, 1, 0), 53962306a36Sopenharmony_ci}; 54062306a36Sopenharmony_ci 54162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o091_mix[] = { 54262306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I041 Switch", AFE_CONN91_1, 9, 1, 0), 54362306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I065 Switch", AFE_CONN91_2, 1, 1, 0), 54462306a36Sopenharmony_ci}; 54562306a36Sopenharmony_ci 54662306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o092_mix[] = { 54762306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I042 Switch", AFE_CONN92_1, 10, 1, 0), 54862306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I066 Switch", AFE_CONN92_2, 2, 1, 0), 54962306a36Sopenharmony_ci}; 55062306a36Sopenharmony_ci 55162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o093_mix[] = { 55262306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I043 Switch", AFE_CONN93_1, 11, 1, 0), 55362306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I067 Switch", AFE_CONN93_2, 3, 1, 0), 55462306a36Sopenharmony_ci}; 55562306a36Sopenharmony_ci 55662306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o094_mix[] = { 55762306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I044 Switch", AFE_CONN94_1, 12, 1, 0), 55862306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I068 Switch", AFE_CONN94_2, 4, 1, 0), 55962306a36Sopenharmony_ci}; 56062306a36Sopenharmony_ci 56162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o095_mix[] = { 56262306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I045 Switch", AFE_CONN95_1, 13, 1, 0), 56362306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("I069 Switch", AFE_CONN95_2, 5, 1, 0), 56462306a36Sopenharmony_ci}; 56562306a36Sopenharmony_ci 56662306a36Sopenharmony_cistatic const char * const mt8195_etdm_clk_src_sel_text[] = { 56762306a36Sopenharmony_ci "26m", 56862306a36Sopenharmony_ci "a1sys_a2sys", 56962306a36Sopenharmony_ci "a3sys", 57062306a36Sopenharmony_ci "a4sys", 57162306a36Sopenharmony_ci}; 57262306a36Sopenharmony_ci 57362306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_EXT_DECL(etdmout_clk_src_enum, 57462306a36Sopenharmony_ci mt8195_etdm_clk_src_sel_text); 57562306a36Sopenharmony_ci 57662306a36Sopenharmony_cistatic const char * const hdmitx_dptx_mux_map[] = { 57762306a36Sopenharmony_ci "Disconnect", "Connect", 57862306a36Sopenharmony_ci}; 57962306a36Sopenharmony_ci 58062306a36Sopenharmony_cistatic int hdmitx_dptx_mux_map_value[] = { 58162306a36Sopenharmony_ci 0, 1, 58262306a36Sopenharmony_ci}; 58362306a36Sopenharmony_ci 58462306a36Sopenharmony_ci/* HDMI_OUT_MUX */ 58562306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(hdmi_out_mux_map_enum, 58662306a36Sopenharmony_ci SND_SOC_NOPM, 58762306a36Sopenharmony_ci 0, 58862306a36Sopenharmony_ci 1, 58962306a36Sopenharmony_ci hdmitx_dptx_mux_map, 59062306a36Sopenharmony_ci hdmitx_dptx_mux_map_value); 59162306a36Sopenharmony_ci 59262306a36Sopenharmony_cistatic const struct snd_kcontrol_new hdmi_out_mux_control = 59362306a36Sopenharmony_ci SOC_DAPM_ENUM("HDMI_OUT_MUX", hdmi_out_mux_map_enum); 59462306a36Sopenharmony_ci 59562306a36Sopenharmony_ci/* DPTX_OUT_MUX */ 59662306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(dptx_out_mux_map_enum, 59762306a36Sopenharmony_ci SND_SOC_NOPM, 59862306a36Sopenharmony_ci 0, 59962306a36Sopenharmony_ci 1, 60062306a36Sopenharmony_ci hdmitx_dptx_mux_map, 60162306a36Sopenharmony_ci hdmitx_dptx_mux_map_value); 60262306a36Sopenharmony_ci 60362306a36Sopenharmony_cistatic const struct snd_kcontrol_new dptx_out_mux_control = 60462306a36Sopenharmony_ci SOC_DAPM_ENUM("DPTX_OUT_MUX", dptx_out_mux_map_enum); 60562306a36Sopenharmony_ci 60662306a36Sopenharmony_ci/* HDMI_CH0_MUX ~ HDMI_CH7_MUX */ 60762306a36Sopenharmony_cistatic const char *const afe_conn_hdmi_mux_map[] = { 60862306a36Sopenharmony_ci "CH0", "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", 60962306a36Sopenharmony_ci}; 61062306a36Sopenharmony_ci 61162306a36Sopenharmony_cistatic int afe_conn_hdmi_mux_map_value[] = { 61262306a36Sopenharmony_ci 0, 1, 2, 3, 4, 5, 6, 7, 61362306a36Sopenharmony_ci}; 61462306a36Sopenharmony_ci 61562306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch0_mux_map_enum, 61662306a36Sopenharmony_ci AFE_TDMOUT_CONN0, 61762306a36Sopenharmony_ci 0, 61862306a36Sopenharmony_ci 0xf, 61962306a36Sopenharmony_ci afe_conn_hdmi_mux_map, 62062306a36Sopenharmony_ci afe_conn_hdmi_mux_map_value); 62162306a36Sopenharmony_ci 62262306a36Sopenharmony_cistatic const struct snd_kcontrol_new hdmi_ch0_mux_control = 62362306a36Sopenharmony_ci SOC_DAPM_ENUM("HDMI_CH0_MUX", hdmi_ch0_mux_map_enum); 62462306a36Sopenharmony_ci 62562306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch1_mux_map_enum, 62662306a36Sopenharmony_ci AFE_TDMOUT_CONN0, 62762306a36Sopenharmony_ci 4, 62862306a36Sopenharmony_ci 0xf, 62962306a36Sopenharmony_ci afe_conn_hdmi_mux_map, 63062306a36Sopenharmony_ci afe_conn_hdmi_mux_map_value); 63162306a36Sopenharmony_ci 63262306a36Sopenharmony_cistatic const struct snd_kcontrol_new hdmi_ch1_mux_control = 63362306a36Sopenharmony_ci SOC_DAPM_ENUM("HDMI_CH1_MUX", hdmi_ch1_mux_map_enum); 63462306a36Sopenharmony_ci 63562306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch2_mux_map_enum, 63662306a36Sopenharmony_ci AFE_TDMOUT_CONN0, 63762306a36Sopenharmony_ci 8, 63862306a36Sopenharmony_ci 0xf, 63962306a36Sopenharmony_ci afe_conn_hdmi_mux_map, 64062306a36Sopenharmony_ci afe_conn_hdmi_mux_map_value); 64162306a36Sopenharmony_ci 64262306a36Sopenharmony_cistatic const struct snd_kcontrol_new hdmi_ch2_mux_control = 64362306a36Sopenharmony_ci SOC_DAPM_ENUM("HDMI_CH2_MUX", hdmi_ch2_mux_map_enum); 64462306a36Sopenharmony_ci 64562306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch3_mux_map_enum, 64662306a36Sopenharmony_ci AFE_TDMOUT_CONN0, 64762306a36Sopenharmony_ci 12, 64862306a36Sopenharmony_ci 0xf, 64962306a36Sopenharmony_ci afe_conn_hdmi_mux_map, 65062306a36Sopenharmony_ci afe_conn_hdmi_mux_map_value); 65162306a36Sopenharmony_ci 65262306a36Sopenharmony_cistatic const struct snd_kcontrol_new hdmi_ch3_mux_control = 65362306a36Sopenharmony_ci SOC_DAPM_ENUM("HDMI_CH3_MUX", hdmi_ch3_mux_map_enum); 65462306a36Sopenharmony_ci 65562306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch4_mux_map_enum, 65662306a36Sopenharmony_ci AFE_TDMOUT_CONN0, 65762306a36Sopenharmony_ci 16, 65862306a36Sopenharmony_ci 0xf, 65962306a36Sopenharmony_ci afe_conn_hdmi_mux_map, 66062306a36Sopenharmony_ci afe_conn_hdmi_mux_map_value); 66162306a36Sopenharmony_ci 66262306a36Sopenharmony_cistatic const struct snd_kcontrol_new hdmi_ch4_mux_control = 66362306a36Sopenharmony_ci SOC_DAPM_ENUM("HDMI_CH4_MUX", hdmi_ch4_mux_map_enum); 66462306a36Sopenharmony_ci 66562306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch5_mux_map_enum, 66662306a36Sopenharmony_ci AFE_TDMOUT_CONN0, 66762306a36Sopenharmony_ci 20, 66862306a36Sopenharmony_ci 0xf, 66962306a36Sopenharmony_ci afe_conn_hdmi_mux_map, 67062306a36Sopenharmony_ci afe_conn_hdmi_mux_map_value); 67162306a36Sopenharmony_ci 67262306a36Sopenharmony_cistatic const struct snd_kcontrol_new hdmi_ch5_mux_control = 67362306a36Sopenharmony_ci SOC_DAPM_ENUM("HDMI_CH5_MUX", hdmi_ch5_mux_map_enum); 67462306a36Sopenharmony_ci 67562306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch6_mux_map_enum, 67662306a36Sopenharmony_ci AFE_TDMOUT_CONN0, 67762306a36Sopenharmony_ci 24, 67862306a36Sopenharmony_ci 0xf, 67962306a36Sopenharmony_ci afe_conn_hdmi_mux_map, 68062306a36Sopenharmony_ci afe_conn_hdmi_mux_map_value); 68162306a36Sopenharmony_ci 68262306a36Sopenharmony_cistatic const struct snd_kcontrol_new hdmi_ch6_mux_control = 68362306a36Sopenharmony_ci SOC_DAPM_ENUM("HDMI_CH6_MUX", hdmi_ch6_mux_map_enum); 68462306a36Sopenharmony_ci 68562306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch7_mux_map_enum, 68662306a36Sopenharmony_ci AFE_TDMOUT_CONN0, 68762306a36Sopenharmony_ci 28, 68862306a36Sopenharmony_ci 0xf, 68962306a36Sopenharmony_ci afe_conn_hdmi_mux_map, 69062306a36Sopenharmony_ci afe_conn_hdmi_mux_map_value); 69162306a36Sopenharmony_ci 69262306a36Sopenharmony_cistatic const struct snd_kcontrol_new hdmi_ch7_mux_control = 69362306a36Sopenharmony_ci SOC_DAPM_ENUM("HDMI_CH7_MUX", hdmi_ch7_mux_map_enum); 69462306a36Sopenharmony_ci 69562306a36Sopenharmony_cistatic int mt8195_etdm_clk_src_sel_put(struct snd_kcontrol *kcontrol, 69662306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 69762306a36Sopenharmony_ci{ 69862306a36Sopenharmony_ci struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 69962306a36Sopenharmony_ci struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 70062306a36Sopenharmony_ci struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); 70162306a36Sopenharmony_ci unsigned int source = ucontrol->value.enumerated.item[0]; 70262306a36Sopenharmony_ci unsigned int val; 70362306a36Sopenharmony_ci unsigned int mask; 70462306a36Sopenharmony_ci unsigned int reg; 70562306a36Sopenharmony_ci 70662306a36Sopenharmony_ci if (source >= e->items) 70762306a36Sopenharmony_ci return -EINVAL; 70862306a36Sopenharmony_ci 70962306a36Sopenharmony_ci reg = 0; 71062306a36Sopenharmony_ci if (!strcmp(kcontrol->id.name, "ETDM_OUT1_Clock_Source")) { 71162306a36Sopenharmony_ci reg = ETDM_OUT1_CON4; 71262306a36Sopenharmony_ci mask = ETDM_OUT_CON4_CLOCK_MASK; 71362306a36Sopenharmony_ci val = ETDM_OUT_CON4_CLOCK(source); 71462306a36Sopenharmony_ci } else if (!strcmp(kcontrol->id.name, "ETDM_OUT2_Clock_Source")) { 71562306a36Sopenharmony_ci reg = ETDM_OUT2_CON4; 71662306a36Sopenharmony_ci mask = ETDM_OUT_CON4_CLOCK_MASK; 71762306a36Sopenharmony_ci val = ETDM_OUT_CON4_CLOCK(source); 71862306a36Sopenharmony_ci } else if (!strcmp(kcontrol->id.name, "ETDM_OUT3_Clock_Source")) { 71962306a36Sopenharmony_ci reg = ETDM_OUT3_CON4; 72062306a36Sopenharmony_ci mask = ETDM_OUT_CON4_CLOCK_MASK; 72162306a36Sopenharmony_ci val = ETDM_OUT_CON4_CLOCK(source); 72262306a36Sopenharmony_ci } else if (!strcmp(kcontrol->id.name, "ETDM_IN1_Clock_Source")) { 72362306a36Sopenharmony_ci reg = ETDM_IN1_CON2; 72462306a36Sopenharmony_ci mask = ETDM_IN_CON2_CLOCK_MASK; 72562306a36Sopenharmony_ci val = ETDM_IN_CON2_CLOCK(source); 72662306a36Sopenharmony_ci } else if (!strcmp(kcontrol->id.name, "ETDM_IN2_Clock_Source")) { 72762306a36Sopenharmony_ci reg = ETDM_IN2_CON2; 72862306a36Sopenharmony_ci mask = ETDM_IN_CON2_CLOCK_MASK; 72962306a36Sopenharmony_ci val = ETDM_IN_CON2_CLOCK(source); 73062306a36Sopenharmony_ci } 73162306a36Sopenharmony_ci 73262306a36Sopenharmony_ci if (reg) 73362306a36Sopenharmony_ci regmap_update_bits(afe->regmap, reg, mask, val); 73462306a36Sopenharmony_ci 73562306a36Sopenharmony_ci return 0; 73662306a36Sopenharmony_ci} 73762306a36Sopenharmony_ci 73862306a36Sopenharmony_cistatic int mt8195_etdm_clk_src_sel_get(struct snd_kcontrol *kcontrol, 73962306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 74062306a36Sopenharmony_ci{ 74162306a36Sopenharmony_ci struct snd_soc_component *component = 74262306a36Sopenharmony_ci snd_soc_kcontrol_component(kcontrol); 74362306a36Sopenharmony_ci struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); 74462306a36Sopenharmony_ci unsigned int value = 0; 74562306a36Sopenharmony_ci unsigned int reg = 0; 74662306a36Sopenharmony_ci unsigned int mask = 0; 74762306a36Sopenharmony_ci unsigned int shift = 0; 74862306a36Sopenharmony_ci 74962306a36Sopenharmony_ci if (!strcmp(kcontrol->id.name, "ETDM_OUT1_Clock_Source")) { 75062306a36Sopenharmony_ci reg = ETDM_OUT1_CON4; 75162306a36Sopenharmony_ci mask = ETDM_OUT_CON4_CLOCK_MASK; 75262306a36Sopenharmony_ci shift = ETDM_OUT_CON4_CLOCK_SHIFT; 75362306a36Sopenharmony_ci } else if (!strcmp(kcontrol->id.name, "ETDM_OUT2_Clock_Source")) { 75462306a36Sopenharmony_ci reg = ETDM_OUT2_CON4; 75562306a36Sopenharmony_ci mask = ETDM_OUT_CON4_CLOCK_MASK; 75662306a36Sopenharmony_ci shift = ETDM_OUT_CON4_CLOCK_SHIFT; 75762306a36Sopenharmony_ci } else if (!strcmp(kcontrol->id.name, "ETDM_OUT3_Clock_Source")) { 75862306a36Sopenharmony_ci reg = ETDM_OUT3_CON4; 75962306a36Sopenharmony_ci mask = ETDM_OUT_CON4_CLOCK_MASK; 76062306a36Sopenharmony_ci shift = ETDM_OUT_CON4_CLOCK_SHIFT; 76162306a36Sopenharmony_ci } else if (!strcmp(kcontrol->id.name, "ETDM_IN1_Clock_Source")) { 76262306a36Sopenharmony_ci reg = ETDM_IN1_CON2; 76362306a36Sopenharmony_ci mask = ETDM_IN_CON2_CLOCK_MASK; 76462306a36Sopenharmony_ci shift = ETDM_IN_CON2_CLOCK_SHIFT; 76562306a36Sopenharmony_ci } else if (!strcmp(kcontrol->id.name, "ETDM_IN2_Clock_Source")) { 76662306a36Sopenharmony_ci reg = ETDM_IN2_CON2; 76762306a36Sopenharmony_ci mask = ETDM_IN_CON2_CLOCK_MASK; 76862306a36Sopenharmony_ci shift = ETDM_IN_CON2_CLOCK_SHIFT; 76962306a36Sopenharmony_ci } 77062306a36Sopenharmony_ci 77162306a36Sopenharmony_ci if (reg) 77262306a36Sopenharmony_ci regmap_read(afe->regmap, reg, &value); 77362306a36Sopenharmony_ci 77462306a36Sopenharmony_ci value &= mask; 77562306a36Sopenharmony_ci value >>= shift; 77662306a36Sopenharmony_ci ucontrol->value.enumerated.item[0] = value; 77762306a36Sopenharmony_ci return 0; 77862306a36Sopenharmony_ci} 77962306a36Sopenharmony_ci 78062306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_controls[] = { 78162306a36Sopenharmony_ci SOC_ENUM_EXT("ETDM_OUT1_Clock_Source", 78262306a36Sopenharmony_ci etdmout_clk_src_enum, 78362306a36Sopenharmony_ci mt8195_etdm_clk_src_sel_get, 78462306a36Sopenharmony_ci mt8195_etdm_clk_src_sel_put), 78562306a36Sopenharmony_ci SOC_ENUM_EXT("ETDM_OUT2_Clock_Source", 78662306a36Sopenharmony_ci etdmout_clk_src_enum, 78762306a36Sopenharmony_ci mt8195_etdm_clk_src_sel_get, 78862306a36Sopenharmony_ci mt8195_etdm_clk_src_sel_put), 78962306a36Sopenharmony_ci SOC_ENUM_EXT("ETDM_OUT3_Clock_Source", 79062306a36Sopenharmony_ci etdmout_clk_src_enum, 79162306a36Sopenharmony_ci mt8195_etdm_clk_src_sel_get, 79262306a36Sopenharmony_ci mt8195_etdm_clk_src_sel_put), 79362306a36Sopenharmony_ci SOC_ENUM_EXT("ETDM_IN1_Clock_Source", 79462306a36Sopenharmony_ci etdmout_clk_src_enum, 79562306a36Sopenharmony_ci mt8195_etdm_clk_src_sel_get, 79662306a36Sopenharmony_ci mt8195_etdm_clk_src_sel_put), 79762306a36Sopenharmony_ci SOC_ENUM_EXT("ETDM_IN2_Clock_Source", 79862306a36Sopenharmony_ci etdmout_clk_src_enum, 79962306a36Sopenharmony_ci mt8195_etdm_clk_src_sel_get, 80062306a36Sopenharmony_ci mt8195_etdm_clk_src_sel_put), 80162306a36Sopenharmony_ci}; 80262306a36Sopenharmony_ci 80362306a36Sopenharmony_cistatic const struct snd_soc_dapm_widget mtk_dai_etdm_widgets[] = { 80462306a36Sopenharmony_ci /* eTDM_IN2 */ 80562306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I012", SND_SOC_NOPM, 0, 0, NULL, 0), 80662306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I013", SND_SOC_NOPM, 0, 0, NULL, 0), 80762306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I014", SND_SOC_NOPM, 0, 0, NULL, 0), 80862306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I015", SND_SOC_NOPM, 0, 0, NULL, 0), 80962306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I016", SND_SOC_NOPM, 0, 0, NULL, 0), 81062306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I017", SND_SOC_NOPM, 0, 0, NULL, 0), 81162306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I018", SND_SOC_NOPM, 0, 0, NULL, 0), 81262306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I019", SND_SOC_NOPM, 0, 0, NULL, 0), 81362306a36Sopenharmony_ci 81462306a36Sopenharmony_ci /* eTDM_IN1 */ 81562306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I072", SND_SOC_NOPM, 0, 0, NULL, 0), 81662306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I073", SND_SOC_NOPM, 0, 0, NULL, 0), 81762306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I074", SND_SOC_NOPM, 0, 0, NULL, 0), 81862306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I075", SND_SOC_NOPM, 0, 0, NULL, 0), 81962306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I076", SND_SOC_NOPM, 0, 0, NULL, 0), 82062306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I077", SND_SOC_NOPM, 0, 0, NULL, 0), 82162306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I078", SND_SOC_NOPM, 0, 0, NULL, 0), 82262306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I079", SND_SOC_NOPM, 0, 0, NULL, 0), 82362306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I080", SND_SOC_NOPM, 0, 0, NULL, 0), 82462306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I081", SND_SOC_NOPM, 0, 0, NULL, 0), 82562306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I082", SND_SOC_NOPM, 0, 0, NULL, 0), 82662306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I083", SND_SOC_NOPM, 0, 0, NULL, 0), 82762306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I084", SND_SOC_NOPM, 0, 0, NULL, 0), 82862306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I085", SND_SOC_NOPM, 0, 0, NULL, 0), 82962306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I086", SND_SOC_NOPM, 0, 0, NULL, 0), 83062306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I087", SND_SOC_NOPM, 0, 0, NULL, 0), 83162306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I088", SND_SOC_NOPM, 0, 0, NULL, 0), 83262306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I089", SND_SOC_NOPM, 0, 0, NULL, 0), 83362306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I090", SND_SOC_NOPM, 0, 0, NULL, 0), 83462306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I091", SND_SOC_NOPM, 0, 0, NULL, 0), 83562306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I092", SND_SOC_NOPM, 0, 0, NULL, 0), 83662306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I093", SND_SOC_NOPM, 0, 0, NULL, 0), 83762306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I094", SND_SOC_NOPM, 0, 0, NULL, 0), 83862306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("I095", SND_SOC_NOPM, 0, 0, NULL, 0), 83962306a36Sopenharmony_ci 84062306a36Sopenharmony_ci /* eTDM_OUT2 */ 84162306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O048", SND_SOC_NOPM, 0, 0, 84262306a36Sopenharmony_ci mtk_dai_etdm_o048_mix, 84362306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o048_mix)), 84462306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O049", SND_SOC_NOPM, 0, 0, 84562306a36Sopenharmony_ci mtk_dai_etdm_o049_mix, 84662306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o049_mix)), 84762306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O050", SND_SOC_NOPM, 0, 0, 84862306a36Sopenharmony_ci mtk_dai_etdm_o050_mix, 84962306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o050_mix)), 85062306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O051", SND_SOC_NOPM, 0, 0, 85162306a36Sopenharmony_ci mtk_dai_etdm_o051_mix, 85262306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o051_mix)), 85362306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O052", SND_SOC_NOPM, 0, 0, 85462306a36Sopenharmony_ci mtk_dai_etdm_o052_mix, 85562306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o052_mix)), 85662306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O053", SND_SOC_NOPM, 0, 0, 85762306a36Sopenharmony_ci mtk_dai_etdm_o053_mix, 85862306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o053_mix)), 85962306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O054", SND_SOC_NOPM, 0, 0, 86062306a36Sopenharmony_ci mtk_dai_etdm_o054_mix, 86162306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o054_mix)), 86262306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O055", SND_SOC_NOPM, 0, 0, 86362306a36Sopenharmony_ci mtk_dai_etdm_o055_mix, 86462306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o055_mix)), 86562306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O056", SND_SOC_NOPM, 0, 0, 86662306a36Sopenharmony_ci mtk_dai_etdm_o056_mix, 86762306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o056_mix)), 86862306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O057", SND_SOC_NOPM, 0, 0, 86962306a36Sopenharmony_ci mtk_dai_etdm_o057_mix, 87062306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o057_mix)), 87162306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O058", SND_SOC_NOPM, 0, 0, 87262306a36Sopenharmony_ci mtk_dai_etdm_o058_mix, 87362306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o058_mix)), 87462306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O059", SND_SOC_NOPM, 0, 0, 87562306a36Sopenharmony_ci mtk_dai_etdm_o059_mix, 87662306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o059_mix)), 87762306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O060", SND_SOC_NOPM, 0, 0, 87862306a36Sopenharmony_ci mtk_dai_etdm_o060_mix, 87962306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o060_mix)), 88062306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O061", SND_SOC_NOPM, 0, 0, 88162306a36Sopenharmony_ci mtk_dai_etdm_o061_mix, 88262306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o061_mix)), 88362306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O062", SND_SOC_NOPM, 0, 0, 88462306a36Sopenharmony_ci mtk_dai_etdm_o062_mix, 88562306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o062_mix)), 88662306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O063", SND_SOC_NOPM, 0, 0, 88762306a36Sopenharmony_ci mtk_dai_etdm_o063_mix, 88862306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o063_mix)), 88962306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O064", SND_SOC_NOPM, 0, 0, 89062306a36Sopenharmony_ci mtk_dai_etdm_o064_mix, 89162306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o064_mix)), 89262306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O065", SND_SOC_NOPM, 0, 0, 89362306a36Sopenharmony_ci mtk_dai_etdm_o065_mix, 89462306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o065_mix)), 89562306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O066", SND_SOC_NOPM, 0, 0, 89662306a36Sopenharmony_ci mtk_dai_etdm_o066_mix, 89762306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o066_mix)), 89862306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O067", SND_SOC_NOPM, 0, 0, 89962306a36Sopenharmony_ci mtk_dai_etdm_o067_mix, 90062306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o067_mix)), 90162306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O068", SND_SOC_NOPM, 0, 0, 90262306a36Sopenharmony_ci mtk_dai_etdm_o068_mix, 90362306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o068_mix)), 90462306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O069", SND_SOC_NOPM, 0, 0, 90562306a36Sopenharmony_ci mtk_dai_etdm_o069_mix, 90662306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o069_mix)), 90762306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O070", SND_SOC_NOPM, 0, 0, 90862306a36Sopenharmony_ci mtk_dai_etdm_o070_mix, 90962306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o070_mix)), 91062306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O071", SND_SOC_NOPM, 0, 0, 91162306a36Sopenharmony_ci mtk_dai_etdm_o071_mix, 91262306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o071_mix)), 91362306a36Sopenharmony_ci 91462306a36Sopenharmony_ci /* eTDM_OUT1 */ 91562306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O072", SND_SOC_NOPM, 0, 0, 91662306a36Sopenharmony_ci mtk_dai_etdm_o072_mix, 91762306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o072_mix)), 91862306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O073", SND_SOC_NOPM, 0, 0, 91962306a36Sopenharmony_ci mtk_dai_etdm_o073_mix, 92062306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o073_mix)), 92162306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O074", SND_SOC_NOPM, 0, 0, 92262306a36Sopenharmony_ci mtk_dai_etdm_o074_mix, 92362306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o074_mix)), 92462306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O075", SND_SOC_NOPM, 0, 0, 92562306a36Sopenharmony_ci mtk_dai_etdm_o075_mix, 92662306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o075_mix)), 92762306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O076", SND_SOC_NOPM, 0, 0, 92862306a36Sopenharmony_ci mtk_dai_etdm_o076_mix, 92962306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o076_mix)), 93062306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O077", SND_SOC_NOPM, 0, 0, 93162306a36Sopenharmony_ci mtk_dai_etdm_o077_mix, 93262306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o077_mix)), 93362306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O078", SND_SOC_NOPM, 0, 0, 93462306a36Sopenharmony_ci mtk_dai_etdm_o078_mix, 93562306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o078_mix)), 93662306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O079", SND_SOC_NOPM, 0, 0, 93762306a36Sopenharmony_ci mtk_dai_etdm_o079_mix, 93862306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o079_mix)), 93962306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O080", SND_SOC_NOPM, 0, 0, 94062306a36Sopenharmony_ci mtk_dai_etdm_o080_mix, 94162306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o080_mix)), 94262306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O081", SND_SOC_NOPM, 0, 0, 94362306a36Sopenharmony_ci mtk_dai_etdm_o081_mix, 94462306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o081_mix)), 94562306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O082", SND_SOC_NOPM, 0, 0, 94662306a36Sopenharmony_ci mtk_dai_etdm_o082_mix, 94762306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o082_mix)), 94862306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O083", SND_SOC_NOPM, 0, 0, 94962306a36Sopenharmony_ci mtk_dai_etdm_o083_mix, 95062306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o083_mix)), 95162306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O084", SND_SOC_NOPM, 0, 0, 95262306a36Sopenharmony_ci mtk_dai_etdm_o084_mix, 95362306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o084_mix)), 95462306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O085", SND_SOC_NOPM, 0, 0, 95562306a36Sopenharmony_ci mtk_dai_etdm_o085_mix, 95662306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o085_mix)), 95762306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O086", SND_SOC_NOPM, 0, 0, 95862306a36Sopenharmony_ci mtk_dai_etdm_o086_mix, 95962306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o086_mix)), 96062306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O087", SND_SOC_NOPM, 0, 0, 96162306a36Sopenharmony_ci mtk_dai_etdm_o087_mix, 96262306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o087_mix)), 96362306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O088", SND_SOC_NOPM, 0, 0, 96462306a36Sopenharmony_ci mtk_dai_etdm_o088_mix, 96562306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o088_mix)), 96662306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O089", SND_SOC_NOPM, 0, 0, 96762306a36Sopenharmony_ci mtk_dai_etdm_o089_mix, 96862306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o089_mix)), 96962306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O090", SND_SOC_NOPM, 0, 0, 97062306a36Sopenharmony_ci mtk_dai_etdm_o090_mix, 97162306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o090_mix)), 97262306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O091", SND_SOC_NOPM, 0, 0, 97362306a36Sopenharmony_ci mtk_dai_etdm_o091_mix, 97462306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o091_mix)), 97562306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O092", SND_SOC_NOPM, 0, 0, 97662306a36Sopenharmony_ci mtk_dai_etdm_o092_mix, 97762306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o092_mix)), 97862306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O093", SND_SOC_NOPM, 0, 0, 97962306a36Sopenharmony_ci mtk_dai_etdm_o093_mix, 98062306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o093_mix)), 98162306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O094", SND_SOC_NOPM, 0, 0, 98262306a36Sopenharmony_ci mtk_dai_etdm_o094_mix, 98362306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o094_mix)), 98462306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("O095", SND_SOC_NOPM, 0, 0, 98562306a36Sopenharmony_ci mtk_dai_etdm_o095_mix, 98662306a36Sopenharmony_ci ARRAY_SIZE(mtk_dai_etdm_o095_mix)), 98762306a36Sopenharmony_ci 98862306a36Sopenharmony_ci /* eTDM_OUT3 */ 98962306a36Sopenharmony_ci SND_SOC_DAPM_MUX("HDMI_OUT_MUX", SND_SOC_NOPM, 0, 0, 99062306a36Sopenharmony_ci &hdmi_out_mux_control), 99162306a36Sopenharmony_ci SND_SOC_DAPM_MUX("DPTX_OUT_MUX", SND_SOC_NOPM, 0, 0, 99262306a36Sopenharmony_ci &dptx_out_mux_control), 99362306a36Sopenharmony_ci 99462306a36Sopenharmony_ci SND_SOC_DAPM_MUX("HDMI_CH0_MUX", SND_SOC_NOPM, 0, 0, 99562306a36Sopenharmony_ci &hdmi_ch0_mux_control), 99662306a36Sopenharmony_ci SND_SOC_DAPM_MUX("HDMI_CH1_MUX", SND_SOC_NOPM, 0, 0, 99762306a36Sopenharmony_ci &hdmi_ch1_mux_control), 99862306a36Sopenharmony_ci SND_SOC_DAPM_MUX("HDMI_CH2_MUX", SND_SOC_NOPM, 0, 0, 99962306a36Sopenharmony_ci &hdmi_ch2_mux_control), 100062306a36Sopenharmony_ci SND_SOC_DAPM_MUX("HDMI_CH3_MUX", SND_SOC_NOPM, 0, 0, 100162306a36Sopenharmony_ci &hdmi_ch3_mux_control), 100262306a36Sopenharmony_ci SND_SOC_DAPM_MUX("HDMI_CH4_MUX", SND_SOC_NOPM, 0, 0, 100362306a36Sopenharmony_ci &hdmi_ch4_mux_control), 100462306a36Sopenharmony_ci SND_SOC_DAPM_MUX("HDMI_CH5_MUX", SND_SOC_NOPM, 0, 0, 100562306a36Sopenharmony_ci &hdmi_ch5_mux_control), 100662306a36Sopenharmony_ci SND_SOC_DAPM_MUX("HDMI_CH6_MUX", SND_SOC_NOPM, 0, 0, 100762306a36Sopenharmony_ci &hdmi_ch6_mux_control), 100862306a36Sopenharmony_ci SND_SOC_DAPM_MUX("HDMI_CH7_MUX", SND_SOC_NOPM, 0, 0, 100962306a36Sopenharmony_ci &hdmi_ch7_mux_control), 101062306a36Sopenharmony_ci 101162306a36Sopenharmony_ci SND_SOC_DAPM_INPUT("ETDM_INPUT"), 101262306a36Sopenharmony_ci SND_SOC_DAPM_OUTPUT("ETDM_OUTPUT"), 101362306a36Sopenharmony_ci}; 101462306a36Sopenharmony_ci 101562306a36Sopenharmony_cistatic const struct snd_soc_dapm_route mtk_dai_etdm_routes[] = { 101662306a36Sopenharmony_ci {"I012", NULL, "ETDM2 Capture"}, 101762306a36Sopenharmony_ci {"I013", NULL, "ETDM2 Capture"}, 101862306a36Sopenharmony_ci {"I014", NULL, "ETDM2 Capture"}, 101962306a36Sopenharmony_ci {"I015", NULL, "ETDM2 Capture"}, 102062306a36Sopenharmony_ci {"I016", NULL, "ETDM2 Capture"}, 102162306a36Sopenharmony_ci {"I017", NULL, "ETDM2 Capture"}, 102262306a36Sopenharmony_ci {"I018", NULL, "ETDM2 Capture"}, 102362306a36Sopenharmony_ci {"I019", NULL, "ETDM2 Capture"}, 102462306a36Sopenharmony_ci 102562306a36Sopenharmony_ci {"I072", NULL, "ETDM1 Capture"}, 102662306a36Sopenharmony_ci {"I073", NULL, "ETDM1 Capture"}, 102762306a36Sopenharmony_ci {"I074", NULL, "ETDM1 Capture"}, 102862306a36Sopenharmony_ci {"I075", NULL, "ETDM1 Capture"}, 102962306a36Sopenharmony_ci {"I076", NULL, "ETDM1 Capture"}, 103062306a36Sopenharmony_ci {"I077", NULL, "ETDM1 Capture"}, 103162306a36Sopenharmony_ci {"I078", NULL, "ETDM1 Capture"}, 103262306a36Sopenharmony_ci {"I079", NULL, "ETDM1 Capture"}, 103362306a36Sopenharmony_ci {"I080", NULL, "ETDM1 Capture"}, 103462306a36Sopenharmony_ci {"I081", NULL, "ETDM1 Capture"}, 103562306a36Sopenharmony_ci {"I082", NULL, "ETDM1 Capture"}, 103662306a36Sopenharmony_ci {"I083", NULL, "ETDM1 Capture"}, 103762306a36Sopenharmony_ci {"I084", NULL, "ETDM1 Capture"}, 103862306a36Sopenharmony_ci {"I085", NULL, "ETDM1 Capture"}, 103962306a36Sopenharmony_ci {"I086", NULL, "ETDM1 Capture"}, 104062306a36Sopenharmony_ci {"I087", NULL, "ETDM1 Capture"}, 104162306a36Sopenharmony_ci {"I088", NULL, "ETDM1 Capture"}, 104262306a36Sopenharmony_ci {"I089", NULL, "ETDM1 Capture"}, 104362306a36Sopenharmony_ci {"I090", NULL, "ETDM1 Capture"}, 104462306a36Sopenharmony_ci {"I091", NULL, "ETDM1 Capture"}, 104562306a36Sopenharmony_ci {"I092", NULL, "ETDM1 Capture"}, 104662306a36Sopenharmony_ci {"I093", NULL, "ETDM1 Capture"}, 104762306a36Sopenharmony_ci {"I094", NULL, "ETDM1 Capture"}, 104862306a36Sopenharmony_ci {"I095", NULL, "ETDM1 Capture"}, 104962306a36Sopenharmony_ci 105062306a36Sopenharmony_ci {"UL8", NULL, "ETDM1 Capture"}, 105162306a36Sopenharmony_ci {"UL3", NULL, "ETDM2 Capture"}, 105262306a36Sopenharmony_ci 105362306a36Sopenharmony_ci {"ETDM2 Playback", NULL, "O048"}, 105462306a36Sopenharmony_ci {"ETDM2 Playback", NULL, "O049"}, 105562306a36Sopenharmony_ci {"ETDM2 Playback", NULL, "O050"}, 105662306a36Sopenharmony_ci {"ETDM2 Playback", NULL, "O051"}, 105762306a36Sopenharmony_ci {"ETDM2 Playback", NULL, "O052"}, 105862306a36Sopenharmony_ci {"ETDM2 Playback", NULL, "O053"}, 105962306a36Sopenharmony_ci {"ETDM2 Playback", NULL, "O054"}, 106062306a36Sopenharmony_ci {"ETDM2 Playback", NULL, "O055"}, 106162306a36Sopenharmony_ci {"ETDM2 Playback", NULL, "O056"}, 106262306a36Sopenharmony_ci {"ETDM2 Playback", NULL, "O057"}, 106362306a36Sopenharmony_ci {"ETDM2 Playback", NULL, "O058"}, 106462306a36Sopenharmony_ci {"ETDM2 Playback", NULL, "O059"}, 106562306a36Sopenharmony_ci {"ETDM2 Playback", NULL, "O060"}, 106662306a36Sopenharmony_ci {"ETDM2 Playback", NULL, "O061"}, 106762306a36Sopenharmony_ci {"ETDM2 Playback", NULL, "O062"}, 106862306a36Sopenharmony_ci {"ETDM2 Playback", NULL, "O063"}, 106962306a36Sopenharmony_ci {"ETDM2 Playback", NULL, "O064"}, 107062306a36Sopenharmony_ci {"ETDM2 Playback", NULL, "O065"}, 107162306a36Sopenharmony_ci {"ETDM2 Playback", NULL, "O066"}, 107262306a36Sopenharmony_ci {"ETDM2 Playback", NULL, "O067"}, 107362306a36Sopenharmony_ci {"ETDM2 Playback", NULL, "O068"}, 107462306a36Sopenharmony_ci {"ETDM2 Playback", NULL, "O069"}, 107562306a36Sopenharmony_ci {"ETDM2 Playback", NULL, "O070"}, 107662306a36Sopenharmony_ci {"ETDM2 Playback", NULL, "O071"}, 107762306a36Sopenharmony_ci 107862306a36Sopenharmony_ci {"ETDM1 Playback", NULL, "O072"}, 107962306a36Sopenharmony_ci {"ETDM1 Playback", NULL, "O073"}, 108062306a36Sopenharmony_ci {"ETDM1 Playback", NULL, "O074"}, 108162306a36Sopenharmony_ci {"ETDM1 Playback", NULL, "O075"}, 108262306a36Sopenharmony_ci {"ETDM1 Playback", NULL, "O076"}, 108362306a36Sopenharmony_ci {"ETDM1 Playback", NULL, "O077"}, 108462306a36Sopenharmony_ci {"ETDM1 Playback", NULL, "O078"}, 108562306a36Sopenharmony_ci {"ETDM1 Playback", NULL, "O079"}, 108662306a36Sopenharmony_ci {"ETDM1 Playback", NULL, "O080"}, 108762306a36Sopenharmony_ci {"ETDM1 Playback", NULL, "O081"}, 108862306a36Sopenharmony_ci {"ETDM1 Playback", NULL, "O082"}, 108962306a36Sopenharmony_ci {"ETDM1 Playback", NULL, "O083"}, 109062306a36Sopenharmony_ci {"ETDM1 Playback", NULL, "O084"}, 109162306a36Sopenharmony_ci {"ETDM1 Playback", NULL, "O085"}, 109262306a36Sopenharmony_ci {"ETDM1 Playback", NULL, "O086"}, 109362306a36Sopenharmony_ci {"ETDM1 Playback", NULL, "O087"}, 109462306a36Sopenharmony_ci {"ETDM1 Playback", NULL, "O088"}, 109562306a36Sopenharmony_ci {"ETDM1 Playback", NULL, "O089"}, 109662306a36Sopenharmony_ci {"ETDM1 Playback", NULL, "O090"}, 109762306a36Sopenharmony_ci {"ETDM1 Playback", NULL, "O091"}, 109862306a36Sopenharmony_ci {"ETDM1 Playback", NULL, "O092"}, 109962306a36Sopenharmony_ci {"ETDM1 Playback", NULL, "O093"}, 110062306a36Sopenharmony_ci {"ETDM1 Playback", NULL, "O094"}, 110162306a36Sopenharmony_ci {"ETDM1 Playback", NULL, "O095"}, 110262306a36Sopenharmony_ci 110362306a36Sopenharmony_ci {"O048", "I020 Switch", "I020"}, 110462306a36Sopenharmony_ci {"O049", "I021 Switch", "I021"}, 110562306a36Sopenharmony_ci 110662306a36Sopenharmony_ci {"O048", "I022 Switch", "I022"}, 110762306a36Sopenharmony_ci {"O049", "I023 Switch", "I023"}, 110862306a36Sopenharmony_ci {"O050", "I024 Switch", "I024"}, 110962306a36Sopenharmony_ci {"O051", "I025 Switch", "I025"}, 111062306a36Sopenharmony_ci {"O052", "I026 Switch", "I026"}, 111162306a36Sopenharmony_ci {"O053", "I027 Switch", "I027"}, 111262306a36Sopenharmony_ci {"O054", "I028 Switch", "I028"}, 111362306a36Sopenharmony_ci {"O055", "I029 Switch", "I029"}, 111462306a36Sopenharmony_ci {"O056", "I030 Switch", "I030"}, 111562306a36Sopenharmony_ci {"O057", "I031 Switch", "I031"}, 111662306a36Sopenharmony_ci {"O058", "I032 Switch", "I032"}, 111762306a36Sopenharmony_ci {"O059", "I033 Switch", "I033"}, 111862306a36Sopenharmony_ci {"O060", "I034 Switch", "I034"}, 111962306a36Sopenharmony_ci {"O061", "I035 Switch", "I035"}, 112062306a36Sopenharmony_ci {"O062", "I036 Switch", "I036"}, 112162306a36Sopenharmony_ci {"O063", "I037 Switch", "I037"}, 112262306a36Sopenharmony_ci {"O064", "I038 Switch", "I038"}, 112362306a36Sopenharmony_ci {"O065", "I039 Switch", "I039"}, 112462306a36Sopenharmony_ci {"O066", "I040 Switch", "I040"}, 112562306a36Sopenharmony_ci {"O067", "I041 Switch", "I041"}, 112662306a36Sopenharmony_ci {"O068", "I042 Switch", "I042"}, 112762306a36Sopenharmony_ci {"O069", "I043 Switch", "I043"}, 112862306a36Sopenharmony_ci {"O070", "I044 Switch", "I044"}, 112962306a36Sopenharmony_ci {"O071", "I045 Switch", "I045"}, 113062306a36Sopenharmony_ci 113162306a36Sopenharmony_ci {"O048", "I046 Switch", "I046"}, 113262306a36Sopenharmony_ci {"O049", "I047 Switch", "I047"}, 113362306a36Sopenharmony_ci {"O050", "I048 Switch", "I048"}, 113462306a36Sopenharmony_ci {"O051", "I049 Switch", "I049"}, 113562306a36Sopenharmony_ci {"O052", "I050 Switch", "I050"}, 113662306a36Sopenharmony_ci {"O053", "I051 Switch", "I051"}, 113762306a36Sopenharmony_ci {"O054", "I052 Switch", "I052"}, 113862306a36Sopenharmony_ci {"O055", "I053 Switch", "I053"}, 113962306a36Sopenharmony_ci {"O056", "I054 Switch", "I054"}, 114062306a36Sopenharmony_ci {"O057", "I055 Switch", "I055"}, 114162306a36Sopenharmony_ci {"O058", "I056 Switch", "I056"}, 114262306a36Sopenharmony_ci {"O059", "I057 Switch", "I057"}, 114362306a36Sopenharmony_ci {"O060", "I058 Switch", "I058"}, 114462306a36Sopenharmony_ci {"O061", "I059 Switch", "I059"}, 114562306a36Sopenharmony_ci {"O062", "I060 Switch", "I060"}, 114662306a36Sopenharmony_ci {"O063", "I061 Switch", "I061"}, 114762306a36Sopenharmony_ci {"O064", "I062 Switch", "I062"}, 114862306a36Sopenharmony_ci {"O065", "I063 Switch", "I063"}, 114962306a36Sopenharmony_ci {"O066", "I064 Switch", "I064"}, 115062306a36Sopenharmony_ci {"O067", "I065 Switch", "I065"}, 115162306a36Sopenharmony_ci {"O068", "I066 Switch", "I066"}, 115262306a36Sopenharmony_ci {"O069", "I067 Switch", "I067"}, 115362306a36Sopenharmony_ci {"O070", "I068 Switch", "I068"}, 115462306a36Sopenharmony_ci {"O071", "I069 Switch", "I069"}, 115562306a36Sopenharmony_ci 115662306a36Sopenharmony_ci {"O048", "I070 Switch", "I070"}, 115762306a36Sopenharmony_ci {"O049", "I071 Switch", "I071"}, 115862306a36Sopenharmony_ci 115962306a36Sopenharmony_ci {"O072", "I020 Switch", "I020"}, 116062306a36Sopenharmony_ci {"O073", "I021 Switch", "I021"}, 116162306a36Sopenharmony_ci 116262306a36Sopenharmony_ci {"O072", "I022 Switch", "I022"}, 116362306a36Sopenharmony_ci {"O073", "I023 Switch", "I023"}, 116462306a36Sopenharmony_ci {"O074", "I024 Switch", "I024"}, 116562306a36Sopenharmony_ci {"O075", "I025 Switch", "I025"}, 116662306a36Sopenharmony_ci {"O076", "I026 Switch", "I026"}, 116762306a36Sopenharmony_ci {"O077", "I027 Switch", "I027"}, 116862306a36Sopenharmony_ci {"O078", "I028 Switch", "I028"}, 116962306a36Sopenharmony_ci {"O079", "I029 Switch", "I029"}, 117062306a36Sopenharmony_ci {"O080", "I030 Switch", "I030"}, 117162306a36Sopenharmony_ci {"O081", "I031 Switch", "I031"}, 117262306a36Sopenharmony_ci {"O082", "I032 Switch", "I032"}, 117362306a36Sopenharmony_ci {"O083", "I033 Switch", "I033"}, 117462306a36Sopenharmony_ci {"O084", "I034 Switch", "I034"}, 117562306a36Sopenharmony_ci {"O085", "I035 Switch", "I035"}, 117662306a36Sopenharmony_ci {"O086", "I036 Switch", "I036"}, 117762306a36Sopenharmony_ci {"O087", "I037 Switch", "I037"}, 117862306a36Sopenharmony_ci {"O088", "I038 Switch", "I038"}, 117962306a36Sopenharmony_ci {"O089", "I039 Switch", "I039"}, 118062306a36Sopenharmony_ci {"O090", "I040 Switch", "I040"}, 118162306a36Sopenharmony_ci {"O091", "I041 Switch", "I041"}, 118262306a36Sopenharmony_ci {"O092", "I042 Switch", "I042"}, 118362306a36Sopenharmony_ci {"O093", "I043 Switch", "I043"}, 118462306a36Sopenharmony_ci {"O094", "I044 Switch", "I044"}, 118562306a36Sopenharmony_ci {"O095", "I045 Switch", "I045"}, 118662306a36Sopenharmony_ci 118762306a36Sopenharmony_ci {"O072", "I046 Switch", "I046"}, 118862306a36Sopenharmony_ci {"O073", "I047 Switch", "I047"}, 118962306a36Sopenharmony_ci {"O074", "I048 Switch", "I048"}, 119062306a36Sopenharmony_ci {"O075", "I049 Switch", "I049"}, 119162306a36Sopenharmony_ci {"O076", "I050 Switch", "I050"}, 119262306a36Sopenharmony_ci {"O077", "I051 Switch", "I051"}, 119362306a36Sopenharmony_ci {"O078", "I052 Switch", "I052"}, 119462306a36Sopenharmony_ci {"O079", "I053 Switch", "I053"}, 119562306a36Sopenharmony_ci {"O080", "I054 Switch", "I054"}, 119662306a36Sopenharmony_ci {"O081", "I055 Switch", "I055"}, 119762306a36Sopenharmony_ci {"O082", "I056 Switch", "I056"}, 119862306a36Sopenharmony_ci {"O083", "I057 Switch", "I057"}, 119962306a36Sopenharmony_ci {"O084", "I058 Switch", "I058"}, 120062306a36Sopenharmony_ci {"O085", "I059 Switch", "I059"}, 120162306a36Sopenharmony_ci {"O086", "I060 Switch", "I060"}, 120262306a36Sopenharmony_ci {"O087", "I061 Switch", "I061"}, 120362306a36Sopenharmony_ci {"O088", "I062 Switch", "I062"}, 120462306a36Sopenharmony_ci {"O089", "I063 Switch", "I063"}, 120562306a36Sopenharmony_ci {"O090", "I064 Switch", "I064"}, 120662306a36Sopenharmony_ci {"O091", "I065 Switch", "I065"}, 120762306a36Sopenharmony_ci {"O092", "I066 Switch", "I066"}, 120862306a36Sopenharmony_ci {"O093", "I067 Switch", "I067"}, 120962306a36Sopenharmony_ci {"O094", "I068 Switch", "I068"}, 121062306a36Sopenharmony_ci {"O095", "I069 Switch", "I069"}, 121162306a36Sopenharmony_ci 121262306a36Sopenharmony_ci {"O072", "I070 Switch", "I070"}, 121362306a36Sopenharmony_ci {"O073", "I071 Switch", "I071"}, 121462306a36Sopenharmony_ci 121562306a36Sopenharmony_ci {"HDMI_CH0_MUX", "CH0", "DL10"}, 121662306a36Sopenharmony_ci {"HDMI_CH0_MUX", "CH1", "DL10"}, 121762306a36Sopenharmony_ci {"HDMI_CH0_MUX", "CH2", "DL10"}, 121862306a36Sopenharmony_ci {"HDMI_CH0_MUX", "CH3", "DL10"}, 121962306a36Sopenharmony_ci {"HDMI_CH0_MUX", "CH4", "DL10"}, 122062306a36Sopenharmony_ci {"HDMI_CH0_MUX", "CH5", "DL10"}, 122162306a36Sopenharmony_ci {"HDMI_CH0_MUX", "CH6", "DL10"}, 122262306a36Sopenharmony_ci {"HDMI_CH0_MUX", "CH7", "DL10"}, 122362306a36Sopenharmony_ci 122462306a36Sopenharmony_ci {"HDMI_CH1_MUX", "CH0", "DL10"}, 122562306a36Sopenharmony_ci {"HDMI_CH1_MUX", "CH1", "DL10"}, 122662306a36Sopenharmony_ci {"HDMI_CH1_MUX", "CH2", "DL10"}, 122762306a36Sopenharmony_ci {"HDMI_CH1_MUX", "CH3", "DL10"}, 122862306a36Sopenharmony_ci {"HDMI_CH1_MUX", "CH4", "DL10"}, 122962306a36Sopenharmony_ci {"HDMI_CH1_MUX", "CH5", "DL10"}, 123062306a36Sopenharmony_ci {"HDMI_CH1_MUX", "CH6", "DL10"}, 123162306a36Sopenharmony_ci {"HDMI_CH1_MUX", "CH7", "DL10"}, 123262306a36Sopenharmony_ci 123362306a36Sopenharmony_ci {"HDMI_CH2_MUX", "CH0", "DL10"}, 123462306a36Sopenharmony_ci {"HDMI_CH2_MUX", "CH1", "DL10"}, 123562306a36Sopenharmony_ci {"HDMI_CH2_MUX", "CH2", "DL10"}, 123662306a36Sopenharmony_ci {"HDMI_CH2_MUX", "CH3", "DL10"}, 123762306a36Sopenharmony_ci {"HDMI_CH2_MUX", "CH4", "DL10"}, 123862306a36Sopenharmony_ci {"HDMI_CH2_MUX", "CH5", "DL10"}, 123962306a36Sopenharmony_ci {"HDMI_CH2_MUX", "CH6", "DL10"}, 124062306a36Sopenharmony_ci {"HDMI_CH2_MUX", "CH7", "DL10"}, 124162306a36Sopenharmony_ci 124262306a36Sopenharmony_ci {"HDMI_CH3_MUX", "CH0", "DL10"}, 124362306a36Sopenharmony_ci {"HDMI_CH3_MUX", "CH1", "DL10"}, 124462306a36Sopenharmony_ci {"HDMI_CH3_MUX", "CH2", "DL10"}, 124562306a36Sopenharmony_ci {"HDMI_CH3_MUX", "CH3", "DL10"}, 124662306a36Sopenharmony_ci {"HDMI_CH3_MUX", "CH4", "DL10"}, 124762306a36Sopenharmony_ci {"HDMI_CH3_MUX", "CH5", "DL10"}, 124862306a36Sopenharmony_ci {"HDMI_CH3_MUX", "CH6", "DL10"}, 124962306a36Sopenharmony_ci {"HDMI_CH3_MUX", "CH7", "DL10"}, 125062306a36Sopenharmony_ci 125162306a36Sopenharmony_ci {"HDMI_CH4_MUX", "CH0", "DL10"}, 125262306a36Sopenharmony_ci {"HDMI_CH4_MUX", "CH1", "DL10"}, 125362306a36Sopenharmony_ci {"HDMI_CH4_MUX", "CH2", "DL10"}, 125462306a36Sopenharmony_ci {"HDMI_CH4_MUX", "CH3", "DL10"}, 125562306a36Sopenharmony_ci {"HDMI_CH4_MUX", "CH4", "DL10"}, 125662306a36Sopenharmony_ci {"HDMI_CH4_MUX", "CH5", "DL10"}, 125762306a36Sopenharmony_ci {"HDMI_CH4_MUX", "CH6", "DL10"}, 125862306a36Sopenharmony_ci {"HDMI_CH4_MUX", "CH7", "DL10"}, 125962306a36Sopenharmony_ci 126062306a36Sopenharmony_ci {"HDMI_CH5_MUX", "CH0", "DL10"}, 126162306a36Sopenharmony_ci {"HDMI_CH5_MUX", "CH1", "DL10"}, 126262306a36Sopenharmony_ci {"HDMI_CH5_MUX", "CH2", "DL10"}, 126362306a36Sopenharmony_ci {"HDMI_CH5_MUX", "CH3", "DL10"}, 126462306a36Sopenharmony_ci {"HDMI_CH5_MUX", "CH4", "DL10"}, 126562306a36Sopenharmony_ci {"HDMI_CH5_MUX", "CH5", "DL10"}, 126662306a36Sopenharmony_ci {"HDMI_CH5_MUX", "CH6", "DL10"}, 126762306a36Sopenharmony_ci {"HDMI_CH5_MUX", "CH7", "DL10"}, 126862306a36Sopenharmony_ci 126962306a36Sopenharmony_ci {"HDMI_CH6_MUX", "CH0", "DL10"}, 127062306a36Sopenharmony_ci {"HDMI_CH6_MUX", "CH1", "DL10"}, 127162306a36Sopenharmony_ci {"HDMI_CH6_MUX", "CH2", "DL10"}, 127262306a36Sopenharmony_ci {"HDMI_CH6_MUX", "CH3", "DL10"}, 127362306a36Sopenharmony_ci {"HDMI_CH6_MUX", "CH4", "DL10"}, 127462306a36Sopenharmony_ci {"HDMI_CH6_MUX", "CH5", "DL10"}, 127562306a36Sopenharmony_ci {"HDMI_CH6_MUX", "CH6", "DL10"}, 127662306a36Sopenharmony_ci {"HDMI_CH6_MUX", "CH7", "DL10"}, 127762306a36Sopenharmony_ci 127862306a36Sopenharmony_ci {"HDMI_CH7_MUX", "CH0", "DL10"}, 127962306a36Sopenharmony_ci {"HDMI_CH7_MUX", "CH1", "DL10"}, 128062306a36Sopenharmony_ci {"HDMI_CH7_MUX", "CH2", "DL10"}, 128162306a36Sopenharmony_ci {"HDMI_CH7_MUX", "CH3", "DL10"}, 128262306a36Sopenharmony_ci {"HDMI_CH7_MUX", "CH4", "DL10"}, 128362306a36Sopenharmony_ci {"HDMI_CH7_MUX", "CH5", "DL10"}, 128462306a36Sopenharmony_ci {"HDMI_CH7_MUX", "CH6", "DL10"}, 128562306a36Sopenharmony_ci {"HDMI_CH7_MUX", "CH7", "DL10"}, 128662306a36Sopenharmony_ci 128762306a36Sopenharmony_ci {"HDMI_OUT_MUX", "Connect", "HDMI_CH0_MUX"}, 128862306a36Sopenharmony_ci {"HDMI_OUT_MUX", "Connect", "HDMI_CH1_MUX"}, 128962306a36Sopenharmony_ci {"HDMI_OUT_MUX", "Connect", "HDMI_CH2_MUX"}, 129062306a36Sopenharmony_ci {"HDMI_OUT_MUX", "Connect", "HDMI_CH3_MUX"}, 129162306a36Sopenharmony_ci {"HDMI_OUT_MUX", "Connect", "HDMI_CH4_MUX"}, 129262306a36Sopenharmony_ci {"HDMI_OUT_MUX", "Connect", "HDMI_CH5_MUX"}, 129362306a36Sopenharmony_ci {"HDMI_OUT_MUX", "Connect", "HDMI_CH6_MUX"}, 129462306a36Sopenharmony_ci {"HDMI_OUT_MUX", "Connect", "HDMI_CH7_MUX"}, 129562306a36Sopenharmony_ci 129662306a36Sopenharmony_ci {"DPTX_OUT_MUX", "Connect", "HDMI_CH0_MUX"}, 129762306a36Sopenharmony_ci {"DPTX_OUT_MUX", "Connect", "HDMI_CH1_MUX"}, 129862306a36Sopenharmony_ci {"DPTX_OUT_MUX", "Connect", "HDMI_CH2_MUX"}, 129962306a36Sopenharmony_ci {"DPTX_OUT_MUX", "Connect", "HDMI_CH3_MUX"}, 130062306a36Sopenharmony_ci {"DPTX_OUT_MUX", "Connect", "HDMI_CH4_MUX"}, 130162306a36Sopenharmony_ci {"DPTX_OUT_MUX", "Connect", "HDMI_CH5_MUX"}, 130262306a36Sopenharmony_ci {"DPTX_OUT_MUX", "Connect", "HDMI_CH6_MUX"}, 130362306a36Sopenharmony_ci {"DPTX_OUT_MUX", "Connect", "HDMI_CH7_MUX"}, 130462306a36Sopenharmony_ci 130562306a36Sopenharmony_ci {"ETDM3 Playback", NULL, "HDMI_OUT_MUX"}, 130662306a36Sopenharmony_ci {"DPTX Playback", NULL, "DPTX_OUT_MUX"}, 130762306a36Sopenharmony_ci 130862306a36Sopenharmony_ci {"ETDM_OUTPUT", NULL, "DPTX Playback"}, 130962306a36Sopenharmony_ci {"ETDM_OUTPUT", NULL, "ETDM1 Playback"}, 131062306a36Sopenharmony_ci {"ETDM_OUTPUT", NULL, "ETDM2 Playback"}, 131162306a36Sopenharmony_ci {"ETDM_OUTPUT", NULL, "ETDM3 Playback"}, 131262306a36Sopenharmony_ci {"ETDM1 Capture", NULL, "ETDM_INPUT"}, 131362306a36Sopenharmony_ci {"ETDM2 Capture", NULL, "ETDM_INPUT"}, 131462306a36Sopenharmony_ci}; 131562306a36Sopenharmony_ci 131662306a36Sopenharmony_cistatic int mt8195_afe_enable_etdm(struct mtk_base_afe *afe, int dai_id) 131762306a36Sopenharmony_ci{ 131862306a36Sopenharmony_ci int ret = 0; 131962306a36Sopenharmony_ci struct etdm_con_reg etdm_reg; 132062306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 132162306a36Sopenharmony_ci struct mtk_dai_etdm_priv *etdm_data; 132262306a36Sopenharmony_ci unsigned long flags; 132362306a36Sopenharmony_ci 132462306a36Sopenharmony_ci if (!mt8195_afe_etdm_is_valid(dai_id)) 132562306a36Sopenharmony_ci return -EINVAL; 132662306a36Sopenharmony_ci 132762306a36Sopenharmony_ci etdm_data = afe_priv->dai_priv[dai_id]; 132862306a36Sopenharmony_ci spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags); 132962306a36Sopenharmony_ci etdm_data->en_ref_cnt++; 133062306a36Sopenharmony_ci if (etdm_data->en_ref_cnt == 1) { 133162306a36Sopenharmony_ci ret = get_etdm_reg(dai_id, &etdm_reg); 133262306a36Sopenharmony_ci if (ret < 0) 133362306a36Sopenharmony_ci goto out; 133462306a36Sopenharmony_ci 133562306a36Sopenharmony_ci regmap_update_bits(afe->regmap, etdm_reg.con0, 133662306a36Sopenharmony_ci ETDM_CON0_EN, ETDM_CON0_EN); 133762306a36Sopenharmony_ci } 133862306a36Sopenharmony_ciout: 133962306a36Sopenharmony_ci spin_unlock_irqrestore(&afe_priv->afe_ctrl_lock, flags); 134062306a36Sopenharmony_ci return ret; 134162306a36Sopenharmony_ci} 134262306a36Sopenharmony_ci 134362306a36Sopenharmony_cistatic int mt8195_afe_disable_etdm(struct mtk_base_afe *afe, int dai_id) 134462306a36Sopenharmony_ci{ 134562306a36Sopenharmony_ci int ret = 0; 134662306a36Sopenharmony_ci struct etdm_con_reg etdm_reg; 134762306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 134862306a36Sopenharmony_ci struct mtk_dai_etdm_priv *etdm_data; 134962306a36Sopenharmony_ci unsigned long flags; 135062306a36Sopenharmony_ci 135162306a36Sopenharmony_ci if (!mt8195_afe_etdm_is_valid(dai_id)) 135262306a36Sopenharmony_ci return -EINVAL; 135362306a36Sopenharmony_ci 135462306a36Sopenharmony_ci etdm_data = afe_priv->dai_priv[dai_id]; 135562306a36Sopenharmony_ci spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags); 135662306a36Sopenharmony_ci if (etdm_data->en_ref_cnt > 0) { 135762306a36Sopenharmony_ci etdm_data->en_ref_cnt--; 135862306a36Sopenharmony_ci if (etdm_data->en_ref_cnt == 0) { 135962306a36Sopenharmony_ci ret = get_etdm_reg(dai_id, &etdm_reg); 136062306a36Sopenharmony_ci if (ret < 0) 136162306a36Sopenharmony_ci goto out; 136262306a36Sopenharmony_ci 136362306a36Sopenharmony_ci regmap_update_bits(afe->regmap, etdm_reg.con0, 136462306a36Sopenharmony_ci ETDM_CON0_EN, 0); 136562306a36Sopenharmony_ci } 136662306a36Sopenharmony_ci } 136762306a36Sopenharmony_ciout: 136862306a36Sopenharmony_ci spin_unlock_irqrestore(&afe_priv->afe_ctrl_lock, flags); 136962306a36Sopenharmony_ci return ret; 137062306a36Sopenharmony_ci} 137162306a36Sopenharmony_ci 137262306a36Sopenharmony_cistatic int etdm_cowork_slv_sel(int id, int slave_mode) 137362306a36Sopenharmony_ci{ 137462306a36Sopenharmony_ci if (slave_mode) { 137562306a36Sopenharmony_ci switch (id) { 137662306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM1_IN: 137762306a36Sopenharmony_ci return COWORK_ETDM_IN1_S; 137862306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM2_IN: 137962306a36Sopenharmony_ci return COWORK_ETDM_IN2_S; 138062306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM1_OUT: 138162306a36Sopenharmony_ci return COWORK_ETDM_OUT1_S; 138262306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM2_OUT: 138362306a36Sopenharmony_ci return COWORK_ETDM_OUT2_S; 138462306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM3_OUT: 138562306a36Sopenharmony_ci return COWORK_ETDM_OUT3_S; 138662306a36Sopenharmony_ci default: 138762306a36Sopenharmony_ci return -EINVAL; 138862306a36Sopenharmony_ci } 138962306a36Sopenharmony_ci } else { 139062306a36Sopenharmony_ci switch (id) { 139162306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM1_IN: 139262306a36Sopenharmony_ci return COWORK_ETDM_IN1_M; 139362306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM2_IN: 139462306a36Sopenharmony_ci return COWORK_ETDM_IN2_M; 139562306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM1_OUT: 139662306a36Sopenharmony_ci return COWORK_ETDM_OUT1_M; 139762306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM2_OUT: 139862306a36Sopenharmony_ci return COWORK_ETDM_OUT2_M; 139962306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM3_OUT: 140062306a36Sopenharmony_ci return COWORK_ETDM_OUT3_M; 140162306a36Sopenharmony_ci default: 140262306a36Sopenharmony_ci return -EINVAL; 140362306a36Sopenharmony_ci } 140462306a36Sopenharmony_ci } 140562306a36Sopenharmony_ci} 140662306a36Sopenharmony_ci 140762306a36Sopenharmony_cistatic int mt8195_etdm_sync_mode_configure(struct mtk_base_afe *afe, int dai_id) 140862306a36Sopenharmony_ci{ 140962306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 141062306a36Sopenharmony_ci struct mtk_dai_etdm_priv *etdm_data; 141162306a36Sopenharmony_ci unsigned int reg = 0; 141262306a36Sopenharmony_ci unsigned int mask; 141362306a36Sopenharmony_ci unsigned int val; 141462306a36Sopenharmony_ci int cowork_source_sel; 141562306a36Sopenharmony_ci 141662306a36Sopenharmony_ci if (!mt8195_afe_etdm_is_valid(dai_id)) 141762306a36Sopenharmony_ci return -EINVAL; 141862306a36Sopenharmony_ci 141962306a36Sopenharmony_ci etdm_data = afe_priv->dai_priv[dai_id]; 142062306a36Sopenharmony_ci if (etdm_data->cowork_source_id == COWORK_ETDM_NONE) 142162306a36Sopenharmony_ci return 0; 142262306a36Sopenharmony_ci 142362306a36Sopenharmony_ci cowork_source_sel = etdm_cowork_slv_sel(etdm_data->cowork_source_id, 142462306a36Sopenharmony_ci etdm_data->slave_mode); 142562306a36Sopenharmony_ci if (cowork_source_sel < 0) 142662306a36Sopenharmony_ci return cowork_source_sel; 142762306a36Sopenharmony_ci 142862306a36Sopenharmony_ci switch (dai_id) { 142962306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM1_IN: 143062306a36Sopenharmony_ci reg = ETDM_COWORK_CON1; 143162306a36Sopenharmony_ci mask = ETDM_IN1_SLAVE_SEL_MASK; 143262306a36Sopenharmony_ci val = ETDM_IN1_SLAVE_SEL(cowork_source_sel); 143362306a36Sopenharmony_ci break; 143462306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM2_IN: 143562306a36Sopenharmony_ci reg = ETDM_COWORK_CON2; 143662306a36Sopenharmony_ci mask = ETDM_IN2_SLAVE_SEL_MASK; 143762306a36Sopenharmony_ci val = ETDM_IN2_SLAVE_SEL(cowork_source_sel); 143862306a36Sopenharmony_ci break; 143962306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM1_OUT: 144062306a36Sopenharmony_ci reg = ETDM_COWORK_CON0; 144162306a36Sopenharmony_ci mask = ETDM_OUT1_SLAVE_SEL_MASK; 144262306a36Sopenharmony_ci val = ETDM_OUT1_SLAVE_SEL(cowork_source_sel); 144362306a36Sopenharmony_ci break; 144462306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM2_OUT: 144562306a36Sopenharmony_ci reg = ETDM_COWORK_CON2; 144662306a36Sopenharmony_ci mask = ETDM_OUT2_SLAVE_SEL_MASK; 144762306a36Sopenharmony_ci val = ETDM_OUT2_SLAVE_SEL(cowork_source_sel); 144862306a36Sopenharmony_ci break; 144962306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM3_OUT: 145062306a36Sopenharmony_ci reg = ETDM_COWORK_CON2; 145162306a36Sopenharmony_ci mask = ETDM_OUT3_SLAVE_SEL_MASK; 145262306a36Sopenharmony_ci val = ETDM_OUT3_SLAVE_SEL(cowork_source_sel); 145362306a36Sopenharmony_ci break; 145462306a36Sopenharmony_ci default: 145562306a36Sopenharmony_ci return 0; 145662306a36Sopenharmony_ci } 145762306a36Sopenharmony_ci 145862306a36Sopenharmony_ci regmap_update_bits(afe->regmap, reg, mask, val); 145962306a36Sopenharmony_ci 146062306a36Sopenharmony_ci return 0; 146162306a36Sopenharmony_ci} 146262306a36Sopenharmony_ci 146362306a36Sopenharmony_cistatic int mtk_dai_etdm_get_cg_id_by_dai_id(int dai_id) 146462306a36Sopenharmony_ci{ 146562306a36Sopenharmony_ci int cg_id = -1; 146662306a36Sopenharmony_ci 146762306a36Sopenharmony_ci switch (dai_id) { 146862306a36Sopenharmony_ci case MT8195_AFE_IO_DPTX: 146962306a36Sopenharmony_ci cg_id = MT8195_CLK_AUD_HDMI_OUT; 147062306a36Sopenharmony_ci break; 147162306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM1_IN: 147262306a36Sopenharmony_ci cg_id = MT8195_CLK_AUD_TDM_IN; 147362306a36Sopenharmony_ci break; 147462306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM2_IN: 147562306a36Sopenharmony_ci cg_id = MT8195_CLK_AUD_I2SIN; 147662306a36Sopenharmony_ci break; 147762306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM1_OUT: 147862306a36Sopenharmony_ci cg_id = MT8195_CLK_AUD_TDM_OUT; 147962306a36Sopenharmony_ci break; 148062306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM2_OUT: 148162306a36Sopenharmony_ci cg_id = MT8195_CLK_AUD_I2S_OUT; 148262306a36Sopenharmony_ci break; 148362306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM3_OUT: 148462306a36Sopenharmony_ci cg_id = MT8195_CLK_AUD_HDMI_OUT; 148562306a36Sopenharmony_ci break; 148662306a36Sopenharmony_ci default: 148762306a36Sopenharmony_ci break; 148862306a36Sopenharmony_ci } 148962306a36Sopenharmony_ci 149062306a36Sopenharmony_ci return cg_id; 149162306a36Sopenharmony_ci} 149262306a36Sopenharmony_ci 149362306a36Sopenharmony_cistatic int mtk_dai_etdm_get_clk_id_by_dai_id(int dai_id) 149462306a36Sopenharmony_ci{ 149562306a36Sopenharmony_ci int clk_id = -1; 149662306a36Sopenharmony_ci 149762306a36Sopenharmony_ci switch (dai_id) { 149862306a36Sopenharmony_ci case MT8195_AFE_IO_DPTX: 149962306a36Sopenharmony_ci clk_id = MT8195_CLK_TOP_DPTX_M_SEL; 150062306a36Sopenharmony_ci break; 150162306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM1_IN: 150262306a36Sopenharmony_ci clk_id = MT8195_CLK_TOP_I2SI1_M_SEL; 150362306a36Sopenharmony_ci break; 150462306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM2_IN: 150562306a36Sopenharmony_ci clk_id = MT8195_CLK_TOP_I2SI2_M_SEL; 150662306a36Sopenharmony_ci break; 150762306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM1_OUT: 150862306a36Sopenharmony_ci clk_id = MT8195_CLK_TOP_I2SO1_M_SEL; 150962306a36Sopenharmony_ci break; 151062306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM2_OUT: 151162306a36Sopenharmony_ci clk_id = MT8195_CLK_TOP_I2SO2_M_SEL; 151262306a36Sopenharmony_ci break; 151362306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM3_OUT: 151462306a36Sopenharmony_ci default: 151562306a36Sopenharmony_ci break; 151662306a36Sopenharmony_ci } 151762306a36Sopenharmony_ci 151862306a36Sopenharmony_ci return clk_id; 151962306a36Sopenharmony_ci} 152062306a36Sopenharmony_ci 152162306a36Sopenharmony_cistatic int mtk_dai_etdm_get_clkdiv_id_by_dai_id(int dai_id) 152262306a36Sopenharmony_ci{ 152362306a36Sopenharmony_ci int clk_id = -1; 152462306a36Sopenharmony_ci 152562306a36Sopenharmony_ci switch (dai_id) { 152662306a36Sopenharmony_ci case MT8195_AFE_IO_DPTX: 152762306a36Sopenharmony_ci clk_id = MT8195_CLK_TOP_APLL12_DIV9; 152862306a36Sopenharmony_ci break; 152962306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM1_IN: 153062306a36Sopenharmony_ci clk_id = MT8195_CLK_TOP_APLL12_DIV0; 153162306a36Sopenharmony_ci break; 153262306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM2_IN: 153362306a36Sopenharmony_ci clk_id = MT8195_CLK_TOP_APLL12_DIV1; 153462306a36Sopenharmony_ci break; 153562306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM1_OUT: 153662306a36Sopenharmony_ci clk_id = MT8195_CLK_TOP_APLL12_DIV2; 153762306a36Sopenharmony_ci break; 153862306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM2_OUT: 153962306a36Sopenharmony_ci clk_id = MT8195_CLK_TOP_APLL12_DIV3; 154062306a36Sopenharmony_ci break; 154162306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM3_OUT: 154262306a36Sopenharmony_ci default: 154362306a36Sopenharmony_ci break; 154462306a36Sopenharmony_ci } 154562306a36Sopenharmony_ci 154662306a36Sopenharmony_ci return clk_id; 154762306a36Sopenharmony_ci} 154862306a36Sopenharmony_ci 154962306a36Sopenharmony_cistatic int mtk_dai_etdm_enable_mclk(struct mtk_base_afe *afe, int dai_id) 155062306a36Sopenharmony_ci{ 155162306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 155262306a36Sopenharmony_ci int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id); 155362306a36Sopenharmony_ci 155462306a36Sopenharmony_ci if (clkdiv_id < 0) 155562306a36Sopenharmony_ci return -EINVAL; 155662306a36Sopenharmony_ci 155762306a36Sopenharmony_ci mt8195_afe_enable_clk(afe, afe_priv->clk[clkdiv_id]); 155862306a36Sopenharmony_ci 155962306a36Sopenharmony_ci return 0; 156062306a36Sopenharmony_ci} 156162306a36Sopenharmony_ci 156262306a36Sopenharmony_cistatic int mtk_dai_etdm_disable_mclk(struct mtk_base_afe *afe, int dai_id) 156362306a36Sopenharmony_ci{ 156462306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 156562306a36Sopenharmony_ci int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id); 156662306a36Sopenharmony_ci 156762306a36Sopenharmony_ci if (clkdiv_id < 0) 156862306a36Sopenharmony_ci return -EINVAL; 156962306a36Sopenharmony_ci 157062306a36Sopenharmony_ci mt8195_afe_disable_clk(afe, afe_priv->clk[clkdiv_id]); 157162306a36Sopenharmony_ci 157262306a36Sopenharmony_ci return 0; 157362306a36Sopenharmony_ci} 157462306a36Sopenharmony_ci 157562306a36Sopenharmony_ci/* dai ops */ 157662306a36Sopenharmony_cistatic int mtk_dai_etdm_startup(struct snd_pcm_substream *substream, 157762306a36Sopenharmony_ci struct snd_soc_dai *dai) 157862306a36Sopenharmony_ci{ 157962306a36Sopenharmony_ci struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 158062306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 158162306a36Sopenharmony_ci struct mtk_dai_etdm_priv *mst_etdm_data; 158262306a36Sopenharmony_ci int cg_id; 158362306a36Sopenharmony_ci int mst_dai_id; 158462306a36Sopenharmony_ci int slv_dai_id; 158562306a36Sopenharmony_ci int i; 158662306a36Sopenharmony_ci 158762306a36Sopenharmony_ci if (is_cowork_mode(dai)) { 158862306a36Sopenharmony_ci mst_dai_id = get_etdm_cowork_master_id(dai); 158962306a36Sopenharmony_ci if (!mt8195_afe_etdm_is_valid(mst_dai_id)) 159062306a36Sopenharmony_ci return -EINVAL; 159162306a36Sopenharmony_ci 159262306a36Sopenharmony_ci mtk_dai_etdm_enable_mclk(afe, mst_dai_id); 159362306a36Sopenharmony_ci cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(mst_dai_id); 159462306a36Sopenharmony_ci if (cg_id >= 0) 159562306a36Sopenharmony_ci mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]); 159662306a36Sopenharmony_ci 159762306a36Sopenharmony_ci mst_etdm_data = afe_priv->dai_priv[mst_dai_id]; 159862306a36Sopenharmony_ci 159962306a36Sopenharmony_ci for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) { 160062306a36Sopenharmony_ci slv_dai_id = mst_etdm_data->cowork_slv_id[i]; 160162306a36Sopenharmony_ci cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(slv_dai_id); 160262306a36Sopenharmony_ci if (cg_id >= 0) 160362306a36Sopenharmony_ci mt8195_afe_enable_clk(afe, 160462306a36Sopenharmony_ci afe_priv->clk[cg_id]); 160562306a36Sopenharmony_ci } 160662306a36Sopenharmony_ci } else { 160762306a36Sopenharmony_ci mtk_dai_etdm_enable_mclk(afe, dai->id); 160862306a36Sopenharmony_ci 160962306a36Sopenharmony_ci cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id); 161062306a36Sopenharmony_ci if (cg_id >= 0) 161162306a36Sopenharmony_ci mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]); 161262306a36Sopenharmony_ci } 161362306a36Sopenharmony_ci 161462306a36Sopenharmony_ci return 0; 161562306a36Sopenharmony_ci} 161662306a36Sopenharmony_ci 161762306a36Sopenharmony_cistatic void mtk_dai_etdm_shutdown(struct snd_pcm_substream *substream, 161862306a36Sopenharmony_ci struct snd_soc_dai *dai) 161962306a36Sopenharmony_ci{ 162062306a36Sopenharmony_ci struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 162162306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 162262306a36Sopenharmony_ci struct mtk_dai_etdm_priv *mst_etdm_data; 162362306a36Sopenharmony_ci int cg_id; 162462306a36Sopenharmony_ci int mst_dai_id; 162562306a36Sopenharmony_ci int slv_dai_id; 162662306a36Sopenharmony_ci int i; 162762306a36Sopenharmony_ci 162862306a36Sopenharmony_ci if (is_cowork_mode(dai)) { 162962306a36Sopenharmony_ci mst_dai_id = get_etdm_cowork_master_id(dai); 163062306a36Sopenharmony_ci if (!mt8195_afe_etdm_is_valid(mst_dai_id)) 163162306a36Sopenharmony_ci return; 163262306a36Sopenharmony_ci 163362306a36Sopenharmony_ci cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(mst_dai_id); 163462306a36Sopenharmony_ci if (cg_id >= 0) 163562306a36Sopenharmony_ci mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]); 163662306a36Sopenharmony_ci 163762306a36Sopenharmony_ci mst_etdm_data = afe_priv->dai_priv[mst_dai_id]; 163862306a36Sopenharmony_ci for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) { 163962306a36Sopenharmony_ci slv_dai_id = mst_etdm_data->cowork_slv_id[i]; 164062306a36Sopenharmony_ci cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(slv_dai_id); 164162306a36Sopenharmony_ci if (cg_id >= 0) 164262306a36Sopenharmony_ci mt8195_afe_disable_clk(afe, 164362306a36Sopenharmony_ci afe_priv->clk[cg_id]); 164462306a36Sopenharmony_ci } 164562306a36Sopenharmony_ci mtk_dai_etdm_disable_mclk(afe, mst_dai_id); 164662306a36Sopenharmony_ci } else { 164762306a36Sopenharmony_ci cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id); 164862306a36Sopenharmony_ci if (cg_id >= 0) 164962306a36Sopenharmony_ci mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]); 165062306a36Sopenharmony_ci 165162306a36Sopenharmony_ci mtk_dai_etdm_disable_mclk(afe, dai->id); 165262306a36Sopenharmony_ci } 165362306a36Sopenharmony_ci} 165462306a36Sopenharmony_ci 165562306a36Sopenharmony_cistatic int mtk_dai_etdm_fifo_mode(struct mtk_base_afe *afe, 165662306a36Sopenharmony_ci int dai_id, unsigned int rate) 165762306a36Sopenharmony_ci{ 165862306a36Sopenharmony_ci unsigned int mode = 0; 165962306a36Sopenharmony_ci unsigned int reg = 0; 166062306a36Sopenharmony_ci unsigned int val = 0; 166162306a36Sopenharmony_ci unsigned int mask = (ETDM_IN_AFIFO_MODE_MASK | ETDM_IN_USE_AFIFO); 166262306a36Sopenharmony_ci 166362306a36Sopenharmony_ci if (rate != 0) 166462306a36Sopenharmony_ci mode = mt8195_afe_fs_timing(rate); 166562306a36Sopenharmony_ci 166662306a36Sopenharmony_ci switch (dai_id) { 166762306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM1_IN: 166862306a36Sopenharmony_ci reg = ETDM_IN1_AFIFO_CON; 166962306a36Sopenharmony_ci if (rate == 0) 167062306a36Sopenharmony_ci mode = MT8195_ETDM_IN1_1X_EN; 167162306a36Sopenharmony_ci break; 167262306a36Sopenharmony_ci case MT8195_AFE_IO_ETDM2_IN: 167362306a36Sopenharmony_ci reg = ETDM_IN2_AFIFO_CON; 167462306a36Sopenharmony_ci if (rate == 0) 167562306a36Sopenharmony_ci mode = MT8195_ETDM_IN2_1X_EN; 167662306a36Sopenharmony_ci break; 167762306a36Sopenharmony_ci default: 167862306a36Sopenharmony_ci return -EINVAL; 167962306a36Sopenharmony_ci } 168062306a36Sopenharmony_ci 168162306a36Sopenharmony_ci val = (mode | ETDM_IN_USE_AFIFO); 168262306a36Sopenharmony_ci 168362306a36Sopenharmony_ci regmap_update_bits(afe->regmap, reg, mask, val); 168462306a36Sopenharmony_ci return 0; 168562306a36Sopenharmony_ci} 168662306a36Sopenharmony_ci 168762306a36Sopenharmony_cistatic int mtk_dai_etdm_in_configure(struct mtk_base_afe *afe, 168862306a36Sopenharmony_ci unsigned int rate, 168962306a36Sopenharmony_ci unsigned int channels, 169062306a36Sopenharmony_ci int dai_id) 169162306a36Sopenharmony_ci{ 169262306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 169362306a36Sopenharmony_ci struct mtk_dai_etdm_priv *etdm_data; 169462306a36Sopenharmony_ci struct etdm_con_reg etdm_reg; 169562306a36Sopenharmony_ci bool slave_mode; 169662306a36Sopenharmony_ci unsigned int data_mode; 169762306a36Sopenharmony_ci unsigned int lrck_width; 169862306a36Sopenharmony_ci unsigned int val = 0; 169962306a36Sopenharmony_ci unsigned int mask = 0; 170062306a36Sopenharmony_ci int i; 170162306a36Sopenharmony_ci int ret; 170262306a36Sopenharmony_ci 170362306a36Sopenharmony_ci if (!mt8195_afe_etdm_is_valid(dai_id)) 170462306a36Sopenharmony_ci return -EINVAL; 170562306a36Sopenharmony_ci 170662306a36Sopenharmony_ci etdm_data = afe_priv->dai_priv[dai_id]; 170762306a36Sopenharmony_ci slave_mode = etdm_data->slave_mode; 170862306a36Sopenharmony_ci data_mode = etdm_data->data_mode; 170962306a36Sopenharmony_ci lrck_width = etdm_data->lrck_width; 171062306a36Sopenharmony_ci 171162306a36Sopenharmony_ci dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n", 171262306a36Sopenharmony_ci __func__, rate, channels, dai_id); 171362306a36Sopenharmony_ci 171462306a36Sopenharmony_ci ret = get_etdm_reg(dai_id, &etdm_reg); 171562306a36Sopenharmony_ci if (ret < 0) 171662306a36Sopenharmony_ci return ret; 171762306a36Sopenharmony_ci 171862306a36Sopenharmony_ci if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) 171962306a36Sopenharmony_ci slave_mode = true; 172062306a36Sopenharmony_ci 172162306a36Sopenharmony_ci /* afifo */ 172262306a36Sopenharmony_ci if (slave_mode) 172362306a36Sopenharmony_ci mtk_dai_etdm_fifo_mode(afe, dai_id, 0); 172462306a36Sopenharmony_ci else 172562306a36Sopenharmony_ci mtk_dai_etdm_fifo_mode(afe, dai_id, rate); 172662306a36Sopenharmony_ci 172762306a36Sopenharmony_ci /* con1 */ 172862306a36Sopenharmony_ci if (lrck_width > 0) { 172962306a36Sopenharmony_ci mask |= (ETDM_IN_CON1_LRCK_AUTO_MODE | 173062306a36Sopenharmony_ci ETDM_IN_CON1_LRCK_WIDTH_MASK); 173162306a36Sopenharmony_ci val |= ETDM_IN_CON1_LRCK_WIDTH(lrck_width); 173262306a36Sopenharmony_ci } 173362306a36Sopenharmony_ci regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val); 173462306a36Sopenharmony_ci 173562306a36Sopenharmony_ci mask = 0; 173662306a36Sopenharmony_ci val = 0; 173762306a36Sopenharmony_ci 173862306a36Sopenharmony_ci /* con2 */ 173962306a36Sopenharmony_ci if (!slave_mode) { 174062306a36Sopenharmony_ci mask |= ETDM_IN_CON2_UPDATE_GAP_MASK; 174162306a36Sopenharmony_ci if (rate == 352800 || rate == 384000) 174262306a36Sopenharmony_ci val |= ETDM_IN_CON2_UPDATE_GAP(4); 174362306a36Sopenharmony_ci else 174462306a36Sopenharmony_ci val |= ETDM_IN_CON2_UPDATE_GAP(3); 174562306a36Sopenharmony_ci } 174662306a36Sopenharmony_ci mask |= (ETDM_IN_CON2_MULTI_IP_2CH_MODE | 174762306a36Sopenharmony_ci ETDM_IN_CON2_MULTI_IP_TOTAL_CH_MASK); 174862306a36Sopenharmony_ci if (data_mode == MTK_DAI_ETDM_DATA_MULTI_PIN) { 174962306a36Sopenharmony_ci val |= ETDM_IN_CON2_MULTI_IP_2CH_MODE | 175062306a36Sopenharmony_ci ETDM_IN_CON2_MULTI_IP_TOTAL_CH(channels); 175162306a36Sopenharmony_ci } 175262306a36Sopenharmony_ci regmap_update_bits(afe->regmap, etdm_reg.con2, mask, val); 175362306a36Sopenharmony_ci 175462306a36Sopenharmony_ci mask = 0; 175562306a36Sopenharmony_ci val = 0; 175662306a36Sopenharmony_ci 175762306a36Sopenharmony_ci /* con3 */ 175862306a36Sopenharmony_ci mask |= ETDM_IN_CON3_DISABLE_OUT_MASK; 175962306a36Sopenharmony_ci for (i = 0; i < channels; i += 2) { 176062306a36Sopenharmony_ci if (etdm_data->in_disable_ch[i] && 176162306a36Sopenharmony_ci etdm_data->in_disable_ch[i + 1]) 176262306a36Sopenharmony_ci val |= ETDM_IN_CON3_DISABLE_OUT(i >> 1); 176362306a36Sopenharmony_ci } 176462306a36Sopenharmony_ci if (!slave_mode) { 176562306a36Sopenharmony_ci mask |= ETDM_IN_CON3_FS_MASK; 176662306a36Sopenharmony_ci val |= ETDM_IN_CON3_FS(get_etdm_fs_timing(rate)); 176762306a36Sopenharmony_ci } 176862306a36Sopenharmony_ci regmap_update_bits(afe->regmap, etdm_reg.con3, mask, val); 176962306a36Sopenharmony_ci 177062306a36Sopenharmony_ci mask = 0; 177162306a36Sopenharmony_ci val = 0; 177262306a36Sopenharmony_ci 177362306a36Sopenharmony_ci /* con4 */ 177462306a36Sopenharmony_ci mask |= (ETDM_IN_CON4_MASTER_LRCK_INV | ETDM_IN_CON4_MASTER_BCK_INV | 177562306a36Sopenharmony_ci ETDM_IN_CON4_SLAVE_LRCK_INV | ETDM_IN_CON4_SLAVE_BCK_INV); 177662306a36Sopenharmony_ci if (slave_mode) { 177762306a36Sopenharmony_ci if (etdm_data->lrck_inv) 177862306a36Sopenharmony_ci val |= ETDM_IN_CON4_SLAVE_LRCK_INV; 177962306a36Sopenharmony_ci if (etdm_data->bck_inv) 178062306a36Sopenharmony_ci val |= ETDM_IN_CON4_SLAVE_BCK_INV; 178162306a36Sopenharmony_ci } else { 178262306a36Sopenharmony_ci if (etdm_data->lrck_inv) 178362306a36Sopenharmony_ci val |= ETDM_IN_CON4_MASTER_LRCK_INV; 178462306a36Sopenharmony_ci if (etdm_data->bck_inv) 178562306a36Sopenharmony_ci val |= ETDM_IN_CON4_MASTER_BCK_INV; 178662306a36Sopenharmony_ci } 178762306a36Sopenharmony_ci regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val); 178862306a36Sopenharmony_ci 178962306a36Sopenharmony_ci mask = 0; 179062306a36Sopenharmony_ci val = 0; 179162306a36Sopenharmony_ci 179262306a36Sopenharmony_ci /* con5 */ 179362306a36Sopenharmony_ci mask |= ETDM_IN_CON5_LR_SWAP_MASK; 179462306a36Sopenharmony_ci mask |= ETDM_IN_CON5_ENABLE_ODD_MASK; 179562306a36Sopenharmony_ci for (i = 0; i < channels; i += 2) { 179662306a36Sopenharmony_ci if (etdm_data->in_disable_ch[i] && 179762306a36Sopenharmony_ci !etdm_data->in_disable_ch[i + 1]) { 179862306a36Sopenharmony_ci if (i == (channels - 2)) 179962306a36Sopenharmony_ci val |= ETDM_IN_CON5_LR_SWAP(15); 180062306a36Sopenharmony_ci else 180162306a36Sopenharmony_ci val |= ETDM_IN_CON5_LR_SWAP(i >> 1); 180262306a36Sopenharmony_ci val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1); 180362306a36Sopenharmony_ci } else if (!etdm_data->in_disable_ch[i] && 180462306a36Sopenharmony_ci etdm_data->in_disable_ch[i + 1]) { 180562306a36Sopenharmony_ci val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1); 180662306a36Sopenharmony_ci } 180762306a36Sopenharmony_ci } 180862306a36Sopenharmony_ci regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val); 180962306a36Sopenharmony_ci return 0; 181062306a36Sopenharmony_ci} 181162306a36Sopenharmony_ci 181262306a36Sopenharmony_cistatic int mtk_dai_etdm_out_configure(struct mtk_base_afe *afe, 181362306a36Sopenharmony_ci unsigned int rate, 181462306a36Sopenharmony_ci unsigned int channels, 181562306a36Sopenharmony_ci int dai_id) 181662306a36Sopenharmony_ci{ 181762306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 181862306a36Sopenharmony_ci struct mtk_dai_etdm_priv *etdm_data; 181962306a36Sopenharmony_ci struct etdm_con_reg etdm_reg; 182062306a36Sopenharmony_ci bool slave_mode; 182162306a36Sopenharmony_ci unsigned int lrck_width; 182262306a36Sopenharmony_ci unsigned int val = 0; 182362306a36Sopenharmony_ci unsigned int mask = 0; 182462306a36Sopenharmony_ci int ret; 182562306a36Sopenharmony_ci int fs = 0; 182662306a36Sopenharmony_ci 182762306a36Sopenharmony_ci if (!mt8195_afe_etdm_is_valid(dai_id)) 182862306a36Sopenharmony_ci return -EINVAL; 182962306a36Sopenharmony_ci 183062306a36Sopenharmony_ci etdm_data = afe_priv->dai_priv[dai_id]; 183162306a36Sopenharmony_ci slave_mode = etdm_data->slave_mode; 183262306a36Sopenharmony_ci lrck_width = etdm_data->lrck_width; 183362306a36Sopenharmony_ci 183462306a36Sopenharmony_ci dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n", 183562306a36Sopenharmony_ci __func__, rate, channels, dai_id); 183662306a36Sopenharmony_ci 183762306a36Sopenharmony_ci ret = get_etdm_reg(dai_id, &etdm_reg); 183862306a36Sopenharmony_ci if (ret < 0) 183962306a36Sopenharmony_ci return ret; 184062306a36Sopenharmony_ci 184162306a36Sopenharmony_ci if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) 184262306a36Sopenharmony_ci slave_mode = true; 184362306a36Sopenharmony_ci 184462306a36Sopenharmony_ci /* con0 */ 184562306a36Sopenharmony_ci mask = ETDM_OUT_CON0_RELATCH_DOMAIN_MASK; 184662306a36Sopenharmony_ci val = ETDM_OUT_CON0_RELATCH_DOMAIN(ETDM_RELATCH_TIMING_A1A2SYS); 184762306a36Sopenharmony_ci regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val); 184862306a36Sopenharmony_ci 184962306a36Sopenharmony_ci mask = 0; 185062306a36Sopenharmony_ci val = 0; 185162306a36Sopenharmony_ci 185262306a36Sopenharmony_ci /* con1 */ 185362306a36Sopenharmony_ci if (lrck_width > 0) { 185462306a36Sopenharmony_ci mask |= (ETDM_OUT_CON1_LRCK_AUTO_MODE | 185562306a36Sopenharmony_ci ETDM_OUT_CON1_LRCK_WIDTH_MASK); 185662306a36Sopenharmony_ci val |= ETDM_OUT_CON1_LRCK_WIDTH(lrck_width); 185762306a36Sopenharmony_ci } 185862306a36Sopenharmony_ci regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val); 185962306a36Sopenharmony_ci 186062306a36Sopenharmony_ci mask = 0; 186162306a36Sopenharmony_ci val = 0; 186262306a36Sopenharmony_ci 186362306a36Sopenharmony_ci if (slave_mode) { 186462306a36Sopenharmony_ci /* con2 */ 186562306a36Sopenharmony_ci mask = (ETDM_OUT_CON2_LRCK_DELAY_BCK_INV | 186662306a36Sopenharmony_ci ETDM_OUT_CON2_LRCK_DELAY_0P5T_EN); 186762306a36Sopenharmony_ci val = (ETDM_OUT_CON2_LRCK_DELAY_BCK_INV | 186862306a36Sopenharmony_ci ETDM_OUT_CON2_LRCK_DELAY_0P5T_EN); 186962306a36Sopenharmony_ci regmap_update_bits(afe->regmap, etdm_reg.con2, 187062306a36Sopenharmony_ci mask, val); 187162306a36Sopenharmony_ci mask = 0; 187262306a36Sopenharmony_ci val = 0; 187362306a36Sopenharmony_ci } else { 187462306a36Sopenharmony_ci /* con4 */ 187562306a36Sopenharmony_ci mask |= ETDM_OUT_CON4_FS_MASK; 187662306a36Sopenharmony_ci val |= ETDM_OUT_CON4_FS(get_etdm_fs_timing(rate)); 187762306a36Sopenharmony_ci } 187862306a36Sopenharmony_ci 187962306a36Sopenharmony_ci mask |= ETDM_OUT_CON4_RELATCH_EN_MASK; 188062306a36Sopenharmony_ci if (dai_id == MT8195_AFE_IO_ETDM1_OUT) 188162306a36Sopenharmony_ci fs = MT8195_ETDM_OUT1_1X_EN; 188262306a36Sopenharmony_ci else if (dai_id == MT8195_AFE_IO_ETDM2_OUT) 188362306a36Sopenharmony_ci fs = MT8195_ETDM_OUT2_1X_EN; 188462306a36Sopenharmony_ci 188562306a36Sopenharmony_ci val |= ETDM_OUT_CON4_RELATCH_EN(fs); 188662306a36Sopenharmony_ci 188762306a36Sopenharmony_ci regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val); 188862306a36Sopenharmony_ci 188962306a36Sopenharmony_ci mask = 0; 189062306a36Sopenharmony_ci val = 0; 189162306a36Sopenharmony_ci 189262306a36Sopenharmony_ci /* con5 */ 189362306a36Sopenharmony_ci mask |= (ETDM_OUT_CON5_MASTER_LRCK_INV | ETDM_OUT_CON5_MASTER_BCK_INV | 189462306a36Sopenharmony_ci ETDM_OUT_CON5_SLAVE_LRCK_INV | ETDM_OUT_CON5_SLAVE_BCK_INV); 189562306a36Sopenharmony_ci if (slave_mode) { 189662306a36Sopenharmony_ci if (etdm_data->lrck_inv) 189762306a36Sopenharmony_ci val |= ETDM_OUT_CON5_SLAVE_LRCK_INV; 189862306a36Sopenharmony_ci if (etdm_data->bck_inv) 189962306a36Sopenharmony_ci val |= ETDM_OUT_CON5_SLAVE_BCK_INV; 190062306a36Sopenharmony_ci } else { 190162306a36Sopenharmony_ci if (etdm_data->lrck_inv) 190262306a36Sopenharmony_ci val |= ETDM_OUT_CON5_MASTER_LRCK_INV; 190362306a36Sopenharmony_ci if (etdm_data->bck_inv) 190462306a36Sopenharmony_ci val |= ETDM_OUT_CON5_MASTER_BCK_INV; 190562306a36Sopenharmony_ci } 190662306a36Sopenharmony_ci regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val); 190762306a36Sopenharmony_ci 190862306a36Sopenharmony_ci return 0; 190962306a36Sopenharmony_ci} 191062306a36Sopenharmony_ci 191162306a36Sopenharmony_cistatic int mtk_dai_etdm_mclk_configure(struct mtk_base_afe *afe, int dai_id) 191262306a36Sopenharmony_ci{ 191362306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 191462306a36Sopenharmony_ci struct mtk_dai_etdm_priv *etdm_data; 191562306a36Sopenharmony_ci int clk_id = mtk_dai_etdm_get_clk_id_by_dai_id(dai_id); 191662306a36Sopenharmony_ci int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id); 191762306a36Sopenharmony_ci int apll; 191862306a36Sopenharmony_ci int apll_clk_id; 191962306a36Sopenharmony_ci struct etdm_con_reg etdm_reg; 192062306a36Sopenharmony_ci unsigned int val = 0; 192162306a36Sopenharmony_ci unsigned int mask = 0; 192262306a36Sopenharmony_ci int ret = 0; 192362306a36Sopenharmony_ci 192462306a36Sopenharmony_ci if (clk_id < 0 || clkdiv_id < 0) 192562306a36Sopenharmony_ci return 0; 192662306a36Sopenharmony_ci 192762306a36Sopenharmony_ci if (!mt8195_afe_etdm_is_valid(dai_id)) 192862306a36Sopenharmony_ci return -EINVAL; 192962306a36Sopenharmony_ci 193062306a36Sopenharmony_ci etdm_data = afe_priv->dai_priv[dai_id]; 193162306a36Sopenharmony_ci ret = get_etdm_reg(dai_id, &etdm_reg); 193262306a36Sopenharmony_ci if (ret < 0) 193362306a36Sopenharmony_ci return ret; 193462306a36Sopenharmony_ci 193562306a36Sopenharmony_ci mask |= ETDM_CON1_MCLK_OUTPUT; 193662306a36Sopenharmony_ci if (etdm_data->mclk_dir == SND_SOC_CLOCK_OUT) 193762306a36Sopenharmony_ci val |= ETDM_CON1_MCLK_OUTPUT; 193862306a36Sopenharmony_ci regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val); 193962306a36Sopenharmony_ci 194062306a36Sopenharmony_ci if (etdm_data->mclk_freq) { 194162306a36Sopenharmony_ci apll = etdm_data->mclk_apll; 194262306a36Sopenharmony_ci apll_clk_id = mt8195_afe_get_mclk_source_clk_id(apll); 194362306a36Sopenharmony_ci if (apll_clk_id < 0) 194462306a36Sopenharmony_ci return apll_clk_id; 194562306a36Sopenharmony_ci 194662306a36Sopenharmony_ci /* select apll */ 194762306a36Sopenharmony_ci ret = mt8195_afe_set_clk_parent(afe, afe_priv->clk[clk_id], 194862306a36Sopenharmony_ci afe_priv->clk[apll_clk_id]); 194962306a36Sopenharmony_ci if (ret) 195062306a36Sopenharmony_ci return ret; 195162306a36Sopenharmony_ci 195262306a36Sopenharmony_ci /* set rate */ 195362306a36Sopenharmony_ci ret = mt8195_afe_set_clk_rate(afe, afe_priv->clk[clkdiv_id], 195462306a36Sopenharmony_ci etdm_data->mclk_freq); 195562306a36Sopenharmony_ci } else { 195662306a36Sopenharmony_ci if (etdm_data->mclk_dir == SND_SOC_CLOCK_OUT) 195762306a36Sopenharmony_ci dev_dbg(afe->dev, "%s mclk freq = 0\n", __func__); 195862306a36Sopenharmony_ci } 195962306a36Sopenharmony_ci return ret; 196062306a36Sopenharmony_ci} 196162306a36Sopenharmony_ci 196262306a36Sopenharmony_cistatic int mtk_dai_etdm_configure(struct mtk_base_afe *afe, 196362306a36Sopenharmony_ci unsigned int rate, 196462306a36Sopenharmony_ci unsigned int channels, 196562306a36Sopenharmony_ci unsigned int bit_width, 196662306a36Sopenharmony_ci int dai_id) 196762306a36Sopenharmony_ci{ 196862306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 196962306a36Sopenharmony_ci struct mtk_dai_etdm_priv *etdm_data; 197062306a36Sopenharmony_ci struct etdm_con_reg etdm_reg; 197162306a36Sopenharmony_ci bool slave_mode; 197262306a36Sopenharmony_ci unsigned int etdm_channels; 197362306a36Sopenharmony_ci unsigned int val = 0; 197462306a36Sopenharmony_ci unsigned int mask = 0; 197562306a36Sopenharmony_ci unsigned int bck; 197662306a36Sopenharmony_ci unsigned int wlen = get_etdm_wlen(bit_width); 197762306a36Sopenharmony_ci int ret; 197862306a36Sopenharmony_ci 197962306a36Sopenharmony_ci if (!mt8195_afe_etdm_is_valid(dai_id)) 198062306a36Sopenharmony_ci return -EINVAL; 198162306a36Sopenharmony_ci 198262306a36Sopenharmony_ci etdm_data = afe_priv->dai_priv[dai_id]; 198362306a36Sopenharmony_ci slave_mode = etdm_data->slave_mode; 198462306a36Sopenharmony_ci ret = get_etdm_reg(dai_id, &etdm_reg); 198562306a36Sopenharmony_ci if (ret < 0) 198662306a36Sopenharmony_ci return ret; 198762306a36Sopenharmony_ci 198862306a36Sopenharmony_ci if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) 198962306a36Sopenharmony_ci slave_mode = true; 199062306a36Sopenharmony_ci 199162306a36Sopenharmony_ci dev_dbg(afe->dev, "%s fmt %u data %u lrck %d-%u bck %d, clock %u slv %u\n", 199262306a36Sopenharmony_ci __func__, etdm_data->format, etdm_data->data_mode, 199362306a36Sopenharmony_ci etdm_data->lrck_inv, etdm_data->lrck_width, etdm_data->bck_inv, 199462306a36Sopenharmony_ci etdm_data->clock_mode, etdm_data->slave_mode); 199562306a36Sopenharmony_ci dev_dbg(afe->dev, "%s rate %u channels %u bitwidth %u, id %d\n", 199662306a36Sopenharmony_ci __func__, rate, channels, bit_width, dai_id); 199762306a36Sopenharmony_ci 199862306a36Sopenharmony_ci etdm_channels = (etdm_data->data_mode == MTK_DAI_ETDM_DATA_ONE_PIN) ? 199962306a36Sopenharmony_ci get_etdm_ch_fixup(channels) : 2; 200062306a36Sopenharmony_ci 200162306a36Sopenharmony_ci bck = rate * etdm_channels * wlen; 200262306a36Sopenharmony_ci if (bck > MT8195_ETDM_NORMAL_MAX_BCK_RATE) { 200362306a36Sopenharmony_ci dev_info(afe->dev, "%s bck rate %u not support\n", 200462306a36Sopenharmony_ci __func__, bck); 200562306a36Sopenharmony_ci return -EINVAL; 200662306a36Sopenharmony_ci } 200762306a36Sopenharmony_ci 200862306a36Sopenharmony_ci /* con0 */ 200962306a36Sopenharmony_ci mask |= ETDM_CON0_BIT_LEN_MASK; 201062306a36Sopenharmony_ci val |= ETDM_CON0_BIT_LEN(bit_width); 201162306a36Sopenharmony_ci mask |= ETDM_CON0_WORD_LEN_MASK; 201262306a36Sopenharmony_ci val |= ETDM_CON0_WORD_LEN(wlen); 201362306a36Sopenharmony_ci mask |= ETDM_CON0_FORMAT_MASK; 201462306a36Sopenharmony_ci val |= ETDM_CON0_FORMAT(etdm_data->format); 201562306a36Sopenharmony_ci mask |= ETDM_CON0_CH_NUM_MASK; 201662306a36Sopenharmony_ci val |= ETDM_CON0_CH_NUM(etdm_channels); 201762306a36Sopenharmony_ci 201862306a36Sopenharmony_ci mask |= ETDM_CON0_SLAVE_MODE; 201962306a36Sopenharmony_ci if (slave_mode) { 202062306a36Sopenharmony_ci if (dai_id == MT8195_AFE_IO_ETDM1_OUT && 202162306a36Sopenharmony_ci etdm_data->cowork_source_id == COWORK_ETDM_NONE) { 202262306a36Sopenharmony_ci dev_info(afe->dev, "%s id %d only support master mode\n", 202362306a36Sopenharmony_ci __func__, dai_id); 202462306a36Sopenharmony_ci return -EINVAL; 202562306a36Sopenharmony_ci } 202662306a36Sopenharmony_ci val |= ETDM_CON0_SLAVE_MODE; 202762306a36Sopenharmony_ci } 202862306a36Sopenharmony_ci regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val); 202962306a36Sopenharmony_ci 203062306a36Sopenharmony_ci if (get_etdm_dir(dai_id) == ETDM_IN) 203162306a36Sopenharmony_ci mtk_dai_etdm_in_configure(afe, rate, channels, dai_id); 203262306a36Sopenharmony_ci else 203362306a36Sopenharmony_ci mtk_dai_etdm_out_configure(afe, rate, channels, dai_id); 203462306a36Sopenharmony_ci 203562306a36Sopenharmony_ci return 0; 203662306a36Sopenharmony_ci} 203762306a36Sopenharmony_ci 203862306a36Sopenharmony_cistatic int mtk_dai_etdm_hw_params(struct snd_pcm_substream *substream, 203962306a36Sopenharmony_ci struct snd_pcm_hw_params *params, 204062306a36Sopenharmony_ci struct snd_soc_dai *dai) 204162306a36Sopenharmony_ci{ 204262306a36Sopenharmony_ci int ret = 0; 204362306a36Sopenharmony_ci unsigned int rate = params_rate(params); 204462306a36Sopenharmony_ci unsigned int bit_width = params_width(params); 204562306a36Sopenharmony_ci unsigned int channels = params_channels(params); 204662306a36Sopenharmony_ci struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 204762306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 204862306a36Sopenharmony_ci struct mtk_dai_etdm_priv *mst_etdm_data; 204962306a36Sopenharmony_ci int mst_dai_id; 205062306a36Sopenharmony_ci int slv_dai_id; 205162306a36Sopenharmony_ci int i; 205262306a36Sopenharmony_ci 205362306a36Sopenharmony_ci dev_dbg(afe->dev, "%s '%s' period %u-%u\n", 205462306a36Sopenharmony_ci __func__, snd_pcm_stream_str(substream), 205562306a36Sopenharmony_ci params_period_size(params), params_periods(params)); 205662306a36Sopenharmony_ci 205762306a36Sopenharmony_ci if (is_cowork_mode(dai)) { 205862306a36Sopenharmony_ci mst_dai_id = get_etdm_cowork_master_id(dai); 205962306a36Sopenharmony_ci if (!mt8195_afe_etdm_is_valid(mst_dai_id)) 206062306a36Sopenharmony_ci return -EINVAL; 206162306a36Sopenharmony_ci 206262306a36Sopenharmony_ci ret = mtk_dai_etdm_mclk_configure(afe, mst_dai_id); 206362306a36Sopenharmony_ci if (ret) 206462306a36Sopenharmony_ci return ret; 206562306a36Sopenharmony_ci 206662306a36Sopenharmony_ci ret = mtk_dai_etdm_configure(afe, rate, channels, 206762306a36Sopenharmony_ci bit_width, mst_dai_id); 206862306a36Sopenharmony_ci if (ret) 206962306a36Sopenharmony_ci return ret; 207062306a36Sopenharmony_ci 207162306a36Sopenharmony_ci mst_etdm_data = afe_priv->dai_priv[mst_dai_id]; 207262306a36Sopenharmony_ci for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) { 207362306a36Sopenharmony_ci slv_dai_id = mst_etdm_data->cowork_slv_id[i]; 207462306a36Sopenharmony_ci ret = mtk_dai_etdm_configure(afe, rate, channels, 207562306a36Sopenharmony_ci bit_width, slv_dai_id); 207662306a36Sopenharmony_ci if (ret) 207762306a36Sopenharmony_ci return ret; 207862306a36Sopenharmony_ci 207962306a36Sopenharmony_ci ret = mt8195_etdm_sync_mode_configure(afe, slv_dai_id); 208062306a36Sopenharmony_ci if (ret) 208162306a36Sopenharmony_ci return ret; 208262306a36Sopenharmony_ci } 208362306a36Sopenharmony_ci } else { 208462306a36Sopenharmony_ci ret = mtk_dai_etdm_mclk_configure(afe, dai->id); 208562306a36Sopenharmony_ci if (ret) 208662306a36Sopenharmony_ci return ret; 208762306a36Sopenharmony_ci 208862306a36Sopenharmony_ci ret = mtk_dai_etdm_configure(afe, rate, channels, 208962306a36Sopenharmony_ci bit_width, dai->id); 209062306a36Sopenharmony_ci } 209162306a36Sopenharmony_ci 209262306a36Sopenharmony_ci return ret; 209362306a36Sopenharmony_ci} 209462306a36Sopenharmony_ci 209562306a36Sopenharmony_cistatic int mtk_dai_etdm_trigger(struct snd_pcm_substream *substream, int cmd, 209662306a36Sopenharmony_ci struct snd_soc_dai *dai) 209762306a36Sopenharmony_ci{ 209862306a36Sopenharmony_ci int ret = 0; 209962306a36Sopenharmony_ci struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 210062306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 210162306a36Sopenharmony_ci struct mtk_dai_etdm_priv *mst_etdm_data; 210262306a36Sopenharmony_ci int mst_dai_id; 210362306a36Sopenharmony_ci int slv_dai_id; 210462306a36Sopenharmony_ci int i; 210562306a36Sopenharmony_ci 210662306a36Sopenharmony_ci dev_dbg(afe->dev, "%s(), cmd %d, dai id %d\n", __func__, cmd, dai->id); 210762306a36Sopenharmony_ci switch (cmd) { 210862306a36Sopenharmony_ci case SNDRV_PCM_TRIGGER_START: 210962306a36Sopenharmony_ci case SNDRV_PCM_TRIGGER_RESUME: 211062306a36Sopenharmony_ci if (is_cowork_mode(dai)) { 211162306a36Sopenharmony_ci mst_dai_id = get_etdm_cowork_master_id(dai); 211262306a36Sopenharmony_ci if (!mt8195_afe_etdm_is_valid(mst_dai_id)) 211362306a36Sopenharmony_ci return -EINVAL; 211462306a36Sopenharmony_ci 211562306a36Sopenharmony_ci mst_etdm_data = afe_priv->dai_priv[mst_dai_id]; 211662306a36Sopenharmony_ci 211762306a36Sopenharmony_ci //open master first 211862306a36Sopenharmony_ci ret |= mt8195_afe_enable_etdm(afe, mst_dai_id); 211962306a36Sopenharmony_ci for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) { 212062306a36Sopenharmony_ci slv_dai_id = mst_etdm_data->cowork_slv_id[i]; 212162306a36Sopenharmony_ci ret |= mt8195_afe_enable_etdm(afe, slv_dai_id); 212262306a36Sopenharmony_ci } 212362306a36Sopenharmony_ci } else { 212462306a36Sopenharmony_ci ret = mt8195_afe_enable_etdm(afe, dai->id); 212562306a36Sopenharmony_ci } 212662306a36Sopenharmony_ci break; 212762306a36Sopenharmony_ci case SNDRV_PCM_TRIGGER_STOP: 212862306a36Sopenharmony_ci case SNDRV_PCM_TRIGGER_SUSPEND: 212962306a36Sopenharmony_ci if (is_cowork_mode(dai)) { 213062306a36Sopenharmony_ci mst_dai_id = get_etdm_cowork_master_id(dai); 213162306a36Sopenharmony_ci if (!mt8195_afe_etdm_is_valid(mst_dai_id)) 213262306a36Sopenharmony_ci return -EINVAL; 213362306a36Sopenharmony_ci 213462306a36Sopenharmony_ci mst_etdm_data = afe_priv->dai_priv[mst_dai_id]; 213562306a36Sopenharmony_ci 213662306a36Sopenharmony_ci for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) { 213762306a36Sopenharmony_ci slv_dai_id = mst_etdm_data->cowork_slv_id[i]; 213862306a36Sopenharmony_ci ret |= mt8195_afe_disable_etdm(afe, slv_dai_id); 213962306a36Sopenharmony_ci } 214062306a36Sopenharmony_ci // close master at last 214162306a36Sopenharmony_ci ret |= mt8195_afe_disable_etdm(afe, mst_dai_id); 214262306a36Sopenharmony_ci } else { 214362306a36Sopenharmony_ci ret = mt8195_afe_disable_etdm(afe, dai->id); 214462306a36Sopenharmony_ci } 214562306a36Sopenharmony_ci break; 214662306a36Sopenharmony_ci default: 214762306a36Sopenharmony_ci break; 214862306a36Sopenharmony_ci } 214962306a36Sopenharmony_ci return ret; 215062306a36Sopenharmony_ci} 215162306a36Sopenharmony_ci 215262306a36Sopenharmony_cistatic int mtk_dai_etdm_cal_mclk(struct mtk_base_afe *afe, int freq, int dai_id) 215362306a36Sopenharmony_ci{ 215462306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 215562306a36Sopenharmony_ci struct mtk_dai_etdm_priv *etdm_data; 215662306a36Sopenharmony_ci int apll; 215762306a36Sopenharmony_ci int apll_rate; 215862306a36Sopenharmony_ci 215962306a36Sopenharmony_ci if (!mt8195_afe_etdm_is_valid(dai_id)) 216062306a36Sopenharmony_ci return -EINVAL; 216162306a36Sopenharmony_ci 216262306a36Sopenharmony_ci etdm_data = afe_priv->dai_priv[dai_id]; 216362306a36Sopenharmony_ci if (freq == 0) { 216462306a36Sopenharmony_ci etdm_data->mclk_freq = freq; 216562306a36Sopenharmony_ci return 0; 216662306a36Sopenharmony_ci } 216762306a36Sopenharmony_ci 216862306a36Sopenharmony_ci apll = mt8195_afe_get_default_mclk_source_by_rate(freq); 216962306a36Sopenharmony_ci apll_rate = mt8195_afe_get_mclk_source_rate(afe, apll); 217062306a36Sopenharmony_ci 217162306a36Sopenharmony_ci if (freq > apll_rate) { 217262306a36Sopenharmony_ci dev_info(afe->dev, "freq %d > apll rate %d\n", freq, apll_rate); 217362306a36Sopenharmony_ci return -EINVAL; 217462306a36Sopenharmony_ci } 217562306a36Sopenharmony_ci 217662306a36Sopenharmony_ci if (apll_rate % freq != 0) { 217762306a36Sopenharmony_ci dev_info(afe->dev, "APLL%d cannot generate freq Hz\n", apll); 217862306a36Sopenharmony_ci return -EINVAL; 217962306a36Sopenharmony_ci } 218062306a36Sopenharmony_ci 218162306a36Sopenharmony_ci etdm_data->mclk_apll = apll; 218262306a36Sopenharmony_ci etdm_data->mclk_freq = freq; 218362306a36Sopenharmony_ci 218462306a36Sopenharmony_ci return 0; 218562306a36Sopenharmony_ci} 218662306a36Sopenharmony_ci 218762306a36Sopenharmony_cistatic int mtk_dai_etdm_set_sysclk(struct snd_soc_dai *dai, 218862306a36Sopenharmony_ci int clk_id, unsigned int freq, int dir) 218962306a36Sopenharmony_ci{ 219062306a36Sopenharmony_ci struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 219162306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 219262306a36Sopenharmony_ci struct mtk_dai_etdm_priv *etdm_data; 219362306a36Sopenharmony_ci int dai_id; 219462306a36Sopenharmony_ci 219562306a36Sopenharmony_ci dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n", 219662306a36Sopenharmony_ci __func__, dai->id, freq, dir); 219762306a36Sopenharmony_ci if (is_cowork_mode(dai)) 219862306a36Sopenharmony_ci dai_id = get_etdm_cowork_master_id(dai); 219962306a36Sopenharmony_ci else 220062306a36Sopenharmony_ci dai_id = dai->id; 220162306a36Sopenharmony_ci 220262306a36Sopenharmony_ci if (!mt8195_afe_etdm_is_valid(dai_id)) 220362306a36Sopenharmony_ci return -EINVAL; 220462306a36Sopenharmony_ci 220562306a36Sopenharmony_ci etdm_data = afe_priv->dai_priv[dai_id]; 220662306a36Sopenharmony_ci etdm_data->mclk_dir = dir; 220762306a36Sopenharmony_ci return mtk_dai_etdm_cal_mclk(afe, freq, dai_id); 220862306a36Sopenharmony_ci} 220962306a36Sopenharmony_ci 221062306a36Sopenharmony_cistatic int mtk_dai_etdm_set_tdm_slot(struct snd_soc_dai *dai, 221162306a36Sopenharmony_ci unsigned int tx_mask, unsigned int rx_mask, 221262306a36Sopenharmony_ci int slots, int slot_width) 221362306a36Sopenharmony_ci{ 221462306a36Sopenharmony_ci struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 221562306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 221662306a36Sopenharmony_ci struct mtk_dai_etdm_priv *etdm_data; 221762306a36Sopenharmony_ci 221862306a36Sopenharmony_ci if (!mt8195_afe_etdm_is_valid(dai->id)) 221962306a36Sopenharmony_ci return -EINVAL; 222062306a36Sopenharmony_ci 222162306a36Sopenharmony_ci etdm_data = afe_priv->dai_priv[dai->id]; 222262306a36Sopenharmony_ci dev_dbg(dai->dev, "%s id %d slot_width %d\n", 222362306a36Sopenharmony_ci __func__, dai->id, slot_width); 222462306a36Sopenharmony_ci 222562306a36Sopenharmony_ci etdm_data->slots = slots; 222662306a36Sopenharmony_ci etdm_data->lrck_width = slot_width; 222762306a36Sopenharmony_ci return 0; 222862306a36Sopenharmony_ci} 222962306a36Sopenharmony_ci 223062306a36Sopenharmony_cistatic int mtk_dai_etdm_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) 223162306a36Sopenharmony_ci{ 223262306a36Sopenharmony_ci struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 223362306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 223462306a36Sopenharmony_ci struct mtk_dai_etdm_priv *etdm_data; 223562306a36Sopenharmony_ci 223662306a36Sopenharmony_ci if (!mt8195_afe_etdm_is_valid(dai->id)) 223762306a36Sopenharmony_ci return -EINVAL; 223862306a36Sopenharmony_ci 223962306a36Sopenharmony_ci etdm_data = afe_priv->dai_priv[dai->id]; 224062306a36Sopenharmony_ci switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 224162306a36Sopenharmony_ci case SND_SOC_DAIFMT_I2S: 224262306a36Sopenharmony_ci etdm_data->format = MTK_DAI_ETDM_FORMAT_I2S; 224362306a36Sopenharmony_ci break; 224462306a36Sopenharmony_ci case SND_SOC_DAIFMT_LEFT_J: 224562306a36Sopenharmony_ci etdm_data->format = MTK_DAI_ETDM_FORMAT_LJ; 224662306a36Sopenharmony_ci break; 224762306a36Sopenharmony_ci case SND_SOC_DAIFMT_RIGHT_J: 224862306a36Sopenharmony_ci etdm_data->format = MTK_DAI_ETDM_FORMAT_RJ; 224962306a36Sopenharmony_ci break; 225062306a36Sopenharmony_ci case SND_SOC_DAIFMT_DSP_A: 225162306a36Sopenharmony_ci etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPA; 225262306a36Sopenharmony_ci break; 225362306a36Sopenharmony_ci case SND_SOC_DAIFMT_DSP_B: 225462306a36Sopenharmony_ci etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPB; 225562306a36Sopenharmony_ci break; 225662306a36Sopenharmony_ci default: 225762306a36Sopenharmony_ci return -EINVAL; 225862306a36Sopenharmony_ci } 225962306a36Sopenharmony_ci 226062306a36Sopenharmony_ci switch (fmt & SND_SOC_DAIFMT_INV_MASK) { 226162306a36Sopenharmony_ci case SND_SOC_DAIFMT_NB_NF: 226262306a36Sopenharmony_ci etdm_data->bck_inv = false; 226362306a36Sopenharmony_ci etdm_data->lrck_inv = false; 226462306a36Sopenharmony_ci break; 226562306a36Sopenharmony_ci case SND_SOC_DAIFMT_NB_IF: 226662306a36Sopenharmony_ci etdm_data->bck_inv = false; 226762306a36Sopenharmony_ci etdm_data->lrck_inv = true; 226862306a36Sopenharmony_ci break; 226962306a36Sopenharmony_ci case SND_SOC_DAIFMT_IB_NF: 227062306a36Sopenharmony_ci etdm_data->bck_inv = true; 227162306a36Sopenharmony_ci etdm_data->lrck_inv = false; 227262306a36Sopenharmony_ci break; 227362306a36Sopenharmony_ci case SND_SOC_DAIFMT_IB_IF: 227462306a36Sopenharmony_ci etdm_data->bck_inv = true; 227562306a36Sopenharmony_ci etdm_data->lrck_inv = true; 227662306a36Sopenharmony_ci break; 227762306a36Sopenharmony_ci default: 227862306a36Sopenharmony_ci return -EINVAL; 227962306a36Sopenharmony_ci } 228062306a36Sopenharmony_ci 228162306a36Sopenharmony_ci switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) { 228262306a36Sopenharmony_ci case SND_SOC_DAIFMT_BC_FC: 228362306a36Sopenharmony_ci etdm_data->slave_mode = true; 228462306a36Sopenharmony_ci break; 228562306a36Sopenharmony_ci case SND_SOC_DAIFMT_BP_FP: 228662306a36Sopenharmony_ci etdm_data->slave_mode = false; 228762306a36Sopenharmony_ci break; 228862306a36Sopenharmony_ci default: 228962306a36Sopenharmony_ci return -EINVAL; 229062306a36Sopenharmony_ci } 229162306a36Sopenharmony_ci 229262306a36Sopenharmony_ci return 0; 229362306a36Sopenharmony_ci} 229462306a36Sopenharmony_ci 229562306a36Sopenharmony_cistatic int mtk_dai_hdmitx_dptx_startup(struct snd_pcm_substream *substream, 229662306a36Sopenharmony_ci struct snd_soc_dai *dai) 229762306a36Sopenharmony_ci{ 229862306a36Sopenharmony_ci struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 229962306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 230062306a36Sopenharmony_ci int cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id); 230162306a36Sopenharmony_ci 230262306a36Sopenharmony_ci if (cg_id >= 0) 230362306a36Sopenharmony_ci mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]); 230462306a36Sopenharmony_ci 230562306a36Sopenharmony_ci mtk_dai_etdm_enable_mclk(afe, dai->id); 230662306a36Sopenharmony_ci 230762306a36Sopenharmony_ci return 0; 230862306a36Sopenharmony_ci} 230962306a36Sopenharmony_ci 231062306a36Sopenharmony_cistatic void mtk_dai_hdmitx_dptx_shutdown(struct snd_pcm_substream *substream, 231162306a36Sopenharmony_ci struct snd_soc_dai *dai) 231262306a36Sopenharmony_ci{ 231362306a36Sopenharmony_ci struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 231462306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 231562306a36Sopenharmony_ci int cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id); 231662306a36Sopenharmony_ci 231762306a36Sopenharmony_ci mtk_dai_etdm_disable_mclk(afe, dai->id); 231862306a36Sopenharmony_ci 231962306a36Sopenharmony_ci if (cg_id >= 0) 232062306a36Sopenharmony_ci mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]); 232162306a36Sopenharmony_ci} 232262306a36Sopenharmony_ci 232362306a36Sopenharmony_cistatic unsigned int mtk_dai_get_dptx_ch_en(unsigned int channel) 232462306a36Sopenharmony_ci{ 232562306a36Sopenharmony_ci switch (channel) { 232662306a36Sopenharmony_ci case 1 ... 2: 232762306a36Sopenharmony_ci return AFE_DPTX_CON_CH_EN_2CH; 232862306a36Sopenharmony_ci case 3 ... 4: 232962306a36Sopenharmony_ci return AFE_DPTX_CON_CH_EN_4CH; 233062306a36Sopenharmony_ci case 5 ... 6: 233162306a36Sopenharmony_ci return AFE_DPTX_CON_CH_EN_6CH; 233262306a36Sopenharmony_ci case 7 ... 8: 233362306a36Sopenharmony_ci return AFE_DPTX_CON_CH_EN_8CH; 233462306a36Sopenharmony_ci default: 233562306a36Sopenharmony_ci return AFE_DPTX_CON_CH_EN_2CH; 233662306a36Sopenharmony_ci } 233762306a36Sopenharmony_ci} 233862306a36Sopenharmony_ci 233962306a36Sopenharmony_cistatic unsigned int mtk_dai_get_dptx_ch(unsigned int ch) 234062306a36Sopenharmony_ci{ 234162306a36Sopenharmony_ci return (ch > 2) ? 234262306a36Sopenharmony_ci AFE_DPTX_CON_CH_NUM_8CH : AFE_DPTX_CON_CH_NUM_2CH; 234362306a36Sopenharmony_ci} 234462306a36Sopenharmony_ci 234562306a36Sopenharmony_cistatic unsigned int mtk_dai_get_dptx_wlen(snd_pcm_format_t format) 234662306a36Sopenharmony_ci{ 234762306a36Sopenharmony_ci return snd_pcm_format_physical_width(format) <= 16 ? 234862306a36Sopenharmony_ci AFE_DPTX_CON_16BIT : AFE_DPTX_CON_24BIT; 234962306a36Sopenharmony_ci} 235062306a36Sopenharmony_ci 235162306a36Sopenharmony_cistatic int mtk_dai_hdmitx_dptx_hw_params(struct snd_pcm_substream *substream, 235262306a36Sopenharmony_ci struct snd_pcm_hw_params *params, 235362306a36Sopenharmony_ci struct snd_soc_dai *dai) 235462306a36Sopenharmony_ci{ 235562306a36Sopenharmony_ci struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 235662306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 235762306a36Sopenharmony_ci struct mtk_dai_etdm_priv *etdm_data; 235862306a36Sopenharmony_ci unsigned int rate = params_rate(params); 235962306a36Sopenharmony_ci unsigned int channels = params_channels(params); 236062306a36Sopenharmony_ci snd_pcm_format_t format = params_format(params); 236162306a36Sopenharmony_ci int width = snd_pcm_format_physical_width(format); 236262306a36Sopenharmony_ci int ret = 0; 236362306a36Sopenharmony_ci 236462306a36Sopenharmony_ci if (!mt8195_afe_hdmitx_dptx_is_valid(dai->id)) 236562306a36Sopenharmony_ci return -EINVAL; 236662306a36Sopenharmony_ci 236762306a36Sopenharmony_ci etdm_data = afe_priv->dai_priv[dai->id]; 236862306a36Sopenharmony_ci 236962306a36Sopenharmony_ci /* dptx configure */ 237062306a36Sopenharmony_ci if (dai->id == MT8195_AFE_IO_DPTX) { 237162306a36Sopenharmony_ci regmap_update_bits(afe->regmap, AFE_DPTX_CON, 237262306a36Sopenharmony_ci AFE_DPTX_CON_CH_EN_MASK, 237362306a36Sopenharmony_ci mtk_dai_get_dptx_ch_en(channels)); 237462306a36Sopenharmony_ci regmap_update_bits(afe->regmap, AFE_DPTX_CON, 237562306a36Sopenharmony_ci AFE_DPTX_CON_CH_NUM_MASK, 237662306a36Sopenharmony_ci mtk_dai_get_dptx_ch(channels)); 237762306a36Sopenharmony_ci regmap_update_bits(afe->regmap, AFE_DPTX_CON, 237862306a36Sopenharmony_ci AFE_DPTX_CON_16BIT_MASK, 237962306a36Sopenharmony_ci mtk_dai_get_dptx_wlen(format)); 238062306a36Sopenharmony_ci 238162306a36Sopenharmony_ci if (mtk_dai_get_dptx_ch(channels) == AFE_DPTX_CON_CH_NUM_8CH) { 238262306a36Sopenharmony_ci etdm_data->data_mode = MTK_DAI_ETDM_DATA_ONE_PIN; 238362306a36Sopenharmony_ci channels = 8; 238462306a36Sopenharmony_ci } else { 238562306a36Sopenharmony_ci channels = 2; 238662306a36Sopenharmony_ci } 238762306a36Sopenharmony_ci } else { 238862306a36Sopenharmony_ci etdm_data->data_mode = MTK_DAI_ETDM_DATA_MULTI_PIN; 238962306a36Sopenharmony_ci } 239062306a36Sopenharmony_ci 239162306a36Sopenharmony_ci ret = mtk_dai_etdm_mclk_configure(afe, dai->id); 239262306a36Sopenharmony_ci if (ret) 239362306a36Sopenharmony_ci return ret; 239462306a36Sopenharmony_ci 239562306a36Sopenharmony_ci ret = mtk_dai_etdm_configure(afe, rate, channels, width, dai->id); 239662306a36Sopenharmony_ci 239762306a36Sopenharmony_ci return ret; 239862306a36Sopenharmony_ci} 239962306a36Sopenharmony_ci 240062306a36Sopenharmony_cistatic int mtk_dai_hdmitx_dptx_trigger(struct snd_pcm_substream *substream, 240162306a36Sopenharmony_ci int cmd, 240262306a36Sopenharmony_ci struct snd_soc_dai *dai) 240362306a36Sopenharmony_ci{ 240462306a36Sopenharmony_ci struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 240562306a36Sopenharmony_ci int ret = 0; 240662306a36Sopenharmony_ci 240762306a36Sopenharmony_ci dev_dbg(afe->dev, "%s(), cmd %d, dai id %d\n", __func__, cmd, dai->id); 240862306a36Sopenharmony_ci 240962306a36Sopenharmony_ci switch (cmd) { 241062306a36Sopenharmony_ci case SNDRV_PCM_TRIGGER_START: 241162306a36Sopenharmony_ci case SNDRV_PCM_TRIGGER_RESUME: 241262306a36Sopenharmony_ci /* enable dptx interface */ 241362306a36Sopenharmony_ci if (dai->id == MT8195_AFE_IO_DPTX) 241462306a36Sopenharmony_ci regmap_update_bits(afe->regmap, AFE_DPTX_CON, 241562306a36Sopenharmony_ci AFE_DPTX_CON_ON_MASK, 241662306a36Sopenharmony_ci AFE_DPTX_CON_ON); 241762306a36Sopenharmony_ci 241862306a36Sopenharmony_ci /* enable etdm_out3 */ 241962306a36Sopenharmony_ci ret = mt8195_afe_enable_etdm(afe, dai->id); 242062306a36Sopenharmony_ci break; 242162306a36Sopenharmony_ci case SNDRV_PCM_TRIGGER_STOP: 242262306a36Sopenharmony_ci case SNDRV_PCM_TRIGGER_SUSPEND: 242362306a36Sopenharmony_ci /* disable etdm_out3 */ 242462306a36Sopenharmony_ci ret = mt8195_afe_disable_etdm(afe, dai->id); 242562306a36Sopenharmony_ci 242662306a36Sopenharmony_ci /* disable dptx interface */ 242762306a36Sopenharmony_ci if (dai->id == MT8195_AFE_IO_DPTX) 242862306a36Sopenharmony_ci regmap_update_bits(afe->regmap, AFE_DPTX_CON, 242962306a36Sopenharmony_ci AFE_DPTX_CON_ON_MASK, 0); 243062306a36Sopenharmony_ci break; 243162306a36Sopenharmony_ci default: 243262306a36Sopenharmony_ci return -EINVAL; 243362306a36Sopenharmony_ci } 243462306a36Sopenharmony_ci 243562306a36Sopenharmony_ci return ret; 243662306a36Sopenharmony_ci} 243762306a36Sopenharmony_ci 243862306a36Sopenharmony_cistatic int mtk_dai_hdmitx_dptx_set_sysclk(struct snd_soc_dai *dai, 243962306a36Sopenharmony_ci int clk_id, 244062306a36Sopenharmony_ci unsigned int freq, 244162306a36Sopenharmony_ci int dir) 244262306a36Sopenharmony_ci{ 244362306a36Sopenharmony_ci struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 244462306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 244562306a36Sopenharmony_ci struct mtk_dai_etdm_priv *etdm_data; 244662306a36Sopenharmony_ci 244762306a36Sopenharmony_ci if (!mt8195_afe_hdmitx_dptx_is_valid(dai->id)) 244862306a36Sopenharmony_ci return -EINVAL; 244962306a36Sopenharmony_ci 245062306a36Sopenharmony_ci etdm_data = afe_priv->dai_priv[dai->id]; 245162306a36Sopenharmony_ci 245262306a36Sopenharmony_ci dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n", 245362306a36Sopenharmony_ci __func__, dai->id, freq, dir); 245462306a36Sopenharmony_ci 245562306a36Sopenharmony_ci etdm_data->mclk_dir = dir; 245662306a36Sopenharmony_ci return mtk_dai_etdm_cal_mclk(afe, freq, dai->id); 245762306a36Sopenharmony_ci} 245862306a36Sopenharmony_ci 245962306a36Sopenharmony_ci/* dai driver */ 246062306a36Sopenharmony_ci#define MTK_ETDM_RATES (SNDRV_PCM_RATE_8000_384000) 246162306a36Sopenharmony_ci 246262306a36Sopenharmony_ci#define MTK_ETDM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ 246362306a36Sopenharmony_ci SNDRV_PCM_FMTBIT_S24_LE |\ 246462306a36Sopenharmony_ci SNDRV_PCM_FMTBIT_S32_LE) 246562306a36Sopenharmony_ci 246662306a36Sopenharmony_cistatic int mtk_dai_etdm_probe(struct snd_soc_dai *dai) 246762306a36Sopenharmony_ci{ 246862306a36Sopenharmony_ci struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 246962306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 247062306a36Sopenharmony_ci struct mtk_dai_etdm_priv *etdm_data; 247162306a36Sopenharmony_ci 247262306a36Sopenharmony_ci dev_dbg(dai->dev, "%s id %d\n", __func__, dai->id); 247362306a36Sopenharmony_ci 247462306a36Sopenharmony_ci if (!mt8195_afe_etdm_is_valid(dai->id)) 247562306a36Sopenharmony_ci return -EINVAL; 247662306a36Sopenharmony_ci 247762306a36Sopenharmony_ci etdm_data = afe_priv->dai_priv[dai->id]; 247862306a36Sopenharmony_ci if (etdm_data->mclk_freq) { 247962306a36Sopenharmony_ci dev_dbg(afe->dev, "MCLK always on, rate %d\n", 248062306a36Sopenharmony_ci etdm_data->mclk_freq); 248162306a36Sopenharmony_ci pm_runtime_get_sync(afe->dev); 248262306a36Sopenharmony_ci mtk_dai_etdm_mclk_configure(afe, dai->id); 248362306a36Sopenharmony_ci mtk_dai_etdm_enable_mclk(afe, dai->id); 248462306a36Sopenharmony_ci pm_runtime_put_sync(afe->dev); 248562306a36Sopenharmony_ci } 248662306a36Sopenharmony_ci return 0; 248762306a36Sopenharmony_ci} 248862306a36Sopenharmony_ci 248962306a36Sopenharmony_cistatic const struct snd_soc_dai_ops mtk_dai_hdmitx_dptx_ops = { 249062306a36Sopenharmony_ci .startup = mtk_dai_hdmitx_dptx_startup, 249162306a36Sopenharmony_ci .shutdown = mtk_dai_hdmitx_dptx_shutdown, 249262306a36Sopenharmony_ci .hw_params = mtk_dai_hdmitx_dptx_hw_params, 249362306a36Sopenharmony_ci .trigger = mtk_dai_hdmitx_dptx_trigger, 249462306a36Sopenharmony_ci .set_sysclk = mtk_dai_hdmitx_dptx_set_sysclk, 249562306a36Sopenharmony_ci .set_fmt = mtk_dai_etdm_set_fmt, 249662306a36Sopenharmony_ci}; 249762306a36Sopenharmony_ci 249862306a36Sopenharmony_cistatic const struct snd_soc_dai_ops mtk_dai_hdmitx_dptx_ops2 = { 249962306a36Sopenharmony_ci .probe = mtk_dai_etdm_probe, 250062306a36Sopenharmony_ci .startup = mtk_dai_hdmitx_dptx_startup, 250162306a36Sopenharmony_ci .shutdown = mtk_dai_hdmitx_dptx_shutdown, 250262306a36Sopenharmony_ci .hw_params = mtk_dai_hdmitx_dptx_hw_params, 250362306a36Sopenharmony_ci .trigger = mtk_dai_hdmitx_dptx_trigger, 250462306a36Sopenharmony_ci .set_sysclk = mtk_dai_hdmitx_dptx_set_sysclk, 250562306a36Sopenharmony_ci .set_fmt = mtk_dai_etdm_set_fmt, 250662306a36Sopenharmony_ci}; 250762306a36Sopenharmony_ci 250862306a36Sopenharmony_cistatic const struct snd_soc_dai_ops mtk_dai_etdm_ops = { 250962306a36Sopenharmony_ci .probe = mtk_dai_etdm_probe, 251062306a36Sopenharmony_ci .startup = mtk_dai_etdm_startup, 251162306a36Sopenharmony_ci .shutdown = mtk_dai_etdm_shutdown, 251262306a36Sopenharmony_ci .hw_params = mtk_dai_etdm_hw_params, 251362306a36Sopenharmony_ci .trigger = mtk_dai_etdm_trigger, 251462306a36Sopenharmony_ci .set_sysclk = mtk_dai_etdm_set_sysclk, 251562306a36Sopenharmony_ci .set_fmt = mtk_dai_etdm_set_fmt, 251662306a36Sopenharmony_ci .set_tdm_slot = mtk_dai_etdm_set_tdm_slot, 251762306a36Sopenharmony_ci}; 251862306a36Sopenharmony_ci 251962306a36Sopenharmony_cistatic struct snd_soc_dai_driver mtk_dai_etdm_driver[] = { 252062306a36Sopenharmony_ci { 252162306a36Sopenharmony_ci .name = "DPTX", 252262306a36Sopenharmony_ci .id = MT8195_AFE_IO_DPTX, 252362306a36Sopenharmony_ci .playback = { 252462306a36Sopenharmony_ci .stream_name = "DPTX Playback", 252562306a36Sopenharmony_ci .channels_min = 1, 252662306a36Sopenharmony_ci .channels_max = 8, 252762306a36Sopenharmony_ci .rates = MTK_ETDM_RATES, 252862306a36Sopenharmony_ci .formats = MTK_ETDM_FORMATS, 252962306a36Sopenharmony_ci }, 253062306a36Sopenharmony_ci .ops = &mtk_dai_hdmitx_dptx_ops, 253162306a36Sopenharmony_ci }, 253262306a36Sopenharmony_ci { 253362306a36Sopenharmony_ci .name = "ETDM1_IN", 253462306a36Sopenharmony_ci .id = MT8195_AFE_IO_ETDM1_IN, 253562306a36Sopenharmony_ci .capture = { 253662306a36Sopenharmony_ci .stream_name = "ETDM1 Capture", 253762306a36Sopenharmony_ci .channels_min = 1, 253862306a36Sopenharmony_ci .channels_max = 24, 253962306a36Sopenharmony_ci .rates = MTK_ETDM_RATES, 254062306a36Sopenharmony_ci .formats = MTK_ETDM_FORMATS, 254162306a36Sopenharmony_ci }, 254262306a36Sopenharmony_ci .ops = &mtk_dai_etdm_ops, 254362306a36Sopenharmony_ci }, 254462306a36Sopenharmony_ci { 254562306a36Sopenharmony_ci .name = "ETDM2_IN", 254662306a36Sopenharmony_ci .id = MT8195_AFE_IO_ETDM2_IN, 254762306a36Sopenharmony_ci .capture = { 254862306a36Sopenharmony_ci .stream_name = "ETDM2 Capture", 254962306a36Sopenharmony_ci .channels_min = 1, 255062306a36Sopenharmony_ci .channels_max = 16, 255162306a36Sopenharmony_ci .rates = MTK_ETDM_RATES, 255262306a36Sopenharmony_ci .formats = MTK_ETDM_FORMATS, 255362306a36Sopenharmony_ci }, 255462306a36Sopenharmony_ci .ops = &mtk_dai_etdm_ops, 255562306a36Sopenharmony_ci }, 255662306a36Sopenharmony_ci { 255762306a36Sopenharmony_ci .name = "ETDM1_OUT", 255862306a36Sopenharmony_ci .id = MT8195_AFE_IO_ETDM1_OUT, 255962306a36Sopenharmony_ci .playback = { 256062306a36Sopenharmony_ci .stream_name = "ETDM1 Playback", 256162306a36Sopenharmony_ci .channels_min = 1, 256262306a36Sopenharmony_ci .channels_max = 24, 256362306a36Sopenharmony_ci .rates = MTK_ETDM_RATES, 256462306a36Sopenharmony_ci .formats = MTK_ETDM_FORMATS, 256562306a36Sopenharmony_ci }, 256662306a36Sopenharmony_ci .ops = &mtk_dai_etdm_ops, 256762306a36Sopenharmony_ci }, 256862306a36Sopenharmony_ci { 256962306a36Sopenharmony_ci .name = "ETDM2_OUT", 257062306a36Sopenharmony_ci .id = MT8195_AFE_IO_ETDM2_OUT, 257162306a36Sopenharmony_ci .playback = { 257262306a36Sopenharmony_ci .stream_name = "ETDM2 Playback", 257362306a36Sopenharmony_ci .channels_min = 1, 257462306a36Sopenharmony_ci .channels_max = 24, 257562306a36Sopenharmony_ci .rates = MTK_ETDM_RATES, 257662306a36Sopenharmony_ci .formats = MTK_ETDM_FORMATS, 257762306a36Sopenharmony_ci }, 257862306a36Sopenharmony_ci .ops = &mtk_dai_etdm_ops, 257962306a36Sopenharmony_ci }, 258062306a36Sopenharmony_ci { 258162306a36Sopenharmony_ci .name = "ETDM3_OUT", 258262306a36Sopenharmony_ci .id = MT8195_AFE_IO_ETDM3_OUT, 258362306a36Sopenharmony_ci .playback = { 258462306a36Sopenharmony_ci .stream_name = "ETDM3 Playback", 258562306a36Sopenharmony_ci .channels_min = 1, 258662306a36Sopenharmony_ci .channels_max = 8, 258762306a36Sopenharmony_ci .rates = MTK_ETDM_RATES, 258862306a36Sopenharmony_ci .formats = MTK_ETDM_FORMATS, 258962306a36Sopenharmony_ci }, 259062306a36Sopenharmony_ci .ops = &mtk_dai_hdmitx_dptx_ops2, 259162306a36Sopenharmony_ci }, 259262306a36Sopenharmony_ci}; 259362306a36Sopenharmony_ci 259462306a36Sopenharmony_cistatic void mt8195_etdm_update_sync_info(struct mtk_base_afe *afe) 259562306a36Sopenharmony_ci{ 259662306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 259762306a36Sopenharmony_ci struct mtk_dai_etdm_priv *etdm_data; 259862306a36Sopenharmony_ci struct mtk_dai_etdm_priv *mst_data; 259962306a36Sopenharmony_ci int i; 260062306a36Sopenharmony_ci int mst_dai_id; 260162306a36Sopenharmony_ci 260262306a36Sopenharmony_ci for (i = MT8195_AFE_IO_ETDM_START; i < MT8195_AFE_IO_ETDM_END; i++) { 260362306a36Sopenharmony_ci etdm_data = afe_priv->dai_priv[i]; 260462306a36Sopenharmony_ci if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) { 260562306a36Sopenharmony_ci mst_dai_id = etdm_data->cowork_source_id; 260662306a36Sopenharmony_ci if (!mt8195_afe_etdm_is_valid(mst_dai_id)) { 260762306a36Sopenharmony_ci dev_err(afe->dev, "%s invalid dai id %d\n", 260862306a36Sopenharmony_ci __func__, mst_dai_id); 260962306a36Sopenharmony_ci return; 261062306a36Sopenharmony_ci } 261162306a36Sopenharmony_ci mst_data = afe_priv->dai_priv[mst_dai_id]; 261262306a36Sopenharmony_ci if (mst_data->cowork_source_id != COWORK_ETDM_NONE) 261362306a36Sopenharmony_ci dev_info(afe->dev, "%s [%d] wrong sync source\n" 261462306a36Sopenharmony_ci , __func__, i); 261562306a36Sopenharmony_ci mst_data->cowork_slv_id[mst_data->cowork_slv_count] = i; 261662306a36Sopenharmony_ci mst_data->cowork_slv_count++; 261762306a36Sopenharmony_ci } 261862306a36Sopenharmony_ci } 261962306a36Sopenharmony_ci} 262062306a36Sopenharmony_ci 262162306a36Sopenharmony_cistatic void mt8195_dai_etdm_parse_of(struct mtk_base_afe *afe) 262262306a36Sopenharmony_ci{ 262362306a36Sopenharmony_ci const struct device_node *of_node = afe->dev->of_node; 262462306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 262562306a36Sopenharmony_ci struct mtk_dai_etdm_priv *etdm_data; 262662306a36Sopenharmony_ci int i, j; 262762306a36Sopenharmony_ci char prop[48]; 262862306a36Sopenharmony_ci u8 disable_chn[MT8195_ETDM_MAX_CHANNELS]; 262962306a36Sopenharmony_ci int max_chn = MT8195_ETDM_MAX_CHANNELS; 263062306a36Sopenharmony_ci u32 sel; 263162306a36Sopenharmony_ci int ret; 263262306a36Sopenharmony_ci int dai_id; 263362306a36Sopenharmony_ci unsigned int sync_id; 263462306a36Sopenharmony_ci struct { 263562306a36Sopenharmony_ci const char *name; 263662306a36Sopenharmony_ci const unsigned int sync_id; 263762306a36Sopenharmony_ci } of_afe_etdms[MT8195_AFE_IO_ETDM_NUM] = { 263862306a36Sopenharmony_ci {"etdm-in1", ETDM_SYNC_FROM_IN1}, 263962306a36Sopenharmony_ci {"etdm-in2", ETDM_SYNC_FROM_IN2}, 264062306a36Sopenharmony_ci {"etdm-out1", ETDM_SYNC_FROM_OUT1}, 264162306a36Sopenharmony_ci {"etdm-out2", ETDM_SYNC_FROM_OUT2}, 264262306a36Sopenharmony_ci {"etdm-out3", ETDM_SYNC_FROM_OUT3}, 264362306a36Sopenharmony_ci }; 264462306a36Sopenharmony_ci 264562306a36Sopenharmony_ci for (i = 0; i < MT8195_AFE_IO_ETDM_NUM; i++) { 264662306a36Sopenharmony_ci dai_id = ETDM_TO_DAI_ID(i); 264762306a36Sopenharmony_ci if (!mt8195_afe_etdm_is_valid(dai_id)) { 264862306a36Sopenharmony_ci dev_err(afe->dev, "%s invalid dai id %d\n", 264962306a36Sopenharmony_ci __func__, dai_id); 265062306a36Sopenharmony_ci return; 265162306a36Sopenharmony_ci } 265262306a36Sopenharmony_ci 265362306a36Sopenharmony_ci etdm_data = afe_priv->dai_priv[dai_id]; 265462306a36Sopenharmony_ci 265562306a36Sopenharmony_ci ret = snprintf(prop, sizeof(prop), 265662306a36Sopenharmony_ci "mediatek,%s-mclk-always-on-rate", 265762306a36Sopenharmony_ci of_afe_etdms[i].name); 265862306a36Sopenharmony_ci if (ret < 0) { 265962306a36Sopenharmony_ci dev_info(afe->dev, "%s snprintf err=%d\n", 266062306a36Sopenharmony_ci __func__, ret); 266162306a36Sopenharmony_ci return; 266262306a36Sopenharmony_ci } 266362306a36Sopenharmony_ci ret = of_property_read_u32(of_node, prop, &sel); 266462306a36Sopenharmony_ci if (ret == 0) { 266562306a36Sopenharmony_ci etdm_data->mclk_dir = SND_SOC_CLOCK_OUT; 266662306a36Sopenharmony_ci if (mtk_dai_etdm_cal_mclk(afe, sel, dai_id)) 266762306a36Sopenharmony_ci dev_info(afe->dev, "%s unsupported mclk %uHz\n", 266862306a36Sopenharmony_ci __func__, sel); 266962306a36Sopenharmony_ci } 267062306a36Sopenharmony_ci 267162306a36Sopenharmony_ci ret = snprintf(prop, sizeof(prop), 267262306a36Sopenharmony_ci "mediatek,%s-multi-pin-mode", 267362306a36Sopenharmony_ci of_afe_etdms[i].name); 267462306a36Sopenharmony_ci if (ret < 0) { 267562306a36Sopenharmony_ci dev_info(afe->dev, "%s snprintf err=%d\n", 267662306a36Sopenharmony_ci __func__, ret); 267762306a36Sopenharmony_ci return; 267862306a36Sopenharmony_ci } 267962306a36Sopenharmony_ci etdm_data->data_mode = of_property_read_bool(of_node, prop); 268062306a36Sopenharmony_ci 268162306a36Sopenharmony_ci ret = snprintf(prop, sizeof(prop), 268262306a36Sopenharmony_ci "mediatek,%s-cowork-source", 268362306a36Sopenharmony_ci of_afe_etdms[i].name); 268462306a36Sopenharmony_ci if (ret < 0) { 268562306a36Sopenharmony_ci dev_info(afe->dev, "%s snprintf err=%d\n", 268662306a36Sopenharmony_ci __func__, ret); 268762306a36Sopenharmony_ci return; 268862306a36Sopenharmony_ci } 268962306a36Sopenharmony_ci ret = of_property_read_u32(of_node, prop, &sel); 269062306a36Sopenharmony_ci if (ret == 0) { 269162306a36Sopenharmony_ci if (sel >= MT8195_AFE_IO_ETDM_NUM) { 269262306a36Sopenharmony_ci dev_info(afe->dev, "%s invalid id=%d\n", 269362306a36Sopenharmony_ci __func__, sel); 269462306a36Sopenharmony_ci etdm_data->cowork_source_id = COWORK_ETDM_NONE; 269562306a36Sopenharmony_ci } else { 269662306a36Sopenharmony_ci sync_id = of_afe_etdms[sel].sync_id; 269762306a36Sopenharmony_ci etdm_data->cowork_source_id = 269862306a36Sopenharmony_ci sync_to_dai_id(sync_id); 269962306a36Sopenharmony_ci } 270062306a36Sopenharmony_ci } else { 270162306a36Sopenharmony_ci etdm_data->cowork_source_id = COWORK_ETDM_NONE; 270262306a36Sopenharmony_ci } 270362306a36Sopenharmony_ci } 270462306a36Sopenharmony_ci 270562306a36Sopenharmony_ci /* etdm in only */ 270662306a36Sopenharmony_ci for (i = 0; i < 2; i++) { 270762306a36Sopenharmony_ci dai_id = ETDM_TO_DAI_ID(i); 270862306a36Sopenharmony_ci etdm_data = afe_priv->dai_priv[dai_id]; 270962306a36Sopenharmony_ci 271062306a36Sopenharmony_ci ret = snprintf(prop, sizeof(prop), 271162306a36Sopenharmony_ci "mediatek,%s-chn-disabled", 271262306a36Sopenharmony_ci of_afe_etdms[i].name); 271362306a36Sopenharmony_ci if (ret < 0) { 271462306a36Sopenharmony_ci dev_info(afe->dev, "%s snprintf err=%d\n", 271562306a36Sopenharmony_ci __func__, ret); 271662306a36Sopenharmony_ci return; 271762306a36Sopenharmony_ci } 271862306a36Sopenharmony_ci ret = of_property_read_variable_u8_array(of_node, prop, 271962306a36Sopenharmony_ci disable_chn, 272062306a36Sopenharmony_ci 1, max_chn); 272162306a36Sopenharmony_ci if (ret < 0) 272262306a36Sopenharmony_ci continue; 272362306a36Sopenharmony_ci 272462306a36Sopenharmony_ci for (j = 0; j < ret; j++) { 272562306a36Sopenharmony_ci if (disable_chn[j] >= MT8195_ETDM_MAX_CHANNELS) 272662306a36Sopenharmony_ci dev_info(afe->dev, "%s [%d] invalid chn %u\n", 272762306a36Sopenharmony_ci __func__, j, disable_chn[j]); 272862306a36Sopenharmony_ci else 272962306a36Sopenharmony_ci etdm_data->in_disable_ch[disable_chn[j]] = true; 273062306a36Sopenharmony_ci } 273162306a36Sopenharmony_ci } 273262306a36Sopenharmony_ci mt8195_etdm_update_sync_info(afe); 273362306a36Sopenharmony_ci} 273462306a36Sopenharmony_ci 273562306a36Sopenharmony_cistatic int init_etdm_priv_data(struct mtk_base_afe *afe) 273662306a36Sopenharmony_ci{ 273762306a36Sopenharmony_ci struct mt8195_afe_private *afe_priv = afe->platform_priv; 273862306a36Sopenharmony_ci struct mtk_dai_etdm_priv *etdm_priv; 273962306a36Sopenharmony_ci int i; 274062306a36Sopenharmony_ci 274162306a36Sopenharmony_ci for (i = MT8195_AFE_IO_ETDM_START; i < MT8195_AFE_IO_ETDM_END; i++) { 274262306a36Sopenharmony_ci etdm_priv = devm_kzalloc(afe->dev, 274362306a36Sopenharmony_ci sizeof(struct mtk_dai_etdm_priv), 274462306a36Sopenharmony_ci GFP_KERNEL); 274562306a36Sopenharmony_ci if (!etdm_priv) 274662306a36Sopenharmony_ci return -ENOMEM; 274762306a36Sopenharmony_ci 274862306a36Sopenharmony_ci afe_priv->dai_priv[i] = etdm_priv; 274962306a36Sopenharmony_ci } 275062306a36Sopenharmony_ci 275162306a36Sopenharmony_ci afe_priv->dai_priv[MT8195_AFE_IO_DPTX] = 275262306a36Sopenharmony_ci afe_priv->dai_priv[MT8195_AFE_IO_ETDM3_OUT]; 275362306a36Sopenharmony_ci 275462306a36Sopenharmony_ci mt8195_dai_etdm_parse_of(afe); 275562306a36Sopenharmony_ci return 0; 275662306a36Sopenharmony_ci} 275762306a36Sopenharmony_ci 275862306a36Sopenharmony_ciint mt8195_dai_etdm_register(struct mtk_base_afe *afe) 275962306a36Sopenharmony_ci{ 276062306a36Sopenharmony_ci struct mtk_base_afe_dai *dai; 276162306a36Sopenharmony_ci 276262306a36Sopenharmony_ci dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL); 276362306a36Sopenharmony_ci if (!dai) 276462306a36Sopenharmony_ci return -ENOMEM; 276562306a36Sopenharmony_ci 276662306a36Sopenharmony_ci list_add(&dai->list, &afe->sub_dais); 276762306a36Sopenharmony_ci 276862306a36Sopenharmony_ci dai->dai_drivers = mtk_dai_etdm_driver; 276962306a36Sopenharmony_ci dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_etdm_driver); 277062306a36Sopenharmony_ci 277162306a36Sopenharmony_ci dai->dapm_widgets = mtk_dai_etdm_widgets; 277262306a36Sopenharmony_ci dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_etdm_widgets); 277362306a36Sopenharmony_ci dai->dapm_routes = mtk_dai_etdm_routes; 277462306a36Sopenharmony_ci dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_etdm_routes); 277562306a36Sopenharmony_ci dai->controls = mtk_dai_etdm_controls; 277662306a36Sopenharmony_ci dai->num_controls = ARRAY_SIZE(mtk_dai_etdm_controls); 277762306a36Sopenharmony_ci 277862306a36Sopenharmony_ci return init_etdm_priv_data(afe); 277962306a36Sopenharmony_ci} 2780