11de9a54aSTrevor Wu // SPDX-License-Identifier: GPL-2.0 21de9a54aSTrevor Wu /* 31de9a54aSTrevor Wu * MediaTek ALSA SoC Audio DAI eTDM Control 41de9a54aSTrevor Wu * 51de9a54aSTrevor Wu * Copyright (c) 2021 MediaTek Inc. 61de9a54aSTrevor Wu * Author: Bicycle Tsai <bicycle.tsai@mediatek.com> 71de9a54aSTrevor Wu * Trevor Wu <trevor.wu@mediatek.com> 81de9a54aSTrevor Wu */ 91de9a54aSTrevor Wu 101de9a54aSTrevor Wu #include <linux/delay.h> 111de9a54aSTrevor Wu #include <linux/pm_runtime.h> 121de9a54aSTrevor Wu #include <linux/regmap.h> 131de9a54aSTrevor Wu #include <sound/pcm_params.h> 141de9a54aSTrevor Wu #include "mt8195-afe-clk.h" 151de9a54aSTrevor Wu #include "mt8195-afe-common.h" 161de9a54aSTrevor Wu #include "mt8195-reg.h" 171de9a54aSTrevor Wu 181de9a54aSTrevor Wu #define MT8195_ETDM_MAX_CHANNELS 24 191de9a54aSTrevor Wu #define MT8195_ETDM_NORMAL_MAX_BCK_RATE 24576000 201de9a54aSTrevor Wu #define ETDM_TO_DAI_ID(x) ((x) + MT8195_AFE_IO_ETDM_START) 211de9a54aSTrevor Wu #define ENUM_TO_STR(x) #x 221de9a54aSTrevor Wu 231de9a54aSTrevor Wu enum { 241de9a54aSTrevor Wu MTK_DAI_ETDM_FORMAT_I2S = 0, 251de9a54aSTrevor Wu MTK_DAI_ETDM_FORMAT_LJ, 261de9a54aSTrevor Wu MTK_DAI_ETDM_FORMAT_RJ, 271de9a54aSTrevor Wu MTK_DAI_ETDM_FORMAT_EIAJ, 281de9a54aSTrevor Wu MTK_DAI_ETDM_FORMAT_DSPA, 291de9a54aSTrevor Wu MTK_DAI_ETDM_FORMAT_DSPB, 301de9a54aSTrevor Wu }; 311de9a54aSTrevor Wu 321de9a54aSTrevor Wu enum { 331de9a54aSTrevor Wu MTK_DAI_ETDM_DATA_ONE_PIN = 0, 341de9a54aSTrevor Wu MTK_DAI_ETDM_DATA_MULTI_PIN, 351de9a54aSTrevor Wu }; 361de9a54aSTrevor Wu 371de9a54aSTrevor Wu enum { 381de9a54aSTrevor Wu ETDM_IN, 391de9a54aSTrevor Wu ETDM_OUT, 401de9a54aSTrevor Wu }; 411de9a54aSTrevor Wu 421de9a54aSTrevor Wu enum { 431de9a54aSTrevor Wu ETDM_IN_FROM_PAD, 441de9a54aSTrevor Wu ETDM_IN_FROM_ETDM_OUT1, 451de9a54aSTrevor Wu ETDM_IN_FROM_ETDM_OUT2, 461de9a54aSTrevor Wu }; 471de9a54aSTrevor Wu 481de9a54aSTrevor Wu enum { 491de9a54aSTrevor Wu ETDM_IN_SLAVE_FROM_PAD, 501de9a54aSTrevor Wu ETDM_IN_SLAVE_FROM_ETDM_OUT1, 511de9a54aSTrevor Wu ETDM_IN_SLAVE_FROM_ETDM_OUT2, 521de9a54aSTrevor Wu }; 531de9a54aSTrevor Wu 541de9a54aSTrevor Wu enum { 551de9a54aSTrevor Wu ETDM_OUT_SLAVE_FROM_PAD, 561de9a54aSTrevor Wu ETDM_OUT_SLAVE_FROM_ETDM_IN1, 571de9a54aSTrevor Wu ETDM_OUT_SLAVE_FROM_ETDM_IN2, 581de9a54aSTrevor Wu }; 591de9a54aSTrevor Wu 601de9a54aSTrevor Wu enum { 611de9a54aSTrevor Wu COWORK_ETDM_NONE = 0, 621de9a54aSTrevor Wu COWORK_ETDM_IN1_M = 2, 631de9a54aSTrevor Wu COWORK_ETDM_IN1_S = 3, 641de9a54aSTrevor Wu COWORK_ETDM_IN2_M = 4, 651de9a54aSTrevor Wu COWORK_ETDM_IN2_S = 5, 661de9a54aSTrevor Wu COWORK_ETDM_OUT1_M = 10, 671de9a54aSTrevor Wu COWORK_ETDM_OUT1_S = 11, 681de9a54aSTrevor Wu COWORK_ETDM_OUT2_M = 12, 691de9a54aSTrevor Wu COWORK_ETDM_OUT2_S = 13, 701de9a54aSTrevor Wu COWORK_ETDM_OUT3_M = 14, 711de9a54aSTrevor Wu COWORK_ETDM_OUT3_S = 15, 721de9a54aSTrevor Wu }; 731de9a54aSTrevor Wu 741de9a54aSTrevor Wu enum { 751de9a54aSTrevor Wu ETDM_RELATCH_TIMING_A1A2SYS, 761de9a54aSTrevor Wu ETDM_RELATCH_TIMING_A3SYS, 771de9a54aSTrevor Wu ETDM_RELATCH_TIMING_A4SYS, 781de9a54aSTrevor Wu }; 791de9a54aSTrevor Wu 801de9a54aSTrevor Wu enum { 811de9a54aSTrevor Wu ETDM_SYNC_NONE, 821de9a54aSTrevor Wu ETDM_SYNC_FROM_IN1, 831de9a54aSTrevor Wu ETDM_SYNC_FROM_IN2, 841de9a54aSTrevor Wu ETDM_SYNC_FROM_OUT1, 851de9a54aSTrevor Wu ETDM_SYNC_FROM_OUT2, 861de9a54aSTrevor Wu ETDM_SYNC_FROM_OUT3, 871de9a54aSTrevor Wu }; 881de9a54aSTrevor Wu 891de9a54aSTrevor Wu struct etdm_con_reg { 901de9a54aSTrevor Wu unsigned int con0; 911de9a54aSTrevor Wu unsigned int con1; 921de9a54aSTrevor Wu unsigned int con2; 931de9a54aSTrevor Wu unsigned int con3; 941de9a54aSTrevor Wu unsigned int con4; 951de9a54aSTrevor Wu unsigned int con5; 961de9a54aSTrevor Wu }; 971de9a54aSTrevor Wu 981de9a54aSTrevor Wu struct mtk_dai_etdm_rate { 991de9a54aSTrevor Wu unsigned int rate; 1001de9a54aSTrevor Wu unsigned int reg_value; 1011de9a54aSTrevor Wu }; 1021de9a54aSTrevor Wu 1031de9a54aSTrevor Wu struct mtk_dai_etdm_priv { 1041de9a54aSTrevor Wu unsigned int clock_mode; 1051de9a54aSTrevor Wu unsigned int data_mode; 1061de9a54aSTrevor Wu bool slave_mode; 1071de9a54aSTrevor Wu bool lrck_inv; 1081de9a54aSTrevor Wu bool bck_inv; 1091de9a54aSTrevor Wu unsigned int format; 1101de9a54aSTrevor Wu unsigned int slots; 1111de9a54aSTrevor Wu unsigned int lrck_width; 1121de9a54aSTrevor Wu unsigned int mclk_freq; 1131de9a54aSTrevor Wu unsigned int mclk_apll; 1141de9a54aSTrevor Wu unsigned int mclk_dir; 1151de9a54aSTrevor Wu int cowork_source_id; //dai id 1161de9a54aSTrevor Wu unsigned int cowork_slv_count; 1171de9a54aSTrevor Wu int cowork_slv_id[MT8195_AFE_IO_ETDM_NUM - 1]; //dai_id 1181de9a54aSTrevor Wu bool in_disable_ch[MT8195_ETDM_MAX_CHANNELS]; 1191de9a54aSTrevor Wu unsigned int en_ref_cnt; 1201de9a54aSTrevor Wu }; 1211de9a54aSTrevor Wu 1221de9a54aSTrevor Wu static const struct mtk_dai_etdm_rate mt8195_etdm_rates[] = { 1231de9a54aSTrevor Wu { .rate = 8000, .reg_value = 0, }, 1241de9a54aSTrevor Wu { .rate = 12000, .reg_value = 1, }, 1251de9a54aSTrevor Wu { .rate = 16000, .reg_value = 2, }, 1261de9a54aSTrevor Wu { .rate = 24000, .reg_value = 3, }, 1271de9a54aSTrevor Wu { .rate = 32000, .reg_value = 4, }, 1281de9a54aSTrevor Wu { .rate = 48000, .reg_value = 5, }, 1291de9a54aSTrevor Wu { .rate = 96000, .reg_value = 7, }, 1301de9a54aSTrevor Wu { .rate = 192000, .reg_value = 9, }, 1311de9a54aSTrevor Wu { .rate = 384000, .reg_value = 11, }, 1321de9a54aSTrevor Wu { .rate = 11025, .reg_value = 16, }, 1331de9a54aSTrevor Wu { .rate = 22050, .reg_value = 17, }, 1341de9a54aSTrevor Wu { .rate = 44100, .reg_value = 18, }, 1351de9a54aSTrevor Wu { .rate = 88200, .reg_value = 19, }, 1361de9a54aSTrevor Wu { .rate = 176400, .reg_value = 20, }, 1371de9a54aSTrevor Wu { .rate = 352800, .reg_value = 21, }, 1381de9a54aSTrevor Wu }; 1391de9a54aSTrevor Wu 140ff728899STrevor Wu static bool mt8195_afe_etdm_is_valid(int id) 141ff728899STrevor Wu { 142ff728899STrevor Wu switch (id) { 143ff728899STrevor Wu case MT8195_AFE_IO_ETDM1_IN: 144ff728899STrevor Wu fallthrough; 145ff728899STrevor Wu case MT8195_AFE_IO_ETDM2_IN: 146ff728899STrevor Wu fallthrough; 147ff728899STrevor Wu case MT8195_AFE_IO_ETDM1_OUT: 148ff728899STrevor Wu fallthrough; 149ff728899STrevor Wu case MT8195_AFE_IO_ETDM2_OUT: 150ff728899STrevor Wu fallthrough; 151ff728899STrevor Wu case MT8195_AFE_IO_DPTX: 152ff728899STrevor Wu fallthrough; 153ff728899STrevor Wu case MT8195_AFE_IO_ETDM3_OUT: 154ff728899STrevor Wu return true; 155ff728899STrevor Wu default: 156ff728899STrevor Wu return false; 157ff728899STrevor Wu } 158ff728899STrevor Wu } 159ff728899STrevor Wu 160ff728899STrevor Wu static bool mt8195_afe_hdmitx_dptx_is_valid(int id) 161ff728899STrevor Wu { 162ff728899STrevor Wu switch (id) { 163ff728899STrevor Wu case MT8195_AFE_IO_DPTX: 164ff728899STrevor Wu fallthrough; 165ff728899STrevor Wu case MT8195_AFE_IO_ETDM3_OUT: 166ff728899STrevor Wu return true; 167ff728899STrevor Wu default: 168ff728899STrevor Wu return false; 169ff728899STrevor Wu } 170ff728899STrevor Wu } 171ff728899STrevor Wu 1721de9a54aSTrevor Wu static int get_etdm_fs_timing(unsigned int rate) 1731de9a54aSTrevor Wu { 1741de9a54aSTrevor Wu int i; 1751de9a54aSTrevor Wu 1761de9a54aSTrevor Wu for (i = 0; i < ARRAY_SIZE(mt8195_etdm_rates); i++) 1771de9a54aSTrevor Wu if (mt8195_etdm_rates[i].rate == rate) 1781de9a54aSTrevor Wu return mt8195_etdm_rates[i].reg_value; 1791de9a54aSTrevor Wu 1801de9a54aSTrevor Wu return -EINVAL; 1811de9a54aSTrevor Wu } 1821de9a54aSTrevor Wu 1831de9a54aSTrevor Wu static unsigned int get_etdm_ch_fixup(unsigned int channels) 1841de9a54aSTrevor Wu { 1851de9a54aSTrevor Wu if (channels > 16) 1861de9a54aSTrevor Wu return 24; 1871de9a54aSTrevor Wu else if (channels > 8) 1881de9a54aSTrevor Wu return 16; 1891de9a54aSTrevor Wu else if (channels > 4) 1901de9a54aSTrevor Wu return 8; 1911de9a54aSTrevor Wu else if (channels > 2) 1921de9a54aSTrevor Wu return 4; 1931de9a54aSTrevor Wu else 1941de9a54aSTrevor Wu return 2; 1951de9a54aSTrevor Wu } 1961de9a54aSTrevor Wu 1971de9a54aSTrevor Wu static int get_etdm_reg(unsigned int dai_id, struct etdm_con_reg *etdm_reg) 1981de9a54aSTrevor Wu { 1991de9a54aSTrevor Wu switch (dai_id) { 2001de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM1_IN: 2011de9a54aSTrevor Wu etdm_reg->con0 = ETDM_IN1_CON0; 2021de9a54aSTrevor Wu etdm_reg->con1 = ETDM_IN1_CON1; 2031de9a54aSTrevor Wu etdm_reg->con2 = ETDM_IN1_CON2; 2041de9a54aSTrevor Wu etdm_reg->con3 = ETDM_IN1_CON3; 2051de9a54aSTrevor Wu etdm_reg->con4 = ETDM_IN1_CON4; 2061de9a54aSTrevor Wu etdm_reg->con5 = ETDM_IN1_CON5; 2071de9a54aSTrevor Wu break; 2081de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM2_IN: 2091de9a54aSTrevor Wu etdm_reg->con0 = ETDM_IN2_CON0; 2101de9a54aSTrevor Wu etdm_reg->con1 = ETDM_IN2_CON1; 2111de9a54aSTrevor Wu etdm_reg->con2 = ETDM_IN2_CON2; 2121de9a54aSTrevor Wu etdm_reg->con3 = ETDM_IN2_CON3; 2131de9a54aSTrevor Wu etdm_reg->con4 = ETDM_IN2_CON4; 2141de9a54aSTrevor Wu etdm_reg->con5 = ETDM_IN2_CON5; 2151de9a54aSTrevor Wu break; 2161de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM1_OUT: 2171de9a54aSTrevor Wu etdm_reg->con0 = ETDM_OUT1_CON0; 2181de9a54aSTrevor Wu etdm_reg->con1 = ETDM_OUT1_CON1; 2191de9a54aSTrevor Wu etdm_reg->con2 = ETDM_OUT1_CON2; 2201de9a54aSTrevor Wu etdm_reg->con3 = ETDM_OUT1_CON3; 2211de9a54aSTrevor Wu etdm_reg->con4 = ETDM_OUT1_CON4; 2221de9a54aSTrevor Wu etdm_reg->con5 = ETDM_OUT1_CON5; 2231de9a54aSTrevor Wu break; 2241de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM2_OUT: 2251de9a54aSTrevor Wu etdm_reg->con0 = ETDM_OUT2_CON0; 2261de9a54aSTrevor Wu etdm_reg->con1 = ETDM_OUT2_CON1; 2271de9a54aSTrevor Wu etdm_reg->con2 = ETDM_OUT2_CON2; 2281de9a54aSTrevor Wu etdm_reg->con3 = ETDM_OUT2_CON3; 2291de9a54aSTrevor Wu etdm_reg->con4 = ETDM_OUT2_CON4; 2301de9a54aSTrevor Wu etdm_reg->con5 = ETDM_OUT2_CON5; 2311de9a54aSTrevor Wu break; 2321de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM3_OUT: 2331de9a54aSTrevor Wu case MT8195_AFE_IO_DPTX: 2341de9a54aSTrevor Wu etdm_reg->con0 = ETDM_OUT3_CON0; 2351de9a54aSTrevor Wu etdm_reg->con1 = ETDM_OUT3_CON1; 2361de9a54aSTrevor Wu etdm_reg->con2 = ETDM_OUT3_CON2; 2371de9a54aSTrevor Wu etdm_reg->con3 = ETDM_OUT3_CON3; 2381de9a54aSTrevor Wu etdm_reg->con4 = ETDM_OUT3_CON4; 2391de9a54aSTrevor Wu etdm_reg->con5 = ETDM_OUT3_CON5; 2401de9a54aSTrevor Wu break; 2411de9a54aSTrevor Wu default: 2421de9a54aSTrevor Wu return -EINVAL; 2431de9a54aSTrevor Wu } 2441de9a54aSTrevor Wu return 0; 2451de9a54aSTrevor Wu } 2461de9a54aSTrevor Wu 2471de9a54aSTrevor Wu static int get_etdm_dir(unsigned int dai_id) 2481de9a54aSTrevor Wu { 2491de9a54aSTrevor Wu switch (dai_id) { 2501de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM1_IN: 2511de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM2_IN: 2521de9a54aSTrevor Wu return ETDM_IN; 2531de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM1_OUT: 2541de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM2_OUT: 2551de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM3_OUT: 2561de9a54aSTrevor Wu return ETDM_OUT; 2571de9a54aSTrevor Wu default: 2581de9a54aSTrevor Wu return -EINVAL; 2591de9a54aSTrevor Wu } 2601de9a54aSTrevor Wu } 2611de9a54aSTrevor Wu 2621de9a54aSTrevor Wu static int get_etdm_wlen(unsigned int bitwidth) 2631de9a54aSTrevor Wu { 2641de9a54aSTrevor Wu return bitwidth <= 16 ? 16 : 32; 2651de9a54aSTrevor Wu } 2661de9a54aSTrevor Wu 2671de9a54aSTrevor Wu static int is_cowork_mode(struct snd_soc_dai *dai) 2681de9a54aSTrevor Wu { 2691de9a54aSTrevor Wu struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 2701de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 271ff728899STrevor Wu struct mtk_dai_etdm_priv *etdm_data; 2721de9a54aSTrevor Wu 273ff728899STrevor Wu if (!mt8195_afe_etdm_is_valid(dai->id)) 274ff728899STrevor Wu return -EINVAL; 275ff728899STrevor Wu 276ff728899STrevor Wu etdm_data = afe_priv->dai_priv[dai->id]; 2771de9a54aSTrevor Wu return (etdm_data->cowork_slv_count > 0 || 2781de9a54aSTrevor Wu etdm_data->cowork_source_id != COWORK_ETDM_NONE); 2791de9a54aSTrevor Wu } 2801de9a54aSTrevor Wu 2811de9a54aSTrevor Wu static int sync_to_dai_id(int source_sel) 2821de9a54aSTrevor Wu { 2831de9a54aSTrevor Wu switch (source_sel) { 2841de9a54aSTrevor Wu case ETDM_SYNC_FROM_IN1: 2851de9a54aSTrevor Wu return MT8195_AFE_IO_ETDM1_IN; 2861de9a54aSTrevor Wu case ETDM_SYNC_FROM_IN2: 2871de9a54aSTrevor Wu return MT8195_AFE_IO_ETDM2_IN; 2881de9a54aSTrevor Wu case ETDM_SYNC_FROM_OUT1: 2891de9a54aSTrevor Wu return MT8195_AFE_IO_ETDM1_OUT; 2901de9a54aSTrevor Wu case ETDM_SYNC_FROM_OUT2: 2911de9a54aSTrevor Wu return MT8195_AFE_IO_ETDM2_OUT; 2921de9a54aSTrevor Wu case ETDM_SYNC_FROM_OUT3: 2931de9a54aSTrevor Wu return MT8195_AFE_IO_ETDM3_OUT; 2941de9a54aSTrevor Wu default: 2951de9a54aSTrevor Wu return 0; 2961de9a54aSTrevor Wu } 2971de9a54aSTrevor Wu } 2981de9a54aSTrevor Wu 2991de9a54aSTrevor Wu static int get_etdm_cowork_master_id(struct snd_soc_dai *dai) 3001de9a54aSTrevor Wu { 3011de9a54aSTrevor Wu struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 3021de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 303ff728899STrevor Wu struct mtk_dai_etdm_priv *etdm_data; 304ff728899STrevor Wu int dai_id; 305ff728899STrevor Wu 306ff728899STrevor Wu if (!mt8195_afe_etdm_is_valid(dai->id)) 307ff728899STrevor Wu return -EINVAL; 308ff728899STrevor Wu 309ff728899STrevor Wu etdm_data = afe_priv->dai_priv[dai->id]; 310ff728899STrevor Wu dai_id = etdm_data->cowork_source_id; 3111de9a54aSTrevor Wu 3121de9a54aSTrevor Wu if (dai_id == COWORK_ETDM_NONE) 3131de9a54aSTrevor Wu dai_id = dai->id; 3141de9a54aSTrevor Wu 3151de9a54aSTrevor Wu return dai_id; 3161de9a54aSTrevor Wu } 3171de9a54aSTrevor Wu 3181de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o048_mix[] = { 3191de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN48, 20, 1, 0), 3201de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN48, 22, 1, 0), 3211de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN48_1, 14, 1, 0), 3221de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN48_2, 6, 1, 0), 3231de9a54aSTrevor Wu }; 3241de9a54aSTrevor Wu 3251de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o049_mix[] = { 3261de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN49, 21, 1, 0), 3271de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN49, 23, 1, 0), 3281de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN49_1, 15, 1, 0), 3291de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN49_2, 7, 1, 0), 3301de9a54aSTrevor Wu }; 3311de9a54aSTrevor Wu 3321de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o050_mix[] = { 3331de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN50, 24, 1, 0), 3341de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN50_1, 16, 1, 0), 3351de9a54aSTrevor Wu }; 3361de9a54aSTrevor Wu 3371de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o051_mix[] = { 3381de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN51, 25, 1, 0), 3391de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN51_1, 17, 1, 0), 3401de9a54aSTrevor Wu }; 3411de9a54aSTrevor Wu 3421de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o052_mix[] = { 3431de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN52, 26, 1, 0), 3441de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN52_1, 18, 1, 0), 3451de9a54aSTrevor Wu }; 3461de9a54aSTrevor Wu 3471de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o053_mix[] = { 3481de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN53, 27, 1, 0), 3491de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN53_1, 19, 1, 0), 3501de9a54aSTrevor Wu }; 3511de9a54aSTrevor Wu 3521de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o054_mix[] = { 3531de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN54, 28, 1, 0), 3541de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN54_1, 20, 1, 0), 3551de9a54aSTrevor Wu }; 3561de9a54aSTrevor Wu 3571de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o055_mix[] = { 3581de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN55, 29, 1, 0), 3591de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN55_1, 21, 1, 0), 3601de9a54aSTrevor Wu }; 3611de9a54aSTrevor Wu 3621de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o056_mix[] = { 3631de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I030 Switch", AFE_CONN56, 30, 1, 0), 3641de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I054 Switch", AFE_CONN56_1, 22, 1, 0), 3651de9a54aSTrevor Wu }; 3661de9a54aSTrevor Wu 3671de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o057_mix[] = { 3681de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I031 Switch", AFE_CONN57, 31, 1, 0), 3691de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I055 Switch", AFE_CONN57_1, 23, 1, 0), 3701de9a54aSTrevor Wu }; 3711de9a54aSTrevor Wu 3721de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o058_mix[] = { 3731de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I032 Switch", AFE_CONN58_1, 0, 1, 0), 3741de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I056 Switch", AFE_CONN58_1, 24, 1, 0), 3751de9a54aSTrevor Wu }; 3761de9a54aSTrevor Wu 3771de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o059_mix[] = { 3781de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I033 Switch", AFE_CONN59_1, 1, 1, 0), 3791de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I057 Switch", AFE_CONN59_1, 25, 1, 0), 3801de9a54aSTrevor Wu }; 3811de9a54aSTrevor Wu 3821de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o060_mix[] = { 3831de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I034 Switch", AFE_CONN60_1, 2, 1, 0), 3841de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I058 Switch", AFE_CONN60_1, 26, 1, 0), 3851de9a54aSTrevor Wu }; 3861de9a54aSTrevor Wu 3871de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o061_mix[] = { 3881de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I035 Switch", AFE_CONN61_1, 3, 1, 0), 3891de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I059 Switch", AFE_CONN61_1, 27, 1, 0), 3901de9a54aSTrevor Wu }; 3911de9a54aSTrevor Wu 3921de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o062_mix[] = { 3931de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I036 Switch", AFE_CONN62_1, 4, 1, 0), 3941de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I060 Switch", AFE_CONN62_1, 28, 1, 0), 3951de9a54aSTrevor Wu }; 3961de9a54aSTrevor Wu 3971de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o063_mix[] = { 3981de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I037 Switch", AFE_CONN63_1, 5, 1, 0), 3991de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I061 Switch", AFE_CONN63_1, 29, 1, 0), 4001de9a54aSTrevor Wu }; 4011de9a54aSTrevor Wu 4021de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o064_mix[] = { 4031de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I038 Switch", AFE_CONN64_1, 6, 1, 0), 4041de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I062 Switch", AFE_CONN64_1, 30, 1, 0), 4051de9a54aSTrevor Wu }; 4061de9a54aSTrevor Wu 4071de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o065_mix[] = { 4081de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I039 Switch", AFE_CONN65_1, 7, 1, 0), 4091de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I063 Switch", AFE_CONN65_1, 31, 1, 0), 4101de9a54aSTrevor Wu }; 4111de9a54aSTrevor Wu 4121de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o066_mix[] = { 4131de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I040 Switch", AFE_CONN66_1, 8, 1, 0), 4141de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I064 Switch", AFE_CONN66_2, 0, 1, 0), 4151de9a54aSTrevor Wu }; 4161de9a54aSTrevor Wu 4171de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o067_mix[] = { 4181de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I041 Switch", AFE_CONN67_1, 9, 1, 0), 4191de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I065 Switch", AFE_CONN67_2, 1, 1, 0), 4201de9a54aSTrevor Wu }; 4211de9a54aSTrevor Wu 4221de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o068_mix[] = { 4231de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I042 Switch", AFE_CONN68_1, 10, 1, 0), 4241de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I066 Switch", AFE_CONN68_2, 2, 1, 0), 4251de9a54aSTrevor Wu }; 4261de9a54aSTrevor Wu 4271de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o069_mix[] = { 4281de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I043 Switch", AFE_CONN69_1, 11, 1, 0), 4291de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I067 Switch", AFE_CONN69_2, 3, 1, 0), 4301de9a54aSTrevor Wu }; 4311de9a54aSTrevor Wu 4321de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o070_mix[] = { 4331de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I044 Switch", AFE_CONN70_1, 12, 1, 0), 4341de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I068 Switch", AFE_CONN70_2, 4, 1, 0), 4351de9a54aSTrevor Wu }; 4361de9a54aSTrevor Wu 4371de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o071_mix[] = { 4381de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I045 Switch", AFE_CONN71_1, 13, 1, 0), 4391de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I069 Switch", AFE_CONN71_2, 5, 1, 0), 4401de9a54aSTrevor Wu }; 4411de9a54aSTrevor Wu 4421de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o072_mix[] = { 4431de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN72, 20, 1, 0), 4441de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN72, 22, 1, 0), 4451de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN72_1, 14, 1, 0), 4461de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN72_2, 6, 1, 0), 4471de9a54aSTrevor Wu }; 4481de9a54aSTrevor Wu 4491de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o073_mix[] = { 4501de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN73, 21, 1, 0), 4511de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN73, 23, 1, 0), 4521de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN73_1, 15, 1, 0), 4531de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN73_2, 7, 1, 0), 4541de9a54aSTrevor Wu }; 4551de9a54aSTrevor Wu 4561de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o074_mix[] = { 4571de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN74, 24, 1, 0), 4581de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN74_1, 16, 1, 0), 4591de9a54aSTrevor Wu }; 4601de9a54aSTrevor Wu 4611de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o075_mix[] = { 4621de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN75, 25, 1, 0), 4631de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN75_1, 17, 1, 0), 4641de9a54aSTrevor Wu }; 4651de9a54aSTrevor Wu 4661de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o076_mix[] = { 4671de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN76, 26, 1, 0), 4681de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN76_1, 18, 1, 0), 4691de9a54aSTrevor Wu }; 4701de9a54aSTrevor Wu 4711de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o077_mix[] = { 4721de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN77, 27, 1, 0), 4731de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN77_1, 19, 1, 0), 4741de9a54aSTrevor Wu }; 4751de9a54aSTrevor Wu 4761de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o078_mix[] = { 4771de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN78, 28, 1, 0), 4781de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN78_1, 20, 1, 0), 4791de9a54aSTrevor Wu }; 4801de9a54aSTrevor Wu 4811de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o079_mix[] = { 4821de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN79, 29, 1, 0), 4831de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN79_1, 21, 1, 0), 4841de9a54aSTrevor Wu }; 4851de9a54aSTrevor Wu 4861de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o080_mix[] = { 4871de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I030 Switch", AFE_CONN80, 30, 1, 0), 4881de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I054 Switch", AFE_CONN80_1, 22, 1, 0), 4891de9a54aSTrevor Wu }; 4901de9a54aSTrevor Wu 4911de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o081_mix[] = { 4921de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I031 Switch", AFE_CONN81, 31, 1, 0), 4931de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I055 Switch", AFE_CONN81_1, 23, 1, 0), 4941de9a54aSTrevor Wu }; 4951de9a54aSTrevor Wu 4961de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o082_mix[] = { 4971de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I032 Switch", AFE_CONN82_1, 0, 1, 0), 4981de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I056 Switch", AFE_CONN82_1, 24, 1, 0), 4991de9a54aSTrevor Wu }; 5001de9a54aSTrevor Wu 5011de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o083_mix[] = { 5021de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I033 Switch", AFE_CONN83_1, 1, 1, 0), 5031de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I057 Switch", AFE_CONN83_1, 25, 1, 0), 5041de9a54aSTrevor Wu }; 5051de9a54aSTrevor Wu 5061de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o084_mix[] = { 5071de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I034 Switch", AFE_CONN84_1, 2, 1, 0), 5081de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I058 Switch", AFE_CONN84_1, 26, 1, 0), 5091de9a54aSTrevor Wu }; 5101de9a54aSTrevor Wu 5111de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o085_mix[] = { 5121de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I035 Switch", AFE_CONN85_1, 3, 1, 0), 5131de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I059 Switch", AFE_CONN85_1, 27, 1, 0), 5141de9a54aSTrevor Wu }; 5151de9a54aSTrevor Wu 5161de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o086_mix[] = { 5171de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I036 Switch", AFE_CONN86_1, 4, 1, 0), 5181de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I060 Switch", AFE_CONN86_1, 28, 1, 0), 5191de9a54aSTrevor Wu }; 5201de9a54aSTrevor Wu 5211de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o087_mix[] = { 5221de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I037 Switch", AFE_CONN87_1, 5, 1, 0), 5231de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I061 Switch", AFE_CONN87_1, 29, 1, 0), 5241de9a54aSTrevor Wu }; 5251de9a54aSTrevor Wu 5261de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o088_mix[] = { 5271de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I038 Switch", AFE_CONN88_1, 6, 1, 0), 5281de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I062 Switch", AFE_CONN88_1, 30, 1, 0), 5291de9a54aSTrevor Wu }; 5301de9a54aSTrevor Wu 5311de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o089_mix[] = { 5321de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I039 Switch", AFE_CONN89_1, 7, 1, 0), 5331de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I063 Switch", AFE_CONN89_1, 31, 1, 0), 5341de9a54aSTrevor Wu }; 5351de9a54aSTrevor Wu 5361de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o090_mix[] = { 5371de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I040 Switch", AFE_CONN90_1, 8, 1, 0), 5381de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I064 Switch", AFE_CONN90_2, 0, 1, 0), 5391de9a54aSTrevor Wu }; 5401de9a54aSTrevor Wu 5411de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o091_mix[] = { 5421de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I041 Switch", AFE_CONN91_1, 9, 1, 0), 5431de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I065 Switch", AFE_CONN91_2, 1, 1, 0), 5441de9a54aSTrevor Wu }; 5451de9a54aSTrevor Wu 5461de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o092_mix[] = { 5471de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I042 Switch", AFE_CONN92_1, 10, 1, 0), 5481de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I066 Switch", AFE_CONN92_2, 2, 1, 0), 5491de9a54aSTrevor Wu }; 5501de9a54aSTrevor Wu 5511de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o093_mix[] = { 5521de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I043 Switch", AFE_CONN93_1, 11, 1, 0), 5531de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I067 Switch", AFE_CONN93_2, 3, 1, 0), 5541de9a54aSTrevor Wu }; 5551de9a54aSTrevor Wu 5561de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o094_mix[] = { 5571de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I044 Switch", AFE_CONN94_1, 12, 1, 0), 5581de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I068 Switch", AFE_CONN94_2, 4, 1, 0), 5591de9a54aSTrevor Wu }; 5601de9a54aSTrevor Wu 5611de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_o095_mix[] = { 5621de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I045 Switch", AFE_CONN95_1, 13, 1, 0), 5631de9a54aSTrevor Wu SOC_DAPM_SINGLE_AUTODISABLE("I069 Switch", AFE_CONN95_2, 5, 1, 0), 5641de9a54aSTrevor Wu }; 5651de9a54aSTrevor Wu 5661de9a54aSTrevor Wu static const char * const mt8195_etdm_clk_src_sel_text[] = { 5671de9a54aSTrevor Wu "26m", 5681de9a54aSTrevor Wu "a1sys_a2sys", 5691de9a54aSTrevor Wu "a3sys", 5701de9a54aSTrevor Wu "a4sys", 5711de9a54aSTrevor Wu }; 5721de9a54aSTrevor Wu 5731de9a54aSTrevor Wu static SOC_ENUM_SINGLE_EXT_DECL(etdmout_clk_src_enum, 5741de9a54aSTrevor Wu mt8195_etdm_clk_src_sel_text); 5751de9a54aSTrevor Wu 5761de9a54aSTrevor Wu static const char * const hdmitx_dptx_mux_map[] = { 5771de9a54aSTrevor Wu "Disconnect", "Connect", 5781de9a54aSTrevor Wu }; 5791de9a54aSTrevor Wu 5801de9a54aSTrevor Wu static int hdmitx_dptx_mux_map_value[] = { 5811de9a54aSTrevor Wu 0, 1, 5821de9a54aSTrevor Wu }; 5831de9a54aSTrevor Wu 5841de9a54aSTrevor Wu /* HDMI_OUT_MUX */ 5851de9a54aSTrevor Wu static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(hdmi_out_mux_map_enum, 5861de9a54aSTrevor Wu SND_SOC_NOPM, 5871de9a54aSTrevor Wu 0, 5881de9a54aSTrevor Wu 1, 5891de9a54aSTrevor Wu hdmitx_dptx_mux_map, 5901de9a54aSTrevor Wu hdmitx_dptx_mux_map_value); 5911de9a54aSTrevor Wu 5921de9a54aSTrevor Wu static const struct snd_kcontrol_new hdmi_out_mux_control = 5931de9a54aSTrevor Wu SOC_DAPM_ENUM("HDMI_OUT_MUX", hdmi_out_mux_map_enum); 5941de9a54aSTrevor Wu 5951de9a54aSTrevor Wu /* DPTX_OUT_MUX */ 5961de9a54aSTrevor Wu static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(dptx_out_mux_map_enum, 5971de9a54aSTrevor Wu SND_SOC_NOPM, 5981de9a54aSTrevor Wu 0, 5991de9a54aSTrevor Wu 1, 6001de9a54aSTrevor Wu hdmitx_dptx_mux_map, 6011de9a54aSTrevor Wu hdmitx_dptx_mux_map_value); 6021de9a54aSTrevor Wu 6031de9a54aSTrevor Wu static const struct snd_kcontrol_new dptx_out_mux_control = 6041de9a54aSTrevor Wu SOC_DAPM_ENUM("DPTX_OUT_MUX", dptx_out_mux_map_enum); 6051de9a54aSTrevor Wu 6061de9a54aSTrevor Wu /* HDMI_CH0_MUX ~ HDMI_CH7_MUX */ 6071de9a54aSTrevor Wu static const char *const afe_conn_hdmi_mux_map[] = { 6081de9a54aSTrevor Wu "CH0", "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", 6091de9a54aSTrevor Wu }; 6101de9a54aSTrevor Wu 6111de9a54aSTrevor Wu static int afe_conn_hdmi_mux_map_value[] = { 6121de9a54aSTrevor Wu 0, 1, 2, 3, 4, 5, 6, 7, 6131de9a54aSTrevor Wu }; 6141de9a54aSTrevor Wu 6151de9a54aSTrevor Wu static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch0_mux_map_enum, 6161de9a54aSTrevor Wu AFE_TDMOUT_CONN0, 6171de9a54aSTrevor Wu 0, 6181de9a54aSTrevor Wu 0xf, 6191de9a54aSTrevor Wu afe_conn_hdmi_mux_map, 6201de9a54aSTrevor Wu afe_conn_hdmi_mux_map_value); 6211de9a54aSTrevor Wu 6221de9a54aSTrevor Wu static const struct snd_kcontrol_new hdmi_ch0_mux_control = 6231de9a54aSTrevor Wu SOC_DAPM_ENUM("HDMI_CH0_MUX", hdmi_ch0_mux_map_enum); 6241de9a54aSTrevor Wu 6251de9a54aSTrevor Wu static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch1_mux_map_enum, 6261de9a54aSTrevor Wu AFE_TDMOUT_CONN0, 6271de9a54aSTrevor Wu 4, 6281de9a54aSTrevor Wu 0xf, 6291de9a54aSTrevor Wu afe_conn_hdmi_mux_map, 6301de9a54aSTrevor Wu afe_conn_hdmi_mux_map_value); 6311de9a54aSTrevor Wu 6321de9a54aSTrevor Wu static const struct snd_kcontrol_new hdmi_ch1_mux_control = 6331de9a54aSTrevor Wu SOC_DAPM_ENUM("HDMI_CH1_MUX", hdmi_ch1_mux_map_enum); 6341de9a54aSTrevor Wu 6351de9a54aSTrevor Wu static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch2_mux_map_enum, 6361de9a54aSTrevor Wu AFE_TDMOUT_CONN0, 6371de9a54aSTrevor Wu 8, 6381de9a54aSTrevor Wu 0xf, 6391de9a54aSTrevor Wu afe_conn_hdmi_mux_map, 6401de9a54aSTrevor Wu afe_conn_hdmi_mux_map_value); 6411de9a54aSTrevor Wu 6421de9a54aSTrevor Wu static const struct snd_kcontrol_new hdmi_ch2_mux_control = 6431de9a54aSTrevor Wu SOC_DAPM_ENUM("HDMI_CH2_MUX", hdmi_ch2_mux_map_enum); 6441de9a54aSTrevor Wu 6451de9a54aSTrevor Wu static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch3_mux_map_enum, 6461de9a54aSTrevor Wu AFE_TDMOUT_CONN0, 6471de9a54aSTrevor Wu 12, 6481de9a54aSTrevor Wu 0xf, 6491de9a54aSTrevor Wu afe_conn_hdmi_mux_map, 6501de9a54aSTrevor Wu afe_conn_hdmi_mux_map_value); 6511de9a54aSTrevor Wu 6521de9a54aSTrevor Wu static const struct snd_kcontrol_new hdmi_ch3_mux_control = 6531de9a54aSTrevor Wu SOC_DAPM_ENUM("HDMI_CH3_MUX", hdmi_ch3_mux_map_enum); 6541de9a54aSTrevor Wu 6551de9a54aSTrevor Wu static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch4_mux_map_enum, 6561de9a54aSTrevor Wu AFE_TDMOUT_CONN0, 6571de9a54aSTrevor Wu 16, 6581de9a54aSTrevor Wu 0xf, 6591de9a54aSTrevor Wu afe_conn_hdmi_mux_map, 6601de9a54aSTrevor Wu afe_conn_hdmi_mux_map_value); 6611de9a54aSTrevor Wu 6621de9a54aSTrevor Wu static const struct snd_kcontrol_new hdmi_ch4_mux_control = 6631de9a54aSTrevor Wu SOC_DAPM_ENUM("HDMI_CH4_MUX", hdmi_ch4_mux_map_enum); 6641de9a54aSTrevor Wu 6651de9a54aSTrevor Wu static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch5_mux_map_enum, 6661de9a54aSTrevor Wu AFE_TDMOUT_CONN0, 6671de9a54aSTrevor Wu 20, 6681de9a54aSTrevor Wu 0xf, 6691de9a54aSTrevor Wu afe_conn_hdmi_mux_map, 6701de9a54aSTrevor Wu afe_conn_hdmi_mux_map_value); 6711de9a54aSTrevor Wu 6721de9a54aSTrevor Wu static const struct snd_kcontrol_new hdmi_ch5_mux_control = 6731de9a54aSTrevor Wu SOC_DAPM_ENUM("HDMI_CH5_MUX", hdmi_ch5_mux_map_enum); 6741de9a54aSTrevor Wu 6751de9a54aSTrevor Wu static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch6_mux_map_enum, 6761de9a54aSTrevor Wu AFE_TDMOUT_CONN0, 6771de9a54aSTrevor Wu 24, 6781de9a54aSTrevor Wu 0xf, 6791de9a54aSTrevor Wu afe_conn_hdmi_mux_map, 6801de9a54aSTrevor Wu afe_conn_hdmi_mux_map_value); 6811de9a54aSTrevor Wu 6821de9a54aSTrevor Wu static const struct snd_kcontrol_new hdmi_ch6_mux_control = 6831de9a54aSTrevor Wu SOC_DAPM_ENUM("HDMI_CH6_MUX", hdmi_ch6_mux_map_enum); 6841de9a54aSTrevor Wu 6851de9a54aSTrevor Wu static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch7_mux_map_enum, 6861de9a54aSTrevor Wu AFE_TDMOUT_CONN0, 6871de9a54aSTrevor Wu 28, 6881de9a54aSTrevor Wu 0xf, 6891de9a54aSTrevor Wu afe_conn_hdmi_mux_map, 6901de9a54aSTrevor Wu afe_conn_hdmi_mux_map_value); 6911de9a54aSTrevor Wu 6921de9a54aSTrevor Wu static const struct snd_kcontrol_new hdmi_ch7_mux_control = 6931de9a54aSTrevor Wu SOC_DAPM_ENUM("HDMI_CH7_MUX", hdmi_ch7_mux_map_enum); 6941de9a54aSTrevor Wu 6951de9a54aSTrevor Wu static int mt8195_etdm_clk_src_sel_put(struct snd_kcontrol *kcontrol, 6961de9a54aSTrevor Wu struct snd_ctl_elem_value *ucontrol) 6971de9a54aSTrevor Wu { 6981de9a54aSTrevor Wu struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 6991de9a54aSTrevor Wu struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 7001de9a54aSTrevor Wu struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); 7011de9a54aSTrevor Wu unsigned int source = ucontrol->value.enumerated.item[0]; 7021de9a54aSTrevor Wu unsigned int val; 7031de9a54aSTrevor Wu unsigned int mask; 7041de9a54aSTrevor Wu unsigned int reg; 7051de9a54aSTrevor Wu 7061de9a54aSTrevor Wu if (source >= e->items) 7071de9a54aSTrevor Wu return -EINVAL; 7081de9a54aSTrevor Wu 7091de9a54aSTrevor Wu reg = 0; 7101de9a54aSTrevor Wu if (!strcmp(kcontrol->id.name, "ETDM_OUT1_Clock_Source")) { 7111de9a54aSTrevor Wu reg = ETDM_OUT1_CON4; 7121de9a54aSTrevor Wu mask = ETDM_OUT_CON4_CLOCK_MASK; 7131de9a54aSTrevor Wu val = ETDM_OUT_CON4_CLOCK(source); 7141de9a54aSTrevor Wu } else if (!strcmp(kcontrol->id.name, "ETDM_OUT2_Clock_Source")) { 7151de9a54aSTrevor Wu reg = ETDM_OUT2_CON4; 7161de9a54aSTrevor Wu mask = ETDM_OUT_CON4_CLOCK_MASK; 7171de9a54aSTrevor Wu val = ETDM_OUT_CON4_CLOCK(source); 7181de9a54aSTrevor Wu } else if (!strcmp(kcontrol->id.name, "ETDM_OUT3_Clock_Source")) { 7191de9a54aSTrevor Wu reg = ETDM_OUT3_CON4; 7201de9a54aSTrevor Wu mask = ETDM_OUT_CON4_CLOCK_MASK; 7211de9a54aSTrevor Wu val = ETDM_OUT_CON4_CLOCK(source); 7221de9a54aSTrevor Wu } else if (!strcmp(kcontrol->id.name, "ETDM_IN1_Clock_Source")) { 7231de9a54aSTrevor Wu reg = ETDM_IN1_CON2; 7241de9a54aSTrevor Wu mask = ETDM_IN_CON2_CLOCK_MASK; 7251de9a54aSTrevor Wu val = ETDM_IN_CON2_CLOCK(source); 7261de9a54aSTrevor Wu } else if (!strcmp(kcontrol->id.name, "ETDM_IN2_Clock_Source")) { 7271de9a54aSTrevor Wu reg = ETDM_IN2_CON2; 7281de9a54aSTrevor Wu mask = ETDM_IN_CON2_CLOCK_MASK; 7291de9a54aSTrevor Wu val = ETDM_IN_CON2_CLOCK(source); 7301de9a54aSTrevor Wu } 7311de9a54aSTrevor Wu 7321de9a54aSTrevor Wu if (reg) 7331de9a54aSTrevor Wu regmap_update_bits(afe->regmap, reg, mask, val); 7341de9a54aSTrevor Wu 7351de9a54aSTrevor Wu return 0; 7361de9a54aSTrevor Wu } 7371de9a54aSTrevor Wu 7381de9a54aSTrevor Wu static int mt8195_etdm_clk_src_sel_get(struct snd_kcontrol *kcontrol, 7391de9a54aSTrevor Wu struct snd_ctl_elem_value *ucontrol) 7401de9a54aSTrevor Wu { 7411de9a54aSTrevor Wu struct snd_soc_component *component = 7421de9a54aSTrevor Wu snd_soc_kcontrol_component(kcontrol); 7431de9a54aSTrevor Wu struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); 7441de9a54aSTrevor Wu unsigned int value = 0; 7451de9a54aSTrevor Wu unsigned int reg = 0; 7461de9a54aSTrevor Wu unsigned int mask = 0; 7471de9a54aSTrevor Wu unsigned int shift = 0; 7481de9a54aSTrevor Wu 7491de9a54aSTrevor Wu if (!strcmp(kcontrol->id.name, "ETDM_OUT1_Clock_Source")) { 7501de9a54aSTrevor Wu reg = ETDM_OUT1_CON4; 7511de9a54aSTrevor Wu mask = ETDM_OUT_CON4_CLOCK_MASK; 7521de9a54aSTrevor Wu shift = ETDM_OUT_CON4_CLOCK_SHIFT; 7531de9a54aSTrevor Wu } else if (!strcmp(kcontrol->id.name, "ETDM_OUT2_Clock_Source")) { 7541de9a54aSTrevor Wu reg = ETDM_OUT2_CON4; 7551de9a54aSTrevor Wu mask = ETDM_OUT_CON4_CLOCK_MASK; 7561de9a54aSTrevor Wu shift = ETDM_OUT_CON4_CLOCK_SHIFT; 7571de9a54aSTrevor Wu } else if (!strcmp(kcontrol->id.name, "ETDM_OUT3_Clock_Source")) { 7581de9a54aSTrevor Wu reg = ETDM_OUT3_CON4; 7591de9a54aSTrevor Wu mask = ETDM_OUT_CON4_CLOCK_MASK; 7601de9a54aSTrevor Wu shift = ETDM_OUT_CON4_CLOCK_SHIFT; 7611de9a54aSTrevor Wu } else if (!strcmp(kcontrol->id.name, "ETDM_IN1_Clock_Source")) { 7621de9a54aSTrevor Wu reg = ETDM_IN1_CON2; 7631de9a54aSTrevor Wu mask = ETDM_IN_CON2_CLOCK_MASK; 7641de9a54aSTrevor Wu shift = ETDM_IN_CON2_CLOCK_SHIFT; 7651de9a54aSTrevor Wu } else if (!strcmp(kcontrol->id.name, "ETDM_IN2_Clock_Source")) { 7661de9a54aSTrevor Wu reg = ETDM_IN2_CON2; 7671de9a54aSTrevor Wu mask = ETDM_IN_CON2_CLOCK_MASK; 7681de9a54aSTrevor Wu shift = ETDM_IN_CON2_CLOCK_SHIFT; 7691de9a54aSTrevor Wu } 7701de9a54aSTrevor Wu 7711de9a54aSTrevor Wu if (reg) 7721de9a54aSTrevor Wu regmap_read(afe->regmap, reg, &value); 7731de9a54aSTrevor Wu 7741de9a54aSTrevor Wu value &= mask; 7751de9a54aSTrevor Wu value >>= shift; 7761de9a54aSTrevor Wu ucontrol->value.enumerated.item[0] = value; 7771de9a54aSTrevor Wu return 0; 7781de9a54aSTrevor Wu } 7791de9a54aSTrevor Wu 7801de9a54aSTrevor Wu static const struct snd_kcontrol_new mtk_dai_etdm_controls[] = { 7811de9a54aSTrevor Wu SOC_ENUM_EXT("ETDM_OUT1_Clock_Source", 7821de9a54aSTrevor Wu etdmout_clk_src_enum, 7831de9a54aSTrevor Wu mt8195_etdm_clk_src_sel_get, 7841de9a54aSTrevor Wu mt8195_etdm_clk_src_sel_put), 7851de9a54aSTrevor Wu SOC_ENUM_EXT("ETDM_OUT2_Clock_Source", 7861de9a54aSTrevor Wu etdmout_clk_src_enum, 7871de9a54aSTrevor Wu mt8195_etdm_clk_src_sel_get, 7881de9a54aSTrevor Wu mt8195_etdm_clk_src_sel_put), 7891de9a54aSTrevor Wu SOC_ENUM_EXT("ETDM_OUT3_Clock_Source", 7901de9a54aSTrevor Wu etdmout_clk_src_enum, 7911de9a54aSTrevor Wu mt8195_etdm_clk_src_sel_get, 7921de9a54aSTrevor Wu mt8195_etdm_clk_src_sel_put), 7931de9a54aSTrevor Wu SOC_ENUM_EXT("ETDM_IN1_Clock_Source", 7941de9a54aSTrevor Wu etdmout_clk_src_enum, 7951de9a54aSTrevor Wu mt8195_etdm_clk_src_sel_get, 7961de9a54aSTrevor Wu mt8195_etdm_clk_src_sel_put), 7971de9a54aSTrevor Wu SOC_ENUM_EXT("ETDM_IN2_Clock_Source", 7981de9a54aSTrevor Wu etdmout_clk_src_enum, 7991de9a54aSTrevor Wu mt8195_etdm_clk_src_sel_get, 8001de9a54aSTrevor Wu mt8195_etdm_clk_src_sel_put), 8011de9a54aSTrevor Wu }; 8021de9a54aSTrevor Wu 8031de9a54aSTrevor Wu static const struct snd_soc_dapm_widget mtk_dai_etdm_widgets[] = { 8041de9a54aSTrevor Wu /* eTDM_IN2 */ 8051de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I012", SND_SOC_NOPM, 0, 0, NULL, 0), 8061de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I013", SND_SOC_NOPM, 0, 0, NULL, 0), 8071de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I014", SND_SOC_NOPM, 0, 0, NULL, 0), 8081de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I015", SND_SOC_NOPM, 0, 0, NULL, 0), 8091de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I016", SND_SOC_NOPM, 0, 0, NULL, 0), 8101de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I017", SND_SOC_NOPM, 0, 0, NULL, 0), 8111de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I018", SND_SOC_NOPM, 0, 0, NULL, 0), 8121de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I019", SND_SOC_NOPM, 0, 0, NULL, 0), 8131de9a54aSTrevor Wu 8141de9a54aSTrevor Wu /* eTDM_IN1 */ 8151de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I072", SND_SOC_NOPM, 0, 0, NULL, 0), 8161de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I073", SND_SOC_NOPM, 0, 0, NULL, 0), 8171de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I074", SND_SOC_NOPM, 0, 0, NULL, 0), 8181de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I075", SND_SOC_NOPM, 0, 0, NULL, 0), 8191de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I076", SND_SOC_NOPM, 0, 0, NULL, 0), 8201de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I077", SND_SOC_NOPM, 0, 0, NULL, 0), 8211de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I078", SND_SOC_NOPM, 0, 0, NULL, 0), 8221de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I079", SND_SOC_NOPM, 0, 0, NULL, 0), 8231de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I080", SND_SOC_NOPM, 0, 0, NULL, 0), 8241de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I081", SND_SOC_NOPM, 0, 0, NULL, 0), 8251de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I082", SND_SOC_NOPM, 0, 0, NULL, 0), 8261de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I083", SND_SOC_NOPM, 0, 0, NULL, 0), 8271de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I084", SND_SOC_NOPM, 0, 0, NULL, 0), 8281de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I085", SND_SOC_NOPM, 0, 0, NULL, 0), 8291de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I086", SND_SOC_NOPM, 0, 0, NULL, 0), 8301de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I087", SND_SOC_NOPM, 0, 0, NULL, 0), 8311de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I088", SND_SOC_NOPM, 0, 0, NULL, 0), 8321de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I089", SND_SOC_NOPM, 0, 0, NULL, 0), 8331de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I090", SND_SOC_NOPM, 0, 0, NULL, 0), 8341de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I091", SND_SOC_NOPM, 0, 0, NULL, 0), 8351de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I092", SND_SOC_NOPM, 0, 0, NULL, 0), 8361de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I093", SND_SOC_NOPM, 0, 0, NULL, 0), 8371de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I094", SND_SOC_NOPM, 0, 0, NULL, 0), 8381de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("I095", SND_SOC_NOPM, 0, 0, NULL, 0), 8391de9a54aSTrevor Wu 8401de9a54aSTrevor Wu /* eTDM_OUT2 */ 8411de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O048", SND_SOC_NOPM, 0, 0, 8421de9a54aSTrevor Wu mtk_dai_etdm_o048_mix, 8431de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o048_mix)), 8441de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O049", SND_SOC_NOPM, 0, 0, 8451de9a54aSTrevor Wu mtk_dai_etdm_o049_mix, 8461de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o049_mix)), 8471de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O050", SND_SOC_NOPM, 0, 0, 8481de9a54aSTrevor Wu mtk_dai_etdm_o050_mix, 8491de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o050_mix)), 8501de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O051", SND_SOC_NOPM, 0, 0, 8511de9a54aSTrevor Wu mtk_dai_etdm_o051_mix, 8521de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o051_mix)), 8531de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O052", SND_SOC_NOPM, 0, 0, 8541de9a54aSTrevor Wu mtk_dai_etdm_o052_mix, 8551de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o052_mix)), 8561de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O053", SND_SOC_NOPM, 0, 0, 8571de9a54aSTrevor Wu mtk_dai_etdm_o053_mix, 8581de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o053_mix)), 8591de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O054", SND_SOC_NOPM, 0, 0, 8601de9a54aSTrevor Wu mtk_dai_etdm_o054_mix, 8611de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o054_mix)), 8621de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O055", SND_SOC_NOPM, 0, 0, 8631de9a54aSTrevor Wu mtk_dai_etdm_o055_mix, 8641de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o055_mix)), 8651de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O056", SND_SOC_NOPM, 0, 0, 8661de9a54aSTrevor Wu mtk_dai_etdm_o056_mix, 8671de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o056_mix)), 8681de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O057", SND_SOC_NOPM, 0, 0, 8691de9a54aSTrevor Wu mtk_dai_etdm_o057_mix, 8701de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o057_mix)), 8711de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O058", SND_SOC_NOPM, 0, 0, 8721de9a54aSTrevor Wu mtk_dai_etdm_o058_mix, 8731de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o058_mix)), 8741de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O059", SND_SOC_NOPM, 0, 0, 8751de9a54aSTrevor Wu mtk_dai_etdm_o059_mix, 8761de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o059_mix)), 8771de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O060", SND_SOC_NOPM, 0, 0, 8781de9a54aSTrevor Wu mtk_dai_etdm_o060_mix, 8791de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o060_mix)), 8801de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O061", SND_SOC_NOPM, 0, 0, 8811de9a54aSTrevor Wu mtk_dai_etdm_o061_mix, 8821de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o061_mix)), 8831de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O062", SND_SOC_NOPM, 0, 0, 8841de9a54aSTrevor Wu mtk_dai_etdm_o062_mix, 8851de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o062_mix)), 8861de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O063", SND_SOC_NOPM, 0, 0, 8871de9a54aSTrevor Wu mtk_dai_etdm_o063_mix, 8881de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o063_mix)), 8891de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O064", SND_SOC_NOPM, 0, 0, 8901de9a54aSTrevor Wu mtk_dai_etdm_o064_mix, 8911de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o064_mix)), 8921de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O065", SND_SOC_NOPM, 0, 0, 8931de9a54aSTrevor Wu mtk_dai_etdm_o065_mix, 8941de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o065_mix)), 8951de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O066", SND_SOC_NOPM, 0, 0, 8961de9a54aSTrevor Wu mtk_dai_etdm_o066_mix, 8971de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o066_mix)), 8981de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O067", SND_SOC_NOPM, 0, 0, 8991de9a54aSTrevor Wu mtk_dai_etdm_o067_mix, 9001de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o067_mix)), 9011de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O068", SND_SOC_NOPM, 0, 0, 9021de9a54aSTrevor Wu mtk_dai_etdm_o068_mix, 9031de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o068_mix)), 9041de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O069", SND_SOC_NOPM, 0, 0, 9051de9a54aSTrevor Wu mtk_dai_etdm_o069_mix, 9061de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o069_mix)), 9071de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O070", SND_SOC_NOPM, 0, 0, 9081de9a54aSTrevor Wu mtk_dai_etdm_o070_mix, 9091de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o070_mix)), 9101de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O071", SND_SOC_NOPM, 0, 0, 9111de9a54aSTrevor Wu mtk_dai_etdm_o071_mix, 9121de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o071_mix)), 9131de9a54aSTrevor Wu 9141de9a54aSTrevor Wu /* eTDM_OUT1 */ 9151de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O072", SND_SOC_NOPM, 0, 0, 9161de9a54aSTrevor Wu mtk_dai_etdm_o072_mix, 9171de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o072_mix)), 9181de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O073", SND_SOC_NOPM, 0, 0, 9191de9a54aSTrevor Wu mtk_dai_etdm_o073_mix, 9201de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o073_mix)), 9211de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O074", SND_SOC_NOPM, 0, 0, 9221de9a54aSTrevor Wu mtk_dai_etdm_o074_mix, 9231de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o074_mix)), 9241de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O075", SND_SOC_NOPM, 0, 0, 9251de9a54aSTrevor Wu mtk_dai_etdm_o075_mix, 9261de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o075_mix)), 9271de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O076", SND_SOC_NOPM, 0, 0, 9281de9a54aSTrevor Wu mtk_dai_etdm_o076_mix, 9291de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o076_mix)), 9301de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O077", SND_SOC_NOPM, 0, 0, 9311de9a54aSTrevor Wu mtk_dai_etdm_o077_mix, 9321de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o077_mix)), 9331de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O078", SND_SOC_NOPM, 0, 0, 9341de9a54aSTrevor Wu mtk_dai_etdm_o078_mix, 9351de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o078_mix)), 9361de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O079", SND_SOC_NOPM, 0, 0, 9371de9a54aSTrevor Wu mtk_dai_etdm_o079_mix, 9381de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o079_mix)), 9391de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O080", SND_SOC_NOPM, 0, 0, 9401de9a54aSTrevor Wu mtk_dai_etdm_o080_mix, 9411de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o080_mix)), 9421de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O081", SND_SOC_NOPM, 0, 0, 9431de9a54aSTrevor Wu mtk_dai_etdm_o081_mix, 9441de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o081_mix)), 9451de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O082", SND_SOC_NOPM, 0, 0, 9461de9a54aSTrevor Wu mtk_dai_etdm_o082_mix, 9471de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o082_mix)), 9481de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O083", SND_SOC_NOPM, 0, 0, 9491de9a54aSTrevor Wu mtk_dai_etdm_o083_mix, 9501de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o083_mix)), 9511de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O084", SND_SOC_NOPM, 0, 0, 9521de9a54aSTrevor Wu mtk_dai_etdm_o084_mix, 9531de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o084_mix)), 9541de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O085", SND_SOC_NOPM, 0, 0, 9551de9a54aSTrevor Wu mtk_dai_etdm_o085_mix, 9561de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o085_mix)), 9571de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O086", SND_SOC_NOPM, 0, 0, 9581de9a54aSTrevor Wu mtk_dai_etdm_o086_mix, 9591de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o086_mix)), 9601de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O087", SND_SOC_NOPM, 0, 0, 9611de9a54aSTrevor Wu mtk_dai_etdm_o087_mix, 9621de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o087_mix)), 9631de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O088", SND_SOC_NOPM, 0, 0, 9641de9a54aSTrevor Wu mtk_dai_etdm_o088_mix, 9651de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o088_mix)), 9661de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O089", SND_SOC_NOPM, 0, 0, 9671de9a54aSTrevor Wu mtk_dai_etdm_o089_mix, 9681de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o089_mix)), 9691de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O090", SND_SOC_NOPM, 0, 0, 9701de9a54aSTrevor Wu mtk_dai_etdm_o090_mix, 9711de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o090_mix)), 9721de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O091", SND_SOC_NOPM, 0, 0, 9731de9a54aSTrevor Wu mtk_dai_etdm_o091_mix, 9741de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o091_mix)), 9751de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O092", SND_SOC_NOPM, 0, 0, 9761de9a54aSTrevor Wu mtk_dai_etdm_o092_mix, 9771de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o092_mix)), 9781de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O093", SND_SOC_NOPM, 0, 0, 9791de9a54aSTrevor Wu mtk_dai_etdm_o093_mix, 9801de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o093_mix)), 9811de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O094", SND_SOC_NOPM, 0, 0, 9821de9a54aSTrevor Wu mtk_dai_etdm_o094_mix, 9831de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o094_mix)), 9841de9a54aSTrevor Wu SND_SOC_DAPM_MIXER("O095", SND_SOC_NOPM, 0, 0, 9851de9a54aSTrevor Wu mtk_dai_etdm_o095_mix, 9861de9a54aSTrevor Wu ARRAY_SIZE(mtk_dai_etdm_o095_mix)), 9871de9a54aSTrevor Wu 9881de9a54aSTrevor Wu /* eTDM_OUT3 */ 9891de9a54aSTrevor Wu SND_SOC_DAPM_MUX("HDMI_OUT_MUX", SND_SOC_NOPM, 0, 0, 9901de9a54aSTrevor Wu &hdmi_out_mux_control), 9911de9a54aSTrevor Wu SND_SOC_DAPM_MUX("DPTX_OUT_MUX", SND_SOC_NOPM, 0, 0, 9921de9a54aSTrevor Wu &dptx_out_mux_control), 9931de9a54aSTrevor Wu 9941de9a54aSTrevor Wu SND_SOC_DAPM_MUX("HDMI_CH0_MUX", SND_SOC_NOPM, 0, 0, 9951de9a54aSTrevor Wu &hdmi_ch0_mux_control), 9961de9a54aSTrevor Wu SND_SOC_DAPM_MUX("HDMI_CH1_MUX", SND_SOC_NOPM, 0, 0, 9971de9a54aSTrevor Wu &hdmi_ch1_mux_control), 9981de9a54aSTrevor Wu SND_SOC_DAPM_MUX("HDMI_CH2_MUX", SND_SOC_NOPM, 0, 0, 9991de9a54aSTrevor Wu &hdmi_ch2_mux_control), 10001de9a54aSTrevor Wu SND_SOC_DAPM_MUX("HDMI_CH3_MUX", SND_SOC_NOPM, 0, 0, 10011de9a54aSTrevor Wu &hdmi_ch3_mux_control), 10021de9a54aSTrevor Wu SND_SOC_DAPM_MUX("HDMI_CH4_MUX", SND_SOC_NOPM, 0, 0, 10031de9a54aSTrevor Wu &hdmi_ch4_mux_control), 10041de9a54aSTrevor Wu SND_SOC_DAPM_MUX("HDMI_CH5_MUX", SND_SOC_NOPM, 0, 0, 10051de9a54aSTrevor Wu &hdmi_ch5_mux_control), 10061de9a54aSTrevor Wu SND_SOC_DAPM_MUX("HDMI_CH6_MUX", SND_SOC_NOPM, 0, 0, 10071de9a54aSTrevor Wu &hdmi_ch6_mux_control), 10081de9a54aSTrevor Wu SND_SOC_DAPM_MUX("HDMI_CH7_MUX", SND_SOC_NOPM, 0, 0, 10091de9a54aSTrevor Wu &hdmi_ch7_mux_control), 10101de9a54aSTrevor Wu 10111de9a54aSTrevor Wu SND_SOC_DAPM_INPUT("ETDM_INPUT"), 10121de9a54aSTrevor Wu SND_SOC_DAPM_OUTPUT("ETDM_OUTPUT"), 10131de9a54aSTrevor Wu }; 10141de9a54aSTrevor Wu 10151de9a54aSTrevor Wu static const struct snd_soc_dapm_route mtk_dai_etdm_routes[] = { 10161de9a54aSTrevor Wu {"I012", NULL, "ETDM2 Capture"}, 10171de9a54aSTrevor Wu {"I013", NULL, "ETDM2 Capture"}, 10181de9a54aSTrevor Wu {"I014", NULL, "ETDM2 Capture"}, 10191de9a54aSTrevor Wu {"I015", NULL, "ETDM2 Capture"}, 10201de9a54aSTrevor Wu {"I016", NULL, "ETDM2 Capture"}, 10211de9a54aSTrevor Wu {"I017", NULL, "ETDM2 Capture"}, 10221de9a54aSTrevor Wu {"I018", NULL, "ETDM2 Capture"}, 10231de9a54aSTrevor Wu {"I019", NULL, "ETDM2 Capture"}, 10241de9a54aSTrevor Wu 10251de9a54aSTrevor Wu {"I072", NULL, "ETDM1 Capture"}, 10261de9a54aSTrevor Wu {"I073", NULL, "ETDM1 Capture"}, 10271de9a54aSTrevor Wu {"I074", NULL, "ETDM1 Capture"}, 10281de9a54aSTrevor Wu {"I075", NULL, "ETDM1 Capture"}, 10291de9a54aSTrevor Wu {"I076", NULL, "ETDM1 Capture"}, 10301de9a54aSTrevor Wu {"I077", NULL, "ETDM1 Capture"}, 10311de9a54aSTrevor Wu {"I078", NULL, "ETDM1 Capture"}, 10321de9a54aSTrevor Wu {"I079", NULL, "ETDM1 Capture"}, 10331de9a54aSTrevor Wu {"I080", NULL, "ETDM1 Capture"}, 10341de9a54aSTrevor Wu {"I081", NULL, "ETDM1 Capture"}, 10351de9a54aSTrevor Wu {"I082", NULL, "ETDM1 Capture"}, 10361de9a54aSTrevor Wu {"I083", NULL, "ETDM1 Capture"}, 10371de9a54aSTrevor Wu {"I084", NULL, "ETDM1 Capture"}, 10381de9a54aSTrevor Wu {"I085", NULL, "ETDM1 Capture"}, 10391de9a54aSTrevor Wu {"I086", NULL, "ETDM1 Capture"}, 10401de9a54aSTrevor Wu {"I087", NULL, "ETDM1 Capture"}, 10411de9a54aSTrevor Wu {"I088", NULL, "ETDM1 Capture"}, 10421de9a54aSTrevor Wu {"I089", NULL, "ETDM1 Capture"}, 10431de9a54aSTrevor Wu {"I090", NULL, "ETDM1 Capture"}, 10441de9a54aSTrevor Wu {"I091", NULL, "ETDM1 Capture"}, 10451de9a54aSTrevor Wu {"I092", NULL, "ETDM1 Capture"}, 10461de9a54aSTrevor Wu {"I093", NULL, "ETDM1 Capture"}, 10471de9a54aSTrevor Wu {"I094", NULL, "ETDM1 Capture"}, 10481de9a54aSTrevor Wu {"I095", NULL, "ETDM1 Capture"}, 10491de9a54aSTrevor Wu 10501de9a54aSTrevor Wu {"UL8", NULL, "ETDM1 Capture"}, 10511de9a54aSTrevor Wu {"UL3", NULL, "ETDM2 Capture"}, 10521de9a54aSTrevor Wu 10531de9a54aSTrevor Wu {"ETDM2 Playback", NULL, "O048"}, 10541de9a54aSTrevor Wu {"ETDM2 Playback", NULL, "O049"}, 10551de9a54aSTrevor Wu {"ETDM2 Playback", NULL, "O050"}, 10561de9a54aSTrevor Wu {"ETDM2 Playback", NULL, "O051"}, 10571de9a54aSTrevor Wu {"ETDM2 Playback", NULL, "O052"}, 10581de9a54aSTrevor Wu {"ETDM2 Playback", NULL, "O053"}, 10591de9a54aSTrevor Wu {"ETDM2 Playback", NULL, "O054"}, 10601de9a54aSTrevor Wu {"ETDM2 Playback", NULL, "O055"}, 10611de9a54aSTrevor Wu {"ETDM2 Playback", NULL, "O056"}, 10621de9a54aSTrevor Wu {"ETDM2 Playback", NULL, "O057"}, 10631de9a54aSTrevor Wu {"ETDM2 Playback", NULL, "O058"}, 10641de9a54aSTrevor Wu {"ETDM2 Playback", NULL, "O059"}, 10651de9a54aSTrevor Wu {"ETDM2 Playback", NULL, "O060"}, 10661de9a54aSTrevor Wu {"ETDM2 Playback", NULL, "O061"}, 10671de9a54aSTrevor Wu {"ETDM2 Playback", NULL, "O062"}, 10681de9a54aSTrevor Wu {"ETDM2 Playback", NULL, "O063"}, 10691de9a54aSTrevor Wu {"ETDM2 Playback", NULL, "O064"}, 10701de9a54aSTrevor Wu {"ETDM2 Playback", NULL, "O065"}, 10711de9a54aSTrevor Wu {"ETDM2 Playback", NULL, "O066"}, 10721de9a54aSTrevor Wu {"ETDM2 Playback", NULL, "O067"}, 10731de9a54aSTrevor Wu {"ETDM2 Playback", NULL, "O068"}, 10741de9a54aSTrevor Wu {"ETDM2 Playback", NULL, "O069"}, 10751de9a54aSTrevor Wu {"ETDM2 Playback", NULL, "O070"}, 10761de9a54aSTrevor Wu {"ETDM2 Playback", NULL, "O071"}, 10771de9a54aSTrevor Wu 10781de9a54aSTrevor Wu {"ETDM1 Playback", NULL, "O072"}, 10791de9a54aSTrevor Wu {"ETDM1 Playback", NULL, "O073"}, 10801de9a54aSTrevor Wu {"ETDM1 Playback", NULL, "O074"}, 10811de9a54aSTrevor Wu {"ETDM1 Playback", NULL, "O075"}, 10821de9a54aSTrevor Wu {"ETDM1 Playback", NULL, "O076"}, 10831de9a54aSTrevor Wu {"ETDM1 Playback", NULL, "O077"}, 10841de9a54aSTrevor Wu {"ETDM1 Playback", NULL, "O078"}, 10851de9a54aSTrevor Wu {"ETDM1 Playback", NULL, "O079"}, 10861de9a54aSTrevor Wu {"ETDM1 Playback", NULL, "O080"}, 10871de9a54aSTrevor Wu {"ETDM1 Playback", NULL, "O081"}, 10881de9a54aSTrevor Wu {"ETDM1 Playback", NULL, "O082"}, 10891de9a54aSTrevor Wu {"ETDM1 Playback", NULL, "O083"}, 10901de9a54aSTrevor Wu {"ETDM1 Playback", NULL, "O084"}, 10911de9a54aSTrevor Wu {"ETDM1 Playback", NULL, "O085"}, 10921de9a54aSTrevor Wu {"ETDM1 Playback", NULL, "O086"}, 10931de9a54aSTrevor Wu {"ETDM1 Playback", NULL, "O087"}, 10941de9a54aSTrevor Wu {"ETDM1 Playback", NULL, "O088"}, 10951de9a54aSTrevor Wu {"ETDM1 Playback", NULL, "O089"}, 10961de9a54aSTrevor Wu {"ETDM1 Playback", NULL, "O090"}, 10971de9a54aSTrevor Wu {"ETDM1 Playback", NULL, "O091"}, 10981de9a54aSTrevor Wu {"ETDM1 Playback", NULL, "O092"}, 10991de9a54aSTrevor Wu {"ETDM1 Playback", NULL, "O093"}, 11001de9a54aSTrevor Wu {"ETDM1 Playback", NULL, "O094"}, 11011de9a54aSTrevor Wu {"ETDM1 Playback", NULL, "O095"}, 11021de9a54aSTrevor Wu 11031de9a54aSTrevor Wu {"O048", "I020 Switch", "I020"}, 11041de9a54aSTrevor Wu {"O049", "I021 Switch", "I021"}, 11051de9a54aSTrevor Wu 11061de9a54aSTrevor Wu {"O048", "I022 Switch", "I022"}, 11071de9a54aSTrevor Wu {"O049", "I023 Switch", "I023"}, 11081de9a54aSTrevor Wu {"O050", "I024 Switch", "I024"}, 11091de9a54aSTrevor Wu {"O051", "I025 Switch", "I025"}, 11101de9a54aSTrevor Wu {"O052", "I026 Switch", "I026"}, 11111de9a54aSTrevor Wu {"O053", "I027 Switch", "I027"}, 11121de9a54aSTrevor Wu {"O054", "I028 Switch", "I028"}, 11131de9a54aSTrevor Wu {"O055", "I029 Switch", "I029"}, 11141de9a54aSTrevor Wu {"O056", "I030 Switch", "I030"}, 11151de9a54aSTrevor Wu {"O057", "I031 Switch", "I031"}, 11161de9a54aSTrevor Wu {"O058", "I032 Switch", "I032"}, 11171de9a54aSTrevor Wu {"O059", "I033 Switch", "I033"}, 11181de9a54aSTrevor Wu {"O060", "I034 Switch", "I034"}, 11191de9a54aSTrevor Wu {"O061", "I035 Switch", "I035"}, 11201de9a54aSTrevor Wu {"O062", "I036 Switch", "I036"}, 11211de9a54aSTrevor Wu {"O063", "I037 Switch", "I037"}, 11221de9a54aSTrevor Wu {"O064", "I038 Switch", "I038"}, 11231de9a54aSTrevor Wu {"O065", "I039 Switch", "I039"}, 11241de9a54aSTrevor Wu {"O066", "I040 Switch", "I040"}, 11251de9a54aSTrevor Wu {"O067", "I041 Switch", "I041"}, 11261de9a54aSTrevor Wu {"O068", "I042 Switch", "I042"}, 11271de9a54aSTrevor Wu {"O069", "I043 Switch", "I043"}, 11281de9a54aSTrevor Wu {"O070", "I044 Switch", "I044"}, 11291de9a54aSTrevor Wu {"O071", "I045 Switch", "I045"}, 11301de9a54aSTrevor Wu 11311de9a54aSTrevor Wu {"O048", "I046 Switch", "I046"}, 11321de9a54aSTrevor Wu {"O049", "I047 Switch", "I047"}, 11331de9a54aSTrevor Wu {"O050", "I048 Switch", "I048"}, 11341de9a54aSTrevor Wu {"O051", "I049 Switch", "I049"}, 11351de9a54aSTrevor Wu {"O052", "I050 Switch", "I050"}, 11361de9a54aSTrevor Wu {"O053", "I051 Switch", "I051"}, 11371de9a54aSTrevor Wu {"O054", "I052 Switch", "I052"}, 11381de9a54aSTrevor Wu {"O055", "I053 Switch", "I053"}, 11391de9a54aSTrevor Wu {"O056", "I054 Switch", "I054"}, 11401de9a54aSTrevor Wu {"O057", "I055 Switch", "I055"}, 11411de9a54aSTrevor Wu {"O058", "I056 Switch", "I056"}, 11421de9a54aSTrevor Wu {"O059", "I057 Switch", "I057"}, 11431de9a54aSTrevor Wu {"O060", "I058 Switch", "I058"}, 11441de9a54aSTrevor Wu {"O061", "I059 Switch", "I059"}, 11451de9a54aSTrevor Wu {"O062", "I060 Switch", "I060"}, 11461de9a54aSTrevor Wu {"O063", "I061 Switch", "I061"}, 11471de9a54aSTrevor Wu {"O064", "I062 Switch", "I062"}, 11481de9a54aSTrevor Wu {"O065", "I063 Switch", "I063"}, 11491de9a54aSTrevor Wu {"O066", "I064 Switch", "I064"}, 11501de9a54aSTrevor Wu {"O067", "I065 Switch", "I065"}, 11511de9a54aSTrevor Wu {"O068", "I066 Switch", "I066"}, 11521de9a54aSTrevor Wu {"O069", "I067 Switch", "I067"}, 11531de9a54aSTrevor Wu {"O070", "I068 Switch", "I068"}, 11541de9a54aSTrevor Wu {"O071", "I069 Switch", "I069"}, 11551de9a54aSTrevor Wu 11561de9a54aSTrevor Wu {"O048", "I070 Switch", "I070"}, 11571de9a54aSTrevor Wu {"O049", "I071 Switch", "I071"}, 11581de9a54aSTrevor Wu 11591de9a54aSTrevor Wu {"O072", "I020 Switch", "I020"}, 11601de9a54aSTrevor Wu {"O073", "I021 Switch", "I021"}, 11611de9a54aSTrevor Wu 11621de9a54aSTrevor Wu {"O072", "I022 Switch", "I022"}, 11631de9a54aSTrevor Wu {"O073", "I023 Switch", "I023"}, 11641de9a54aSTrevor Wu {"O074", "I024 Switch", "I024"}, 11651de9a54aSTrevor Wu {"O075", "I025 Switch", "I025"}, 11661de9a54aSTrevor Wu {"O076", "I026 Switch", "I026"}, 11671de9a54aSTrevor Wu {"O077", "I027 Switch", "I027"}, 11681de9a54aSTrevor Wu {"O078", "I028 Switch", "I028"}, 11691de9a54aSTrevor Wu {"O079", "I029 Switch", "I029"}, 11701de9a54aSTrevor Wu {"O080", "I030 Switch", "I030"}, 11711de9a54aSTrevor Wu {"O081", "I031 Switch", "I031"}, 11721de9a54aSTrevor Wu {"O082", "I032 Switch", "I032"}, 11731de9a54aSTrevor Wu {"O083", "I033 Switch", "I033"}, 11741de9a54aSTrevor Wu {"O084", "I034 Switch", "I034"}, 11751de9a54aSTrevor Wu {"O085", "I035 Switch", "I035"}, 11761de9a54aSTrevor Wu {"O086", "I036 Switch", "I036"}, 11771de9a54aSTrevor Wu {"O087", "I037 Switch", "I037"}, 11781de9a54aSTrevor Wu {"O088", "I038 Switch", "I038"}, 11791de9a54aSTrevor Wu {"O089", "I039 Switch", "I039"}, 11801de9a54aSTrevor Wu {"O090", "I040 Switch", "I040"}, 11811de9a54aSTrevor Wu {"O091", "I041 Switch", "I041"}, 11821de9a54aSTrevor Wu {"O092", "I042 Switch", "I042"}, 11831de9a54aSTrevor Wu {"O093", "I043 Switch", "I043"}, 11841de9a54aSTrevor Wu {"O094", "I044 Switch", "I044"}, 11851de9a54aSTrevor Wu {"O095", "I045 Switch", "I045"}, 11861de9a54aSTrevor Wu 11871de9a54aSTrevor Wu {"O072", "I046 Switch", "I046"}, 11881de9a54aSTrevor Wu {"O073", "I047 Switch", "I047"}, 11891de9a54aSTrevor Wu {"O074", "I048 Switch", "I048"}, 11901de9a54aSTrevor Wu {"O075", "I049 Switch", "I049"}, 11911de9a54aSTrevor Wu {"O076", "I050 Switch", "I050"}, 11921de9a54aSTrevor Wu {"O077", "I051 Switch", "I051"}, 11931de9a54aSTrevor Wu {"O078", "I052 Switch", "I052"}, 11941de9a54aSTrevor Wu {"O079", "I053 Switch", "I053"}, 11951de9a54aSTrevor Wu {"O080", "I054 Switch", "I054"}, 11961de9a54aSTrevor Wu {"O081", "I055 Switch", "I055"}, 11971de9a54aSTrevor Wu {"O082", "I056 Switch", "I056"}, 11981de9a54aSTrevor Wu {"O083", "I057 Switch", "I057"}, 11991de9a54aSTrevor Wu {"O084", "I058 Switch", "I058"}, 12001de9a54aSTrevor Wu {"O085", "I059 Switch", "I059"}, 12011de9a54aSTrevor Wu {"O086", "I060 Switch", "I060"}, 12021de9a54aSTrevor Wu {"O087", "I061 Switch", "I061"}, 12031de9a54aSTrevor Wu {"O088", "I062 Switch", "I062"}, 12041de9a54aSTrevor Wu {"O089", "I063 Switch", "I063"}, 12051de9a54aSTrevor Wu {"O090", "I064 Switch", "I064"}, 12061de9a54aSTrevor Wu {"O091", "I065 Switch", "I065"}, 12071de9a54aSTrevor Wu {"O092", "I066 Switch", "I066"}, 12081de9a54aSTrevor Wu {"O093", "I067 Switch", "I067"}, 12091de9a54aSTrevor Wu {"O094", "I068 Switch", "I068"}, 12101de9a54aSTrevor Wu {"O095", "I069 Switch", "I069"}, 12111de9a54aSTrevor Wu 12121de9a54aSTrevor Wu {"O072", "I070 Switch", "I070"}, 12131de9a54aSTrevor Wu {"O073", "I071 Switch", "I071"}, 12141de9a54aSTrevor Wu 12151de9a54aSTrevor Wu {"HDMI_CH0_MUX", "CH0", "DL10"}, 12161de9a54aSTrevor Wu {"HDMI_CH0_MUX", "CH1", "DL10"}, 12171de9a54aSTrevor Wu {"HDMI_CH0_MUX", "CH2", "DL10"}, 12181de9a54aSTrevor Wu {"HDMI_CH0_MUX", "CH3", "DL10"}, 12191de9a54aSTrevor Wu {"HDMI_CH0_MUX", "CH4", "DL10"}, 12201de9a54aSTrevor Wu {"HDMI_CH0_MUX", "CH5", "DL10"}, 12211de9a54aSTrevor Wu {"HDMI_CH0_MUX", "CH6", "DL10"}, 12221de9a54aSTrevor Wu {"HDMI_CH0_MUX", "CH7", "DL10"}, 12231de9a54aSTrevor Wu 12241de9a54aSTrevor Wu {"HDMI_CH1_MUX", "CH0", "DL10"}, 12251de9a54aSTrevor Wu {"HDMI_CH1_MUX", "CH1", "DL10"}, 12261de9a54aSTrevor Wu {"HDMI_CH1_MUX", "CH2", "DL10"}, 12271de9a54aSTrevor Wu {"HDMI_CH1_MUX", "CH3", "DL10"}, 12281de9a54aSTrevor Wu {"HDMI_CH1_MUX", "CH4", "DL10"}, 12291de9a54aSTrevor Wu {"HDMI_CH1_MUX", "CH5", "DL10"}, 12301de9a54aSTrevor Wu {"HDMI_CH1_MUX", "CH6", "DL10"}, 12311de9a54aSTrevor Wu {"HDMI_CH1_MUX", "CH7", "DL10"}, 12321de9a54aSTrevor Wu 12331de9a54aSTrevor Wu {"HDMI_CH2_MUX", "CH0", "DL10"}, 12341de9a54aSTrevor Wu {"HDMI_CH2_MUX", "CH1", "DL10"}, 12351de9a54aSTrevor Wu {"HDMI_CH2_MUX", "CH2", "DL10"}, 12361de9a54aSTrevor Wu {"HDMI_CH2_MUX", "CH3", "DL10"}, 12371de9a54aSTrevor Wu {"HDMI_CH2_MUX", "CH4", "DL10"}, 12381de9a54aSTrevor Wu {"HDMI_CH2_MUX", "CH5", "DL10"}, 12391de9a54aSTrevor Wu {"HDMI_CH2_MUX", "CH6", "DL10"}, 12401de9a54aSTrevor Wu {"HDMI_CH2_MUX", "CH7", "DL10"}, 12411de9a54aSTrevor Wu 12421de9a54aSTrevor Wu {"HDMI_CH3_MUX", "CH0", "DL10"}, 12431de9a54aSTrevor Wu {"HDMI_CH3_MUX", "CH1", "DL10"}, 12441de9a54aSTrevor Wu {"HDMI_CH3_MUX", "CH2", "DL10"}, 12451de9a54aSTrevor Wu {"HDMI_CH3_MUX", "CH3", "DL10"}, 12461de9a54aSTrevor Wu {"HDMI_CH3_MUX", "CH4", "DL10"}, 12471de9a54aSTrevor Wu {"HDMI_CH3_MUX", "CH5", "DL10"}, 12481de9a54aSTrevor Wu {"HDMI_CH3_MUX", "CH6", "DL10"}, 12491de9a54aSTrevor Wu {"HDMI_CH3_MUX", "CH7", "DL10"}, 12501de9a54aSTrevor Wu 12511de9a54aSTrevor Wu {"HDMI_CH4_MUX", "CH0", "DL10"}, 12521de9a54aSTrevor Wu {"HDMI_CH4_MUX", "CH1", "DL10"}, 12531de9a54aSTrevor Wu {"HDMI_CH4_MUX", "CH2", "DL10"}, 12541de9a54aSTrevor Wu {"HDMI_CH4_MUX", "CH3", "DL10"}, 12551de9a54aSTrevor Wu {"HDMI_CH4_MUX", "CH4", "DL10"}, 12561de9a54aSTrevor Wu {"HDMI_CH4_MUX", "CH5", "DL10"}, 12571de9a54aSTrevor Wu {"HDMI_CH4_MUX", "CH6", "DL10"}, 12581de9a54aSTrevor Wu {"HDMI_CH4_MUX", "CH7", "DL10"}, 12591de9a54aSTrevor Wu 12601de9a54aSTrevor Wu {"HDMI_CH5_MUX", "CH0", "DL10"}, 12611de9a54aSTrevor Wu {"HDMI_CH5_MUX", "CH1", "DL10"}, 12621de9a54aSTrevor Wu {"HDMI_CH5_MUX", "CH2", "DL10"}, 12631de9a54aSTrevor Wu {"HDMI_CH5_MUX", "CH3", "DL10"}, 12641de9a54aSTrevor Wu {"HDMI_CH5_MUX", "CH4", "DL10"}, 12651de9a54aSTrevor Wu {"HDMI_CH5_MUX", "CH5", "DL10"}, 12661de9a54aSTrevor Wu {"HDMI_CH5_MUX", "CH6", "DL10"}, 12671de9a54aSTrevor Wu {"HDMI_CH5_MUX", "CH7", "DL10"}, 12681de9a54aSTrevor Wu 12691de9a54aSTrevor Wu {"HDMI_CH6_MUX", "CH0", "DL10"}, 12701de9a54aSTrevor Wu {"HDMI_CH6_MUX", "CH1", "DL10"}, 12711de9a54aSTrevor Wu {"HDMI_CH6_MUX", "CH2", "DL10"}, 12721de9a54aSTrevor Wu {"HDMI_CH6_MUX", "CH3", "DL10"}, 12731de9a54aSTrevor Wu {"HDMI_CH6_MUX", "CH4", "DL10"}, 12741de9a54aSTrevor Wu {"HDMI_CH6_MUX", "CH5", "DL10"}, 12751de9a54aSTrevor Wu {"HDMI_CH6_MUX", "CH6", "DL10"}, 12761de9a54aSTrevor Wu {"HDMI_CH6_MUX", "CH7", "DL10"}, 12771de9a54aSTrevor Wu 12781de9a54aSTrevor Wu {"HDMI_CH7_MUX", "CH0", "DL10"}, 12791de9a54aSTrevor Wu {"HDMI_CH7_MUX", "CH1", "DL10"}, 12801de9a54aSTrevor Wu {"HDMI_CH7_MUX", "CH2", "DL10"}, 12811de9a54aSTrevor Wu {"HDMI_CH7_MUX", "CH3", "DL10"}, 12821de9a54aSTrevor Wu {"HDMI_CH7_MUX", "CH4", "DL10"}, 12831de9a54aSTrevor Wu {"HDMI_CH7_MUX", "CH5", "DL10"}, 12841de9a54aSTrevor Wu {"HDMI_CH7_MUX", "CH6", "DL10"}, 12851de9a54aSTrevor Wu {"HDMI_CH7_MUX", "CH7", "DL10"}, 12861de9a54aSTrevor Wu 12871de9a54aSTrevor Wu {"HDMI_OUT_MUX", "Connect", "HDMI_CH0_MUX"}, 12881de9a54aSTrevor Wu {"HDMI_OUT_MUX", "Connect", "HDMI_CH1_MUX"}, 12891de9a54aSTrevor Wu {"HDMI_OUT_MUX", "Connect", "HDMI_CH2_MUX"}, 12901de9a54aSTrevor Wu {"HDMI_OUT_MUX", "Connect", "HDMI_CH3_MUX"}, 12911de9a54aSTrevor Wu {"HDMI_OUT_MUX", "Connect", "HDMI_CH4_MUX"}, 12921de9a54aSTrevor Wu {"HDMI_OUT_MUX", "Connect", "HDMI_CH5_MUX"}, 12931de9a54aSTrevor Wu {"HDMI_OUT_MUX", "Connect", "HDMI_CH6_MUX"}, 12941de9a54aSTrevor Wu {"HDMI_OUT_MUX", "Connect", "HDMI_CH7_MUX"}, 12951de9a54aSTrevor Wu 12961de9a54aSTrevor Wu {"DPTX_OUT_MUX", "Connect", "HDMI_CH0_MUX"}, 12971de9a54aSTrevor Wu {"DPTX_OUT_MUX", "Connect", "HDMI_CH1_MUX"}, 12981de9a54aSTrevor Wu {"DPTX_OUT_MUX", "Connect", "HDMI_CH2_MUX"}, 12991de9a54aSTrevor Wu {"DPTX_OUT_MUX", "Connect", "HDMI_CH3_MUX"}, 13001de9a54aSTrevor Wu {"DPTX_OUT_MUX", "Connect", "HDMI_CH4_MUX"}, 13011de9a54aSTrevor Wu {"DPTX_OUT_MUX", "Connect", "HDMI_CH5_MUX"}, 13021de9a54aSTrevor Wu {"DPTX_OUT_MUX", "Connect", "HDMI_CH6_MUX"}, 13031de9a54aSTrevor Wu {"DPTX_OUT_MUX", "Connect", "HDMI_CH7_MUX"}, 13041de9a54aSTrevor Wu 13051de9a54aSTrevor Wu {"ETDM3 Playback", NULL, "HDMI_OUT_MUX"}, 13061de9a54aSTrevor Wu {"DPTX Playback", NULL, "DPTX_OUT_MUX"}, 13071de9a54aSTrevor Wu 13081de9a54aSTrevor Wu {"ETDM_OUTPUT", NULL, "DPTX Playback"}, 13091de9a54aSTrevor Wu {"ETDM_OUTPUT", NULL, "ETDM1 Playback"}, 13101de9a54aSTrevor Wu {"ETDM_OUTPUT", NULL, "ETDM2 Playback"}, 13111de9a54aSTrevor Wu {"ETDM_OUTPUT", NULL, "ETDM3 Playback"}, 13121de9a54aSTrevor Wu {"ETDM1 Capture", NULL, "ETDM_INPUT"}, 13131de9a54aSTrevor Wu {"ETDM2 Capture", NULL, "ETDM_INPUT"}, 13141de9a54aSTrevor Wu }; 13151de9a54aSTrevor Wu 13161de9a54aSTrevor Wu static int mt8195_afe_enable_etdm(struct mtk_base_afe *afe, int dai_id) 13171de9a54aSTrevor Wu { 13181de9a54aSTrevor Wu int ret = 0; 13191de9a54aSTrevor Wu struct etdm_con_reg etdm_reg; 13201de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 1321ff728899STrevor Wu struct mtk_dai_etdm_priv *etdm_data; 13221de9a54aSTrevor Wu unsigned long flags; 13231de9a54aSTrevor Wu 1324ff728899STrevor Wu if (!mt8195_afe_etdm_is_valid(dai_id)) 1325ff728899STrevor Wu return -EINVAL; 1326ff728899STrevor Wu 1327ff728899STrevor Wu etdm_data = afe_priv->dai_priv[dai_id]; 13281de9a54aSTrevor Wu spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags); 13291de9a54aSTrevor Wu etdm_data->en_ref_cnt++; 13301de9a54aSTrevor Wu if (etdm_data->en_ref_cnt == 1) { 13311de9a54aSTrevor Wu ret = get_etdm_reg(dai_id, &etdm_reg); 13321de9a54aSTrevor Wu if (ret < 0) 13331de9a54aSTrevor Wu goto out; 13341de9a54aSTrevor Wu 13351de9a54aSTrevor Wu regmap_update_bits(afe->regmap, etdm_reg.con0, 13361de9a54aSTrevor Wu ETDM_CON0_EN, ETDM_CON0_EN); 13371de9a54aSTrevor Wu } 13381de9a54aSTrevor Wu out: 13391de9a54aSTrevor Wu spin_unlock_irqrestore(&afe_priv->afe_ctrl_lock, flags); 13401de9a54aSTrevor Wu return ret; 13411de9a54aSTrevor Wu } 13421de9a54aSTrevor Wu 13431de9a54aSTrevor Wu static int mt8195_afe_disable_etdm(struct mtk_base_afe *afe, int dai_id) 13441de9a54aSTrevor Wu { 13451de9a54aSTrevor Wu int ret = 0; 13461de9a54aSTrevor Wu struct etdm_con_reg etdm_reg; 13471de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 1348ff728899STrevor Wu struct mtk_dai_etdm_priv *etdm_data; 13491de9a54aSTrevor Wu unsigned long flags; 13501de9a54aSTrevor Wu 1351ff728899STrevor Wu if (!mt8195_afe_etdm_is_valid(dai_id)) 1352ff728899STrevor Wu return -EINVAL; 1353ff728899STrevor Wu 1354ff728899STrevor Wu etdm_data = afe_priv->dai_priv[dai_id]; 13551de9a54aSTrevor Wu spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags); 13561de9a54aSTrevor Wu if (etdm_data->en_ref_cnt > 0) { 13571de9a54aSTrevor Wu etdm_data->en_ref_cnt--; 13581de9a54aSTrevor Wu if (etdm_data->en_ref_cnt == 0) { 13591de9a54aSTrevor Wu ret = get_etdm_reg(dai_id, &etdm_reg); 13601de9a54aSTrevor Wu if (ret < 0) 13611de9a54aSTrevor Wu goto out; 13621de9a54aSTrevor Wu 13631de9a54aSTrevor Wu regmap_update_bits(afe->regmap, etdm_reg.con0, 13641de9a54aSTrevor Wu ETDM_CON0_EN, 0); 13651de9a54aSTrevor Wu } 13661de9a54aSTrevor Wu } 13671de9a54aSTrevor Wu out: 13681de9a54aSTrevor Wu spin_unlock_irqrestore(&afe_priv->afe_ctrl_lock, flags); 1369439c06f3SPierre-Louis Bossart return ret; 13701de9a54aSTrevor Wu } 13711de9a54aSTrevor Wu 13721de9a54aSTrevor Wu static int etdm_cowork_slv_sel(int id, int slave_mode) 13731de9a54aSTrevor Wu { 13741de9a54aSTrevor Wu if (slave_mode) { 13751de9a54aSTrevor Wu switch (id) { 13761de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM1_IN: 13771de9a54aSTrevor Wu return COWORK_ETDM_IN1_S; 13781de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM2_IN: 13791de9a54aSTrevor Wu return COWORK_ETDM_IN2_S; 13801de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM1_OUT: 13811de9a54aSTrevor Wu return COWORK_ETDM_OUT1_S; 13821de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM2_OUT: 13831de9a54aSTrevor Wu return COWORK_ETDM_OUT2_S; 13841de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM3_OUT: 13851de9a54aSTrevor Wu return COWORK_ETDM_OUT3_S; 13861de9a54aSTrevor Wu default: 13871de9a54aSTrevor Wu return -EINVAL; 13881de9a54aSTrevor Wu } 13891de9a54aSTrevor Wu } else { 13901de9a54aSTrevor Wu switch (id) { 13911de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM1_IN: 13921de9a54aSTrevor Wu return COWORK_ETDM_IN1_M; 13931de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM2_IN: 13941de9a54aSTrevor Wu return COWORK_ETDM_IN2_M; 13951de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM1_OUT: 13961de9a54aSTrevor Wu return COWORK_ETDM_OUT1_M; 13971de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM2_OUT: 13981de9a54aSTrevor Wu return COWORK_ETDM_OUT2_M; 13991de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM3_OUT: 14001de9a54aSTrevor Wu return COWORK_ETDM_OUT3_M; 14011de9a54aSTrevor Wu default: 14021de9a54aSTrevor Wu return -EINVAL; 14031de9a54aSTrevor Wu } 14041de9a54aSTrevor Wu } 14051de9a54aSTrevor Wu } 14061de9a54aSTrevor Wu 14071de9a54aSTrevor Wu static int mt8195_etdm_sync_mode_configure(struct mtk_base_afe *afe, int dai_id) 14081de9a54aSTrevor Wu { 14091de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 1410ff728899STrevor Wu struct mtk_dai_etdm_priv *etdm_data; 14111de9a54aSTrevor Wu unsigned int reg = 0; 14121de9a54aSTrevor Wu unsigned int mask; 14131de9a54aSTrevor Wu unsigned int val; 14141de9a54aSTrevor Wu int cowork_source_sel; 14151de9a54aSTrevor Wu 1416ff728899STrevor Wu if (!mt8195_afe_etdm_is_valid(dai_id)) 1417ff728899STrevor Wu return -EINVAL; 1418ff728899STrevor Wu 1419ff728899STrevor Wu etdm_data = afe_priv->dai_priv[dai_id]; 14201de9a54aSTrevor Wu if (etdm_data->cowork_source_id == COWORK_ETDM_NONE) 14211de9a54aSTrevor Wu return 0; 14221de9a54aSTrevor Wu 14231de9a54aSTrevor Wu cowork_source_sel = etdm_cowork_slv_sel(etdm_data->cowork_source_id, 14241de9a54aSTrevor Wu etdm_data->slave_mode); 14251de9a54aSTrevor Wu if (cowork_source_sel < 0) 14261de9a54aSTrevor Wu return cowork_source_sel; 14271de9a54aSTrevor Wu 14281de9a54aSTrevor Wu switch (dai_id) { 14291de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM1_IN: 14301de9a54aSTrevor Wu reg = ETDM_COWORK_CON1; 14311de9a54aSTrevor Wu mask = ETDM_IN1_SLAVE_SEL_MASK; 14321de9a54aSTrevor Wu val = ETDM_IN1_SLAVE_SEL(cowork_source_sel); 14331de9a54aSTrevor Wu break; 14341de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM2_IN: 14351de9a54aSTrevor Wu reg = ETDM_COWORK_CON2; 14361de9a54aSTrevor Wu mask = ETDM_IN2_SLAVE_SEL_MASK; 14371de9a54aSTrevor Wu val = ETDM_IN2_SLAVE_SEL(cowork_source_sel); 14381de9a54aSTrevor Wu break; 14391de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM1_OUT: 14401de9a54aSTrevor Wu reg = ETDM_COWORK_CON0; 14411de9a54aSTrevor Wu mask = ETDM_OUT1_SLAVE_SEL_MASK; 14421de9a54aSTrevor Wu val = ETDM_OUT1_SLAVE_SEL(cowork_source_sel); 14431de9a54aSTrevor Wu break; 14441de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM2_OUT: 14451de9a54aSTrevor Wu reg = ETDM_COWORK_CON2; 14461de9a54aSTrevor Wu mask = ETDM_OUT2_SLAVE_SEL_MASK; 14471de9a54aSTrevor Wu val = ETDM_OUT2_SLAVE_SEL(cowork_source_sel); 14481de9a54aSTrevor Wu break; 14491de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM3_OUT: 14501de9a54aSTrevor Wu reg = ETDM_COWORK_CON2; 14511de9a54aSTrevor Wu mask = ETDM_OUT3_SLAVE_SEL_MASK; 14521de9a54aSTrevor Wu val = ETDM_OUT3_SLAVE_SEL(cowork_source_sel); 14531de9a54aSTrevor Wu break; 14541de9a54aSTrevor Wu default: 14551de9a54aSTrevor Wu return 0; 14561de9a54aSTrevor Wu } 14571de9a54aSTrevor Wu 14581de9a54aSTrevor Wu regmap_update_bits(afe->regmap, reg, mask, val); 14591de9a54aSTrevor Wu 14601de9a54aSTrevor Wu return 0; 14611de9a54aSTrevor Wu } 14621de9a54aSTrevor Wu 14631de9a54aSTrevor Wu static int mtk_dai_etdm_get_cg_id_by_dai_id(int dai_id) 14641de9a54aSTrevor Wu { 14651de9a54aSTrevor Wu int cg_id = -1; 14661de9a54aSTrevor Wu 14671de9a54aSTrevor Wu switch (dai_id) { 14681de9a54aSTrevor Wu case MT8195_AFE_IO_DPTX: 14691de9a54aSTrevor Wu cg_id = MT8195_CLK_AUD_HDMI_OUT; 14701de9a54aSTrevor Wu break; 14711de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM1_IN: 14721de9a54aSTrevor Wu cg_id = MT8195_CLK_AUD_TDM_IN; 14731de9a54aSTrevor Wu break; 14741de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM2_IN: 14751de9a54aSTrevor Wu cg_id = MT8195_CLK_AUD_I2SIN; 14761de9a54aSTrevor Wu break; 14771de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM1_OUT: 14781de9a54aSTrevor Wu cg_id = MT8195_CLK_AUD_TDM_OUT; 14791de9a54aSTrevor Wu break; 14801de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM2_OUT: 14811de9a54aSTrevor Wu cg_id = MT8195_CLK_AUD_I2S_OUT; 14821de9a54aSTrevor Wu break; 14831de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM3_OUT: 14841de9a54aSTrevor Wu cg_id = MT8195_CLK_AUD_HDMI_OUT; 14851de9a54aSTrevor Wu break; 14861de9a54aSTrevor Wu default: 14871de9a54aSTrevor Wu break; 14881de9a54aSTrevor Wu } 14891de9a54aSTrevor Wu 14901de9a54aSTrevor Wu return cg_id; 14911de9a54aSTrevor Wu } 14921de9a54aSTrevor Wu 14931de9a54aSTrevor Wu static int mtk_dai_etdm_get_clk_id_by_dai_id(int dai_id) 14941de9a54aSTrevor Wu { 14951de9a54aSTrevor Wu int clk_id = -1; 14961de9a54aSTrevor Wu 14971de9a54aSTrevor Wu switch (dai_id) { 14981de9a54aSTrevor Wu case MT8195_AFE_IO_DPTX: 14991de9a54aSTrevor Wu clk_id = MT8195_CLK_TOP_DPTX_M_SEL; 15001de9a54aSTrevor Wu break; 15011de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM1_IN: 15021de9a54aSTrevor Wu clk_id = MT8195_CLK_TOP_I2SI1_M_SEL; 15031de9a54aSTrevor Wu break; 15041de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM2_IN: 15051de9a54aSTrevor Wu clk_id = MT8195_CLK_TOP_I2SI2_M_SEL; 15061de9a54aSTrevor Wu break; 15071de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM1_OUT: 15081de9a54aSTrevor Wu clk_id = MT8195_CLK_TOP_I2SO1_M_SEL; 15091de9a54aSTrevor Wu break; 15101de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM2_OUT: 15111de9a54aSTrevor Wu clk_id = MT8195_CLK_TOP_I2SO2_M_SEL; 15121de9a54aSTrevor Wu break; 15131de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM3_OUT: 15141de9a54aSTrevor Wu default: 15151de9a54aSTrevor Wu break; 15161de9a54aSTrevor Wu } 15171de9a54aSTrevor Wu 15181de9a54aSTrevor Wu return clk_id; 15191de9a54aSTrevor Wu } 15201de9a54aSTrevor Wu 15211de9a54aSTrevor Wu static int mtk_dai_etdm_get_clkdiv_id_by_dai_id(int dai_id) 15221de9a54aSTrevor Wu { 15231de9a54aSTrevor Wu int clk_id = -1; 15241de9a54aSTrevor Wu 15251de9a54aSTrevor Wu switch (dai_id) { 15261de9a54aSTrevor Wu case MT8195_AFE_IO_DPTX: 15271de9a54aSTrevor Wu clk_id = MT8195_CLK_TOP_APLL12_DIV9; 15281de9a54aSTrevor Wu break; 15291de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM1_IN: 15301de9a54aSTrevor Wu clk_id = MT8195_CLK_TOP_APLL12_DIV0; 15311de9a54aSTrevor Wu break; 15321de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM2_IN: 15331de9a54aSTrevor Wu clk_id = MT8195_CLK_TOP_APLL12_DIV1; 15341de9a54aSTrevor Wu break; 15351de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM1_OUT: 15361de9a54aSTrevor Wu clk_id = MT8195_CLK_TOP_APLL12_DIV2; 15371de9a54aSTrevor Wu break; 15381de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM2_OUT: 15391de9a54aSTrevor Wu clk_id = MT8195_CLK_TOP_APLL12_DIV3; 15401de9a54aSTrevor Wu break; 15411de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM3_OUT: 15421de9a54aSTrevor Wu default: 15431de9a54aSTrevor Wu break; 15441de9a54aSTrevor Wu } 15451de9a54aSTrevor Wu 15461de9a54aSTrevor Wu return clk_id; 15471de9a54aSTrevor Wu } 15481de9a54aSTrevor Wu 15491de9a54aSTrevor Wu static int mtk_dai_etdm_enable_mclk(struct mtk_base_afe *afe, int dai_id) 15501de9a54aSTrevor Wu { 15511de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 15521de9a54aSTrevor Wu int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id); 15531de9a54aSTrevor Wu 15541de9a54aSTrevor Wu if (clkdiv_id < 0) 15551de9a54aSTrevor Wu return -EINVAL; 15561de9a54aSTrevor Wu 15571de9a54aSTrevor Wu mt8195_afe_enable_clk(afe, afe_priv->clk[clkdiv_id]); 15581de9a54aSTrevor Wu 15591de9a54aSTrevor Wu return 0; 15601de9a54aSTrevor Wu } 15611de9a54aSTrevor Wu 15621de9a54aSTrevor Wu static int mtk_dai_etdm_disable_mclk(struct mtk_base_afe *afe, int dai_id) 15631de9a54aSTrevor Wu { 15641de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 15651de9a54aSTrevor Wu int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id); 15661de9a54aSTrevor Wu 15671de9a54aSTrevor Wu if (clkdiv_id < 0) 15681de9a54aSTrevor Wu return -EINVAL; 15691de9a54aSTrevor Wu 15701de9a54aSTrevor Wu mt8195_afe_disable_clk(afe, afe_priv->clk[clkdiv_id]); 15711de9a54aSTrevor Wu 15721de9a54aSTrevor Wu return 0; 15731de9a54aSTrevor Wu } 15741de9a54aSTrevor Wu 15751de9a54aSTrevor Wu /* dai ops */ 15761de9a54aSTrevor Wu static int mtk_dai_etdm_startup(struct snd_pcm_substream *substream, 15771de9a54aSTrevor Wu struct snd_soc_dai *dai) 15781de9a54aSTrevor Wu { 15791de9a54aSTrevor Wu struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 15801de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 15811de9a54aSTrevor Wu struct mtk_dai_etdm_priv *mst_etdm_data; 15821de9a54aSTrevor Wu int cg_id; 15831de9a54aSTrevor Wu int mst_dai_id; 15841de9a54aSTrevor Wu int slv_dai_id; 15851de9a54aSTrevor Wu int i; 15861de9a54aSTrevor Wu 15871de9a54aSTrevor Wu if (is_cowork_mode(dai)) { 15881de9a54aSTrevor Wu mst_dai_id = get_etdm_cowork_master_id(dai); 1589ff728899STrevor Wu if (!mt8195_afe_etdm_is_valid(mst_dai_id)) 1590ff728899STrevor Wu return -EINVAL; 15911de9a54aSTrevor Wu 1592ff728899STrevor Wu mtk_dai_etdm_enable_mclk(afe, mst_dai_id); 15931de9a54aSTrevor Wu cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(mst_dai_id); 15941de9a54aSTrevor Wu if (cg_id >= 0) 15951de9a54aSTrevor Wu mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]); 15961de9a54aSTrevor Wu 15971de9a54aSTrevor Wu mst_etdm_data = afe_priv->dai_priv[mst_dai_id]; 15981de9a54aSTrevor Wu 15991de9a54aSTrevor Wu for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) { 16001de9a54aSTrevor Wu slv_dai_id = mst_etdm_data->cowork_slv_id[i]; 16011de9a54aSTrevor Wu cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(slv_dai_id); 16021de9a54aSTrevor Wu if (cg_id >= 0) 16031de9a54aSTrevor Wu mt8195_afe_enable_clk(afe, 16041de9a54aSTrevor Wu afe_priv->clk[cg_id]); 16051de9a54aSTrevor Wu } 16061de9a54aSTrevor Wu } else { 16071de9a54aSTrevor Wu mtk_dai_etdm_enable_mclk(afe, dai->id); 16081de9a54aSTrevor Wu 16091de9a54aSTrevor Wu cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id); 16101de9a54aSTrevor Wu if (cg_id >= 0) 16111de9a54aSTrevor Wu mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]); 16121de9a54aSTrevor Wu } 16131de9a54aSTrevor Wu 16141de9a54aSTrevor Wu return 0; 16151de9a54aSTrevor Wu } 16161de9a54aSTrevor Wu 16171de9a54aSTrevor Wu static void mtk_dai_etdm_shutdown(struct snd_pcm_substream *substream, 16181de9a54aSTrevor Wu struct snd_soc_dai *dai) 16191de9a54aSTrevor Wu { 16201de9a54aSTrevor Wu struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 16211de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 16221de9a54aSTrevor Wu struct mtk_dai_etdm_priv *mst_etdm_data; 16231de9a54aSTrevor Wu int cg_id; 16241de9a54aSTrevor Wu int mst_dai_id; 16251de9a54aSTrevor Wu int slv_dai_id; 16261de9a54aSTrevor Wu int i; 16271de9a54aSTrevor Wu 16281de9a54aSTrevor Wu if (is_cowork_mode(dai)) { 16291de9a54aSTrevor Wu mst_dai_id = get_etdm_cowork_master_id(dai); 1630ff728899STrevor Wu if (!mt8195_afe_etdm_is_valid(mst_dai_id)) 1631ff728899STrevor Wu return; 1632ff728899STrevor Wu 16331de9a54aSTrevor Wu cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(mst_dai_id); 16341de9a54aSTrevor Wu if (cg_id >= 0) 16351de9a54aSTrevor Wu mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]); 16361de9a54aSTrevor Wu 16371de9a54aSTrevor Wu mst_etdm_data = afe_priv->dai_priv[mst_dai_id]; 16381de9a54aSTrevor Wu for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) { 16391de9a54aSTrevor Wu slv_dai_id = mst_etdm_data->cowork_slv_id[i]; 16401de9a54aSTrevor Wu cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(slv_dai_id); 16411de9a54aSTrevor Wu if (cg_id >= 0) 16421de9a54aSTrevor Wu mt8195_afe_disable_clk(afe, 16431de9a54aSTrevor Wu afe_priv->clk[cg_id]); 16441de9a54aSTrevor Wu } 16451de9a54aSTrevor Wu mtk_dai_etdm_disable_mclk(afe, mst_dai_id); 16461de9a54aSTrevor Wu } else { 16471de9a54aSTrevor Wu cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id); 16481de9a54aSTrevor Wu if (cg_id >= 0) 16491de9a54aSTrevor Wu mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]); 16501de9a54aSTrevor Wu 16511de9a54aSTrevor Wu mtk_dai_etdm_disable_mclk(afe, dai->id); 16521de9a54aSTrevor Wu } 16531de9a54aSTrevor Wu } 16541de9a54aSTrevor Wu 16551de9a54aSTrevor Wu static int mtk_dai_etdm_fifo_mode(struct mtk_base_afe *afe, 16561de9a54aSTrevor Wu int dai_id, unsigned int rate) 16571de9a54aSTrevor Wu { 16581de9a54aSTrevor Wu unsigned int mode = 0; 16591de9a54aSTrevor Wu unsigned int reg = 0; 16601de9a54aSTrevor Wu unsigned int val = 0; 16611de9a54aSTrevor Wu unsigned int mask = (ETDM_IN_AFIFO_MODE_MASK | ETDM_IN_USE_AFIFO); 16621de9a54aSTrevor Wu 16631de9a54aSTrevor Wu if (rate != 0) 16641de9a54aSTrevor Wu mode = mt8195_afe_fs_timing(rate); 16651de9a54aSTrevor Wu 16661de9a54aSTrevor Wu switch (dai_id) { 16671de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM1_IN: 16681de9a54aSTrevor Wu reg = ETDM_IN1_AFIFO_CON; 16691de9a54aSTrevor Wu if (rate == 0) 16701de9a54aSTrevor Wu mode = MT8195_ETDM_IN1_1X_EN; 16711de9a54aSTrevor Wu break; 16721de9a54aSTrevor Wu case MT8195_AFE_IO_ETDM2_IN: 16731de9a54aSTrevor Wu reg = ETDM_IN2_AFIFO_CON; 16741de9a54aSTrevor Wu if (rate == 0) 16751de9a54aSTrevor Wu mode = MT8195_ETDM_IN2_1X_EN; 16761de9a54aSTrevor Wu break; 16771de9a54aSTrevor Wu default: 16781de9a54aSTrevor Wu return -EINVAL; 16791de9a54aSTrevor Wu } 16801de9a54aSTrevor Wu 16811de9a54aSTrevor Wu val = (mode | ETDM_IN_USE_AFIFO); 16821de9a54aSTrevor Wu 16831de9a54aSTrevor Wu regmap_update_bits(afe->regmap, reg, mask, val); 16841de9a54aSTrevor Wu return 0; 16851de9a54aSTrevor Wu } 16861de9a54aSTrevor Wu 16871de9a54aSTrevor Wu static int mtk_dai_etdm_in_configure(struct mtk_base_afe *afe, 16881de9a54aSTrevor Wu unsigned int rate, 16891de9a54aSTrevor Wu unsigned int channels, 16901de9a54aSTrevor Wu int dai_id) 16911de9a54aSTrevor Wu { 16921de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 1693ff728899STrevor Wu struct mtk_dai_etdm_priv *etdm_data; 16941de9a54aSTrevor Wu struct etdm_con_reg etdm_reg; 1695ff728899STrevor Wu bool slave_mode; 1696ff728899STrevor Wu unsigned int data_mode; 1697ff728899STrevor Wu unsigned int lrck_width; 16981de9a54aSTrevor Wu unsigned int val = 0; 16991de9a54aSTrevor Wu unsigned int mask = 0; 17001de9a54aSTrevor Wu int i; 17011de9a54aSTrevor Wu int ret; 17021de9a54aSTrevor Wu 1703ff728899STrevor Wu if (!mt8195_afe_etdm_is_valid(dai_id)) 1704ff728899STrevor Wu return -EINVAL; 1705ff728899STrevor Wu 1706ff728899STrevor Wu etdm_data = afe_priv->dai_priv[dai_id]; 1707ff728899STrevor Wu slave_mode = etdm_data->slave_mode; 1708ff728899STrevor Wu data_mode = etdm_data->data_mode; 1709ff728899STrevor Wu lrck_width = etdm_data->lrck_width; 1710ff728899STrevor Wu 17111de9a54aSTrevor Wu dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n", 17121de9a54aSTrevor Wu __func__, rate, channels, dai_id); 17131de9a54aSTrevor Wu 17141de9a54aSTrevor Wu ret = get_etdm_reg(dai_id, &etdm_reg); 17151de9a54aSTrevor Wu if (ret < 0) 17161de9a54aSTrevor Wu return ret; 17171de9a54aSTrevor Wu 17181de9a54aSTrevor Wu if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) 17191de9a54aSTrevor Wu slave_mode = true; 17201de9a54aSTrevor Wu 17211de9a54aSTrevor Wu /* afifo */ 17221de9a54aSTrevor Wu if (slave_mode) 17231de9a54aSTrevor Wu mtk_dai_etdm_fifo_mode(afe, dai_id, 0); 17241de9a54aSTrevor Wu else 17251de9a54aSTrevor Wu mtk_dai_etdm_fifo_mode(afe, dai_id, rate); 17261de9a54aSTrevor Wu 17271de9a54aSTrevor Wu /* con1 */ 17281de9a54aSTrevor Wu if (lrck_width > 0) { 17291de9a54aSTrevor Wu mask |= (ETDM_IN_CON1_LRCK_AUTO_MODE | 17301de9a54aSTrevor Wu ETDM_IN_CON1_LRCK_WIDTH_MASK); 17311de9a54aSTrevor Wu val |= ETDM_IN_CON1_LRCK_WIDTH(lrck_width); 17321de9a54aSTrevor Wu } 17331de9a54aSTrevor Wu regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val); 17341de9a54aSTrevor Wu 17351de9a54aSTrevor Wu mask = 0; 17361de9a54aSTrevor Wu val = 0; 17371de9a54aSTrevor Wu 17381de9a54aSTrevor Wu /* con2 */ 17391de9a54aSTrevor Wu if (!slave_mode) { 17401de9a54aSTrevor Wu mask |= ETDM_IN_CON2_UPDATE_GAP_MASK; 17411de9a54aSTrevor Wu if (rate == 352800 || rate == 384000) 17421de9a54aSTrevor Wu val |= ETDM_IN_CON2_UPDATE_GAP(4); 17431de9a54aSTrevor Wu else 17441de9a54aSTrevor Wu val |= ETDM_IN_CON2_UPDATE_GAP(3); 17451de9a54aSTrevor Wu } 17461de9a54aSTrevor Wu mask |= (ETDM_IN_CON2_MULTI_IP_2CH_MODE | 17471de9a54aSTrevor Wu ETDM_IN_CON2_MULTI_IP_TOTAL_CH_MASK); 17481de9a54aSTrevor Wu if (data_mode == MTK_DAI_ETDM_DATA_MULTI_PIN) { 17491de9a54aSTrevor Wu val |= ETDM_IN_CON2_MULTI_IP_2CH_MODE | 17501de9a54aSTrevor Wu ETDM_IN_CON2_MULTI_IP_TOTAL_CH(channels); 17511de9a54aSTrevor Wu } 17521de9a54aSTrevor Wu regmap_update_bits(afe->regmap, etdm_reg.con2, mask, val); 17531de9a54aSTrevor Wu 17541de9a54aSTrevor Wu mask = 0; 17551de9a54aSTrevor Wu val = 0; 17561de9a54aSTrevor Wu 17571de9a54aSTrevor Wu /* con3 */ 17581de9a54aSTrevor Wu mask |= ETDM_IN_CON3_DISABLE_OUT_MASK; 17591de9a54aSTrevor Wu for (i = 0; i < channels; i += 2) { 17601de9a54aSTrevor Wu if (etdm_data->in_disable_ch[i] && 17611de9a54aSTrevor Wu etdm_data->in_disable_ch[i + 1]) 17621de9a54aSTrevor Wu val |= ETDM_IN_CON3_DISABLE_OUT(i >> 1); 17631de9a54aSTrevor Wu } 17641de9a54aSTrevor Wu if (!slave_mode) { 17651de9a54aSTrevor Wu mask |= ETDM_IN_CON3_FS_MASK; 17661de9a54aSTrevor Wu val |= ETDM_IN_CON3_FS(get_etdm_fs_timing(rate)); 17671de9a54aSTrevor Wu } 17681de9a54aSTrevor Wu regmap_update_bits(afe->regmap, etdm_reg.con3, mask, val); 17691de9a54aSTrevor Wu 17701de9a54aSTrevor Wu mask = 0; 17711de9a54aSTrevor Wu val = 0; 17721de9a54aSTrevor Wu 17731de9a54aSTrevor Wu /* con4 */ 17741de9a54aSTrevor Wu mask |= (ETDM_IN_CON4_MASTER_LRCK_INV | ETDM_IN_CON4_MASTER_BCK_INV | 17751de9a54aSTrevor Wu ETDM_IN_CON4_SLAVE_LRCK_INV | ETDM_IN_CON4_SLAVE_BCK_INV); 17761de9a54aSTrevor Wu if (slave_mode) { 17771de9a54aSTrevor Wu if (etdm_data->lrck_inv) 17781de9a54aSTrevor Wu val |= ETDM_IN_CON4_SLAVE_LRCK_INV; 17791de9a54aSTrevor Wu if (etdm_data->bck_inv) 17801de9a54aSTrevor Wu val |= ETDM_IN_CON4_SLAVE_BCK_INV; 17811de9a54aSTrevor Wu } else { 17821de9a54aSTrevor Wu if (etdm_data->lrck_inv) 17831de9a54aSTrevor Wu val |= ETDM_IN_CON4_MASTER_LRCK_INV; 17841de9a54aSTrevor Wu if (etdm_data->bck_inv) 17851de9a54aSTrevor Wu val |= ETDM_IN_CON4_MASTER_BCK_INV; 17861de9a54aSTrevor Wu } 17871de9a54aSTrevor Wu regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val); 17881de9a54aSTrevor Wu 17891de9a54aSTrevor Wu mask = 0; 17901de9a54aSTrevor Wu val = 0; 17911de9a54aSTrevor Wu 17921de9a54aSTrevor Wu /* con5 */ 17931de9a54aSTrevor Wu mask |= ETDM_IN_CON5_LR_SWAP_MASK; 17941de9a54aSTrevor Wu mask |= ETDM_IN_CON5_ENABLE_ODD_MASK; 17951de9a54aSTrevor Wu for (i = 0; i < channels; i += 2) { 17961de9a54aSTrevor Wu if (etdm_data->in_disable_ch[i] && 17971de9a54aSTrevor Wu !etdm_data->in_disable_ch[i + 1]) { 17981de9a54aSTrevor Wu if (i == (channels - 2)) 17991de9a54aSTrevor Wu val |= ETDM_IN_CON5_LR_SWAP(15); 18001de9a54aSTrevor Wu else 18011de9a54aSTrevor Wu val |= ETDM_IN_CON5_LR_SWAP(i >> 1); 18021de9a54aSTrevor Wu val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1); 18031de9a54aSTrevor Wu } else if (!etdm_data->in_disable_ch[i] && 18041de9a54aSTrevor Wu etdm_data->in_disable_ch[i + 1]) { 18051de9a54aSTrevor Wu val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1); 18061de9a54aSTrevor Wu } 18071de9a54aSTrevor Wu } 18081de9a54aSTrevor Wu regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val); 18091de9a54aSTrevor Wu return 0; 18101de9a54aSTrevor Wu } 18111de9a54aSTrevor Wu 18121de9a54aSTrevor Wu static int mtk_dai_etdm_out_configure(struct mtk_base_afe *afe, 18131de9a54aSTrevor Wu unsigned int rate, 18141de9a54aSTrevor Wu unsigned int channels, 18151de9a54aSTrevor Wu int dai_id) 18161de9a54aSTrevor Wu { 18171de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 1818ff728899STrevor Wu struct mtk_dai_etdm_priv *etdm_data; 18191de9a54aSTrevor Wu struct etdm_con_reg etdm_reg; 1820ff728899STrevor Wu bool slave_mode; 1821ff728899STrevor Wu unsigned int lrck_width; 18221de9a54aSTrevor Wu unsigned int val = 0; 18231de9a54aSTrevor Wu unsigned int mask = 0; 18241de9a54aSTrevor Wu int ret; 18251de9a54aSTrevor Wu int fs = 0; 18261de9a54aSTrevor Wu 1827ff728899STrevor Wu if (!mt8195_afe_etdm_is_valid(dai_id)) 1828ff728899STrevor Wu return -EINVAL; 1829ff728899STrevor Wu 1830ff728899STrevor Wu etdm_data = afe_priv->dai_priv[dai_id]; 1831ff728899STrevor Wu slave_mode = etdm_data->slave_mode; 1832ff728899STrevor Wu lrck_width = etdm_data->lrck_width; 1833ff728899STrevor Wu 18341de9a54aSTrevor Wu dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n", 18351de9a54aSTrevor Wu __func__, rate, channels, dai_id); 18361de9a54aSTrevor Wu 18371de9a54aSTrevor Wu ret = get_etdm_reg(dai_id, &etdm_reg); 18381de9a54aSTrevor Wu if (ret < 0) 18391de9a54aSTrevor Wu return ret; 18401de9a54aSTrevor Wu 18411de9a54aSTrevor Wu if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) 18421de9a54aSTrevor Wu slave_mode = true; 18431de9a54aSTrevor Wu 18441de9a54aSTrevor Wu /* con0 */ 18451de9a54aSTrevor Wu mask = ETDM_OUT_CON0_RELATCH_DOMAIN_MASK; 18461de9a54aSTrevor Wu val = ETDM_OUT_CON0_RELATCH_DOMAIN(ETDM_RELATCH_TIMING_A1A2SYS); 18471de9a54aSTrevor Wu regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val); 18481de9a54aSTrevor Wu 18491de9a54aSTrevor Wu mask = 0; 18501de9a54aSTrevor Wu val = 0; 18511de9a54aSTrevor Wu 18521de9a54aSTrevor Wu /* con1 */ 18531de9a54aSTrevor Wu if (lrck_width > 0) { 18541de9a54aSTrevor Wu mask |= (ETDM_OUT_CON1_LRCK_AUTO_MODE | 18551de9a54aSTrevor Wu ETDM_OUT_CON1_LRCK_WIDTH_MASK); 18561de9a54aSTrevor Wu val |= ETDM_OUT_CON1_LRCK_WIDTH(lrck_width); 18571de9a54aSTrevor Wu } 18581de9a54aSTrevor Wu regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val); 18591de9a54aSTrevor Wu 18601de9a54aSTrevor Wu mask = 0; 18611de9a54aSTrevor Wu val = 0; 18621de9a54aSTrevor Wu 18631de9a54aSTrevor Wu if (slave_mode) { 18641de9a54aSTrevor Wu /* con2 */ 18651de9a54aSTrevor Wu mask = (ETDM_OUT_CON2_LRCK_DELAY_BCK_INV | 18661de9a54aSTrevor Wu ETDM_OUT_CON2_LRCK_DELAY_0P5T_EN); 18671de9a54aSTrevor Wu val = (ETDM_OUT_CON2_LRCK_DELAY_BCK_INV | 18681de9a54aSTrevor Wu ETDM_OUT_CON2_LRCK_DELAY_0P5T_EN); 18691de9a54aSTrevor Wu regmap_update_bits(afe->regmap, etdm_reg.con2, 18701de9a54aSTrevor Wu mask, val); 18711de9a54aSTrevor Wu mask = 0; 18721de9a54aSTrevor Wu val = 0; 18731de9a54aSTrevor Wu } else { 18741de9a54aSTrevor Wu /* con4 */ 18751de9a54aSTrevor Wu mask |= ETDM_OUT_CON4_FS_MASK; 18761de9a54aSTrevor Wu val |= ETDM_OUT_CON4_FS(get_etdm_fs_timing(rate)); 18771de9a54aSTrevor Wu } 18781de9a54aSTrevor Wu 18791de9a54aSTrevor Wu mask |= ETDM_OUT_CON4_RELATCH_EN_MASK; 18801de9a54aSTrevor Wu if (dai_id == MT8195_AFE_IO_ETDM1_OUT) 18811de9a54aSTrevor Wu fs = MT8195_ETDM_OUT1_1X_EN; 18821de9a54aSTrevor Wu else if (dai_id == MT8195_AFE_IO_ETDM2_OUT) 18831de9a54aSTrevor Wu fs = MT8195_ETDM_OUT2_1X_EN; 18841de9a54aSTrevor Wu 18851de9a54aSTrevor Wu val |= ETDM_OUT_CON4_RELATCH_EN(fs); 18861de9a54aSTrevor Wu 18871de9a54aSTrevor Wu regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val); 18881de9a54aSTrevor Wu 18891de9a54aSTrevor Wu mask = 0; 18901de9a54aSTrevor Wu val = 0; 18911de9a54aSTrevor Wu 18921de9a54aSTrevor Wu /* con5 */ 18931de9a54aSTrevor Wu mask |= (ETDM_OUT_CON5_MASTER_LRCK_INV | ETDM_OUT_CON5_MASTER_BCK_INV | 18941de9a54aSTrevor Wu ETDM_OUT_CON5_SLAVE_LRCK_INV | ETDM_OUT_CON5_SLAVE_BCK_INV); 18951de9a54aSTrevor Wu if (slave_mode) { 18961de9a54aSTrevor Wu if (etdm_data->lrck_inv) 18971de9a54aSTrevor Wu val |= ETDM_OUT_CON5_SLAVE_LRCK_INV; 18981de9a54aSTrevor Wu if (etdm_data->bck_inv) 18991de9a54aSTrevor Wu val |= ETDM_OUT_CON5_SLAVE_BCK_INV; 19001de9a54aSTrevor Wu } else { 19011de9a54aSTrevor Wu if (etdm_data->lrck_inv) 19021de9a54aSTrevor Wu val |= ETDM_OUT_CON5_MASTER_LRCK_INV; 19031de9a54aSTrevor Wu if (etdm_data->bck_inv) 19041de9a54aSTrevor Wu val |= ETDM_OUT_CON5_MASTER_BCK_INV; 19051de9a54aSTrevor Wu } 19061de9a54aSTrevor Wu regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val); 19071de9a54aSTrevor Wu 19081de9a54aSTrevor Wu return 0; 19091de9a54aSTrevor Wu } 19101de9a54aSTrevor Wu 19111de9a54aSTrevor Wu static int mtk_dai_etdm_mclk_configure(struct mtk_base_afe *afe, int dai_id) 19121de9a54aSTrevor Wu { 19131de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 1914ff728899STrevor Wu struct mtk_dai_etdm_priv *etdm_data; 19151de9a54aSTrevor Wu int clk_id = mtk_dai_etdm_get_clk_id_by_dai_id(dai_id); 19161de9a54aSTrevor Wu int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id); 19171de9a54aSTrevor Wu int apll; 19181de9a54aSTrevor Wu int apll_clk_id; 19191de9a54aSTrevor Wu struct etdm_con_reg etdm_reg; 19201de9a54aSTrevor Wu unsigned int val = 0; 19211de9a54aSTrevor Wu unsigned int mask = 0; 19221de9a54aSTrevor Wu int ret = 0; 19231de9a54aSTrevor Wu 19241de9a54aSTrevor Wu if (clk_id < 0 || clkdiv_id < 0) 19251de9a54aSTrevor Wu return 0; 19261de9a54aSTrevor Wu 1927ff728899STrevor Wu if (!mt8195_afe_etdm_is_valid(dai_id)) 1928ff728899STrevor Wu return -EINVAL; 1929ff728899STrevor Wu 1930ff728899STrevor Wu etdm_data = afe_priv->dai_priv[dai_id]; 19311de9a54aSTrevor Wu ret = get_etdm_reg(dai_id, &etdm_reg); 19321de9a54aSTrevor Wu if (ret < 0) 19331de9a54aSTrevor Wu return ret; 19341de9a54aSTrevor Wu 19351de9a54aSTrevor Wu mask |= ETDM_CON1_MCLK_OUTPUT; 19361de9a54aSTrevor Wu if (etdm_data->mclk_dir == SND_SOC_CLOCK_OUT) 19371de9a54aSTrevor Wu val |= ETDM_CON1_MCLK_OUTPUT; 19381de9a54aSTrevor Wu regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val); 19391de9a54aSTrevor Wu 19401de9a54aSTrevor Wu if (etdm_data->mclk_freq) { 19411de9a54aSTrevor Wu apll = etdm_data->mclk_apll; 19421de9a54aSTrevor Wu apll_clk_id = mt8195_afe_get_mclk_source_clk_id(apll); 19431de9a54aSTrevor Wu if (apll_clk_id < 0) 19441de9a54aSTrevor Wu return apll_clk_id; 19451de9a54aSTrevor Wu 19461de9a54aSTrevor Wu /* select apll */ 19471de9a54aSTrevor Wu ret = mt8195_afe_set_clk_parent(afe, afe_priv->clk[clk_id], 19481de9a54aSTrevor Wu afe_priv->clk[apll_clk_id]); 19491de9a54aSTrevor Wu if (ret) 19501de9a54aSTrevor Wu return ret; 19511de9a54aSTrevor Wu 19521de9a54aSTrevor Wu /* set rate */ 19531de9a54aSTrevor Wu ret = mt8195_afe_set_clk_rate(afe, afe_priv->clk[clkdiv_id], 19541de9a54aSTrevor Wu etdm_data->mclk_freq); 19551de9a54aSTrevor Wu } else { 19561de9a54aSTrevor Wu if (etdm_data->mclk_dir == SND_SOC_CLOCK_OUT) 19571de9a54aSTrevor Wu dev_dbg(afe->dev, "%s mclk freq = 0\n", __func__); 19581de9a54aSTrevor Wu } 19591de9a54aSTrevor Wu return ret; 19601de9a54aSTrevor Wu } 19611de9a54aSTrevor Wu 19621de9a54aSTrevor Wu static int mtk_dai_etdm_configure(struct mtk_base_afe *afe, 19631de9a54aSTrevor Wu unsigned int rate, 19641de9a54aSTrevor Wu unsigned int channels, 19651de9a54aSTrevor Wu unsigned int bit_width, 19661de9a54aSTrevor Wu int dai_id) 19671de9a54aSTrevor Wu { 19681de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 1969ff728899STrevor Wu struct mtk_dai_etdm_priv *etdm_data; 19701de9a54aSTrevor Wu struct etdm_con_reg etdm_reg; 1971ff728899STrevor Wu bool slave_mode; 19721de9a54aSTrevor Wu unsigned int etdm_channels; 19731de9a54aSTrevor Wu unsigned int val = 0; 19741de9a54aSTrevor Wu unsigned int mask = 0; 19751de9a54aSTrevor Wu unsigned int bck; 19761de9a54aSTrevor Wu unsigned int wlen = get_etdm_wlen(bit_width); 19771de9a54aSTrevor Wu int ret; 19781de9a54aSTrevor Wu 1979ff728899STrevor Wu if (!mt8195_afe_etdm_is_valid(dai_id)) 1980ff728899STrevor Wu return -EINVAL; 1981ff728899STrevor Wu 1982ff728899STrevor Wu etdm_data = afe_priv->dai_priv[dai_id]; 1983ff728899STrevor Wu slave_mode = etdm_data->slave_mode; 19841de9a54aSTrevor Wu ret = get_etdm_reg(dai_id, &etdm_reg); 19851de9a54aSTrevor Wu if (ret < 0) 19861de9a54aSTrevor Wu return ret; 19871de9a54aSTrevor Wu 19881de9a54aSTrevor Wu if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) 19891de9a54aSTrevor Wu slave_mode = true; 19901de9a54aSTrevor Wu 19911de9a54aSTrevor Wu dev_dbg(afe->dev, "%s fmt %u data %u lrck %d-%u bck %d, clock %u slv %u\n", 19921de9a54aSTrevor Wu __func__, etdm_data->format, etdm_data->data_mode, 19931de9a54aSTrevor Wu etdm_data->lrck_inv, etdm_data->lrck_width, etdm_data->bck_inv, 19941de9a54aSTrevor Wu etdm_data->clock_mode, etdm_data->slave_mode); 199511a08e05SColin Ian King dev_dbg(afe->dev, "%s rate %u channels %u bitwidth %u, id %d\n", 19961de9a54aSTrevor Wu __func__, rate, channels, bit_width, dai_id); 19971de9a54aSTrevor Wu 19981de9a54aSTrevor Wu etdm_channels = (etdm_data->data_mode == MTK_DAI_ETDM_DATA_ONE_PIN) ? 19991de9a54aSTrevor Wu get_etdm_ch_fixup(channels) : 2; 20001de9a54aSTrevor Wu 20011de9a54aSTrevor Wu bck = rate * etdm_channels * wlen; 20021de9a54aSTrevor Wu if (bck > MT8195_ETDM_NORMAL_MAX_BCK_RATE) { 20031de9a54aSTrevor Wu dev_info(afe->dev, "%s bck rate %u not support\n", 20041de9a54aSTrevor Wu __func__, bck); 20051de9a54aSTrevor Wu return -EINVAL; 20061de9a54aSTrevor Wu } 20071de9a54aSTrevor Wu 20081de9a54aSTrevor Wu /* con0 */ 20091de9a54aSTrevor Wu mask |= ETDM_CON0_BIT_LEN_MASK; 20101de9a54aSTrevor Wu val |= ETDM_CON0_BIT_LEN(bit_width); 20111de9a54aSTrevor Wu mask |= ETDM_CON0_WORD_LEN_MASK; 20121de9a54aSTrevor Wu val |= ETDM_CON0_WORD_LEN(wlen); 20131de9a54aSTrevor Wu mask |= ETDM_CON0_FORMAT_MASK; 20141de9a54aSTrevor Wu val |= ETDM_CON0_FORMAT(etdm_data->format); 20151de9a54aSTrevor Wu mask |= ETDM_CON0_CH_NUM_MASK; 20161de9a54aSTrevor Wu val |= ETDM_CON0_CH_NUM(etdm_channels); 20171de9a54aSTrevor Wu 20181de9a54aSTrevor Wu mask |= ETDM_CON0_SLAVE_MODE; 20191de9a54aSTrevor Wu if (slave_mode) { 20201de9a54aSTrevor Wu if (dai_id == MT8195_AFE_IO_ETDM1_OUT && 20211de9a54aSTrevor Wu etdm_data->cowork_source_id == COWORK_ETDM_NONE) { 20221de9a54aSTrevor Wu dev_info(afe->dev, "%s id %d only support master mode\n", 20231de9a54aSTrevor Wu __func__, dai_id); 20241de9a54aSTrevor Wu return -EINVAL; 20251de9a54aSTrevor Wu } 20261de9a54aSTrevor Wu val |= ETDM_CON0_SLAVE_MODE; 20271de9a54aSTrevor Wu } 20281de9a54aSTrevor Wu regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val); 20291de9a54aSTrevor Wu 20301de9a54aSTrevor Wu if (get_etdm_dir(dai_id) == ETDM_IN) 20311de9a54aSTrevor Wu mtk_dai_etdm_in_configure(afe, rate, channels, dai_id); 20321de9a54aSTrevor Wu else 20331de9a54aSTrevor Wu mtk_dai_etdm_out_configure(afe, rate, channels, dai_id); 20341de9a54aSTrevor Wu 20351de9a54aSTrevor Wu return 0; 20361de9a54aSTrevor Wu } 20371de9a54aSTrevor Wu 20381de9a54aSTrevor Wu static int mtk_dai_etdm_hw_params(struct snd_pcm_substream *substream, 20391de9a54aSTrevor Wu struct snd_pcm_hw_params *params, 20401de9a54aSTrevor Wu struct snd_soc_dai *dai) 20411de9a54aSTrevor Wu { 20421de9a54aSTrevor Wu int ret = 0; 20431de9a54aSTrevor Wu unsigned int rate = params_rate(params); 20441de9a54aSTrevor Wu unsigned int bit_width = params_width(params); 20451de9a54aSTrevor Wu unsigned int channels = params_channels(params); 20461de9a54aSTrevor Wu struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 20471de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 20481de9a54aSTrevor Wu struct mtk_dai_etdm_priv *mst_etdm_data; 20491de9a54aSTrevor Wu int mst_dai_id; 20501de9a54aSTrevor Wu int slv_dai_id; 20511de9a54aSTrevor Wu int i; 20521de9a54aSTrevor Wu 20531de9a54aSTrevor Wu dev_dbg(afe->dev, "%s '%s' period %u-%u\n", 20541de9a54aSTrevor Wu __func__, snd_pcm_stream_str(substream), 20551de9a54aSTrevor Wu params_period_size(params), params_periods(params)); 20561de9a54aSTrevor Wu 20571de9a54aSTrevor Wu if (is_cowork_mode(dai)) { 20581de9a54aSTrevor Wu mst_dai_id = get_etdm_cowork_master_id(dai); 2059ff728899STrevor Wu if (!mt8195_afe_etdm_is_valid(mst_dai_id)) 2060ff728899STrevor Wu return -EINVAL; 20611de9a54aSTrevor Wu 20621de9a54aSTrevor Wu ret = mtk_dai_etdm_mclk_configure(afe, mst_dai_id); 20631de9a54aSTrevor Wu if (ret) 20641de9a54aSTrevor Wu return ret; 20651de9a54aSTrevor Wu 20661de9a54aSTrevor Wu ret = mtk_dai_etdm_configure(afe, rate, channels, 20671de9a54aSTrevor Wu bit_width, mst_dai_id); 20681de9a54aSTrevor Wu if (ret) 20691de9a54aSTrevor Wu return ret; 20701de9a54aSTrevor Wu 20711de9a54aSTrevor Wu mst_etdm_data = afe_priv->dai_priv[mst_dai_id]; 20721de9a54aSTrevor Wu for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) { 20731de9a54aSTrevor Wu slv_dai_id = mst_etdm_data->cowork_slv_id[i]; 20741de9a54aSTrevor Wu ret = mtk_dai_etdm_configure(afe, rate, channels, 20751de9a54aSTrevor Wu bit_width, slv_dai_id); 20761de9a54aSTrevor Wu if (ret) 20771de9a54aSTrevor Wu return ret; 20781de9a54aSTrevor Wu 20791de9a54aSTrevor Wu ret = mt8195_etdm_sync_mode_configure(afe, slv_dai_id); 20801de9a54aSTrevor Wu if (ret) 20811de9a54aSTrevor Wu return ret; 20821de9a54aSTrevor Wu } 20831de9a54aSTrevor Wu } else { 20841de9a54aSTrevor Wu ret = mtk_dai_etdm_mclk_configure(afe, dai->id); 20851de9a54aSTrevor Wu if (ret) 20861de9a54aSTrevor Wu return ret; 20871de9a54aSTrevor Wu 20881de9a54aSTrevor Wu ret = mtk_dai_etdm_configure(afe, rate, channels, 20891de9a54aSTrevor Wu bit_width, dai->id); 20901de9a54aSTrevor Wu } 20911de9a54aSTrevor Wu 20921de9a54aSTrevor Wu return ret; 20931de9a54aSTrevor Wu } 20941de9a54aSTrevor Wu 20951de9a54aSTrevor Wu static int mtk_dai_etdm_trigger(struct snd_pcm_substream *substream, int cmd, 20961de9a54aSTrevor Wu struct snd_soc_dai *dai) 20971de9a54aSTrevor Wu { 20981de9a54aSTrevor Wu int ret = 0; 20991de9a54aSTrevor Wu struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 21001de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 21011de9a54aSTrevor Wu struct mtk_dai_etdm_priv *mst_etdm_data; 21021de9a54aSTrevor Wu int mst_dai_id; 21031de9a54aSTrevor Wu int slv_dai_id; 21041de9a54aSTrevor Wu int i; 21051de9a54aSTrevor Wu 21061de9a54aSTrevor Wu dev_dbg(afe->dev, "%s(), cmd %d, dai id %d\n", __func__, cmd, dai->id); 21071de9a54aSTrevor Wu switch (cmd) { 21081de9a54aSTrevor Wu case SNDRV_PCM_TRIGGER_START: 21091de9a54aSTrevor Wu case SNDRV_PCM_TRIGGER_RESUME: 21101de9a54aSTrevor Wu if (is_cowork_mode(dai)) { 21111de9a54aSTrevor Wu mst_dai_id = get_etdm_cowork_master_id(dai); 2112ff728899STrevor Wu if (!mt8195_afe_etdm_is_valid(mst_dai_id)) 2113ff728899STrevor Wu return -EINVAL; 2114ff728899STrevor Wu 21151de9a54aSTrevor Wu mst_etdm_data = afe_priv->dai_priv[mst_dai_id]; 21161de9a54aSTrevor Wu 21171de9a54aSTrevor Wu //open master first 21181de9a54aSTrevor Wu ret |= mt8195_afe_enable_etdm(afe, mst_dai_id); 21191de9a54aSTrevor Wu for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) { 21201de9a54aSTrevor Wu slv_dai_id = mst_etdm_data->cowork_slv_id[i]; 21211de9a54aSTrevor Wu ret |= mt8195_afe_enable_etdm(afe, slv_dai_id); 21221de9a54aSTrevor Wu } 21231de9a54aSTrevor Wu } else { 21241de9a54aSTrevor Wu ret = mt8195_afe_enable_etdm(afe, dai->id); 21251de9a54aSTrevor Wu } 21261de9a54aSTrevor Wu break; 21271de9a54aSTrevor Wu case SNDRV_PCM_TRIGGER_STOP: 21281de9a54aSTrevor Wu case SNDRV_PCM_TRIGGER_SUSPEND: 21291de9a54aSTrevor Wu if (is_cowork_mode(dai)) { 21301de9a54aSTrevor Wu mst_dai_id = get_etdm_cowork_master_id(dai); 2131ff728899STrevor Wu if (!mt8195_afe_etdm_is_valid(mst_dai_id)) 2132ff728899STrevor Wu return -EINVAL; 2133ff728899STrevor Wu 21341de9a54aSTrevor Wu mst_etdm_data = afe_priv->dai_priv[mst_dai_id]; 21351de9a54aSTrevor Wu 21361de9a54aSTrevor Wu for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) { 21371de9a54aSTrevor Wu slv_dai_id = mst_etdm_data->cowork_slv_id[i]; 21381de9a54aSTrevor Wu ret |= mt8195_afe_disable_etdm(afe, slv_dai_id); 21391de9a54aSTrevor Wu } 21401de9a54aSTrevor Wu // close master at last 21411de9a54aSTrevor Wu ret |= mt8195_afe_disable_etdm(afe, mst_dai_id); 21421de9a54aSTrevor Wu } else { 21431de9a54aSTrevor Wu ret = mt8195_afe_disable_etdm(afe, dai->id); 21441de9a54aSTrevor Wu } 21451de9a54aSTrevor Wu break; 21461de9a54aSTrevor Wu default: 21471de9a54aSTrevor Wu break; 21481de9a54aSTrevor Wu } 21491de9a54aSTrevor Wu return ret; 21501de9a54aSTrevor Wu } 21511de9a54aSTrevor Wu 21521de9a54aSTrevor Wu static int mtk_dai_etdm_cal_mclk(struct mtk_base_afe *afe, int freq, int dai_id) 21531de9a54aSTrevor Wu { 21541de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 2155ff728899STrevor Wu struct mtk_dai_etdm_priv *etdm_data; 21561de9a54aSTrevor Wu int apll; 21571de9a54aSTrevor Wu int apll_rate; 21581de9a54aSTrevor Wu 2159ff728899STrevor Wu if (!mt8195_afe_etdm_is_valid(dai_id)) 2160ff728899STrevor Wu return -EINVAL; 2161ff728899STrevor Wu 2162ff728899STrevor Wu etdm_data = afe_priv->dai_priv[dai_id]; 21631de9a54aSTrevor Wu if (freq == 0) { 21641de9a54aSTrevor Wu etdm_data->mclk_freq = freq; 21651de9a54aSTrevor Wu return 0; 21661de9a54aSTrevor Wu } 21671de9a54aSTrevor Wu 21681de9a54aSTrevor Wu apll = mt8195_afe_get_default_mclk_source_by_rate(freq); 21691de9a54aSTrevor Wu apll_rate = mt8195_afe_get_mclk_source_rate(afe, apll); 21701de9a54aSTrevor Wu 21711de9a54aSTrevor Wu if (freq > apll_rate) { 21721de9a54aSTrevor Wu dev_info(afe->dev, "freq %d > apll rate %d\n", freq, apll_rate); 21731de9a54aSTrevor Wu return -EINVAL; 21741de9a54aSTrevor Wu } 21751de9a54aSTrevor Wu 21761de9a54aSTrevor Wu if (apll_rate % freq != 0) { 21771de9a54aSTrevor Wu dev_info(afe->dev, "APLL%d cannot generate freq Hz\n", apll); 21781de9a54aSTrevor Wu return -EINVAL; 21791de9a54aSTrevor Wu } 21801de9a54aSTrevor Wu 21811de9a54aSTrevor Wu etdm_data->mclk_apll = apll; 21821de9a54aSTrevor Wu etdm_data->mclk_freq = freq; 21831de9a54aSTrevor Wu 21841de9a54aSTrevor Wu return 0; 21851de9a54aSTrevor Wu } 21861de9a54aSTrevor Wu 21871de9a54aSTrevor Wu static int mtk_dai_etdm_set_sysclk(struct snd_soc_dai *dai, 21881de9a54aSTrevor Wu int clk_id, unsigned int freq, int dir) 21891de9a54aSTrevor Wu { 21901de9a54aSTrevor Wu struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 21911de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 2192d67bbddaSColin Ian King struct mtk_dai_etdm_priv *etdm_data; 21931de9a54aSTrevor Wu int dai_id; 21941de9a54aSTrevor Wu 21951de9a54aSTrevor Wu dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n", 21961de9a54aSTrevor Wu __func__, dai->id, freq, dir); 21971de9a54aSTrevor Wu if (is_cowork_mode(dai)) 21981de9a54aSTrevor Wu dai_id = get_etdm_cowork_master_id(dai); 21991de9a54aSTrevor Wu else 22001de9a54aSTrevor Wu dai_id = dai->id; 22011de9a54aSTrevor Wu 2202ff728899STrevor Wu if (!mt8195_afe_etdm_is_valid(dai_id)) 2203ff728899STrevor Wu return -EINVAL; 2204ff728899STrevor Wu 22051de9a54aSTrevor Wu etdm_data = afe_priv->dai_priv[dai_id]; 22061de9a54aSTrevor Wu etdm_data->mclk_dir = dir; 22071de9a54aSTrevor Wu return mtk_dai_etdm_cal_mclk(afe, freq, dai_id); 22081de9a54aSTrevor Wu } 22091de9a54aSTrevor Wu 22101de9a54aSTrevor Wu static int mtk_dai_etdm_set_tdm_slot(struct snd_soc_dai *dai, 22111de9a54aSTrevor Wu unsigned int tx_mask, unsigned int rx_mask, 22121de9a54aSTrevor Wu int slots, int slot_width) 22131de9a54aSTrevor Wu { 22141de9a54aSTrevor Wu struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 22151de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 2216ff728899STrevor Wu struct mtk_dai_etdm_priv *etdm_data; 22171de9a54aSTrevor Wu 2218ff728899STrevor Wu if (!mt8195_afe_etdm_is_valid(dai->id)) 2219ff728899STrevor Wu return -EINVAL; 2220ff728899STrevor Wu 2221ff728899STrevor Wu etdm_data = afe_priv->dai_priv[dai->id]; 22221de9a54aSTrevor Wu dev_dbg(dai->dev, "%s id %d slot_width %d\n", 22231de9a54aSTrevor Wu __func__, dai->id, slot_width); 22241de9a54aSTrevor Wu 22251de9a54aSTrevor Wu etdm_data->slots = slots; 22261de9a54aSTrevor Wu etdm_data->lrck_width = slot_width; 22271de9a54aSTrevor Wu return 0; 22281de9a54aSTrevor Wu } 22291de9a54aSTrevor Wu 22301de9a54aSTrevor Wu static int mtk_dai_etdm_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) 22311de9a54aSTrevor Wu { 22321de9a54aSTrevor Wu struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 22331de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 2234ff728899STrevor Wu struct mtk_dai_etdm_priv *etdm_data; 22351de9a54aSTrevor Wu 2236ff728899STrevor Wu if (!mt8195_afe_etdm_is_valid(dai->id)) 2237ff728899STrevor Wu return -EINVAL; 2238ff728899STrevor Wu 2239ff728899STrevor Wu etdm_data = afe_priv->dai_priv[dai->id]; 22401de9a54aSTrevor Wu switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 22411de9a54aSTrevor Wu case SND_SOC_DAIFMT_I2S: 22421de9a54aSTrevor Wu etdm_data->format = MTK_DAI_ETDM_FORMAT_I2S; 22431de9a54aSTrevor Wu break; 22441de9a54aSTrevor Wu case SND_SOC_DAIFMT_LEFT_J: 22451de9a54aSTrevor Wu etdm_data->format = MTK_DAI_ETDM_FORMAT_LJ; 22461de9a54aSTrevor Wu break; 22471de9a54aSTrevor Wu case SND_SOC_DAIFMT_RIGHT_J: 22481de9a54aSTrevor Wu etdm_data->format = MTK_DAI_ETDM_FORMAT_RJ; 22491de9a54aSTrevor Wu break; 22501de9a54aSTrevor Wu case SND_SOC_DAIFMT_DSP_A: 22511de9a54aSTrevor Wu etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPA; 22521de9a54aSTrevor Wu break; 22531de9a54aSTrevor Wu case SND_SOC_DAIFMT_DSP_B: 22541de9a54aSTrevor Wu etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPB; 22551de9a54aSTrevor Wu break; 22561de9a54aSTrevor Wu default: 22571de9a54aSTrevor Wu return -EINVAL; 22581de9a54aSTrevor Wu } 22591de9a54aSTrevor Wu 22601de9a54aSTrevor Wu switch (fmt & SND_SOC_DAIFMT_INV_MASK) { 22611de9a54aSTrevor Wu case SND_SOC_DAIFMT_NB_NF: 22621de9a54aSTrevor Wu etdm_data->bck_inv = false; 22631de9a54aSTrevor Wu etdm_data->lrck_inv = false; 22641de9a54aSTrevor Wu break; 22651de9a54aSTrevor Wu case SND_SOC_DAIFMT_NB_IF: 22661de9a54aSTrevor Wu etdm_data->bck_inv = false; 22671de9a54aSTrevor Wu etdm_data->lrck_inv = true; 22681de9a54aSTrevor Wu break; 22691de9a54aSTrevor Wu case SND_SOC_DAIFMT_IB_NF: 22701de9a54aSTrevor Wu etdm_data->bck_inv = true; 22711de9a54aSTrevor Wu etdm_data->lrck_inv = false; 22721de9a54aSTrevor Wu break; 22731de9a54aSTrevor Wu case SND_SOC_DAIFMT_IB_IF: 22741de9a54aSTrevor Wu etdm_data->bck_inv = true; 22751de9a54aSTrevor Wu etdm_data->lrck_inv = true; 22761de9a54aSTrevor Wu break; 22771de9a54aSTrevor Wu default: 22781de9a54aSTrevor Wu return -EINVAL; 22791de9a54aSTrevor Wu } 22801de9a54aSTrevor Wu 22813af99430SCharles Keepax switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) { 22823af99430SCharles Keepax case SND_SOC_DAIFMT_BC_FC: 22831de9a54aSTrevor Wu etdm_data->slave_mode = true; 22841de9a54aSTrevor Wu break; 22853af99430SCharles Keepax case SND_SOC_DAIFMT_BP_FP: 22861de9a54aSTrevor Wu etdm_data->slave_mode = false; 22871de9a54aSTrevor Wu break; 22881de9a54aSTrevor Wu default: 22891de9a54aSTrevor Wu return -EINVAL; 22901de9a54aSTrevor Wu } 22911de9a54aSTrevor Wu 22921de9a54aSTrevor Wu return 0; 22931de9a54aSTrevor Wu } 22941de9a54aSTrevor Wu 22951de9a54aSTrevor Wu static int mtk_dai_hdmitx_dptx_startup(struct snd_pcm_substream *substream, 22961de9a54aSTrevor Wu struct snd_soc_dai *dai) 22971de9a54aSTrevor Wu { 22981de9a54aSTrevor Wu struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 22991de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 23001de9a54aSTrevor Wu int cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id); 23011de9a54aSTrevor Wu 23021de9a54aSTrevor Wu if (cg_id >= 0) 23031de9a54aSTrevor Wu mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]); 23041de9a54aSTrevor Wu 23051de9a54aSTrevor Wu mtk_dai_etdm_enable_mclk(afe, dai->id); 23061de9a54aSTrevor Wu 23071de9a54aSTrevor Wu return 0; 23081de9a54aSTrevor Wu } 23091de9a54aSTrevor Wu 23101de9a54aSTrevor Wu static void mtk_dai_hdmitx_dptx_shutdown(struct snd_pcm_substream *substream, 23111de9a54aSTrevor Wu struct snd_soc_dai *dai) 23121de9a54aSTrevor Wu { 23131de9a54aSTrevor Wu struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 23141de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 23151de9a54aSTrevor Wu int cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id); 23161de9a54aSTrevor Wu 23171de9a54aSTrevor Wu mtk_dai_etdm_disable_mclk(afe, dai->id); 23181de9a54aSTrevor Wu 23191de9a54aSTrevor Wu if (cg_id >= 0) 23201de9a54aSTrevor Wu mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]); 23211de9a54aSTrevor Wu } 23221de9a54aSTrevor Wu 23231de9a54aSTrevor Wu static unsigned int mtk_dai_get_dptx_ch_en(unsigned int channel) 23241de9a54aSTrevor Wu { 23251de9a54aSTrevor Wu switch (channel) { 23261de9a54aSTrevor Wu case 1 ... 2: 23271de9a54aSTrevor Wu return AFE_DPTX_CON_CH_EN_2CH; 23281de9a54aSTrevor Wu case 3 ... 4: 23291de9a54aSTrevor Wu return AFE_DPTX_CON_CH_EN_4CH; 23301de9a54aSTrevor Wu case 5 ... 6: 23311de9a54aSTrevor Wu return AFE_DPTX_CON_CH_EN_6CH; 23321de9a54aSTrevor Wu case 7 ... 8: 23331de9a54aSTrevor Wu return AFE_DPTX_CON_CH_EN_8CH; 23341de9a54aSTrevor Wu default: 23351de9a54aSTrevor Wu return AFE_DPTX_CON_CH_EN_2CH; 23361de9a54aSTrevor Wu } 23371de9a54aSTrevor Wu } 23381de9a54aSTrevor Wu 23391de9a54aSTrevor Wu static unsigned int mtk_dai_get_dptx_ch(unsigned int ch) 23401de9a54aSTrevor Wu { 23411de9a54aSTrevor Wu return (ch > 2) ? 23421de9a54aSTrevor Wu AFE_DPTX_CON_CH_NUM_8CH : AFE_DPTX_CON_CH_NUM_2CH; 23431de9a54aSTrevor Wu } 23441de9a54aSTrevor Wu 23451de9a54aSTrevor Wu static unsigned int mtk_dai_get_dptx_wlen(snd_pcm_format_t format) 23461de9a54aSTrevor Wu { 23471de9a54aSTrevor Wu return snd_pcm_format_physical_width(format) <= 16 ? 23481de9a54aSTrevor Wu AFE_DPTX_CON_16BIT : AFE_DPTX_CON_24BIT; 23491de9a54aSTrevor Wu } 23501de9a54aSTrevor Wu 23511de9a54aSTrevor Wu static int mtk_dai_hdmitx_dptx_hw_params(struct snd_pcm_substream *substream, 23521de9a54aSTrevor Wu struct snd_pcm_hw_params *params, 23531de9a54aSTrevor Wu struct snd_soc_dai *dai) 23541de9a54aSTrevor Wu { 23551de9a54aSTrevor Wu struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 23561de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 2357ff728899STrevor Wu struct mtk_dai_etdm_priv *etdm_data; 23581de9a54aSTrevor Wu unsigned int rate = params_rate(params); 23591de9a54aSTrevor Wu unsigned int channels = params_channels(params); 23601de9a54aSTrevor Wu snd_pcm_format_t format = params_format(params); 23611de9a54aSTrevor Wu int width = snd_pcm_format_physical_width(format); 23621de9a54aSTrevor Wu int ret = 0; 23631de9a54aSTrevor Wu 2364ff728899STrevor Wu if (!mt8195_afe_hdmitx_dptx_is_valid(dai->id)) 2365ff728899STrevor Wu return -EINVAL; 2366ff728899STrevor Wu 2367ff728899STrevor Wu etdm_data = afe_priv->dai_priv[dai->id]; 2368ff728899STrevor Wu 23691de9a54aSTrevor Wu /* dptx configure */ 23701de9a54aSTrevor Wu if (dai->id == MT8195_AFE_IO_DPTX) { 23711de9a54aSTrevor Wu regmap_update_bits(afe->regmap, AFE_DPTX_CON, 23721de9a54aSTrevor Wu AFE_DPTX_CON_CH_EN_MASK, 23731de9a54aSTrevor Wu mtk_dai_get_dptx_ch_en(channels)); 23741de9a54aSTrevor Wu regmap_update_bits(afe->regmap, AFE_DPTX_CON, 23751de9a54aSTrevor Wu AFE_DPTX_CON_CH_NUM_MASK, 23761de9a54aSTrevor Wu mtk_dai_get_dptx_ch(channels)); 23771de9a54aSTrevor Wu regmap_update_bits(afe->regmap, AFE_DPTX_CON, 23781de9a54aSTrevor Wu AFE_DPTX_CON_16BIT_MASK, 23791de9a54aSTrevor Wu mtk_dai_get_dptx_wlen(format)); 23801de9a54aSTrevor Wu 23811de9a54aSTrevor Wu if (mtk_dai_get_dptx_ch(channels) == AFE_DPTX_CON_CH_NUM_8CH) { 23821de9a54aSTrevor Wu etdm_data->data_mode = MTK_DAI_ETDM_DATA_ONE_PIN; 23831de9a54aSTrevor Wu channels = 8; 23841de9a54aSTrevor Wu } else { 23851de9a54aSTrevor Wu channels = 2; 23861de9a54aSTrevor Wu } 23871de9a54aSTrevor Wu } else { 23881de9a54aSTrevor Wu etdm_data->data_mode = MTK_DAI_ETDM_DATA_MULTI_PIN; 23891de9a54aSTrevor Wu } 23901de9a54aSTrevor Wu 23911de9a54aSTrevor Wu ret = mtk_dai_etdm_mclk_configure(afe, dai->id); 23921de9a54aSTrevor Wu if (ret) 23931de9a54aSTrevor Wu return ret; 23941de9a54aSTrevor Wu 23951de9a54aSTrevor Wu ret = mtk_dai_etdm_configure(afe, rate, channels, width, dai->id); 23961de9a54aSTrevor Wu 23971de9a54aSTrevor Wu return ret; 23981de9a54aSTrevor Wu } 23991de9a54aSTrevor Wu 24001de9a54aSTrevor Wu static int mtk_dai_hdmitx_dptx_trigger(struct snd_pcm_substream *substream, 24011de9a54aSTrevor Wu int cmd, 24021de9a54aSTrevor Wu struct snd_soc_dai *dai) 24031de9a54aSTrevor Wu { 24041de9a54aSTrevor Wu struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 24051de9a54aSTrevor Wu int ret = 0; 24061de9a54aSTrevor Wu 24071de9a54aSTrevor Wu dev_dbg(afe->dev, "%s(), cmd %d, dai id %d\n", __func__, cmd, dai->id); 24081de9a54aSTrevor Wu 24091de9a54aSTrevor Wu switch (cmd) { 24101de9a54aSTrevor Wu case SNDRV_PCM_TRIGGER_START: 24111de9a54aSTrevor Wu case SNDRV_PCM_TRIGGER_RESUME: 24121de9a54aSTrevor Wu /* enable dptx interface */ 24131de9a54aSTrevor Wu if (dai->id == MT8195_AFE_IO_DPTX) 24141de9a54aSTrevor Wu regmap_update_bits(afe->regmap, AFE_DPTX_CON, 24151de9a54aSTrevor Wu AFE_DPTX_CON_ON_MASK, 24161de9a54aSTrevor Wu AFE_DPTX_CON_ON); 24171de9a54aSTrevor Wu 24181de9a54aSTrevor Wu /* enable etdm_out3 */ 24191de9a54aSTrevor Wu ret = mt8195_afe_enable_etdm(afe, dai->id); 24201de9a54aSTrevor Wu break; 24211de9a54aSTrevor Wu case SNDRV_PCM_TRIGGER_STOP: 24221de9a54aSTrevor Wu case SNDRV_PCM_TRIGGER_SUSPEND: 24231de9a54aSTrevor Wu /* disable etdm_out3 */ 24241de9a54aSTrevor Wu ret = mt8195_afe_disable_etdm(afe, dai->id); 24251de9a54aSTrevor Wu 24261de9a54aSTrevor Wu /* disable dptx interface */ 24271de9a54aSTrevor Wu if (dai->id == MT8195_AFE_IO_DPTX) 24281de9a54aSTrevor Wu regmap_update_bits(afe->regmap, AFE_DPTX_CON, 24291de9a54aSTrevor Wu AFE_DPTX_CON_ON_MASK, 0); 24301de9a54aSTrevor Wu break; 24311de9a54aSTrevor Wu default: 24321de9a54aSTrevor Wu return -EINVAL; 24331de9a54aSTrevor Wu } 24341de9a54aSTrevor Wu 24351de9a54aSTrevor Wu return ret; 24361de9a54aSTrevor Wu } 24371de9a54aSTrevor Wu 24381de9a54aSTrevor Wu static int mtk_dai_hdmitx_dptx_set_sysclk(struct snd_soc_dai *dai, 24391de9a54aSTrevor Wu int clk_id, 24401de9a54aSTrevor Wu unsigned int freq, 24411de9a54aSTrevor Wu int dir) 24421de9a54aSTrevor Wu { 24431de9a54aSTrevor Wu struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 24441de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 2445ff728899STrevor Wu struct mtk_dai_etdm_priv *etdm_data; 2446ff728899STrevor Wu 2447ff728899STrevor Wu if (!mt8195_afe_hdmitx_dptx_is_valid(dai->id)) 2448ff728899STrevor Wu return -EINVAL; 2449ff728899STrevor Wu 2450ff728899STrevor Wu etdm_data = afe_priv->dai_priv[dai->id]; 24511de9a54aSTrevor Wu 24521de9a54aSTrevor Wu dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n", 24531de9a54aSTrevor Wu __func__, dai->id, freq, dir); 24541de9a54aSTrevor Wu 24551de9a54aSTrevor Wu etdm_data->mclk_dir = dir; 24561de9a54aSTrevor Wu return mtk_dai_etdm_cal_mclk(afe, freq, dai->id); 24571de9a54aSTrevor Wu } 24581de9a54aSTrevor Wu 24591de9a54aSTrevor Wu /* dai driver */ 24601de9a54aSTrevor Wu #define MTK_ETDM_RATES (SNDRV_PCM_RATE_8000_384000) 24611de9a54aSTrevor Wu 24621de9a54aSTrevor Wu #define MTK_ETDM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ 24631de9a54aSTrevor Wu SNDRV_PCM_FMTBIT_S24_LE |\ 24641de9a54aSTrevor Wu SNDRV_PCM_FMTBIT_S32_LE) 24651de9a54aSTrevor Wu 24661de9a54aSTrevor Wu static int mtk_dai_etdm_probe(struct snd_soc_dai *dai) 24671de9a54aSTrevor Wu { 24681de9a54aSTrevor Wu struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 24691de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 2470ff728899STrevor Wu struct mtk_dai_etdm_priv *etdm_data; 24711de9a54aSTrevor Wu 24721de9a54aSTrevor Wu dev_dbg(dai->dev, "%s id %d\n", __func__, dai->id); 24731de9a54aSTrevor Wu 2474ff728899STrevor Wu if (!mt8195_afe_etdm_is_valid(dai->id)) 2475ff728899STrevor Wu return -EINVAL; 2476ff728899STrevor Wu 2477ff728899STrevor Wu etdm_data = afe_priv->dai_priv[dai->id]; 24781de9a54aSTrevor Wu if (etdm_data->mclk_freq) { 24791de9a54aSTrevor Wu dev_dbg(afe->dev, "MCLK always on, rate %d\n", 24801de9a54aSTrevor Wu etdm_data->mclk_freq); 24811de9a54aSTrevor Wu pm_runtime_get_sync(afe->dev); 24821de9a54aSTrevor Wu mtk_dai_etdm_mclk_configure(afe, dai->id); 24831de9a54aSTrevor Wu mtk_dai_etdm_enable_mclk(afe, dai->id); 24841de9a54aSTrevor Wu pm_runtime_put_sync(afe->dev); 24851de9a54aSTrevor Wu } 24861de9a54aSTrevor Wu return 0; 24871de9a54aSTrevor Wu } 24881de9a54aSTrevor Wu 2489*d656593bSKuninori Morimoto static const struct snd_soc_dai_ops mtk_dai_hdmitx_dptx_ops = { 2490*d656593bSKuninori Morimoto .startup = mtk_dai_hdmitx_dptx_startup, 2491*d656593bSKuninori Morimoto .shutdown = mtk_dai_hdmitx_dptx_shutdown, 2492*d656593bSKuninori Morimoto .hw_params = mtk_dai_hdmitx_dptx_hw_params, 2493*d656593bSKuninori Morimoto .trigger = mtk_dai_hdmitx_dptx_trigger, 2494*d656593bSKuninori Morimoto .set_sysclk = mtk_dai_hdmitx_dptx_set_sysclk, 2495*d656593bSKuninori Morimoto .set_fmt = mtk_dai_etdm_set_fmt, 2496*d656593bSKuninori Morimoto }; 2497*d656593bSKuninori Morimoto 2498*d656593bSKuninori Morimoto static const struct snd_soc_dai_ops mtk_dai_hdmitx_dptx_ops2 = { 2499*d656593bSKuninori Morimoto .probe = mtk_dai_etdm_probe, 2500*d656593bSKuninori Morimoto .startup = mtk_dai_hdmitx_dptx_startup, 2501*d656593bSKuninori Morimoto .shutdown = mtk_dai_hdmitx_dptx_shutdown, 2502*d656593bSKuninori Morimoto .hw_params = mtk_dai_hdmitx_dptx_hw_params, 2503*d656593bSKuninori Morimoto .trigger = mtk_dai_hdmitx_dptx_trigger, 2504*d656593bSKuninori Morimoto .set_sysclk = mtk_dai_hdmitx_dptx_set_sysclk, 2505*d656593bSKuninori Morimoto .set_fmt = mtk_dai_etdm_set_fmt, 2506*d656593bSKuninori Morimoto }; 2507*d656593bSKuninori Morimoto 2508*d656593bSKuninori Morimoto static const struct snd_soc_dai_ops mtk_dai_etdm_ops = { 2509*d656593bSKuninori Morimoto .probe = mtk_dai_etdm_probe, 2510*d656593bSKuninori Morimoto .startup = mtk_dai_etdm_startup, 2511*d656593bSKuninori Morimoto .shutdown = mtk_dai_etdm_shutdown, 2512*d656593bSKuninori Morimoto .hw_params = mtk_dai_etdm_hw_params, 2513*d656593bSKuninori Morimoto .trigger = mtk_dai_etdm_trigger, 2514*d656593bSKuninori Morimoto .set_sysclk = mtk_dai_etdm_set_sysclk, 2515*d656593bSKuninori Morimoto .set_fmt = mtk_dai_etdm_set_fmt, 2516*d656593bSKuninori Morimoto .set_tdm_slot = mtk_dai_etdm_set_tdm_slot, 2517*d656593bSKuninori Morimoto }; 2518*d656593bSKuninori Morimoto 25191de9a54aSTrevor Wu static struct snd_soc_dai_driver mtk_dai_etdm_driver[] = { 25201de9a54aSTrevor Wu { 25211de9a54aSTrevor Wu .name = "DPTX", 25221de9a54aSTrevor Wu .id = MT8195_AFE_IO_DPTX, 25231de9a54aSTrevor Wu .playback = { 25241de9a54aSTrevor Wu .stream_name = "DPTX Playback", 25251de9a54aSTrevor Wu .channels_min = 1, 25261de9a54aSTrevor Wu .channels_max = 8, 25271de9a54aSTrevor Wu .rates = MTK_ETDM_RATES, 25281de9a54aSTrevor Wu .formats = MTK_ETDM_FORMATS, 25291de9a54aSTrevor Wu }, 25301de9a54aSTrevor Wu .ops = &mtk_dai_hdmitx_dptx_ops, 25311de9a54aSTrevor Wu }, 25321de9a54aSTrevor Wu { 25331de9a54aSTrevor Wu .name = "ETDM1_IN", 25341de9a54aSTrevor Wu .id = MT8195_AFE_IO_ETDM1_IN, 25351de9a54aSTrevor Wu .capture = { 25361de9a54aSTrevor Wu .stream_name = "ETDM1 Capture", 25371de9a54aSTrevor Wu .channels_min = 1, 25381de9a54aSTrevor Wu .channels_max = 24, 25391de9a54aSTrevor Wu .rates = MTK_ETDM_RATES, 25401de9a54aSTrevor Wu .formats = MTK_ETDM_FORMATS, 25411de9a54aSTrevor Wu }, 25421de9a54aSTrevor Wu .ops = &mtk_dai_etdm_ops, 25431de9a54aSTrevor Wu }, 25441de9a54aSTrevor Wu { 25451de9a54aSTrevor Wu .name = "ETDM2_IN", 25461de9a54aSTrevor Wu .id = MT8195_AFE_IO_ETDM2_IN, 25471de9a54aSTrevor Wu .capture = { 25481de9a54aSTrevor Wu .stream_name = "ETDM2 Capture", 25491de9a54aSTrevor Wu .channels_min = 1, 25501de9a54aSTrevor Wu .channels_max = 16, 25511de9a54aSTrevor Wu .rates = MTK_ETDM_RATES, 25521de9a54aSTrevor Wu .formats = MTK_ETDM_FORMATS, 25531de9a54aSTrevor Wu }, 25541de9a54aSTrevor Wu .ops = &mtk_dai_etdm_ops, 25551de9a54aSTrevor Wu }, 25561de9a54aSTrevor Wu { 25571de9a54aSTrevor Wu .name = "ETDM1_OUT", 25581de9a54aSTrevor Wu .id = MT8195_AFE_IO_ETDM1_OUT, 25591de9a54aSTrevor Wu .playback = { 25601de9a54aSTrevor Wu .stream_name = "ETDM1 Playback", 25611de9a54aSTrevor Wu .channels_min = 1, 25621de9a54aSTrevor Wu .channels_max = 24, 25631de9a54aSTrevor Wu .rates = MTK_ETDM_RATES, 25641de9a54aSTrevor Wu .formats = MTK_ETDM_FORMATS, 25651de9a54aSTrevor Wu }, 25661de9a54aSTrevor Wu .ops = &mtk_dai_etdm_ops, 25671de9a54aSTrevor Wu }, 25681de9a54aSTrevor Wu { 25691de9a54aSTrevor Wu .name = "ETDM2_OUT", 25701de9a54aSTrevor Wu .id = MT8195_AFE_IO_ETDM2_OUT, 25711de9a54aSTrevor Wu .playback = { 25721de9a54aSTrevor Wu .stream_name = "ETDM2 Playback", 25731de9a54aSTrevor Wu .channels_min = 1, 25741de9a54aSTrevor Wu .channels_max = 24, 25751de9a54aSTrevor Wu .rates = MTK_ETDM_RATES, 25761de9a54aSTrevor Wu .formats = MTK_ETDM_FORMATS, 25771de9a54aSTrevor Wu }, 25781de9a54aSTrevor Wu .ops = &mtk_dai_etdm_ops, 25791de9a54aSTrevor Wu }, 25801de9a54aSTrevor Wu { 25811de9a54aSTrevor Wu .name = "ETDM3_OUT", 25821de9a54aSTrevor Wu .id = MT8195_AFE_IO_ETDM3_OUT, 25831de9a54aSTrevor Wu .playback = { 25841de9a54aSTrevor Wu .stream_name = "ETDM3 Playback", 25851de9a54aSTrevor Wu .channels_min = 1, 25861de9a54aSTrevor Wu .channels_max = 8, 25871de9a54aSTrevor Wu .rates = MTK_ETDM_RATES, 25881de9a54aSTrevor Wu .formats = MTK_ETDM_FORMATS, 25891de9a54aSTrevor Wu }, 2590*d656593bSKuninori Morimoto .ops = &mtk_dai_hdmitx_dptx_ops2, 25911de9a54aSTrevor Wu }, 25921de9a54aSTrevor Wu }; 25931de9a54aSTrevor Wu 25941de9a54aSTrevor Wu static void mt8195_etdm_update_sync_info(struct mtk_base_afe *afe) 25951de9a54aSTrevor Wu { 25961de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 25971de9a54aSTrevor Wu struct mtk_dai_etdm_priv *etdm_data; 25981de9a54aSTrevor Wu struct mtk_dai_etdm_priv *mst_data; 25991de9a54aSTrevor Wu int i; 26001de9a54aSTrevor Wu int mst_dai_id; 26011de9a54aSTrevor Wu 26021de9a54aSTrevor Wu for (i = MT8195_AFE_IO_ETDM_START; i < MT8195_AFE_IO_ETDM_END; i++) { 26031de9a54aSTrevor Wu etdm_data = afe_priv->dai_priv[i]; 26041de9a54aSTrevor Wu if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) { 26051de9a54aSTrevor Wu mst_dai_id = etdm_data->cowork_source_id; 2606ff728899STrevor Wu if (!mt8195_afe_etdm_is_valid(mst_dai_id)) { 2607ff728899STrevor Wu dev_err(afe->dev, "%s invalid dai id %d\n", 2608ff728899STrevor Wu __func__, mst_dai_id); 2609ff728899STrevor Wu return; 2610ff728899STrevor Wu } 26111de9a54aSTrevor Wu mst_data = afe_priv->dai_priv[mst_dai_id]; 26121de9a54aSTrevor Wu if (mst_data->cowork_source_id != COWORK_ETDM_NONE) 26131de9a54aSTrevor Wu dev_info(afe->dev, "%s [%d] wrong sync source\n" 26141de9a54aSTrevor Wu , __func__, i); 26151de9a54aSTrevor Wu mst_data->cowork_slv_id[mst_data->cowork_slv_count] = i; 26161de9a54aSTrevor Wu mst_data->cowork_slv_count++; 26171de9a54aSTrevor Wu } 26181de9a54aSTrevor Wu } 26191de9a54aSTrevor Wu } 26201de9a54aSTrevor Wu 26211de9a54aSTrevor Wu static void mt8195_dai_etdm_parse_of(struct mtk_base_afe *afe) 26221de9a54aSTrevor Wu { 26231de9a54aSTrevor Wu const struct device_node *of_node = afe->dev->of_node; 26241de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 26251de9a54aSTrevor Wu struct mtk_dai_etdm_priv *etdm_data; 26261de9a54aSTrevor Wu int i, j; 26271de9a54aSTrevor Wu char prop[48]; 26281de9a54aSTrevor Wu u8 disable_chn[MT8195_ETDM_MAX_CHANNELS]; 26291de9a54aSTrevor Wu int max_chn = MT8195_ETDM_MAX_CHANNELS; 26301de9a54aSTrevor Wu u32 sel; 26311de9a54aSTrevor Wu int ret; 26321de9a54aSTrevor Wu int dai_id; 26331de9a54aSTrevor Wu unsigned int sync_id; 26341de9a54aSTrevor Wu struct { 26351de9a54aSTrevor Wu const char *name; 26361de9a54aSTrevor Wu const unsigned int sync_id; 26371de9a54aSTrevor Wu } of_afe_etdms[MT8195_AFE_IO_ETDM_NUM] = { 26381de9a54aSTrevor Wu {"etdm-in1", ETDM_SYNC_FROM_IN1}, 26391de9a54aSTrevor Wu {"etdm-in2", ETDM_SYNC_FROM_IN2}, 26401de9a54aSTrevor Wu {"etdm-out1", ETDM_SYNC_FROM_OUT1}, 26411de9a54aSTrevor Wu {"etdm-out2", ETDM_SYNC_FROM_OUT2}, 26421de9a54aSTrevor Wu {"etdm-out3", ETDM_SYNC_FROM_OUT3}, 26431de9a54aSTrevor Wu }; 26441de9a54aSTrevor Wu 26451de9a54aSTrevor Wu for (i = 0; i < MT8195_AFE_IO_ETDM_NUM; i++) { 26461de9a54aSTrevor Wu dai_id = ETDM_TO_DAI_ID(i); 2647ff728899STrevor Wu if (!mt8195_afe_etdm_is_valid(dai_id)) { 2648ff728899STrevor Wu dev_err(afe->dev, "%s invalid dai id %d\n", 2649ff728899STrevor Wu __func__, dai_id); 2650ff728899STrevor Wu return; 2651ff728899STrevor Wu } 2652ff728899STrevor Wu 26531de9a54aSTrevor Wu etdm_data = afe_priv->dai_priv[dai_id]; 26541de9a54aSTrevor Wu 26551de9a54aSTrevor Wu ret = snprintf(prop, sizeof(prop), 26561de9a54aSTrevor Wu "mediatek,%s-mclk-always-on-rate", 26571de9a54aSTrevor Wu of_afe_etdms[i].name); 26581de9a54aSTrevor Wu if (ret < 0) { 26591de9a54aSTrevor Wu dev_info(afe->dev, "%s snprintf err=%d\n", 26601de9a54aSTrevor Wu __func__, ret); 26611de9a54aSTrevor Wu return; 26621de9a54aSTrevor Wu } 26631de9a54aSTrevor Wu ret = of_property_read_u32(of_node, prop, &sel); 26641de9a54aSTrevor Wu if (ret == 0) { 26651de9a54aSTrevor Wu etdm_data->mclk_dir = SND_SOC_CLOCK_OUT; 26661de9a54aSTrevor Wu if (mtk_dai_etdm_cal_mclk(afe, sel, dai_id)) 26671de9a54aSTrevor Wu dev_info(afe->dev, "%s unsupported mclk %uHz\n", 26681de9a54aSTrevor Wu __func__, sel); 26691de9a54aSTrevor Wu } 26701de9a54aSTrevor Wu 26711de9a54aSTrevor Wu ret = snprintf(prop, sizeof(prop), 26721de9a54aSTrevor Wu "mediatek,%s-multi-pin-mode", 26731de9a54aSTrevor Wu of_afe_etdms[i].name); 26741de9a54aSTrevor Wu if (ret < 0) { 26751de9a54aSTrevor Wu dev_info(afe->dev, "%s snprintf err=%d\n", 26761de9a54aSTrevor Wu __func__, ret); 26771de9a54aSTrevor Wu return; 26781de9a54aSTrevor Wu } 26791de9a54aSTrevor Wu etdm_data->data_mode = of_property_read_bool(of_node, prop); 26801de9a54aSTrevor Wu 26811de9a54aSTrevor Wu ret = snprintf(prop, sizeof(prop), 26821de9a54aSTrevor Wu "mediatek,%s-cowork-source", 26831de9a54aSTrevor Wu of_afe_etdms[i].name); 26841de9a54aSTrevor Wu if (ret < 0) { 26851de9a54aSTrevor Wu dev_info(afe->dev, "%s snprintf err=%d\n", 26861de9a54aSTrevor Wu __func__, ret); 26871de9a54aSTrevor Wu return; 26881de9a54aSTrevor Wu } 26891de9a54aSTrevor Wu ret = of_property_read_u32(of_node, prop, &sel); 26901de9a54aSTrevor Wu if (ret == 0) { 26911de9a54aSTrevor Wu if (sel >= MT8195_AFE_IO_ETDM_NUM) { 26921de9a54aSTrevor Wu dev_info(afe->dev, "%s invalid id=%d\n", 26931de9a54aSTrevor Wu __func__, sel); 26941de9a54aSTrevor Wu etdm_data->cowork_source_id = COWORK_ETDM_NONE; 26951de9a54aSTrevor Wu } else { 26961de9a54aSTrevor Wu sync_id = of_afe_etdms[sel].sync_id; 26971de9a54aSTrevor Wu etdm_data->cowork_source_id = 26981de9a54aSTrevor Wu sync_to_dai_id(sync_id); 26991de9a54aSTrevor Wu } 27001de9a54aSTrevor Wu } else { 27011de9a54aSTrevor Wu etdm_data->cowork_source_id = COWORK_ETDM_NONE; 27021de9a54aSTrevor Wu } 27031de9a54aSTrevor Wu } 27041de9a54aSTrevor Wu 27051de9a54aSTrevor Wu /* etdm in only */ 27061de9a54aSTrevor Wu for (i = 0; i < 2; i++) { 2707b56ec299STrevor Wu dai_id = ETDM_TO_DAI_ID(i); 2708b56ec299STrevor Wu etdm_data = afe_priv->dai_priv[dai_id]; 2709b56ec299STrevor Wu 27101de9a54aSTrevor Wu ret = snprintf(prop, sizeof(prop), 27111de9a54aSTrevor Wu "mediatek,%s-chn-disabled", 27121de9a54aSTrevor Wu of_afe_etdms[i].name); 27131de9a54aSTrevor Wu if (ret < 0) { 27141de9a54aSTrevor Wu dev_info(afe->dev, "%s snprintf err=%d\n", 27151de9a54aSTrevor Wu __func__, ret); 27161de9a54aSTrevor Wu return; 27171de9a54aSTrevor Wu } 27181de9a54aSTrevor Wu ret = of_property_read_variable_u8_array(of_node, prop, 27191de9a54aSTrevor Wu disable_chn, 27201de9a54aSTrevor Wu 1, max_chn); 27211de9a54aSTrevor Wu if (ret < 0) 27221de9a54aSTrevor Wu continue; 27231de9a54aSTrevor Wu 27241de9a54aSTrevor Wu for (j = 0; j < ret; j++) { 27251de9a54aSTrevor Wu if (disable_chn[j] >= MT8195_ETDM_MAX_CHANNELS) 27261de9a54aSTrevor Wu dev_info(afe->dev, "%s [%d] invalid chn %u\n", 27271de9a54aSTrevor Wu __func__, j, disable_chn[j]); 27281de9a54aSTrevor Wu else 27291de9a54aSTrevor Wu etdm_data->in_disable_ch[disable_chn[j]] = true; 27301de9a54aSTrevor Wu } 27311de9a54aSTrevor Wu } 27321de9a54aSTrevor Wu mt8195_etdm_update_sync_info(afe); 27331de9a54aSTrevor Wu } 27341de9a54aSTrevor Wu 27351de9a54aSTrevor Wu static int init_etdm_priv_data(struct mtk_base_afe *afe) 27361de9a54aSTrevor Wu { 27371de9a54aSTrevor Wu struct mt8195_afe_private *afe_priv = afe->platform_priv; 27381de9a54aSTrevor Wu struct mtk_dai_etdm_priv *etdm_priv; 27391de9a54aSTrevor Wu int i; 27401de9a54aSTrevor Wu 27411de9a54aSTrevor Wu for (i = MT8195_AFE_IO_ETDM_START; i < MT8195_AFE_IO_ETDM_END; i++) { 27421de9a54aSTrevor Wu etdm_priv = devm_kzalloc(afe->dev, 27431de9a54aSTrevor Wu sizeof(struct mtk_dai_etdm_priv), 27441de9a54aSTrevor Wu GFP_KERNEL); 27451de9a54aSTrevor Wu if (!etdm_priv) 27461de9a54aSTrevor Wu return -ENOMEM; 27471de9a54aSTrevor Wu 27481de9a54aSTrevor Wu afe_priv->dai_priv[i] = etdm_priv; 27491de9a54aSTrevor Wu } 27501de9a54aSTrevor Wu 27511de9a54aSTrevor Wu afe_priv->dai_priv[MT8195_AFE_IO_DPTX] = 27521de9a54aSTrevor Wu afe_priv->dai_priv[MT8195_AFE_IO_ETDM3_OUT]; 27531de9a54aSTrevor Wu 27541de9a54aSTrevor Wu mt8195_dai_etdm_parse_of(afe); 27551de9a54aSTrevor Wu return 0; 27561de9a54aSTrevor Wu } 27571de9a54aSTrevor Wu 27581de9a54aSTrevor Wu int mt8195_dai_etdm_register(struct mtk_base_afe *afe) 27591de9a54aSTrevor Wu { 27601de9a54aSTrevor Wu struct mtk_base_afe_dai *dai; 27611de9a54aSTrevor Wu 27621de9a54aSTrevor Wu dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL); 27631de9a54aSTrevor Wu if (!dai) 27641de9a54aSTrevor Wu return -ENOMEM; 27651de9a54aSTrevor Wu 27661de9a54aSTrevor Wu list_add(&dai->list, &afe->sub_dais); 27671de9a54aSTrevor Wu 27681de9a54aSTrevor Wu dai->dai_drivers = mtk_dai_etdm_driver; 27691de9a54aSTrevor Wu dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_etdm_driver); 27701de9a54aSTrevor Wu 27711de9a54aSTrevor Wu dai->dapm_widgets = mtk_dai_etdm_widgets; 27721de9a54aSTrevor Wu dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_etdm_widgets); 27731de9a54aSTrevor Wu dai->dapm_routes = mtk_dai_etdm_routes; 27741de9a54aSTrevor Wu dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_etdm_routes); 27751de9a54aSTrevor Wu dai->controls = mtk_dai_etdm_controls; 27761de9a54aSTrevor Wu dai->num_controls = ARRAY_SIZE(mtk_dai_etdm_controls); 27771de9a54aSTrevor Wu 27781de9a54aSTrevor Wu return init_etdm_priv_data(afe); 27791de9a54aSTrevor Wu } 2780