1// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
2//
3// This file is provided under a dual BSD/GPLv2 license. When using or
4// redistributing this file, you may do so under either license.
5//
6// Copyright(c) 2021 Advanced Micro Devices, Inc.
7//
8// Authors: Ajit Kumar Pandey <AjitKumar.Pandey@amd.com>
9//
10
11/* ACP machine configuration module */
12
13#include <linux/acpi.h>
14#include <linux/bits.h>
15#include <linux/dmi.h>
16#include <linux/module.h>
17#include <linux/pci.h>
18
19#include "../sof/amd/acp.h"
20#include "mach-config.h"
21
22static int acp_quirk_data;
23
24static const struct config_entry config_table[] = {
25	{
26		.flags = FLAG_AMD_SOF,
27		.device = ACP_PCI_DEV_ID,
28		.dmi_table = (const struct dmi_system_id []) {
29			{
30				.matches = {
31					DMI_MATCH(DMI_SYS_VENDOR, "AMD"),
32					DMI_MATCH(DMI_PRODUCT_NAME, "Majolica-CZN"),
33				},
34			},
35			{}
36		},
37	},
38	{
39		.flags = FLAG_AMD_SOF,
40		.device = ACP_PCI_DEV_ID,
41		.dmi_table = (const struct dmi_system_id []) {
42			{
43				.matches = {
44					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
45				},
46			},
47			{}
48		},
49	},
50	{
51		.flags = FLAG_AMD_SOF,
52		.device = ACP_PCI_DEV_ID,
53		.dmi_table = (const struct dmi_system_id []) {
54			{
55				.matches = {
56					DMI_MATCH(DMI_SYS_VENDOR, "Valve"),
57					DMI_MATCH(DMI_PRODUCT_NAME, "Galileo"),
58					DMI_MATCH(DMI_PRODUCT_FAMILY, "Sephiroth"),
59				},
60			},
61			{}
62		},
63	},
64};
65
66int snd_amd_acp_find_config(struct pci_dev *pci)
67{
68	const struct config_entry *table = config_table;
69	u16 device = pci->device;
70	int i;
71
72	/* Do not enable FLAGS on older platforms with Rev id zero */
73	if (!pci->revision)
74		return 0;
75
76	for (i = 0; i < ARRAY_SIZE(config_table); i++, table++) {
77		if (table->device != device)
78			continue;
79		if (table->dmi_table && !dmi_check_system(table->dmi_table))
80			continue;
81		acp_quirk_data = table->flags;
82		return table->flags;
83	}
84
85	return 0;
86}
87EXPORT_SYMBOL(snd_amd_acp_find_config);
88
89static struct snd_soc_acpi_codecs amp_rt1019 = {
90	.num_codecs = 1,
91	.codecs = {"10EC1019"}
92};
93
94static struct snd_soc_acpi_codecs amp_max = {
95	.num_codecs = 1,
96	.codecs = {"MX98360A"}
97};
98
99static struct snd_soc_acpi_codecs amp_max98388 = {
100	.num_codecs = 1,
101	.codecs = {"ADS8388"}
102};
103
104struct snd_soc_acpi_mach snd_soc_acpi_amd_sof_machines[] = {
105	{
106		.id = "10EC5682",
107		.drv_name = "rt5682-rt1019",
108		.pdata = (void *)&acp_quirk_data,
109		.machine_quirk = snd_soc_acpi_codec_list,
110		.quirk_data = &amp_rt1019,
111		.fw_filename = "sof-rn.ri",
112		.sof_tplg_filename = "sof-rn-rt5682-rt1019.tplg",
113	},
114	{
115		.id = "10EC5682",
116		.drv_name = "rt5682-max",
117		.pdata = (void *)&acp_quirk_data,
118		.machine_quirk = snd_soc_acpi_codec_list,
119		.quirk_data = &amp_max,
120		.fw_filename = "sof-rn.ri",
121		.sof_tplg_filename = "sof-rn-rt5682-max98360.tplg",
122	},
123	{
124		.id = "RTL5682",
125		.drv_name = "rt5682s-max",
126		.pdata = (void *)&acp_quirk_data,
127		.machine_quirk = snd_soc_acpi_codec_list,
128		.quirk_data = &amp_max,
129		.fw_filename = "sof-rn.ri",
130		.sof_tplg_filename = "sof-rn-rt5682-max98360.tplg",
131	},
132	{
133		.id = "RTL5682",
134		.drv_name = "rt5682s-rt1019",
135		.pdata = (void *)&acp_quirk_data,
136		.machine_quirk = snd_soc_acpi_codec_list,
137		.quirk_data = &amp_rt1019,
138		.fw_filename = "sof-rn.ri",
139		.sof_tplg_filename = "sof-rn-rt5682-rt1019.tplg",
140	},
141	{
142		.id = "AMDI1019",
143		.drv_name = "renoir-dsp",
144		.pdata = (void *)&acp_quirk_data,
145		.fw_filename = "sof-rn.ri",
146		.sof_tplg_filename = "sof-acp.tplg",
147	},
148	{},
149};
150EXPORT_SYMBOL(snd_soc_acpi_amd_sof_machines);
151
152struct snd_soc_acpi_mach snd_soc_acpi_amd_vangogh_sof_machines[] = {
153	{
154		.id = "NVTN2020",
155		.drv_name = "nau8821-max",
156		.pdata = &acp_quirk_data,
157		.machine_quirk = snd_soc_acpi_codec_list,
158		.quirk_data = &amp_max98388,
159		.fw_filename = "sof-vangogh.ri",
160		.sof_tplg_filename = "sof-vangogh-nau8821-max.tplg",
161	},
162	{},
163};
164EXPORT_SYMBOL(snd_soc_acpi_amd_vangogh_sof_machines);
165
166struct snd_soc_acpi_mach snd_soc_acpi_amd_rmb_sof_machines[] = {
167	{
168		.id = "AMDI1019",
169		.drv_name = "rmb-dsp",
170		.pdata = &acp_quirk_data,
171		.fw_filename = "sof-rmb.ri",
172		.sof_tplg_filename = "sof-acp-rmb.tplg",
173	},
174	{
175		.id = "10508825",
176		.drv_name = "nau8825-max",
177		.pdata = &acp_quirk_data,
178		.machine_quirk = snd_soc_acpi_codec_list,
179		.quirk_data = &amp_max,
180		.fw_filename = "sof-rmb.ri",
181		.sof_tplg_filename = "sof-rmb-nau8825-max98360.tplg",
182	},
183	{
184		.id = "RTL5682",
185		.drv_name = "rt5682s-hs-rt1019",
186		.pdata = &acp_quirk_data,
187		.machine_quirk = snd_soc_acpi_codec_list,
188		.quirk_data = &amp_rt1019,
189		.fw_filename = "sof-rmb.ri",
190		.sof_tplg_filename = "sof-rmb-rt5682s-rt1019.tplg",
191	},
192	{},
193};
194EXPORT_SYMBOL(snd_soc_acpi_amd_rmb_sof_machines);
195
196MODULE_LICENSE("Dual BSD/GPL");
197