1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * soc-acpi-intel-lnl-match.c - tables and support for LNL ACPI enumeration. 4 * 5 * Copyright (c) 2023, Intel Corporation 6 * 7 */ 8 9 #include <sound/soc-acpi.h> 10 #include <sound/soc-acpi-intel-match.h> 11 #include "soc-acpi-intel-sdca-quirks.h" 12 #include "soc-acpi-intel-sdw-mockup-match.h" 13 14 struct snd_soc_acpi_mach snd_soc_acpi_intel_lnl_machines[] = { 15 {}, 16 }; 17 EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_lnl_machines); 18 19 static const struct snd_soc_acpi_endpoint single_endpoint = { 20 .num = 0, 21 .aggregated = 0, 22 .group_position = 0, 23 .group_id = 0, 24 }; 25 26 static const struct snd_soc_acpi_endpoint spk_l_endpoint = { 27 .num = 0, 28 .aggregated = 1, 29 .group_position = 0, 30 .group_id = 1, 31 }; 32 33 static const struct snd_soc_acpi_endpoint spk_r_endpoint = { 34 .num = 0, 35 .aggregated = 1, 36 .group_position = 1, 37 .group_id = 1, 38 }; 39 40 static const struct snd_soc_acpi_endpoint spk_2_endpoint = { 41 .num = 0, 42 .aggregated = 1, 43 .group_position = 2, 44 .group_id = 1, 45 }; 46 47 static const struct snd_soc_acpi_endpoint spk_3_endpoint = { 48 .num = 0, 49 .aggregated = 1, 50 .group_position = 3, 51 .group_id = 1, 52 }; 53 54 static const struct snd_soc_acpi_endpoint rt712_endpoints[] = { 55 { 56 .num = 0, 57 .aggregated = 0, 58 .group_position = 0, 59 .group_id = 0, 60 }, 61 { 62 .num = 1, 63 .aggregated = 0, 64 .group_position = 0, 65 .group_id = 0, 66 }, 67 }; 68 69 /* 70 * RT722 is a multi-function codec, three endpoints are created for 71 * its headset, amp and dmic functions. 72 */ 73 static const struct snd_soc_acpi_endpoint rt722_endpoints[] = { 74 { 75 .num = 0, 76 .aggregated = 0, 77 .group_position = 0, 78 .group_id = 0, 79 }, 80 { 81 .num = 1, 82 .aggregated = 0, 83 .group_position = 0, 84 .group_id = 0, 85 }, 86 { 87 .num = 2, 88 .aggregated = 0, 89 .group_position = 0, 90 .group_id = 0, 91 }, 92 }; 93 94 static const struct snd_soc_acpi_endpoint jack_dmic_endpoints[] = { 95 /* Jack Endpoint */ 96 { 97 .num = 0, 98 .aggregated = 0, 99 .group_position = 0, 100 .group_id = 0, 101 }, 102 /* DMIC Endpoint */ 103 { 104 .num = 1, 105 .aggregated = 0, 106 .group_position = 0, 107 .group_id = 0, 108 }, 109 }; 110 111 static const struct snd_soc_acpi_endpoint jack_amp_g1_dmic_endpoints_endpoints[] = { 112 /* Jack Endpoint */ 113 { 114 .num = 0, 115 .aggregated = 0, 116 .group_position = 0, 117 .group_id = 0, 118 }, 119 /* Amp Endpoint, work as spk_l_endpoint */ 120 { 121 .num = 1, 122 .aggregated = 1, 123 .group_position = 0, 124 .group_id = 1, 125 }, 126 /* DMIC Endpoint */ 127 { 128 .num = 2, 129 .aggregated = 0, 130 .group_position = 0, 131 .group_id = 0, 132 }, 133 }; 134 135 static const struct snd_soc_acpi_endpoint cs42l43_endpoints[] = { 136 { /* Jack Playback Endpoint */ 137 .num = 0, 138 .aggregated = 0, 139 .group_position = 0, 140 .group_id = 0, 141 }, 142 { /* DMIC Capture Endpoint */ 143 .num = 1, 144 .aggregated = 0, 145 .group_position = 0, 146 .group_id = 0, 147 }, 148 { /* Jack Capture Endpoint */ 149 .num = 2, 150 .aggregated = 0, 151 .group_position = 0, 152 .group_id = 0, 153 }, 154 { /* Speaker Playback Endpoint */ 155 .num = 3, 156 .aggregated = 0, 157 .group_position = 0, 158 .group_id = 0, 159 }, 160 }; 161 162 static const struct snd_soc_acpi_adr_device cs35l56_2_l_adr[] = { 163 { 164 .adr = 0x00023001FA355601ull, 165 .num_endpoints = 1, 166 .endpoints = &spk_l_endpoint, 167 .name_prefix = "AMP1" 168 }, 169 { 170 .adr = 0x00023101FA355601ull, 171 .num_endpoints = 1, 172 .endpoints = &spk_2_endpoint, 173 .name_prefix = "AMP2" 174 } 175 }; 176 177 static const struct snd_soc_acpi_adr_device cs35l56_3_r_adr[] = { 178 { 179 .adr = 0x00033201fa355601ull, 180 .num_endpoints = 1, 181 .endpoints = &spk_r_endpoint, 182 .name_prefix = "AMP3" 183 }, 184 { 185 .adr = 0x00033301fa355601ull, 186 .num_endpoints = 1, 187 .endpoints = &spk_3_endpoint, 188 .name_prefix = "AMP4" 189 } 190 }; 191 192 static const struct snd_soc_acpi_adr_device cs35l56_3_lr_adr[] = { 193 { 194 .adr = 0x00033001fa355601ull, 195 .num_endpoints = 1, 196 .endpoints = &spk_l_endpoint, 197 .name_prefix = "AMP1" 198 }, 199 { 200 .adr = 0x00033101fa355601ull, 201 .num_endpoints = 1, 202 .endpoints = &spk_r_endpoint, 203 .name_prefix = "AMP2" 204 } 205 }; 206 207 static const struct snd_soc_acpi_adr_device cs42l43_0_adr[] = { 208 { 209 .adr = 0x00003001FA424301ull, 210 .num_endpoints = ARRAY_SIZE(cs42l43_endpoints), 211 .endpoints = cs42l43_endpoints, 212 .name_prefix = "cs42l43" 213 } 214 }; 215 216 static const struct snd_soc_acpi_adr_device rt711_sdca_0_adr[] = { 217 { 218 .adr = 0x000030025D071101ull, 219 .num_endpoints = 1, 220 .endpoints = &single_endpoint, 221 .name_prefix = "rt711" 222 } 223 }; 224 225 static const struct snd_soc_acpi_adr_device rt712_2_single_adr[] = { 226 { 227 .adr = 0x000230025D071201ull, 228 .num_endpoints = ARRAY_SIZE(rt712_endpoints), 229 .endpoints = rt712_endpoints, 230 .name_prefix = "rt712" 231 } 232 }; 233 234 static const struct snd_soc_acpi_adr_device rt1712_3_single_adr[] = { 235 { 236 .adr = 0x000330025D171201ull, 237 .num_endpoints = 1, 238 .endpoints = &single_endpoint, 239 .name_prefix = "rt712-dmic" 240 } 241 }; 242 243 static const struct snd_soc_acpi_adr_device rt712_vb_2_group1_adr[] = { 244 { 245 .adr = 0x000230025D071201ull, 246 .num_endpoints = ARRAY_SIZE(jack_amp_g1_dmic_endpoints_endpoints), 247 .endpoints = jack_amp_g1_dmic_endpoints_endpoints, 248 .name_prefix = "rt712" 249 } 250 }; 251 252 static const struct snd_soc_acpi_adr_device rt722_0_single_adr[] = { 253 { 254 .adr = 0x000030025d072201ull, 255 .num_endpoints = ARRAY_SIZE(rt722_endpoints), 256 .endpoints = rt722_endpoints, 257 .name_prefix = "rt722" 258 } 259 }; 260 261 static const struct snd_soc_acpi_adr_device rt1316_2_group1_adr[] = { 262 { 263 .adr = 0x000230025D131601ull, 264 .num_endpoints = 1, 265 .endpoints = &spk_l_endpoint, 266 .name_prefix = "rt1316-1" 267 } 268 }; 269 270 static const struct snd_soc_acpi_adr_device rt1316_3_group1_adr[] = { 271 { 272 .adr = 0x000331025D131601ull, 273 .num_endpoints = 1, 274 .endpoints = &spk_r_endpoint, 275 .name_prefix = "rt1316-2" 276 } 277 }; 278 279 static const struct snd_soc_acpi_adr_device rt1318_1_adr[] = { 280 { 281 .adr = 0x000133025D131801ull, 282 .num_endpoints = 1, 283 .endpoints = &single_endpoint, 284 .name_prefix = "rt1318-1" 285 } 286 }; 287 288 static const struct snd_soc_acpi_adr_device rt1318_1_group1_adr[] = { 289 { 290 .adr = 0x000130025D131801ull, 291 .num_endpoints = 1, 292 .endpoints = &spk_l_endpoint, 293 .name_prefix = "rt1318-1" 294 } 295 }; 296 297 static const struct snd_soc_acpi_adr_device rt1318_2_group1_adr[] = { 298 { 299 .adr = 0x000232025D131801ull, 300 .num_endpoints = 1, 301 .endpoints = &spk_r_endpoint, 302 .name_prefix = "rt1318-2" 303 } 304 }; 305 306 static const struct snd_soc_acpi_adr_device rt1320_1_group1_adr[] = { 307 { 308 .adr = 0x000130025D132001ull, 309 .num_endpoints = 1, 310 .endpoints = &spk_r_endpoint, 311 .name_prefix = "rt1320-1" 312 } 313 }; 314 315 static const struct snd_soc_acpi_adr_device rt1320_1_group2_adr[] = { 316 { 317 .adr = 0x000130025D132001ull, 318 .num_endpoints = 1, 319 .endpoints = &spk_l_endpoint, 320 .name_prefix = "rt1320-1" 321 } 322 }; 323 324 static const struct snd_soc_acpi_adr_device rt1320_3_group2_adr[] = { 325 { 326 .adr = 0x000330025D132001ull, 327 .num_endpoints = 1, 328 .endpoints = &spk_r_endpoint, 329 .name_prefix = "rt1320-2" 330 } 331 }; 332 333 static const struct snd_soc_acpi_adr_device rt713_0_adr[] = { 334 { 335 .adr = 0x000031025D071301ull, 336 .num_endpoints = 1, 337 .endpoints = &single_endpoint, 338 .name_prefix = "rt713" 339 } 340 }; 341 342 static const struct snd_soc_acpi_adr_device rt713_vb_2_adr[] = { 343 { 344 .adr = 0x000230025d071301ull, 345 .num_endpoints = ARRAY_SIZE(jack_dmic_endpoints), 346 .endpoints = jack_dmic_endpoints, 347 .name_prefix = "rt713" 348 } 349 }; 350 351 static const struct snd_soc_acpi_adr_device rt714_0_adr[] = { 352 { 353 .adr = 0x000030025D071401ull, 354 .num_endpoints = 1, 355 .endpoints = &single_endpoint, 356 .name_prefix = "rt714" 357 } 358 }; 359 360 static const struct snd_soc_acpi_adr_device rt714_1_adr[] = { 361 { 362 .adr = 0x000130025D071401ull, 363 .num_endpoints = 1, 364 .endpoints = &single_endpoint, 365 .name_prefix = "rt714" 366 } 367 }; 368 369 static const struct snd_soc_acpi_link_adr lnl_cs42l43_l0[] = { 370 { 371 .mask = BIT(0), 372 .num_adr = ARRAY_SIZE(cs42l43_0_adr), 373 .adr_d = cs42l43_0_adr, 374 }, 375 {} 376 }; 377 378 static const struct snd_soc_acpi_link_adr lnl_cs42l43_l0_cs35l56_l3[] = { 379 { 380 .mask = BIT(0), 381 .num_adr = ARRAY_SIZE(cs42l43_0_adr), 382 .adr_d = cs42l43_0_adr, 383 }, 384 { 385 .mask = BIT(3), 386 .num_adr = ARRAY_SIZE(cs35l56_3_lr_adr), 387 .adr_d = cs35l56_3_lr_adr, 388 }, 389 {} 390 }; 391 392 static const struct snd_soc_acpi_link_adr lnl_cs42l43_l0_cs35l56_l23[] = { 393 { 394 .mask = BIT(0), 395 .num_adr = ARRAY_SIZE(cs42l43_0_adr), 396 .adr_d = cs42l43_0_adr, 397 }, 398 { 399 .mask = BIT(2), 400 .num_adr = ARRAY_SIZE(cs35l56_2_l_adr), 401 .adr_d = cs35l56_2_l_adr, 402 }, 403 { 404 .mask = BIT(3), 405 .num_adr = ARRAY_SIZE(cs35l56_3_r_adr), 406 .adr_d = cs35l56_3_r_adr, 407 }, 408 {} 409 }; 410 411 static const struct snd_soc_acpi_link_adr lnl_rvp[] = { 412 { 413 .mask = BIT(0), 414 .num_adr = ARRAY_SIZE(rt711_sdca_0_adr), 415 .adr_d = rt711_sdca_0_adr, 416 }, 417 {} 418 }; 419 420 static const struct snd_soc_acpi_link_adr lnl_712_only[] = { 421 { 422 .mask = BIT(2), 423 .num_adr = ARRAY_SIZE(rt712_2_single_adr), 424 .adr_d = rt712_2_single_adr, 425 }, 426 { 427 .mask = BIT(3), 428 .num_adr = ARRAY_SIZE(rt1712_3_single_adr), 429 .adr_d = rt1712_3_single_adr, 430 }, 431 {} 432 }; 433 434 static const struct snd_soc_acpi_link_adr lnl_rt722_only[] = { 435 { 436 .mask = BIT(0), 437 .num_adr = ARRAY_SIZE(rt722_0_single_adr), 438 .adr_d = rt722_0_single_adr, 439 }, 440 {} 441 }; 442 443 static const struct snd_soc_acpi_link_adr lnl_3_in_1_sdca[] = { 444 { 445 .mask = BIT(0), 446 .num_adr = ARRAY_SIZE(rt711_sdca_0_adr), 447 .adr_d = rt711_sdca_0_adr, 448 }, 449 { 450 .mask = BIT(2), 451 .num_adr = ARRAY_SIZE(rt1316_2_group1_adr), 452 .adr_d = rt1316_2_group1_adr, 453 }, 454 { 455 .mask = BIT(3), 456 .num_adr = ARRAY_SIZE(rt1316_3_group1_adr), 457 .adr_d = rt1316_3_group1_adr, 458 }, 459 { 460 .mask = BIT(1), 461 .num_adr = ARRAY_SIZE(rt714_1_adr), 462 .adr_d = rt714_1_adr, 463 }, 464 {} 465 }; 466 467 static const struct snd_soc_acpi_link_adr lnl_sdw_rt1318_l12_rt714_l0[] = { 468 { 469 .mask = BIT(1), 470 .num_adr = ARRAY_SIZE(rt1318_1_group1_adr), 471 .adr_d = rt1318_1_group1_adr, 472 }, 473 { 474 .mask = BIT(2), 475 .num_adr = ARRAY_SIZE(rt1318_2_group1_adr), 476 .adr_d = rt1318_2_group1_adr, 477 }, 478 { 479 .mask = BIT(0), 480 .num_adr = ARRAY_SIZE(rt714_0_adr), 481 .adr_d = rt714_0_adr, 482 }, 483 {} 484 }; 485 486 static const struct snd_soc_acpi_link_adr lnl_sdw_rt713_l0_rt1318_l1[] = { 487 { 488 .mask = BIT(0), 489 .num_adr = ARRAY_SIZE(rt713_0_adr), 490 .adr_d = rt713_0_adr, 491 }, 492 { 493 .mask = BIT(1), 494 .num_adr = ARRAY_SIZE(rt1318_1_adr), 495 .adr_d = rt1318_1_adr, 496 }, 497 {} 498 }; 499 500 static const struct snd_soc_acpi_link_adr lnl_sdw_rt713_vb_l2_rt1320_l13[] = { 501 { 502 .mask = BIT(2), 503 .num_adr = ARRAY_SIZE(rt713_vb_2_adr), 504 .adr_d = rt713_vb_2_adr, 505 }, 506 { 507 .mask = BIT(1), 508 .num_adr = ARRAY_SIZE(rt1320_1_group2_adr), 509 .adr_d = rt1320_1_group2_adr, 510 }, 511 { 512 .mask = BIT(3), 513 .num_adr = ARRAY_SIZE(rt1320_3_group2_adr), 514 .adr_d = rt1320_3_group2_adr, 515 }, 516 {} 517 }; 518 519 static const struct snd_soc_acpi_link_adr lnl_sdw_rt712_vb_l2_rt1320_l1[] = { 520 { 521 .mask = BIT(2), 522 .num_adr = ARRAY_SIZE(rt712_vb_2_group1_adr), 523 .adr_d = rt712_vb_2_group1_adr, 524 }, 525 { 526 .mask = BIT(1), 527 .num_adr = ARRAY_SIZE(rt1320_1_group1_adr), 528 .adr_d = rt1320_1_group1_adr, 529 }, 530 {} 531 }; 532 533 /* this table is used when there is no I2S codec present */ 534 /* this table is used when there is no I2S codec present */ 535 struct snd_soc_acpi_mach snd_soc_acpi_intel_lnl_sdw_machines[] = { 536 /* mockup tests need to be first */ 537 { 538 .link_mask = GENMASK(3, 0), 539 .links = sdw_mockup_headset_2amps_mic, 540 .drv_name = "sof_sdw", 541 .sof_tplg_filename = "sof-lnl-rt711-rt1308-rt715.tplg", 542 }, 543 { 544 .link_mask = BIT(0) | BIT(1) | BIT(3), 545 .links = sdw_mockup_headset_1amp_mic, 546 .drv_name = "sof_sdw", 547 .sof_tplg_filename = "sof-lnl-rt711-rt1308-mono-rt715.tplg", 548 }, 549 { 550 .link_mask = GENMASK(2, 0), 551 .links = sdw_mockup_mic_headset_1amp, 552 .drv_name = "sof_sdw", 553 .sof_tplg_filename = "sof-lnl-rt715-rt711-rt1308-mono.tplg", 554 }, 555 { 556 .link_mask = GENMASK(3, 0), 557 .links = lnl_3_in_1_sdca, 558 .drv_name = "sof_sdw", 559 .sof_tplg_filename = "sof-lnl-rt711-l0-rt1316-l23-rt714-l1.tplg", 560 }, 561 { 562 .link_mask = BIT(0) | BIT(2) | BIT(3), 563 .links = lnl_cs42l43_l0_cs35l56_l23, 564 .drv_name = "sof_sdw", 565 .sof_tplg_filename = "sof-lnl-cs42l43-l0-cs35l56-l23.tplg", 566 }, 567 { 568 .link_mask = BIT(0) | BIT(3), 569 .links = lnl_cs42l43_l0_cs35l56_l3, 570 .drv_name = "sof_sdw", 571 .sof_tplg_filename = "sof-lnl-cs42l43-l0-cs35l56-l3.tplg", 572 }, 573 { 574 .link_mask = BIT(0), 575 .links = lnl_cs42l43_l0, 576 .drv_name = "sof_sdw", 577 .sof_tplg_filename = "sof-lnl-cs42l43-l0.tplg", 578 }, 579 { 580 .link_mask = BIT(0), 581 .links = lnl_rvp, 582 .drv_name = "sof_sdw", 583 .sof_tplg_filename = "sof-lnl-rt711.tplg", 584 }, 585 { 586 .link_mask = BIT(2) | BIT(3), 587 .links = lnl_712_only, 588 .drv_name = "sof_sdw", 589 .sof_tplg_filename = "sof-lnl-rt712-l2-rt1712-l3.tplg", 590 }, 591 { 592 .link_mask = BIT(0), 593 .links = lnl_rt722_only, 594 .drv_name = "sof_sdw", 595 .sof_tplg_filename = "sof-lnl-rt722-l0.tplg", 596 }, 597 { 598 .link_mask = GENMASK(2, 0), 599 .links = lnl_sdw_rt1318_l12_rt714_l0, 600 .drv_name = "sof_sdw", 601 .sof_tplg_filename = "sof-lnl-rt1318-l12-rt714-l0.tplg" 602 }, 603 { 604 .link_mask = BIT(0) | BIT(1), 605 .links = lnl_sdw_rt713_l0_rt1318_l1, 606 .drv_name = "sof_sdw", 607 .sof_tplg_filename = "sof-lnl-rt713-l0-rt1318-l1.tplg" 608 }, 609 { 610 .link_mask = BIT(1) | BIT(2), 611 .links = lnl_sdw_rt712_vb_l2_rt1320_l1, 612 .drv_name = "sof_sdw", 613 .machine_check = snd_soc_acpi_intel_sdca_is_device_rt712_vb, 614 .sof_tplg_filename = "sof-lnl-rt712-l2-rt1320-l1.tplg" 615 }, 616 { 617 .link_mask = BIT(1) | BIT(2) | BIT(3), 618 .links = lnl_sdw_rt713_vb_l2_rt1320_l13, 619 .drv_name = "sof_sdw", 620 .machine_check = snd_soc_acpi_intel_sdca_is_device_rt712_vb, 621 .sof_tplg_filename = "sof-lnl-rt713-l2-rt1320-l13.tplg" 622 }, 623 {}, 624 }; 625 EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_lnl_sdw_machines); 626