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) 2018-2021 Intel Corporation. All rights reserved.
7//
8// Author: Liam Girdwood <liam.r.girdwood@linux.intel.com>
9//
10
11#include <linux/module.h>
12#include <linux/pci.h>
13#include <sound/soc-acpi.h>
14#include <sound/soc-acpi-intel-match.h>
15#include <sound/sof.h>
16#include "../ops.h"
17#include "../sof-pci-dev.h"
18
19/* platform specific devices */
20#include "hda.h"
21
22static const struct sof_dev_desc tgl_desc = {
23	.machines               = snd_soc_acpi_intel_tgl_machines,
24	.alt_machines		= snd_soc_acpi_intel_tgl_sdw_machines,
25	.use_acpi_target_states	= true,
26	.resindex_lpe_base      = 0,
27	.resindex_pcicfg_base   = -1,
28	.resindex_imr_base      = -1,
29	.irqindex_host_ipc      = -1,
30	.chip_info = &tgl_chip_info,
31	.ipc_supported_mask	= BIT(SOF_IPC) | BIT(SOF_INTEL_IPC4),
32	.ipc_default		= SOF_IPC,
33	.dspless_mode_supported	= true,		/* Only supported for HDaudio */
34	.default_fw_path = {
35		[SOF_IPC] = "intel/sof",
36		[SOF_INTEL_IPC4] = "intel/avs/tgl",
37	},
38	.default_lib_path = {
39		[SOF_INTEL_IPC4] = "intel/avs-lib/tgl",
40	},
41	.default_tplg_path = {
42		[SOF_IPC] = "intel/sof-tplg",
43		[SOF_INTEL_IPC4] = "intel/avs-tplg",
44	},
45	.default_fw_filename = {
46		[SOF_IPC] = "sof-tgl.ri",
47		[SOF_INTEL_IPC4] = "dsp_basefw.bin",
48	},
49	.nocodec_tplg_filename = "sof-tgl-nocodec.tplg",
50	.ops = &sof_tgl_ops,
51	.ops_init = sof_tgl_ops_init,
52	.ops_free = hda_ops_free,
53};
54
55static const struct sof_dev_desc tglh_desc = {
56	.machines               = snd_soc_acpi_intel_tgl_machines,
57	.alt_machines		= snd_soc_acpi_intel_tgl_sdw_machines,
58	.use_acpi_target_states	= true,
59	.resindex_lpe_base      = 0,
60	.resindex_pcicfg_base   = -1,
61	.resindex_imr_base      = -1,
62	.irqindex_host_ipc      = -1,
63	.chip_info = &tglh_chip_info,
64	.ipc_supported_mask	= BIT(SOF_IPC) | BIT(SOF_INTEL_IPC4),
65	.ipc_default		= SOF_IPC,
66	.dspless_mode_supported	= true,		/* Only supported for HDaudio */
67	.default_fw_path = {
68		[SOF_IPC] = "intel/sof",
69		[SOF_INTEL_IPC4] = "intel/avs/tgl-h",
70	},
71	.default_lib_path = {
72		[SOF_INTEL_IPC4] = "intel/avs-lib/tgl-h",
73	},
74	.default_tplg_path = {
75		[SOF_IPC] = "intel/sof-tplg",
76		[SOF_INTEL_IPC4] = "intel/avs-tplg",
77	},
78	.default_fw_filename = {
79		[SOF_IPC] = "sof-tgl-h.ri",
80		[SOF_INTEL_IPC4] = "dsp_basefw.bin",
81	},
82	.nocodec_tplg_filename = "sof-tgl-nocodec.tplg",
83	.ops = &sof_tgl_ops,
84	.ops_init = sof_tgl_ops_init,
85	.ops_free = hda_ops_free,
86};
87
88static const struct sof_dev_desc ehl_desc = {
89	.machines               = snd_soc_acpi_intel_ehl_machines,
90	.use_acpi_target_states	= true,
91	.resindex_lpe_base      = 0,
92	.resindex_pcicfg_base   = -1,
93	.resindex_imr_base      = -1,
94	.irqindex_host_ipc      = -1,
95	.chip_info = &ehl_chip_info,
96	.ipc_supported_mask	= BIT(SOF_IPC) | BIT(SOF_INTEL_IPC4),
97	.ipc_default		= SOF_IPC,
98	.dspless_mode_supported	= true,		/* Only supported for HDaudio */
99	.default_fw_path = {
100		[SOF_IPC] = "intel/sof",
101		[SOF_INTEL_IPC4] = "intel/avs/ehl",
102	},
103	.default_lib_path = {
104		[SOF_INTEL_IPC4] = "intel/avs-lib/ehl",
105	},
106	.default_tplg_path = {
107		[SOF_IPC] = "intel/sof-tplg",
108		[SOF_INTEL_IPC4] = "intel/avs-tplg",
109	},
110	.default_fw_filename = {
111		[SOF_IPC] = "sof-ehl.ri",
112		[SOF_INTEL_IPC4] = "dsp_basefw.bin",
113	},
114	.nocodec_tplg_filename = "sof-ehl-nocodec.tplg",
115	.ops = &sof_tgl_ops,
116	.ops_init = sof_tgl_ops_init,
117	.ops_free = hda_ops_free,
118};
119
120static const struct sof_dev_desc adls_desc = {
121	.machines               = snd_soc_acpi_intel_adl_machines,
122	.alt_machines           = snd_soc_acpi_intel_adl_sdw_machines,
123	.use_acpi_target_states	= true,
124	.resindex_lpe_base      = 0,
125	.resindex_pcicfg_base   = -1,
126	.resindex_imr_base      = -1,
127	.irqindex_host_ipc      = -1,
128	.chip_info = &adls_chip_info,
129	.ipc_supported_mask	= BIT(SOF_IPC) | BIT(SOF_INTEL_IPC4),
130	.ipc_default		= SOF_IPC,
131	.dspless_mode_supported	= true,		/* Only supported for HDaudio */
132	.default_fw_path = {
133		[SOF_IPC] = "intel/sof",
134		[SOF_INTEL_IPC4] = "intel/avs/adl-s",
135	},
136	.default_lib_path = {
137		[SOF_INTEL_IPC4] = "intel/avs-lib/adl-s",
138	},
139	.default_tplg_path = {
140		[SOF_IPC] = "intel/sof-tplg",
141		[SOF_INTEL_IPC4] = "intel/avs-tplg",
142	},
143	.default_fw_filename = {
144		[SOF_IPC] = "sof-adl-s.ri",
145		[SOF_INTEL_IPC4] = "dsp_basefw.bin",
146	},
147	.nocodec_tplg_filename = "sof-adl-nocodec.tplg",
148	.ops = &sof_tgl_ops,
149	.ops_init = sof_tgl_ops_init,
150	.ops_free = hda_ops_free,
151};
152
153static const struct sof_dev_desc adl_desc = {
154	.machines               = snd_soc_acpi_intel_adl_machines,
155	.alt_machines           = snd_soc_acpi_intel_adl_sdw_machines,
156	.use_acpi_target_states = true,
157	.resindex_lpe_base      = 0,
158	.resindex_pcicfg_base   = -1,
159	.resindex_imr_base      = -1,
160	.irqindex_host_ipc      = -1,
161	.chip_info = &tgl_chip_info,
162	.ipc_supported_mask	= BIT(SOF_IPC) | BIT(SOF_INTEL_IPC4),
163	.ipc_default		= SOF_IPC,
164	.dspless_mode_supported	= true,		/* Only supported for HDaudio */
165	.default_fw_path = {
166		[SOF_IPC] = "intel/sof",
167		[SOF_INTEL_IPC4] = "intel/avs/adl",
168	},
169	.default_lib_path = {
170		[SOF_INTEL_IPC4] = "intel/avs-lib/adl",
171	},
172	.default_tplg_path = {
173		[SOF_IPC] = "intel/sof-tplg",
174		[SOF_INTEL_IPC4] = "intel/avs-tplg",
175	},
176	.default_fw_filename = {
177		[SOF_IPC] = "sof-adl.ri",
178		[SOF_INTEL_IPC4] = "dsp_basefw.bin",
179	},
180	.nocodec_tplg_filename = "sof-adl-nocodec.tplg",
181	.ops = &sof_tgl_ops,
182	.ops_init = sof_tgl_ops_init,
183	.ops_free = hda_ops_free,
184};
185
186static const struct sof_dev_desc adl_n_desc = {
187	.machines               = snd_soc_acpi_intel_adl_machines,
188	.alt_machines           = snd_soc_acpi_intel_adl_sdw_machines,
189	.use_acpi_target_states = true,
190	.resindex_lpe_base      = 0,
191	.resindex_pcicfg_base   = -1,
192	.resindex_imr_base      = -1,
193	.irqindex_host_ipc      = -1,
194	.chip_info = &tgl_chip_info,
195	.ipc_supported_mask	= BIT(SOF_IPC) | BIT(SOF_INTEL_IPC4),
196	.ipc_default		= SOF_IPC,
197	.dspless_mode_supported	= true,		/* Only supported for HDaudio */
198	.default_fw_path = {
199		[SOF_IPC] = "intel/sof",
200		[SOF_INTEL_IPC4] = "intel/avs/adl-n",
201	},
202	.default_lib_path = {
203		[SOF_INTEL_IPC4] = "intel/avs-lib/adl-n",
204	},
205	.default_tplg_path = {
206		[SOF_IPC] = "intel/sof-tplg",
207		[SOF_INTEL_IPC4] = "intel/avs-tplg",
208	},
209	.default_fw_filename = {
210		[SOF_IPC] = "sof-adl-n.ri",
211		[SOF_INTEL_IPC4] = "dsp_basefw.bin",
212	},
213	.nocodec_tplg_filename = "sof-adl-nocodec.tplg",
214	.ops = &sof_tgl_ops,
215	.ops_init = sof_tgl_ops_init,
216	.ops_free = hda_ops_free,
217};
218
219static const struct sof_dev_desc rpls_desc = {
220	.machines               = snd_soc_acpi_intel_rpl_machines,
221	.alt_machines           = snd_soc_acpi_intel_rpl_sdw_machines,
222	.use_acpi_target_states	= true,
223	.resindex_lpe_base      = 0,
224	.resindex_pcicfg_base   = -1,
225	.resindex_imr_base      = -1,
226	.irqindex_host_ipc      = -1,
227	.chip_info = &adls_chip_info,
228	.ipc_supported_mask	= BIT(SOF_IPC) | BIT(SOF_INTEL_IPC4),
229	.ipc_default		= SOF_IPC,
230	.dspless_mode_supported	= true,		/* Only supported for HDaudio */
231	.default_fw_path = {
232		[SOF_IPC] = "intel/sof",
233		[SOF_INTEL_IPC4] = "intel/avs/rpl-s",
234	},
235	.default_lib_path = {
236		[SOF_INTEL_IPC4] = "intel/avs-lib/rpl-s",
237	},
238	.default_tplg_path = {
239		[SOF_IPC] = "intel/sof-tplg",
240		[SOF_INTEL_IPC4] = "intel/avs-tplg",
241	},
242	.default_fw_filename = {
243		[SOF_IPC] = "sof-rpl-s.ri",
244		[SOF_INTEL_IPC4] = "dsp_basefw.bin",
245	},
246	.nocodec_tplg_filename = "sof-rpl-nocodec.tplg",
247	.ops = &sof_tgl_ops,
248	.ops_init = sof_tgl_ops_init,
249	.ops_free = hda_ops_free,
250};
251
252static const struct sof_dev_desc rpl_desc = {
253	.machines               = snd_soc_acpi_intel_rpl_machines,
254	.alt_machines           = snd_soc_acpi_intel_rpl_sdw_machines,
255	.use_acpi_target_states = true,
256	.resindex_lpe_base      = 0,
257	.resindex_pcicfg_base   = -1,
258	.resindex_imr_base      = -1,
259	.irqindex_host_ipc      = -1,
260	.chip_info = &tgl_chip_info,
261	.ipc_supported_mask	= BIT(SOF_IPC) | BIT(SOF_INTEL_IPC4),
262	.ipc_default		= SOF_IPC,
263	.dspless_mode_supported	= true,		/* Only supported for HDaudio */
264	.default_fw_path = {
265		[SOF_IPC] = "intel/sof",
266		[SOF_INTEL_IPC4] = "intel/avs/rpl",
267	},
268	.default_lib_path = {
269		[SOF_INTEL_IPC4] = "intel/avs-lib/rpl",
270	},
271	.default_tplg_path = {
272		[SOF_IPC] = "intel/sof-tplg",
273		[SOF_INTEL_IPC4] = "intel/avs-tplg",
274	},
275	.default_fw_filename = {
276		[SOF_IPC] = "sof-rpl.ri",
277		[SOF_INTEL_IPC4] = "dsp_basefw.bin",
278	},
279	.nocodec_tplg_filename = "sof-rpl-nocodec.tplg",
280	.ops = &sof_tgl_ops,
281	.ops_init = sof_tgl_ops_init,
282	.ops_free = hda_ops_free,
283};
284
285/* PCI IDs */
286static const struct pci_device_id sof_pci_ids[] = {
287	{ PCI_DEVICE_DATA(INTEL, HDA_TGL_LP, &tgl_desc) },
288	{ PCI_DEVICE_DATA(INTEL, HDA_TGL_H, &tglh_desc) },
289	{ PCI_DEVICE_DATA(INTEL, HDA_EHL_0, &ehl_desc) },
290	{ PCI_DEVICE_DATA(INTEL, HDA_EHL_3, &ehl_desc) },
291	{ PCI_DEVICE_DATA(INTEL, HDA_ADL_S, &adls_desc) },
292	{ PCI_DEVICE_DATA(INTEL, HDA_RPL_S, &rpls_desc) },
293	{ PCI_DEVICE_DATA(INTEL, HDA_ADL_P, &adl_desc) },
294	{ PCI_DEVICE_DATA(INTEL, HDA_ADL_PS, &adl_desc) },
295	{ PCI_DEVICE_DATA(INTEL, HDA_RPL_P_0, &rpl_desc) },
296	{ PCI_DEVICE_DATA(INTEL, HDA_RPL_P_1, &rpl_desc) },
297	{ PCI_DEVICE_DATA(INTEL, HDA_ADL_M, &adl_desc) },
298	{ PCI_DEVICE_DATA(INTEL, HDA_ADL_PX, &adl_desc) },
299	{ PCI_DEVICE_DATA(INTEL, HDA_RPL_M, &rpl_desc) },
300	{ PCI_DEVICE_DATA(INTEL, HDA_RPL_PX, &rpl_desc) },
301	{ PCI_DEVICE_DATA(INTEL, HDA_ADL_N, &adl_n_desc) },
302	{ 0, }
303};
304MODULE_DEVICE_TABLE(pci, sof_pci_ids);
305
306/* pci_driver definition */
307static struct pci_driver snd_sof_pci_intel_tgl_driver = {
308	.name = "sof-audio-pci-intel-tgl",
309	.id_table = sof_pci_ids,
310	.probe = hda_pci_intel_probe,
311	.remove = sof_pci_remove,
312	.shutdown = sof_pci_shutdown,
313	.driver = {
314		.pm = &sof_pci_pm,
315	},
316};
317module_pci_driver(snd_sof_pci_intel_tgl_driver);
318
319MODULE_LICENSE("Dual BSD/GPL");
320MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HDA_COMMON);
321MODULE_IMPORT_NS(SND_SOC_SOF_PCI_DEV);
322