160046406SPierre-Louis Bossart /*
260046406SPierre-Louis Bossart  * soc-apci-intel-byt-match.c - tables and support for BYT ACPI enumeration.
360046406SPierre-Louis Bossart  *
460046406SPierre-Louis Bossart  * Copyright (c) 2017, Intel Corporation.
560046406SPierre-Louis Bossart  *
660046406SPierre-Louis Bossart  *
760046406SPierre-Louis Bossart  * This program is free software; you can redistribute it and/or modify it
860046406SPierre-Louis Bossart  * under the terms and conditions of the GNU General Public License,
960046406SPierre-Louis Bossart  * version 2, as published by the Free Software Foundation.
1060046406SPierre-Louis Bossart  *
1160046406SPierre-Louis Bossart  * This program is distributed in the hope it will be useful, but WITHOUT
1260046406SPierre-Louis Bossart  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1360046406SPierre-Louis Bossart  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
1460046406SPierre-Louis Bossart  * more details.
1560046406SPierre-Louis Bossart  */
1660046406SPierre-Louis Bossart 
1760046406SPierre-Louis Bossart #include <linux/dmi.h>
1860046406SPierre-Louis Bossart #include <sound/soc-acpi.h>
1960046406SPierre-Louis Bossart #include <sound/soc-acpi-intel-match.h>
2060046406SPierre-Louis Bossart 
2160046406SPierre-Louis Bossart static unsigned long byt_machine_id;
2260046406SPierre-Louis Bossart 
2360046406SPierre-Louis Bossart #define BYT_THINKPAD_10  1
2460046406SPierre-Louis Bossart 
2560046406SPierre-Louis Bossart static int byt_thinkpad10_quirk_cb(const struct dmi_system_id *id)
2660046406SPierre-Louis Bossart {
2760046406SPierre-Louis Bossart 	byt_machine_id = BYT_THINKPAD_10;
2860046406SPierre-Louis Bossart 	return 1;
2960046406SPierre-Louis Bossart }
3060046406SPierre-Louis Bossart 
3160046406SPierre-Louis Bossart 
3260046406SPierre-Louis Bossart static const struct dmi_system_id byt_table[] = {
3360046406SPierre-Louis Bossart 	{
3460046406SPierre-Louis Bossart 		.callback = byt_thinkpad10_quirk_cb,
3560046406SPierre-Louis Bossart 		.matches = {
3660046406SPierre-Louis Bossart 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
372ca426a2SHans de Goede 			DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad 8"),
382ca426a2SHans de Goede 		},
392ca426a2SHans de Goede 	},
402ca426a2SHans de Goede 	{
412ca426a2SHans de Goede 		.callback = byt_thinkpad10_quirk_cb,
422ca426a2SHans de Goede 		.matches = {
432ca426a2SHans de Goede 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
4460046406SPierre-Louis Bossart 			DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad 10"),
4560046406SPierre-Louis Bossart 		},
4660046406SPierre-Louis Bossart 	},
4760046406SPierre-Louis Bossart 	{
4860046406SPierre-Louis Bossart 		.callback = byt_thinkpad10_quirk_cb,
4960046406SPierre-Louis Bossart 		.matches = {
5060046406SPierre-Louis Bossart 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
5160046406SPierre-Louis Bossart 			DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad Tablet B"),
5260046406SPierre-Louis Bossart 		},
5360046406SPierre-Louis Bossart 	},
5460046406SPierre-Louis Bossart 	{
5560046406SPierre-Louis Bossart 		.callback = byt_thinkpad10_quirk_cb,
5660046406SPierre-Louis Bossart 		.matches = {
5760046406SPierre-Louis Bossart 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
5860046406SPierre-Louis Bossart 			DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Miix 2 10"),
5960046406SPierre-Louis Bossart 		},
6060046406SPierre-Louis Bossart 	},
6160046406SPierre-Louis Bossart 	{ }
6260046406SPierre-Louis Bossart };
6360046406SPierre-Louis Bossart 
6460046406SPierre-Louis Bossart static struct snd_soc_acpi_mach byt_thinkpad_10 = {
6560046406SPierre-Louis Bossart 	.id = "10EC5640",
6660046406SPierre-Louis Bossart 	.drv_name = "cht-bsw-rt5672",
6760046406SPierre-Louis Bossart 	.fw_filename = "intel/fw_sst_0f28.bin",
6860046406SPierre-Louis Bossart 	.board = "cht-bsw",
694f722a6aSPierre-Louis Bossart 	.sof_fw_filename = "intel/sof-byt.ri",
704f722a6aSPierre-Louis Bossart 	.sof_tplg_filename = "intel/sof-byt-rt5670.tplg",
71c1a8ed69SPierre-Louis Bossart 	.asoc_plat_name = "sst-mfld-platform",
7260046406SPierre-Louis Bossart };
7360046406SPierre-Louis Bossart 
7460046406SPierre-Louis Bossart static struct snd_soc_acpi_mach *byt_quirk(void *arg)
7560046406SPierre-Louis Bossart {
7660046406SPierre-Louis Bossart 	struct snd_soc_acpi_mach *mach = arg;
7760046406SPierre-Louis Bossart 
7860046406SPierre-Louis Bossart 	dmi_check_system(byt_table);
7960046406SPierre-Louis Bossart 
8060046406SPierre-Louis Bossart 	if (byt_machine_id == BYT_THINKPAD_10)
8160046406SPierre-Louis Bossart 		return &byt_thinkpad_10;
8260046406SPierre-Louis Bossart 	else
8360046406SPierre-Louis Bossart 		return mach;
8460046406SPierre-Louis Bossart }
8560046406SPierre-Louis Bossart 
8660046406SPierre-Louis Bossart struct snd_soc_acpi_mach snd_soc_acpi_intel_baytrail_legacy_machines[] = {
8760046406SPierre-Louis Bossart 	{
8860046406SPierre-Louis Bossart 		.id = "10EC5640",
8960046406SPierre-Louis Bossart 		.drv_name = "byt-rt5640",
9060046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_0f28.bin-48kHz_i2s_master",
9160046406SPierre-Louis Bossart 	},
9260046406SPierre-Louis Bossart 	{
9360046406SPierre-Louis Bossart 		.id = "193C9890",
9460046406SPierre-Louis Bossart 		.drv_name = "byt-max98090",
9560046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_0f28.bin-48kHz_i2s_master",
9660046406SPierre-Louis Bossart 	},
9760046406SPierre-Louis Bossart 	{}
9860046406SPierre-Louis Bossart };
9960046406SPierre-Louis Bossart EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_baytrail_legacy_machines);
10060046406SPierre-Louis Bossart 
10160046406SPierre-Louis Bossart struct snd_soc_acpi_mach  snd_soc_acpi_intel_baytrail_machines[] = {
10260046406SPierre-Louis Bossart 	{
10360046406SPierre-Louis Bossart 		.id = "10EC5640",
10460046406SPierre-Louis Bossart 		.drv_name = "bytcr_rt5640",
10560046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_0f28.bin",
10660046406SPierre-Louis Bossart 		.board = "bytcr_rt5640",
10760046406SPierre-Louis Bossart 		.machine_quirk = byt_quirk,
1084f722a6aSPierre-Louis Bossart 		.sof_fw_filename = "intel/sof-byt.ri",
1094f722a6aSPierre-Louis Bossart 		.sof_tplg_filename = "intel/sof-byt-rt5640.tplg",
110c1a8ed69SPierre-Louis Bossart 		.asoc_plat_name = "sst-mfld-platform",
11160046406SPierre-Louis Bossart 	},
11260046406SPierre-Louis Bossart 	{
11360046406SPierre-Louis Bossart 		.id = "10EC5642",
11460046406SPierre-Louis Bossart 		.drv_name = "bytcr_rt5640",
11560046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_0f28.bin",
11660046406SPierre-Louis Bossart 		.board = "bytcr_rt5640",
1174f722a6aSPierre-Louis Bossart 		.sof_fw_filename = "intel/sof-byt.ri",
1184f722a6aSPierre-Louis Bossart 		.sof_tplg_filename = "intel/sof-byt-rt5640.tplg",
119c1a8ed69SPierre-Louis Bossart 		.asoc_plat_name = "sst-mfld-platform",
12060046406SPierre-Louis Bossart 	},
12160046406SPierre-Louis Bossart 	{
12260046406SPierre-Louis Bossart 		.id = "INTCCFFD",
12360046406SPierre-Louis Bossart 		.drv_name = "bytcr_rt5640",
12460046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_0f28.bin",
12560046406SPierre-Louis Bossart 		.board = "bytcr_rt5640",
1264f722a6aSPierre-Louis Bossart 		.sof_fw_filename = "intel/sof-byt.ri",
1274f722a6aSPierre-Louis Bossart 		.sof_tplg_filename = "intel/sof-byt-rt5640.tplg",
128c1a8ed69SPierre-Louis Bossart 		.asoc_plat_name = "sst-mfld-platform",
12960046406SPierre-Louis Bossart 	},
13060046406SPierre-Louis Bossart 	{
13160046406SPierre-Louis Bossart 		.id = "10EC5651",
13260046406SPierre-Louis Bossart 		.drv_name = "bytcr_rt5651",
13360046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_0f28.bin",
13460046406SPierre-Louis Bossart 		.board = "bytcr_rt5651",
1354f722a6aSPierre-Louis Bossart 		.sof_fw_filename = "intel/sof-byt.ri",
1364f722a6aSPierre-Louis Bossart 		.sof_tplg_filename = "intel/sof-byt-rt5651.tplg",
137c1a8ed69SPierre-Louis Bossart 		.asoc_plat_name = "sst-mfld-platform",
13860046406SPierre-Louis Bossart 	},
13960046406SPierre-Louis Bossart 	{
14060046406SPierre-Louis Bossart 		.id = "DLGS7212",
14160046406SPierre-Louis Bossart 		.drv_name = "bytcht_da7213",
14260046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_0f28.bin",
14360046406SPierre-Louis Bossart 		.board = "bytcht_da7213",
1444f722a6aSPierre-Louis Bossart 		.sof_fw_filename = "intel/sof-byt.ri",
1454f722a6aSPierre-Louis Bossart 		.sof_tplg_filename = "intel/sof-byt-da7213.tplg",
146c1a8ed69SPierre-Louis Bossart 		.asoc_plat_name = "sst-mfld-platform",
14760046406SPierre-Louis Bossart 	},
14860046406SPierre-Louis Bossart 	{
14960046406SPierre-Louis Bossart 		.id = "DLGS7213",
15060046406SPierre-Louis Bossart 		.drv_name = "bytcht_da7213",
15160046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_0f28.bin",
15260046406SPierre-Louis Bossart 		.board = "bytcht_da7213",
1534f722a6aSPierre-Louis Bossart 		.sof_fw_filename = "intel/sof-byt.ri",
1544f722a6aSPierre-Louis Bossart 		.sof_tplg_filename = "intel/sof-byt-da7213.tplg",
155c1a8ed69SPierre-Louis Bossart 		.asoc_plat_name = "sst-mfld-platform",
15660046406SPierre-Louis Bossart 	},
15760046406SPierre-Louis Bossart 	/* some Baytrail platforms rely on RT5645, use CHT machine driver */
15860046406SPierre-Louis Bossart 	{
15960046406SPierre-Louis Bossart 		.id = "10EC5645",
16060046406SPierre-Louis Bossart 		.drv_name = "cht-bsw-rt5645",
16160046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_0f28.bin",
16260046406SPierre-Louis Bossart 		.board = "cht-bsw",
1634f722a6aSPierre-Louis Bossart 		.sof_fw_filename = "intel/sof-byt.ri",
1644f722a6aSPierre-Louis Bossart 		.sof_tplg_filename = "intel/sof-byt-rt5645.tplg",
165c1a8ed69SPierre-Louis Bossart 		.asoc_plat_name = "sst-mfld-platform",
16660046406SPierre-Louis Bossart 	},
16760046406SPierre-Louis Bossart 	{
16860046406SPierre-Louis Bossart 		.id = "10EC5648",
16960046406SPierre-Louis Bossart 		.drv_name = "cht-bsw-rt5645",
17060046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_0f28.bin",
17160046406SPierre-Louis Bossart 		.board = "cht-bsw",
1724f722a6aSPierre-Louis Bossart 		.sof_fw_filename = "intel/sof-byt.ri",
1734f722a6aSPierre-Louis Bossart 		.sof_tplg_filename = "intel/sof-byt-rt5645.tplg",
174c1a8ed69SPierre-Louis Bossart 		.asoc_plat_name = "sst-mfld-platform",
17560046406SPierre-Louis Bossart 	},
17660046406SPierre-Louis Bossart 	/* use CHT driver to Baytrail Chromebooks */
17760046406SPierre-Louis Bossart 	{
17860046406SPierre-Louis Bossart 		.id = "193C9890",
17960046406SPierre-Louis Bossart 		.drv_name = "cht-bsw-max98090",
18060046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_0f28.bin",
18160046406SPierre-Louis Bossart 		.board = "cht-bsw",
1824f722a6aSPierre-Louis Bossart 		.sof_fw_filename = "intel/sof-byt.ri",
1834f722a6aSPierre-Louis Bossart 		.sof_tplg_filename = "intel/sof-byt-max98090.tplg",
184c1a8ed69SPierre-Louis Bossart 		.asoc_plat_name = "sst-mfld-platform",
18560046406SPierre-Louis Bossart 	},
18660046406SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH)
18760046406SPierre-Louis Bossart 	/*
18860046406SPierre-Louis Bossart 	 * This is always last in the table so that it is selected only when
18960046406SPierre-Louis Bossart 	 * enabled explicitly and there is no codec-related information in SSDT
19060046406SPierre-Louis Bossart 	 */
19160046406SPierre-Louis Bossart 	{
19260046406SPierre-Louis Bossart 		.id = "80860F28",
19360046406SPierre-Louis Bossart 		.drv_name = "bytcht_nocodec",
19460046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_0f28.bin",
19560046406SPierre-Louis Bossart 		.board = "bytcht_nocodec",
19660046406SPierre-Louis Bossart 	},
19760046406SPierre-Louis Bossart #endif
19860046406SPierre-Louis Bossart 	{},
19960046406SPierre-Louis Bossart };
20060046406SPierre-Louis Bossart EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_baytrail_machines);
20160046406SPierre-Louis Bossart 
20260046406SPierre-Louis Bossart MODULE_LICENSE("GPL v2");
20360046406SPierre-Louis Bossart MODULE_DESCRIPTION("Intel Common ACPI Match module");
204