0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/delay.h>
0011 #include <linux/pm_runtime.h>
0012 #include <linux/regmap.h>
0013 #include <sound/pcm_params.h>
0014 #include "mt8195-afe-clk.h"
0015 #include "mt8195-afe-common.h"
0016 #include "mt8195-reg.h"
0017
0018 #define MT8195_ETDM_MAX_CHANNELS 24
0019 #define MT8195_ETDM_NORMAL_MAX_BCK_RATE 24576000
0020 #define ETDM_TO_DAI_ID(x) ((x) + MT8195_AFE_IO_ETDM_START)
0021 #define ENUM_TO_STR(x) #x
0022
0023 enum {
0024 MTK_DAI_ETDM_FORMAT_I2S = 0,
0025 MTK_DAI_ETDM_FORMAT_LJ,
0026 MTK_DAI_ETDM_FORMAT_RJ,
0027 MTK_DAI_ETDM_FORMAT_EIAJ,
0028 MTK_DAI_ETDM_FORMAT_DSPA,
0029 MTK_DAI_ETDM_FORMAT_DSPB,
0030 };
0031
0032 enum {
0033 MTK_DAI_ETDM_DATA_ONE_PIN = 0,
0034 MTK_DAI_ETDM_DATA_MULTI_PIN,
0035 };
0036
0037 enum {
0038 ETDM_IN,
0039 ETDM_OUT,
0040 };
0041
0042 enum {
0043 ETDM_IN_FROM_PAD,
0044 ETDM_IN_FROM_ETDM_OUT1,
0045 ETDM_IN_FROM_ETDM_OUT2,
0046 };
0047
0048 enum {
0049 ETDM_IN_SLAVE_FROM_PAD,
0050 ETDM_IN_SLAVE_FROM_ETDM_OUT1,
0051 ETDM_IN_SLAVE_FROM_ETDM_OUT2,
0052 };
0053
0054 enum {
0055 ETDM_OUT_SLAVE_FROM_PAD,
0056 ETDM_OUT_SLAVE_FROM_ETDM_IN1,
0057 ETDM_OUT_SLAVE_FROM_ETDM_IN2,
0058 };
0059
0060 enum {
0061 COWORK_ETDM_NONE = 0,
0062 COWORK_ETDM_IN1_M = 2,
0063 COWORK_ETDM_IN1_S = 3,
0064 COWORK_ETDM_IN2_M = 4,
0065 COWORK_ETDM_IN2_S = 5,
0066 COWORK_ETDM_OUT1_M = 10,
0067 COWORK_ETDM_OUT1_S = 11,
0068 COWORK_ETDM_OUT2_M = 12,
0069 COWORK_ETDM_OUT2_S = 13,
0070 COWORK_ETDM_OUT3_M = 14,
0071 COWORK_ETDM_OUT3_S = 15,
0072 };
0073
0074 enum {
0075 ETDM_RELATCH_TIMING_A1A2SYS,
0076 ETDM_RELATCH_TIMING_A3SYS,
0077 ETDM_RELATCH_TIMING_A4SYS,
0078 };
0079
0080 enum {
0081 ETDM_SYNC_NONE,
0082 ETDM_SYNC_FROM_IN1,
0083 ETDM_SYNC_FROM_IN2,
0084 ETDM_SYNC_FROM_OUT1,
0085 ETDM_SYNC_FROM_OUT2,
0086 ETDM_SYNC_FROM_OUT3,
0087 };
0088
0089 struct etdm_con_reg {
0090 unsigned int con0;
0091 unsigned int con1;
0092 unsigned int con2;
0093 unsigned int con3;
0094 unsigned int con4;
0095 unsigned int con5;
0096 };
0097
0098 struct mtk_dai_etdm_rate {
0099 unsigned int rate;
0100 unsigned int reg_value;
0101 };
0102
0103 struct mtk_dai_etdm_priv {
0104 unsigned int clock_mode;
0105 unsigned int data_mode;
0106 bool slave_mode;
0107 bool lrck_inv;
0108 bool bck_inv;
0109 unsigned int format;
0110 unsigned int slots;
0111 unsigned int lrck_width;
0112 unsigned int mclk_freq;
0113 unsigned int mclk_apll;
0114 unsigned int mclk_dir;
0115 int cowork_source_id;
0116 unsigned int cowork_slv_count;
0117 int cowork_slv_id[MT8195_AFE_IO_ETDM_NUM - 1];
0118 bool in_disable_ch[MT8195_ETDM_MAX_CHANNELS];
0119 unsigned int en_ref_cnt;
0120 };
0121
0122 static const struct mtk_dai_etdm_rate mt8195_etdm_rates[] = {
0123 { .rate = 8000, .reg_value = 0, },
0124 { .rate = 12000, .reg_value = 1, },
0125 { .rate = 16000, .reg_value = 2, },
0126 { .rate = 24000, .reg_value = 3, },
0127 { .rate = 32000, .reg_value = 4, },
0128 { .rate = 48000, .reg_value = 5, },
0129 { .rate = 96000, .reg_value = 7, },
0130 { .rate = 192000, .reg_value = 9, },
0131 { .rate = 384000, .reg_value = 11, },
0132 { .rate = 11025, .reg_value = 16, },
0133 { .rate = 22050, .reg_value = 17, },
0134 { .rate = 44100, .reg_value = 18, },
0135 { .rate = 88200, .reg_value = 19, },
0136 { .rate = 176400, .reg_value = 20, },
0137 { .rate = 352800, .reg_value = 21, },
0138 };
0139
0140 static int get_etdm_fs_timing(unsigned int rate)
0141 {
0142 int i;
0143
0144 for (i = 0; i < ARRAY_SIZE(mt8195_etdm_rates); i++)
0145 if (mt8195_etdm_rates[i].rate == rate)
0146 return mt8195_etdm_rates[i].reg_value;
0147
0148 return -EINVAL;
0149 }
0150
0151 static unsigned int get_etdm_ch_fixup(unsigned int channels)
0152 {
0153 if (channels > 16)
0154 return 24;
0155 else if (channels > 8)
0156 return 16;
0157 else if (channels > 4)
0158 return 8;
0159 else if (channels > 2)
0160 return 4;
0161 else
0162 return 2;
0163 }
0164
0165 static int get_etdm_reg(unsigned int dai_id, struct etdm_con_reg *etdm_reg)
0166 {
0167 switch (dai_id) {
0168 case MT8195_AFE_IO_ETDM1_IN:
0169 etdm_reg->con0 = ETDM_IN1_CON0;
0170 etdm_reg->con1 = ETDM_IN1_CON1;
0171 etdm_reg->con2 = ETDM_IN1_CON2;
0172 etdm_reg->con3 = ETDM_IN1_CON3;
0173 etdm_reg->con4 = ETDM_IN1_CON4;
0174 etdm_reg->con5 = ETDM_IN1_CON5;
0175 break;
0176 case MT8195_AFE_IO_ETDM2_IN:
0177 etdm_reg->con0 = ETDM_IN2_CON0;
0178 etdm_reg->con1 = ETDM_IN2_CON1;
0179 etdm_reg->con2 = ETDM_IN2_CON2;
0180 etdm_reg->con3 = ETDM_IN2_CON3;
0181 etdm_reg->con4 = ETDM_IN2_CON4;
0182 etdm_reg->con5 = ETDM_IN2_CON5;
0183 break;
0184 case MT8195_AFE_IO_ETDM1_OUT:
0185 etdm_reg->con0 = ETDM_OUT1_CON0;
0186 etdm_reg->con1 = ETDM_OUT1_CON1;
0187 etdm_reg->con2 = ETDM_OUT1_CON2;
0188 etdm_reg->con3 = ETDM_OUT1_CON3;
0189 etdm_reg->con4 = ETDM_OUT1_CON4;
0190 etdm_reg->con5 = ETDM_OUT1_CON5;
0191 break;
0192 case MT8195_AFE_IO_ETDM2_OUT:
0193 etdm_reg->con0 = ETDM_OUT2_CON0;
0194 etdm_reg->con1 = ETDM_OUT2_CON1;
0195 etdm_reg->con2 = ETDM_OUT2_CON2;
0196 etdm_reg->con3 = ETDM_OUT2_CON3;
0197 etdm_reg->con4 = ETDM_OUT2_CON4;
0198 etdm_reg->con5 = ETDM_OUT2_CON5;
0199 break;
0200 case MT8195_AFE_IO_ETDM3_OUT:
0201 case MT8195_AFE_IO_DPTX:
0202 etdm_reg->con0 = ETDM_OUT3_CON0;
0203 etdm_reg->con1 = ETDM_OUT3_CON1;
0204 etdm_reg->con2 = ETDM_OUT3_CON2;
0205 etdm_reg->con3 = ETDM_OUT3_CON3;
0206 etdm_reg->con4 = ETDM_OUT3_CON4;
0207 etdm_reg->con5 = ETDM_OUT3_CON5;
0208 break;
0209 default:
0210 return -EINVAL;
0211 }
0212 return 0;
0213 }
0214
0215 static int get_etdm_dir(unsigned int dai_id)
0216 {
0217 switch (dai_id) {
0218 case MT8195_AFE_IO_ETDM1_IN:
0219 case MT8195_AFE_IO_ETDM2_IN:
0220 return ETDM_IN;
0221 case MT8195_AFE_IO_ETDM1_OUT:
0222 case MT8195_AFE_IO_ETDM2_OUT:
0223 case MT8195_AFE_IO_ETDM3_OUT:
0224 return ETDM_OUT;
0225 default:
0226 return -EINVAL;
0227 }
0228 }
0229
0230 static int get_etdm_wlen(unsigned int bitwidth)
0231 {
0232 return bitwidth <= 16 ? 16 : 32;
0233 }
0234
0235 static int is_cowork_mode(struct snd_soc_dai *dai)
0236 {
0237 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
0238 struct mt8195_afe_private *afe_priv = afe->platform_priv;
0239 struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai->id];
0240
0241 return (etdm_data->cowork_slv_count > 0 ||
0242 etdm_data->cowork_source_id != COWORK_ETDM_NONE);
0243 }
0244
0245 static int sync_to_dai_id(int source_sel)
0246 {
0247 switch (source_sel) {
0248 case ETDM_SYNC_FROM_IN1:
0249 return MT8195_AFE_IO_ETDM1_IN;
0250 case ETDM_SYNC_FROM_IN2:
0251 return MT8195_AFE_IO_ETDM2_IN;
0252 case ETDM_SYNC_FROM_OUT1:
0253 return MT8195_AFE_IO_ETDM1_OUT;
0254 case ETDM_SYNC_FROM_OUT2:
0255 return MT8195_AFE_IO_ETDM2_OUT;
0256 case ETDM_SYNC_FROM_OUT3:
0257 return MT8195_AFE_IO_ETDM3_OUT;
0258 default:
0259 return 0;
0260 }
0261 }
0262
0263 static int get_etdm_cowork_master_id(struct snd_soc_dai *dai)
0264 {
0265 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
0266 struct mt8195_afe_private *afe_priv = afe->platform_priv;
0267 struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai->id];
0268 int dai_id = etdm_data->cowork_source_id;
0269
0270 if (dai_id == COWORK_ETDM_NONE)
0271 dai_id = dai->id;
0272
0273 return dai_id;
0274 }
0275
0276 static const struct snd_kcontrol_new mtk_dai_etdm_o048_mix[] = {
0277 SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN48, 20, 1, 0),
0278 SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN48, 22, 1, 0),
0279 SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN48_1, 14, 1, 0),
0280 SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN48_2, 6, 1, 0),
0281 };
0282
0283 static const struct snd_kcontrol_new mtk_dai_etdm_o049_mix[] = {
0284 SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN49, 21, 1, 0),
0285 SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN49, 23, 1, 0),
0286 SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN49_1, 15, 1, 0),
0287 SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN49_2, 7, 1, 0),
0288 };
0289
0290 static const struct snd_kcontrol_new mtk_dai_etdm_o050_mix[] = {
0291 SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN50, 24, 1, 0),
0292 SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN50_1, 16, 1, 0),
0293 };
0294
0295 static const struct snd_kcontrol_new mtk_dai_etdm_o051_mix[] = {
0296 SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN51, 25, 1, 0),
0297 SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN51_1, 17, 1, 0),
0298 };
0299
0300 static const struct snd_kcontrol_new mtk_dai_etdm_o052_mix[] = {
0301 SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN52, 26, 1, 0),
0302 SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN52_1, 18, 1, 0),
0303 };
0304
0305 static const struct snd_kcontrol_new mtk_dai_etdm_o053_mix[] = {
0306 SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN53, 27, 1, 0),
0307 SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN53_1, 19, 1, 0),
0308 };
0309
0310 static const struct snd_kcontrol_new mtk_dai_etdm_o054_mix[] = {
0311 SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN54, 28, 1, 0),
0312 SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN54_1, 20, 1, 0),
0313 };
0314
0315 static const struct snd_kcontrol_new mtk_dai_etdm_o055_mix[] = {
0316 SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN55, 29, 1, 0),
0317 SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN55_1, 21, 1, 0),
0318 };
0319
0320 static const struct snd_kcontrol_new mtk_dai_etdm_o056_mix[] = {
0321 SOC_DAPM_SINGLE_AUTODISABLE("I030 Switch", AFE_CONN56, 30, 1, 0),
0322 SOC_DAPM_SINGLE_AUTODISABLE("I054 Switch", AFE_CONN56_1, 22, 1, 0),
0323 };
0324
0325 static const struct snd_kcontrol_new mtk_dai_etdm_o057_mix[] = {
0326 SOC_DAPM_SINGLE_AUTODISABLE("I031 Switch", AFE_CONN57, 31, 1, 0),
0327 SOC_DAPM_SINGLE_AUTODISABLE("I055 Switch", AFE_CONN57_1, 23, 1, 0),
0328 };
0329
0330 static const struct snd_kcontrol_new mtk_dai_etdm_o058_mix[] = {
0331 SOC_DAPM_SINGLE_AUTODISABLE("I032 Switch", AFE_CONN58_1, 0, 1, 0),
0332 SOC_DAPM_SINGLE_AUTODISABLE("I056 Switch", AFE_CONN58_1, 24, 1, 0),
0333 };
0334
0335 static const struct snd_kcontrol_new mtk_dai_etdm_o059_mix[] = {
0336 SOC_DAPM_SINGLE_AUTODISABLE("I033 Switch", AFE_CONN59_1, 1, 1, 0),
0337 SOC_DAPM_SINGLE_AUTODISABLE("I057 Switch", AFE_CONN59_1, 25, 1, 0),
0338 };
0339
0340 static const struct snd_kcontrol_new mtk_dai_etdm_o060_mix[] = {
0341 SOC_DAPM_SINGLE_AUTODISABLE("I034 Switch", AFE_CONN60_1, 2, 1, 0),
0342 SOC_DAPM_SINGLE_AUTODISABLE("I058 Switch", AFE_CONN60_1, 26, 1, 0),
0343 };
0344
0345 static const struct snd_kcontrol_new mtk_dai_etdm_o061_mix[] = {
0346 SOC_DAPM_SINGLE_AUTODISABLE("I035 Switch", AFE_CONN61_1, 3, 1, 0),
0347 SOC_DAPM_SINGLE_AUTODISABLE("I059 Switch", AFE_CONN61_1, 27, 1, 0),
0348 };
0349
0350 static const struct snd_kcontrol_new mtk_dai_etdm_o062_mix[] = {
0351 SOC_DAPM_SINGLE_AUTODISABLE("I036 Switch", AFE_CONN62_1, 4, 1, 0),
0352 SOC_DAPM_SINGLE_AUTODISABLE("I060 Switch", AFE_CONN62_1, 28, 1, 0),
0353 };
0354
0355 static const struct snd_kcontrol_new mtk_dai_etdm_o063_mix[] = {
0356 SOC_DAPM_SINGLE_AUTODISABLE("I037 Switch", AFE_CONN63_1, 5, 1, 0),
0357 SOC_DAPM_SINGLE_AUTODISABLE("I061 Switch", AFE_CONN63_1, 29, 1, 0),
0358 };
0359
0360 static const struct snd_kcontrol_new mtk_dai_etdm_o064_mix[] = {
0361 SOC_DAPM_SINGLE_AUTODISABLE("I038 Switch", AFE_CONN64_1, 6, 1, 0),
0362 SOC_DAPM_SINGLE_AUTODISABLE("I062 Switch", AFE_CONN64_1, 30, 1, 0),
0363 };
0364
0365 static const struct snd_kcontrol_new mtk_dai_etdm_o065_mix[] = {
0366 SOC_DAPM_SINGLE_AUTODISABLE("I039 Switch", AFE_CONN65_1, 7, 1, 0),
0367 SOC_DAPM_SINGLE_AUTODISABLE("I063 Switch", AFE_CONN65_1, 31, 1, 0),
0368 };
0369
0370 static const struct snd_kcontrol_new mtk_dai_etdm_o066_mix[] = {
0371 SOC_DAPM_SINGLE_AUTODISABLE("I040 Switch", AFE_CONN66_1, 8, 1, 0),
0372 SOC_DAPM_SINGLE_AUTODISABLE("I064 Switch", AFE_CONN66_2, 0, 1, 0),
0373 };
0374
0375 static const struct snd_kcontrol_new mtk_dai_etdm_o067_mix[] = {
0376 SOC_DAPM_SINGLE_AUTODISABLE("I041 Switch", AFE_CONN67_1, 9, 1, 0),
0377 SOC_DAPM_SINGLE_AUTODISABLE("I065 Switch", AFE_CONN67_2, 1, 1, 0),
0378 };
0379
0380 static const struct snd_kcontrol_new mtk_dai_etdm_o068_mix[] = {
0381 SOC_DAPM_SINGLE_AUTODISABLE("I042 Switch", AFE_CONN68_1, 10, 1, 0),
0382 SOC_DAPM_SINGLE_AUTODISABLE("I066 Switch", AFE_CONN68_2, 2, 1, 0),
0383 };
0384
0385 static const struct snd_kcontrol_new mtk_dai_etdm_o069_mix[] = {
0386 SOC_DAPM_SINGLE_AUTODISABLE("I043 Switch", AFE_CONN69_1, 11, 1, 0),
0387 SOC_DAPM_SINGLE_AUTODISABLE("I067 Switch", AFE_CONN69_2, 3, 1, 0),
0388 };
0389
0390 static const struct snd_kcontrol_new mtk_dai_etdm_o070_mix[] = {
0391 SOC_DAPM_SINGLE_AUTODISABLE("I044 Switch", AFE_CONN70_1, 12, 1, 0),
0392 SOC_DAPM_SINGLE_AUTODISABLE("I068 Switch", AFE_CONN70_2, 4, 1, 0),
0393 };
0394
0395 static const struct snd_kcontrol_new mtk_dai_etdm_o071_mix[] = {
0396 SOC_DAPM_SINGLE_AUTODISABLE("I045 Switch", AFE_CONN71_1, 13, 1, 0),
0397 SOC_DAPM_SINGLE_AUTODISABLE("I069 Switch", AFE_CONN71_2, 5, 1, 0),
0398 };
0399
0400 static const struct snd_kcontrol_new mtk_dai_etdm_o072_mix[] = {
0401 SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN72, 20, 1, 0),
0402 SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN72, 22, 1, 0),
0403 SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN72_1, 14, 1, 0),
0404 SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN72_2, 6, 1, 0),
0405 };
0406
0407 static const struct snd_kcontrol_new mtk_dai_etdm_o073_mix[] = {
0408 SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN73, 21, 1, 0),
0409 SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN73, 23, 1, 0),
0410 SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN73_1, 15, 1, 0),
0411 SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN73_2, 7, 1, 0),
0412 };
0413
0414 static const struct snd_kcontrol_new mtk_dai_etdm_o074_mix[] = {
0415 SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN74, 24, 1, 0),
0416 SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN74_1, 16, 1, 0),
0417 };
0418
0419 static const struct snd_kcontrol_new mtk_dai_etdm_o075_mix[] = {
0420 SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN75, 25, 1, 0),
0421 SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN75_1, 17, 1, 0),
0422 };
0423
0424 static const struct snd_kcontrol_new mtk_dai_etdm_o076_mix[] = {
0425 SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN76, 26, 1, 0),
0426 SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN76_1, 18, 1, 0),
0427 };
0428
0429 static const struct snd_kcontrol_new mtk_dai_etdm_o077_mix[] = {
0430 SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN77, 27, 1, 0),
0431 SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN77_1, 19, 1, 0),
0432 };
0433
0434 static const struct snd_kcontrol_new mtk_dai_etdm_o078_mix[] = {
0435 SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN78, 28, 1, 0),
0436 SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN78_1, 20, 1, 0),
0437 };
0438
0439 static const struct snd_kcontrol_new mtk_dai_etdm_o079_mix[] = {
0440 SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN79, 29, 1, 0),
0441 SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN79_1, 21, 1, 0),
0442 };
0443
0444 static const struct snd_kcontrol_new mtk_dai_etdm_o080_mix[] = {
0445 SOC_DAPM_SINGLE_AUTODISABLE("I030 Switch", AFE_CONN80, 30, 1, 0),
0446 SOC_DAPM_SINGLE_AUTODISABLE("I054 Switch", AFE_CONN80_1, 22, 1, 0),
0447 };
0448
0449 static const struct snd_kcontrol_new mtk_dai_etdm_o081_mix[] = {
0450 SOC_DAPM_SINGLE_AUTODISABLE("I031 Switch", AFE_CONN81, 31, 1, 0),
0451 SOC_DAPM_SINGLE_AUTODISABLE("I055 Switch", AFE_CONN81_1, 23, 1, 0),
0452 };
0453
0454 static const struct snd_kcontrol_new mtk_dai_etdm_o082_mix[] = {
0455 SOC_DAPM_SINGLE_AUTODISABLE("I032 Switch", AFE_CONN82_1, 0, 1, 0),
0456 SOC_DAPM_SINGLE_AUTODISABLE("I056 Switch", AFE_CONN82_1, 24, 1, 0),
0457 };
0458
0459 static const struct snd_kcontrol_new mtk_dai_etdm_o083_mix[] = {
0460 SOC_DAPM_SINGLE_AUTODISABLE("I033 Switch", AFE_CONN83_1, 1, 1, 0),
0461 SOC_DAPM_SINGLE_AUTODISABLE("I057 Switch", AFE_CONN83_1, 25, 1, 0),
0462 };
0463
0464 static const struct snd_kcontrol_new mtk_dai_etdm_o084_mix[] = {
0465 SOC_DAPM_SINGLE_AUTODISABLE("I034 Switch", AFE_CONN84_1, 2, 1, 0),
0466 SOC_DAPM_SINGLE_AUTODISABLE("I058 Switch", AFE_CONN84_1, 26, 1, 0),
0467 };
0468
0469 static const struct snd_kcontrol_new mtk_dai_etdm_o085_mix[] = {
0470 SOC_DAPM_SINGLE_AUTODISABLE("I035 Switch", AFE_CONN85_1, 3, 1, 0),
0471 SOC_DAPM_SINGLE_AUTODISABLE("I059 Switch", AFE_CONN85_1, 27, 1, 0),
0472 };
0473
0474 static const struct snd_kcontrol_new mtk_dai_etdm_o086_mix[] = {
0475 SOC_DAPM_SINGLE_AUTODISABLE("I036 Switch", AFE_CONN86_1, 4, 1, 0),
0476 SOC_DAPM_SINGLE_AUTODISABLE("I060 Switch", AFE_CONN86_1, 28, 1, 0),
0477 };
0478
0479 static const struct snd_kcontrol_new mtk_dai_etdm_o087_mix[] = {
0480 SOC_DAPM_SINGLE_AUTODISABLE("I037 Switch", AFE_CONN87_1, 5, 1, 0),
0481 SOC_DAPM_SINGLE_AUTODISABLE("I061 Switch", AFE_CONN87_1, 29, 1, 0),
0482 };
0483
0484 static const struct snd_kcontrol_new mtk_dai_etdm_o088_mix[] = {
0485 SOC_DAPM_SINGLE_AUTODISABLE("I038 Switch", AFE_CONN88_1, 6, 1, 0),
0486 SOC_DAPM_SINGLE_AUTODISABLE("I062 Switch", AFE_CONN88_1, 30, 1, 0),
0487 };
0488
0489 static const struct snd_kcontrol_new mtk_dai_etdm_o089_mix[] = {
0490 SOC_DAPM_SINGLE_AUTODISABLE("I039 Switch", AFE_CONN89_1, 7, 1, 0),
0491 SOC_DAPM_SINGLE_AUTODISABLE("I063 Switch", AFE_CONN89_1, 31, 1, 0),
0492 };
0493
0494 static const struct snd_kcontrol_new mtk_dai_etdm_o090_mix[] = {
0495 SOC_DAPM_SINGLE_AUTODISABLE("I040 Switch", AFE_CONN90_1, 8, 1, 0),
0496 SOC_DAPM_SINGLE_AUTODISABLE("I064 Switch", AFE_CONN90_2, 0, 1, 0),
0497 };
0498
0499 static const struct snd_kcontrol_new mtk_dai_etdm_o091_mix[] = {
0500 SOC_DAPM_SINGLE_AUTODISABLE("I041 Switch", AFE_CONN91_1, 9, 1, 0),
0501 SOC_DAPM_SINGLE_AUTODISABLE("I065 Switch", AFE_CONN91_2, 1, 1, 0),
0502 };
0503
0504 static const struct snd_kcontrol_new mtk_dai_etdm_o092_mix[] = {
0505 SOC_DAPM_SINGLE_AUTODISABLE("I042 Switch", AFE_CONN92_1, 10, 1, 0),
0506 SOC_DAPM_SINGLE_AUTODISABLE("I066 Switch", AFE_CONN92_2, 2, 1, 0),
0507 };
0508
0509 static const struct snd_kcontrol_new mtk_dai_etdm_o093_mix[] = {
0510 SOC_DAPM_SINGLE_AUTODISABLE("I043 Switch", AFE_CONN93_1, 11, 1, 0),
0511 SOC_DAPM_SINGLE_AUTODISABLE("I067 Switch", AFE_CONN93_2, 3, 1, 0),
0512 };
0513
0514 static const struct snd_kcontrol_new mtk_dai_etdm_o094_mix[] = {
0515 SOC_DAPM_SINGLE_AUTODISABLE("I044 Switch", AFE_CONN94_1, 12, 1, 0),
0516 SOC_DAPM_SINGLE_AUTODISABLE("I068 Switch", AFE_CONN94_2, 4, 1, 0),
0517 };
0518
0519 static const struct snd_kcontrol_new mtk_dai_etdm_o095_mix[] = {
0520 SOC_DAPM_SINGLE_AUTODISABLE("I045 Switch", AFE_CONN95_1, 13, 1, 0),
0521 SOC_DAPM_SINGLE_AUTODISABLE("I069 Switch", AFE_CONN95_2, 5, 1, 0),
0522 };
0523
0524 static const char * const mt8195_etdm_clk_src_sel_text[] = {
0525 "26m",
0526 "a1sys_a2sys",
0527 "a3sys",
0528 "a4sys",
0529 };
0530
0531 static SOC_ENUM_SINGLE_EXT_DECL(etdmout_clk_src_enum,
0532 mt8195_etdm_clk_src_sel_text);
0533
0534 static const char * const hdmitx_dptx_mux_map[] = {
0535 "Disconnect", "Connect",
0536 };
0537
0538 static int hdmitx_dptx_mux_map_value[] = {
0539 0, 1,
0540 };
0541
0542
0543 static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(hdmi_out_mux_map_enum,
0544 SND_SOC_NOPM,
0545 0,
0546 1,
0547 hdmitx_dptx_mux_map,
0548 hdmitx_dptx_mux_map_value);
0549
0550 static const struct snd_kcontrol_new hdmi_out_mux_control =
0551 SOC_DAPM_ENUM("HDMI_OUT_MUX", hdmi_out_mux_map_enum);
0552
0553
0554 static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(dptx_out_mux_map_enum,
0555 SND_SOC_NOPM,
0556 0,
0557 1,
0558 hdmitx_dptx_mux_map,
0559 hdmitx_dptx_mux_map_value);
0560
0561 static const struct snd_kcontrol_new dptx_out_mux_control =
0562 SOC_DAPM_ENUM("DPTX_OUT_MUX", dptx_out_mux_map_enum);
0563
0564
0565 static const char *const afe_conn_hdmi_mux_map[] = {
0566 "CH0", "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7",
0567 };
0568
0569 static int afe_conn_hdmi_mux_map_value[] = {
0570 0, 1, 2, 3, 4, 5, 6, 7,
0571 };
0572
0573 static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch0_mux_map_enum,
0574 AFE_TDMOUT_CONN0,
0575 0,
0576 0xf,
0577 afe_conn_hdmi_mux_map,
0578 afe_conn_hdmi_mux_map_value);
0579
0580 static const struct snd_kcontrol_new hdmi_ch0_mux_control =
0581 SOC_DAPM_ENUM("HDMI_CH0_MUX", hdmi_ch0_mux_map_enum);
0582
0583 static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch1_mux_map_enum,
0584 AFE_TDMOUT_CONN0,
0585 4,
0586 0xf,
0587 afe_conn_hdmi_mux_map,
0588 afe_conn_hdmi_mux_map_value);
0589
0590 static const struct snd_kcontrol_new hdmi_ch1_mux_control =
0591 SOC_DAPM_ENUM("HDMI_CH1_MUX", hdmi_ch1_mux_map_enum);
0592
0593 static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch2_mux_map_enum,
0594 AFE_TDMOUT_CONN0,
0595 8,
0596 0xf,
0597 afe_conn_hdmi_mux_map,
0598 afe_conn_hdmi_mux_map_value);
0599
0600 static const struct snd_kcontrol_new hdmi_ch2_mux_control =
0601 SOC_DAPM_ENUM("HDMI_CH2_MUX", hdmi_ch2_mux_map_enum);
0602
0603 static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch3_mux_map_enum,
0604 AFE_TDMOUT_CONN0,
0605 12,
0606 0xf,
0607 afe_conn_hdmi_mux_map,
0608 afe_conn_hdmi_mux_map_value);
0609
0610 static const struct snd_kcontrol_new hdmi_ch3_mux_control =
0611 SOC_DAPM_ENUM("HDMI_CH3_MUX", hdmi_ch3_mux_map_enum);
0612
0613 static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch4_mux_map_enum,
0614 AFE_TDMOUT_CONN0,
0615 16,
0616 0xf,
0617 afe_conn_hdmi_mux_map,
0618 afe_conn_hdmi_mux_map_value);
0619
0620 static const struct snd_kcontrol_new hdmi_ch4_mux_control =
0621 SOC_DAPM_ENUM("HDMI_CH4_MUX", hdmi_ch4_mux_map_enum);
0622
0623 static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch5_mux_map_enum,
0624 AFE_TDMOUT_CONN0,
0625 20,
0626 0xf,
0627 afe_conn_hdmi_mux_map,
0628 afe_conn_hdmi_mux_map_value);
0629
0630 static const struct snd_kcontrol_new hdmi_ch5_mux_control =
0631 SOC_DAPM_ENUM("HDMI_CH5_MUX", hdmi_ch5_mux_map_enum);
0632
0633 static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch6_mux_map_enum,
0634 AFE_TDMOUT_CONN0,
0635 24,
0636 0xf,
0637 afe_conn_hdmi_mux_map,
0638 afe_conn_hdmi_mux_map_value);
0639
0640 static const struct snd_kcontrol_new hdmi_ch6_mux_control =
0641 SOC_DAPM_ENUM("HDMI_CH6_MUX", hdmi_ch6_mux_map_enum);
0642
0643 static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch7_mux_map_enum,
0644 AFE_TDMOUT_CONN0,
0645 28,
0646 0xf,
0647 afe_conn_hdmi_mux_map,
0648 afe_conn_hdmi_mux_map_value);
0649
0650 static const struct snd_kcontrol_new hdmi_ch7_mux_control =
0651 SOC_DAPM_ENUM("HDMI_CH7_MUX", hdmi_ch7_mux_map_enum);
0652
0653 static int mt8195_etdm_clk_src_sel_put(struct snd_kcontrol *kcontrol,
0654 struct snd_ctl_elem_value *ucontrol)
0655 {
0656 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
0657 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
0658 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
0659 unsigned int source = ucontrol->value.enumerated.item[0];
0660 unsigned int val;
0661 unsigned int mask;
0662 unsigned int reg;
0663
0664 if (source >= e->items)
0665 return -EINVAL;
0666
0667 reg = 0;
0668 if (!strcmp(kcontrol->id.name, "ETDM_OUT1_Clock_Source")) {
0669 reg = ETDM_OUT1_CON4;
0670 mask = ETDM_OUT_CON4_CLOCK_MASK;
0671 val = ETDM_OUT_CON4_CLOCK(source);
0672 } else if (!strcmp(kcontrol->id.name, "ETDM_OUT2_Clock_Source")) {
0673 reg = ETDM_OUT2_CON4;
0674 mask = ETDM_OUT_CON4_CLOCK_MASK;
0675 val = ETDM_OUT_CON4_CLOCK(source);
0676 } else if (!strcmp(kcontrol->id.name, "ETDM_OUT3_Clock_Source")) {
0677 reg = ETDM_OUT3_CON4;
0678 mask = ETDM_OUT_CON4_CLOCK_MASK;
0679 val = ETDM_OUT_CON4_CLOCK(source);
0680 } else if (!strcmp(kcontrol->id.name, "ETDM_IN1_Clock_Source")) {
0681 reg = ETDM_IN1_CON2;
0682 mask = ETDM_IN_CON2_CLOCK_MASK;
0683 val = ETDM_IN_CON2_CLOCK(source);
0684 } else if (!strcmp(kcontrol->id.name, "ETDM_IN2_Clock_Source")) {
0685 reg = ETDM_IN2_CON2;
0686 mask = ETDM_IN_CON2_CLOCK_MASK;
0687 val = ETDM_IN_CON2_CLOCK(source);
0688 }
0689
0690 if (reg)
0691 regmap_update_bits(afe->regmap, reg, mask, val);
0692
0693 return 0;
0694 }
0695
0696 static int mt8195_etdm_clk_src_sel_get(struct snd_kcontrol *kcontrol,
0697 struct snd_ctl_elem_value *ucontrol)
0698 {
0699 struct snd_soc_component *component =
0700 snd_soc_kcontrol_component(kcontrol);
0701 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
0702 unsigned int value = 0;
0703 unsigned int reg = 0;
0704 unsigned int mask = 0;
0705 unsigned int shift = 0;
0706
0707 if (!strcmp(kcontrol->id.name, "ETDM_OUT1_Clock_Source")) {
0708 reg = ETDM_OUT1_CON4;
0709 mask = ETDM_OUT_CON4_CLOCK_MASK;
0710 shift = ETDM_OUT_CON4_CLOCK_SHIFT;
0711 } else if (!strcmp(kcontrol->id.name, "ETDM_OUT2_Clock_Source")) {
0712 reg = ETDM_OUT2_CON4;
0713 mask = ETDM_OUT_CON4_CLOCK_MASK;
0714 shift = ETDM_OUT_CON4_CLOCK_SHIFT;
0715 } else if (!strcmp(kcontrol->id.name, "ETDM_OUT3_Clock_Source")) {
0716 reg = ETDM_OUT3_CON4;
0717 mask = ETDM_OUT_CON4_CLOCK_MASK;
0718 shift = ETDM_OUT_CON4_CLOCK_SHIFT;
0719 } else if (!strcmp(kcontrol->id.name, "ETDM_IN1_Clock_Source")) {
0720 reg = ETDM_IN1_CON2;
0721 mask = ETDM_IN_CON2_CLOCK_MASK;
0722 shift = ETDM_IN_CON2_CLOCK_SHIFT;
0723 } else if (!strcmp(kcontrol->id.name, "ETDM_IN2_Clock_Source")) {
0724 reg = ETDM_IN2_CON2;
0725 mask = ETDM_IN_CON2_CLOCK_MASK;
0726 shift = ETDM_IN_CON2_CLOCK_SHIFT;
0727 }
0728
0729 if (reg)
0730 regmap_read(afe->regmap, reg, &value);
0731
0732 value &= mask;
0733 value >>= shift;
0734 ucontrol->value.enumerated.item[0] = value;
0735 return 0;
0736 }
0737
0738 static const struct snd_kcontrol_new mtk_dai_etdm_controls[] = {
0739 SOC_ENUM_EXT("ETDM_OUT1_Clock_Source",
0740 etdmout_clk_src_enum,
0741 mt8195_etdm_clk_src_sel_get,
0742 mt8195_etdm_clk_src_sel_put),
0743 SOC_ENUM_EXT("ETDM_OUT2_Clock_Source",
0744 etdmout_clk_src_enum,
0745 mt8195_etdm_clk_src_sel_get,
0746 mt8195_etdm_clk_src_sel_put),
0747 SOC_ENUM_EXT("ETDM_OUT3_Clock_Source",
0748 etdmout_clk_src_enum,
0749 mt8195_etdm_clk_src_sel_get,
0750 mt8195_etdm_clk_src_sel_put),
0751 SOC_ENUM_EXT("ETDM_IN1_Clock_Source",
0752 etdmout_clk_src_enum,
0753 mt8195_etdm_clk_src_sel_get,
0754 mt8195_etdm_clk_src_sel_put),
0755 SOC_ENUM_EXT("ETDM_IN2_Clock_Source",
0756 etdmout_clk_src_enum,
0757 mt8195_etdm_clk_src_sel_get,
0758 mt8195_etdm_clk_src_sel_put),
0759 };
0760
0761 static const struct snd_soc_dapm_widget mtk_dai_etdm_widgets[] = {
0762
0763 SND_SOC_DAPM_MIXER("I012", SND_SOC_NOPM, 0, 0, NULL, 0),
0764 SND_SOC_DAPM_MIXER("I013", SND_SOC_NOPM, 0, 0, NULL, 0),
0765 SND_SOC_DAPM_MIXER("I014", SND_SOC_NOPM, 0, 0, NULL, 0),
0766 SND_SOC_DAPM_MIXER("I015", SND_SOC_NOPM, 0, 0, NULL, 0),
0767 SND_SOC_DAPM_MIXER("I016", SND_SOC_NOPM, 0, 0, NULL, 0),
0768 SND_SOC_DAPM_MIXER("I017", SND_SOC_NOPM, 0, 0, NULL, 0),
0769 SND_SOC_DAPM_MIXER("I018", SND_SOC_NOPM, 0, 0, NULL, 0),
0770 SND_SOC_DAPM_MIXER("I019", SND_SOC_NOPM, 0, 0, NULL, 0),
0771
0772
0773 SND_SOC_DAPM_MIXER("I072", SND_SOC_NOPM, 0, 0, NULL, 0),
0774 SND_SOC_DAPM_MIXER("I073", SND_SOC_NOPM, 0, 0, NULL, 0),
0775 SND_SOC_DAPM_MIXER("I074", SND_SOC_NOPM, 0, 0, NULL, 0),
0776 SND_SOC_DAPM_MIXER("I075", SND_SOC_NOPM, 0, 0, NULL, 0),
0777 SND_SOC_DAPM_MIXER("I076", SND_SOC_NOPM, 0, 0, NULL, 0),
0778 SND_SOC_DAPM_MIXER("I077", SND_SOC_NOPM, 0, 0, NULL, 0),
0779 SND_SOC_DAPM_MIXER("I078", SND_SOC_NOPM, 0, 0, NULL, 0),
0780 SND_SOC_DAPM_MIXER("I079", SND_SOC_NOPM, 0, 0, NULL, 0),
0781 SND_SOC_DAPM_MIXER("I080", SND_SOC_NOPM, 0, 0, NULL, 0),
0782 SND_SOC_DAPM_MIXER("I081", SND_SOC_NOPM, 0, 0, NULL, 0),
0783 SND_SOC_DAPM_MIXER("I082", SND_SOC_NOPM, 0, 0, NULL, 0),
0784 SND_SOC_DAPM_MIXER("I083", SND_SOC_NOPM, 0, 0, NULL, 0),
0785 SND_SOC_DAPM_MIXER("I084", SND_SOC_NOPM, 0, 0, NULL, 0),
0786 SND_SOC_DAPM_MIXER("I085", SND_SOC_NOPM, 0, 0, NULL, 0),
0787 SND_SOC_DAPM_MIXER("I086", SND_SOC_NOPM, 0, 0, NULL, 0),
0788 SND_SOC_DAPM_MIXER("I087", SND_SOC_NOPM, 0, 0, NULL, 0),
0789 SND_SOC_DAPM_MIXER("I088", SND_SOC_NOPM, 0, 0, NULL, 0),
0790 SND_SOC_DAPM_MIXER("I089", SND_SOC_NOPM, 0, 0, NULL, 0),
0791 SND_SOC_DAPM_MIXER("I090", SND_SOC_NOPM, 0, 0, NULL, 0),
0792 SND_SOC_DAPM_MIXER("I091", SND_SOC_NOPM, 0, 0, NULL, 0),
0793 SND_SOC_DAPM_MIXER("I092", SND_SOC_NOPM, 0, 0, NULL, 0),
0794 SND_SOC_DAPM_MIXER("I093", SND_SOC_NOPM, 0, 0, NULL, 0),
0795 SND_SOC_DAPM_MIXER("I094", SND_SOC_NOPM, 0, 0, NULL, 0),
0796 SND_SOC_DAPM_MIXER("I095", SND_SOC_NOPM, 0, 0, NULL, 0),
0797
0798
0799 SND_SOC_DAPM_MIXER("O048", SND_SOC_NOPM, 0, 0,
0800 mtk_dai_etdm_o048_mix,
0801 ARRAY_SIZE(mtk_dai_etdm_o048_mix)),
0802 SND_SOC_DAPM_MIXER("O049", SND_SOC_NOPM, 0, 0,
0803 mtk_dai_etdm_o049_mix,
0804 ARRAY_SIZE(mtk_dai_etdm_o049_mix)),
0805 SND_SOC_DAPM_MIXER("O050", SND_SOC_NOPM, 0, 0,
0806 mtk_dai_etdm_o050_mix,
0807 ARRAY_SIZE(mtk_dai_etdm_o050_mix)),
0808 SND_SOC_DAPM_MIXER("O051", SND_SOC_NOPM, 0, 0,
0809 mtk_dai_etdm_o051_mix,
0810 ARRAY_SIZE(mtk_dai_etdm_o051_mix)),
0811 SND_SOC_DAPM_MIXER("O052", SND_SOC_NOPM, 0, 0,
0812 mtk_dai_etdm_o052_mix,
0813 ARRAY_SIZE(mtk_dai_etdm_o052_mix)),
0814 SND_SOC_DAPM_MIXER("O053", SND_SOC_NOPM, 0, 0,
0815 mtk_dai_etdm_o053_mix,
0816 ARRAY_SIZE(mtk_dai_etdm_o053_mix)),
0817 SND_SOC_DAPM_MIXER("O054", SND_SOC_NOPM, 0, 0,
0818 mtk_dai_etdm_o054_mix,
0819 ARRAY_SIZE(mtk_dai_etdm_o054_mix)),
0820 SND_SOC_DAPM_MIXER("O055", SND_SOC_NOPM, 0, 0,
0821 mtk_dai_etdm_o055_mix,
0822 ARRAY_SIZE(mtk_dai_etdm_o055_mix)),
0823 SND_SOC_DAPM_MIXER("O056", SND_SOC_NOPM, 0, 0,
0824 mtk_dai_etdm_o056_mix,
0825 ARRAY_SIZE(mtk_dai_etdm_o056_mix)),
0826 SND_SOC_DAPM_MIXER("O057", SND_SOC_NOPM, 0, 0,
0827 mtk_dai_etdm_o057_mix,
0828 ARRAY_SIZE(mtk_dai_etdm_o057_mix)),
0829 SND_SOC_DAPM_MIXER("O058", SND_SOC_NOPM, 0, 0,
0830 mtk_dai_etdm_o058_mix,
0831 ARRAY_SIZE(mtk_dai_etdm_o058_mix)),
0832 SND_SOC_DAPM_MIXER("O059", SND_SOC_NOPM, 0, 0,
0833 mtk_dai_etdm_o059_mix,
0834 ARRAY_SIZE(mtk_dai_etdm_o059_mix)),
0835 SND_SOC_DAPM_MIXER("O060", SND_SOC_NOPM, 0, 0,
0836 mtk_dai_etdm_o060_mix,
0837 ARRAY_SIZE(mtk_dai_etdm_o060_mix)),
0838 SND_SOC_DAPM_MIXER("O061", SND_SOC_NOPM, 0, 0,
0839 mtk_dai_etdm_o061_mix,
0840 ARRAY_SIZE(mtk_dai_etdm_o061_mix)),
0841 SND_SOC_DAPM_MIXER("O062", SND_SOC_NOPM, 0, 0,
0842 mtk_dai_etdm_o062_mix,
0843 ARRAY_SIZE(mtk_dai_etdm_o062_mix)),
0844 SND_SOC_DAPM_MIXER("O063", SND_SOC_NOPM, 0, 0,
0845 mtk_dai_etdm_o063_mix,
0846 ARRAY_SIZE(mtk_dai_etdm_o063_mix)),
0847 SND_SOC_DAPM_MIXER("O064", SND_SOC_NOPM, 0, 0,
0848 mtk_dai_etdm_o064_mix,
0849 ARRAY_SIZE(mtk_dai_etdm_o064_mix)),
0850 SND_SOC_DAPM_MIXER("O065", SND_SOC_NOPM, 0, 0,
0851 mtk_dai_etdm_o065_mix,
0852 ARRAY_SIZE(mtk_dai_etdm_o065_mix)),
0853 SND_SOC_DAPM_MIXER("O066", SND_SOC_NOPM, 0, 0,
0854 mtk_dai_etdm_o066_mix,
0855 ARRAY_SIZE(mtk_dai_etdm_o066_mix)),
0856 SND_SOC_DAPM_MIXER("O067", SND_SOC_NOPM, 0, 0,
0857 mtk_dai_etdm_o067_mix,
0858 ARRAY_SIZE(mtk_dai_etdm_o067_mix)),
0859 SND_SOC_DAPM_MIXER("O068", SND_SOC_NOPM, 0, 0,
0860 mtk_dai_etdm_o068_mix,
0861 ARRAY_SIZE(mtk_dai_etdm_o068_mix)),
0862 SND_SOC_DAPM_MIXER("O069", SND_SOC_NOPM, 0, 0,
0863 mtk_dai_etdm_o069_mix,
0864 ARRAY_SIZE(mtk_dai_etdm_o069_mix)),
0865 SND_SOC_DAPM_MIXER("O070", SND_SOC_NOPM, 0, 0,
0866 mtk_dai_etdm_o070_mix,
0867 ARRAY_SIZE(mtk_dai_etdm_o070_mix)),
0868 SND_SOC_DAPM_MIXER("O071", SND_SOC_NOPM, 0, 0,
0869 mtk_dai_etdm_o071_mix,
0870 ARRAY_SIZE(mtk_dai_etdm_o071_mix)),
0871
0872
0873 SND_SOC_DAPM_MIXER("O072", SND_SOC_NOPM, 0, 0,
0874 mtk_dai_etdm_o072_mix,
0875 ARRAY_SIZE(mtk_dai_etdm_o072_mix)),
0876 SND_SOC_DAPM_MIXER("O073", SND_SOC_NOPM, 0, 0,
0877 mtk_dai_etdm_o073_mix,
0878 ARRAY_SIZE(mtk_dai_etdm_o073_mix)),
0879 SND_SOC_DAPM_MIXER("O074", SND_SOC_NOPM, 0, 0,
0880 mtk_dai_etdm_o074_mix,
0881 ARRAY_SIZE(mtk_dai_etdm_o074_mix)),
0882 SND_SOC_DAPM_MIXER("O075", SND_SOC_NOPM, 0, 0,
0883 mtk_dai_etdm_o075_mix,
0884 ARRAY_SIZE(mtk_dai_etdm_o075_mix)),
0885 SND_SOC_DAPM_MIXER("O076", SND_SOC_NOPM, 0, 0,
0886 mtk_dai_etdm_o076_mix,
0887 ARRAY_SIZE(mtk_dai_etdm_o076_mix)),
0888 SND_SOC_DAPM_MIXER("O077", SND_SOC_NOPM, 0, 0,
0889 mtk_dai_etdm_o077_mix,
0890 ARRAY_SIZE(mtk_dai_etdm_o077_mix)),
0891 SND_SOC_DAPM_MIXER("O078", SND_SOC_NOPM, 0, 0,
0892 mtk_dai_etdm_o078_mix,
0893 ARRAY_SIZE(mtk_dai_etdm_o078_mix)),
0894 SND_SOC_DAPM_MIXER("O079", SND_SOC_NOPM, 0, 0,
0895 mtk_dai_etdm_o079_mix,
0896 ARRAY_SIZE(mtk_dai_etdm_o079_mix)),
0897 SND_SOC_DAPM_MIXER("O080", SND_SOC_NOPM, 0, 0,
0898 mtk_dai_etdm_o080_mix,
0899 ARRAY_SIZE(mtk_dai_etdm_o080_mix)),
0900 SND_SOC_DAPM_MIXER("O081", SND_SOC_NOPM, 0, 0,
0901 mtk_dai_etdm_o081_mix,
0902 ARRAY_SIZE(mtk_dai_etdm_o081_mix)),
0903 SND_SOC_DAPM_MIXER("O082", SND_SOC_NOPM, 0, 0,
0904 mtk_dai_etdm_o082_mix,
0905 ARRAY_SIZE(mtk_dai_etdm_o082_mix)),
0906 SND_SOC_DAPM_MIXER("O083", SND_SOC_NOPM, 0, 0,
0907 mtk_dai_etdm_o083_mix,
0908 ARRAY_SIZE(mtk_dai_etdm_o083_mix)),
0909 SND_SOC_DAPM_MIXER("O084", SND_SOC_NOPM, 0, 0,
0910 mtk_dai_etdm_o084_mix,
0911 ARRAY_SIZE(mtk_dai_etdm_o084_mix)),
0912 SND_SOC_DAPM_MIXER("O085", SND_SOC_NOPM, 0, 0,
0913 mtk_dai_etdm_o085_mix,
0914 ARRAY_SIZE(mtk_dai_etdm_o085_mix)),
0915 SND_SOC_DAPM_MIXER("O086", SND_SOC_NOPM, 0, 0,
0916 mtk_dai_etdm_o086_mix,
0917 ARRAY_SIZE(mtk_dai_etdm_o086_mix)),
0918 SND_SOC_DAPM_MIXER("O087", SND_SOC_NOPM, 0, 0,
0919 mtk_dai_etdm_o087_mix,
0920 ARRAY_SIZE(mtk_dai_etdm_o087_mix)),
0921 SND_SOC_DAPM_MIXER("O088", SND_SOC_NOPM, 0, 0,
0922 mtk_dai_etdm_o088_mix,
0923 ARRAY_SIZE(mtk_dai_etdm_o088_mix)),
0924 SND_SOC_DAPM_MIXER("O089", SND_SOC_NOPM, 0, 0,
0925 mtk_dai_etdm_o089_mix,
0926 ARRAY_SIZE(mtk_dai_etdm_o089_mix)),
0927 SND_SOC_DAPM_MIXER("O090", SND_SOC_NOPM, 0, 0,
0928 mtk_dai_etdm_o090_mix,
0929 ARRAY_SIZE(mtk_dai_etdm_o090_mix)),
0930 SND_SOC_DAPM_MIXER("O091", SND_SOC_NOPM, 0, 0,
0931 mtk_dai_etdm_o091_mix,
0932 ARRAY_SIZE(mtk_dai_etdm_o091_mix)),
0933 SND_SOC_DAPM_MIXER("O092", SND_SOC_NOPM, 0, 0,
0934 mtk_dai_etdm_o092_mix,
0935 ARRAY_SIZE(mtk_dai_etdm_o092_mix)),
0936 SND_SOC_DAPM_MIXER("O093", SND_SOC_NOPM, 0, 0,
0937 mtk_dai_etdm_o093_mix,
0938 ARRAY_SIZE(mtk_dai_etdm_o093_mix)),
0939 SND_SOC_DAPM_MIXER("O094", SND_SOC_NOPM, 0, 0,
0940 mtk_dai_etdm_o094_mix,
0941 ARRAY_SIZE(mtk_dai_etdm_o094_mix)),
0942 SND_SOC_DAPM_MIXER("O095", SND_SOC_NOPM, 0, 0,
0943 mtk_dai_etdm_o095_mix,
0944 ARRAY_SIZE(mtk_dai_etdm_o095_mix)),
0945
0946
0947 SND_SOC_DAPM_MUX("HDMI_OUT_MUX", SND_SOC_NOPM, 0, 0,
0948 &hdmi_out_mux_control),
0949 SND_SOC_DAPM_MUX("DPTX_OUT_MUX", SND_SOC_NOPM, 0, 0,
0950 &dptx_out_mux_control),
0951
0952 SND_SOC_DAPM_MUX("HDMI_CH0_MUX", SND_SOC_NOPM, 0, 0,
0953 &hdmi_ch0_mux_control),
0954 SND_SOC_DAPM_MUX("HDMI_CH1_MUX", SND_SOC_NOPM, 0, 0,
0955 &hdmi_ch1_mux_control),
0956 SND_SOC_DAPM_MUX("HDMI_CH2_MUX", SND_SOC_NOPM, 0, 0,
0957 &hdmi_ch2_mux_control),
0958 SND_SOC_DAPM_MUX("HDMI_CH3_MUX", SND_SOC_NOPM, 0, 0,
0959 &hdmi_ch3_mux_control),
0960 SND_SOC_DAPM_MUX("HDMI_CH4_MUX", SND_SOC_NOPM, 0, 0,
0961 &hdmi_ch4_mux_control),
0962 SND_SOC_DAPM_MUX("HDMI_CH5_MUX", SND_SOC_NOPM, 0, 0,
0963 &hdmi_ch5_mux_control),
0964 SND_SOC_DAPM_MUX("HDMI_CH6_MUX", SND_SOC_NOPM, 0, 0,
0965 &hdmi_ch6_mux_control),
0966 SND_SOC_DAPM_MUX("HDMI_CH7_MUX", SND_SOC_NOPM, 0, 0,
0967 &hdmi_ch7_mux_control),
0968
0969 SND_SOC_DAPM_INPUT("ETDM_INPUT"),
0970 SND_SOC_DAPM_OUTPUT("ETDM_OUTPUT"),
0971 };
0972
0973 static const struct snd_soc_dapm_route mtk_dai_etdm_routes[] = {
0974 {"I012", NULL, "ETDM2 Capture"},
0975 {"I013", NULL, "ETDM2 Capture"},
0976 {"I014", NULL, "ETDM2 Capture"},
0977 {"I015", NULL, "ETDM2 Capture"},
0978 {"I016", NULL, "ETDM2 Capture"},
0979 {"I017", NULL, "ETDM2 Capture"},
0980 {"I018", NULL, "ETDM2 Capture"},
0981 {"I019", NULL, "ETDM2 Capture"},
0982
0983 {"I072", NULL, "ETDM1 Capture"},
0984 {"I073", NULL, "ETDM1 Capture"},
0985 {"I074", NULL, "ETDM1 Capture"},
0986 {"I075", NULL, "ETDM1 Capture"},
0987 {"I076", NULL, "ETDM1 Capture"},
0988 {"I077", NULL, "ETDM1 Capture"},
0989 {"I078", NULL, "ETDM1 Capture"},
0990 {"I079", NULL, "ETDM1 Capture"},
0991 {"I080", NULL, "ETDM1 Capture"},
0992 {"I081", NULL, "ETDM1 Capture"},
0993 {"I082", NULL, "ETDM1 Capture"},
0994 {"I083", NULL, "ETDM1 Capture"},
0995 {"I084", NULL, "ETDM1 Capture"},
0996 {"I085", NULL, "ETDM1 Capture"},
0997 {"I086", NULL, "ETDM1 Capture"},
0998 {"I087", NULL, "ETDM1 Capture"},
0999 {"I088", NULL, "ETDM1 Capture"},
1000 {"I089", NULL, "ETDM1 Capture"},
1001 {"I090", NULL, "ETDM1 Capture"},
1002 {"I091", NULL, "ETDM1 Capture"},
1003 {"I092", NULL, "ETDM1 Capture"},
1004 {"I093", NULL, "ETDM1 Capture"},
1005 {"I094", NULL, "ETDM1 Capture"},
1006 {"I095", NULL, "ETDM1 Capture"},
1007
1008 {"UL8", NULL, "ETDM1 Capture"},
1009 {"UL3", NULL, "ETDM2 Capture"},
1010
1011 {"ETDM2 Playback", NULL, "O048"},
1012 {"ETDM2 Playback", NULL, "O049"},
1013 {"ETDM2 Playback", NULL, "O050"},
1014 {"ETDM2 Playback", NULL, "O051"},
1015 {"ETDM2 Playback", NULL, "O052"},
1016 {"ETDM2 Playback", NULL, "O053"},
1017 {"ETDM2 Playback", NULL, "O054"},
1018 {"ETDM2 Playback", NULL, "O055"},
1019 {"ETDM2 Playback", NULL, "O056"},
1020 {"ETDM2 Playback", NULL, "O057"},
1021 {"ETDM2 Playback", NULL, "O058"},
1022 {"ETDM2 Playback", NULL, "O059"},
1023 {"ETDM2 Playback", NULL, "O060"},
1024 {"ETDM2 Playback", NULL, "O061"},
1025 {"ETDM2 Playback", NULL, "O062"},
1026 {"ETDM2 Playback", NULL, "O063"},
1027 {"ETDM2 Playback", NULL, "O064"},
1028 {"ETDM2 Playback", NULL, "O065"},
1029 {"ETDM2 Playback", NULL, "O066"},
1030 {"ETDM2 Playback", NULL, "O067"},
1031 {"ETDM2 Playback", NULL, "O068"},
1032 {"ETDM2 Playback", NULL, "O069"},
1033 {"ETDM2 Playback", NULL, "O070"},
1034 {"ETDM2 Playback", NULL, "O071"},
1035
1036 {"ETDM1 Playback", NULL, "O072"},
1037 {"ETDM1 Playback", NULL, "O073"},
1038 {"ETDM1 Playback", NULL, "O074"},
1039 {"ETDM1 Playback", NULL, "O075"},
1040 {"ETDM1 Playback", NULL, "O076"},
1041 {"ETDM1 Playback", NULL, "O077"},
1042 {"ETDM1 Playback", NULL, "O078"},
1043 {"ETDM1 Playback", NULL, "O079"},
1044 {"ETDM1 Playback", NULL, "O080"},
1045 {"ETDM1 Playback", NULL, "O081"},
1046 {"ETDM1 Playback", NULL, "O082"},
1047 {"ETDM1 Playback", NULL, "O083"},
1048 {"ETDM1 Playback", NULL, "O084"},
1049 {"ETDM1 Playback", NULL, "O085"},
1050 {"ETDM1 Playback", NULL, "O086"},
1051 {"ETDM1 Playback", NULL, "O087"},
1052 {"ETDM1 Playback", NULL, "O088"},
1053 {"ETDM1 Playback", NULL, "O089"},
1054 {"ETDM1 Playback", NULL, "O090"},
1055 {"ETDM1 Playback", NULL, "O091"},
1056 {"ETDM1 Playback", NULL, "O092"},
1057 {"ETDM1 Playback", NULL, "O093"},
1058 {"ETDM1 Playback", NULL, "O094"},
1059 {"ETDM1 Playback", NULL, "O095"},
1060
1061 {"O048", "I020 Switch", "I020"},
1062 {"O049", "I021 Switch", "I021"},
1063
1064 {"O048", "I022 Switch", "I022"},
1065 {"O049", "I023 Switch", "I023"},
1066 {"O050", "I024 Switch", "I024"},
1067 {"O051", "I025 Switch", "I025"},
1068 {"O052", "I026 Switch", "I026"},
1069 {"O053", "I027 Switch", "I027"},
1070 {"O054", "I028 Switch", "I028"},
1071 {"O055", "I029 Switch", "I029"},
1072 {"O056", "I030 Switch", "I030"},
1073 {"O057", "I031 Switch", "I031"},
1074 {"O058", "I032 Switch", "I032"},
1075 {"O059", "I033 Switch", "I033"},
1076 {"O060", "I034 Switch", "I034"},
1077 {"O061", "I035 Switch", "I035"},
1078 {"O062", "I036 Switch", "I036"},
1079 {"O063", "I037 Switch", "I037"},
1080 {"O064", "I038 Switch", "I038"},
1081 {"O065", "I039 Switch", "I039"},
1082 {"O066", "I040 Switch", "I040"},
1083 {"O067", "I041 Switch", "I041"},
1084 {"O068", "I042 Switch", "I042"},
1085 {"O069", "I043 Switch", "I043"},
1086 {"O070", "I044 Switch", "I044"},
1087 {"O071", "I045 Switch", "I045"},
1088
1089 {"O048", "I046 Switch", "I046"},
1090 {"O049", "I047 Switch", "I047"},
1091 {"O050", "I048 Switch", "I048"},
1092 {"O051", "I049 Switch", "I049"},
1093 {"O052", "I050 Switch", "I050"},
1094 {"O053", "I051 Switch", "I051"},
1095 {"O054", "I052 Switch", "I052"},
1096 {"O055", "I053 Switch", "I053"},
1097 {"O056", "I054 Switch", "I054"},
1098 {"O057", "I055 Switch", "I055"},
1099 {"O058", "I056 Switch", "I056"},
1100 {"O059", "I057 Switch", "I057"},
1101 {"O060", "I058 Switch", "I058"},
1102 {"O061", "I059 Switch", "I059"},
1103 {"O062", "I060 Switch", "I060"},
1104 {"O063", "I061 Switch", "I061"},
1105 {"O064", "I062 Switch", "I062"},
1106 {"O065", "I063 Switch", "I063"},
1107 {"O066", "I064 Switch", "I064"},
1108 {"O067", "I065 Switch", "I065"},
1109 {"O068", "I066 Switch", "I066"},
1110 {"O069", "I067 Switch", "I067"},
1111 {"O070", "I068 Switch", "I068"},
1112 {"O071", "I069 Switch", "I069"},
1113
1114 {"O048", "I070 Switch", "I070"},
1115 {"O049", "I071 Switch", "I071"},
1116
1117 {"O072", "I020 Switch", "I020"},
1118 {"O073", "I021 Switch", "I021"},
1119
1120 {"O072", "I022 Switch", "I022"},
1121 {"O073", "I023 Switch", "I023"},
1122 {"O074", "I024 Switch", "I024"},
1123 {"O075", "I025 Switch", "I025"},
1124 {"O076", "I026 Switch", "I026"},
1125 {"O077", "I027 Switch", "I027"},
1126 {"O078", "I028 Switch", "I028"},
1127 {"O079", "I029 Switch", "I029"},
1128 {"O080", "I030 Switch", "I030"},
1129 {"O081", "I031 Switch", "I031"},
1130 {"O082", "I032 Switch", "I032"},
1131 {"O083", "I033 Switch", "I033"},
1132 {"O084", "I034 Switch", "I034"},
1133 {"O085", "I035 Switch", "I035"},
1134 {"O086", "I036 Switch", "I036"},
1135 {"O087", "I037 Switch", "I037"},
1136 {"O088", "I038 Switch", "I038"},
1137 {"O089", "I039 Switch", "I039"},
1138 {"O090", "I040 Switch", "I040"},
1139 {"O091", "I041 Switch", "I041"},
1140 {"O092", "I042 Switch", "I042"},
1141 {"O093", "I043 Switch", "I043"},
1142 {"O094", "I044 Switch", "I044"},
1143 {"O095", "I045 Switch", "I045"},
1144
1145 {"O072", "I046 Switch", "I046"},
1146 {"O073", "I047 Switch", "I047"},
1147 {"O074", "I048 Switch", "I048"},
1148 {"O075", "I049 Switch", "I049"},
1149 {"O076", "I050 Switch", "I050"},
1150 {"O077", "I051 Switch", "I051"},
1151 {"O078", "I052 Switch", "I052"},
1152 {"O079", "I053 Switch", "I053"},
1153 {"O080", "I054 Switch", "I054"},
1154 {"O081", "I055 Switch", "I055"},
1155 {"O082", "I056 Switch", "I056"},
1156 {"O083", "I057 Switch", "I057"},
1157 {"O084", "I058 Switch", "I058"},
1158 {"O085", "I059 Switch", "I059"},
1159 {"O086", "I060 Switch", "I060"},
1160 {"O087", "I061 Switch", "I061"},
1161 {"O088", "I062 Switch", "I062"},
1162 {"O089", "I063 Switch", "I063"},
1163 {"O090", "I064 Switch", "I064"},
1164 {"O091", "I065 Switch", "I065"},
1165 {"O092", "I066 Switch", "I066"},
1166 {"O093", "I067 Switch", "I067"},
1167 {"O094", "I068 Switch", "I068"},
1168 {"O095", "I069 Switch", "I069"},
1169
1170 {"O072", "I070 Switch", "I070"},
1171 {"O073", "I071 Switch", "I071"},
1172
1173 {"HDMI_CH0_MUX", "CH0", "DL10"},
1174 {"HDMI_CH0_MUX", "CH1", "DL10"},
1175 {"HDMI_CH0_MUX", "CH2", "DL10"},
1176 {"HDMI_CH0_MUX", "CH3", "DL10"},
1177 {"HDMI_CH0_MUX", "CH4", "DL10"},
1178 {"HDMI_CH0_MUX", "CH5", "DL10"},
1179 {"HDMI_CH0_MUX", "CH6", "DL10"},
1180 {"HDMI_CH0_MUX", "CH7", "DL10"},
1181
1182 {"HDMI_CH1_MUX", "CH0", "DL10"},
1183 {"HDMI_CH1_MUX", "CH1", "DL10"},
1184 {"HDMI_CH1_MUX", "CH2", "DL10"},
1185 {"HDMI_CH1_MUX", "CH3", "DL10"},
1186 {"HDMI_CH1_MUX", "CH4", "DL10"},
1187 {"HDMI_CH1_MUX", "CH5", "DL10"},
1188 {"HDMI_CH1_MUX", "CH6", "DL10"},
1189 {"HDMI_CH1_MUX", "CH7", "DL10"},
1190
1191 {"HDMI_CH2_MUX", "CH0", "DL10"},
1192 {"HDMI_CH2_MUX", "CH1", "DL10"},
1193 {"HDMI_CH2_MUX", "CH2", "DL10"},
1194 {"HDMI_CH2_MUX", "CH3", "DL10"},
1195 {"HDMI_CH2_MUX", "CH4", "DL10"},
1196 {"HDMI_CH2_MUX", "CH5", "DL10"},
1197 {"HDMI_CH2_MUX", "CH6", "DL10"},
1198 {"HDMI_CH2_MUX", "CH7", "DL10"},
1199
1200 {"HDMI_CH3_MUX", "CH0", "DL10"},
1201 {"HDMI_CH3_MUX", "CH1", "DL10"},
1202 {"HDMI_CH3_MUX", "CH2", "DL10"},
1203 {"HDMI_CH3_MUX", "CH3", "DL10"},
1204 {"HDMI_CH3_MUX", "CH4", "DL10"},
1205 {"HDMI_CH3_MUX", "CH5", "DL10"},
1206 {"HDMI_CH3_MUX", "CH6", "DL10"},
1207 {"HDMI_CH3_MUX", "CH7", "DL10"},
1208
1209 {"HDMI_CH4_MUX", "CH0", "DL10"},
1210 {"HDMI_CH4_MUX", "CH1", "DL10"},
1211 {"HDMI_CH4_MUX", "CH2", "DL10"},
1212 {"HDMI_CH4_MUX", "CH3", "DL10"},
1213 {"HDMI_CH4_MUX", "CH4", "DL10"},
1214 {"HDMI_CH4_MUX", "CH5", "DL10"},
1215 {"HDMI_CH4_MUX", "CH6", "DL10"},
1216 {"HDMI_CH4_MUX", "CH7", "DL10"},
1217
1218 {"HDMI_CH5_MUX", "CH0", "DL10"},
1219 {"HDMI_CH5_MUX", "CH1", "DL10"},
1220 {"HDMI_CH5_MUX", "CH2", "DL10"},
1221 {"HDMI_CH5_MUX", "CH3", "DL10"},
1222 {"HDMI_CH5_MUX", "CH4", "DL10"},
1223 {"HDMI_CH5_MUX", "CH5", "DL10"},
1224 {"HDMI_CH5_MUX", "CH6", "DL10"},
1225 {"HDMI_CH5_MUX", "CH7", "DL10"},
1226
1227 {"HDMI_CH6_MUX", "CH0", "DL10"},
1228 {"HDMI_CH6_MUX", "CH1", "DL10"},
1229 {"HDMI_CH6_MUX", "CH2", "DL10"},
1230 {"HDMI_CH6_MUX", "CH3", "DL10"},
1231 {"HDMI_CH6_MUX", "CH4", "DL10"},
1232 {"HDMI_CH6_MUX", "CH5", "DL10"},
1233 {"HDMI_CH6_MUX", "CH6", "DL10"},
1234 {"HDMI_CH6_MUX", "CH7", "DL10"},
1235
1236 {"HDMI_CH7_MUX", "CH0", "DL10"},
1237 {"HDMI_CH7_MUX", "CH1", "DL10"},
1238 {"HDMI_CH7_MUX", "CH2", "DL10"},
1239 {"HDMI_CH7_MUX", "CH3", "DL10"},
1240 {"HDMI_CH7_MUX", "CH4", "DL10"},
1241 {"HDMI_CH7_MUX", "CH5", "DL10"},
1242 {"HDMI_CH7_MUX", "CH6", "DL10"},
1243 {"HDMI_CH7_MUX", "CH7", "DL10"},
1244
1245 {"HDMI_OUT_MUX", "Connect", "HDMI_CH0_MUX"},
1246 {"HDMI_OUT_MUX", "Connect", "HDMI_CH1_MUX"},
1247 {"HDMI_OUT_MUX", "Connect", "HDMI_CH2_MUX"},
1248 {"HDMI_OUT_MUX", "Connect", "HDMI_CH3_MUX"},
1249 {"HDMI_OUT_MUX", "Connect", "HDMI_CH4_MUX"},
1250 {"HDMI_OUT_MUX", "Connect", "HDMI_CH5_MUX"},
1251 {"HDMI_OUT_MUX", "Connect", "HDMI_CH6_MUX"},
1252 {"HDMI_OUT_MUX", "Connect", "HDMI_CH7_MUX"},
1253
1254 {"DPTX_OUT_MUX", "Connect", "HDMI_CH0_MUX"},
1255 {"DPTX_OUT_MUX", "Connect", "HDMI_CH1_MUX"},
1256 {"DPTX_OUT_MUX", "Connect", "HDMI_CH2_MUX"},
1257 {"DPTX_OUT_MUX", "Connect", "HDMI_CH3_MUX"},
1258 {"DPTX_OUT_MUX", "Connect", "HDMI_CH4_MUX"},
1259 {"DPTX_OUT_MUX", "Connect", "HDMI_CH5_MUX"},
1260 {"DPTX_OUT_MUX", "Connect", "HDMI_CH6_MUX"},
1261 {"DPTX_OUT_MUX", "Connect", "HDMI_CH7_MUX"},
1262
1263 {"ETDM3 Playback", NULL, "HDMI_OUT_MUX"},
1264 {"DPTX Playback", NULL, "DPTX_OUT_MUX"},
1265
1266 {"ETDM_OUTPUT", NULL, "DPTX Playback"},
1267 {"ETDM_OUTPUT", NULL, "ETDM1 Playback"},
1268 {"ETDM_OUTPUT", NULL, "ETDM2 Playback"},
1269 {"ETDM_OUTPUT", NULL, "ETDM3 Playback"},
1270 {"ETDM1 Capture", NULL, "ETDM_INPUT"},
1271 {"ETDM2 Capture", NULL, "ETDM_INPUT"},
1272 };
1273
1274 static int mt8195_afe_enable_etdm(struct mtk_base_afe *afe, int dai_id)
1275 {
1276 int ret = 0;
1277 struct etdm_con_reg etdm_reg;
1278 struct mt8195_afe_private *afe_priv = afe->platform_priv;
1279 struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai_id];
1280 unsigned long flags;
1281
1282 spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags);
1283 etdm_data->en_ref_cnt++;
1284 if (etdm_data->en_ref_cnt == 1) {
1285 ret = get_etdm_reg(dai_id, &etdm_reg);
1286 if (ret < 0)
1287 goto out;
1288
1289 regmap_update_bits(afe->regmap, etdm_reg.con0,
1290 ETDM_CON0_EN, ETDM_CON0_EN);
1291 }
1292 out:
1293 spin_unlock_irqrestore(&afe_priv->afe_ctrl_lock, flags);
1294 return ret;
1295 }
1296
1297 static int mt8195_afe_disable_etdm(struct mtk_base_afe *afe, int dai_id)
1298 {
1299 int ret = 0;
1300 struct etdm_con_reg etdm_reg;
1301 struct mt8195_afe_private *afe_priv = afe->platform_priv;
1302 struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai_id];
1303 unsigned long flags;
1304
1305 spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags);
1306 if (etdm_data->en_ref_cnt > 0) {
1307 etdm_data->en_ref_cnt--;
1308 if (etdm_data->en_ref_cnt == 0) {
1309 ret = get_etdm_reg(dai_id, &etdm_reg);
1310 if (ret < 0)
1311 goto out;
1312
1313 regmap_update_bits(afe->regmap, etdm_reg.con0,
1314 ETDM_CON0_EN, 0);
1315 }
1316 }
1317 out:
1318 spin_unlock_irqrestore(&afe_priv->afe_ctrl_lock, flags);
1319 return ret;
1320 }
1321
1322 static int etdm_cowork_slv_sel(int id, int slave_mode)
1323 {
1324 if (slave_mode) {
1325 switch (id) {
1326 case MT8195_AFE_IO_ETDM1_IN:
1327 return COWORK_ETDM_IN1_S;
1328 case MT8195_AFE_IO_ETDM2_IN:
1329 return COWORK_ETDM_IN2_S;
1330 case MT8195_AFE_IO_ETDM1_OUT:
1331 return COWORK_ETDM_OUT1_S;
1332 case MT8195_AFE_IO_ETDM2_OUT:
1333 return COWORK_ETDM_OUT2_S;
1334 case MT8195_AFE_IO_ETDM3_OUT:
1335 return COWORK_ETDM_OUT3_S;
1336 default:
1337 return -EINVAL;
1338 }
1339 } else {
1340 switch (id) {
1341 case MT8195_AFE_IO_ETDM1_IN:
1342 return COWORK_ETDM_IN1_M;
1343 case MT8195_AFE_IO_ETDM2_IN:
1344 return COWORK_ETDM_IN2_M;
1345 case MT8195_AFE_IO_ETDM1_OUT:
1346 return COWORK_ETDM_OUT1_M;
1347 case MT8195_AFE_IO_ETDM2_OUT:
1348 return COWORK_ETDM_OUT2_M;
1349 case MT8195_AFE_IO_ETDM3_OUT:
1350 return COWORK_ETDM_OUT3_M;
1351 default:
1352 return -EINVAL;
1353 }
1354 }
1355 }
1356
1357 static int mt8195_etdm_sync_mode_configure(struct mtk_base_afe *afe, int dai_id)
1358 {
1359 struct mt8195_afe_private *afe_priv = afe->platform_priv;
1360 struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai_id];
1361 unsigned int reg = 0;
1362 unsigned int mask;
1363 unsigned int val;
1364 int cowork_source_sel;
1365
1366 if (etdm_data->cowork_source_id == COWORK_ETDM_NONE)
1367 return 0;
1368
1369 cowork_source_sel = etdm_cowork_slv_sel(etdm_data->cowork_source_id,
1370 etdm_data->slave_mode);
1371 if (cowork_source_sel < 0)
1372 return cowork_source_sel;
1373
1374 switch (dai_id) {
1375 case MT8195_AFE_IO_ETDM1_IN:
1376 reg = ETDM_COWORK_CON1;
1377 mask = ETDM_IN1_SLAVE_SEL_MASK;
1378 val = ETDM_IN1_SLAVE_SEL(cowork_source_sel);
1379 break;
1380 case MT8195_AFE_IO_ETDM2_IN:
1381 reg = ETDM_COWORK_CON2;
1382 mask = ETDM_IN2_SLAVE_SEL_MASK;
1383 val = ETDM_IN2_SLAVE_SEL(cowork_source_sel);
1384 break;
1385 case MT8195_AFE_IO_ETDM1_OUT:
1386 reg = ETDM_COWORK_CON0;
1387 mask = ETDM_OUT1_SLAVE_SEL_MASK;
1388 val = ETDM_OUT1_SLAVE_SEL(cowork_source_sel);
1389 break;
1390 case MT8195_AFE_IO_ETDM2_OUT:
1391 reg = ETDM_COWORK_CON2;
1392 mask = ETDM_OUT2_SLAVE_SEL_MASK;
1393 val = ETDM_OUT2_SLAVE_SEL(cowork_source_sel);
1394 break;
1395 case MT8195_AFE_IO_ETDM3_OUT:
1396 reg = ETDM_COWORK_CON2;
1397 mask = ETDM_OUT3_SLAVE_SEL_MASK;
1398 val = ETDM_OUT3_SLAVE_SEL(cowork_source_sel);
1399 break;
1400 default:
1401 return 0;
1402 }
1403
1404 regmap_update_bits(afe->regmap, reg, mask, val);
1405
1406 return 0;
1407 }
1408
1409 static int mtk_dai_etdm_get_cg_id_by_dai_id(int dai_id)
1410 {
1411 int cg_id = -1;
1412
1413 switch (dai_id) {
1414 case MT8195_AFE_IO_DPTX:
1415 cg_id = MT8195_CLK_AUD_HDMI_OUT;
1416 break;
1417 case MT8195_AFE_IO_ETDM1_IN:
1418 cg_id = MT8195_CLK_AUD_TDM_IN;
1419 break;
1420 case MT8195_AFE_IO_ETDM2_IN:
1421 cg_id = MT8195_CLK_AUD_I2SIN;
1422 break;
1423 case MT8195_AFE_IO_ETDM1_OUT:
1424 cg_id = MT8195_CLK_AUD_TDM_OUT;
1425 break;
1426 case MT8195_AFE_IO_ETDM2_OUT:
1427 cg_id = MT8195_CLK_AUD_I2S_OUT;
1428 break;
1429 case MT8195_AFE_IO_ETDM3_OUT:
1430 cg_id = MT8195_CLK_AUD_HDMI_OUT;
1431 break;
1432 default:
1433 break;
1434 }
1435
1436 return cg_id;
1437 }
1438
1439 static int mtk_dai_etdm_get_clk_id_by_dai_id(int dai_id)
1440 {
1441 int clk_id = -1;
1442
1443 switch (dai_id) {
1444 case MT8195_AFE_IO_DPTX:
1445 clk_id = MT8195_CLK_TOP_DPTX_M_SEL;
1446 break;
1447 case MT8195_AFE_IO_ETDM1_IN:
1448 clk_id = MT8195_CLK_TOP_I2SI1_M_SEL;
1449 break;
1450 case MT8195_AFE_IO_ETDM2_IN:
1451 clk_id = MT8195_CLK_TOP_I2SI2_M_SEL;
1452 break;
1453 case MT8195_AFE_IO_ETDM1_OUT:
1454 clk_id = MT8195_CLK_TOP_I2SO1_M_SEL;
1455 break;
1456 case MT8195_AFE_IO_ETDM2_OUT:
1457 clk_id = MT8195_CLK_TOP_I2SO2_M_SEL;
1458 break;
1459 case MT8195_AFE_IO_ETDM3_OUT:
1460 default:
1461 break;
1462 }
1463
1464 return clk_id;
1465 }
1466
1467 static int mtk_dai_etdm_get_clkdiv_id_by_dai_id(int dai_id)
1468 {
1469 int clk_id = -1;
1470
1471 switch (dai_id) {
1472 case MT8195_AFE_IO_DPTX:
1473 clk_id = MT8195_CLK_TOP_APLL12_DIV9;
1474 break;
1475 case MT8195_AFE_IO_ETDM1_IN:
1476 clk_id = MT8195_CLK_TOP_APLL12_DIV0;
1477 break;
1478 case MT8195_AFE_IO_ETDM2_IN:
1479 clk_id = MT8195_CLK_TOP_APLL12_DIV1;
1480 break;
1481 case MT8195_AFE_IO_ETDM1_OUT:
1482 clk_id = MT8195_CLK_TOP_APLL12_DIV2;
1483 break;
1484 case MT8195_AFE_IO_ETDM2_OUT:
1485 clk_id = MT8195_CLK_TOP_APLL12_DIV3;
1486 break;
1487 case MT8195_AFE_IO_ETDM3_OUT:
1488 default:
1489 break;
1490 }
1491
1492 return clk_id;
1493 }
1494
1495 static int mtk_dai_etdm_enable_mclk(struct mtk_base_afe *afe, int dai_id)
1496 {
1497 struct mt8195_afe_private *afe_priv = afe->platform_priv;
1498 int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id);
1499
1500 if (clkdiv_id < 0)
1501 return -EINVAL;
1502
1503 mt8195_afe_enable_clk(afe, afe_priv->clk[clkdiv_id]);
1504
1505 return 0;
1506 }
1507
1508 static int mtk_dai_etdm_disable_mclk(struct mtk_base_afe *afe, int dai_id)
1509 {
1510 struct mt8195_afe_private *afe_priv = afe->platform_priv;
1511 int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id);
1512
1513 if (clkdiv_id < 0)
1514 return -EINVAL;
1515
1516 mt8195_afe_disable_clk(afe, afe_priv->clk[clkdiv_id]);
1517
1518 return 0;
1519 }
1520
1521
1522 static int mtk_dai_etdm_startup(struct snd_pcm_substream *substream,
1523 struct snd_soc_dai *dai)
1524 {
1525 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
1526 struct mt8195_afe_private *afe_priv = afe->platform_priv;
1527 struct mtk_dai_etdm_priv *mst_etdm_data;
1528 int cg_id;
1529 int mst_dai_id;
1530 int slv_dai_id;
1531 int i;
1532
1533 if (is_cowork_mode(dai)) {
1534 mst_dai_id = get_etdm_cowork_master_id(dai);
1535 mtk_dai_etdm_enable_mclk(afe, mst_dai_id);
1536
1537 cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(mst_dai_id);
1538 if (cg_id >= 0)
1539 mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]);
1540
1541 mst_etdm_data = afe_priv->dai_priv[mst_dai_id];
1542
1543 for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {
1544 slv_dai_id = mst_etdm_data->cowork_slv_id[i];
1545 cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(slv_dai_id);
1546 if (cg_id >= 0)
1547 mt8195_afe_enable_clk(afe,
1548 afe_priv->clk[cg_id]);
1549 }
1550 } else {
1551 mtk_dai_etdm_enable_mclk(afe, dai->id);
1552
1553 cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id);
1554 if (cg_id >= 0)
1555 mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]);
1556 }
1557
1558 return 0;
1559 }
1560
1561 static void mtk_dai_etdm_shutdown(struct snd_pcm_substream *substream,
1562 struct snd_soc_dai *dai)
1563 {
1564 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
1565 struct mt8195_afe_private *afe_priv = afe->platform_priv;
1566 struct mtk_dai_etdm_priv *mst_etdm_data;
1567 int cg_id;
1568 int mst_dai_id;
1569 int slv_dai_id;
1570 int i;
1571
1572 if (is_cowork_mode(dai)) {
1573 mst_dai_id = get_etdm_cowork_master_id(dai);
1574 cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(mst_dai_id);
1575 if (cg_id >= 0)
1576 mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]);
1577
1578 mst_etdm_data = afe_priv->dai_priv[mst_dai_id];
1579 for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {
1580 slv_dai_id = mst_etdm_data->cowork_slv_id[i];
1581 cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(slv_dai_id);
1582 if (cg_id >= 0)
1583 mt8195_afe_disable_clk(afe,
1584 afe_priv->clk[cg_id]);
1585 }
1586 mtk_dai_etdm_disable_mclk(afe, mst_dai_id);
1587 } else {
1588 cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id);
1589 if (cg_id >= 0)
1590 mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]);
1591
1592 mtk_dai_etdm_disable_mclk(afe, dai->id);
1593 }
1594 }
1595
1596 static int mtk_dai_etdm_fifo_mode(struct mtk_base_afe *afe,
1597 int dai_id, unsigned int rate)
1598 {
1599 unsigned int mode = 0;
1600 unsigned int reg = 0;
1601 unsigned int val = 0;
1602 unsigned int mask = (ETDM_IN_AFIFO_MODE_MASK | ETDM_IN_USE_AFIFO);
1603
1604 if (rate != 0)
1605 mode = mt8195_afe_fs_timing(rate);
1606
1607 switch (dai_id) {
1608 case MT8195_AFE_IO_ETDM1_IN:
1609 reg = ETDM_IN1_AFIFO_CON;
1610 if (rate == 0)
1611 mode = MT8195_ETDM_IN1_1X_EN;
1612 break;
1613 case MT8195_AFE_IO_ETDM2_IN:
1614 reg = ETDM_IN2_AFIFO_CON;
1615 if (rate == 0)
1616 mode = MT8195_ETDM_IN2_1X_EN;
1617 break;
1618 default:
1619 return -EINVAL;
1620 }
1621
1622 val = (mode | ETDM_IN_USE_AFIFO);
1623
1624 regmap_update_bits(afe->regmap, reg, mask, val);
1625 return 0;
1626 }
1627
1628 static int mtk_dai_etdm_in_configure(struct mtk_base_afe *afe,
1629 unsigned int rate,
1630 unsigned int channels,
1631 int dai_id)
1632 {
1633 struct mt8195_afe_private *afe_priv = afe->platform_priv;
1634 struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai_id];
1635 struct etdm_con_reg etdm_reg;
1636 bool slave_mode = etdm_data->slave_mode;
1637 unsigned int data_mode = etdm_data->data_mode;
1638 unsigned int lrck_width = etdm_data->lrck_width;
1639 unsigned int val = 0;
1640 unsigned int mask = 0;
1641 int i;
1642 int ret;
1643
1644 dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n",
1645 __func__, rate, channels, dai_id);
1646
1647 ret = get_etdm_reg(dai_id, &etdm_reg);
1648 if (ret < 0)
1649 return ret;
1650
1651 if (etdm_data->cowork_source_id != COWORK_ETDM_NONE)
1652 slave_mode = true;
1653
1654
1655 if (slave_mode)
1656 mtk_dai_etdm_fifo_mode(afe, dai_id, 0);
1657 else
1658 mtk_dai_etdm_fifo_mode(afe, dai_id, rate);
1659
1660
1661 if (lrck_width > 0) {
1662 mask |= (ETDM_IN_CON1_LRCK_AUTO_MODE |
1663 ETDM_IN_CON1_LRCK_WIDTH_MASK);
1664 val |= ETDM_IN_CON1_LRCK_WIDTH(lrck_width);
1665 }
1666 regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);
1667
1668 mask = 0;
1669 val = 0;
1670
1671
1672 if (!slave_mode) {
1673 mask |= ETDM_IN_CON2_UPDATE_GAP_MASK;
1674 if (rate == 352800 || rate == 384000)
1675 val |= ETDM_IN_CON2_UPDATE_GAP(4);
1676 else
1677 val |= ETDM_IN_CON2_UPDATE_GAP(3);
1678 }
1679 mask |= (ETDM_IN_CON2_MULTI_IP_2CH_MODE |
1680 ETDM_IN_CON2_MULTI_IP_TOTAL_CH_MASK);
1681 if (data_mode == MTK_DAI_ETDM_DATA_MULTI_PIN) {
1682 val |= ETDM_IN_CON2_MULTI_IP_2CH_MODE |
1683 ETDM_IN_CON2_MULTI_IP_TOTAL_CH(channels);
1684 }
1685 regmap_update_bits(afe->regmap, etdm_reg.con2, mask, val);
1686
1687 mask = 0;
1688 val = 0;
1689
1690
1691 mask |= ETDM_IN_CON3_DISABLE_OUT_MASK;
1692 for (i = 0; i < channels; i += 2) {
1693 if (etdm_data->in_disable_ch[i] &&
1694 etdm_data->in_disable_ch[i + 1])
1695 val |= ETDM_IN_CON3_DISABLE_OUT(i >> 1);
1696 }
1697 if (!slave_mode) {
1698 mask |= ETDM_IN_CON3_FS_MASK;
1699 val |= ETDM_IN_CON3_FS(get_etdm_fs_timing(rate));
1700 }
1701 regmap_update_bits(afe->regmap, etdm_reg.con3, mask, val);
1702
1703 mask = 0;
1704 val = 0;
1705
1706
1707 mask |= (ETDM_IN_CON4_MASTER_LRCK_INV | ETDM_IN_CON4_MASTER_BCK_INV |
1708 ETDM_IN_CON4_SLAVE_LRCK_INV | ETDM_IN_CON4_SLAVE_BCK_INV);
1709 if (slave_mode) {
1710 if (etdm_data->lrck_inv)
1711 val |= ETDM_IN_CON4_SLAVE_LRCK_INV;
1712 if (etdm_data->bck_inv)
1713 val |= ETDM_IN_CON4_SLAVE_BCK_INV;
1714 } else {
1715 if (etdm_data->lrck_inv)
1716 val |= ETDM_IN_CON4_MASTER_LRCK_INV;
1717 if (etdm_data->bck_inv)
1718 val |= ETDM_IN_CON4_MASTER_BCK_INV;
1719 }
1720 regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val);
1721
1722 mask = 0;
1723 val = 0;
1724
1725
1726 mask |= ETDM_IN_CON5_LR_SWAP_MASK;
1727 mask |= ETDM_IN_CON5_ENABLE_ODD_MASK;
1728 for (i = 0; i < channels; i += 2) {
1729 if (etdm_data->in_disable_ch[i] &&
1730 !etdm_data->in_disable_ch[i + 1]) {
1731 if (i == (channels - 2))
1732 val |= ETDM_IN_CON5_LR_SWAP(15);
1733 else
1734 val |= ETDM_IN_CON5_LR_SWAP(i >> 1);
1735 val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1);
1736 } else if (!etdm_data->in_disable_ch[i] &&
1737 etdm_data->in_disable_ch[i + 1]) {
1738 val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1);
1739 }
1740 }
1741 regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val);
1742 return 0;
1743 }
1744
1745 static int mtk_dai_etdm_out_configure(struct mtk_base_afe *afe,
1746 unsigned int rate,
1747 unsigned int channels,
1748 int dai_id)
1749 {
1750 struct mt8195_afe_private *afe_priv = afe->platform_priv;
1751 struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai_id];
1752 struct etdm_con_reg etdm_reg;
1753 bool slave_mode = etdm_data->slave_mode;
1754 unsigned int lrck_width = etdm_data->lrck_width;
1755 unsigned int val = 0;
1756 unsigned int mask = 0;
1757 int ret;
1758 int fs = 0;
1759
1760 dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n",
1761 __func__, rate, channels, dai_id);
1762
1763 ret = get_etdm_reg(dai_id, &etdm_reg);
1764 if (ret < 0)
1765 return ret;
1766
1767 if (etdm_data->cowork_source_id != COWORK_ETDM_NONE)
1768 slave_mode = true;
1769
1770
1771 mask = ETDM_OUT_CON0_RELATCH_DOMAIN_MASK;
1772 val = ETDM_OUT_CON0_RELATCH_DOMAIN(ETDM_RELATCH_TIMING_A1A2SYS);
1773 regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val);
1774
1775 mask = 0;
1776 val = 0;
1777
1778
1779 if (lrck_width > 0) {
1780 mask |= (ETDM_OUT_CON1_LRCK_AUTO_MODE |
1781 ETDM_OUT_CON1_LRCK_WIDTH_MASK);
1782 val |= ETDM_OUT_CON1_LRCK_WIDTH(lrck_width);
1783 }
1784 regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);
1785
1786 mask = 0;
1787 val = 0;
1788
1789 if (slave_mode) {
1790
1791 mask = (ETDM_OUT_CON2_LRCK_DELAY_BCK_INV |
1792 ETDM_OUT_CON2_LRCK_DELAY_0P5T_EN);
1793 val = (ETDM_OUT_CON2_LRCK_DELAY_BCK_INV |
1794 ETDM_OUT_CON2_LRCK_DELAY_0P5T_EN);
1795 regmap_update_bits(afe->regmap, etdm_reg.con2,
1796 mask, val);
1797 mask = 0;
1798 val = 0;
1799 } else {
1800
1801 mask |= ETDM_OUT_CON4_FS_MASK;
1802 val |= ETDM_OUT_CON4_FS(get_etdm_fs_timing(rate));
1803 }
1804
1805 mask |= ETDM_OUT_CON4_RELATCH_EN_MASK;
1806 if (dai_id == MT8195_AFE_IO_ETDM1_OUT)
1807 fs = MT8195_ETDM_OUT1_1X_EN;
1808 else if (dai_id == MT8195_AFE_IO_ETDM2_OUT)
1809 fs = MT8195_ETDM_OUT2_1X_EN;
1810
1811 val |= ETDM_OUT_CON4_RELATCH_EN(fs);
1812
1813 regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val);
1814
1815 mask = 0;
1816 val = 0;
1817
1818
1819 mask |= (ETDM_OUT_CON5_MASTER_LRCK_INV | ETDM_OUT_CON5_MASTER_BCK_INV |
1820 ETDM_OUT_CON5_SLAVE_LRCK_INV | ETDM_OUT_CON5_SLAVE_BCK_INV);
1821 if (slave_mode) {
1822 if (etdm_data->lrck_inv)
1823 val |= ETDM_OUT_CON5_SLAVE_LRCK_INV;
1824 if (etdm_data->bck_inv)
1825 val |= ETDM_OUT_CON5_SLAVE_BCK_INV;
1826 } else {
1827 if (etdm_data->lrck_inv)
1828 val |= ETDM_OUT_CON5_MASTER_LRCK_INV;
1829 if (etdm_data->bck_inv)
1830 val |= ETDM_OUT_CON5_MASTER_BCK_INV;
1831 }
1832 regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val);
1833
1834 return 0;
1835 }
1836
1837 static int mtk_dai_etdm_mclk_configure(struct mtk_base_afe *afe, int dai_id)
1838 {
1839 struct mt8195_afe_private *afe_priv = afe->platform_priv;
1840 struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai_id];
1841 int clk_id = mtk_dai_etdm_get_clk_id_by_dai_id(dai_id);
1842 int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id);
1843 int apll;
1844 int apll_clk_id;
1845 struct etdm_con_reg etdm_reg;
1846 unsigned int val = 0;
1847 unsigned int mask = 0;
1848 int ret = 0;
1849
1850 if (clk_id < 0 || clkdiv_id < 0)
1851 return 0;
1852
1853 ret = get_etdm_reg(dai_id, &etdm_reg);
1854 if (ret < 0)
1855 return ret;
1856
1857 mask |= ETDM_CON1_MCLK_OUTPUT;
1858 if (etdm_data->mclk_dir == SND_SOC_CLOCK_OUT)
1859 val |= ETDM_CON1_MCLK_OUTPUT;
1860 regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);
1861
1862 if (etdm_data->mclk_freq) {
1863 apll = etdm_data->mclk_apll;
1864 apll_clk_id = mt8195_afe_get_mclk_source_clk_id(apll);
1865 if (apll_clk_id < 0)
1866 return apll_clk_id;
1867
1868
1869 ret = mt8195_afe_set_clk_parent(afe, afe_priv->clk[clk_id],
1870 afe_priv->clk[apll_clk_id]);
1871 if (ret)
1872 return ret;
1873
1874
1875 ret = mt8195_afe_set_clk_rate(afe, afe_priv->clk[clkdiv_id],
1876 etdm_data->mclk_freq);
1877 } else {
1878 if (etdm_data->mclk_dir == SND_SOC_CLOCK_OUT)
1879 dev_dbg(afe->dev, "%s mclk freq = 0\n", __func__);
1880 }
1881 return ret;
1882 }
1883
1884 static int mtk_dai_etdm_configure(struct mtk_base_afe *afe,
1885 unsigned int rate,
1886 unsigned int channels,
1887 unsigned int bit_width,
1888 int dai_id)
1889 {
1890 struct mt8195_afe_private *afe_priv = afe->platform_priv;
1891 struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai_id];
1892 struct etdm_con_reg etdm_reg;
1893 bool slave_mode = etdm_data->slave_mode;
1894 unsigned int etdm_channels;
1895 unsigned int val = 0;
1896 unsigned int mask = 0;
1897 unsigned int bck;
1898 unsigned int wlen = get_etdm_wlen(bit_width);
1899 int ret;
1900
1901 ret = get_etdm_reg(dai_id, &etdm_reg);
1902 if (ret < 0)
1903 return ret;
1904
1905 if (etdm_data->cowork_source_id != COWORK_ETDM_NONE)
1906 slave_mode = true;
1907
1908 dev_dbg(afe->dev, "%s fmt %u data %u lrck %d-%u bck %d, clock %u slv %u\n",
1909 __func__, etdm_data->format, etdm_data->data_mode,
1910 etdm_data->lrck_inv, etdm_data->lrck_width, etdm_data->bck_inv,
1911 etdm_data->clock_mode, etdm_data->slave_mode);
1912 dev_dbg(afe->dev, "%s rate %u channels %u bitwidth %u, id %d\n",
1913 __func__, rate, channels, bit_width, dai_id);
1914
1915 etdm_channels = (etdm_data->data_mode == MTK_DAI_ETDM_DATA_ONE_PIN) ?
1916 get_etdm_ch_fixup(channels) : 2;
1917
1918 bck = rate * etdm_channels * wlen;
1919 if (bck > MT8195_ETDM_NORMAL_MAX_BCK_RATE) {
1920 dev_info(afe->dev, "%s bck rate %u not support\n",
1921 __func__, bck);
1922 return -EINVAL;
1923 }
1924
1925
1926 mask |= ETDM_CON0_BIT_LEN_MASK;
1927 val |= ETDM_CON0_BIT_LEN(bit_width);
1928 mask |= ETDM_CON0_WORD_LEN_MASK;
1929 val |= ETDM_CON0_WORD_LEN(wlen);
1930 mask |= ETDM_CON0_FORMAT_MASK;
1931 val |= ETDM_CON0_FORMAT(etdm_data->format);
1932 mask |= ETDM_CON0_CH_NUM_MASK;
1933 val |= ETDM_CON0_CH_NUM(etdm_channels);
1934
1935 mask |= ETDM_CON0_SLAVE_MODE;
1936 if (slave_mode) {
1937 if (dai_id == MT8195_AFE_IO_ETDM1_OUT &&
1938 etdm_data->cowork_source_id == COWORK_ETDM_NONE) {
1939 dev_info(afe->dev, "%s id %d only support master mode\n",
1940 __func__, dai_id);
1941 return -EINVAL;
1942 }
1943 val |= ETDM_CON0_SLAVE_MODE;
1944 }
1945 regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val);
1946
1947 if (get_etdm_dir(dai_id) == ETDM_IN)
1948 mtk_dai_etdm_in_configure(afe, rate, channels, dai_id);
1949 else
1950 mtk_dai_etdm_out_configure(afe, rate, channels, dai_id);
1951
1952 return 0;
1953 }
1954
1955 static int mtk_dai_etdm_hw_params(struct snd_pcm_substream *substream,
1956 struct snd_pcm_hw_params *params,
1957 struct snd_soc_dai *dai)
1958 {
1959 int ret = 0;
1960 unsigned int rate = params_rate(params);
1961 unsigned int bit_width = params_width(params);
1962 unsigned int channels = params_channels(params);
1963 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
1964 struct mt8195_afe_private *afe_priv = afe->platform_priv;
1965 struct mtk_dai_etdm_priv *mst_etdm_data;
1966 int mst_dai_id;
1967 int slv_dai_id;
1968 int i;
1969
1970 dev_dbg(afe->dev, "%s '%s' period %u-%u\n",
1971 __func__, snd_pcm_stream_str(substream),
1972 params_period_size(params), params_periods(params));
1973
1974 if (is_cowork_mode(dai)) {
1975 mst_dai_id = get_etdm_cowork_master_id(dai);
1976
1977 ret = mtk_dai_etdm_mclk_configure(afe, mst_dai_id);
1978 if (ret)
1979 return ret;
1980
1981 ret = mtk_dai_etdm_configure(afe, rate, channels,
1982 bit_width, mst_dai_id);
1983 if (ret)
1984 return ret;
1985
1986 mst_etdm_data = afe_priv->dai_priv[mst_dai_id];
1987 for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {
1988 slv_dai_id = mst_etdm_data->cowork_slv_id[i];
1989 ret = mtk_dai_etdm_configure(afe, rate, channels,
1990 bit_width, slv_dai_id);
1991 if (ret)
1992 return ret;
1993
1994 ret = mt8195_etdm_sync_mode_configure(afe, slv_dai_id);
1995 if (ret)
1996 return ret;
1997 }
1998 } else {
1999 ret = mtk_dai_etdm_mclk_configure(afe, dai->id);
2000 if (ret)
2001 return ret;
2002
2003 ret = mtk_dai_etdm_configure(afe, rate, channels,
2004 bit_width, dai->id);
2005 }
2006
2007 return ret;
2008 }
2009
2010 static int mtk_dai_etdm_trigger(struct snd_pcm_substream *substream, int cmd,
2011 struct snd_soc_dai *dai)
2012 {
2013 int ret = 0;
2014 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
2015 struct mt8195_afe_private *afe_priv = afe->platform_priv;
2016 struct mtk_dai_etdm_priv *mst_etdm_data;
2017 int mst_dai_id;
2018 int slv_dai_id;
2019 int i;
2020
2021 dev_dbg(afe->dev, "%s(), cmd %d, dai id %d\n", __func__, cmd, dai->id);
2022 switch (cmd) {
2023 case SNDRV_PCM_TRIGGER_START:
2024 case SNDRV_PCM_TRIGGER_RESUME:
2025 if (is_cowork_mode(dai)) {
2026 mst_dai_id = get_etdm_cowork_master_id(dai);
2027 mst_etdm_data = afe_priv->dai_priv[mst_dai_id];
2028
2029
2030 ret |= mt8195_afe_enable_etdm(afe, mst_dai_id);
2031 for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {
2032 slv_dai_id = mst_etdm_data->cowork_slv_id[i];
2033 ret |= mt8195_afe_enable_etdm(afe, slv_dai_id);
2034 }
2035 } else {
2036 ret = mt8195_afe_enable_etdm(afe, dai->id);
2037 }
2038 break;
2039 case SNDRV_PCM_TRIGGER_STOP:
2040 case SNDRV_PCM_TRIGGER_SUSPEND:
2041 if (is_cowork_mode(dai)) {
2042 mst_dai_id = get_etdm_cowork_master_id(dai);
2043 mst_etdm_data = afe_priv->dai_priv[mst_dai_id];
2044
2045 for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {
2046 slv_dai_id = mst_etdm_data->cowork_slv_id[i];
2047 ret |= mt8195_afe_disable_etdm(afe, slv_dai_id);
2048 }
2049
2050 ret |= mt8195_afe_disable_etdm(afe, mst_dai_id);
2051 } else {
2052 ret = mt8195_afe_disable_etdm(afe, dai->id);
2053 }
2054 break;
2055 default:
2056 break;
2057 }
2058 return ret;
2059 }
2060
2061 static int mtk_dai_etdm_cal_mclk(struct mtk_base_afe *afe, int freq, int dai_id)
2062 {
2063 struct mt8195_afe_private *afe_priv = afe->platform_priv;
2064 struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai_id];
2065 int apll;
2066 int apll_rate;
2067
2068 if (freq == 0) {
2069 etdm_data->mclk_freq = freq;
2070 return 0;
2071 }
2072
2073 apll = mt8195_afe_get_default_mclk_source_by_rate(freq);
2074 apll_rate = mt8195_afe_get_mclk_source_rate(afe, apll);
2075
2076 if (freq > apll_rate) {
2077 dev_info(afe->dev, "freq %d > apll rate %d\n", freq, apll_rate);
2078 return -EINVAL;
2079 }
2080
2081 if (apll_rate % freq != 0) {
2082 dev_info(afe->dev, "APLL%d cannot generate freq Hz\n", apll);
2083 return -EINVAL;
2084 }
2085
2086 etdm_data->mclk_apll = apll;
2087 etdm_data->mclk_freq = freq;
2088
2089 return 0;
2090 }
2091
2092 static int mtk_dai_etdm_set_sysclk(struct snd_soc_dai *dai,
2093 int clk_id, unsigned int freq, int dir)
2094 {
2095 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
2096 struct mt8195_afe_private *afe_priv = afe->platform_priv;
2097 struct mtk_dai_etdm_priv *etdm_data;
2098 int dai_id;
2099
2100 dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n",
2101 __func__, dai->id, freq, dir);
2102 if (is_cowork_mode(dai))
2103 dai_id = get_etdm_cowork_master_id(dai);
2104 else
2105 dai_id = dai->id;
2106
2107 etdm_data = afe_priv->dai_priv[dai_id];
2108 etdm_data->mclk_dir = dir;
2109 return mtk_dai_etdm_cal_mclk(afe, freq, dai_id);
2110 }
2111
2112 static int mtk_dai_etdm_set_tdm_slot(struct snd_soc_dai *dai,
2113 unsigned int tx_mask, unsigned int rx_mask,
2114 int slots, int slot_width)
2115 {
2116 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
2117 struct mt8195_afe_private *afe_priv = afe->platform_priv;
2118 struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai->id];
2119
2120 dev_dbg(dai->dev, "%s id %d slot_width %d\n",
2121 __func__, dai->id, slot_width);
2122
2123 etdm_data->slots = slots;
2124 etdm_data->lrck_width = slot_width;
2125 return 0;
2126 }
2127
2128 static int mtk_dai_etdm_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
2129 {
2130 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
2131 struct mt8195_afe_private *afe_priv = afe->platform_priv;
2132 struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai->id];
2133
2134 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
2135 case SND_SOC_DAIFMT_I2S:
2136 etdm_data->format = MTK_DAI_ETDM_FORMAT_I2S;
2137 break;
2138 case SND_SOC_DAIFMT_LEFT_J:
2139 etdm_data->format = MTK_DAI_ETDM_FORMAT_LJ;
2140 break;
2141 case SND_SOC_DAIFMT_RIGHT_J:
2142 etdm_data->format = MTK_DAI_ETDM_FORMAT_RJ;
2143 break;
2144 case SND_SOC_DAIFMT_DSP_A:
2145 etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPA;
2146 break;
2147 case SND_SOC_DAIFMT_DSP_B:
2148 etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPB;
2149 break;
2150 default:
2151 return -EINVAL;
2152 }
2153
2154 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
2155 case SND_SOC_DAIFMT_NB_NF:
2156 etdm_data->bck_inv = false;
2157 etdm_data->lrck_inv = false;
2158 break;
2159 case SND_SOC_DAIFMT_NB_IF:
2160 etdm_data->bck_inv = false;
2161 etdm_data->lrck_inv = true;
2162 break;
2163 case SND_SOC_DAIFMT_IB_NF:
2164 etdm_data->bck_inv = true;
2165 etdm_data->lrck_inv = false;
2166 break;
2167 case SND_SOC_DAIFMT_IB_IF:
2168 etdm_data->bck_inv = true;
2169 etdm_data->lrck_inv = true;
2170 break;
2171 default:
2172 return -EINVAL;
2173 }
2174
2175 switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
2176 case SND_SOC_DAIFMT_BC_FC:
2177 etdm_data->slave_mode = true;
2178 break;
2179 case SND_SOC_DAIFMT_BP_FP:
2180 etdm_data->slave_mode = false;
2181 break;
2182 default:
2183 return -EINVAL;
2184 }
2185
2186 return 0;
2187 }
2188
2189 static int mtk_dai_hdmitx_dptx_startup(struct snd_pcm_substream *substream,
2190 struct snd_soc_dai *dai)
2191 {
2192 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
2193 struct mt8195_afe_private *afe_priv = afe->platform_priv;
2194 int cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id);
2195
2196 if (cg_id >= 0)
2197 mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]);
2198
2199 mtk_dai_etdm_enable_mclk(afe, dai->id);
2200
2201 return 0;
2202 }
2203
2204 static void mtk_dai_hdmitx_dptx_shutdown(struct snd_pcm_substream *substream,
2205 struct snd_soc_dai *dai)
2206 {
2207 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
2208 struct mt8195_afe_private *afe_priv = afe->platform_priv;
2209 int cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id);
2210
2211 mtk_dai_etdm_disable_mclk(afe, dai->id);
2212
2213 if (cg_id >= 0)
2214 mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]);
2215 }
2216
2217 static unsigned int mtk_dai_get_dptx_ch_en(unsigned int channel)
2218 {
2219 switch (channel) {
2220 case 1 ... 2:
2221 return AFE_DPTX_CON_CH_EN_2CH;
2222 case 3 ... 4:
2223 return AFE_DPTX_CON_CH_EN_4CH;
2224 case 5 ... 6:
2225 return AFE_DPTX_CON_CH_EN_6CH;
2226 case 7 ... 8:
2227 return AFE_DPTX_CON_CH_EN_8CH;
2228 default:
2229 return AFE_DPTX_CON_CH_EN_2CH;
2230 }
2231 }
2232
2233 static unsigned int mtk_dai_get_dptx_ch(unsigned int ch)
2234 {
2235 return (ch > 2) ?
2236 AFE_DPTX_CON_CH_NUM_8CH : AFE_DPTX_CON_CH_NUM_2CH;
2237 }
2238
2239 static unsigned int mtk_dai_get_dptx_wlen(snd_pcm_format_t format)
2240 {
2241 return snd_pcm_format_physical_width(format) <= 16 ?
2242 AFE_DPTX_CON_16BIT : AFE_DPTX_CON_24BIT;
2243 }
2244
2245 static int mtk_dai_hdmitx_dptx_hw_params(struct snd_pcm_substream *substream,
2246 struct snd_pcm_hw_params *params,
2247 struct snd_soc_dai *dai)
2248 {
2249 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
2250 struct mt8195_afe_private *afe_priv = afe->platform_priv;
2251 struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai->id];
2252 unsigned int rate = params_rate(params);
2253 unsigned int channels = params_channels(params);
2254 snd_pcm_format_t format = params_format(params);
2255 int width = snd_pcm_format_physical_width(format);
2256 int ret = 0;
2257
2258
2259 if (dai->id == MT8195_AFE_IO_DPTX) {
2260 regmap_update_bits(afe->regmap, AFE_DPTX_CON,
2261 AFE_DPTX_CON_CH_EN_MASK,
2262 mtk_dai_get_dptx_ch_en(channels));
2263 regmap_update_bits(afe->regmap, AFE_DPTX_CON,
2264 AFE_DPTX_CON_CH_NUM_MASK,
2265 mtk_dai_get_dptx_ch(channels));
2266 regmap_update_bits(afe->regmap, AFE_DPTX_CON,
2267 AFE_DPTX_CON_16BIT_MASK,
2268 mtk_dai_get_dptx_wlen(format));
2269
2270 if (mtk_dai_get_dptx_ch(channels) == AFE_DPTX_CON_CH_NUM_8CH) {
2271 etdm_data->data_mode = MTK_DAI_ETDM_DATA_ONE_PIN;
2272 channels = 8;
2273 } else {
2274 channels = 2;
2275 }
2276 } else {
2277 etdm_data->data_mode = MTK_DAI_ETDM_DATA_MULTI_PIN;
2278 }
2279
2280 ret = mtk_dai_etdm_mclk_configure(afe, dai->id);
2281 if (ret)
2282 return ret;
2283
2284 ret = mtk_dai_etdm_configure(afe, rate, channels, width, dai->id);
2285
2286 return ret;
2287 }
2288
2289 static int mtk_dai_hdmitx_dptx_trigger(struct snd_pcm_substream *substream,
2290 int cmd,
2291 struct snd_soc_dai *dai)
2292 {
2293 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
2294 int ret = 0;
2295
2296 dev_dbg(afe->dev, "%s(), cmd %d, dai id %d\n", __func__, cmd, dai->id);
2297
2298 switch (cmd) {
2299 case SNDRV_PCM_TRIGGER_START:
2300 case SNDRV_PCM_TRIGGER_RESUME:
2301
2302 if (dai->id == MT8195_AFE_IO_DPTX)
2303 regmap_update_bits(afe->regmap, AFE_DPTX_CON,
2304 AFE_DPTX_CON_ON_MASK,
2305 AFE_DPTX_CON_ON);
2306
2307
2308 ret = mt8195_afe_enable_etdm(afe, dai->id);
2309 break;
2310 case SNDRV_PCM_TRIGGER_STOP:
2311 case SNDRV_PCM_TRIGGER_SUSPEND:
2312
2313 ret = mt8195_afe_disable_etdm(afe, dai->id);
2314
2315
2316 if (dai->id == MT8195_AFE_IO_DPTX)
2317 regmap_update_bits(afe->regmap, AFE_DPTX_CON,
2318 AFE_DPTX_CON_ON_MASK, 0);
2319 break;
2320 default:
2321 return -EINVAL;
2322 }
2323
2324 return ret;
2325 }
2326
2327 static int mtk_dai_hdmitx_dptx_set_sysclk(struct snd_soc_dai *dai,
2328 int clk_id,
2329 unsigned int freq,
2330 int dir)
2331 {
2332 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
2333 struct mt8195_afe_private *afe_priv = afe->platform_priv;
2334 struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai->id];
2335
2336 dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n",
2337 __func__, dai->id, freq, dir);
2338
2339 etdm_data->mclk_dir = dir;
2340 return mtk_dai_etdm_cal_mclk(afe, freq, dai->id);
2341 }
2342
2343 static const struct snd_soc_dai_ops mtk_dai_etdm_ops = {
2344 .startup = mtk_dai_etdm_startup,
2345 .shutdown = mtk_dai_etdm_shutdown,
2346 .hw_params = mtk_dai_etdm_hw_params,
2347 .trigger = mtk_dai_etdm_trigger,
2348 .set_sysclk = mtk_dai_etdm_set_sysclk,
2349 .set_fmt = mtk_dai_etdm_set_fmt,
2350 .set_tdm_slot = mtk_dai_etdm_set_tdm_slot,
2351 };
2352
2353 static const struct snd_soc_dai_ops mtk_dai_hdmitx_dptx_ops = {
2354 .startup = mtk_dai_hdmitx_dptx_startup,
2355 .shutdown = mtk_dai_hdmitx_dptx_shutdown,
2356 .hw_params = mtk_dai_hdmitx_dptx_hw_params,
2357 .trigger = mtk_dai_hdmitx_dptx_trigger,
2358 .set_sysclk = mtk_dai_hdmitx_dptx_set_sysclk,
2359 .set_fmt = mtk_dai_etdm_set_fmt,
2360 };
2361
2362
2363 #define MTK_ETDM_RATES (SNDRV_PCM_RATE_8000_384000)
2364
2365 #define MTK_ETDM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
2366 SNDRV_PCM_FMTBIT_S24_LE |\
2367 SNDRV_PCM_FMTBIT_S32_LE)
2368
2369 static int mtk_dai_etdm_probe(struct snd_soc_dai *dai)
2370 {
2371 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
2372 struct mt8195_afe_private *afe_priv = afe->platform_priv;
2373 struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai->id];
2374
2375 dev_dbg(dai->dev, "%s id %d\n", __func__, dai->id);
2376
2377 if (etdm_data->mclk_freq) {
2378 dev_dbg(afe->dev, "MCLK always on, rate %d\n",
2379 etdm_data->mclk_freq);
2380 pm_runtime_get_sync(afe->dev);
2381 mtk_dai_etdm_mclk_configure(afe, dai->id);
2382 mtk_dai_etdm_enable_mclk(afe, dai->id);
2383 pm_runtime_put_sync(afe->dev);
2384 }
2385 return 0;
2386 }
2387
2388 static struct snd_soc_dai_driver mtk_dai_etdm_driver[] = {
2389 {
2390 .name = "DPTX",
2391 .id = MT8195_AFE_IO_DPTX,
2392 .playback = {
2393 .stream_name = "DPTX Playback",
2394 .channels_min = 1,
2395 .channels_max = 8,
2396 .rates = MTK_ETDM_RATES,
2397 .formats = MTK_ETDM_FORMATS,
2398 },
2399 .ops = &mtk_dai_hdmitx_dptx_ops,
2400 },
2401 {
2402 .name = "ETDM1_IN",
2403 .id = MT8195_AFE_IO_ETDM1_IN,
2404 .capture = {
2405 .stream_name = "ETDM1 Capture",
2406 .channels_min = 1,
2407 .channels_max = 24,
2408 .rates = MTK_ETDM_RATES,
2409 .formats = MTK_ETDM_FORMATS,
2410 },
2411 .ops = &mtk_dai_etdm_ops,
2412 .probe = mtk_dai_etdm_probe,
2413 },
2414 {
2415 .name = "ETDM2_IN",
2416 .id = MT8195_AFE_IO_ETDM2_IN,
2417 .capture = {
2418 .stream_name = "ETDM2 Capture",
2419 .channels_min = 1,
2420 .channels_max = 16,
2421 .rates = MTK_ETDM_RATES,
2422 .formats = MTK_ETDM_FORMATS,
2423 },
2424 .ops = &mtk_dai_etdm_ops,
2425 .probe = mtk_dai_etdm_probe,
2426 },
2427 {
2428 .name = "ETDM1_OUT",
2429 .id = MT8195_AFE_IO_ETDM1_OUT,
2430 .playback = {
2431 .stream_name = "ETDM1 Playback",
2432 .channels_min = 1,
2433 .channels_max = 24,
2434 .rates = MTK_ETDM_RATES,
2435 .formats = MTK_ETDM_FORMATS,
2436 },
2437 .ops = &mtk_dai_etdm_ops,
2438 .probe = mtk_dai_etdm_probe,
2439 },
2440 {
2441 .name = "ETDM2_OUT",
2442 .id = MT8195_AFE_IO_ETDM2_OUT,
2443 .playback = {
2444 .stream_name = "ETDM2 Playback",
2445 .channels_min = 1,
2446 .channels_max = 24,
2447 .rates = MTK_ETDM_RATES,
2448 .formats = MTK_ETDM_FORMATS,
2449 },
2450 .ops = &mtk_dai_etdm_ops,
2451 .probe = mtk_dai_etdm_probe,
2452 },
2453 {
2454 .name = "ETDM3_OUT",
2455 .id = MT8195_AFE_IO_ETDM3_OUT,
2456 .playback = {
2457 .stream_name = "ETDM3 Playback",
2458 .channels_min = 1,
2459 .channels_max = 8,
2460 .rates = MTK_ETDM_RATES,
2461 .formats = MTK_ETDM_FORMATS,
2462 },
2463 .ops = &mtk_dai_hdmitx_dptx_ops,
2464 .probe = mtk_dai_etdm_probe,
2465 },
2466 };
2467
2468 static void mt8195_etdm_update_sync_info(struct mtk_base_afe *afe)
2469 {
2470 struct mt8195_afe_private *afe_priv = afe->platform_priv;
2471 struct mtk_dai_etdm_priv *etdm_data;
2472 struct mtk_dai_etdm_priv *mst_data;
2473 int i;
2474 int mst_dai_id;
2475
2476 for (i = MT8195_AFE_IO_ETDM_START; i < MT8195_AFE_IO_ETDM_END; i++) {
2477 etdm_data = afe_priv->dai_priv[i];
2478 if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) {
2479 mst_dai_id = etdm_data->cowork_source_id;
2480 mst_data = afe_priv->dai_priv[mst_dai_id];
2481 if (mst_data->cowork_source_id != COWORK_ETDM_NONE)
2482 dev_info(afe->dev, "%s [%d] wrong sync source\n"
2483 , __func__, i);
2484 mst_data->cowork_slv_id[mst_data->cowork_slv_count] = i;
2485 mst_data->cowork_slv_count++;
2486 }
2487 }
2488 }
2489
2490 static void mt8195_dai_etdm_parse_of(struct mtk_base_afe *afe)
2491 {
2492 const struct device_node *of_node = afe->dev->of_node;
2493 struct mt8195_afe_private *afe_priv = afe->platform_priv;
2494 struct mtk_dai_etdm_priv *etdm_data;
2495 int i, j;
2496 char prop[48];
2497 u8 disable_chn[MT8195_ETDM_MAX_CHANNELS];
2498 int max_chn = MT8195_ETDM_MAX_CHANNELS;
2499 u32 sel;
2500 int ret;
2501 int dai_id;
2502 unsigned int sync_id;
2503 struct {
2504 const char *name;
2505 const unsigned int sync_id;
2506 } of_afe_etdms[MT8195_AFE_IO_ETDM_NUM] = {
2507 {"etdm-in1", ETDM_SYNC_FROM_IN1},
2508 {"etdm-in2", ETDM_SYNC_FROM_IN2},
2509 {"etdm-out1", ETDM_SYNC_FROM_OUT1},
2510 {"etdm-out2", ETDM_SYNC_FROM_OUT2},
2511 {"etdm-out3", ETDM_SYNC_FROM_OUT3},
2512 };
2513
2514 for (i = 0; i < MT8195_AFE_IO_ETDM_NUM; i++) {
2515 dai_id = ETDM_TO_DAI_ID(i);
2516 etdm_data = afe_priv->dai_priv[dai_id];
2517
2518 ret = snprintf(prop, sizeof(prop),
2519 "mediatek,%s-mclk-always-on-rate",
2520 of_afe_etdms[i].name);
2521 if (ret < 0) {
2522 dev_info(afe->dev, "%s snprintf err=%d\n",
2523 __func__, ret);
2524 return;
2525 }
2526 ret = of_property_read_u32(of_node, prop, &sel);
2527 if (ret == 0) {
2528 etdm_data->mclk_dir = SND_SOC_CLOCK_OUT;
2529 if (mtk_dai_etdm_cal_mclk(afe, sel, dai_id))
2530 dev_info(afe->dev, "%s unsupported mclk %uHz\n",
2531 __func__, sel);
2532 }
2533
2534 ret = snprintf(prop, sizeof(prop),
2535 "mediatek,%s-multi-pin-mode",
2536 of_afe_etdms[i].name);
2537 if (ret < 0) {
2538 dev_info(afe->dev, "%s snprintf err=%d\n",
2539 __func__, ret);
2540 return;
2541 }
2542 etdm_data->data_mode = of_property_read_bool(of_node, prop);
2543
2544 ret = snprintf(prop, sizeof(prop),
2545 "mediatek,%s-cowork-source",
2546 of_afe_etdms[i].name);
2547 if (ret < 0) {
2548 dev_info(afe->dev, "%s snprintf err=%d\n",
2549 __func__, ret);
2550 return;
2551 }
2552 ret = of_property_read_u32(of_node, prop, &sel);
2553 if (ret == 0) {
2554 if (sel >= MT8195_AFE_IO_ETDM_NUM) {
2555 dev_info(afe->dev, "%s invalid id=%d\n",
2556 __func__, sel);
2557 etdm_data->cowork_source_id = COWORK_ETDM_NONE;
2558 } else {
2559 sync_id = of_afe_etdms[sel].sync_id;
2560 etdm_data->cowork_source_id =
2561 sync_to_dai_id(sync_id);
2562 }
2563 } else {
2564 etdm_data->cowork_source_id = COWORK_ETDM_NONE;
2565 }
2566 }
2567
2568
2569 for (i = 0; i < 2; i++) {
2570 ret = snprintf(prop, sizeof(prop),
2571 "mediatek,%s-chn-disabled",
2572 of_afe_etdms[i].name);
2573 if (ret < 0) {
2574 dev_info(afe->dev, "%s snprintf err=%d\n",
2575 __func__, ret);
2576 return;
2577 }
2578 ret = of_property_read_variable_u8_array(of_node, prop,
2579 disable_chn,
2580 1, max_chn);
2581 if (ret < 0)
2582 continue;
2583
2584 for (j = 0; j < ret; j++) {
2585 if (disable_chn[j] >= MT8195_ETDM_MAX_CHANNELS)
2586 dev_info(afe->dev, "%s [%d] invalid chn %u\n",
2587 __func__, j, disable_chn[j]);
2588 else
2589 etdm_data->in_disable_ch[disable_chn[j]] = true;
2590 }
2591 }
2592 mt8195_etdm_update_sync_info(afe);
2593 }
2594
2595 static int init_etdm_priv_data(struct mtk_base_afe *afe)
2596 {
2597 struct mt8195_afe_private *afe_priv = afe->platform_priv;
2598 struct mtk_dai_etdm_priv *etdm_priv;
2599 int i;
2600
2601 for (i = MT8195_AFE_IO_ETDM_START; i < MT8195_AFE_IO_ETDM_END; i++) {
2602 etdm_priv = devm_kzalloc(afe->dev,
2603 sizeof(struct mtk_dai_etdm_priv),
2604 GFP_KERNEL);
2605 if (!etdm_priv)
2606 return -ENOMEM;
2607
2608 afe_priv->dai_priv[i] = etdm_priv;
2609 }
2610
2611 afe_priv->dai_priv[MT8195_AFE_IO_DPTX] =
2612 afe_priv->dai_priv[MT8195_AFE_IO_ETDM3_OUT];
2613
2614 mt8195_dai_etdm_parse_of(afe);
2615 return 0;
2616 }
2617
2618 int mt8195_dai_etdm_register(struct mtk_base_afe *afe)
2619 {
2620 struct mtk_base_afe_dai *dai;
2621
2622 dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
2623 if (!dai)
2624 return -ENOMEM;
2625
2626 list_add(&dai->list, &afe->sub_dais);
2627
2628 dai->dai_drivers = mtk_dai_etdm_driver;
2629 dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_etdm_driver);
2630
2631 dai->dapm_widgets = mtk_dai_etdm_widgets;
2632 dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_etdm_widgets);
2633 dai->dapm_routes = mtk_dai_etdm_routes;
2634 dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_etdm_routes);
2635 dai->controls = mtk_dai_etdm_controls;
2636 dai->num_controls = ARRAY_SIZE(mtk_dai_etdm_controls);
2637
2638 return init_etdm_priv_data(afe);
2639 }