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
24d3dcc588SHans de Goede #define BYT_POV_P1006W   2
2560046406SPierre-Louis Bossart 
2660046406SPierre-Louis Bossart static int byt_thinkpad10_quirk_cb(const struct dmi_system_id *id)
2760046406SPierre-Louis Bossart {
2860046406SPierre-Louis Bossart 	byt_machine_id = BYT_THINKPAD_10;
2960046406SPierre-Louis Bossart 	return 1;
3060046406SPierre-Louis Bossart }
3160046406SPierre-Louis Bossart 
32d3dcc588SHans de Goede static int byt_pov_p1006w_quirk_cb(const struct dmi_system_id *id)
33d3dcc588SHans de Goede {
34d3dcc588SHans de Goede 	byt_machine_id = BYT_POV_P1006W;
35d3dcc588SHans de Goede 	return 1;
36d3dcc588SHans de Goede }
3760046406SPierre-Louis Bossart 
3860046406SPierre-Louis Bossart static const struct dmi_system_id byt_table[] = {
3960046406SPierre-Louis Bossart 	{
4060046406SPierre-Louis Bossart 		.callback = byt_thinkpad10_quirk_cb,
4160046406SPierre-Louis Bossart 		.matches = {
4260046406SPierre-Louis Bossart 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
432ca426a2SHans de Goede 			DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad 8"),
442ca426a2SHans de Goede 		},
452ca426a2SHans de Goede 	},
462ca426a2SHans de Goede 	{
472ca426a2SHans de Goede 		.callback = byt_thinkpad10_quirk_cb,
482ca426a2SHans de Goede 		.matches = {
492ca426a2SHans de Goede 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
5060046406SPierre-Louis Bossart 			DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad 10"),
5160046406SPierre-Louis Bossart 		},
5260046406SPierre-Louis Bossart 	},
5360046406SPierre-Louis Bossart 	{
5460046406SPierre-Louis Bossart 		.callback = byt_thinkpad10_quirk_cb,
5560046406SPierre-Louis Bossart 		.matches = {
5660046406SPierre-Louis Bossart 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
5760046406SPierre-Louis Bossart 			DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad Tablet B"),
5860046406SPierre-Louis Bossart 		},
5960046406SPierre-Louis Bossart 	},
6060046406SPierre-Louis Bossart 	{
6160046406SPierre-Louis Bossart 		.callback = byt_thinkpad10_quirk_cb,
6260046406SPierre-Louis Bossart 		.matches = {
6360046406SPierre-Louis Bossart 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
6460046406SPierre-Louis Bossart 			DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Miix 2 10"),
6560046406SPierre-Louis Bossart 		},
6660046406SPierre-Louis Bossart 	},
67d3dcc588SHans de Goede 	{
68d3dcc588SHans de Goede 		/* Point of View mobii wintab p1006w (v1.0) */
69d3dcc588SHans de Goede 		.callback = byt_pov_p1006w_quirk_cb,
70d3dcc588SHans de Goede 		.matches = {
71d3dcc588SHans de Goede 			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Insyde"),
72d3dcc588SHans de Goede 			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "BayTrail"),
73d3dcc588SHans de Goede 			/* Note 105b is Foxcon's USB/PCI vendor id */
74d3dcc588SHans de Goede 			DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "105B"),
75d3dcc588SHans de Goede 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "0E57"),
76d3dcc588SHans de Goede 		},
77d3dcc588SHans de Goede 	},
7860046406SPierre-Louis Bossart 	{ }
7960046406SPierre-Louis Bossart };
8060046406SPierre-Louis Bossart 
8160046406SPierre-Louis Bossart static struct snd_soc_acpi_mach byt_thinkpad_10 = {
8260046406SPierre-Louis Bossart 	.id = "10EC5640",
8360046406SPierre-Louis Bossart 	.drv_name = "cht-bsw-rt5672",
8460046406SPierre-Louis Bossart 	.fw_filename = "intel/fw_sst_0f28.bin",
8560046406SPierre-Louis Bossart 	.board = "cht-bsw",
864f722a6aSPierre-Louis Bossart 	.sof_fw_filename = "intel/sof-byt.ri",
874f722a6aSPierre-Louis Bossart 	.sof_tplg_filename = "intel/sof-byt-rt5670.tplg",
88c1a8ed69SPierre-Louis Bossart 	.asoc_plat_name = "sst-mfld-platform",
8960046406SPierre-Louis Bossart };
9060046406SPierre-Louis Bossart 
91d3dcc588SHans de Goede static struct snd_soc_acpi_mach byt_pov_p1006w = {
92d3dcc588SHans de Goede 	.id = "10EC5640",
93d3dcc588SHans de Goede 	.drv_name = "bytcr_rt5651",
94d3dcc588SHans de Goede 	.fw_filename = "intel/fw_sst_0f28.bin",
95d3dcc588SHans de Goede 	.board = "bytcr_rt5651",
96d3dcc588SHans de Goede 	.sof_fw_filename = "intel/sof-byt.ri",
97d3dcc588SHans de Goede 	.sof_tplg_filename = "intel/sof-byt-rt5651.tplg",
98d3dcc588SHans de Goede 	.asoc_plat_name = "sst-mfld-platform",
99d3dcc588SHans de Goede };
100d3dcc588SHans de Goede 
10160046406SPierre-Louis Bossart static struct snd_soc_acpi_mach *byt_quirk(void *arg)
10260046406SPierre-Louis Bossart {
10360046406SPierre-Louis Bossart 	struct snd_soc_acpi_mach *mach = arg;
10460046406SPierre-Louis Bossart 
10560046406SPierre-Louis Bossart 	dmi_check_system(byt_table);
10660046406SPierre-Louis Bossart 
107d3dcc588SHans de Goede 	switch (byt_machine_id) {
108d3dcc588SHans de Goede 	case BYT_THINKPAD_10:
10960046406SPierre-Louis Bossart 		return &byt_thinkpad_10;
110d3dcc588SHans de Goede 	case BYT_POV_P1006W:
111d3dcc588SHans de Goede 		return &byt_pov_p1006w;
112d3dcc588SHans de Goede 	default:
11360046406SPierre-Louis Bossart 		return mach;
11460046406SPierre-Louis Bossart 	}
115d3dcc588SHans de Goede }
11660046406SPierre-Louis Bossart 
11760046406SPierre-Louis Bossart struct snd_soc_acpi_mach snd_soc_acpi_intel_baytrail_legacy_machines[] = {
11860046406SPierre-Louis Bossart 	{
11960046406SPierre-Louis Bossart 		.id = "10EC5640",
12060046406SPierre-Louis Bossart 		.drv_name = "byt-rt5640",
12160046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_0f28.bin-48kHz_i2s_master",
12260046406SPierre-Louis Bossart 	},
12360046406SPierre-Louis Bossart 	{
12460046406SPierre-Louis Bossart 		.id = "193C9890",
12560046406SPierre-Louis Bossart 		.drv_name = "byt-max98090",
12660046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_0f28.bin-48kHz_i2s_master",
12760046406SPierre-Louis Bossart 	},
12860046406SPierre-Louis Bossart 	{}
12960046406SPierre-Louis Bossart };
13060046406SPierre-Louis Bossart EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_baytrail_legacy_machines);
13160046406SPierre-Louis Bossart 
13260046406SPierre-Louis Bossart struct snd_soc_acpi_mach  snd_soc_acpi_intel_baytrail_machines[] = {
13360046406SPierre-Louis Bossart 	{
13460046406SPierre-Louis Bossart 		.id = "10EC5640",
13560046406SPierre-Louis Bossart 		.drv_name = "bytcr_rt5640",
13660046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_0f28.bin",
13760046406SPierre-Louis Bossart 		.board = "bytcr_rt5640",
13860046406SPierre-Louis Bossart 		.machine_quirk = byt_quirk,
1394f722a6aSPierre-Louis Bossart 		.sof_fw_filename = "intel/sof-byt.ri",
1404f722a6aSPierre-Louis Bossart 		.sof_tplg_filename = "intel/sof-byt-rt5640.tplg",
141c1a8ed69SPierre-Louis Bossart 		.asoc_plat_name = "sst-mfld-platform",
14260046406SPierre-Louis Bossart 	},
14360046406SPierre-Louis Bossart 	{
14460046406SPierre-Louis Bossart 		.id = "10EC5642",
14560046406SPierre-Louis Bossart 		.drv_name = "bytcr_rt5640",
14660046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_0f28.bin",
14760046406SPierre-Louis Bossart 		.board = "bytcr_rt5640",
1484f722a6aSPierre-Louis Bossart 		.sof_fw_filename = "intel/sof-byt.ri",
1494f722a6aSPierre-Louis Bossart 		.sof_tplg_filename = "intel/sof-byt-rt5640.tplg",
150c1a8ed69SPierre-Louis Bossart 		.asoc_plat_name = "sst-mfld-platform",
15160046406SPierre-Louis Bossart 	},
15260046406SPierre-Louis Bossart 	{
15360046406SPierre-Louis Bossart 		.id = "INTCCFFD",
15460046406SPierre-Louis Bossart 		.drv_name = "bytcr_rt5640",
15560046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_0f28.bin",
15660046406SPierre-Louis Bossart 		.board = "bytcr_rt5640",
1574f722a6aSPierre-Louis Bossart 		.sof_fw_filename = "intel/sof-byt.ri",
1584f722a6aSPierre-Louis Bossart 		.sof_tplg_filename = "intel/sof-byt-rt5640.tplg",
159c1a8ed69SPierre-Louis Bossart 		.asoc_plat_name = "sst-mfld-platform",
16060046406SPierre-Louis Bossart 	},
16160046406SPierre-Louis Bossart 	{
16260046406SPierre-Louis Bossart 		.id = "10EC5651",
16360046406SPierre-Louis Bossart 		.drv_name = "bytcr_rt5651",
16460046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_0f28.bin",
16560046406SPierre-Louis Bossart 		.board = "bytcr_rt5651",
1664f722a6aSPierre-Louis Bossart 		.sof_fw_filename = "intel/sof-byt.ri",
1674f722a6aSPierre-Louis Bossart 		.sof_tplg_filename = "intel/sof-byt-rt5651.tplg",
168c1a8ed69SPierre-Louis Bossart 		.asoc_plat_name = "sst-mfld-platform",
16960046406SPierre-Louis Bossart 	},
17060046406SPierre-Louis Bossart 	{
17160046406SPierre-Louis Bossart 		.id = "DLGS7212",
17260046406SPierre-Louis Bossart 		.drv_name = "bytcht_da7213",
17360046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_0f28.bin",
17460046406SPierre-Louis Bossart 		.board = "bytcht_da7213",
1754f722a6aSPierre-Louis Bossart 		.sof_fw_filename = "intel/sof-byt.ri",
1764f722a6aSPierre-Louis Bossart 		.sof_tplg_filename = "intel/sof-byt-da7213.tplg",
177c1a8ed69SPierre-Louis Bossart 		.asoc_plat_name = "sst-mfld-platform",
17860046406SPierre-Louis Bossart 	},
17960046406SPierre-Louis Bossart 	{
18060046406SPierre-Louis Bossart 		.id = "DLGS7213",
18160046406SPierre-Louis Bossart 		.drv_name = "bytcht_da7213",
18260046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_0f28.bin",
18360046406SPierre-Louis Bossart 		.board = "bytcht_da7213",
1844f722a6aSPierre-Louis Bossart 		.sof_fw_filename = "intel/sof-byt.ri",
1854f722a6aSPierre-Louis Bossart 		.sof_tplg_filename = "intel/sof-byt-da7213.tplg",
186c1a8ed69SPierre-Louis Bossart 		.asoc_plat_name = "sst-mfld-platform",
18760046406SPierre-Louis Bossart 	},
1885198baf8SHans de Goede 	{
1895198baf8SHans de Goede 		.id = "ESSX8316",
1905198baf8SHans de Goede 		.drv_name = "bytcht_es8316",
1915198baf8SHans de Goede 		.fw_filename = "intel/fw_sst_0f28.bin",
1925198baf8SHans de Goede 		.board = "bytcht_es8316",
1935198baf8SHans de Goede 		.sof_fw_filename = "intel/sof-byt.ri",
1945198baf8SHans de Goede 		.sof_tplg_filename = "intel/sof-byt-es8316.tplg",
1955198baf8SHans de Goede 		.asoc_plat_name = "sst-mfld-platform",
1965198baf8SHans de Goede 	},
19760046406SPierre-Louis Bossart 	/* some Baytrail platforms rely on RT5645, use CHT machine driver */
19860046406SPierre-Louis Bossart 	{
19960046406SPierre-Louis Bossart 		.id = "10EC5645",
20060046406SPierre-Louis Bossart 		.drv_name = "cht-bsw-rt5645",
20160046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_0f28.bin",
20260046406SPierre-Louis Bossart 		.board = "cht-bsw",
2034f722a6aSPierre-Louis Bossart 		.sof_fw_filename = "intel/sof-byt.ri",
2044f722a6aSPierre-Louis Bossart 		.sof_tplg_filename = "intel/sof-byt-rt5645.tplg",
205c1a8ed69SPierre-Louis Bossart 		.asoc_plat_name = "sst-mfld-platform",
20660046406SPierre-Louis Bossart 	},
20760046406SPierre-Louis Bossart 	{
20860046406SPierre-Louis Bossart 		.id = "10EC5648",
20960046406SPierre-Louis Bossart 		.drv_name = "cht-bsw-rt5645",
21060046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_0f28.bin",
21160046406SPierre-Louis Bossart 		.board = "cht-bsw",
2124f722a6aSPierre-Louis Bossart 		.sof_fw_filename = "intel/sof-byt.ri",
2134f722a6aSPierre-Louis Bossart 		.sof_tplg_filename = "intel/sof-byt-rt5645.tplg",
214c1a8ed69SPierre-Louis Bossart 		.asoc_plat_name = "sst-mfld-platform",
21560046406SPierre-Louis Bossart 	},
21660046406SPierre-Louis Bossart 	/* use CHT driver to Baytrail Chromebooks */
21760046406SPierre-Louis Bossart 	{
21860046406SPierre-Louis Bossart 		.id = "193C9890",
21960046406SPierre-Louis Bossart 		.drv_name = "cht-bsw-max98090",
22060046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_0f28.bin",
22160046406SPierre-Louis Bossart 		.board = "cht-bsw",
2224f722a6aSPierre-Louis Bossart 		.sof_fw_filename = "intel/sof-byt.ri",
2234f722a6aSPierre-Louis Bossart 		.sof_tplg_filename = "intel/sof-byt-max98090.tplg",
224c1a8ed69SPierre-Louis Bossart 		.asoc_plat_name = "sst-mfld-platform",
22560046406SPierre-Louis Bossart 	},
22660046406SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH)
22760046406SPierre-Louis Bossart 	/*
22860046406SPierre-Louis Bossart 	 * This is always last in the table so that it is selected only when
22960046406SPierre-Louis Bossart 	 * enabled explicitly and there is no codec-related information in SSDT
23060046406SPierre-Louis Bossart 	 */
23160046406SPierre-Louis Bossart 	{
23260046406SPierre-Louis Bossart 		.id = "80860F28",
23360046406SPierre-Louis Bossart 		.drv_name = "bytcht_nocodec",
23460046406SPierre-Louis Bossart 		.fw_filename = "intel/fw_sst_0f28.bin",
23560046406SPierre-Louis Bossart 		.board = "bytcht_nocodec",
23660046406SPierre-Louis Bossart 	},
23760046406SPierre-Louis Bossart #endif
23860046406SPierre-Louis Bossart 	{},
23960046406SPierre-Louis Bossart };
24060046406SPierre-Louis Bossart EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_baytrail_machines);
24160046406SPierre-Louis Bossart 
24260046406SPierre-Louis Bossart MODULE_LICENSE("GPL v2");
24360046406SPierre-Louis Bossart MODULE_DESCRIPTION("Intel Common ACPI Match module");
244