ASoC: amd: add logic to check dmic hardware runtime
authorVijendar Mukunda <Vijendar.Mukunda@amd.com>
Thu, 2 Jul 2020 17:26:52 +0000 (22:56 +0530)
committerMark Brown <broonie@kernel.org>
Fri, 3 Jul 2020 16:33:45 +0000 (17:33 +0100)
Add logic to check DMIC hardware exists or not on
the platform at runtime.

Add module param for overriding DMIC hardware check
at runtime.

Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
Link: https://lore.kernel.org/r/1593710826-1106-1-git-send-email-Vijendar.Mukunda@amd.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/amd/renoir/rn-pci-acp3x.c
sound/soc/amd/renoir/rn_acp3x.h

index 859ed67b93cfff1199fcd60a54d98cb5574da08e..d1faea545f45c4f67a838a597d43b133cf249f46 100644 (file)
@@ -5,6 +5,7 @@
 //Copyright 2020 Advanced Micro Devices, Inc.
 
 #include <linux/pci.h>
+#include <linux/acpi.h>
 #include <linux/module.h>
 #include <linux/io.h>
 #include <linux/delay.h>
@@ -18,6 +19,16 @@ static int acp_power_gating;
 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
+ */
+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");
+
 struct acp_dev_data {
        void __iomem *acp_base;
        struct resource *res;
@@ -157,6 +168,8 @@ static int snd_rn_acp_probe(struct pci_dev *pci,
 {
        struct acp_dev_data *adata;
        struct platform_device_info pdevinfo[ACP_DEVS];
+       acpi_handle handle;
+       acpi_integer dmic_status;
        unsigned int irqflags;
        int ret, index;
        u32 addr;
@@ -201,6 +214,22 @@ static int snd_rn_acp_probe(struct pci_dev *pci,
        if (ret)
                goto disable_msi;
 
+       if (!dmic_acpi_check) {
+               ret = -ENODEV;
+               goto de_init;
+       } else if (dmic_acpi_check == ACP_DMIC_AUTO) {
+               handle = ACPI_HANDLE(&pci->dev);
+               ret = acpi_evaluate_integer(handle, "_WOV", NULL, &dmic_status);
+               if (ACPI_FAILURE(ret)) {
+                       ret = -EINVAL;
+                       goto de_init;
+               }
+               if (!dmic_status) {
+                       ret = -ENODEV;
+                       goto de_init;
+               }
+       }
+
        adata->res = devm_kzalloc(&pci->dev,
                                  sizeof(struct resource) * 2,
                                  GFP_KERNEL);
index 75228e306e0b4693f87dbd3f6a1b24114d636861..14620399d766c43f4a5c3d54dfe2e45abbf67653 100644 (file)
@@ -55,6 +55,8 @@
 
 #define MAX_BUFFER (CAPTURE_MAX_PERIOD_SIZE * CAPTURE_MAX_NUM_PERIODS)
 #define MIN_BUFFER MAX_BUFFER
+#define        ACP_DMIC_AUTO   -1
+
 struct pdm_dev_data {
        u32 pdm_irq;
        void __iomem *acp_base;