soc-acpi-intel-cml-match.c 6.43 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0-only
2 3 4 5 6 7 8 9 10 11
/*
 * soc-acpi-intel-cml-match.c - tables and support for CML ACPI enumeration.
 *
 * Copyright (c) 2019, Intel Corporation.
 *
 */

#include <sound/soc-acpi.h>
#include <sound/soc-acpi-intel-match.h>

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 max98357a_spk_codecs = {
18 19 20 21
	.num_codecs = 1,
	.codecs = {"MX98357A"}
};

22 23 24 25 26
static struct snd_soc_acpi_codecs max98390_spk_codecs = {
	.num_codecs = 1,
	.codecs = {"MX98390"}
};

27 28 29 30 31
/*
 * The order of the three entries with .id = "10EC5682" matters
 * here, because DSDT tables expose an ACPI HID for the MAX98357A
 * speaker amplifier which is not populated on the board.
 */
32 33
struct snd_soc_acpi_mach snd_soc_acpi_intel_cml_machines[] = {
	{
34 35 36 37
		.id = "10EC5682",
		.drv_name = "cml_rt1011_rt5682",
		.machine_quirk = snd_soc_acpi_codec_list,
		.quirk_data = &rt1011_spk_codecs,
38
		.sof_fw_filename = "sof-cml.ri",
39
		.sof_tplg_filename = "sof-cml-rt1011-rt5682.tplg",
40 41
	},
	{
42
		.id = "10EC5682",
43
		.drv_name = "sof_rt5682",
44 45
		.machine_quirk = snd_soc_acpi_codec_list,
		.quirk_data = &max98357a_spk_codecs,
46 47 48 49 50 51 52 53 54
		.sof_fw_filename = "sof-cml.ri",
		.sof_tplg_filename = "sof-cml-rt5682-max98357a.tplg",
	},
	{
		.id = "10EC5682",
		.drv_name = "sof_rt5682",
		.sof_fw_filename = "sof-cml.ri",
		.sof_tplg_filename = "sof-cml-rt5682.tplg",
	},
55 56 57 58 59 60 61 62
	{
		.id = "DLGS7219",
		.drv_name = "cml_da7219_max98357a",
		.machine_quirk = snd_soc_acpi_codec_list,
		.quirk_data = &max98357a_spk_codecs,
		.sof_fw_filename = "sof-cml.ri",
		.sof_tplg_filename = "sof-cml-da7219-max98357a.tplg",
	},
63 64 65 66 67 68 69 70
	{
		.id = "DLGS7219",
		.drv_name = "cml_da7219_max98357a",
		.machine_quirk = snd_soc_acpi_codec_list,
		.quirk_data = &max98390_spk_codecs,
		.sof_fw_filename = "sof-cml.ri",
		.sof_tplg_filename = "sof-cml-da7219-max98357a.tplg",
	},
71 72 73 74
	{},
};
EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_cml_machines);

75 76 77 78 79
static const struct snd_soc_acpi_endpoint single_endpoint = {
	.num = 0,
	.aggregated = 0,
	.group_position = 0,
	.group_id = 0,
80 81
};

82 83 84 85 86
static const struct snd_soc_acpi_endpoint spk_l_endpoint = {
	.num = 0,
	.aggregated = 1,
	.group_position = 0,
	.group_id = 1,
87 88
};

89 90 91 92 93
static const struct snd_soc_acpi_endpoint spk_r_endpoint = {
	.num = 0,
	.aggregated = 1,
	.group_position = 1,
	.group_id = 1,
94 95
};

96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
static const struct snd_soc_acpi_adr_device rt700_1_adr[] = {
	{
		.adr = 0x000110025D070000,
		.num_endpoints = 1,
		.endpoints = &single_endpoint,
	}
};

static const struct snd_soc_acpi_link_adr cml_rvp[] = {
	{
		.mask = BIT(1),
		.num_adr = ARRAY_SIZE(rt700_1_adr),
		.adr_d = rt700_1_adr,
	},
	{}
};

113 114
static const struct snd_soc_acpi_adr_device rt711_0_adr[] = {
	{
115
		.adr = 0x000020025D071100,
116 117 118 119 120
		.num_endpoints = 1,
		.endpoints = &single_endpoint,
	}
};

121
static const struct snd_soc_acpi_adr_device rt1308_1_single_adr[] = {
122
	{
123
		.adr = 0x000120025D130800,
124 125 126 127 128 129 130
		.num_endpoints = 1,
		.endpoints = &single_endpoint,
	}
};

static const struct snd_soc_acpi_adr_device rt1308_1_group1_adr[] = {
	{
131
		.adr = 0x000120025D130800,
132 133 134 135 136 137 138
		.num_endpoints = 1,
		.endpoints = &spk_l_endpoint,
	}
};

static const struct snd_soc_acpi_adr_device rt1308_2_group1_adr[] = {
	{
139
		.adr = 0x000220025D130800,
140 141 142 143 144 145 146
		.num_endpoints = 1,
		.endpoints = &spk_r_endpoint,
	}
};

static const struct snd_soc_acpi_adr_device rt715_3_adr[] = {
	{
147
		.adr = 0x000320025D071500,
148 149 150
		.num_endpoints = 1,
		.endpoints = &single_endpoint,
	}
151 152
};

153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
static const struct snd_soc_acpi_adr_device rt711_sdca_0_adr[] = {
	{
		.adr = 0x000030025D071101,
		.num_endpoints = 1,
		.endpoints = &single_endpoint,
	}
};

static const struct snd_soc_acpi_adr_device rt1316_1_group1_adr[] = {
	{
		.adr = 0x000131025D131601, /* unique ID is set for some reason */
		.num_endpoints = 1,
		.endpoints = &spk_l_endpoint,
	}
};

static const struct snd_soc_acpi_adr_device rt1316_2_group1_adr[] = {
	{
		.adr = 0x000230025D131601,
		.num_endpoints = 1,
		.endpoints = &spk_r_endpoint,
	}
};

static const struct snd_soc_acpi_adr_device rt714_3_adr[] = {
	{
		.adr = 0x000330025D071401,
		.num_endpoints = 1,
		.endpoints = &single_endpoint,
	}
};

185 186 187 188
static const struct snd_soc_acpi_link_adr cml_3_in_1_default[] = {
	{
		.mask = BIT(0),
		.num_adr = ARRAY_SIZE(rt711_0_adr),
189
		.adr_d = rt711_0_adr,
190 191 192
	},
	{
		.mask = BIT(1),
193 194
		.num_adr = ARRAY_SIZE(rt1308_1_group1_adr),
		.adr_d = rt1308_1_group1_adr,
195 196 197
	},
	{
		.mask = BIT(2),
198 199
		.num_adr = ARRAY_SIZE(rt1308_2_group1_adr),
		.adr_d = rt1308_2_group1_adr,
200 201 202 203
	},
	{
		.mask = BIT(3),
		.num_adr = ARRAY_SIZE(rt715_3_adr),
204
		.adr_d = rt715_3_adr,
205 206 207 208 209 210 211 212
	},
	{}
};

static const struct snd_soc_acpi_link_adr cml_3_in_1_mono_amp[] = {
	{
		.mask = BIT(0),
		.num_adr = ARRAY_SIZE(rt711_0_adr),
213
		.adr_d = rt711_0_adr,
214 215 216
	},
	{
		.mask = BIT(1),
217 218
		.num_adr = ARRAY_SIZE(rt1308_1_single_adr),
		.adr_d = rt1308_1_single_adr,
219 220 221 222
	},
	{
		.mask = BIT(3),
		.num_adr = ARRAY_SIZE(rt715_3_adr),
223
		.adr_d = rt715_3_adr,
224 225 226 227
	},
	{}
};

228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251
static const struct snd_soc_acpi_link_adr cml_3_in_1_sdca[] = {
	{
		.mask = BIT(0),
		.num_adr = ARRAY_SIZE(rt711_sdca_0_adr),
		.adr_d = rt711_sdca_0_adr,
	},
	{
		.mask = BIT(1),
		.num_adr = ARRAY_SIZE(rt1316_1_group1_adr),
		.adr_d = rt1316_1_group1_adr,
	},
	{
		.mask = BIT(2),
		.num_adr = ARRAY_SIZE(rt1316_2_group1_adr),
		.adr_d = rt1316_2_group1_adr,
	},
	{
		.mask = BIT(3),
		.num_adr = ARRAY_SIZE(rt714_3_adr),
		.adr_d = rt714_3_adr,
	},
	{}
};

252 253 254 255
struct snd_soc_acpi_mach snd_soc_acpi_intel_cml_sdw_machines[] = {
	{
		.link_mask = 0xF, /* 4 active links required */
		.links = cml_3_in_1_default,
256
		.drv_name = "sof_sdw",
257 258 259
		.sof_fw_filename = "sof-cml.ri",
		.sof_tplg_filename = "sof-cml-rt711-rt1308-rt715.tplg",
	},
260 261 262 263 264 265 266
	{
		.link_mask = 0xF, /* 4 active links required */
		.links = cml_3_in_1_sdca,
		.drv_name = "sof_sdw",
		.sof_fw_filename = "sof-cml.ri",
		.sof_tplg_filename = "sof-cml-rt711-rt1316-rt714.tplg",
	},
267 268 269 270 271 272 273 274
	{
		/*
		 * link_mask should be 0xB, but all links are enabled by BIOS.
		 * This entry will be selected if there is no rt1308 exposed
		 * on link2 since it will fail to match the above entry.
		 */
		.link_mask = 0xF,
		.links = cml_3_in_1_mono_amp,
275
		.drv_name = "sof_sdw",
276 277 278 279 280
		.sof_fw_filename = "sof-cml.ri",
		.sof_tplg_filename = "sof-cml-rt711-rt1308-mono-rt715.tplg",
	},
	{
		.link_mask = 0x2, /* RT700 connected on Link1 */
281 282
		.links = cml_rvp,
		.drv_name = "sof_sdw",
283 284 285 286 287 288 289
		.sof_fw_filename = "sof-cml.ri",
		.sof_tplg_filename = "sof-cml-rt700.tplg",
	},
	{}
};
EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_cml_sdw_machines);

290 291
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("Intel Common ACPI Match module");