summaryrefslogtreecommitdiffstats
path: root/sound/soc/amd/acp/acp-legacy-common.c
diff options
context:
space:
mode:
authorSyed Saba Kareem <Syed.SabaKareem@amd.com>2023-10-21 20:20:47 +0530
committerMark Brown <broonie@kernel.org>2023-10-25 17:21:48 +0100
commit3a94c8ad0aae2b14a55059869871ea2d199af489 (patch)
tree1ff0bb3dccdb880de26d65e38a0bc0c19b41eada /sound/soc/amd/acp/acp-legacy-common.c
parentd4c2d5391d7efc29fdd59d54355526c9ace16bec (diff)
downloadlinux-3a94c8ad0aae2b14a55059869871ea2d199af489.tar.gz
linux-3a94c8ad0aae2b14a55059869871ea2d199af489.tar.bz2
linux-3a94c8ad0aae2b14a55059869871ea2d199af489.zip
ASoC: amd: acp: add code for scanning acp pdm controller
Add common code for scanning acp pdm controller and create platform device for the same. Signed-off-by: Syed Saba Kareem <Syed.SabaKareem@amd.com> Link: https://lore.kernel.org/r/20231021145110.478744-6-Syed.SabaKareem@amd.com Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'sound/soc/amd/acp/acp-legacy-common.c')
-rw-r--r--sound/soc/amd/acp/acp-legacy-common.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/sound/soc/amd/acp/acp-legacy-common.c b/sound/soc/amd/acp/acp-legacy-common.c
index e16ef94e6336..af85a153a770 100644
--- a/sound/soc/amd/acp/acp-legacy-common.c
+++ b/sound/soc/amd/acp/acp-legacy-common.c
@@ -16,6 +16,10 @@
#include <linux/pci.h>
#include <linux/export.h>
+#define ACP_RENOIR_PDM_ADDR 0x02
+#define ACP_REMBRANDT_PDM_ADDR 0x03
+#define ACP63_PDM_ADDR 0x02
+
void acp_enable_interrupts(struct acp_dev_data *adata)
{
struct acp_resource *rsrc = adata->rsrc;
@@ -348,4 +352,52 @@ int smn_read(struct pci_dev *dev, u32 smn_addr)
}
EXPORT_SYMBOL_NS_GPL(smn_read, SND_SOC_ACP_COMMON);
+int check_acp_pdm(struct pci_dev *pci, struct acp_chip_info *chip)
+{
+ struct acpi_device *pdm_dev;
+ const union acpi_object *obj;
+ u32 pdm_addr, val;
+
+ val = readl(chip->base + ACP_PIN_CONFIG);
+ switch (val) {
+ case ACP_CONFIG_4:
+ case ACP_CONFIG_5:
+ case ACP_CONFIG_6:
+ case ACP_CONFIG_7:
+ case ACP_CONFIG_8:
+ case ACP_CONFIG_10:
+ case ACP_CONFIG_11:
+ case ACP_CONFIG_12:
+ case ACP_CONFIG_13:
+ case ACP_CONFIG_14:
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ switch (chip->acp_rev) {
+ case ACP3X_DEV:
+ pdm_addr = ACP_RENOIR_PDM_ADDR;
+ break;
+ case ACP6X_DEV:
+ pdm_addr = ACP_REMBRANDT_PDM_ADDR;
+ break;
+ case ACP63_DEV:
+ pdm_addr = ACP63_PDM_ADDR;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ pdm_dev = acpi_find_child_device(ACPI_COMPANION(&pci->dev), pdm_addr, 0);
+ if (pdm_dev) {
+ if (!acpi_dev_get_property(pdm_dev, "acp-audio-device-type",
+ ACPI_TYPE_INTEGER, &obj) &&
+ obj->integer.value == pdm_addr)
+ return 0;
+ }
+ return -ENODEV;
+}
+EXPORT_SYMBOL_NS_GPL(check_acp_pdm, SND_SOC_ACP_COMMON);
+
MODULE_LICENSE("Dual BSD/GPL");