]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: amd: ps: Fix for enabling DMIC on acp63 platform via _DSD entry
authorVenkata Prasad Potturu <venkataprasad.potturu@amd.com>
Fri, 13 Dec 2024 06:11:46 +0000 (11:41 +0530)
committerMark Brown <broonie@kernel.org>
Mon, 16 Dec 2024 12:31:03 +0000 (12:31 +0000)
Add condition check to register ACP PDM sound card by reading
_WOV acpi entry.

Fixes: 0386d765f27a ("ASoC: amd: ps: refactor acp device configuration read logic")
Signed-off-by: Venkata Prasad Potturu <venkataprasad.potturu@amd.com>
Link: https://patch.msgid.link/20241213061147.1060451-1-venkataprasad.potturu@amd.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/amd/ps/pci-ps.c

index 823a69bf778b9c5d6651ea75f59e0f5b7c7e8072..4575326d063529507c14fb796fb0de1383eab4ea 100644 (file)
@@ -375,11 +375,18 @@ static int get_acp63_device_config(struct pci_dev *pci, struct acp63_dev_data *a
 {
        struct acpi_device *pdm_dev;
        const union acpi_object *obj;
+       acpi_handle handle;
+       acpi_integer dmic_status;
        u32 config;
        bool is_dmic_dev = false;
        bool is_sdw_dev = false;
+       bool wov_en, dmic_en;
        int ret;
 
+       /* IF WOV entry not found, enable dmic based on acp-audio-device-type entry*/
+       wov_en = true;
+       dmic_en = false;
+
        config = readl(acp_data->acp63_base + ACP_PIN_CONFIG);
        switch (config) {
        case ACP_CONFIG_4:
@@ -412,10 +419,18 @@ static int get_acp63_device_config(struct pci_dev *pci, struct acp63_dev_data *a
                        if (!acpi_dev_get_property(pdm_dev, "acp-audio-device-type",
                                                   ACPI_TYPE_INTEGER, &obj) &&
                                                   obj->integer.value == ACP_DMIC_DEV)
-                               is_dmic_dev = true;
+                               dmic_en = true;
                }
+
+               handle = ACPI_HANDLE(&pci->dev);
+               ret = acpi_evaluate_integer(handle, "_WOV", NULL, &dmic_status);
+               if (!ACPI_FAILURE(ret))
+                       wov_en = dmic_status;
        }
 
+       if (dmic_en && wov_en)
+               is_dmic_dev = true;
+
        if (acp_data->is_sdw_config) {
                ret = acp_scan_sdw_devices(&pci->dev, ACP63_SDW_ADDR);
                if (!ret && acp_data->info.link_mask)