Skip to content

Commit 8ae746f

Browse files
Venkata-Prasad-Potturubroonie
authored andcommitted
ASoC: amd: acp: Implement acp_common_hw_ops support for acp platforms
Implement acp common hardware ops for acp_init and acp_deinit funcions to support commons ops for all platforms. Signed-off-by: Venkata Prasad Potturu <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent c3d5d33 commit 8ae746f

File tree

3 files changed

+95
-4
lines changed

3 files changed

+95
-4
lines changed

sound/soc/amd/acp/acp-legacy-common.c

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@
2121
#define ACP63_PDM_ADDR 0x02
2222
#define ACP70_PDM_ADDR 0x02
2323

24+
const struct snd_acp_hw_ops acp_common_hw_ops = {
25+
/* ACP hardware initilizations */
26+
.acp_init = acp_init,
27+
.acp_deinit = acp_deinit,
28+
};
29+
EXPORT_SYMBOL_NS_GPL(acp_common_hw_ops, "SND_SOC_ACP_COMMON");
2430
void acp_enable_interrupts(struct acp_dev_data *adata)
2531
{
2632
struct acp_resource *rsrc = adata->rsrc;
@@ -463,5 +469,49 @@ void check_acp_config(struct pci_dev *pci, struct acp_chip_info *chip)
463469
}
464470
EXPORT_SYMBOL_NS_GPL(check_acp_config, "SND_SOC_ACP_COMMON");
465471

472+
struct snd_acp_hw_ops acp31_common_hw_ops;
473+
EXPORT_SYMBOL_NS_GPL(acp31_common_hw_ops, "SND_SOC_ACP_COMMON");
474+
int acp31_hw_ops_init(struct acp_chip_info *chip)
475+
{
476+
memcpy(&acp31_common_hw_ops, &acp_common_hw_ops, sizeof(acp_common_hw_ops));
477+
chip->acp_hw_ops = &acp31_common_hw_ops;
478+
479+
return 0;
480+
}
481+
EXPORT_SYMBOL_NS_GPL(acp31_hw_ops_init, "SND_SOC_ACP_COMMON");
482+
483+
struct snd_acp_hw_ops acp6x_common_hw_ops;
484+
EXPORT_SYMBOL_NS_GPL(acp6x_common_hw_ops, "SND_SOC_ACP_COMMON");
485+
int acp6x_hw_ops_init(struct acp_chip_info *chip)
486+
{
487+
memcpy(&acp6x_common_hw_ops, &acp_common_hw_ops, sizeof(acp_common_hw_ops));
488+
chip->acp_hw_ops = &acp6x_common_hw_ops;
489+
490+
return 0;
491+
}
492+
EXPORT_SYMBOL_NS_GPL(acp6x_hw_ops_init, "SND_SOC_ACP_COMMON");
493+
494+
struct snd_acp_hw_ops acp63_common_hw_ops;
495+
EXPORT_SYMBOL_NS_GPL(acp63_common_hw_ops, "SND_SOC_ACP_COMMON");
496+
int acp63_hw_ops_init(struct acp_chip_info *chip)
497+
{
498+
memcpy(&acp63_common_hw_ops, &acp_common_hw_ops, sizeof(acp_common_hw_ops));
499+
chip->acp_hw_ops = &acp63_common_hw_ops;
500+
501+
return 0;
502+
}
503+
EXPORT_SYMBOL_NS_GPL(acp63_hw_ops_init, "SND_SOC_ACP_COMMON");
504+
505+
struct snd_acp_hw_ops acp70_common_hw_ops;
506+
EXPORT_SYMBOL_NS_GPL(acp70_common_hw_ops, "SND_SOC_ACP_COMMON");
507+
int acp70_hw_ops_init(struct acp_chip_info *chip)
508+
{
509+
memcpy(&acp70_common_hw_ops, &acp_common_hw_ops, sizeof(acp_common_hw_ops));
510+
chip->acp_hw_ops = &acp70_common_hw_ops;
511+
512+
return 0;
513+
}
514+
EXPORT_SYMBOL_NS_GPL(acp70_hw_ops_init, "SND_SOC_ACP_COMMON");
515+
466516
MODULE_DESCRIPTION("AMD ACP legacy common features");
467517
MODULE_LICENSE("Dual BSD/GPL");

sound/soc/amd/acp/acp-pci.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,16 +81,20 @@ static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id
8181
switch (pci->revision) {
8282
case 0x01:
8383
chip->name = "acp_asoc_renoir";
84+
chip->acp_hw_ops_init = acp31_hw_ops_init;
8485
break;
8586
case 0x6f:
8687
chip->name = "acp_asoc_rembrandt";
88+
chip->acp_hw_ops_init = acp6x_hw_ops_init;
8789
break;
8890
case 0x63:
8991
chip->name = "acp_asoc_acp63";
92+
chip->acp_hw_ops_init = acp63_hw_ops_init;
9093
break;
9194
case 0x70:
9295
case 0x71:
9396
chip->name = "acp_asoc_acp70";
97+
chip->acp_hw_ops_init = acp70_hw_ops_init;
9498
break;
9599
default:
96100
dev_err(dev, "Unsupported device revision:0x%x\n", pci->revision);
@@ -112,7 +116,8 @@ static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id
112116
goto unregister_dmic_dev;
113117
}
114118

115-
ret = acp_init(chip);
119+
chip->acp_hw_ops_init(chip);
120+
ret = acp_hw_init(chip);
116121
if (ret)
117122
goto unregister_dmic_dev;
118123

@@ -179,7 +184,7 @@ static int __maybe_unused snd_acp_suspend(struct device *dev)
179184
int ret;
180185

181186
chip = dev_get_drvdata(dev);
182-
ret = acp_deinit(chip);
187+
ret = acp_hw_deinit(chip);
183188
if (ret)
184189
dev_err(dev, "ACP de-init failed\n");
185190
return ret;
@@ -193,7 +198,7 @@ static int __maybe_unused snd_acp_resume(struct device *dev)
193198
int ret;
194199

195200
chip = dev_get_drvdata(dev);
196-
ret = acp_init(chip);
201+
ret = acp_hw_init(chip);
197202
if (ret)
198203
dev_err(dev, "ACP init failed\n");
199204
if (chip->chip_pdev) {
@@ -222,7 +227,7 @@ static void acp_pci_remove(struct pci_dev *pci)
222227
platform_device_unregister(dmic_dev);
223228
if (pdev)
224229
platform_device_unregister(pdev);
225-
ret = acp_deinit(chip);
230+
ret = acp_hw_deinit(chip);
226231
if (ret)
227232
dev_err(&pci->dev, "ACP de-init failed\n");
228233
}

sound/soc/amd/acp/amd.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@ struct acp_chip_info {
142142
char *name; /* Platform name */
143143
unsigned int acp_rev; /* ACP Revision id */
144144
void __iomem *base; /* ACP memory PCI base */
145+
struct snd_acp_hw_ops *acp_hw_ops;
146+
int (*acp_hw_ops_init)(struct acp_chip_info *chip);
145147
struct platform_device *chip_pdev;
146148
unsigned int flag; /* Distinguish b/w Legacy or Only PDM */
147149
bool is_pdm_dev; /* flag set to true when ACP PDM controller exists */
@@ -203,6 +205,17 @@ struct acp_dev_data {
203205
unsigned int flag;
204206
};
205207

208+
/**
209+
* struct snd_acp_hw_ops - ACP PCI driver platform specific ops
210+
* @acp_init: ACP initialization
211+
* @acp_deinit: ACP de-initialization
212+
*/
213+
struct snd_acp_hw_ops {
214+
/* ACP hardware initilizations */
215+
int (*acp_init)(struct acp_chip_info *chip);
216+
int (*acp_deinit)(struct acp_chip_info *chip);
217+
};
218+
206219
enum acp_config {
207220
ACP_CONFIG_0 = 0,
208221
ACP_CONFIG_1,
@@ -239,6 +252,15 @@ int acp_init(struct acp_chip_info *chip);
239252
int acp_deinit(struct acp_chip_info *chip);
240253
void acp_enable_interrupts(struct acp_dev_data *adata);
241254
void acp_disable_interrupts(struct acp_dev_data *adata);
255+
256+
extern struct snd_acp_hw_ops acp31_common_hw_ops;
257+
extern struct snd_acp_hw_ops acp6x_common_hw_ops;
258+
extern struct snd_acp_hw_ops acp63_common_hw_ops;
259+
extern struct snd_acp_hw_ops acp70_common_hw_ops;
260+
extern int acp31_hw_ops_init(struct acp_chip_info *chip);
261+
extern int acp6x_hw_ops_init(struct acp_chip_info *chip);
262+
extern int acp63_hw_ops_init(struct acp_chip_info *chip);
263+
extern int acp70_hw_ops_init(struct acp_chip_info *chip);
242264
/* Machine configuration */
243265
int snd_amd_acp_find_config(struct pci_dev *pci);
244266

@@ -252,6 +274,20 @@ int restore_acp_i2s_params(struct snd_pcm_substream *substream,
252274

253275
void check_acp_config(struct pci_dev *pci, struct acp_chip_info *chip);
254276

277+
static inline int acp_hw_init(struct acp_chip_info *chip)
278+
{
279+
if (chip && chip->acp_hw_ops && chip->acp_hw_ops->acp_init)
280+
return chip->acp_hw_ops->acp_init(chip);
281+
return -EOPNOTSUPP;
282+
}
283+
284+
static inline int acp_hw_deinit(struct acp_chip_info *chip)
285+
{
286+
if (chip && chip->acp_hw_ops && chip->acp_hw_ops->acp_deinit)
287+
return chip->acp_hw_ops->acp_deinit(chip);
288+
return -EOPNOTSUPP;
289+
}
290+
255291
static inline u64 acp_get_byte_count(struct acp_dev_data *adata, int dai_id, int direction)
256292
{
257293
u64 byte_count = 0, low = 0, high = 0;

0 commit comments

Comments
 (0)