1 // SPDX-License-Identifier: GPL-2.0 2 // 3 // MediaTek ALSA SoC Audio DAI I2S Control 4 // 5 // Copyright (c) 2020 MediaTek Inc. 6 // Author: Shane Chien <shane.chien@mediatek.com> 7 // 8 9 #include <linux/bitops.h> 10 #include <linux/regmap.h> 11 #include <sound/pcm_params.h> 12 13 #include "mt8192-afe-clk.h" 14 #include "mt8192-afe-common.h" 15 #include "mt8192-afe-gpio.h" 16 #include "mt8192-interconnection.h" 17 18 enum { 19 I2S_FMT_EIAJ = 0, 20 I2S_FMT_I2S = 1, 21 }; 22 23 enum { 24 I2S_WLEN_16_BIT = 0, 25 I2S_WLEN_32_BIT = 1, 26 }; 27 28 enum { 29 I2S_HD_NORMAL = 0, 30 I2S_HD_LOW_JITTER = 1, 31 }; 32 33 enum { 34 I2S1_SEL_O28_O29 = 0, 35 I2S1_SEL_O03_O04 = 1, 36 }; 37 38 enum { 39 I2S_IN_PAD_CONNSYS = 0, 40 I2S_IN_PAD_IO_MUX = 1, 41 }; 42 43 struct mtk_afe_i2s_priv { 44 int id; 45 int rate; /* for determine which apll to use */ 46 int low_jitter_en; 47 48 int share_i2s_id; 49 50 int mclk_id; 51 int mclk_rate; 52 int mclk_apll; 53 }; 54 55 static unsigned int get_i2s_wlen(snd_pcm_format_t format) 56 { 57 return snd_pcm_format_physical_width(format) <= 16 ? 58 I2S_WLEN_16_BIT : I2S_WLEN_32_BIT; 59 } 60 61 #define MTK_AFE_I2S0_KCONTROL_NAME "I2S0_HD_Mux" 62 #define MTK_AFE_I2S1_KCONTROL_NAME "I2S1_HD_Mux" 63 #define MTK_AFE_I2S2_KCONTROL_NAME "I2S2_HD_Mux" 64 #define MTK_AFE_I2S3_KCONTROL_NAME "I2S3_HD_Mux" 65 #define MTK_AFE_I2S5_KCONTROL_NAME "I2S5_HD_Mux" 66 #define MTK_AFE_I2S6_KCONTROL_NAME "I2S6_HD_Mux" 67 #define MTK_AFE_I2S7_KCONTROL_NAME "I2S7_HD_Mux" 68 #define MTK_AFE_I2S8_KCONTROL_NAME "I2S8_HD_Mux" 69 #define MTK_AFE_I2S9_KCONTROL_NAME "I2S9_HD_Mux" 70 71 #define I2S0_HD_EN_W_NAME "I2S0_HD_EN" 72 #define I2S1_HD_EN_W_NAME "I2S1_HD_EN" 73 #define I2S2_HD_EN_W_NAME "I2S2_HD_EN" 74 #define I2S3_HD_EN_W_NAME "I2S3_HD_EN" 75 #define I2S5_HD_EN_W_NAME "I2S5_HD_EN" 76 #define I2S6_HD_EN_W_NAME "I2S6_HD_EN" 77 #define I2S7_HD_EN_W_NAME "I2S7_HD_EN" 78 #define I2S8_HD_EN_W_NAME "I2S8_HD_EN" 79 #define I2S9_HD_EN_W_NAME "I2S9_HD_EN" 80 81 #define I2S0_MCLK_EN_W_NAME "I2S0_MCLK_EN" 82 #define I2S1_MCLK_EN_W_NAME "I2S1_MCLK_EN" 83 #define I2S2_MCLK_EN_W_NAME "I2S2_MCLK_EN" 84 #define I2S3_MCLK_EN_W_NAME "I2S3_MCLK_EN" 85 #define I2S5_MCLK_EN_W_NAME "I2S5_MCLK_EN" 86 #define I2S6_MCLK_EN_W_NAME "I2S6_MCLK_EN" 87 #define I2S7_MCLK_EN_W_NAME "I2S7_MCLK_EN" 88 #define I2S8_MCLK_EN_W_NAME "I2S8_MCLK_EN" 89 #define I2S9_MCLK_EN_W_NAME "I2S9_MCLK_EN" 90 91 static int get_i2s_id_by_name(struct mtk_base_afe *afe, 92 const char *name) 93 { 94 if (strncmp(name, "I2S0", 4) == 0) 95 return MT8192_DAI_I2S_0; 96 else if (strncmp(name, "I2S1", 4) == 0) 97 return MT8192_DAI_I2S_1; 98 else if (strncmp(name, "I2S2", 4) == 0) 99 return MT8192_DAI_I2S_2; 100 else if (strncmp(name, "I2S3", 4) == 0) 101 return MT8192_DAI_I2S_3; 102 else if (strncmp(name, "I2S5", 4) == 0) 103 return MT8192_DAI_I2S_5; 104 else if (strncmp(name, "I2S6", 4) == 0) 105 return MT8192_DAI_I2S_6; 106 else if (strncmp(name, "I2S7", 4) == 0) 107 return MT8192_DAI_I2S_7; 108 else if (strncmp(name, "I2S8", 4) == 0) 109 return MT8192_DAI_I2S_8; 110 else if (strncmp(name, "I2S9", 4) == 0) 111 return MT8192_DAI_I2S_9; 112 else 113 return -EINVAL; 114 } 115 116 static struct mtk_afe_i2s_priv *get_i2s_priv_by_name(struct mtk_base_afe *afe, 117 const char *name) 118 { 119 struct mt8192_afe_private *afe_priv = afe->platform_priv; 120 int dai_id = get_i2s_id_by_name(afe, name); 121 122 if (dai_id < 0) 123 return NULL; 124 125 return afe_priv->dai_priv[dai_id]; 126 } 127 128 /* low jitter control */ 129 static const char * const mt8192_i2s_hd_str[] = { 130 "Normal", "Low_Jitter" 131 }; 132 133 static SOC_ENUM_SINGLE_EXT_DECL(mt8192_i2s_enum, mt8192_i2s_hd_str); 134 135 static int mt8192_i2s_hd_get(struct snd_kcontrol *kcontrol, 136 struct snd_ctl_elem_value *ucontrol) 137 { 138 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol); 139 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt); 140 struct mtk_afe_i2s_priv *i2s_priv; 141 142 i2s_priv = get_i2s_priv_by_name(afe, kcontrol->id.name); 143 144 if (!i2s_priv) { 145 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__); 146 return -EINVAL; 147 } 148 149 ucontrol->value.integer.value[0] = i2s_priv->low_jitter_en; 150 151 return 0; 152 } 153 154 static int mt8192_i2s_hd_set(struct snd_kcontrol *kcontrol, 155 struct snd_ctl_elem_value *ucontrol) 156 { 157 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol); 158 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt); 159 struct mtk_afe_i2s_priv *i2s_priv; 160 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 161 int hd_en; 162 163 if (ucontrol->value.enumerated.item[0] >= e->items) 164 return -EINVAL; 165 166 hd_en = ucontrol->value.integer.value[0]; 167 168 dev_dbg(afe->dev, "%s(), kcontrol name %s, hd_en %d\n", 169 __func__, kcontrol->id.name, hd_en); 170 171 i2s_priv = get_i2s_priv_by_name(afe, kcontrol->id.name); 172 173 if (!i2s_priv) { 174 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__); 175 return -EINVAL; 176 } 177 178 i2s_priv->low_jitter_en = hd_en; 179 180 return 0; 181 } 182 183 static const struct snd_kcontrol_new mtk_dai_i2s_controls[] = { 184 SOC_ENUM_EXT(MTK_AFE_I2S0_KCONTROL_NAME, mt8192_i2s_enum, 185 mt8192_i2s_hd_get, mt8192_i2s_hd_set), 186 SOC_ENUM_EXT(MTK_AFE_I2S1_KCONTROL_NAME, mt8192_i2s_enum, 187 mt8192_i2s_hd_get, mt8192_i2s_hd_set), 188 SOC_ENUM_EXT(MTK_AFE_I2S2_KCONTROL_NAME, mt8192_i2s_enum, 189 mt8192_i2s_hd_get, mt8192_i2s_hd_set), 190 SOC_ENUM_EXT(MTK_AFE_I2S3_KCONTROL_NAME, mt8192_i2s_enum, 191 mt8192_i2s_hd_get, mt8192_i2s_hd_set), 192 SOC_ENUM_EXT(MTK_AFE_I2S5_KCONTROL_NAME, mt8192_i2s_enum, 193 mt8192_i2s_hd_get, mt8192_i2s_hd_set), 194 SOC_ENUM_EXT(MTK_AFE_I2S6_KCONTROL_NAME, mt8192_i2s_enum, 195 mt8192_i2s_hd_get, mt8192_i2s_hd_set), 196 SOC_ENUM_EXT(MTK_AFE_I2S7_KCONTROL_NAME, mt8192_i2s_enum, 197 mt8192_i2s_hd_get, mt8192_i2s_hd_set), 198 SOC_ENUM_EXT(MTK_AFE_I2S8_KCONTROL_NAME, mt8192_i2s_enum, 199 mt8192_i2s_hd_get, mt8192_i2s_hd_set), 200 SOC_ENUM_EXT(MTK_AFE_I2S9_KCONTROL_NAME, mt8192_i2s_enum, 201 mt8192_i2s_hd_get, mt8192_i2s_hd_set), 202 }; 203 204 /* dai component */ 205 /* i2s virtual mux to output widget */ 206 static const char * const i2s_mux_map[] = { 207 "Normal", "Dummy_Widget", 208 }; 209 210 static int i2s_mux_map_value[] = { 211 0, 1, 212 }; 213 214 static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(i2s_mux_map_enum, 215 SND_SOC_NOPM, 216 0, 217 1, 218 i2s_mux_map, 219 i2s_mux_map_value); 220 221 static const struct snd_kcontrol_new i2s0_in_mux_control = 222 SOC_DAPM_ENUM("I2S0 In Select", i2s_mux_map_enum); 223 224 static const struct snd_kcontrol_new i2s8_in_mux_control = 225 SOC_DAPM_ENUM("I2S8 In Select", i2s_mux_map_enum); 226 227 static const struct snd_kcontrol_new i2s1_out_mux_control = 228 SOC_DAPM_ENUM("I2S1 Out Select", i2s_mux_map_enum); 229 230 static const struct snd_kcontrol_new i2s3_out_mux_control = 231 SOC_DAPM_ENUM("I2S3 Out Select", i2s_mux_map_enum); 232 233 static const struct snd_kcontrol_new i2s5_out_mux_control = 234 SOC_DAPM_ENUM("I2S5 Out Select", i2s_mux_map_enum); 235 236 static const struct snd_kcontrol_new i2s7_out_mux_control = 237 SOC_DAPM_ENUM("I2S7 Out Select", i2s_mux_map_enum); 238 239 static const struct snd_kcontrol_new i2s9_out_mux_control = 240 SOC_DAPM_ENUM("I2S9 Out Select", i2s_mux_map_enum); 241 242 /* Tinyconn Mux */ 243 enum { 244 TINYCONN_CH1_MUX_DL1 = 0x0, 245 TINYCONN_CH2_MUX_DL1 = 0x1, 246 TINYCONN_CH1_MUX_DL12 = 0x2, 247 TINYCONN_CH2_MUX_DL12 = 0x3, 248 TINYCONN_CH1_MUX_DL2 = 0x4, 249 TINYCONN_CH2_MUX_DL2 = 0x5, 250 TINYCONN_CH1_MUX_DL3 = 0x6, 251 TINYCONN_CH2_MUX_DL3 = 0x7, 252 TINYCONN_MUX_NONE = 0x1f, 253 }; 254 255 static const char * const tinyconn_mux_map[] = { 256 "NONE", 257 "DL1_CH1", 258 "DL1_CH2", 259 "DL12_CH1", 260 "DL12_CH2", 261 "DL2_CH1", 262 "DL2_CH2", 263 "DL3_CH1", 264 "DL3_CH2", 265 }; 266 267 static int tinyconn_mux_map_value[] = { 268 TINYCONN_MUX_NONE, 269 TINYCONN_CH1_MUX_DL1, 270 TINYCONN_CH2_MUX_DL1, 271 TINYCONN_CH1_MUX_DL12, 272 TINYCONN_CH2_MUX_DL12, 273 TINYCONN_CH1_MUX_DL2, 274 TINYCONN_CH2_MUX_DL2, 275 TINYCONN_CH1_MUX_DL3, 276 TINYCONN_CH2_MUX_DL3, 277 }; 278 279 static SOC_VALUE_ENUM_SINGLE_DECL(i2s1_tinyconn_ch1_mux_map_enum, 280 AFE_TINY_CONN5, 281 O_20_CFG_SFT, 282 O_20_CFG_MASK, 283 tinyconn_mux_map, 284 tinyconn_mux_map_value); 285 static const struct snd_kcontrol_new i2s1_tinyconn_ch1_mux_control = 286 SOC_DAPM_ENUM("i2s1 ch1 tinyconn Select", 287 i2s1_tinyconn_ch1_mux_map_enum); 288 289 static SOC_VALUE_ENUM_SINGLE_DECL(i2s1_tinyconn_ch2_mux_map_enum, 290 AFE_TINY_CONN5, 291 O_21_CFG_SFT, 292 O_21_CFG_MASK, 293 tinyconn_mux_map, 294 tinyconn_mux_map_value); 295 static const struct snd_kcontrol_new i2s1_tinyconn_ch2_mux_control = 296 SOC_DAPM_ENUM("i2s1 ch2 tinyconn Select", 297 i2s1_tinyconn_ch2_mux_map_enum); 298 299 static SOC_VALUE_ENUM_SINGLE_DECL(i2s3_tinyconn_ch1_mux_map_enum, 300 AFE_TINY_CONN5, 301 O_22_CFG_SFT, 302 O_22_CFG_MASK, 303 tinyconn_mux_map, 304 tinyconn_mux_map_value); 305 static const struct snd_kcontrol_new i2s3_tinyconn_ch1_mux_control = 306 SOC_DAPM_ENUM("i2s3 ch1 tinyconn Select", 307 i2s3_tinyconn_ch1_mux_map_enum); 308 309 static SOC_VALUE_ENUM_SINGLE_DECL(i2s3_tinyconn_ch2_mux_map_enum, 310 AFE_TINY_CONN5, 311 O_23_CFG_SFT, 312 O_23_CFG_MASK, 313 tinyconn_mux_map, 314 tinyconn_mux_map_value); 315 static const struct snd_kcontrol_new i2s3_tinyconn_ch2_mux_control = 316 SOC_DAPM_ENUM("i2s3 ch2 tinyconn Select", 317 i2s3_tinyconn_ch2_mux_map_enum); 318 319 /* i2s in lpbk */ 320 static const char * const i2s_lpbk_mux_map[] = { 321 "Normal", "Lpbk", 322 }; 323 324 static int i2s_lpbk_mux_map_value[] = { 325 0, 1, 326 }; 327 328 static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(i2s0_lpbk_mux_map_enum, 329 AFE_I2S_CON, 330 I2S_LOOPBACK_SFT, 331 1, 332 i2s_lpbk_mux_map, 333 i2s_lpbk_mux_map_value); 334 335 static const struct snd_kcontrol_new i2s0_lpbk_mux_control = 336 SOC_DAPM_ENUM("I2S Lpbk Select", i2s0_lpbk_mux_map_enum); 337 338 static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(i2s2_lpbk_mux_map_enum, 339 AFE_I2S_CON2, 340 I2S3_LOOPBACK_SFT, 341 1, 342 i2s_lpbk_mux_map, 343 i2s_lpbk_mux_map_value); 344 345 static const struct snd_kcontrol_new i2s2_lpbk_mux_control = 346 SOC_DAPM_ENUM("I2S Lpbk Select", i2s2_lpbk_mux_map_enum); 347 348 /* interconnection */ 349 static const struct snd_kcontrol_new mtk_i2s3_ch1_mix[] = { 350 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN0, I_DL1_CH1, 1, 0), 351 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN0, I_DL2_CH1, 1, 0), 352 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN0, I_DL3_CH1, 1, 0), 353 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN0, I_DL12_CH1, 1, 0), 354 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN0_1, I_DL6_CH1, 1, 0), 355 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN0_1, I_DL4_CH1, 1, 0), 356 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN0_1, I_DL5_CH1, 1, 0), 357 SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH1", AFE_CONN0_1, I_DL8_CH1, 1, 0), 358 SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH1", AFE_CONN0_1, I_DL9_CH1, 1, 0), 359 SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN0, 360 I_GAIN1_OUT_CH1, 1, 0), 361 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN0, 362 I_ADDA_UL_CH1, 1, 0), 363 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN0, 364 I_ADDA_UL_CH2, 1, 0), 365 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN0, 366 I_ADDA_UL_CH3, 1, 0), 367 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN0, 368 I_PCM_1_CAP_CH1, 1, 0), 369 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN0, 370 I_PCM_2_CAP_CH1, 1, 0), 371 }; 372 373 static const struct snd_kcontrol_new mtk_i2s3_ch2_mix[] = { 374 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN1, I_DL1_CH2, 1, 0), 375 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN1, I_DL2_CH2, 1, 0), 376 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN1, I_DL3_CH2, 1, 0), 377 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN1, I_DL12_CH2, 1, 0), 378 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN1_1, I_DL6_CH2, 1, 0), 379 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN1_1, I_DL4_CH2, 1, 0), 380 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN1_1, I_DL5_CH2, 1, 0), 381 SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH2", AFE_CONN1_1, I_DL8_CH2, 1, 0), 382 SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH2", AFE_CONN1_1, I_DL9_CH2, 1, 0), 383 SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN1, 384 I_GAIN1_OUT_CH2, 1, 0), 385 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN1, 386 I_ADDA_UL_CH1, 1, 0), 387 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN1, 388 I_ADDA_UL_CH2, 1, 0), 389 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN1, 390 I_ADDA_UL_CH3, 1, 0), 391 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN1, 392 I_PCM_1_CAP_CH1, 1, 0), 393 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN1, 394 I_PCM_2_CAP_CH1, 1, 0), 395 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN1, 396 I_PCM_1_CAP_CH2, 1, 0), 397 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN1, 398 I_PCM_2_CAP_CH2, 1, 0), 399 }; 400 401 static const struct snd_kcontrol_new mtk_i2s1_ch1_mix[] = { 402 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN28, I_DL1_CH1, 1, 0), 403 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN28, I_DL2_CH1, 1, 0), 404 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN28, I_DL3_CH1, 1, 0), 405 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN28, I_DL12_CH1, 1, 0), 406 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN28_1, I_DL6_CH1, 1, 0), 407 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN28_1, I_DL4_CH1, 1, 0), 408 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN28_1, I_DL5_CH1, 1, 0), 409 SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH1", AFE_CONN28_1, I_DL8_CH1, 1, 0), 410 SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH1", AFE_CONN28_1, I_DL9_CH1, 1, 0), 411 SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN28, 412 I_GAIN1_OUT_CH1, 1, 0), 413 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN28, 414 I_ADDA_UL_CH1, 1, 0), 415 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN28, 416 I_PCM_1_CAP_CH1, 1, 0), 417 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN28, 418 I_PCM_2_CAP_CH1, 1, 0), 419 }; 420 421 static const struct snd_kcontrol_new mtk_i2s1_ch2_mix[] = { 422 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN29, I_DL1_CH2, 1, 0), 423 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN29, I_DL2_CH2, 1, 0), 424 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN29, I_DL3_CH2, 1, 0), 425 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN29, I_DL12_CH2, 1, 0), 426 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN29_1, I_DL6_CH2, 1, 0), 427 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN29_1, I_DL4_CH2, 1, 0), 428 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN29_1, I_DL5_CH2, 1, 0), 429 SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH2", AFE_CONN29_1, I_DL8_CH2, 1, 0), 430 SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH2", AFE_CONN29_1, I_DL9_CH2, 1, 0), 431 SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN29, 432 I_GAIN1_OUT_CH2, 1, 0), 433 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN29, 434 I_ADDA_UL_CH2, 1, 0), 435 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN29, 436 I_PCM_1_CAP_CH1, 1, 0), 437 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN29, 438 I_PCM_2_CAP_CH1, 1, 0), 439 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN29, 440 I_PCM_1_CAP_CH2, 1, 0), 441 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN29, 442 I_PCM_2_CAP_CH2, 1, 0), 443 }; 444 445 static const struct snd_kcontrol_new mtk_i2s5_ch1_mix[] = { 446 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN30, I_DL1_CH1, 1, 0), 447 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN30, I_DL2_CH1, 1, 0), 448 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN30, I_DL3_CH1, 1, 0), 449 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN30, I_DL12_CH1, 1, 0), 450 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN30_1, I_DL6_CH1, 1, 0), 451 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN30_1, I_DL4_CH1, 1, 0), 452 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN30_1, I_DL5_CH1, 1, 0), 453 SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH1", AFE_CONN30_1, I_DL8_CH1, 1, 0), 454 SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH1", AFE_CONN30_1, I_DL9_CH1, 1, 0), 455 SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN30, 456 I_GAIN1_OUT_CH1, 1, 0), 457 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN30, 458 I_ADDA_UL_CH1, 1, 0), 459 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN30, 460 I_PCM_1_CAP_CH1, 1, 0), 461 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN30, 462 I_PCM_2_CAP_CH1, 1, 0), 463 }; 464 465 static const struct snd_kcontrol_new mtk_i2s5_ch2_mix[] = { 466 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN31, I_DL1_CH2, 1, 0), 467 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN31, I_DL2_CH2, 1, 0), 468 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN31, I_DL3_CH2, 1, 0), 469 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN31, I_DL12_CH2, 1, 0), 470 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN31_1, I_DL6_CH2, 1, 0), 471 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN31_1, I_DL4_CH2, 1, 0), 472 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN31_1, I_DL5_CH2, 1, 0), 473 SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH2", AFE_CONN31_1, I_DL8_CH2, 1, 0), 474 SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH2", AFE_CONN31_1, I_DL9_CH2, 1, 0), 475 SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN31, 476 I_GAIN1_OUT_CH2, 1, 0), 477 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN31, 478 I_ADDA_UL_CH2, 1, 0), 479 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN31, 480 I_PCM_1_CAP_CH1, 1, 0), 481 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN31, 482 I_PCM_2_CAP_CH1, 1, 0), 483 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN31, 484 I_PCM_1_CAP_CH2, 1, 0), 485 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN31, 486 I_PCM_2_CAP_CH2, 1, 0), 487 }; 488 489 static const struct snd_kcontrol_new mtk_i2s7_ch1_mix[] = { 490 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN54, I_DL1_CH1, 1, 0), 491 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN54, I_DL2_CH1, 1, 0), 492 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN54, I_DL3_CH1, 1, 0), 493 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN54, I_DL12_CH1, 1, 0), 494 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN54_1, I_DL6_CH1, 1, 0), 495 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN54_1, I_DL4_CH1, 1, 0), 496 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN54_1, I_DL5_CH1, 1, 0), 497 SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH1", AFE_CONN54_1, I_DL9_CH1, 1, 0), 498 SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN54, 499 I_GAIN1_OUT_CH1, 1, 0), 500 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN54, 501 I_ADDA_UL_CH1, 1, 0), 502 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN54, 503 I_PCM_1_CAP_CH1, 1, 0), 504 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN54, 505 I_PCM_2_CAP_CH1, 1, 0), 506 }; 507 508 static const struct snd_kcontrol_new mtk_i2s7_ch2_mix[] = { 509 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN55, I_DL1_CH2, 1, 0), 510 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN55, I_DL2_CH2, 1, 0), 511 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN55, I_DL3_CH2, 1, 0), 512 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN55, I_DL12_CH2, 1, 0), 513 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN55_1, I_DL6_CH2, 1, 0), 514 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN55_1, I_DL4_CH2, 1, 0), 515 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN55_1, I_DL5_CH2, 1, 0), 516 SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH2", AFE_CONN55_1, I_DL9_CH2, 1, 0), 517 SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN55, 518 I_GAIN1_OUT_CH2, 1, 0), 519 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN55, 520 I_ADDA_UL_CH2, 1, 0), 521 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN55, 522 I_PCM_1_CAP_CH1, 1, 0), 523 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN55, 524 I_PCM_2_CAP_CH1, 1, 0), 525 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN55, 526 I_PCM_1_CAP_CH2, 1, 0), 527 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN55, 528 I_PCM_2_CAP_CH2, 1, 0), 529 }; 530 531 static const struct snd_kcontrol_new mtk_i2s9_ch1_mix[] = { 532 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN56, I_DL1_CH1, 1, 0), 533 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN56, I_DL2_CH1, 1, 0), 534 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN56, I_DL3_CH1, 1, 0), 535 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN56, I_DL12_CH1, 1, 0), 536 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN56_1, I_DL6_CH1, 1, 0), 537 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN56_1, I_DL4_CH1, 1, 0), 538 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN56_1, I_DL5_CH1, 1, 0), 539 SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH1", AFE_CONN56_1, I_DL8_CH1, 1, 0), 540 SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH1", AFE_CONN56_1, I_DL9_CH1, 1, 0), 541 SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN56, 542 I_GAIN1_OUT_CH1, 1, 0), 543 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN56, 544 I_ADDA_UL_CH1, 1, 0), 545 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN56, 546 I_PCM_1_CAP_CH1, 1, 0), 547 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN56, 548 I_PCM_2_CAP_CH1, 1, 0), 549 }; 550 551 static const struct snd_kcontrol_new mtk_i2s9_ch2_mix[] = { 552 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN57, I_DL1_CH2, 1, 0), 553 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN57, I_DL2_CH2, 1, 0), 554 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN57, I_DL3_CH2, 1, 0), 555 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN57, I_DL12_CH2, 1, 0), 556 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN57_1, I_DL6_CH2, 1, 0), 557 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN57_1, I_DL4_CH2, 1, 0), 558 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN57_1, I_DL5_CH2, 1, 0), 559 SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH2", AFE_CONN57_1, I_DL8_CH2, 1, 0), 560 SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH2", AFE_CONN57_1, I_DL9_CH2, 1, 0), 561 SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN57, 562 I_GAIN1_OUT_CH2, 1, 0), 563 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN57, 564 I_ADDA_UL_CH2, 1, 0), 565 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN57, 566 I_PCM_1_CAP_CH1, 1, 0), 567 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN57, 568 I_PCM_2_CAP_CH1, 1, 0), 569 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN57, 570 I_PCM_1_CAP_CH2, 1, 0), 571 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN57, 572 I_PCM_2_CAP_CH2, 1, 0), 573 }; 574 575 enum { 576 SUPPLY_SEQ_APLL, 577 SUPPLY_SEQ_I2S_MCLK_EN, 578 SUPPLY_SEQ_I2S_HD_EN, 579 SUPPLY_SEQ_I2S_EN, 580 }; 581 582 static int mtk_i2s_en_event(struct snd_soc_dapm_widget *w, 583 struct snd_kcontrol *kcontrol, 584 int event) 585 { 586 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm); 587 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt); 588 struct mtk_afe_i2s_priv *i2s_priv; 589 590 i2s_priv = get_i2s_priv_by_name(afe, w->name); 591 592 if (!i2s_priv) { 593 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__); 594 return -EINVAL; 595 } 596 597 dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n", 598 __func__, w->name, event); 599 600 switch (event) { 601 case SND_SOC_DAPM_PRE_PMU: 602 mt8192_afe_gpio_request(afe->dev, true, i2s_priv->id, 0); 603 break; 604 case SND_SOC_DAPM_POST_PMD: 605 mt8192_afe_gpio_request(afe->dev, false, i2s_priv->id, 0); 606 break; 607 default: 608 break; 609 } 610 611 return 0; 612 } 613 614 static int mtk_apll_event(struct snd_soc_dapm_widget *w, 615 struct snd_kcontrol *kcontrol, 616 int event) 617 { 618 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm); 619 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt); 620 621 dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n", 622 __func__, w->name, event); 623 624 switch (event) { 625 case SND_SOC_DAPM_PRE_PMU: 626 if (snd_soc_dapm_widget_name_cmp(w, APLL1_W_NAME) == 0) 627 mt8192_apll1_enable(afe); 628 else 629 mt8192_apll2_enable(afe); 630 break; 631 case SND_SOC_DAPM_POST_PMD: 632 if (snd_soc_dapm_widget_name_cmp(w, APLL1_W_NAME) == 0) 633 mt8192_apll1_disable(afe); 634 else 635 mt8192_apll2_disable(afe); 636 break; 637 default: 638 break; 639 } 640 641 return 0; 642 } 643 644 static int i2s_out_tinyconn_event(struct snd_soc_dapm_widget *w, 645 struct snd_kcontrol *kcontrol, 646 int event) 647 { 648 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm); 649 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt); 650 unsigned int reg; 651 unsigned int reg_shift; 652 unsigned int reg_mask_shift; 653 654 dev_dbg(afe->dev, "%s(), event 0x%x\n", __func__, event); 655 656 if (strstr(w->name, "I2S1")) { 657 reg = AFE_I2S_CON1; 658 reg_shift = I2S2_32BIT_EN_SFT; 659 reg_mask_shift = I2S2_32BIT_EN_MASK_SFT; 660 } else if (strstr(w->name, "I2S3")) { 661 reg = AFE_I2S_CON3; 662 reg_shift = I2S4_32BIT_EN_SFT; 663 reg_mask_shift = I2S4_32BIT_EN_MASK_SFT; 664 } else if (strstr(w->name, "I2S5")) { 665 reg = AFE_I2S_CON4; 666 reg_shift = I2S5_32BIT_EN_SFT; 667 reg_mask_shift = I2S5_32BIT_EN_MASK_SFT; 668 } else if (strstr(w->name, "I2S7")) { 669 reg = AFE_I2S_CON7; 670 reg_shift = I2S7_32BIT_EN_SFT; 671 reg_mask_shift = I2S7_32BIT_EN_MASK_SFT; 672 } else if (strstr(w->name, "I2S9")) { 673 reg = AFE_I2S_CON9; 674 reg_shift = I2S9_32BIT_EN_SFT; 675 reg_mask_shift = I2S9_32BIT_EN_MASK_SFT; 676 } else { 677 reg = AFE_I2S_CON1; 678 reg_shift = I2S2_32BIT_EN_SFT; 679 reg_mask_shift = I2S2_32BIT_EN_MASK_SFT; 680 dev_warn(afe->dev, "%s(), error widget name %s, use i2s1\n", 681 __func__, w->name); 682 } 683 684 switch (event) { 685 case SND_SOC_DAPM_PRE_PMU: 686 regmap_update_bits(afe->regmap, reg, reg_mask_shift, 687 0x1 << reg_shift); 688 break; 689 case SND_SOC_DAPM_PRE_PMD: 690 regmap_update_bits(afe->regmap, reg, reg_mask_shift, 691 0x0 << reg_shift); 692 break; 693 default: 694 break; 695 } 696 697 return 0; 698 } 699 700 static int mtk_mclk_en_event(struct snd_soc_dapm_widget *w, 701 struct snd_kcontrol *kcontrol, 702 int event) 703 { 704 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm); 705 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt); 706 struct mtk_afe_i2s_priv *i2s_priv; 707 708 dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n", 709 __func__, w->name, event); 710 711 i2s_priv = get_i2s_priv_by_name(afe, w->name); 712 if (!i2s_priv) { 713 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__); 714 return -EINVAL; 715 } 716 717 switch (event) { 718 case SND_SOC_DAPM_PRE_PMU: 719 mt8192_mck_enable(afe, i2s_priv->mclk_id, i2s_priv->mclk_rate); 720 break; 721 case SND_SOC_DAPM_POST_PMD: 722 i2s_priv->mclk_rate = 0; 723 mt8192_mck_disable(afe, i2s_priv->mclk_id); 724 break; 725 default: 726 break; 727 } 728 729 return 0; 730 } 731 732 static const struct snd_soc_dapm_widget mtk_dai_i2s_widgets[] = { 733 SND_SOC_DAPM_INPUT("CONNSYS"), 734 735 SND_SOC_DAPM_MIXER("I2S1_CH1", SND_SOC_NOPM, 0, 0, 736 mtk_i2s1_ch1_mix, 737 ARRAY_SIZE(mtk_i2s1_ch1_mix)), 738 SND_SOC_DAPM_MIXER("I2S1_CH2", SND_SOC_NOPM, 0, 0, 739 mtk_i2s1_ch2_mix, 740 ARRAY_SIZE(mtk_i2s1_ch2_mix)), 741 742 SND_SOC_DAPM_MIXER("I2S3_CH1", SND_SOC_NOPM, 0, 0, 743 mtk_i2s3_ch1_mix, 744 ARRAY_SIZE(mtk_i2s3_ch1_mix)), 745 SND_SOC_DAPM_MIXER("I2S3_CH2", SND_SOC_NOPM, 0, 0, 746 mtk_i2s3_ch2_mix, 747 ARRAY_SIZE(mtk_i2s3_ch2_mix)), 748 749 SND_SOC_DAPM_MIXER("I2S5_CH1", SND_SOC_NOPM, 0, 0, 750 mtk_i2s5_ch1_mix, 751 ARRAY_SIZE(mtk_i2s5_ch1_mix)), 752 SND_SOC_DAPM_MIXER("I2S5_CH2", SND_SOC_NOPM, 0, 0, 753 mtk_i2s5_ch2_mix, 754 ARRAY_SIZE(mtk_i2s5_ch2_mix)), 755 756 SND_SOC_DAPM_MIXER("I2S7_CH1", SND_SOC_NOPM, 0, 0, 757 mtk_i2s7_ch1_mix, 758 ARRAY_SIZE(mtk_i2s7_ch1_mix)), 759 SND_SOC_DAPM_MIXER("I2S7_CH2", SND_SOC_NOPM, 0, 0, 760 mtk_i2s7_ch2_mix, 761 ARRAY_SIZE(mtk_i2s7_ch2_mix)), 762 763 SND_SOC_DAPM_MIXER("I2S9_CH1", SND_SOC_NOPM, 0, 0, 764 mtk_i2s9_ch1_mix, 765 ARRAY_SIZE(mtk_i2s9_ch1_mix)), 766 SND_SOC_DAPM_MIXER("I2S9_CH2", SND_SOC_NOPM, 0, 0, 767 mtk_i2s9_ch2_mix, 768 ARRAY_SIZE(mtk_i2s9_ch2_mix)), 769 770 SND_SOC_DAPM_MUX_E("I2S1_TINYCONN_CH1_MUX", SND_SOC_NOPM, 0, 0, 771 &i2s1_tinyconn_ch1_mux_control, 772 i2s_out_tinyconn_event, 773 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), 774 SND_SOC_DAPM_MUX_E("I2S1_TINYCONN_CH2_MUX", SND_SOC_NOPM, 0, 0, 775 &i2s1_tinyconn_ch2_mux_control, 776 i2s_out_tinyconn_event, 777 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), 778 SND_SOC_DAPM_MUX_E("I2S3_TINYCONN_CH1_MUX", SND_SOC_NOPM, 0, 0, 779 &i2s3_tinyconn_ch1_mux_control, 780 i2s_out_tinyconn_event, 781 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), 782 SND_SOC_DAPM_MUX_E("I2S3_TINYCONN_CH2_MUX", SND_SOC_NOPM, 0, 0, 783 &i2s3_tinyconn_ch2_mux_control, 784 i2s_out_tinyconn_event, 785 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), 786 787 /* i2s en*/ 788 SND_SOC_DAPM_SUPPLY_S("I2S0_EN", SUPPLY_SEQ_I2S_EN, 789 AFE_I2S_CON, I2S_EN_SFT, 0, 790 mtk_i2s_en_event, 791 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 792 SND_SOC_DAPM_SUPPLY_S("I2S1_EN", SUPPLY_SEQ_I2S_EN, 793 AFE_I2S_CON1, I2S_EN_SFT, 0, 794 mtk_i2s_en_event, 795 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 796 SND_SOC_DAPM_SUPPLY_S("I2S2_EN", SUPPLY_SEQ_I2S_EN, 797 AFE_I2S_CON2, I2S_EN_SFT, 0, 798 mtk_i2s_en_event, 799 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 800 SND_SOC_DAPM_SUPPLY_S("I2S3_EN", SUPPLY_SEQ_I2S_EN, 801 AFE_I2S_CON3, I2S_EN_SFT, 0, 802 mtk_i2s_en_event, 803 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 804 SND_SOC_DAPM_SUPPLY_S("I2S5_EN", SUPPLY_SEQ_I2S_EN, 805 AFE_I2S_CON4, I2S5_EN_SFT, 0, 806 mtk_i2s_en_event, 807 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 808 SND_SOC_DAPM_SUPPLY_S("I2S6_EN", SUPPLY_SEQ_I2S_EN, 809 AFE_I2S_CON6, I2S6_EN_SFT, 0, 810 mtk_i2s_en_event, 811 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 812 SND_SOC_DAPM_SUPPLY_S("I2S7_EN", SUPPLY_SEQ_I2S_EN, 813 AFE_I2S_CON7, I2S7_EN_SFT, 0, 814 mtk_i2s_en_event, 815 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 816 SND_SOC_DAPM_SUPPLY_S("I2S8_EN", SUPPLY_SEQ_I2S_EN, 817 AFE_I2S_CON8, I2S8_EN_SFT, 0, 818 mtk_i2s_en_event, 819 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 820 SND_SOC_DAPM_SUPPLY_S("I2S9_EN", SUPPLY_SEQ_I2S_EN, 821 AFE_I2S_CON9, I2S9_EN_SFT, 0, 822 mtk_i2s_en_event, 823 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 824 /* i2s hd en */ 825 SND_SOC_DAPM_SUPPLY_S(I2S0_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN, 826 AFE_I2S_CON, I2S1_HD_EN_SFT, 0, NULL, 0), 827 SND_SOC_DAPM_SUPPLY_S(I2S1_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN, 828 AFE_I2S_CON1, I2S2_HD_EN_SFT, 0, NULL, 0), 829 SND_SOC_DAPM_SUPPLY_S(I2S2_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN, 830 AFE_I2S_CON2, I2S3_HD_EN_SFT, 0, NULL, 0), 831 SND_SOC_DAPM_SUPPLY_S(I2S3_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN, 832 AFE_I2S_CON3, I2S4_HD_EN_SFT, 0, NULL, 0), 833 SND_SOC_DAPM_SUPPLY_S(I2S5_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN, 834 AFE_I2S_CON4, I2S5_HD_EN_SFT, 0, NULL, 0), 835 SND_SOC_DAPM_SUPPLY_S(I2S6_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN, 836 AFE_I2S_CON6, I2S6_HD_EN_SFT, 0, NULL, 0), 837 SND_SOC_DAPM_SUPPLY_S(I2S7_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN, 838 AFE_I2S_CON7, I2S7_HD_EN_SFT, 0, NULL, 0), 839 SND_SOC_DAPM_SUPPLY_S(I2S8_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN, 840 AFE_I2S_CON8, I2S8_HD_EN_SFT, 0, NULL, 0), 841 SND_SOC_DAPM_SUPPLY_S(I2S9_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN, 842 AFE_I2S_CON9, I2S9_HD_EN_SFT, 0, NULL, 0), 843 844 /* i2s mclk en */ 845 SND_SOC_DAPM_SUPPLY_S(I2S0_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN, 846 SND_SOC_NOPM, 0, 0, 847 mtk_mclk_en_event, 848 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 849 SND_SOC_DAPM_SUPPLY_S(I2S1_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN, 850 SND_SOC_NOPM, 0, 0, 851 mtk_mclk_en_event, 852 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 853 SND_SOC_DAPM_SUPPLY_S(I2S2_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN, 854 SND_SOC_NOPM, 0, 0, 855 mtk_mclk_en_event, 856 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 857 SND_SOC_DAPM_SUPPLY_S(I2S3_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN, 858 SND_SOC_NOPM, 0, 0, 859 mtk_mclk_en_event, 860 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 861 SND_SOC_DAPM_SUPPLY_S(I2S5_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN, 862 SND_SOC_NOPM, 0, 0, 863 mtk_mclk_en_event, 864 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 865 SND_SOC_DAPM_SUPPLY_S(I2S6_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN, 866 SND_SOC_NOPM, 0, 0, 867 mtk_mclk_en_event, 868 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 869 SND_SOC_DAPM_SUPPLY_S(I2S7_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN, 870 SND_SOC_NOPM, 0, 0, 871 mtk_mclk_en_event, 872 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 873 SND_SOC_DAPM_SUPPLY_S(I2S8_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN, 874 SND_SOC_NOPM, 0, 0, 875 mtk_mclk_en_event, 876 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 877 SND_SOC_DAPM_SUPPLY_S(I2S9_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN, 878 SND_SOC_NOPM, 0, 0, 879 mtk_mclk_en_event, 880 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 881 882 /* apll */ 883 SND_SOC_DAPM_SUPPLY_S(APLL1_W_NAME, SUPPLY_SEQ_APLL, 884 SND_SOC_NOPM, 0, 0, 885 mtk_apll_event, 886 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 887 SND_SOC_DAPM_SUPPLY_S(APLL2_W_NAME, SUPPLY_SEQ_APLL, 888 SND_SOC_NOPM, 0, 0, 889 mtk_apll_event, 890 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 891 892 /* allow i2s on without codec on */ 893 SND_SOC_DAPM_OUTPUT("I2S_DUMMY_OUT"), 894 SND_SOC_DAPM_MUX("I2S1_Out_Mux", 895 SND_SOC_NOPM, 0, 0, &i2s1_out_mux_control), 896 SND_SOC_DAPM_MUX("I2S3_Out_Mux", 897 SND_SOC_NOPM, 0, 0, &i2s3_out_mux_control), 898 SND_SOC_DAPM_MUX("I2S5_Out_Mux", 899 SND_SOC_NOPM, 0, 0, &i2s5_out_mux_control), 900 SND_SOC_DAPM_MUX("I2S7_Out_Mux", 901 SND_SOC_NOPM, 0, 0, &i2s7_out_mux_control), 902 SND_SOC_DAPM_MUX("I2S9_Out_Mux", 903 SND_SOC_NOPM, 0, 0, &i2s9_out_mux_control), 904 905 SND_SOC_DAPM_INPUT("I2S_DUMMY_IN"), 906 SND_SOC_DAPM_MUX("I2S0_In_Mux", 907 SND_SOC_NOPM, 0, 0, &i2s0_in_mux_control), 908 SND_SOC_DAPM_MUX("I2S8_In_Mux", 909 SND_SOC_NOPM, 0, 0, &i2s8_in_mux_control), 910 911 /* i2s in lpbk */ 912 SND_SOC_DAPM_MUX("I2S0_Lpbk_Mux", 913 SND_SOC_NOPM, 0, 0, &i2s0_lpbk_mux_control), 914 SND_SOC_DAPM_MUX("I2S2_Lpbk_Mux", 915 SND_SOC_NOPM, 0, 0, &i2s2_lpbk_mux_control), 916 }; 917 918 static int mtk_afe_i2s_share_connect(struct snd_soc_dapm_widget *source, 919 struct snd_soc_dapm_widget *sink) 920 { 921 struct snd_soc_dapm_widget *w = sink; 922 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm); 923 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt); 924 struct mtk_afe_i2s_priv *i2s_priv; 925 926 i2s_priv = get_i2s_priv_by_name(afe, sink->name); 927 if (!i2s_priv) { 928 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__); 929 return 0; 930 } 931 932 if (i2s_priv->share_i2s_id < 0) 933 return 0; 934 935 return i2s_priv->share_i2s_id == get_i2s_id_by_name(afe, source->name); 936 } 937 938 static int mtk_afe_i2s_hd_connect(struct snd_soc_dapm_widget *source, 939 struct snd_soc_dapm_widget *sink) 940 { 941 struct snd_soc_dapm_widget *w = sink; 942 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm); 943 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt); 944 struct mtk_afe_i2s_priv *i2s_priv; 945 946 i2s_priv = get_i2s_priv_by_name(afe, sink->name); 947 if (!i2s_priv) { 948 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__); 949 return 0; 950 } 951 952 if (get_i2s_id_by_name(afe, sink->name) == 953 get_i2s_id_by_name(afe, source->name)) 954 return i2s_priv->low_jitter_en; 955 956 /* check if share i2s need hd en */ 957 if (i2s_priv->share_i2s_id < 0) 958 return 0; 959 960 if (i2s_priv->share_i2s_id == get_i2s_id_by_name(afe, source->name)) 961 return i2s_priv->low_jitter_en; 962 963 return 0; 964 } 965 966 static int mtk_afe_i2s_apll_connect(struct snd_soc_dapm_widget *source, 967 struct snd_soc_dapm_widget *sink) 968 { 969 struct snd_soc_dapm_widget *w = sink; 970 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm); 971 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt); 972 struct mtk_afe_i2s_priv *i2s_priv; 973 int cur_apll; 974 int i2s_need_apll; 975 976 i2s_priv = get_i2s_priv_by_name(afe, w->name); 977 if (!i2s_priv) { 978 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__); 979 return 0; 980 } 981 982 /* which apll */ 983 cur_apll = mt8192_get_apll_by_name(afe, source->name); 984 985 /* choose APLL from i2s rate */ 986 i2s_need_apll = mt8192_get_apll_by_rate(afe, i2s_priv->rate); 987 988 if (i2s_need_apll == cur_apll) 989 return 1; 990 991 return 0; 992 } 993 994 static int mtk_afe_i2s_mclk_connect(struct snd_soc_dapm_widget *source, 995 struct snd_soc_dapm_widget *sink) 996 { 997 struct snd_soc_dapm_widget *w = sink; 998 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm); 999 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt); 1000 struct mtk_afe_i2s_priv *i2s_priv; 1001 1002 i2s_priv = get_i2s_priv_by_name(afe, sink->name); 1003 if (!i2s_priv) { 1004 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__); 1005 return 0; 1006 } 1007 1008 if (get_i2s_id_by_name(afe, sink->name) == 1009 get_i2s_id_by_name(afe, source->name)) 1010 return (i2s_priv->mclk_rate > 0) ? 1 : 0; 1011 1012 /* check if share i2s need mclk */ 1013 if (i2s_priv->share_i2s_id < 0) 1014 return 0; 1015 1016 if (i2s_priv->share_i2s_id == get_i2s_id_by_name(afe, source->name)) 1017 return (i2s_priv->mclk_rate > 0) ? 1 : 0; 1018 1019 return 0; 1020 } 1021 1022 static int mtk_afe_mclk_apll_connect(struct snd_soc_dapm_widget *source, 1023 struct snd_soc_dapm_widget *sink) 1024 { 1025 struct snd_soc_dapm_widget *w = sink; 1026 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm); 1027 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt); 1028 struct mtk_afe_i2s_priv *i2s_priv; 1029 int cur_apll; 1030 1031 i2s_priv = get_i2s_priv_by_name(afe, w->name); 1032 if (!i2s_priv) { 1033 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__); 1034 return 0; 1035 } 1036 1037 /* which apll */ 1038 cur_apll = mt8192_get_apll_by_name(afe, source->name); 1039 1040 if (i2s_priv->mclk_apll == cur_apll) 1041 return 1; 1042 1043 return 0; 1044 } 1045 1046 static const struct snd_soc_dapm_route mtk_dai_i2s_routes[] = { 1047 {"Connsys I2S", NULL, "CONNSYS"}, 1048 1049 /* i2s0 */ 1050 {"I2S0", NULL, "I2S0_EN"}, 1051 {"I2S0", NULL, "I2S1_EN", mtk_afe_i2s_share_connect}, 1052 {"I2S0", NULL, "I2S2_EN", mtk_afe_i2s_share_connect}, 1053 {"I2S0", NULL, "I2S3_EN", mtk_afe_i2s_share_connect}, 1054 {"I2S0", NULL, "I2S5_EN", mtk_afe_i2s_share_connect}, 1055 {"I2S0", NULL, "I2S6_EN", mtk_afe_i2s_share_connect}, 1056 {"I2S0", NULL, "I2S7_EN", mtk_afe_i2s_share_connect}, 1057 {"I2S0", NULL, "I2S8_EN", mtk_afe_i2s_share_connect}, 1058 {"I2S0", NULL, "I2S9_EN", mtk_afe_i2s_share_connect}, 1059 1060 {"I2S0", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1061 {"I2S0", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1062 {"I2S0", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1063 {"I2S0", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1064 {"I2S0", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1065 {"I2S0", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1066 {"I2S0", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1067 {"I2S0", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1068 {"I2S0", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1069 {I2S0_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect}, 1070 {I2S0_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect}, 1071 1072 {"I2S0", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1073 {"I2S0", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1074 {"I2S0", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1075 {"I2S0", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1076 {"I2S0", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1077 {"I2S0", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1078 {"I2S0", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1079 {"I2S0", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1080 {"I2S0", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1081 {I2S0_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect}, 1082 {I2S0_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect}, 1083 1084 /* i2s1 */ 1085 {"I2S1_CH1", "DL1_CH1", "DL1"}, 1086 {"I2S1_CH2", "DL1_CH2", "DL1"}, 1087 {"I2S1_TINYCONN_CH1_MUX", "DL1_CH1", "DL1"}, 1088 {"I2S1_TINYCONN_CH2_MUX", "DL1_CH2", "DL1"}, 1089 1090 {"I2S1_CH1", "DL2_CH1", "DL2"}, 1091 {"I2S1_CH2", "DL2_CH2", "DL2"}, 1092 {"I2S1_TINYCONN_CH1_MUX", "DL2_CH1", "DL2"}, 1093 {"I2S1_TINYCONN_CH2_MUX", "DL2_CH2", "DL2"}, 1094 1095 {"I2S1_CH1", "DL3_CH1", "DL3"}, 1096 {"I2S1_CH2", "DL3_CH2", "DL3"}, 1097 {"I2S1_TINYCONN_CH1_MUX", "DL3_CH1", "DL3"}, 1098 {"I2S1_TINYCONN_CH2_MUX", "DL3_CH2", "DL3"}, 1099 1100 {"I2S1_CH1", "DL12_CH1", "DL12"}, 1101 {"I2S1_CH2", "DL12_CH2", "DL12"}, 1102 {"I2S1_TINYCONN_CH1_MUX", "DL12_CH1", "DL12"}, 1103 {"I2S1_TINYCONN_CH2_MUX", "DL12_CH2", "DL12"}, 1104 1105 {"I2S1_CH1", "DL4_CH1", "DL4"}, 1106 {"I2S1_CH2", "DL4_CH2", "DL4"}, 1107 1108 {"I2S1_CH1", "DL5_CH1", "DL5"}, 1109 {"I2S1_CH2", "DL5_CH2", "DL5"}, 1110 1111 {"I2S1_CH1", "DL6_CH1", "DL6"}, 1112 {"I2S1_CH2", "DL6_CH2", "DL6"}, 1113 1114 {"I2S1_CH1", "DL8_CH1", "DL8"}, 1115 {"I2S1_CH2", "DL8_CH2", "DL8"}, 1116 1117 {"I2S1", NULL, "I2S1_CH1"}, 1118 {"I2S1", NULL, "I2S1_CH2"}, 1119 {"I2S1", NULL, "I2S3_TINYCONN_CH1_MUX"}, 1120 {"I2S1", NULL, "I2S3_TINYCONN_CH2_MUX"}, 1121 1122 {"I2S1", NULL, "I2S0_EN", mtk_afe_i2s_share_connect}, 1123 {"I2S1", NULL, "I2S1_EN"}, 1124 {"I2S1", NULL, "I2S2_EN", mtk_afe_i2s_share_connect}, 1125 {"I2S1", NULL, "I2S3_EN", mtk_afe_i2s_share_connect}, 1126 {"I2S1", NULL, "I2S5_EN", mtk_afe_i2s_share_connect}, 1127 {"I2S1", NULL, "I2S6_EN", mtk_afe_i2s_share_connect}, 1128 {"I2S1", NULL, "I2S7_EN", mtk_afe_i2s_share_connect}, 1129 {"I2S1", NULL, "I2S8_EN", mtk_afe_i2s_share_connect}, 1130 {"I2S1", NULL, "I2S9_EN", mtk_afe_i2s_share_connect}, 1131 1132 {"I2S1", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1133 {"I2S1", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1134 {"I2S1", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1135 {"I2S1", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1136 {"I2S1", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1137 {"I2S1", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1138 {"I2S1", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1139 {"I2S1", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1140 {"I2S1", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1141 {I2S1_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect}, 1142 {I2S1_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect}, 1143 1144 {"I2S1", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1145 {"I2S1", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1146 {"I2S1", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1147 {"I2S1", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1148 {"I2S1", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1149 {"I2S1", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1150 {"I2S1", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1151 {"I2S1", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1152 {"I2S1", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1153 {I2S1_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect}, 1154 {I2S1_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect}, 1155 1156 /* i2s2 */ 1157 {"I2S2", NULL, "I2S0_EN", mtk_afe_i2s_share_connect}, 1158 {"I2S2", NULL, "I2S1_EN", mtk_afe_i2s_share_connect}, 1159 {"I2S2", NULL, "I2S2_EN"}, 1160 {"I2S2", NULL, "I2S3_EN", mtk_afe_i2s_share_connect}, 1161 {"I2S2", NULL, "I2S5_EN", mtk_afe_i2s_share_connect}, 1162 {"I2S2", NULL, "I2S6_EN", mtk_afe_i2s_share_connect}, 1163 {"I2S2", NULL, "I2S7_EN", mtk_afe_i2s_share_connect}, 1164 {"I2S2", NULL, "I2S8_EN", mtk_afe_i2s_share_connect}, 1165 {"I2S2", NULL, "I2S9_EN", mtk_afe_i2s_share_connect}, 1166 1167 {"I2S2", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1168 {"I2S2", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1169 {"I2S2", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1170 {"I2S2", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1171 {"I2S2", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1172 {"I2S2", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1173 {"I2S2", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1174 {"I2S2", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1175 {"I2S2", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1176 {I2S2_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect}, 1177 {I2S2_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect}, 1178 1179 {"I2S2", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1180 {"I2S2", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1181 {"I2S2", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1182 {"I2S2", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1183 {"I2S2", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1184 {"I2S2", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1185 {"I2S2", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1186 {"I2S2", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1187 {"I2S2", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1188 {I2S2_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect}, 1189 {I2S2_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect}, 1190 1191 /* i2s3 */ 1192 {"I2S3_CH1", "DL1_CH1", "DL1"}, 1193 {"I2S3_CH2", "DL1_CH2", "DL1"}, 1194 {"I2S3_TINYCONN_CH1_MUX", "DL1_CH1", "DL1"}, 1195 {"I2S3_TINYCONN_CH2_MUX", "DL1_CH2", "DL1"}, 1196 1197 {"I2S3_CH1", "DL2_CH1", "DL2"}, 1198 {"I2S3_CH2", "DL2_CH2", "DL2"}, 1199 {"I2S3_TINYCONN_CH1_MUX", "DL2_CH1", "DL2"}, 1200 {"I2S3_TINYCONN_CH2_MUX", "DL2_CH2", "DL2"}, 1201 1202 {"I2S3_CH1", "DL3_CH1", "DL3"}, 1203 {"I2S3_CH2", "DL3_CH2", "DL3"}, 1204 {"I2S3_TINYCONN_CH1_MUX", "DL3_CH1", "DL3"}, 1205 {"I2S3_TINYCONN_CH2_MUX", "DL3_CH2", "DL3"}, 1206 1207 {"I2S3_CH1", "DL12_CH1", "DL12"}, 1208 {"I2S3_CH2", "DL12_CH2", "DL12"}, 1209 {"I2S3_TINYCONN_CH1_MUX", "DL12_CH1", "DL12"}, 1210 {"I2S3_TINYCONN_CH2_MUX", "DL12_CH2", "DL12"}, 1211 1212 {"I2S3_CH1", "DL4_CH1", "DL4"}, 1213 {"I2S3_CH2", "DL4_CH2", "DL4"}, 1214 1215 {"I2S3_CH1", "DL5_CH1", "DL5"}, 1216 {"I2S3_CH2", "DL5_CH2", "DL5"}, 1217 1218 {"I2S3_CH1", "DL6_CH1", "DL6"}, 1219 {"I2S3_CH2", "DL6_CH2", "DL6"}, 1220 1221 {"I2S3_CH1", "DL8_CH1", "DL8"}, 1222 {"I2S3_CH2", "DL8_CH2", "DL8"}, 1223 1224 {"I2S3", NULL, "I2S3_CH1"}, 1225 {"I2S3", NULL, "I2S3_CH2"}, 1226 {"I2S3", NULL, "I2S3_TINYCONN_CH1_MUX"}, 1227 {"I2S3", NULL, "I2S3_TINYCONN_CH2_MUX"}, 1228 1229 {"I2S3", NULL, "I2S0_EN", mtk_afe_i2s_share_connect}, 1230 {"I2S3", NULL, "I2S1_EN", mtk_afe_i2s_share_connect}, 1231 {"I2S3", NULL, "I2S2_EN", mtk_afe_i2s_share_connect}, 1232 {"I2S3", NULL, "I2S3_EN"}, 1233 {"I2S3", NULL, "I2S5_EN", mtk_afe_i2s_share_connect}, 1234 {"I2S3", NULL, "I2S6_EN", mtk_afe_i2s_share_connect}, 1235 {"I2S3", NULL, "I2S7_EN", mtk_afe_i2s_share_connect}, 1236 {"I2S3", NULL, "I2S8_EN", mtk_afe_i2s_share_connect}, 1237 {"I2S3", NULL, "I2S9_EN", mtk_afe_i2s_share_connect}, 1238 1239 {"I2S3", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1240 {"I2S3", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1241 {"I2S3", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1242 {"I2S3", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1243 {"I2S3", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1244 {"I2S3", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1245 {"I2S3", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1246 {"I2S3", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1247 {"I2S3", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1248 {I2S3_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect}, 1249 {I2S3_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect}, 1250 1251 {"I2S3", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1252 {"I2S3", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1253 {"I2S3", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1254 {"I2S3", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1255 {"I2S3", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1256 {"I2S3", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1257 {"I2S3", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1258 {"I2S3", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1259 {"I2S3", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1260 {I2S3_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect}, 1261 {I2S3_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect}, 1262 1263 /* i2s5 */ 1264 {"I2S5_CH1", "DL1_CH1", "DL1"}, 1265 {"I2S5_CH2", "DL1_CH2", "DL1"}, 1266 1267 {"I2S5_CH1", "DL2_CH1", "DL2"}, 1268 {"I2S5_CH2", "DL2_CH2", "DL2"}, 1269 1270 {"I2S5_CH1", "DL3_CH1", "DL3"}, 1271 {"I2S5_CH2", "DL3_CH2", "DL3"}, 1272 1273 {"I2S5_CH1", "DL12_CH1", "DL12"}, 1274 {"I2S5_CH2", "DL12_CH2", "DL12"}, 1275 1276 {"I2S5_CH1", "DL4_CH1", "DL4"}, 1277 {"I2S5_CH2", "DL4_CH2", "DL4"}, 1278 1279 {"I2S5_CH1", "DL5_CH1", "DL5"}, 1280 {"I2S5_CH2", "DL5_CH2", "DL5"}, 1281 1282 {"I2S5_CH1", "DL6_CH1", "DL6"}, 1283 {"I2S5_CH2", "DL6_CH2", "DL6"}, 1284 1285 {"I2S5_CH1", "DL8_CH1", "DL8"}, 1286 {"I2S5_CH2", "DL8_CH2", "DL8"}, 1287 1288 {"I2S5", NULL, "I2S5_CH1"}, 1289 {"I2S5", NULL, "I2S5_CH2"}, 1290 1291 {"I2S5", NULL, "I2S0_EN", mtk_afe_i2s_share_connect}, 1292 {"I2S5", NULL, "I2S1_EN", mtk_afe_i2s_share_connect}, 1293 {"I2S5", NULL, "I2S2_EN", mtk_afe_i2s_share_connect}, 1294 {"I2S5", NULL, "I2S3_EN", mtk_afe_i2s_share_connect}, 1295 {"I2S5", NULL, "I2S5_EN"}, 1296 {"I2S5", NULL, "I2S6_EN", mtk_afe_i2s_share_connect}, 1297 {"I2S5", NULL, "I2S7_EN", mtk_afe_i2s_share_connect}, 1298 {"I2S5", NULL, "I2S8_EN", mtk_afe_i2s_share_connect}, 1299 {"I2S5", NULL, "I2S9_EN", mtk_afe_i2s_share_connect}, 1300 1301 {"I2S5", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1302 {"I2S5", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1303 {"I2S5", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1304 {"I2S5", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1305 {"I2S5", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1306 {"I2S5", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1307 {"I2S5", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1308 {"I2S5", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1309 {"I2S5", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1310 {I2S5_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect}, 1311 {I2S5_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect}, 1312 1313 {"I2S5", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1314 {"I2S5", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1315 {"I2S5", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1316 {"I2S5", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1317 {"I2S5", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1318 {"I2S5", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1319 {"I2S5", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1320 {"I2S5", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1321 {"I2S5", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1322 {I2S5_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect}, 1323 {I2S5_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect}, 1324 1325 /* i2s6 */ 1326 {"I2S6", NULL, "I2S0_EN", mtk_afe_i2s_share_connect}, 1327 {"I2S6", NULL, "I2S1_EN", mtk_afe_i2s_share_connect}, 1328 {"I2S6", NULL, "I2S2_EN", mtk_afe_i2s_share_connect}, 1329 {"I2S6", NULL, "I2S3_EN", mtk_afe_i2s_share_connect}, 1330 {"I2S6", NULL, "I2S5_EN", mtk_afe_i2s_share_connect}, 1331 {"I2S6", NULL, "I2S6_EN"}, 1332 {"I2S6", NULL, "I2S7_EN", mtk_afe_i2s_share_connect}, 1333 {"I2S6", NULL, "I2S8_EN", mtk_afe_i2s_share_connect}, 1334 {"I2S6", NULL, "I2S9_EN", mtk_afe_i2s_share_connect}, 1335 1336 {"I2S6", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1337 {"I2S6", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1338 {"I2S6", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1339 {"I2S6", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1340 {"I2S6", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1341 {"I2S6", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1342 {"I2S6", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1343 {"I2S6", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1344 {"I2S6", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1345 {I2S6_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect}, 1346 {I2S6_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect}, 1347 1348 {"I2S6", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1349 {"I2S6", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1350 {"I2S6", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1351 {"I2S6", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1352 {"I2S6", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1353 {"I2S6", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1354 {"I2S6", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1355 {"I2S6", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1356 {"I2S6", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1357 {I2S6_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect}, 1358 {I2S6_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect}, 1359 1360 /* i2s7 */ 1361 {"I2S7", NULL, "I2S7_CH1"}, 1362 {"I2S7", NULL, "I2S7_CH2"}, 1363 1364 {"I2S7", NULL, "I2S0_EN", mtk_afe_i2s_share_connect}, 1365 {"I2S7", NULL, "I2S1_EN", mtk_afe_i2s_share_connect}, 1366 {"I2S7", NULL, "I2S2_EN", mtk_afe_i2s_share_connect}, 1367 {"I2S7", NULL, "I2S3_EN", mtk_afe_i2s_share_connect}, 1368 {"I2S7", NULL, "I2S5_EN", mtk_afe_i2s_share_connect}, 1369 {"I2S7", NULL, "I2S6_EN", mtk_afe_i2s_share_connect}, 1370 {"I2S7", NULL, "I2S7_EN"}, 1371 {"I2S7", NULL, "I2S8_EN", mtk_afe_i2s_share_connect}, 1372 {"I2S7", NULL, "I2S9_EN", mtk_afe_i2s_share_connect}, 1373 1374 {"I2S7", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1375 {"I2S7", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1376 {"I2S7", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1377 {"I2S7", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1378 {"I2S7", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1379 {"I2S7", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1380 {"I2S7", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1381 {"I2S7", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1382 {"I2S7", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1383 {I2S7_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect}, 1384 {I2S7_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect}, 1385 1386 {"I2S7", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1387 {"I2S7", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1388 {"I2S7", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1389 {"I2S7", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1390 {"I2S7", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1391 {"I2S7", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1392 {"I2S7", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1393 {"I2S7", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1394 {"I2S7", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1395 {I2S7_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect}, 1396 {I2S7_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect}, 1397 1398 /* i2s8 */ 1399 {"I2S8", NULL, "I2S0_EN", mtk_afe_i2s_share_connect}, 1400 {"I2S8", NULL, "I2S1_EN", mtk_afe_i2s_share_connect}, 1401 {"I2S8", NULL, "I2S2_EN", mtk_afe_i2s_share_connect}, 1402 {"I2S8", NULL, "I2S3_EN", mtk_afe_i2s_share_connect}, 1403 {"I2S8", NULL, "I2S5_EN", mtk_afe_i2s_share_connect}, 1404 {"I2S8", NULL, "I2S6_EN", mtk_afe_i2s_share_connect}, 1405 {"I2S8", NULL, "I2S7_EN", mtk_afe_i2s_share_connect}, 1406 {"I2S8", NULL, "I2S8_EN"}, 1407 {"I2S8", NULL, "I2S9_EN", mtk_afe_i2s_share_connect}, 1408 1409 {"I2S8", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1410 {"I2S8", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1411 {"I2S8", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1412 {"I2S8", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1413 {"I2S8", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1414 {"I2S8", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1415 {"I2S8", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1416 {"I2S8", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1417 {"I2S8", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1418 {I2S8_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect}, 1419 {I2S8_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect}, 1420 1421 {"I2S8", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1422 {"I2S8", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1423 {"I2S8", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1424 {"I2S8", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1425 {"I2S8", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1426 {"I2S8", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1427 {"I2S8", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1428 {"I2S8", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1429 {"I2S8", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1430 {I2S8_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect}, 1431 {I2S8_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect}, 1432 1433 /* i2s9 */ 1434 {"I2S9_CH1", "DL1_CH1", "DL1"}, 1435 {"I2S9_CH2", "DL1_CH2", "DL1"}, 1436 1437 {"I2S9_CH1", "DL2_CH1", "DL2"}, 1438 {"I2S9_CH2", "DL2_CH2", "DL2"}, 1439 1440 {"I2S9_CH1", "DL3_CH1", "DL3"}, 1441 {"I2S9_CH2", "DL3_CH2", "DL3"}, 1442 1443 {"I2S9_CH1", "DL12_CH1", "DL12"}, 1444 {"I2S9_CH2", "DL12_CH2", "DL12"}, 1445 1446 {"I2S9_CH1", "DL4_CH1", "DL4"}, 1447 {"I2S9_CH2", "DL4_CH2", "DL4"}, 1448 1449 {"I2S9_CH1", "DL5_CH1", "DL5"}, 1450 {"I2S9_CH2", "DL5_CH2", "DL5"}, 1451 1452 {"I2S9_CH1", "DL6_CH1", "DL6"}, 1453 {"I2S9_CH2", "DL6_CH2", "DL6"}, 1454 1455 {"I2S9_CH1", "DL8_CH1", "DL8"}, 1456 {"I2S9_CH2", "DL8_CH2", "DL8"}, 1457 1458 {"I2S9_CH1", "DL9_CH1", "DL9"}, 1459 {"I2S9_CH2", "DL9_CH2", "DL9"}, 1460 1461 {"I2S9", NULL, "I2S9_CH1"}, 1462 {"I2S9", NULL, "I2S9_CH2"}, 1463 1464 {"I2S9", NULL, "I2S0_EN", mtk_afe_i2s_share_connect}, 1465 {"I2S9", NULL, "I2S1_EN", mtk_afe_i2s_share_connect}, 1466 {"I2S9", NULL, "I2S2_EN", mtk_afe_i2s_share_connect}, 1467 {"I2S9", NULL, "I2S3_EN", mtk_afe_i2s_share_connect}, 1468 {"I2S9", NULL, "I2S5_EN", mtk_afe_i2s_share_connect}, 1469 {"I2S9", NULL, "I2S6_EN", mtk_afe_i2s_share_connect}, 1470 {"I2S9", NULL, "I2S7_EN", mtk_afe_i2s_share_connect}, 1471 {"I2S9", NULL, "I2S8_EN", mtk_afe_i2s_share_connect}, 1472 {"I2S9", NULL, "I2S9_EN"}, 1473 1474 {"I2S9", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1475 {"I2S9", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1476 {"I2S9", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1477 {"I2S9", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1478 {"I2S9", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1479 {"I2S9", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1480 {"I2S9", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1481 {"I2S9", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1482 {"I2S9", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect}, 1483 {I2S9_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect}, 1484 {I2S9_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect}, 1485 1486 {"I2S9", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1487 {"I2S9", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1488 {"I2S9", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1489 {"I2S9", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1490 {"I2S9", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1491 {"I2S9", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1492 {"I2S9", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1493 {"I2S9", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1494 {"I2S9", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect}, 1495 {I2S9_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect}, 1496 {I2S9_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect}, 1497 1498 /* allow i2s on without codec on */ 1499 {"I2S0", NULL, "I2S0_In_Mux"}, 1500 {"I2S0_In_Mux", "Dummy_Widget", "I2S_DUMMY_IN"}, 1501 1502 {"I2S8", NULL, "I2S8_In_Mux"}, 1503 {"I2S8_In_Mux", "Dummy_Widget", "I2S_DUMMY_IN"}, 1504 1505 {"I2S1_Out_Mux", "Dummy_Widget", "I2S1"}, 1506 {"I2S_DUMMY_OUT", NULL, "I2S1_Out_Mux"}, 1507 1508 {"I2S3_Out_Mux", "Dummy_Widget", "I2S3"}, 1509 {"I2S_DUMMY_OUT", NULL, "I2S3_Out_Mux"}, 1510 1511 {"I2S5_Out_Mux", "Dummy_Widget", "I2S5"}, 1512 {"I2S_DUMMY_OUT", NULL, "I2S5_Out_Mux"}, 1513 1514 {"I2S7_Out_Mux", "Dummy_Widget", "I2S7"}, 1515 {"I2S_DUMMY_OUT", NULL, "I2S7_Out_Mux"}, 1516 1517 {"I2S9_Out_Mux", "Dummy_Widget", "I2S9"}, 1518 {"I2S_DUMMY_OUT", NULL, "I2S9_Out_Mux"}, 1519 1520 /* i2s in lpbk */ 1521 {"I2S0_Lpbk_Mux", "Lpbk", "I2S3"}, 1522 {"I2S2_Lpbk_Mux", "Lpbk", "I2S1"}, 1523 {"I2S0", NULL, "I2S0_Lpbk_Mux"}, 1524 {"I2S2", NULL, "I2S2_Lpbk_Mux"}, 1525 }; 1526 1527 /* dai ops */ 1528 static int mtk_dai_connsys_i2s_hw_params(struct snd_pcm_substream *substream, 1529 struct snd_pcm_hw_params *params, 1530 struct snd_soc_dai *dai) 1531 { 1532 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 1533 unsigned int rate = params_rate(params); 1534 unsigned int rate_reg = mt8192_rate_transform(afe->dev, 1535 rate, dai->id); 1536 unsigned int i2s_con = 0; 1537 1538 dev_dbg(afe->dev, "%s(), id %d, stream %d, rate %d\n", 1539 __func__, dai->id, substream->stream, rate); 1540 1541 /* non-inverse, i2s mode, proxy mode, 16bits, from connsys */ 1542 i2s_con |= 0 << INV_PAD_CTRL_SFT; 1543 i2s_con |= I2S_FMT_I2S << I2S_FMT_SFT; 1544 i2s_con |= 1 << I2S_SRC_SFT; 1545 i2s_con |= get_i2s_wlen(SNDRV_PCM_FORMAT_S16_LE) << I2S_WLEN_SFT; 1546 i2s_con |= 0 << I2SIN_PAD_SEL_SFT; 1547 regmap_write(afe->regmap, AFE_CONNSYS_I2S_CON, i2s_con); 1548 1549 /* use asrc */ 1550 regmap_update_bits(afe->regmap, 1551 AFE_CONNSYS_I2S_CON, 1552 I2S_BYPSRC_MASK_SFT, 1553 0x0 << I2S_BYPSRC_SFT); 1554 1555 /* proxy mode, set i2s for asrc */ 1556 regmap_update_bits(afe->regmap, 1557 AFE_CONNSYS_I2S_CON, 1558 I2S_MODE_MASK_SFT, 1559 rate_reg << I2S_MODE_SFT); 1560 1561 switch (rate) { 1562 case 32000: 1563 regmap_write(afe->regmap, AFE_ASRC_2CH_CON3, 0x140000); 1564 break; 1565 case 44100: 1566 regmap_write(afe->regmap, AFE_ASRC_2CH_CON3, 0x001B9000); 1567 break; 1568 default: 1569 regmap_write(afe->regmap, AFE_ASRC_2CH_CON3, 0x001E0000); 1570 break; 1571 } 1572 1573 /* Calibration setting */ 1574 regmap_write(afe->regmap, AFE_ASRC_2CH_CON4, 0x00140000); 1575 regmap_write(afe->regmap, AFE_ASRC_2CH_CON9, 0x00036000); 1576 regmap_write(afe->regmap, AFE_ASRC_2CH_CON10, 0x0002FC00); 1577 regmap_write(afe->regmap, AFE_ASRC_2CH_CON6, 0x00007EF4); 1578 regmap_write(afe->regmap, AFE_ASRC_2CH_CON5, 0x00FF5986); 1579 1580 /* 0:Stereo 1:Mono */ 1581 regmap_update_bits(afe->regmap, 1582 AFE_ASRC_2CH_CON2, 1583 CHSET_IS_MONO_MASK_SFT, 1584 0x0 << CHSET_IS_MONO_SFT); 1585 1586 return 0; 1587 } 1588 1589 static int mtk_dai_connsys_i2s_trigger(struct snd_pcm_substream *substream, 1590 int cmd, struct snd_soc_dai *dai) 1591 { 1592 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 1593 struct mt8192_afe_private *afe_priv = afe->platform_priv; 1594 1595 dev_dbg(afe->dev, "%s(), cmd %d, stream %d\n", 1596 __func__, cmd, substream->stream); 1597 1598 switch (cmd) { 1599 case SNDRV_PCM_TRIGGER_START: 1600 case SNDRV_PCM_TRIGGER_RESUME: 1601 /* i2s enable */ 1602 regmap_update_bits(afe->regmap, 1603 AFE_CONNSYS_I2S_CON, 1604 I2S_EN_MASK_SFT, 1605 0x1 << I2S_EN_SFT); 1606 1607 /* calibrator enable */ 1608 regmap_update_bits(afe->regmap, 1609 AFE_ASRC_2CH_CON5, 1610 CALI_EN_MASK_SFT, 1611 0x1 << CALI_EN_SFT); 1612 1613 /* asrc enable */ 1614 regmap_update_bits(afe->regmap, 1615 AFE_ASRC_2CH_CON0, 1616 CON0_CHSET_STR_CLR_MASK_SFT, 1617 0x1 << CON0_CHSET_STR_CLR_SFT); 1618 regmap_update_bits(afe->regmap, 1619 AFE_ASRC_2CH_CON0, 1620 CON0_ASM_ON_MASK_SFT, 1621 0x1 << CON0_ASM_ON_SFT); 1622 1623 afe_priv->dai_on[dai->id] = true; 1624 break; 1625 case SNDRV_PCM_TRIGGER_STOP: 1626 case SNDRV_PCM_TRIGGER_SUSPEND: 1627 regmap_update_bits(afe->regmap, 1628 AFE_ASRC_2CH_CON0, 1629 CON0_ASM_ON_MASK_SFT, 1630 0 << CON0_ASM_ON_SFT); 1631 regmap_update_bits(afe->regmap, 1632 AFE_ASRC_2CH_CON5, 1633 CALI_EN_MASK_SFT, 1634 0 << CALI_EN_SFT); 1635 1636 /* i2s disable */ 1637 regmap_update_bits(afe->regmap, 1638 AFE_CONNSYS_I2S_CON, 1639 I2S_EN_MASK_SFT, 1640 0x0 << I2S_EN_SFT); 1641 1642 /* bypass asrc */ 1643 regmap_update_bits(afe->regmap, 1644 AFE_CONNSYS_I2S_CON, 1645 I2S_BYPSRC_MASK_SFT, 1646 0x1 << I2S_BYPSRC_SFT); 1647 1648 afe_priv->dai_on[dai->id] = false; 1649 break; 1650 default: 1651 return -EINVAL; 1652 } 1653 return 0; 1654 } 1655 1656 static const struct snd_soc_dai_ops mtk_dai_connsys_i2s_ops = { 1657 .hw_params = mtk_dai_connsys_i2s_hw_params, 1658 .trigger = mtk_dai_connsys_i2s_trigger, 1659 }; 1660 1661 /* i2s */ 1662 static int mtk_dai_i2s_config(struct mtk_base_afe *afe, 1663 struct snd_pcm_hw_params *params, 1664 int i2s_id) 1665 { 1666 struct mt8192_afe_private *afe_priv = afe->platform_priv; 1667 struct mtk_afe_i2s_priv *i2s_priv = afe_priv->dai_priv[i2s_id]; 1668 1669 unsigned int rate = params_rate(params); 1670 unsigned int rate_reg = mt8192_rate_transform(afe->dev, 1671 rate, i2s_id); 1672 snd_pcm_format_t format = params_format(params); 1673 unsigned int i2s_con = 0; 1674 int ret = 0; 1675 1676 dev_dbg(afe->dev, "%s(), id %d, rate %d, format %d\n", 1677 __func__, i2s_id, rate, format); 1678 1679 if (i2s_priv) 1680 i2s_priv->rate = rate; 1681 else 1682 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__); 1683 1684 switch (i2s_id) { 1685 case MT8192_DAI_I2S_0: 1686 i2s_con = I2S_IN_PAD_IO_MUX << I2SIN_PAD_SEL_SFT; 1687 i2s_con |= rate_reg << I2S_OUT_MODE_SFT; 1688 i2s_con |= I2S_FMT_I2S << I2S_FMT_SFT; 1689 i2s_con |= get_i2s_wlen(format) << I2S_WLEN_SFT; 1690 regmap_update_bits(afe->regmap, AFE_I2S_CON, 1691 0xffffeffe, i2s_con); 1692 break; 1693 case MT8192_DAI_I2S_1: 1694 i2s_con = I2S1_SEL_O28_O29 << I2S2_SEL_O03_O04_SFT; 1695 i2s_con |= rate_reg << I2S2_OUT_MODE_SFT; 1696 i2s_con |= I2S_FMT_I2S << I2S2_FMT_SFT; 1697 i2s_con |= get_i2s_wlen(format) << I2S2_WLEN_SFT; 1698 regmap_update_bits(afe->regmap, AFE_I2S_CON1, 1699 0xffffeffe, i2s_con); 1700 break; 1701 case MT8192_DAI_I2S_2: 1702 i2s_con = 8 << I2S3_UPDATE_WORD_SFT; 1703 i2s_con |= rate_reg << I2S3_OUT_MODE_SFT; 1704 i2s_con |= I2S_FMT_I2S << I2S3_FMT_SFT; 1705 i2s_con |= get_i2s_wlen(format) << I2S3_WLEN_SFT; 1706 regmap_update_bits(afe->regmap, AFE_I2S_CON2, 1707 0xffffeffe, i2s_con); 1708 break; 1709 case MT8192_DAI_I2S_3: 1710 i2s_con = rate_reg << I2S4_OUT_MODE_SFT; 1711 i2s_con |= I2S_FMT_I2S << I2S4_FMT_SFT; 1712 i2s_con |= get_i2s_wlen(format) << I2S4_WLEN_SFT; 1713 regmap_update_bits(afe->regmap, AFE_I2S_CON3, 1714 0xffffeffe, i2s_con); 1715 break; 1716 case MT8192_DAI_I2S_5: 1717 i2s_con = rate_reg << I2S5_OUT_MODE_SFT; 1718 i2s_con |= I2S_FMT_I2S << I2S5_FMT_SFT; 1719 i2s_con |= get_i2s_wlen(format) << I2S5_WLEN_SFT; 1720 regmap_update_bits(afe->regmap, AFE_I2S_CON4, 1721 0xffffeffe, i2s_con); 1722 break; 1723 case MT8192_DAI_I2S_6: 1724 i2s_con = rate_reg << I2S6_OUT_MODE_SFT; 1725 i2s_con |= I2S_FMT_I2S << I2S6_FMT_SFT; 1726 i2s_con |= get_i2s_wlen(format) << I2S6_WLEN_SFT; 1727 regmap_update_bits(afe->regmap, AFE_I2S_CON6, 1728 0xffffeffe, i2s_con); 1729 break; 1730 case MT8192_DAI_I2S_7: 1731 i2s_con = rate_reg << I2S7_OUT_MODE_SFT; 1732 i2s_con |= I2S_FMT_I2S << I2S7_FMT_SFT; 1733 i2s_con |= get_i2s_wlen(format) << I2S7_WLEN_SFT; 1734 regmap_update_bits(afe->regmap, AFE_I2S_CON7, 1735 0xffffeffe, i2s_con); 1736 break; 1737 case MT8192_DAI_I2S_8: 1738 i2s_con = rate_reg << I2S8_OUT_MODE_SFT; 1739 i2s_con |= I2S_FMT_I2S << I2S8_FMT_SFT; 1740 i2s_con |= get_i2s_wlen(format) << I2S8_WLEN_SFT; 1741 regmap_update_bits(afe->regmap, AFE_I2S_CON8, 1742 0xffffeffe, i2s_con); 1743 break; 1744 case MT8192_DAI_I2S_9: 1745 i2s_con = rate_reg << I2S9_OUT_MODE_SFT; 1746 i2s_con |= I2S_FMT_I2S << I2S9_FMT_SFT; 1747 i2s_con |= get_i2s_wlen(format) << I2S9_WLEN_SFT; 1748 regmap_update_bits(afe->regmap, AFE_I2S_CON9, 1749 0xffffeffe, i2s_con); 1750 break; 1751 default: 1752 dev_warn(afe->dev, "%s(), id %d not support\n", 1753 __func__, i2s_id); 1754 return -EINVAL; 1755 } 1756 1757 /* set share i2s */ 1758 if (i2s_priv && i2s_priv->share_i2s_id >= 0) 1759 ret = mtk_dai_i2s_config(afe, params, i2s_priv->share_i2s_id); 1760 1761 return ret; 1762 } 1763 1764 static int mtk_dai_i2s_hw_params(struct snd_pcm_substream *substream, 1765 struct snd_pcm_hw_params *params, 1766 struct snd_soc_dai *dai) 1767 { 1768 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); 1769 1770 return mtk_dai_i2s_config(afe, params, dai->id); 1771 } 1772 1773 static int mtk_dai_i2s_set_sysclk(struct snd_soc_dai *dai, 1774 int clk_id, unsigned int freq, int dir) 1775 { 1776 struct mtk_base_afe *afe = dev_get_drvdata(dai->dev); 1777 struct mt8192_afe_private *afe_priv = afe->platform_priv; 1778 struct mtk_afe_i2s_priv *i2s_priv = afe_priv->dai_priv[dai->id]; 1779 int apll; 1780 int apll_rate; 1781 1782 if (!i2s_priv) { 1783 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__); 1784 return -EINVAL; 1785 } 1786 1787 if (dir != SND_SOC_CLOCK_OUT) { 1788 dev_warn(afe->dev, "%s(), dir != SND_SOC_CLOCK_OUT", __func__); 1789 return -EINVAL; 1790 } 1791 1792 dev_dbg(afe->dev, "%s(), freq %d\n", __func__, freq); 1793 1794 apll = mt8192_get_apll_by_rate(afe, freq); 1795 apll_rate = mt8192_get_apll_rate(afe, apll); 1796 1797 if (freq > apll_rate) { 1798 dev_warn(afe->dev, "%s(), freq > apll rate", __func__); 1799 return -EINVAL; 1800 } 1801 1802 if (apll_rate % freq != 0) { 1803 dev_warn(afe->dev, "%s(), APLL can't gen freq Hz", __func__); 1804 return -EINVAL; 1805 } 1806 1807 i2s_priv->mclk_rate = freq; 1808 i2s_priv->mclk_apll = apll; 1809 1810 if (i2s_priv->share_i2s_id > 0) { 1811 struct mtk_afe_i2s_priv *share_i2s_priv; 1812 1813 share_i2s_priv = afe_priv->dai_priv[i2s_priv->share_i2s_id]; 1814 if (!share_i2s_priv) { 1815 dev_warn(afe->dev, "%s(), share_i2s_priv = NULL", 1816 __func__); 1817 return -EINVAL; 1818 } 1819 1820 share_i2s_priv->mclk_rate = i2s_priv->mclk_rate; 1821 share_i2s_priv->mclk_apll = i2s_priv->mclk_apll; 1822 } 1823 1824 return 0; 1825 } 1826 1827 static const struct snd_soc_dai_ops mtk_dai_i2s_ops = { 1828 .hw_params = mtk_dai_i2s_hw_params, 1829 .set_sysclk = mtk_dai_i2s_set_sysclk, 1830 }; 1831 1832 /* dai driver */ 1833 #define MTK_CONNSYS_I2S_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000) 1834 1835 #define MTK_I2S_RATES (SNDRV_PCM_RATE_8000_48000 |\ 1836 SNDRV_PCM_RATE_88200 |\ 1837 SNDRV_PCM_RATE_96000 |\ 1838 SNDRV_PCM_RATE_176400 |\ 1839 SNDRV_PCM_RATE_192000) 1840 1841 #define MTK_I2S_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ 1842 SNDRV_PCM_FMTBIT_S24_LE |\ 1843 SNDRV_PCM_FMTBIT_S32_LE) 1844 1845 static struct snd_soc_dai_driver mtk_dai_i2s_driver[] = { 1846 { 1847 .name = "CONNSYS_I2S", 1848 .id = MT8192_DAI_CONNSYS_I2S, 1849 .capture = { 1850 .stream_name = "Connsys I2S", 1851 .channels_min = 1, 1852 .channels_max = 2, 1853 .rates = MTK_CONNSYS_I2S_RATES, 1854 .formats = MTK_I2S_FORMATS, 1855 }, 1856 .ops = &mtk_dai_connsys_i2s_ops, 1857 }, 1858 { 1859 .name = "I2S0", 1860 .id = MT8192_DAI_I2S_0, 1861 .capture = { 1862 .stream_name = "I2S0", 1863 .channels_min = 1, 1864 .channels_max = 2, 1865 .rates = MTK_I2S_RATES, 1866 .formats = MTK_I2S_FORMATS, 1867 }, 1868 .ops = &mtk_dai_i2s_ops, 1869 }, 1870 { 1871 .name = "I2S1", 1872 .id = MT8192_DAI_I2S_1, 1873 .playback = { 1874 .stream_name = "I2S1", 1875 .channels_min = 1, 1876 .channels_max = 2, 1877 .rates = MTK_I2S_RATES, 1878 .formats = MTK_I2S_FORMATS, 1879 }, 1880 .ops = &mtk_dai_i2s_ops, 1881 }, 1882 { 1883 .name = "I2S2", 1884 .id = MT8192_DAI_I2S_2, 1885 .capture = { 1886 .stream_name = "I2S2", 1887 .channels_min = 1, 1888 .channels_max = 2, 1889 .rates = MTK_I2S_RATES, 1890 .formats = MTK_I2S_FORMATS, 1891 }, 1892 .ops = &mtk_dai_i2s_ops, 1893 }, 1894 { 1895 .name = "I2S3", 1896 .id = MT8192_DAI_I2S_3, 1897 .playback = { 1898 .stream_name = "I2S3", 1899 .channels_min = 1, 1900 .channels_max = 2, 1901 .rates = MTK_I2S_RATES, 1902 .formats = MTK_I2S_FORMATS, 1903 }, 1904 .ops = &mtk_dai_i2s_ops, 1905 }, 1906 { 1907 .name = "I2S5", 1908 .id = MT8192_DAI_I2S_5, 1909 .playback = { 1910 .stream_name = "I2S5", 1911 .channels_min = 1, 1912 .channels_max = 2, 1913 .rates = MTK_I2S_RATES, 1914 .formats = MTK_I2S_FORMATS, 1915 }, 1916 .ops = &mtk_dai_i2s_ops, 1917 }, 1918 { 1919 .name = "I2S6", 1920 .id = MT8192_DAI_I2S_6, 1921 .capture = { 1922 .stream_name = "I2S6", 1923 .channels_min = 1, 1924 .channels_max = 2, 1925 .rates = MTK_I2S_RATES, 1926 .formats = MTK_I2S_FORMATS, 1927 }, 1928 .ops = &mtk_dai_i2s_ops, 1929 }, 1930 { 1931 .name = "I2S7", 1932 .id = MT8192_DAI_I2S_7, 1933 .playback = { 1934 .stream_name = "I2S7", 1935 .channels_min = 1, 1936 .channels_max = 2, 1937 .rates = MTK_I2S_RATES, 1938 .formats = MTK_I2S_FORMATS, 1939 }, 1940 .ops = &mtk_dai_i2s_ops, 1941 }, 1942 { 1943 .name = "I2S8", 1944 .id = MT8192_DAI_I2S_8, 1945 .capture = { 1946 .stream_name = "I2S8", 1947 .channels_min = 1, 1948 .channels_max = 2, 1949 .rates = MTK_I2S_RATES, 1950 .formats = MTK_I2S_FORMATS, 1951 }, 1952 .ops = &mtk_dai_i2s_ops, 1953 }, 1954 { 1955 .name = "I2S9", 1956 .id = MT8192_DAI_I2S_9, 1957 .playback = { 1958 .stream_name = "I2S9", 1959 .channels_min = 1, 1960 .channels_max = 2, 1961 .rates = MTK_I2S_RATES, 1962 .formats = MTK_I2S_FORMATS, 1963 }, 1964 .ops = &mtk_dai_i2s_ops, 1965 } 1966 }; 1967 1968 /* this enum is merely for mtk_afe_i2s_priv declare */ 1969 enum { 1970 DAI_I2S0 = 0, 1971 DAI_I2S1, 1972 DAI_I2S2, 1973 DAI_I2S3, 1974 DAI_I2S5, 1975 DAI_I2S6, 1976 DAI_I2S7, 1977 DAI_I2S8, 1978 DAI_I2S9, 1979 DAI_I2S_NUM, 1980 }; 1981 1982 static const struct mtk_afe_i2s_priv mt8192_i2s_priv[DAI_I2S_NUM] = { 1983 [DAI_I2S0] = { 1984 .id = MT8192_DAI_I2S_0, 1985 .mclk_id = MT8192_I2S0_MCK, 1986 .share_i2s_id = -1, 1987 }, 1988 [DAI_I2S1] = { 1989 .id = MT8192_DAI_I2S_1, 1990 .mclk_id = MT8192_I2S1_MCK, 1991 .share_i2s_id = -1, 1992 }, 1993 [DAI_I2S2] = { 1994 .id = MT8192_DAI_I2S_2, 1995 .mclk_id = MT8192_I2S2_MCK, 1996 .share_i2s_id = -1, 1997 }, 1998 [DAI_I2S3] = { 1999 .id = MT8192_DAI_I2S_3, 2000 .mclk_id = MT8192_I2S3_MCK, 2001 .share_i2s_id = -1, 2002 }, 2003 [DAI_I2S5] = { 2004 .id = MT8192_DAI_I2S_5, 2005 .mclk_id = MT8192_I2S5_MCK, 2006 .share_i2s_id = -1, 2007 }, 2008 [DAI_I2S6] = { 2009 .id = MT8192_DAI_I2S_6, 2010 .mclk_id = MT8192_I2S6_MCK, 2011 .share_i2s_id = -1, 2012 }, 2013 [DAI_I2S7] = { 2014 .id = MT8192_DAI_I2S_7, 2015 .mclk_id = MT8192_I2S7_MCK, 2016 .share_i2s_id = -1, 2017 }, 2018 [DAI_I2S8] = { 2019 .id = MT8192_DAI_I2S_8, 2020 .mclk_id = MT8192_I2S8_MCK, 2021 .share_i2s_id = -1, 2022 }, 2023 [DAI_I2S9] = { 2024 .id = MT8192_DAI_I2S_9, 2025 .mclk_id = MT8192_I2S9_MCK, 2026 .share_i2s_id = -1, 2027 }, 2028 }; 2029 2030 /** 2031 * mt8192_dai_i2s_set_share() - Set up I2S ports to share a single clock. 2032 * @afe: Pointer to &struct mtk_base_afe 2033 * @main_i2s_name: The name of the I2S port that will provide the clock 2034 * @secondary_i2s_name: The name of the I2S port that will use this clock 2035 */ 2036 int mt8192_dai_i2s_set_share(struct mtk_base_afe *afe, const char *main_i2s_name, 2037 const char *secondary_i2s_name) 2038 { 2039 struct mtk_afe_i2s_priv *secondary_i2s_priv; 2040 int main_i2s_id; 2041 2042 secondary_i2s_priv = get_i2s_priv_by_name(afe, secondary_i2s_name); 2043 if (!secondary_i2s_priv) 2044 return -EINVAL; 2045 2046 main_i2s_id = get_i2s_id_by_name(afe, main_i2s_name); 2047 if (main_i2s_id < 0) 2048 return main_i2s_id; 2049 2050 secondary_i2s_priv->share_i2s_id = main_i2s_id; 2051 2052 return 0; 2053 } 2054 EXPORT_SYMBOL_GPL(mt8192_dai_i2s_set_share); 2055 2056 static int mt8192_dai_i2s_set_priv(struct mtk_base_afe *afe) 2057 { 2058 int i; 2059 int ret; 2060 2061 for (i = 0; i < DAI_I2S_NUM; i++) { 2062 ret = mt8192_dai_set_priv(afe, mt8192_i2s_priv[i].id, 2063 sizeof(struct mtk_afe_i2s_priv), 2064 &mt8192_i2s_priv[i]); 2065 if (ret) 2066 return ret; 2067 } 2068 2069 return 0; 2070 } 2071 2072 int mt8192_dai_i2s_register(struct mtk_base_afe *afe) 2073 { 2074 struct mtk_base_afe_dai *dai; 2075 int ret; 2076 2077 dev_dbg(afe->dev, "%s()\n", __func__); 2078 2079 dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL); 2080 if (!dai) 2081 return -ENOMEM; 2082 2083 list_add(&dai->list, &afe->sub_dais); 2084 2085 dai->dai_drivers = mtk_dai_i2s_driver; 2086 dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_i2s_driver); 2087 2088 dai->controls = mtk_dai_i2s_controls; 2089 dai->num_controls = ARRAY_SIZE(mtk_dai_i2s_controls); 2090 dai->dapm_widgets = mtk_dai_i2s_widgets; 2091 dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_i2s_widgets); 2092 dai->dapm_routes = mtk_dai_i2s_routes; 2093 dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_i2s_routes); 2094 2095 /* set all dai i2s private data */ 2096 ret = mt8192_dai_i2s_set_priv(afe); 2097 if (ret) 2098 return ret; 2099 2100 return 0; 2101 } 2102