]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
ASoC: AMD Renoir - add DMI table to avoid the ACP mic probe (broken BIOS)
authorJaroslav Kysela <perex@perex.cz>
Tue, 8 Dec 2020 17:12:00 +0000 (18:12 +0100)
committerMark Brown <broonie@kernel.org>
Wed, 9 Dec 2020 14:45:58 +0000 (14:45 +0000)
Users reported that some Lenovo AMD platforms do not have ACP microphone,
but the BIOS advertises it via ACPI.

This patch create a simple DMI table, where those machines with the broken
BIOS can be added. The DMI description for Lenovo IdeaPad 5 and
IdeaPad Flex 5 devices are added there.

Also describe the dmic_acpi_check kernel module parameter in a more
understandable way.

Cc: <stable@kernel.org>
Cc: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
Cc: Mark Brown <broonie@kernel.org>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Link: https://lore.kernel.org/r/20201208171200.2737620-1-perex@perex.cz
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/amd/renoir/rn-pci-acp3x.c

index d9e6e49bff01caa9e13b3d37ea20550768014940..fa169bf09886fd046fef231230975e1aad11f461 100644 (file)
@@ -6,6 +6,7 @@
 
 #include <linux/pci.h>
 #include <linux/acpi.h>
+#include <linux/dmi.h>
 #include <linux/module.h>
 #include <linux/io.h>
 #include <linux/delay.h>
@@ -20,14 +21,13 @@ module_param(acp_power_gating, int, 0644);
 MODULE_PARM_DESC(acp_power_gating, "Enable acp power gating");
 
 /**
- * dmic_acpi_check = -1 - Checks ACPI method to know DMIC hardware status runtime
- *                 = 0 - Skips the DMIC device creation and returns probe failure
- *                 = 1 - Assumes that platform has DMIC support and skips ACPI
- *                       method check
+ * dmic_acpi_check = -1 - Use ACPI/DMI method to detect the DMIC hardware presence at runtime
+ *                 =  0 - Skip the DMIC device creation and return probe failure
+ *                 =  1 - Force DMIC support
  */
 static int dmic_acpi_check = ACP_DMIC_AUTO;
 module_param(dmic_acpi_check, bint, 0644);
-MODULE_PARM_DESC(dmic_acpi_check, "checks Dmic hardware runtime");
+MODULE_PARM_DESC(dmic_acpi_check, "Digital microphone presence (-1=auto, 0=none, 1=force)");
 
 struct acp_dev_data {
        void __iomem *acp_base;
@@ -163,6 +163,17 @@ static int rn_acp_deinit(void __iomem *acp_base)
        return 0;
 }
 
+static const struct dmi_system_id rn_acp_quirk_table[] = {
+       {
+               /* Lenovo IdeaPad Flex 5 14ARE05, IdeaPad 5 15ARE05 */
+               .matches = {
+                       DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
+                       DMI_EXACT_MATCH(DMI_BOARD_NAME, "LNVNB161216"),
+               }
+       },
+       {}
+};
+
 static int snd_rn_acp_probe(struct pci_dev *pci,
                            const struct pci_device_id *pci_id)
 {
@@ -172,6 +183,7 @@ static int snd_rn_acp_probe(struct pci_dev *pci,
        acpi_handle handle;
        acpi_integer dmic_status;
 #endif
+       const struct dmi_system_id *dmi_id;
        unsigned int irqflags;
        int ret, index;
        u32 addr;
@@ -236,6 +248,12 @@ static int snd_rn_acp_probe(struct pci_dev *pci,
                        goto de_init;
                }
 #endif
+               dmi_id = dmi_first_match(rn_acp_quirk_table);
+               if (dmi_id && !dmi_id->driver_data) {
+                       dev_info(&pci->dev, "ACPI settings override using DMI (ACP mic is not present)");
+                       ret = -ENODEV;
+                       goto de_init;
+               }
        }
 
        adata->res = devm_kzalloc(&pci->dev,