[AMD Public Use] > -----Original Message----- > From: Vijendar Mukunda <Vijendar.Mukunda@xxxxxxx> > Sent: Tuesday, June 23, 2020 4:27 PM > To: perex@xxxxxxxx; alsa-devel@xxxxxxxxxxxxxxxx > Cc: Deucher, Alexander <Alexander.Deucher@xxxxxxx>; Arya, Virendra- > Pratap <Virendra-Pratap.Arya@xxxxxxx>; hui.wang@xxxxxxxxxxxxx; > Mukunda, Vijendar <Vijendar.Mukunda@xxxxxxx> > Subject: [PATCH] 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: Vijendar Mukunda <Vijendar.Mukunda@xxxxxxx> Reviewed-by: Alex Deucher <alexander.deucher@xxxxxxx> > --- > sound/soc/amd/renoir/rn-pci-acp3x.c | 29 > +++++++++++++++++++++++++++++ > sound/soc/amd/renoir/rn_acp3x.h | 2 ++ > 2 files changed, 31 insertions(+) > > diff --git a/sound/soc/amd/renoir/rn-pci-acp3x.c > b/sound/soc/amd/renoir/rn-pci-acp3x.c > index 859ed67..faa7566 100644 > --- a/sound/soc/amd/renoir/rn-pci-acp3x.c > +++ b/sound/soc/amd/renoir/rn-pci-acp3x.c > @@ -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, int, 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); > diff --git a/sound/soc/amd/renoir/rn_acp3x.h > b/sound/soc/amd/renoir/rn_acp3x.h index 75228e3..1462039 100644 > --- a/sound/soc/amd/renoir/rn_acp3x.h > +++ b/sound/soc/amd/renoir/rn_acp3x.h > @@ -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; > -- > 2.7.4