xref: /openbmc/linux/sound/soc/intel/common/soc-acpi-intel-cht-match.c (revision 07588a58ef6d744638940c030619edd46a35b87a)
12025cf9eSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
260046406SPierre-Louis Bossart /*
3e51b6980SChristophe JAILLET  * soc-acpi-intel-cht-match.c - tables and support for CHT ACPI enumeration.
460046406SPierre-Louis Bossart  *
560046406SPierre-Louis Bossart  * Copyright (c) 2017, Intel Corporation.
660046406SPierre-Louis Bossart  */
760046406SPierre-Louis Bossart 
860046406SPierre-Louis Bossart #include <linux/dmi.h>
960046406SPierre-Louis Bossart #include <sound/soc-acpi.h>
1060046406SPierre-Louis Bossart #include <sound/soc-acpi-intel-match.h>
1160046406SPierre-Louis Bossart 
1260046406SPierre-Louis Bossart static unsigned long cht_machine_id;
1360046406SPierre-Louis Bossart 
1460046406SPierre-Louis Bossart #define CHT_SURFACE_MACH 1
1560046406SPierre-Louis Bossart 
cht_surface_quirk_cb(const struct dmi_system_id * id)1660046406SPierre-Louis Bossart static int cht_surface_quirk_cb(const struct dmi_system_id *id)
1760046406SPierre-Louis Bossart {
1860046406SPierre-Louis Bossart 	cht_machine_id = CHT_SURFACE_MACH;
1960046406SPierre-Louis Bossart 	return 1;
2060046406SPierre-Louis Bossart }
2160046406SPierre-Louis Bossart 
2260046406SPierre-Louis Bossart static const struct dmi_system_id cht_table[] = {
2360046406SPierre-Louis Bossart 	{
2460046406SPierre-Louis Bossart 		.callback = cht_surface_quirk_cb,
2560046406SPierre-Louis Bossart 		.matches = {
2660046406SPierre-Louis Bossart 			DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
2760046406SPierre-Louis Bossart 			DMI_MATCH(DMI_PRODUCT_NAME, "Surface 3"),
2860046406SPierre-Louis Bossart 		},
2960046406SPierre-Louis Bossart 	},
3060046406SPierre-Louis Bossart 	{ }
3160046406SPierre-Louis Bossart };
3260046406SPierre-Louis Bossart 
3360046406SPierre-Louis Bossart static struct snd_soc_acpi_mach cht_surface_mach = {
3460046406SPierre-Louis Bossart 	.id = "10EC5640",
3560046406SPierre-Louis Bossart 	.drv_name = "cht-bsw-rt5645",
3660046406SPierre-Louis Bossart 	.fw_filename = "intel/fw_sst_22a8.bin",
3760046406SPierre-Louis Bossart 	.board = "cht-bsw",
382e441deaSPierre-Louis Bossart 	.sof_tplg_filename = "sof-cht-rt5645.tplg",
3960046406SPierre-Louis Bossart };
4060046406SPierre-Louis Bossart 
cht_quirk(void * arg)4160046406SPierre-Louis Bossart static struct snd_soc_acpi_mach *cht_quirk(void *arg)
4260046406SPierre-Louis Bossart {
4360046406SPierre-Louis Bossart 	struct snd_soc_acpi_mach *mach = arg;
4460046406SPierre-Louis Bossart 
4560046406SPierre-Louis Bossart 	dmi_check_system(cht_table);
4660046406SPierre-Louis Bossart 
4760046406SPierre-Louis Bossart 	if (cht_machine_id == CHT_SURFACE_MACH)
4860046406SPierre-Louis Bossart 		return &cht_surface_mach;
4960046406SPierre-Louis Bossart 	else
5060046406SPierre-Louis Bossart 		return mach;
5160046406SPierre-Louis Bossart }
5260046406SPierre-Louis Bossart 
53ec6f82b4SHans de Goede /*
54ec6f82b4SHans de Goede  * Some tablets with Android factory OS have buggy DSDTs with an ESSX8316 device
55ec6f82b4SHans de Goede  * in the ACPI tables. While they are not using an ESS8316 codec. These DSDTs
56ec6f82b4SHans de Goede  * also have an ACPI device for the correct codec, ignore the ESSX8316.
57ec6f82b4SHans de Goede  */
58ec6f82b4SHans de Goede static const struct dmi_system_id cht_ess8316_not_present_table[] = {
59ec6f82b4SHans de Goede 	{
60ec6f82b4SHans de Goede 		/* Nextbook Ares 8A */
61ec6f82b4SHans de Goede 		.matches = {
62ec6f82b4SHans de Goede 			DMI_MATCH(DMI_SYS_VENDOR, "Insyde"),
63ec6f82b4SHans de Goede 			DMI_MATCH(DMI_PRODUCT_NAME, "CherryTrail"),
64ec6f82b4SHans de Goede 			DMI_MATCH(DMI_BIOS_VERSION, "M882"),
65ec6f82b4SHans de Goede 		},
66ec6f82b4SHans de Goede 	},
67ec6f82b4SHans de Goede 	{ }
68ec6f82b4SHans de Goede };
69ec6f82b4SHans de Goede 
cht_ess8316_quirk(void * arg)70ec6f82b4SHans de Goede static struct snd_soc_acpi_mach *cht_ess8316_quirk(void *arg)
71ec6f82b4SHans de Goede {
72ec6f82b4SHans de Goede 	if (dmi_check_system(cht_ess8316_not_present_table))
73ec6f82b4SHans de Goede 		return NULL;
74ec6f82b4SHans de Goede 
75ec6f82b4SHans de Goede 	return arg;
76ec6f82b4SHans de Goede }
77ec6f82b4SHans de Goede 
78*80be0425SHans de Goede /*
79*80be0425SHans de Goede  * The Lenovo Yoga Tab 3 Pro YT3-X90, with Android factory OS has a buggy DSDT
80*80be0425SHans de Goede  * with the coded not being listed at all.
81*80be0425SHans de Goede  */
82*80be0425SHans de Goede static const struct dmi_system_id lenovo_yoga_tab3_x90[] = {
83*80be0425SHans de Goede 	{
84*80be0425SHans de Goede 		/* Lenovo Yoga Tab 3 Pro YT3-X90, codec missing from DSDT */
85*80be0425SHans de Goede 		.matches = {
86*80be0425SHans de Goede 			DMI_MATCH(DMI_SYS_VENDOR, "Intel Corporation"),
87*80be0425SHans de Goede 			DMI_MATCH(DMI_PRODUCT_VERSION, "Blade3-10A-001"),
88*80be0425SHans de Goede 		},
89*80be0425SHans de Goede 	},
90*80be0425SHans de Goede 	{ }
91*80be0425SHans de Goede };
92*80be0425SHans de Goede 
93*80be0425SHans de Goede static struct snd_soc_acpi_mach cht_lenovo_yoga_tab3_x90_mach = {
94*80be0425SHans de Goede 	.id = "10WM5102",
95*80be0425SHans de Goede 	.drv_name = "bytcr_wm5102",
96*80be0425SHans de Goede 	.fw_filename = "intel/fw_sst_22a8.bin",
97*80be0425SHans de Goede 	.board = "bytcr_wm5102",
98*80be0425SHans de Goede 	.sof_tplg_filename = "sof-cht-wm5102.tplg",
99*80be0425SHans de Goede };
100*80be0425SHans de Goede 
lenovo_yt3_x90_quirk(void * arg)101*80be0425SHans de Goede static struct snd_soc_acpi_mach *lenovo_yt3_x90_quirk(void *arg)
102*80be0425SHans de Goede {
103*80be0425SHans de Goede 	if (dmi_check_system(lenovo_yoga_tab3_x90))
104*80be0425SHans de Goede 		return &cht_lenovo_yoga_tab3_x90_mach;
105*80be0425SHans de Goede 
106*80be0425SHans de Goede 	/* Skip wildcard match snd_soc_acpi_intel_cherrytrail_machines[] entry */
107*80be0425SHans de Goede 	return NULL;
108*80be0425SHans de Goede }
109*80be0425SHans de Goede 
110959ae821SPierre-Louis Bossart static const struct snd_soc_acpi_codecs rt5640_comp_ids = {
111959ae821SPierre-Louis Bossart 	.num_codecs = 2,
112959ae821SPierre-Louis Bossart 	.codecs = { "10EC5640", "10EC3276" },
113959ae821SPierre-Louis Bossart };
114959ae821SPierre-Louis Bossart 
115959ae821SPierre-Louis Bossart static const struct snd_soc_acpi_codecs rt5670_comp_ids = {
116959ae821SPierre-Louis Bossart 	.num_codecs = 2,
117959ae821SPierre-Louis Bossart 	.codecs = { "10EC5670", "10EC5672" },
118959ae821SPierre-Louis Bossart };
119959ae821SPierre-Louis Bossart 
120959ae821SPierre-Louis Bossart static const struct snd_soc_acpi_codecs rt5645_comp_ids = {
121959ae821SPierre-Louis Bossart 	.num_codecs = 3,
122959ae821SPierre-Louis Bossart 	.codecs = { "10EC5645", "10EC5650", "10EC3270" },
123959ae821SPierre-Louis Bossart };
124959ae821SPierre-Louis Bossart 
125959ae821SPierre-Louis Bossart static const struct snd_soc_acpi_codecs da7213_comp_ids = {
126959ae821SPierre-Louis Bossart 	.num_codecs = 2,
127959ae821SPierre-Louis Bossart 	.codecs = { "DGLS7212", "DGLS7213"},
128959ae821SPierre-Louis Bossart 
129959ae821SPierre-Louis Bossart };
130959ae821SPierre-Louis Bossart 
13160046406SPierre-Louis Bossart /* Cherryview-based platforms: CherryTrail and Braswell */
13260046406SPierre-Louis Bossart struct snd_soc_acpi_mach  snd_soc_acpi_intel_cherrytrail_machines[] = {
13360046406SPierre-Louis Bossart 	{
134959ae821SPierre-Louis Bossart 		.comp_ids = &rt5670_comp_ids,
13560046406SPierre-Louis Bossart 		.drv_name = "cht-bsw-rt5672",
13660046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_22a8.bin",
13760046406SPierre-Louis Bossart 		.board = "cht-bsw",
1382e441deaSPierre-Louis Bossart 		.sof_tplg_filename = "sof-cht-rt5670.tplg",
13960046406SPierre-Louis Bossart 	},
14060046406SPierre-Louis Bossart 	{
141959ae821SPierre-Louis Bossart 		.comp_ids = &rt5645_comp_ids,
14260046406SPierre-Louis Bossart 		.drv_name = "cht-bsw-rt5645",
14360046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_22a8.bin",
14460046406SPierre-Louis Bossart 		.board = "cht-bsw",
1452e441deaSPierre-Louis Bossart 		.sof_tplg_filename = "sof-cht-rt5645.tplg",
14660046406SPierre-Louis Bossart 	},
14760046406SPierre-Louis Bossart 	{
14860046406SPierre-Louis Bossart 		.id = "193C9890",
14960046406SPierre-Louis Bossart 		.drv_name = "cht-bsw-max98090",
15060046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_22a8.bin",
15160046406SPierre-Louis Bossart 		.board = "cht-bsw",
1522e441deaSPierre-Louis Bossart 		.sof_tplg_filename = "sof-cht-max98090.tplg",
15360046406SPierre-Louis Bossart 	},
15460046406SPierre-Louis Bossart 	{
1555b00ce63SJohn Hsu 		.id = "10508824",
1565b00ce63SJohn Hsu 		.drv_name = "cht-bsw-nau8824",
1575b00ce63SJohn Hsu 		.fw_filename = "intel/fw_sst_22a8.bin",
1585b00ce63SJohn Hsu 		.board = "cht-bsw",
1592e441deaSPierre-Louis Bossart 		.sof_tplg_filename = "sof-cht-nau8824.tplg",
1605b00ce63SJohn Hsu 	},
1615b00ce63SJohn Hsu 	{
162959ae821SPierre-Louis Bossart 		.comp_ids = &da7213_comp_ids,
16360046406SPierre-Louis Bossart 		.drv_name = "bytcht_da7213",
16460046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_22a8.bin",
16560046406SPierre-Louis Bossart 		.board = "bytcht_da7213",
1662e441deaSPierre-Louis Bossart 		.sof_tplg_filename = "sof-cht-da7213.tplg",
16760046406SPierre-Louis Bossart 	},
16860046406SPierre-Louis Bossart 	{
16960046406SPierre-Louis Bossart 		.id = "ESSX8316",
17060046406SPierre-Louis Bossart 		.drv_name = "bytcht_es8316",
17160046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_22a8.bin",
17260046406SPierre-Louis Bossart 		.board = "bytcht_es8316",
173ec6f82b4SHans de Goede 		.machine_quirk = cht_ess8316_quirk,
1742e441deaSPierre-Louis Bossart 		.sof_tplg_filename = "sof-cht-es8316.tplg",
17560046406SPierre-Louis Bossart 	},
17660046406SPierre-Louis Bossart 	/* some CHT-T platforms rely on RT5640, use Baytrail machine driver */
17760046406SPierre-Louis Bossart 	{
178959ae821SPierre-Louis Bossart 		.comp_ids = &rt5640_comp_ids,
17960046406SPierre-Louis Bossart 		.drv_name = "bytcr_rt5640",
18060046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_22a8.bin",
18160046406SPierre-Louis Bossart 		.board = "bytcr_rt5640",
18260046406SPierre-Louis Bossart 		.machine_quirk = cht_quirk,
1832e441deaSPierre-Louis Bossart 		.sof_tplg_filename = "sof-cht-rt5640.tplg",
18460046406SPierre-Louis Bossart 	},
18560046406SPierre-Louis Bossart 	{
186f70abd75SBard liao 		.id = "10EC5682",
187f70abd75SBard liao 		.drv_name = "sof_rt5682",
188f70abd75SBard liao 		.sof_tplg_filename = "sof-cht-rt5682.tplg",
189f70abd75SBard liao 	},
19060046406SPierre-Louis Bossart 	/* some CHT-T platforms rely on RT5651, use Baytrail machine driver */
19160046406SPierre-Louis Bossart 	{
19260046406SPierre-Louis Bossart 		.id = "10EC5651",
19360046406SPierre-Louis Bossart 		.drv_name = "bytcr_rt5651",
19460046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_22a8.bin",
19560046406SPierre-Louis Bossart 		.board = "bytcr_rt5651",
1962e441deaSPierre-Louis Bossart 		.sof_tplg_filename = "sof-cht-rt5651.tplg",
19760046406SPierre-Louis Bossart 	},
1983917da94STakashi Iwai 	{
1993917da94STakashi Iwai 		.id = "14F10720",
2003917da94STakashi Iwai 		.drv_name = "bytcht_cx2072x",
2013917da94STakashi Iwai 		.fw_filename = "intel/fw_sst_22a8.bin",
2023917da94STakashi Iwai 		.board = "bytcht_cx2072x",
2033917da94STakashi Iwai 		.sof_tplg_filename = "sof-cht-cx2072x.tplg",
2043917da94STakashi Iwai 	},
2059d19426eSPierre-Louis Bossart 	{
2069d19426eSPierre-Louis Bossart 		.id = "104C5122",
2079d19426eSPierre-Louis Bossart 		.drv_name = "sof_pcm512x",
2089d19426eSPierre-Louis Bossart 		.sof_tplg_filename = "sof-cht-src-50khz-pcm512x.tplg",
2099d19426eSPierre-Louis Bossart 	},
210*80be0425SHans de Goede 	/*
211*80be0425SHans de Goede 	 * Special case for the Lenovo Yoga Tab 3 Pro YT3-X90 where the DSDT
212*80be0425SHans de Goede 	 * misses the codec. Match on the SST id instead, lenovo_yt3_x90_quirk()
213*80be0425SHans de Goede 	 * will return a YT3 specific mach or NULL when called on other hw,
214*80be0425SHans de Goede 	 * skipping this entry.
215*80be0425SHans de Goede 	 */
216*80be0425SHans de Goede 	{
217*80be0425SHans de Goede 		.id = "808622A8",
218*80be0425SHans de Goede 		.machine_quirk = lenovo_yt3_x90_quirk,
219*80be0425SHans de Goede 	},
2209d19426eSPierre-Louis Bossart 
22160046406SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH)
22260046406SPierre-Louis Bossart 	/*
22360046406SPierre-Louis Bossart 	 * This is always last in the table so that it is selected only when
22460046406SPierre-Louis Bossart 	 * enabled explicitly and there is no codec-related information in SSDT
22560046406SPierre-Louis Bossart 	 */
22660046406SPierre-Louis Bossart 	{
22760046406SPierre-Louis Bossart 		.id = "808622A8",
22860046406SPierre-Louis Bossart 		.drv_name = "bytcht_nocodec",
22960046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_22a8.bin",
23060046406SPierre-Louis Bossart 		.board = "bytcht_nocodec",
23160046406SPierre-Louis Bossart 	},
23260046406SPierre-Louis Bossart #endif
23360046406SPierre-Louis Bossart 	{},
23460046406SPierre-Louis Bossart };
23560046406SPierre-Louis Bossart EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_cherrytrail_machines);
236