From: Hans de Goede <hdego...@redhat.com>

[ Upstream commit 8ade6d8b02b1ead741bd4f6c42921035caab6560 ]

Some Bay Trail systems:
1. Use a non CR version of the Bay Trail SoC
2. Contain at least 6 interrupt resources so that the
   platform_get_resource(pdev, IORESOURCE_IRQ, 5) check to workaround
   non CR systems which list their IPC IRQ at index 0 despite being
   non CR does not work
3. Despite 1. and 2. still have their IPC IRQ at index 0 rather then 5

Add a DMI quirk table to check for the few known models with this issue,
so that the right IPC IRQ index is used on these systems.

Reviewed-by: Andy Shevchenko <andy.shevche...@gmail.com>
Acked-by: Pierre-Louis Bossart <pierre-louis.boss...@linux.intel.com>
Signed-off-by: Hans de Goede <hdego...@redhat.com>
Link: https://lore.kernel.org/r/20210120214957.140232-5-hdego...@redhat.com
Signed-off-by: Mark Brown <broo...@kernel.org>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 sound/soc/intel/common/soc-intel-quirks.h | 25 +++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/sound/soc/intel/common/soc-intel-quirks.h 
b/sound/soc/intel/common/soc-intel-quirks.h
index b07df3059926d..a93987ab7f4d7 100644
--- a/sound/soc/intel/common/soc-intel-quirks.h
+++ b/sound/soc/intel/common/soc-intel-quirks.h
@@ -11,6 +11,7 @@
 
 #if IS_ENABLED(CONFIG_X86)
 
+#include <linux/dmi.h>
 #include <asm/cpu_device_id.h>
 #include <asm/intel-family.h>
 #include <asm/iosf_mbi.h>
@@ -38,12 +39,36 @@ SOC_INTEL_IS_CPU(cml, KABYLAKE_L);
 
 static inline bool soc_intel_is_byt_cr(struct platform_device *pdev)
 {
+       /*
+        * List of systems which:
+        * 1. Use a non CR version of the Bay Trail SoC
+        * 2. Contain at least 6 interrupt resources so that the
+        *    platform_get_resource(pdev, IORESOURCE_IRQ, 5) check below
+        *    succeeds
+        * 3. Despite 1. and 2. still have their IPC IRQ at index 0 rather then 
5
+        *
+        * This needs to be here so that it can be shared between the SST and
+        * SOF drivers. We rely on the compiler to optimize this out in files
+        * where soc_intel_is_byt_cr is not used.
+        */
+       static const struct dmi_system_id force_bytcr_table[] = {
+               {       /* Lenovo Yoga Tablet 2 series */
+                       .matches = {
+                               DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+                               DMI_MATCH(DMI_PRODUCT_FAMILY, "YOGATablet2"),
+                       },
+               },
+               {}
+       };
        struct device *dev = &pdev->dev;
        int status = 0;
 
        if (!soc_intel_is_byt())
                return false;
 
+       if (dmi_check_system(force_bytcr_table))
+               return true;
+
        if (iosf_mbi_available()) {
                u32 bios_status;
 
-- 
2.27.0

Reply via email to