1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * soc-acpi-intel-cml-match.c - tables and support for CML ACPI enumeration. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (c) 2019, Intel Corporation. 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include <sound/soc-acpi.h> 10*4882a593Smuzhiyun #include <sound/soc-acpi-intel-match.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun static struct snd_soc_acpi_codecs rt1011_spk_codecs = { 13*4882a593Smuzhiyun .num_codecs = 1, 14*4882a593Smuzhiyun .codecs = {"10EC1011"} 15*4882a593Smuzhiyun }; 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun static struct snd_soc_acpi_codecs max98357a_spk_codecs = { 18*4882a593Smuzhiyun .num_codecs = 1, 19*4882a593Smuzhiyun .codecs = {"MX98357A"} 20*4882a593Smuzhiyun }; 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun static struct snd_soc_acpi_codecs max98390_spk_codecs = { 23*4882a593Smuzhiyun .num_codecs = 1, 24*4882a593Smuzhiyun .codecs = {"MX98390"} 25*4882a593Smuzhiyun }; 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun /* 28*4882a593Smuzhiyun * The order of the three entries with .id = "10EC5682" matters 29*4882a593Smuzhiyun * here, because DSDT tables expose an ACPI HID for the MAX98357A 30*4882a593Smuzhiyun * speaker amplifier which is not populated on the board. 31*4882a593Smuzhiyun */ 32*4882a593Smuzhiyun struct snd_soc_acpi_mach snd_soc_acpi_intel_cml_machines[] = { 33*4882a593Smuzhiyun { 34*4882a593Smuzhiyun .id = "10EC5682", 35*4882a593Smuzhiyun .drv_name = "cml_rt1011_rt5682", 36*4882a593Smuzhiyun .machine_quirk = snd_soc_acpi_codec_list, 37*4882a593Smuzhiyun .quirk_data = &rt1011_spk_codecs, 38*4882a593Smuzhiyun .sof_fw_filename = "sof-cml.ri", 39*4882a593Smuzhiyun .sof_tplg_filename = "sof-cml-rt1011-rt5682.tplg", 40*4882a593Smuzhiyun }, 41*4882a593Smuzhiyun { 42*4882a593Smuzhiyun .id = "10EC5682", 43*4882a593Smuzhiyun .drv_name = "sof_rt5682", 44*4882a593Smuzhiyun .machine_quirk = snd_soc_acpi_codec_list, 45*4882a593Smuzhiyun .quirk_data = &max98357a_spk_codecs, 46*4882a593Smuzhiyun .sof_fw_filename = "sof-cml.ri", 47*4882a593Smuzhiyun .sof_tplg_filename = "sof-cml-rt5682-max98357a.tplg", 48*4882a593Smuzhiyun }, 49*4882a593Smuzhiyun { 50*4882a593Smuzhiyun .id = "10EC5682", 51*4882a593Smuzhiyun .drv_name = "sof_rt5682", 52*4882a593Smuzhiyun .sof_fw_filename = "sof-cml.ri", 53*4882a593Smuzhiyun .sof_tplg_filename = "sof-cml-rt5682.tplg", 54*4882a593Smuzhiyun }, 55*4882a593Smuzhiyun { 56*4882a593Smuzhiyun .id = "DLGS7219", 57*4882a593Smuzhiyun .drv_name = "cml_da7219_max98357a", 58*4882a593Smuzhiyun .machine_quirk = snd_soc_acpi_codec_list, 59*4882a593Smuzhiyun .quirk_data = &max98357a_spk_codecs, 60*4882a593Smuzhiyun .sof_fw_filename = "sof-cml.ri", 61*4882a593Smuzhiyun .sof_tplg_filename = "sof-cml-da7219-max98357a.tplg", 62*4882a593Smuzhiyun }, 63*4882a593Smuzhiyun { 64*4882a593Smuzhiyun .id = "DLGS7219", 65*4882a593Smuzhiyun .drv_name = "cml_da7219_mx98357a", 66*4882a593Smuzhiyun .machine_quirk = snd_soc_acpi_codec_list, 67*4882a593Smuzhiyun .quirk_data = &max98390_spk_codecs, 68*4882a593Smuzhiyun .sof_fw_filename = "sof-cml.ri", 69*4882a593Smuzhiyun .sof_tplg_filename = "sof-cml-da7219-max98357a.tplg", 70*4882a593Smuzhiyun }, 71*4882a593Smuzhiyun {}, 72*4882a593Smuzhiyun }; 73*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_cml_machines); 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun static const struct snd_soc_acpi_endpoint single_endpoint = { 76*4882a593Smuzhiyun .num = 0, 77*4882a593Smuzhiyun .aggregated = 0, 78*4882a593Smuzhiyun .group_position = 0, 79*4882a593Smuzhiyun .group_id = 0, 80*4882a593Smuzhiyun }; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun static const struct snd_soc_acpi_endpoint spk_l_endpoint = { 83*4882a593Smuzhiyun .num = 0, 84*4882a593Smuzhiyun .aggregated = 1, 85*4882a593Smuzhiyun .group_position = 0, 86*4882a593Smuzhiyun .group_id = 1, 87*4882a593Smuzhiyun }; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun static const struct snd_soc_acpi_endpoint spk_r_endpoint = { 90*4882a593Smuzhiyun .num = 0, 91*4882a593Smuzhiyun .aggregated = 1, 92*4882a593Smuzhiyun .group_position = 1, 93*4882a593Smuzhiyun .group_id = 1, 94*4882a593Smuzhiyun }; 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun static const struct snd_soc_acpi_adr_device rt700_1_adr[] = { 97*4882a593Smuzhiyun { 98*4882a593Smuzhiyun .adr = 0x000110025D070000, 99*4882a593Smuzhiyun .num_endpoints = 1, 100*4882a593Smuzhiyun .endpoints = &single_endpoint, 101*4882a593Smuzhiyun .name_prefix = "rt700" 102*4882a593Smuzhiyun } 103*4882a593Smuzhiyun }; 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun static const struct snd_soc_acpi_link_adr cml_rvp[] = { 106*4882a593Smuzhiyun { 107*4882a593Smuzhiyun .mask = BIT(1), 108*4882a593Smuzhiyun .num_adr = ARRAY_SIZE(rt700_1_adr), 109*4882a593Smuzhiyun .adr_d = rt700_1_adr, 110*4882a593Smuzhiyun }, 111*4882a593Smuzhiyun {} 112*4882a593Smuzhiyun }; 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun static const struct snd_soc_acpi_adr_device rt711_0_adr[] = { 115*4882a593Smuzhiyun { 116*4882a593Smuzhiyun .adr = 0x000020025D071100, 117*4882a593Smuzhiyun .num_endpoints = 1, 118*4882a593Smuzhiyun .endpoints = &single_endpoint, 119*4882a593Smuzhiyun .name_prefix = "rt711" 120*4882a593Smuzhiyun } 121*4882a593Smuzhiyun }; 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun static const struct snd_soc_acpi_adr_device rt1308_1_single_adr[] = { 124*4882a593Smuzhiyun { 125*4882a593Smuzhiyun .adr = 0x000120025D130800, 126*4882a593Smuzhiyun .num_endpoints = 1, 127*4882a593Smuzhiyun .endpoints = &single_endpoint, 128*4882a593Smuzhiyun .name_prefix = "rt1308-1" 129*4882a593Smuzhiyun } 130*4882a593Smuzhiyun }; 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun static const struct snd_soc_acpi_adr_device rt1308_1_group1_adr[] = { 133*4882a593Smuzhiyun { 134*4882a593Smuzhiyun .adr = 0x000120025D130800, 135*4882a593Smuzhiyun .num_endpoints = 1, 136*4882a593Smuzhiyun .endpoints = &spk_l_endpoint, 137*4882a593Smuzhiyun .name_prefix = "rt1308-1" 138*4882a593Smuzhiyun } 139*4882a593Smuzhiyun }; 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun static const struct snd_soc_acpi_adr_device rt1308_2_group1_adr[] = { 142*4882a593Smuzhiyun { 143*4882a593Smuzhiyun .adr = 0x000220025D130800, 144*4882a593Smuzhiyun .num_endpoints = 1, 145*4882a593Smuzhiyun .endpoints = &spk_r_endpoint, 146*4882a593Smuzhiyun .name_prefix = "rt1308-2" 147*4882a593Smuzhiyun } 148*4882a593Smuzhiyun }; 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun static const struct snd_soc_acpi_adr_device rt715_3_adr[] = { 151*4882a593Smuzhiyun { 152*4882a593Smuzhiyun .adr = 0x000320025D071500, 153*4882a593Smuzhiyun .num_endpoints = 1, 154*4882a593Smuzhiyun .endpoints = &single_endpoint, 155*4882a593Smuzhiyun .name_prefix = "rt715" 156*4882a593Smuzhiyun } 157*4882a593Smuzhiyun }; 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun static const struct snd_soc_acpi_adr_device rt711_sdca_0_adr[] = { 160*4882a593Smuzhiyun { 161*4882a593Smuzhiyun .adr = 0x000030025D071101, 162*4882a593Smuzhiyun .num_endpoints = 1, 163*4882a593Smuzhiyun .endpoints = &single_endpoint, 164*4882a593Smuzhiyun .name_prefix = "rt711" 165*4882a593Smuzhiyun } 166*4882a593Smuzhiyun }; 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun static const struct snd_soc_acpi_adr_device rt1316_1_group1_adr[] = { 169*4882a593Smuzhiyun { 170*4882a593Smuzhiyun .adr = 0x000131025D131601, /* unique ID is set for some reason */ 171*4882a593Smuzhiyun .num_endpoints = 1, 172*4882a593Smuzhiyun .endpoints = &spk_l_endpoint, 173*4882a593Smuzhiyun .name_prefix = "rt1316-1" 174*4882a593Smuzhiyun } 175*4882a593Smuzhiyun }; 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun static const struct snd_soc_acpi_adr_device rt1316_2_group1_adr[] = { 178*4882a593Smuzhiyun { 179*4882a593Smuzhiyun .adr = 0x000230025D131601, 180*4882a593Smuzhiyun .num_endpoints = 1, 181*4882a593Smuzhiyun .endpoints = &spk_r_endpoint, 182*4882a593Smuzhiyun .name_prefix = "rt1316-2" 183*4882a593Smuzhiyun } 184*4882a593Smuzhiyun }; 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun static const struct snd_soc_acpi_adr_device rt714_3_adr[] = { 187*4882a593Smuzhiyun { 188*4882a593Smuzhiyun .adr = 0x000330025D071401, 189*4882a593Smuzhiyun .num_endpoints = 1, 190*4882a593Smuzhiyun .endpoints = &single_endpoint, 191*4882a593Smuzhiyun .name_prefix = "rt714" 192*4882a593Smuzhiyun } 193*4882a593Smuzhiyun }; 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun static const struct snd_soc_acpi_link_adr cml_3_in_1_default[] = { 196*4882a593Smuzhiyun { 197*4882a593Smuzhiyun .mask = BIT(0), 198*4882a593Smuzhiyun .num_adr = ARRAY_SIZE(rt711_0_adr), 199*4882a593Smuzhiyun .adr_d = rt711_0_adr, 200*4882a593Smuzhiyun }, 201*4882a593Smuzhiyun { 202*4882a593Smuzhiyun .mask = BIT(1), 203*4882a593Smuzhiyun .num_adr = ARRAY_SIZE(rt1308_1_group1_adr), 204*4882a593Smuzhiyun .adr_d = rt1308_1_group1_adr, 205*4882a593Smuzhiyun }, 206*4882a593Smuzhiyun { 207*4882a593Smuzhiyun .mask = BIT(2), 208*4882a593Smuzhiyun .num_adr = ARRAY_SIZE(rt1308_2_group1_adr), 209*4882a593Smuzhiyun .adr_d = rt1308_2_group1_adr, 210*4882a593Smuzhiyun }, 211*4882a593Smuzhiyun { 212*4882a593Smuzhiyun .mask = BIT(3), 213*4882a593Smuzhiyun .num_adr = ARRAY_SIZE(rt715_3_adr), 214*4882a593Smuzhiyun .adr_d = rt715_3_adr, 215*4882a593Smuzhiyun }, 216*4882a593Smuzhiyun {} 217*4882a593Smuzhiyun }; 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun static const struct snd_soc_acpi_link_adr cml_3_in_1_mono_amp[] = { 220*4882a593Smuzhiyun { 221*4882a593Smuzhiyun .mask = BIT(0), 222*4882a593Smuzhiyun .num_adr = ARRAY_SIZE(rt711_0_adr), 223*4882a593Smuzhiyun .adr_d = rt711_0_adr, 224*4882a593Smuzhiyun }, 225*4882a593Smuzhiyun { 226*4882a593Smuzhiyun .mask = BIT(1), 227*4882a593Smuzhiyun .num_adr = ARRAY_SIZE(rt1308_1_single_adr), 228*4882a593Smuzhiyun .adr_d = rt1308_1_single_adr, 229*4882a593Smuzhiyun }, 230*4882a593Smuzhiyun { 231*4882a593Smuzhiyun .mask = BIT(3), 232*4882a593Smuzhiyun .num_adr = ARRAY_SIZE(rt715_3_adr), 233*4882a593Smuzhiyun .adr_d = rt715_3_adr, 234*4882a593Smuzhiyun }, 235*4882a593Smuzhiyun {} 236*4882a593Smuzhiyun }; 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun static const struct snd_soc_acpi_link_adr cml_3_in_1_sdca[] = { 239*4882a593Smuzhiyun { 240*4882a593Smuzhiyun .mask = BIT(0), 241*4882a593Smuzhiyun .num_adr = ARRAY_SIZE(rt711_sdca_0_adr), 242*4882a593Smuzhiyun .adr_d = rt711_sdca_0_adr, 243*4882a593Smuzhiyun }, 244*4882a593Smuzhiyun { 245*4882a593Smuzhiyun .mask = BIT(1), 246*4882a593Smuzhiyun .num_adr = ARRAY_SIZE(rt1316_1_group1_adr), 247*4882a593Smuzhiyun .adr_d = rt1316_1_group1_adr, 248*4882a593Smuzhiyun }, 249*4882a593Smuzhiyun { 250*4882a593Smuzhiyun .mask = BIT(2), 251*4882a593Smuzhiyun .num_adr = ARRAY_SIZE(rt1316_2_group1_adr), 252*4882a593Smuzhiyun .adr_d = rt1316_2_group1_adr, 253*4882a593Smuzhiyun }, 254*4882a593Smuzhiyun { 255*4882a593Smuzhiyun .mask = BIT(3), 256*4882a593Smuzhiyun .num_adr = ARRAY_SIZE(rt714_3_adr), 257*4882a593Smuzhiyun .adr_d = rt714_3_adr, 258*4882a593Smuzhiyun }, 259*4882a593Smuzhiyun {} 260*4882a593Smuzhiyun }; 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun struct snd_soc_acpi_mach snd_soc_acpi_intel_cml_sdw_machines[] = { 263*4882a593Smuzhiyun { 264*4882a593Smuzhiyun .link_mask = 0xF, /* 4 active links required */ 265*4882a593Smuzhiyun .links = cml_3_in_1_default, 266*4882a593Smuzhiyun .drv_name = "sof_sdw", 267*4882a593Smuzhiyun .sof_fw_filename = "sof-cml.ri", 268*4882a593Smuzhiyun .sof_tplg_filename = "sof-cml-rt711-rt1308-rt715.tplg", 269*4882a593Smuzhiyun }, 270*4882a593Smuzhiyun { 271*4882a593Smuzhiyun .link_mask = 0xF, /* 4 active links required */ 272*4882a593Smuzhiyun .links = cml_3_in_1_sdca, 273*4882a593Smuzhiyun .drv_name = "sof_sdw", 274*4882a593Smuzhiyun .sof_fw_filename = "sof-cml.ri", 275*4882a593Smuzhiyun .sof_tplg_filename = "sof-cml-rt711-rt1316-rt714.tplg", 276*4882a593Smuzhiyun }, 277*4882a593Smuzhiyun { 278*4882a593Smuzhiyun /* 279*4882a593Smuzhiyun * link_mask should be 0xB, but all links are enabled by BIOS. 280*4882a593Smuzhiyun * This entry will be selected if there is no rt1308 exposed 281*4882a593Smuzhiyun * on link2 since it will fail to match the above entry. 282*4882a593Smuzhiyun */ 283*4882a593Smuzhiyun .link_mask = 0xF, 284*4882a593Smuzhiyun .links = cml_3_in_1_mono_amp, 285*4882a593Smuzhiyun .drv_name = "sof_sdw", 286*4882a593Smuzhiyun .sof_fw_filename = "sof-cml.ri", 287*4882a593Smuzhiyun .sof_tplg_filename = "sof-cml-rt711-rt1308-mono-rt715.tplg", 288*4882a593Smuzhiyun }, 289*4882a593Smuzhiyun { 290*4882a593Smuzhiyun .link_mask = 0x2, /* RT700 connected on Link1 */ 291*4882a593Smuzhiyun .links = cml_rvp, 292*4882a593Smuzhiyun .drv_name = "sof_sdw", 293*4882a593Smuzhiyun .sof_fw_filename = "sof-cml.ri", 294*4882a593Smuzhiyun .sof_tplg_filename = "sof-cml-rt700.tplg", 295*4882a593Smuzhiyun }, 296*4882a593Smuzhiyun {} 297*4882a593Smuzhiyun }; 298*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_cml_sdw_machines); 299*4882a593Smuzhiyun 300*4882a593Smuzhiyun MODULE_LICENSE("GPL v2"); 301*4882a593Smuzhiyun MODULE_DESCRIPTION("Intel Common ACPI Match module"); 302