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