236 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * soc-acpi-intel-cht-match.c - tables and support for CHT ACPI enumeration.4 *5 * Copyright (c) 2017, Intel Corporation.6 */7 8#include <linux/dmi.h>9#include <sound/soc-acpi.h>10#include <sound/soc-acpi-intel-match.h>11 12static unsigned long cht_machine_id;13 14#define CHT_SURFACE_MACH 115 16static int cht_surface_quirk_cb(const struct dmi_system_id *id)17{18 cht_machine_id = CHT_SURFACE_MACH;19 return 1;20}21 22static const struct dmi_system_id cht_table[] = {23 {24 .callback = cht_surface_quirk_cb,25 .matches = {26 DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),27 DMI_MATCH(DMI_PRODUCT_NAME, "Surface 3"),28 },29 },30 { }31};32 33static struct snd_soc_acpi_mach cht_surface_mach = {34 .id = "10EC5640",35 .drv_name = "cht-bsw-rt5645",36 .fw_filename = "intel/fw_sst_22a8.bin",37 .board = "cht-bsw",38 .sof_tplg_filename = "sof-cht-rt5645.tplg",39};40 41static struct snd_soc_acpi_mach *cht_quirk(void *arg)42{43 struct snd_soc_acpi_mach *mach = arg;44 45 dmi_check_system(cht_table);46 47 if (cht_machine_id == CHT_SURFACE_MACH)48 return &cht_surface_mach;49 else50 return mach;51}52 53/*54 * Some tablets with Android factory OS have buggy DSDTs with an ESSX8316 device55 * in the ACPI tables. While they are not using an ESS8316 codec. These DSDTs56 * also have an ACPI device for the correct codec, ignore the ESSX8316.57 */58static const struct dmi_system_id cht_ess8316_not_present_table[] = {59 {60 /* Nextbook Ares 8A */61 .matches = {62 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"),63 DMI_MATCH(DMI_PRODUCT_NAME, "CherryTrail"),64 DMI_MATCH(DMI_BIOS_VERSION, "M882"),65 },66 },67 { }68};69 70static struct snd_soc_acpi_mach *cht_ess8316_quirk(void *arg)71{72 if (dmi_check_system(cht_ess8316_not_present_table))73 return NULL;74 75 return arg;76}77 78/*79 * The Lenovo Yoga Tab 3 Pro YT3-X90, with Android factory OS has a buggy DSDT80 * with the coded not being listed at all.81 */82static const struct dmi_system_id lenovo_yoga_tab3_x90[] = {83 {84 /* Lenovo Yoga Tab 3 Pro YT3-X90, codec missing from DSDT */85 .matches = {86 DMI_MATCH(DMI_SYS_VENDOR, "Intel Corporation"),87 DMI_MATCH(DMI_PRODUCT_VERSION, "Blade3-10A-001"),88 },89 },90 { }91};92 93static struct snd_soc_acpi_mach cht_lenovo_yoga_tab3_x90_mach = {94 .id = "10WM5102",95 .drv_name = "bytcr_wm5102",96 .fw_filename = "intel/fw_sst_22a8.bin",97 .board = "bytcr_wm5102",98 .sof_tplg_filename = "sof-cht-wm5102.tplg",99};100 101static struct snd_soc_acpi_mach *lenovo_yt3_x90_quirk(void *arg)102{103 if (dmi_check_system(lenovo_yoga_tab3_x90))104 return &cht_lenovo_yoga_tab3_x90_mach;105 106 /* Skip wildcard match snd_soc_acpi_intel_cherrytrail_machines[] entry */107 return NULL;108}109 110static const struct snd_soc_acpi_codecs rt5640_comp_ids = {111 .num_codecs = 2,112 .codecs = { "10EC5640", "10EC3276" },113};114 115static const struct snd_soc_acpi_codecs rt5670_comp_ids = {116 .num_codecs = 2,117 .codecs = { "10EC5670", "10EC5672" },118};119 120static const struct snd_soc_acpi_codecs rt5645_comp_ids = {121 .num_codecs = 3,122 .codecs = { "10EC5645", "10EC5650", "10EC3270" },123};124 125static const struct snd_soc_acpi_codecs da7213_comp_ids = {126 .num_codecs = 2,127 .codecs = { "DGLS7212", "DGLS7213"},128 129};130 131/* Cherryview-based platforms: CherryTrail and Braswell */132struct snd_soc_acpi_mach snd_soc_acpi_intel_cherrytrail_machines[] = {133 {134 .comp_ids = &rt5670_comp_ids,135 .drv_name = "cht-bsw-rt5672",136 .fw_filename = "intel/fw_sst_22a8.bin",137 .board = "cht-bsw",138 .sof_tplg_filename = "sof-cht-rt5670.tplg",139 },140 {141 .comp_ids = &rt5645_comp_ids,142 .drv_name = "cht-bsw-rt5645",143 .fw_filename = "intel/fw_sst_22a8.bin",144 .board = "cht-bsw",145 .sof_tplg_filename = "sof-cht-rt5645.tplg",146 },147 {148 .id = "193C9890",149 .drv_name = "cht-bsw-max98090",150 .fw_filename = "intel/fw_sst_22a8.bin",151 .board = "cht-bsw",152 .sof_tplg_filename = "sof-cht-max98090.tplg",153 },154 {155 .id = "10508824",156 .drv_name = "cht-bsw-nau8824",157 .fw_filename = "intel/fw_sst_22a8.bin",158 .board = "cht-bsw",159 .sof_tplg_filename = "sof-cht-nau8824.tplg",160 },161 {162 .comp_ids = &da7213_comp_ids,163 .drv_name = "bytcht_da7213",164 .fw_filename = "intel/fw_sst_22a8.bin",165 .board = "bytcht_da7213",166 .sof_tplg_filename = "sof-cht-da7213.tplg",167 },168 {169 .id = "ESSX8316",170 .drv_name = "bytcht_es8316",171 .fw_filename = "intel/fw_sst_22a8.bin",172 .board = "bytcht_es8316",173 .machine_quirk = cht_ess8316_quirk,174 .sof_tplg_filename = "sof-cht-es8316.tplg",175 },176 /* some CHT-T platforms rely on RT5640, use Baytrail machine driver */177 {178 .comp_ids = &rt5640_comp_ids,179 .drv_name = "bytcr_rt5640",180 .fw_filename = "intel/fw_sst_22a8.bin",181 .board = "bytcr_rt5640",182 .machine_quirk = cht_quirk,183 .sof_tplg_filename = "sof-cht-rt5640.tplg",184 },185 {186 .id = "10EC5682",187 .drv_name = "sof_rt5682",188 .sof_tplg_filename = "sof-cht-rt5682.tplg",189 },190 /* some CHT-T platforms rely on RT5651, use Baytrail machine driver */191 {192 .id = "10EC5651",193 .drv_name = "bytcr_rt5651",194 .fw_filename = "intel/fw_sst_22a8.bin",195 .board = "bytcr_rt5651",196 .sof_tplg_filename = "sof-cht-rt5651.tplg",197 },198 {199 .id = "14F10720",200 .drv_name = "bytcht_cx2072x",201 .fw_filename = "intel/fw_sst_22a8.bin",202 .board = "bytcht_cx2072x",203 .sof_tplg_filename = "sof-cht-cx2072x.tplg",204 },205 {206 .id = "104C5122",207 .drv_name = "sof_pcm512x",208 .sof_tplg_filename = "sof-cht-src-50khz-pcm512x.tplg",209 },210 /*211 * Special case for the Lenovo Yoga Tab 3 Pro YT3-X90 where the DSDT212 * misses the codec. Match on the SST id instead, lenovo_yt3_x90_quirk()213 * will return a YT3 specific mach or NULL when called on other hw,214 * skipping this entry.215 */216 {217 .id = "808622A8",218 .machine_quirk = lenovo_yt3_x90_quirk,219 },220 221#if IS_ENABLED(CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH)222 /*223 * This is always last in the table so that it is selected only when224 * enabled explicitly and there is no codec-related information in SSDT225 */226 {227 .id = "808622A8",228 .drv_name = "bytcht_nocodec",229 .fw_filename = "intel/fw_sst_22a8.bin",230 .board = "bytcht_nocodec",231 },232#endif233 {},234};235EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_cherrytrail_machines);236