1 /* SPDX-License-Identifier: GPL-2.0 2 * 3 * MediaTek 8365 audio driver common definitions 4 * 5 * Copyright (c) 2024 MediaTek Inc. 6 * Authors: Jia Zeng <jia.zeng@mediatek.com> 7 * Alexandre Mergnat <amergnat@baylibre.com> 8 */ 9 10 #ifndef _MT8365_AFE_COMMON_H_ 11 #define _MT8365_AFE_COMMON_H_ 12 13 #include <linux/clk.h> 14 #include <linux/list.h> 15 #include <linux/regmap.h> 16 #include <sound/soc.h> 17 #include <sound/asound.h> 18 #include "../common/mtk-base-afe.h" 19 #include "mt8365-reg.h" 20 21 enum { 22 MT8365_AFE_MEMIF_DL1, 23 MT8365_AFE_MEMIF_DL2, 24 MT8365_AFE_MEMIF_TDM_OUT, 25 /* 26 * MT8365_AFE_MEMIF_SPDIF_OUT, 27 */ 28 MT8365_AFE_MEMIF_AWB, 29 MT8365_AFE_MEMIF_VUL, 30 MT8365_AFE_MEMIF_VUL2, 31 MT8365_AFE_MEMIF_VUL3, 32 MT8365_AFE_MEMIF_TDM_IN, 33 /* 34 * MT8365_AFE_MEMIF_SPDIF_IN, 35 */ 36 MT8365_AFE_MEMIF_NUM, 37 MT8365_AFE_BACKEND_BASE = MT8365_AFE_MEMIF_NUM, 38 MT8365_AFE_IO_TDM_OUT = MT8365_AFE_BACKEND_BASE, 39 MT8365_AFE_IO_TDM_IN, 40 MT8365_AFE_IO_I2S, 41 MT8365_AFE_IO_2ND_I2S, 42 MT8365_AFE_IO_PCM1, 43 MT8365_AFE_IO_VIRTUAL_DL_SRC, 44 MT8365_AFE_IO_VIRTUAL_TDM_OUT_SRC, 45 MT8365_AFE_IO_VIRTUAL_FM, 46 MT8365_AFE_IO_DMIC, 47 MT8365_AFE_IO_INT_ADDA, 48 MT8365_AFE_IO_GASRC1, 49 MT8365_AFE_IO_GASRC2, 50 MT8365_AFE_IO_TDM_ASRC, 51 MT8365_AFE_IO_HW_GAIN1, 52 MT8365_AFE_IO_HW_GAIN2, 53 MT8365_AFE_BACKEND_END, 54 MT8365_AFE_BACKEND_NUM = (MT8365_AFE_BACKEND_END - 55 MT8365_AFE_BACKEND_BASE), 56 }; 57 58 enum { 59 MT8365_AFE_IRQ1, 60 MT8365_AFE_IRQ2, 61 MT8365_AFE_IRQ3, 62 MT8365_AFE_IRQ4, 63 MT8365_AFE_IRQ5, 64 MT8365_AFE_IRQ6, 65 MT8365_AFE_IRQ7, 66 MT8365_AFE_IRQ8, 67 MT8365_AFE_IRQ9, 68 MT8365_AFE_IRQ10, 69 MT8365_AFE_IRQ_NUM, 70 }; 71 72 enum { 73 MT8365_TOP_CG_AFE, 74 MT8365_TOP_CG_I2S_IN, 75 MT8365_TOP_CG_22M, 76 MT8365_TOP_CG_24M, 77 MT8365_TOP_CG_INTDIR_CK, 78 MT8365_TOP_CG_APLL2_TUNER, 79 MT8365_TOP_CG_APLL_TUNER, 80 MT8365_TOP_CG_SPDIF, 81 MT8365_TOP_CG_TDM_OUT, 82 MT8365_TOP_CG_TDM_IN, 83 MT8365_TOP_CG_ADC, 84 MT8365_TOP_CG_DAC, 85 MT8365_TOP_CG_DAC_PREDIS, 86 MT8365_TOP_CG_TML, 87 MT8365_TOP_CG_I2S1_BCLK, 88 MT8365_TOP_CG_I2S2_BCLK, 89 MT8365_TOP_CG_I2S3_BCLK, 90 MT8365_TOP_CG_I2S4_BCLK, 91 MT8365_TOP_CG_DMIC0_ADC, 92 MT8365_TOP_CG_DMIC1_ADC, 93 MT8365_TOP_CG_DMIC2_ADC, 94 MT8365_TOP_CG_DMIC3_ADC, 95 MT8365_TOP_CG_CONNSYS_I2S_ASRC, 96 MT8365_TOP_CG_GENERAL1_ASRC, 97 MT8365_TOP_CG_GENERAL2_ASRC, 98 MT8365_TOP_CG_TDM_ASRC, 99 MT8365_TOP_CG_NUM 100 }; 101 102 enum { 103 MT8365_CLK_TOP_AUD_SEL, 104 MT8365_CLK_AUD_I2S0_M, 105 MT8365_CLK_AUD_I2S1_M, 106 MT8365_CLK_AUD_I2S2_M, 107 MT8365_CLK_AUD_I2S3_M, 108 MT8365_CLK_ENGEN1, 109 MT8365_CLK_ENGEN2, 110 MT8365_CLK_AUD1, 111 MT8365_CLK_AUD2, 112 MT8365_CLK_I2S0_M_SEL, 113 MT8365_CLK_I2S1_M_SEL, 114 MT8365_CLK_I2S2_M_SEL, 115 MT8365_CLK_I2S3_M_SEL, 116 MT8365_CLK_CLK26M, 117 MT8365_CLK_NUM 118 }; 119 120 enum { 121 MT8365_AFE_APLL1 = 0, 122 MT8365_AFE_APLL2, 123 MT8365_AFE_APLL_NUM, 124 }; 125 126 enum { 127 MT8365_AFE_1ST_I2S = 0, 128 MT8365_AFE_2ND_I2S, 129 MT8365_AFE_I2S_SETS, 130 }; 131 132 enum { 133 MT8365_AFE_I2S_SEPARATE_CLOCK = 0, 134 MT8365_AFE_I2S_SHARED_CLOCK, 135 }; 136 137 enum { 138 MT8365_AFE_TDM_OUT_I2S = 0, 139 MT8365_AFE_TDM_OUT_TDM, 140 MT8365_AFE_TDM_OUT_I2S_32BITS, 141 }; 142 143 enum mt8365_afe_tdm_ch_start { 144 AFE_TDM_CH_START_O28_O29 = 0, 145 AFE_TDM_CH_START_O30_O31, 146 AFE_TDM_CH_START_O32_O33, 147 AFE_TDM_CH_START_O34_O35, 148 AFE_TDM_CH_ZERO, 149 }; 150 151 enum { 152 MT8365_PCM_FORMAT_I2S = 0, 153 MT8365_PCM_FORMAT_EIAJ, 154 MT8365_PCM_FORMAT_PCMA, 155 MT8365_PCM_FORMAT_PCMB, 156 }; 157 158 enum { 159 MT8365_FS_8K = 0, 160 MT8365_FS_11D025K, 161 MT8365_FS_12K, 162 MT8365_FS_384K, 163 MT8365_FS_16K, 164 MT8365_FS_22D05K, 165 MT8365_FS_24K, 166 MT8365_FS_130K, 167 MT8365_FS_32K, 168 MT8365_FS_44D1K, 169 MT8365_FS_48K, 170 MT8365_FS_88D2K, 171 MT8365_FS_96K, 172 MT8365_FS_176D4K, 173 MT8365_FS_192K, 174 }; 175 176 enum { 177 FS_8000HZ = 0, /* 0000b */ 178 FS_11025HZ = 1, /* 0001b */ 179 FS_12000HZ = 2, /* 0010b */ 180 FS_384000HZ = 3, /* 0011b */ 181 FS_16000HZ = 4, /* 0100b */ 182 FS_22050HZ = 5, /* 0101b */ 183 FS_24000HZ = 6, /* 0110b */ 184 FS_130000HZ = 7, /* 0111b */ 185 FS_32000HZ = 8, /* 1000b */ 186 FS_44100HZ = 9, /* 1001b */ 187 FS_48000HZ = 10, /* 1010b */ 188 FS_88200HZ = 11, /* 1011b */ 189 FS_96000HZ = 12, /* 1100b */ 190 FS_176400HZ = 13, /* 1101b */ 191 FS_192000HZ = 14, /* 1110b */ 192 FS_260000HZ = 15, /* 1111b */ 193 }; 194 195 enum { 196 MT8365_AFE_DEBUGFS_AFE, 197 MT8365_AFE_DEBUGFS_MEMIF, 198 MT8365_AFE_DEBUGFS_IRQ, 199 MT8365_AFE_DEBUGFS_CONN, 200 MT8365_AFE_DEBUGFS_DBG, 201 MT8365_AFE_DEBUGFS_NUM, 202 }; 203 204 enum { 205 MT8365_AFE_IRQ_DIR_MCU = 0, 206 MT8365_AFE_IRQ_DIR_DSP, 207 MT8365_AFE_IRQ_DIR_BOTH, 208 }; 209 210 /* MCLK */ 211 enum { 212 MT8365_I2S0_MCK = 0, 213 MT8365_I2S3_MCK, 214 MT8365_MCK_NUM, 215 }; 216 217 struct mt8365_fe_dai_data { 218 bool use_sram; 219 unsigned int sram_phy_addr; 220 void __iomem *sram_vir_addr; 221 unsigned int sram_size; 222 }; 223 224 struct mt8365_be_dai_data { 225 bool prepared[SNDRV_PCM_STREAM_LAST + 1]; 226 unsigned int fmt_mode; 227 }; 228 229 #define MT8365_CLK_26M 26000000 230 #define MT8365_CLK_24M 24000000 231 #define MT8365_CLK_22M 22000000 232 #define MT8365_CM_UPDATA_CNT_SET 8 233 234 enum mt8365_cm_num { 235 MT8365_CM1 = 0, 236 MT8365_CM2, 237 MT8365_CM_NUM, 238 }; 239 240 enum mt8365_cm2_mux_in { 241 MT8365_FROM_GASRC1 = 1, 242 MT8365_FROM_GASRC2, 243 MT8365_FROM_TDM_ASRC, 244 MT8365_CM_MUX_NUM, 245 }; 246 247 enum cm2_mux_conn_in { 248 GENERAL2_ASRC_OUT_LCH = 0, 249 GENERAL2_ASRC_OUT_RCH = 1, 250 TDM_IN_CH0 = 2, 251 TDM_IN_CH1 = 3, 252 TDM_IN_CH2 = 4, 253 TDM_IN_CH3 = 5, 254 TDM_IN_CH4 = 6, 255 TDM_IN_CH5 = 7, 256 TDM_IN_CH6 = 8, 257 TDM_IN_CH7 = 9, 258 GENERAL1_ASRC_OUT_LCH = 10, 259 GENERAL1_ASRC_OUT_RCH = 11, 260 TDM_OUT_ASRC_CH0 = 12, 261 TDM_OUT_ASRC_CH1 = 13, 262 TDM_OUT_ASRC_CH2 = 14, 263 TDM_OUT_ASRC_CH3 = 15, 264 TDM_OUT_ASRC_CH4 = 16, 265 TDM_OUT_ASRC_CH5 = 17, 266 TDM_OUT_ASRC_CH6 = 18, 267 TDM_OUT_ASRC_CH7 = 19 268 }; 269 270 struct mt8365_cm_ctrl_reg { 271 unsigned int con0; 272 unsigned int con1; 273 unsigned int con2; 274 unsigned int con3; 275 unsigned int con4; 276 }; 277 278 struct mt8365_control_data { 279 bool bypass_cm1; 280 bool bypass_cm2; 281 unsigned int loopback_type; 282 }; 283 284 enum dmic_input_mode { 285 DMIC_MODE_3P25M = 0, 286 DMIC_MODE_1P625M, 287 DMIC_MODE_812P5K, 288 DMIC_MODE_406P25K, 289 }; 290 291 enum iir_mode { 292 IIR_MODE0 = 0, 293 IIR_MODE1, 294 IIR_MODE2, 295 IIR_MODE3, 296 IIR_MODE4, 297 IIR_MODE5, 298 }; 299 300 enum { 301 MT8365_GASRC1 = 0, 302 MT8365_GASRC2, 303 MT8365_GASRC_NUM, 304 MT8365_TDM_ASRC1 = MT8365_GASRC_NUM, 305 MT8365_TDM_ASRC2, 306 MT8365_TDM_ASRC3, 307 MT8365_TDM_ASRC4, 308 MT8365_TDM_ASRC_NUM, 309 }; 310 311 struct mt8365_gasrc_ctrl_reg { 312 unsigned int con0; 313 unsigned int con2; 314 unsigned int con3; 315 unsigned int con4; 316 unsigned int con5; 317 unsigned int con6; 318 unsigned int con9; 319 unsigned int con10; 320 unsigned int con12; 321 unsigned int con13; 322 }; 323 324 struct mt8365_gasrc_data { 325 bool duplex; 326 bool tx_mode; 327 bool cali_on; 328 bool tdm_asrc_out_cm2; 329 bool iir_on; 330 }; 331 332 struct mt8365_afe_private { 333 struct clk *clocks[MT8365_CLK_NUM]; 334 struct regmap *topckgen; 335 struct mt8365_fe_dai_data fe_data[MT8365_AFE_MEMIF_NUM]; 336 struct mt8365_be_dai_data be_data[MT8365_AFE_BACKEND_NUM]; 337 struct mt8365_control_data ctrl_data; 338 struct mt8365_gasrc_data gasrc_data[MT8365_TDM_ASRC_NUM]; 339 int afe_on_ref_cnt; 340 int top_cg_ref_cnt[MT8365_TOP_CG_NUM]; 341 void __iomem *afe_sram_vir_addr; 342 unsigned int afe_sram_phy_addr; 343 unsigned int afe_sram_size; 344 /* locks */ 345 spinlock_t afe_ctrl_lock; 346 struct mutex afe_clk_mutex; /* Protect & sync APLL TUNER registers access*/ 347 #ifdef CONFIG_DEBUG_FS 348 struct dentry *debugfs_dentry[MT8365_AFE_DEBUGFS_NUM]; 349 #endif 350 int apll_tuner_ref_cnt[MT8365_AFE_APLL_NUM]; 351 unsigned int tdm_out_mode; 352 unsigned int cm2_mux_input; 353 354 /* dai */ 355 bool dai_on[MT8365_AFE_BACKEND_END]; 356 void *dai_priv[MT8365_AFE_BACKEND_END]; 357 }; 358 359 static inline u32 rx_frequency_palette(unsigned int fs) 360 { 361 /* * 362 * A = (26M / fs) * 64 363 * B = 8125 / A 364 * return = DEC2HEX(B * 2^23) 365 */ 366 switch (fs) { 367 case FS_8000HZ: return 0x050000; 368 case FS_11025HZ: return 0x06E400; 369 case FS_12000HZ: return 0x078000; 370 case FS_16000HZ: return 0x0A0000; 371 case FS_22050HZ: return 0x0DC800; 372 case FS_24000HZ: return 0x0F0000; 373 case FS_32000HZ: return 0x140000; 374 case FS_44100HZ: return 0x1B9000; 375 case FS_48000HZ: return 0x1E0000; 376 case FS_88200HZ: return 0x372000; 377 case FS_96000HZ: return 0x3C0000; 378 case FS_176400HZ: return 0x6E4000; 379 case FS_192000HZ: return 0x780000; 380 default: return 0x0; 381 } 382 } 383 384 static inline u32 AutoRstThHi(unsigned int fs) 385 { 386 switch (fs) { 387 case FS_8000HZ: return 0x36000; 388 case FS_11025HZ: return 0x27000; 389 case FS_12000HZ: return 0x24000; 390 case FS_16000HZ: return 0x1B000; 391 case FS_22050HZ: return 0x14000; 392 case FS_24000HZ: return 0x12000; 393 case FS_32000HZ: return 0x0D800; 394 case FS_44100HZ: return 0x09D00; 395 case FS_48000HZ: return 0x08E00; 396 case FS_88200HZ: return 0x04E00; 397 case FS_96000HZ: return 0x04800; 398 case FS_176400HZ: return 0x02700; 399 case FS_192000HZ: return 0x02400; 400 default: return 0x0; 401 } 402 } 403 404 static inline u32 AutoRstThLo(unsigned int fs) 405 { 406 switch (fs) { 407 case FS_8000HZ: return 0x30000; 408 case FS_11025HZ: return 0x23000; 409 case FS_12000HZ: return 0x20000; 410 case FS_16000HZ: return 0x18000; 411 case FS_22050HZ: return 0x11000; 412 case FS_24000HZ: return 0x0FE00; 413 case FS_32000HZ: return 0x0BE00; 414 case FS_44100HZ: return 0x08A00; 415 case FS_48000HZ: return 0x07F00; 416 case FS_88200HZ: return 0x04500; 417 case FS_96000HZ: return 0x04000; 418 case FS_176400HZ: return 0x02300; 419 case FS_192000HZ: return 0x02000; 420 default: return 0x0; 421 } 422 } 423 424 bool mt8365_afe_rate_supported(unsigned int rate, unsigned int id); 425 bool mt8365_afe_channel_supported(unsigned int channel, unsigned int id); 426 427 int mt8365_dai_i2s_register(struct mtk_base_afe *afe); 428 int mt8365_dai_set_priv(struct mtk_base_afe *afe, 429 int id, 430 int priv_size, 431 const void *priv_data); 432 433 int mt8365_afe_fs_timing(unsigned int rate); 434 435 void mt8365_afe_set_i2s_out_enable(struct mtk_base_afe *afe, bool enable); 436 int mt8365_afe_set_i2s_out(struct mtk_base_afe *afe, unsigned int rate, int bit_width); 437 438 int mt8365_dai_adda_register(struct mtk_base_afe *afe); 439 int mt8365_dai_enable_adda_on(struct mtk_base_afe *afe); 440 int mt8365_dai_disable_adda_on(struct mtk_base_afe *afe); 441 442 int mt8365_dai_dmic_register(struct mtk_base_afe *afe); 443 444 int mt8365_dai_pcm_register(struct mtk_base_afe *afe); 445 446 int mt8365_dai_tdm_register(struct mtk_base_afe *afe); 447 448 #endif 449
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.