Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at master 235 lines 6.0 kB view raw
1// SPDX-License-Identifier: GPL-2.0-only 2/* 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 1 15 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 else 50 return mach; 51} 52 53/* 54 * Some tablets with Android factory OS have buggy DSDTs with an ESSX8316 device 55 * in the ACPI tables. While they are not using an ESS8316 codec. These DSDTs 56 * 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 DSDT 80 * 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 DSDT 212 * 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 when 224 * enabled explicitly and there is no codec-related information in SSDT 225 */ 226 { 227 .id = "808622A8", 228 .drv_name = "bytcht_nocodec", 229 .fw_filename = "intel/fw_sst_22a8.bin", 230 .board = "bytcht_nocodec", 231 }, 232#endif 233 {}, 234}; 235EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_cherrytrail_machines);