Commit 9e0d21e1 authored by Vijendar Mukunda's avatar Vijendar Mukunda Committed by Mark Brown

ASoC: amd: add logic to check dmic hardware runtime

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: default avatarVijendar Mukunda <Vijendar.Mukunda@amd.com>
Link: https://lore.kernel.org/r/1593710826-1106-1-git-send-email-Vijendar.Mukunda@amd.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 59b44649
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
//Copyright 2020 Advanced Micro Devices, Inc. //Copyright 2020 Advanced Micro Devices, Inc.
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/acpi.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/delay.h> #include <linux/delay.h>
...@@ -18,6 +19,16 @@ static int acp_power_gating; ...@@ -18,6 +19,16 @@ static int acp_power_gating;
module_param(acp_power_gating, int, 0644); module_param(acp_power_gating, int, 0644);
MODULE_PARM_DESC(acp_power_gating, "Enable acp power gating"); 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 { struct acp_dev_data {
void __iomem *acp_base; void __iomem *acp_base;
struct resource *res; struct resource *res;
...@@ -157,6 +168,8 @@ static int snd_rn_acp_probe(struct pci_dev *pci, ...@@ -157,6 +168,8 @@ static int snd_rn_acp_probe(struct pci_dev *pci,
{ {
struct acp_dev_data *adata; struct acp_dev_data *adata;
struct platform_device_info pdevinfo[ACP_DEVS]; struct platform_device_info pdevinfo[ACP_DEVS];
acpi_handle handle;
acpi_integer dmic_status;
unsigned int irqflags; unsigned int irqflags;
int ret, index; int ret, index;
u32 addr; u32 addr;
...@@ -201,6 +214,22 @@ static int snd_rn_acp_probe(struct pci_dev *pci, ...@@ -201,6 +214,22 @@ static int snd_rn_acp_probe(struct pci_dev *pci,
if (ret) if (ret)
goto disable_msi; 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, adata->res = devm_kzalloc(&pci->dev,
sizeof(struct resource) * 2, sizeof(struct resource) * 2,
GFP_KERNEL); GFP_KERNEL);
......
...@@ -55,6 +55,8 @@ ...@@ -55,6 +55,8 @@
#define MAX_BUFFER (CAPTURE_MAX_PERIOD_SIZE * CAPTURE_MAX_NUM_PERIODS) #define MAX_BUFFER (CAPTURE_MAX_PERIOD_SIZE * CAPTURE_MAX_NUM_PERIODS)
#define MIN_BUFFER MAX_BUFFER #define MIN_BUFFER MAX_BUFFER
#define ACP_DMIC_AUTO -1
struct pdm_dev_data { struct pdm_dev_data {
u32 pdm_irq; u32 pdm_irq;
void __iomem *acp_base; void __iomem *acp_base;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment