]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
ASoC: amd: Add module to determine ACP configuration
authorAjit Kumar Pandey <AjitKumar.Pandey@amd.com>
Wed, 17 Nov 2021 09:37:20 +0000 (11:37 +0200)
committerMark Brown <broonie@kernel.org>
Wed, 17 Nov 2021 17:35:50 +0000 (17:35 +0000)
ACP hw block configuration differs across various distributions
and hence it's required to register different drivers module for
distributions. For now we support three ACP drivers:

* ACP without SOF use case
* ACP with SOF use case
* ACP with SOF use case for DMIC and non SOF for I2S endpoints

As all above driver registers with common PCI ID for ACP hw block
we need code to determine ACP configuration and auto select driver
module. This patch expose function that return configuration flag
based on dmi checks for a system. ACP driver module probe register
platform device based on such configuration flag to avoid conflict
with other ACP drivers probed for same PCI ID.

Signed-off-by: Ajit Kumar Pandey <AjitKumar.Pandey@amd.com>
Reviewed-by: Bard Liao <bard.liao@intel.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com>
Link: https://lore.kernel.org/r/20211117093734.17407-8-daniel.baluta@oss.nxp.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/amd/Kconfig
sound/soc/amd/Makefile
sound/soc/amd/acp-config.c [new file with mode: 0644]
sound/soc/amd/mach-config.h [new file with mode: 0644]

index 2c6af3f8f29619f3d64e768abe34294c563eeb3a..092966ff5ea7d160d64ce7c4c8053a952ccec7e7 100644 (file)
@@ -96,4 +96,10 @@ config SND_SOC_AMD_YC_MACH
          Say m if you have such a device.
          If unsure select "N".
 
+config SND_AMD_ACP_CONFIG
+       tristate "AMD ACP configuration selection"
+       help
+        This option adds an auto detection to determine which ACP
+        driver modules to use
+
 source "sound/soc/amd/acp/Kconfig"
index f1d42bbda7095f9dbe90fc671e421e49ed7802df..4b1f77930a4a8e6eaed527188d76025706f0c95a 100644 (file)
@@ -3,6 +3,7 @@ acp_audio_dma-objs := acp-pcm-dma.o
 snd-soc-acp-da7219mx98357-mach-objs := acp-da7219-max98357a.o
 snd-soc-acp-rt5645-mach-objs := acp-rt5645.o
 snd-soc-acp-rt5682-mach-objs := acp3x-rt5682-max9836.o
+snd-acp-config-objs := acp-config.o
 
 obj-$(CONFIG_SND_SOC_AMD_ACP) += acp_audio_dma.o
 obj-$(CONFIG_SND_SOC_AMD_CZ_DA7219MX98357_MACH) += snd-soc-acp-da7219mx98357-mach.o
@@ -13,3 +14,4 @@ obj-$(CONFIG_SND_SOC_AMD_RENOIR) += renoir/
 obj-$(CONFIG_SND_SOC_AMD_ACP5x) += vangogh/
 obj-$(CONFIG_SND_SOC_AMD_ACP6x) += yc/
 obj-$(CONFIG_SND_SOC_AMD_ACP_COMMON) += acp/
+obj-$(CONFIG_SND_AMD_ACP_CONFIG) += snd-acp-config.o
diff --git a/sound/soc/amd/acp-config.c b/sound/soc/amd/acp-config.c
new file mode 100644 (file)
index 0000000..c9abbb4
--- /dev/null
@@ -0,0 +1,81 @@
+// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
+//
+// This file is provided under a dual BSD/GPLv2 license. When using or
+// redistributing this file, you may do so under either license.
+//
+// Copyright(c) 2021 Advanced Micro Devices, Inc.
+//
+// Authors: Ajit Kumar Pandey <AjitKumar.Pandey@amd.com>
+//
+
+/* ACP machine configuration module */
+
+#include <linux/acpi.h>
+#include <linux/bits.h>
+#include <linux/dmi.h>
+#include <linux/module.h>
+#include <linux/pci.h>
+
+#include "../sof/amd/acp.h"
+#include "mach-config.h"
+
+static int acp_quirk_data;
+
+static const struct config_entry config_table[] = {
+       {
+               .flags = FLAG_AMD_SOF,
+               .device = ACP_PCI_DEV_ID,
+               .dmi_table = (const struct dmi_system_id []) {
+                       {
+                               .matches = {
+                                       DMI_MATCH(DMI_SYS_VENDOR, "AMD"),
+                                       DMI_MATCH(DMI_PRODUCT_NAME, "Majolica-CZN"),
+                               },
+                       },
+                       {}
+               },
+       },
+};
+
+int snd_amd_acp_find_config(struct pci_dev *pci)
+{
+       const struct config_entry *table = config_table;
+       u16 device = pci->device;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(config_table); i++, table++) {
+               if (table->device != device)
+                       continue;
+               if (table->dmi_table && !dmi_check_system(table->dmi_table))
+                       continue;
+               acp_quirk_data = table->flags;
+               return table->flags;
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL(snd_amd_acp_find_config);
+
+struct snd_soc_acpi_mach snd_soc_acpi_amd_sof_machines[] = {
+       {
+               .id = "AMDI1019",
+               .drv_name = "renoir-dsp",
+               .pdata = (void *)&acp_quirk_data,
+               .fw_filename = "sof-rn.ri",
+               .sof_tplg_filename = "sof-acp.tplg",
+       },
+       {},
+};
+EXPORT_SYMBOL(snd_soc_acpi_amd_sof_machines);
+
+struct snd_soc_acpi_mach snd_soc_acpi_amd_acp_machines[] = {
+       {
+               .id = "AMDI1019",
+               .drv_name = "renoir-acp",
+               .pdata = (void *)&acp_quirk_data,
+       },
+       {},
+};
+EXPORT_SYMBOL(snd_soc_acpi_amd_acp_machines);
+
+MODULE_LICENSE("Dual BSD/GPL");
diff --git a/sound/soc/amd/mach-config.h b/sound/soc/amd/mach-config.h
new file mode 100644 (file)
index 0000000..608f1e1
--- /dev/null
@@ -0,0 +1,29 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
+/*
+ * This file is provided under a dual BSD/GPLv2 license. When using or
+ * redistributing this file, you may do so under either license.
+ *
+ * Copyright(c) 2021 Advanced Micro Devices, Inc. All rights reserved.
+ *
+ * Author: Ajit Kumar Pandey <AjitKumar.Pandey@amd.com>
+ */
+#ifndef __AMD_MACH_CONFIG_H
+#define __AMD_MACH_CONFIG_H
+
+#include <sound/soc-acpi.h>
+
+#define FLAG_AMD_SOF                   BIT(1)
+#define FLAG_AMD_SOF_ONLY_DMIC         BIT(2)
+
+#define ACP_PCI_DEV_ID                 0x15E2
+
+extern struct snd_soc_acpi_mach snd_soc_acpi_amd_sof_machines[];
+extern struct snd_soc_acpi_mach snd_soc_acpi_amd_acp_machines[];
+
+struct config_entry {
+       u32 flags;
+       u16 device;
+       const struct dmi_system_id *dmi_table;
+};
+
+#endif