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