569 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * soc-apci-intel-rpl-match.c - tables and support for RPL ACPI enumeration.4 *5 * Copyright (c) 2022 Intel Corporation.6 */7 8#include <sound/soc-acpi.h>9#include <sound/soc-acpi-intel-match.h>10#include <sound/soc-acpi-intel-ssp-common.h>11 12static const struct snd_soc_acpi_endpoint single_endpoint = {13 .num = 0,14 .aggregated = 0,15 .group_position = 0,16 .group_id = 0,17};18 19static const struct snd_soc_acpi_endpoint spk_l_endpoint = {20 .num = 0,21 .aggregated = 1,22 .group_position = 0,23 .group_id = 1,24};25 26static const struct snd_soc_acpi_endpoint spk_r_endpoint = {27 .num = 0,28 .aggregated = 1,29 .group_position = 1,30 .group_id = 1,31};32 33static const struct snd_soc_acpi_endpoint cs42l43_endpoints[] = {34 { /* Jack Playback Endpoint */35 .num = 0,36 .aggregated = 0,37 .group_position = 0,38 .group_id = 0,39 },40 { /* DMIC Capture Endpoint */41 .num = 1,42 .aggregated = 0,43 .group_position = 0,44 .group_id = 0,45 },46 { /* Jack Capture Endpoint */47 .num = 2,48 .aggregated = 0,49 .group_position = 0,50 .group_id = 0,51 },52 { /* Speaker Playback Endpoint */53 .num = 3,54 .aggregated = 0,55 .group_position = 0,56 .group_id = 0,57 },58};59 60static const struct snd_soc_acpi_adr_device cs42l43_0_adr[] = {61 {62 .adr = 0x00003001FA424301ull,63 .num_endpoints = ARRAY_SIZE(cs42l43_endpoints),64 .endpoints = cs42l43_endpoints,65 .name_prefix = "cs42l43"66 }67};68 69static const struct snd_soc_acpi_adr_device rt711_0_adr[] = {70 {71 .adr = 0x000020025D071100ull,72 .num_endpoints = 1,73 .endpoints = &single_endpoint,74 .name_prefix = "rt711"75 }76};77 78static const struct snd_soc_acpi_link_adr rpl_rvp[] = {79 {80 .mask = BIT(0),81 .num_adr = ARRAY_SIZE(rt711_0_adr),82 .adr_d = rt711_0_adr,83 },84 {}85};86 87static const struct snd_soc_acpi_adr_device rt711_sdca_0_adr[] = {88 {89 .adr = 0x000030025D071101ull,90 .num_endpoints = 1,91 .endpoints = &single_endpoint,92 .name_prefix = "rt711"93 }94};95 96static const struct snd_soc_acpi_adr_device rt711_sdca_2_adr[] = {97 {98 .adr = 0x000230025D071101ull,99 .num_endpoints = 1,100 .endpoints = &single_endpoint,101 .name_prefix = "rt711"102 }103};104 105static const struct snd_soc_acpi_adr_device rt1316_1_group1_adr[] = {106 {107 .adr = 0x000131025D131601ull, /* unique ID is set for some reason */108 .num_endpoints = 1,109 .endpoints = &spk_l_endpoint,110 .name_prefix = "rt1316-1"111 }112};113 114static const struct snd_soc_acpi_adr_device rt1316_2_group1_adr[] = {115 {116 .adr = 0x000230025D131601ull,117 .num_endpoints = 1,118 .endpoints = &spk_r_endpoint,119 .name_prefix = "rt1316-2"120 }121};122 123static const struct snd_soc_acpi_adr_device rt1316_3_group1_adr[] = {124 {125 .adr = 0x000330025D131601ull,126 .num_endpoints = 1,127 .endpoints = &spk_r_endpoint,128 .name_prefix = "rt1316-2"129 }130};131 132static const struct snd_soc_acpi_adr_device rt1316_0_group2_adr[] = {133 {134 .adr = 0x000030025D131601ull,135 .num_endpoints = 1,136 .endpoints = &spk_l_endpoint,137 .name_prefix = "rt1316-1"138 }139};140 141static const struct snd_soc_acpi_adr_device rt1316_1_group2_adr[] = {142 {143 .adr = 0x000131025D131601ull,144 .num_endpoints = 1,145 .endpoints = &spk_r_endpoint,146 .name_prefix = "rt1316-2"147 }148};149 150static const struct snd_soc_acpi_adr_device rt1318_1_group1_adr[] = {151 {152 .adr = 0x000132025D131801ull,153 .num_endpoints = 1,154 .endpoints = &spk_l_endpoint,155 .name_prefix = "rt1318-1"156 }157};158 159static const struct snd_soc_acpi_adr_device rt1318_2_group1_adr[] = {160 {161 .adr = 0x000230025D131801ull,162 .num_endpoints = 1,163 .endpoints = &spk_r_endpoint,164 .name_prefix = "rt1318-2"165 }166};167 168static const struct snd_soc_acpi_adr_device rt714_0_adr[] = {169 {170 .adr = 0x000030025D071401ull,171 .num_endpoints = 1,172 .endpoints = &single_endpoint,173 .name_prefix = "rt714"174 }175};176 177static const struct snd_soc_acpi_adr_device rt714_2_adr[] = {178 {179 .adr = 0x000230025D071401ull,180 .num_endpoints = 1,181 .endpoints = &single_endpoint,182 .name_prefix = "rt714"183 }184};185 186static const struct snd_soc_acpi_adr_device rt714_3_adr[] = {187 {188 .adr = 0x000330025D071401ull,189 .num_endpoints = 1,190 .endpoints = &single_endpoint,191 .name_prefix = "rt714"192 }193};194 195static const struct snd_soc_acpi_link_adr rpl_cs42l43_l0[] = {196 {197 .mask = BIT(0),198 .num_adr = ARRAY_SIZE(cs42l43_0_adr),199 .adr_d = cs42l43_0_adr,200 },201 {}202};203 204static const struct snd_soc_acpi_link_adr rpl_sdca_3_in_1[] = {205 {206 .mask = BIT(0),207 .num_adr = ARRAY_SIZE(rt711_sdca_0_adr),208 .adr_d = rt711_sdca_0_adr,209 },210 {211 .mask = BIT(1),212 .num_adr = ARRAY_SIZE(rt1316_1_group1_adr),213 .adr_d = rt1316_1_group1_adr,214 },215 {216 .mask = BIT(2),217 .num_adr = ARRAY_SIZE(rt714_2_adr),218 .adr_d = rt714_2_adr,219 },220 {221 .mask = BIT(3),222 .num_adr = ARRAY_SIZE(rt1316_3_group1_adr),223 .adr_d = rt1316_3_group1_adr,224 },225 {}226};227 228static const struct snd_soc_acpi_link_adr rpl_sdw_rt711_link0_rt1316_link12_rt714_link3[] = {229 {230 .mask = BIT(0),231 .num_adr = ARRAY_SIZE(rt711_sdca_0_adr),232 .adr_d = rt711_sdca_0_adr,233 },234 {235 .mask = BIT(1),236 .num_adr = ARRAY_SIZE(rt1316_1_group1_adr),237 .adr_d = rt1316_1_group1_adr,238 },239 {240 .mask = BIT(2),241 .num_adr = ARRAY_SIZE(rt1316_2_group1_adr),242 .adr_d = rt1316_2_group1_adr,243 },244 {245 .mask = BIT(3),246 .num_adr = ARRAY_SIZE(rt714_3_adr),247 .adr_d = rt714_3_adr,248 },249 {}250};251 252static const struct snd_soc_acpi_link_adr rpl_sdw_rt711_link2_rt1316_link01_rt714_link3[] = {253 {254 .mask = BIT(2),255 .num_adr = ARRAY_SIZE(rt711_sdca_2_adr),256 .adr_d = rt711_sdca_2_adr,257 },258 {259 .mask = BIT(0),260 .num_adr = ARRAY_SIZE(rt1316_0_group2_adr),261 .adr_d = rt1316_0_group2_adr,262 },263 {264 .mask = BIT(1),265 .num_adr = ARRAY_SIZE(rt1316_1_group2_adr),266 .adr_d = rt1316_1_group2_adr,267 },268 {269 .mask = BIT(3),270 .num_adr = ARRAY_SIZE(rt714_3_adr),271 .adr_d = rt714_3_adr,272 },273 {}274};275 276static const struct snd_soc_acpi_link_adr rpl_sdw_rt711_link2_rt1316_link01[] = {277 {278 .mask = BIT(2),279 .num_adr = ARRAY_SIZE(rt711_sdca_2_adr),280 .adr_d = rt711_sdca_2_adr,281 },282 {283 .mask = BIT(0),284 .num_adr = ARRAY_SIZE(rt1316_0_group2_adr),285 .adr_d = rt1316_0_group2_adr,286 },287 {288 .mask = BIT(1),289 .num_adr = ARRAY_SIZE(rt1316_1_group2_adr),290 .adr_d = rt1316_1_group2_adr,291 },292 {}293};294 295static const struct snd_soc_acpi_link_adr rpl_sdw_rt711_link0_rt1316_link12[] = {296 {297 .mask = BIT(0),298 .num_adr = ARRAY_SIZE(rt711_sdca_0_adr),299 .adr_d = rt711_sdca_0_adr,300 },301 {302 .mask = BIT(1),303 .num_adr = ARRAY_SIZE(rt1316_1_group1_adr),304 .adr_d = rt1316_1_group1_adr,305 },306 {307 .mask = BIT(2),308 .num_adr = ARRAY_SIZE(rt1316_2_group1_adr),309 .adr_d = rt1316_2_group1_adr,310 },311 {}312};313 314static const struct snd_soc_acpi_link_adr rpl_sdw_rt711_link0_rt1318_link12_rt714_link3[] = {315 {316 .mask = BIT(0),317 .num_adr = ARRAY_SIZE(rt711_sdca_0_adr),318 .adr_d = rt711_sdca_0_adr,319 },320 {321 .mask = BIT(1),322 .num_adr = ARRAY_SIZE(rt1318_1_group1_adr),323 .adr_d = rt1318_1_group1_adr,324 },325 {326 .mask = BIT(2),327 .num_adr = ARRAY_SIZE(rt1318_2_group1_adr),328 .adr_d = rt1318_2_group1_adr,329 },330 {331 .mask = BIT(3),332 .num_adr = ARRAY_SIZE(rt714_3_adr),333 .adr_d = rt714_3_adr,334 },335 {}336};337 338static const struct snd_soc_acpi_link_adr rpl_sdw_rt711_link0_rt1318_link12[] = {339 {340 .mask = BIT(0),341 .num_adr = ARRAY_SIZE(rt711_sdca_0_adr),342 .adr_d = rt711_sdca_0_adr,343 },344 {345 .mask = BIT(1),346 .num_adr = ARRAY_SIZE(rt1318_1_group1_adr),347 .adr_d = rt1318_1_group1_adr,348 },349 {350 .mask = BIT(2),351 .num_adr = ARRAY_SIZE(rt1318_2_group1_adr),352 .adr_d = rt1318_2_group1_adr,353 },354 {}355};356 357static const struct snd_soc_acpi_link_adr rpl_sdw_rt1316_link12_rt714_link0[] = {358 {359 .mask = BIT(1),360 .num_adr = ARRAY_SIZE(rt1316_1_group1_adr),361 .adr_d = rt1316_1_group1_adr,362 },363 {364 .mask = BIT(2),365 .num_adr = ARRAY_SIZE(rt1316_2_group1_adr),366 .adr_d = rt1316_2_group1_adr,367 },368 {369 .mask = BIT(0),370 .num_adr = ARRAY_SIZE(rt714_0_adr),371 .adr_d = rt714_0_adr,372 },373 {}374};375 376static const struct snd_soc_acpi_link_adr rpl_sdca_rvp[] = {377 {378 .mask = BIT(0),379 .num_adr = ARRAY_SIZE(rt711_sdca_0_adr),380 .adr_d = rt711_sdca_0_adr,381 },382 {}383};384 385static const struct snd_soc_acpi_link_adr rplp_crb[] = {386 {387 .mask = BIT(2),388 .num_adr = ARRAY_SIZE(rt711_sdca_2_adr),389 .adr_d = rt711_sdca_2_adr,390 },391 {}392};393 394static const struct snd_soc_acpi_codecs rpl_rt5682_hp = {395 .num_codecs = 2,396 .codecs = {RT5682_ACPI_HID, RT5682S_ACPI_HID},397};398 399static const struct snd_soc_acpi_codecs rpl_essx_83x6 = {400 .num_codecs = 3,401 .codecs = { "ESSX8316", "ESSX8326", "ESSX8336"},402};403 404static const struct snd_soc_acpi_codecs rpl_max98357a_amp = {405 .num_codecs = 1,406 .codecs = {"MX98357A"}407};408 409static const struct snd_soc_acpi_codecs rpl_lt6911_hdmi = {410 .num_codecs = 1,411 .codecs = {"INTC10B0"}412};413 414struct snd_soc_acpi_mach snd_soc_acpi_intel_rpl_machines[] = {415 {416 .comp_ids = &rpl_rt5682_hp,417 .drv_name = "rpl_mx98357_rt5682",418 .machine_quirk = snd_soc_acpi_codec_list,419 .quirk_data = &rpl_max98357a_amp,420 .sof_tplg_filename = "sof-rpl-max98357a-rt5682.tplg",421 },422 {423 .comp_ids = &rpl_rt5682_hp,424 .drv_name = "rpl_rt5682_c1_h02",425 .machine_quirk = snd_soc_acpi_codec_list,426 .quirk_data = &rpl_lt6911_hdmi,427 .sof_tplg_filename = "sof-rpl-rt5682-ssp1-hdmi-ssp02.tplg",428 },429 {430 .comp_ids = &rpl_essx_83x6,431 .drv_name = "rpl_es83x6_c1_h02",432 .machine_quirk = snd_soc_acpi_codec_list,433 .quirk_data = &rpl_lt6911_hdmi,434 .sof_tplg_filename = "sof-rpl-es83x6-ssp1-hdmi-ssp02.tplg",435 },436 {437 .comp_ids = &rpl_essx_83x6,438 .drv_name = "sof-essx8336",439 .sof_tplg_filename = "sof-rpl-es83x6", /* the tplg suffix is added at run time */440 .tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_SSP_NUMBER |441 SND_SOC_ACPI_TPLG_INTEL_SSP_MSB |442 SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER,443 },444 /* place boards for each headphone codec: sof driver will complete the445 * tplg name and machine driver will detect the amp type446 */447 {448 .id = CS42L42_ACPI_HID,449 .drv_name = "rpl_cs42l42_def",450 .sof_tplg_filename = "sof-rpl", /* the tplg suffix is added at run time */451 .tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_AMP_NAME |452 SND_SOC_ACPI_TPLG_INTEL_CODEC_NAME,453 },454 {455 .id = DA7219_ACPI_HID,456 .drv_name = "rpl_da7219_def",457 .sof_tplg_filename = "sof-rpl", /* the tplg suffix is added at run time */458 .tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_AMP_NAME |459 SND_SOC_ACPI_TPLG_INTEL_CODEC_NAME,460 },461 {462 .id = NAU8825_ACPI_HID,463 .drv_name = "rpl_nau8825_def",464 .sof_tplg_filename = "sof-rpl", /* the tplg suffix is added at run time */465 .tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_AMP_NAME |466 SND_SOC_ACPI_TPLG_INTEL_CODEC_NAME,467 },468 {469 .id = RT5650_ACPI_HID,470 .drv_name = "rpl_rt5682_def",471 .sof_tplg_filename = "sof-rpl", /* the tplg suffix is added at run time */472 .tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_AMP_NAME |473 SND_SOC_ACPI_TPLG_INTEL_CODEC_NAME,474 },475 {476 .comp_ids = &rpl_rt5682_hp,477 .drv_name = "rpl_rt5682_def",478 .sof_tplg_filename = "sof-rpl", /* the tplg suffix is added at run time */479 .tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_AMP_NAME |480 SND_SOC_ACPI_TPLG_INTEL_CODEC_NAME,481 },482 /* place amp-only boards in the end of table */483 {484 .id = "INTC10B0",485 .drv_name = "rpl_lt6911_hdmi_ssp",486 .sof_tplg_filename = "sof-rpl-nocodec-hdmi-ssp02.tplg"487 },488 {},489};490EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_rpl_machines);491 492/* this table is used when there is no I2S codec present */493struct snd_soc_acpi_mach snd_soc_acpi_intel_rpl_sdw_machines[] = {494 {495 .link_mask = BIT(0),496 .links = rpl_cs42l43_l0,497 .drv_name = "sof_sdw",498 .sof_tplg_filename = "sof-rpl-cs42l43-l0.tplg",499 },500 {501 .link_mask = 0xF, /* 4 active links required */502 .links = rpl_sdca_3_in_1,503 .drv_name = "sof_sdw",504 .sof_tplg_filename = "sof-rpl-rt711-l0-rt1316-l13-rt714-l2.tplg",505 },506 {507 .link_mask = 0xF, /* 4 active links required */508 .links = rpl_sdw_rt711_link2_rt1316_link01_rt714_link3,509 .drv_name = "sof_sdw",510 .sof_tplg_filename = "sof-rpl-rt711-l2-rt1316-l01-rt714-l3.tplg",511 },512 {513 .link_mask = 0xF, /* 4 active links required */514 .links = rpl_sdw_rt711_link0_rt1316_link12_rt714_link3,515 .drv_name = "sof_sdw",516 .sof_tplg_filename = "sof-rpl-rt711-l0-rt1316-l12-rt714-l3.tplg",517 },518 {519 .link_mask = 0xF, /* 4 active links required */520 .links = rpl_sdw_rt711_link0_rt1318_link12_rt714_link3,521 .drv_name = "sof_sdw",522 .sof_tplg_filename = "sof-rpl-rt711-l0-rt1318-l12-rt714-l3.tplg",523 },524 {525 .link_mask = 0x7, /* rt711 on link0 & two rt1316s on link1 and link2 */526 .links = rpl_sdw_rt711_link0_rt1316_link12,527 .drv_name = "sof_sdw",528 .sof_tplg_filename = "sof-rpl-rt711-l0-rt1316-l12.tplg",529 },530 {531 .link_mask = 0x7, /* rt711 on link0 & two rt1318s on link1 and link2 */532 .links = rpl_sdw_rt711_link0_rt1318_link12,533 .drv_name = "sof_sdw",534 .sof_tplg_filename = "sof-rpl-rt711-l0-rt1318-l12.tplg",535 },536 {537 .link_mask = 0x7, /* rt714 on link0 & two rt1316s on link1 and link2 */538 .links = rpl_sdw_rt1316_link12_rt714_link0,539 .drv_name = "sof_sdw",540 .sof_tplg_filename = "sof-rpl-rt1316-l12-rt714-l0.tplg",541 },542 {543 .link_mask = 0x7, /* rt711 on link2 & two rt1316s on link0 and link1 */544 .links = rpl_sdw_rt711_link2_rt1316_link01,545 .drv_name = "sof_sdw",546 .sof_tplg_filename = "sof-rpl-rt711-l2-rt1316-l01.tplg",547 },548 {549 .link_mask = 0x1, /* link0 required */550 .links = rpl_rvp,551 .drv_name = "sof_sdw",552 .sof_tplg_filename = "sof-rpl-rt711-l0.tplg",553 },554 {555 .link_mask = 0x1, /* link0 required */556 .links = rpl_sdca_rvp,557 .drv_name = "sof_sdw",558 .sof_tplg_filename = "sof-rpl-rt711-l0.tplg",559 },560 {561 .link_mask = 0x4, /* link2 required */562 .links = rplp_crb,563 .drv_name = "sof_sdw",564 .sof_tplg_filename = "sof-rpl-rt711-l2.tplg",565 },566 {},567};568EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_rpl_sdw_machines);569