1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * soc-acpi-intel-tgl-match.c - tables and support for TGL ACPI enumeration. 4 * 5 * Copyright (c) 2019, Intel Corporation. 6 * 7 */ 8 9 #include <sound/soc-acpi.h> 10 #include <sound/soc-acpi-intel-match.h> 11 #include "soc-acpi-intel-sdw-mockup-match.h" 12 13 static const struct snd_soc_acpi_codecs essx_83x6 = { 14 .num_codecs = 3, 15 .codecs = { "ESSX8316", "ESSX8326", "ESSX8336"}, 16 }; 17 18 static const struct snd_soc_acpi_codecs tgl_codecs = { 19 .num_codecs = 1, 20 .codecs = {"MX98357A"} 21 }; 22 23 static const struct snd_soc_acpi_endpoint single_endpoint = { 24 .num = 0, 25 .aggregated = 0, 26 .group_position = 0, 27 .group_id = 0, 28 }; 29 30 static const struct snd_soc_acpi_endpoint spk_l_endpoint = { 31 .num = 0, 32 .aggregated = 1, 33 .group_position = 0, 34 .group_id = 1, 35 }; 36 37 static const struct snd_soc_acpi_endpoint spk_r_endpoint = { 38 .num = 0, 39 .aggregated = 1, 40 .group_position = 1, 41 .group_id = 1, 42 }; 43 44 static const struct snd_soc_acpi_adr_device rt711_0_adr[] = { 45 { 46 .adr = 0x000020025D071100ull, 47 .num_endpoints = 1, 48 .endpoints = &single_endpoint, 49 .name_prefix = "rt711" 50 } 51 }; 52 53 static const struct snd_soc_acpi_adr_device rt711_1_adr[] = { 54 { 55 .adr = 0x000120025D071100ull, 56 .num_endpoints = 1, 57 .endpoints = &single_endpoint, 58 .name_prefix = "rt711" 59 } 60 }; 61 62 static const struct snd_soc_acpi_adr_device rt1308_1_dual_adr[] = { 63 { 64 .adr = 0x000120025D130800ull, 65 .num_endpoints = 1, 66 .endpoints = &spk_l_endpoint, 67 .name_prefix = "rt1308-1" 68 }, 69 { 70 .adr = 0x000122025D130800ull, 71 .num_endpoints = 1, 72 .endpoints = &spk_r_endpoint, 73 .name_prefix = "rt1308-2" 74 } 75 }; 76 77 static const struct snd_soc_acpi_adr_device rt1308_1_single_adr[] = { 78 { 79 .adr = 0x000120025D130800ull, 80 .num_endpoints = 1, 81 .endpoints = &single_endpoint, 82 .name_prefix = "rt1308-1" 83 } 84 }; 85 86 static const struct snd_soc_acpi_adr_device rt1308_2_single_adr[] = { 87 { 88 .adr = 0x000220025D130800ull, 89 .num_endpoints = 1, 90 .endpoints = &single_endpoint, 91 .name_prefix = "rt1308-1" 92 } 93 }; 94 95 static const struct snd_soc_acpi_adr_device rt1308_1_group1_adr[] = { 96 { 97 .adr = 0x000120025D130800ull, 98 .num_endpoints = 1, 99 .endpoints = &spk_l_endpoint, 100 .name_prefix = "rt1308-1" 101 } 102 }; 103 104 static const struct snd_soc_acpi_adr_device rt1308_2_group1_adr[] = { 105 { 106 .adr = 0x000220025D130800ull, 107 .num_endpoints = 1, 108 .endpoints = &spk_r_endpoint, 109 .name_prefix = "rt1308-2" 110 } 111 }; 112 113 static const struct snd_soc_acpi_adr_device rt715_0_adr[] = { 114 { 115 .adr = 0x000021025D071500ull, 116 .num_endpoints = 1, 117 .endpoints = &single_endpoint, 118 .name_prefix = "rt715" 119 } 120 }; 121 122 static const struct snd_soc_acpi_adr_device rt715_3_adr[] = { 123 { 124 .adr = 0x000320025D071500ull, 125 .num_endpoints = 1, 126 .endpoints = &single_endpoint, 127 .name_prefix = "rt715" 128 } 129 }; 130 131 static const struct snd_soc_acpi_adr_device mx8373_1_adr[] = { 132 { 133 .adr = 0x000123019F837300ull, 134 .num_endpoints = 1, 135 .endpoints = &spk_r_endpoint, 136 .name_prefix = "Right" 137 }, 138 { 139 .adr = 0x000127019F837300ull, 140 .num_endpoints = 1, 141 .endpoints = &spk_l_endpoint, 142 .name_prefix = "Left" 143 } 144 }; 145 146 static const struct snd_soc_acpi_adr_device rt5682_0_adr[] = { 147 { 148 .adr = 0x000021025D568200ull, 149 .num_endpoints = 1, 150 .endpoints = &single_endpoint, 151 .name_prefix = "rt5682" 152 } 153 }; 154 155 static const struct snd_soc_acpi_adr_device rt711_sdca_0_adr[] = { 156 { 157 .adr = 0x000030025D071101ull, 158 .num_endpoints = 1, 159 .endpoints = &single_endpoint, 160 .name_prefix = "rt711" 161 } 162 }; 163 164 static const struct snd_soc_acpi_adr_device rt1316_1_single_adr[] = { 165 { 166 .adr = 0x000131025D131601ull, 167 .num_endpoints = 1, 168 .endpoints = &single_endpoint, 169 .name_prefix = "rt1316-1" 170 } 171 }; 172 173 static const struct snd_soc_acpi_adr_device rt1316_1_group1_adr[] = { 174 { 175 .adr = 0x000131025D131601ull, /* unique ID is set for some reason */ 176 .num_endpoints = 1, 177 .endpoints = &spk_l_endpoint, 178 .name_prefix = "rt1316-1" 179 } 180 }; 181 182 static const struct snd_soc_acpi_adr_device rt1316_2_group1_adr[] = { 183 { 184 .adr = 0x000230025D131601ull, 185 .num_endpoints = 1, 186 .endpoints = &spk_r_endpoint, 187 .name_prefix = "rt1316-2" 188 } 189 }; 190 191 static const struct snd_soc_acpi_adr_device rt714_3_adr[] = { 192 { 193 .adr = 0x000330025D071401ull, 194 .num_endpoints = 1, 195 .endpoints = &single_endpoint, 196 .name_prefix = "rt714" 197 } 198 }; 199 200 static const struct snd_soc_acpi_link_adr tgl_rvp[] = { 201 { 202 .mask = BIT(0), 203 .num_adr = ARRAY_SIZE(rt711_0_adr), 204 .adr_d = rt711_0_adr, 205 }, 206 { 207 .mask = BIT(1), 208 .num_adr = ARRAY_SIZE(rt1308_1_dual_adr), 209 .adr_d = rt1308_1_dual_adr, 210 }, 211 {} 212 }; 213 214 static const struct snd_soc_acpi_link_adr tgl_rvp_headset_only[] = { 215 { 216 .mask = BIT(0), 217 .num_adr = ARRAY_SIZE(rt711_0_adr), 218 .adr_d = rt711_0_adr, 219 }, 220 {} 221 }; 222 223 static const struct snd_soc_acpi_link_adr tgl_hp[] = { 224 { 225 .mask = BIT(0), 226 .num_adr = ARRAY_SIZE(rt711_0_adr), 227 .adr_d = rt711_0_adr, 228 }, 229 { 230 .mask = BIT(1), 231 .num_adr = ARRAY_SIZE(rt1308_1_single_adr), 232 .adr_d = rt1308_1_single_adr, 233 }, 234 {} 235 }; 236 237 static const struct snd_soc_acpi_link_adr tgl_chromebook_base[] = { 238 { 239 .mask = BIT(0), 240 .num_adr = ARRAY_SIZE(rt5682_0_adr), 241 .adr_d = rt5682_0_adr, 242 }, 243 { 244 .mask = BIT(1), 245 .num_adr = ARRAY_SIZE(mx8373_1_adr), 246 .adr_d = mx8373_1_adr, 247 }, 248 {} 249 }; 250 251 static const struct snd_soc_acpi_link_adr tgl_3_in_1_default[] = { 252 { 253 .mask = BIT(0), 254 .num_adr = ARRAY_SIZE(rt711_0_adr), 255 .adr_d = rt711_0_adr, 256 }, 257 { 258 .mask = BIT(1), 259 .num_adr = ARRAY_SIZE(rt1308_1_group1_adr), 260 .adr_d = rt1308_1_group1_adr, 261 }, 262 { 263 .mask = BIT(2), 264 .num_adr = ARRAY_SIZE(rt1308_2_group1_adr), 265 .adr_d = rt1308_2_group1_adr, 266 }, 267 { 268 .mask = BIT(3), 269 .num_adr = ARRAY_SIZE(rt715_3_adr), 270 .adr_d = rt715_3_adr, 271 }, 272 {} 273 }; 274 275 static const struct snd_soc_acpi_link_adr tgl_3_in_1_mono_amp[] = { 276 { 277 .mask = BIT(0), 278 .num_adr = ARRAY_SIZE(rt711_0_adr), 279 .adr_d = rt711_0_adr, 280 }, 281 { 282 .mask = BIT(1), 283 .num_adr = ARRAY_SIZE(rt1308_1_single_adr), 284 .adr_d = rt1308_1_single_adr, 285 }, 286 { 287 .mask = BIT(3), 288 .num_adr = ARRAY_SIZE(rt715_3_adr), 289 .adr_d = rt715_3_adr, 290 }, 291 {} 292 }; 293 294 static const struct snd_soc_acpi_link_adr tgl_sdw_rt711_link1_rt1308_link2_rt715_link0[] = { 295 { 296 .mask = BIT(1), 297 .num_adr = ARRAY_SIZE(rt711_1_adr), 298 .adr_d = rt711_1_adr, 299 }, 300 { 301 .mask = BIT(2), 302 .num_adr = ARRAY_SIZE(rt1308_2_single_adr), 303 .adr_d = rt1308_2_single_adr, 304 }, 305 { 306 .mask = BIT(0), 307 .num_adr = ARRAY_SIZE(rt715_0_adr), 308 .adr_d = rt715_0_adr, 309 }, 310 {} 311 }; 312 313 static const struct snd_soc_acpi_link_adr tgl_3_in_1_sdca[] = { 314 { 315 .mask = BIT(0), 316 .num_adr = ARRAY_SIZE(rt711_sdca_0_adr), 317 .adr_d = rt711_sdca_0_adr, 318 }, 319 { 320 .mask = BIT(1), 321 .num_adr = ARRAY_SIZE(rt1316_1_group1_adr), 322 .adr_d = rt1316_1_group1_adr, 323 }, 324 { 325 .mask = BIT(2), 326 .num_adr = ARRAY_SIZE(rt1316_2_group1_adr), 327 .adr_d = rt1316_2_group1_adr, 328 }, 329 { 330 .mask = BIT(3), 331 .num_adr = ARRAY_SIZE(rt714_3_adr), 332 .adr_d = rt714_3_adr, 333 }, 334 {} 335 }; 336 337 static const struct snd_soc_acpi_link_adr tgl_3_in_1_sdca_mono[] = { 338 { 339 .mask = BIT(0), 340 .num_adr = ARRAY_SIZE(rt711_sdca_0_adr), 341 .adr_d = rt711_sdca_0_adr, 342 }, 343 { 344 .mask = BIT(1), 345 .num_adr = ARRAY_SIZE(rt1316_1_single_adr), 346 .adr_d = rt1316_1_single_adr, 347 }, 348 { 349 .mask = BIT(3), 350 .num_adr = ARRAY_SIZE(rt714_3_adr), 351 .adr_d = rt714_3_adr, 352 }, 353 {} 354 }; 355 356 static const struct snd_soc_acpi_codecs tgl_max98373_amp = { 357 .num_codecs = 1, 358 .codecs = {"MX98373"} 359 }; 360 361 static const struct snd_soc_acpi_codecs tgl_rt1011_amp = { 362 .num_codecs = 1, 363 .codecs = {"10EC1011"} 364 }; 365 366 static const struct snd_soc_acpi_codecs tgl_rt5682_rt5682s_hp = { 367 .num_codecs = 2, 368 .codecs = {"10EC5682", "RTL5682"}, 369 }; 370 371 static const struct snd_soc_acpi_codecs tgl_lt6911_hdmi = { 372 .num_codecs = 1, 373 .codecs = {"INTC10B0"} 374 }; 375 376 struct snd_soc_acpi_mach snd_soc_acpi_intel_tgl_machines[] = { 377 { 378 .comp_ids = &tgl_rt5682_rt5682s_hp, 379 .drv_name = "tgl_mx98357_rt5682", 380 .machine_quirk = snd_soc_acpi_codec_list, 381 .quirk_data = &tgl_codecs, 382 .sof_tplg_filename = "sof-tgl-max98357a-rt5682.tplg", 383 }, 384 { 385 .comp_ids = &tgl_rt5682_rt5682s_hp, 386 .drv_name = "tgl_mx98373_rt5682", 387 .machine_quirk = snd_soc_acpi_codec_list, 388 .quirk_data = &tgl_max98373_amp, 389 .sof_tplg_filename = "sof-tgl-max98373-rt5682.tplg", 390 }, 391 { 392 .comp_ids = &tgl_rt5682_rt5682s_hp, 393 .drv_name = "tgl_rt1011_rt5682", 394 .machine_quirk = snd_soc_acpi_codec_list, 395 .quirk_data = &tgl_rt1011_amp, 396 .sof_tplg_filename = "sof-tgl-rt1011-rt5682.tplg", 397 }, 398 { 399 .comp_ids = &essx_83x6, 400 .drv_name = "sof-essx8336", 401 .sof_tplg_filename = "sof-tgl-es8336", /* the tplg suffix is added at run time */ 402 .tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_SSP_NUMBER | 403 SND_SOC_ACPI_TPLG_INTEL_SSP_MSB | 404 SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER, 405 }, 406 { 407 .id = "10EC1308", 408 .drv_name = "tgl_rt1308_hdmi_ssp", 409 .machine_quirk = snd_soc_acpi_codec_list, 410 .quirk_data = &tgl_lt6911_hdmi, 411 .sof_tplg_filename = "sof-tgl-rt1308-ssp2-hdmi-ssp15.tplg" 412 }, 413 {}, 414 }; 415 EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_tgl_machines); 416 417 /* this table is used when there is no I2S codec present */ 418 struct snd_soc_acpi_mach snd_soc_acpi_intel_tgl_sdw_machines[] = { 419 /* mockup tests need to be first */ 420 { 421 .link_mask = GENMASK(3, 0), 422 .links = sdw_mockup_headset_2amps_mic, 423 .drv_name = "sof_sdw", 424 .sof_tplg_filename = "sof-tgl-rt711-rt1308-rt715.tplg", 425 }, 426 { 427 .link_mask = BIT(0) | BIT(1) | BIT(3), 428 .links = sdw_mockup_headset_1amp_mic, 429 .drv_name = "sof_sdw", 430 .sof_tplg_filename = "sof-tgl-rt711-rt1308-mono-rt715.tplg", 431 }, 432 { 433 .link_mask = BIT(0) | BIT(1) | BIT(2), 434 .links = sdw_mockup_mic_headset_1amp, 435 .drv_name = "sof_sdw", 436 .sof_tplg_filename = "sof-tgl-rt715-rt711-rt1308-mono.tplg", 437 }, 438 { 439 .link_mask = 0x7, 440 .links = tgl_sdw_rt711_link1_rt1308_link2_rt715_link0, 441 .drv_name = "sof_sdw", 442 .sof_tplg_filename = "sof-tgl-rt715-rt711-rt1308-mono.tplg", 443 }, 444 { 445 .link_mask = 0xF, /* 4 active links required */ 446 .links = tgl_3_in_1_default, 447 .drv_name = "sof_sdw", 448 .sof_tplg_filename = "sof-tgl-rt711-rt1308-rt715.tplg", 449 }, 450 { 451 /* 452 * link_mask should be 0xB, but all links are enabled by BIOS. 453 * This entry will be selected if there is no rt1308 exposed 454 * on link2 since it will fail to match the above entry. 455 */ 456 .link_mask = 0xF, 457 .links = tgl_3_in_1_mono_amp, 458 .drv_name = "sof_sdw", 459 .sof_tplg_filename = "sof-tgl-rt711-rt1308-mono-rt715.tplg", 460 }, 461 { 462 .link_mask = 0xF, /* 4 active links required */ 463 .links = tgl_3_in_1_sdca, 464 .drv_name = "sof_sdw", 465 .sof_tplg_filename = "sof-tgl-rt711-rt1316-rt714.tplg", 466 }, 467 { 468 /* 469 * link_mask should be 0xB, but all links are enabled by BIOS. 470 * This entry will be selected if there is no rt1316 amplifier exposed 471 * on link2 since it will fail to match the above entry. 472 */ 473 474 .link_mask = 0xF, /* 4 active links required */ 475 .links = tgl_3_in_1_sdca_mono, 476 .drv_name = "sof_sdw", 477 .sof_tplg_filename = "sof-tgl-rt711-l0-rt1316-l1-mono-rt714-l3.tplg", 478 }, 479 480 { 481 .link_mask = 0x3, /* rt711 on link 0 and 1 rt1308 on link 1 */ 482 .links = tgl_hp, 483 .drv_name = "sof_sdw", 484 .sof_tplg_filename = "sof-tgl-rt711-rt1308.tplg", 485 }, 486 { 487 .link_mask = 0x3, /* rt711 on link 0 and 2 rt1308s on link 1 */ 488 .links = tgl_rvp, 489 .drv_name = "sof_sdw", 490 .sof_tplg_filename = "sof-tgl-rt711-rt1308.tplg", 491 }, 492 { 493 .link_mask = 0x3, /* rt5682 on link0 & 2xmax98373 on link 1 */ 494 .links = tgl_chromebook_base, 495 .drv_name = "sof_sdw", 496 .sof_tplg_filename = "sof-tgl-sdw-max98373-rt5682.tplg", 497 }, 498 { 499 .link_mask = 0x1, /* rt711 on link 0 */ 500 .links = tgl_rvp_headset_only, 501 .drv_name = "sof_sdw", 502 .sof_tplg_filename = "sof-tgl-rt711.tplg", 503 }, 504 {}, 505 }; 506 EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_tgl_sdw_machines); 507