xref: /linux/sound/soc/amd/acp7x/acp7x.h (revision 0eaed89c18aeedf0898baf2dbf5ff027c6795152)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * AMD Common ACP header file for ACP7.X variants(ACP7.D/7.E/7.F)
4  *
5  * Copyright (C) 2026 Advanced Micro Devices, Inc. All rights reserved.
6  */
7 
8 #ifndef __SOUND_SOC_AMD_ACP7X_H
9 #define __SOUND_SOC_AMD_ACP7X_H
10 
11 #include <linux/device.h>
12 #include <linux/errno.h>
13 #include <linux/io.h>
14 #include <linux/pci.h>
15 #include <linux/types.h>
16 
17 #include <sound/acp7x_chip_offset_byte.h>
18 
19 #define ACP_DEVICE_ID		0x15E2
20 #define ACP7X_REG_START		0x1240000
21 #define ACP7X_REG_END		0x125C000
22 
23 #define ACP7D_PCI_REV		0x7D
24 #define ACP7E_PCI_REV		0x7E
25 #define ACP7F_PCI_REV		0x7F
26 
27 /* Common register helper bits used by acp7x-common.c */
28 #define ACP_SOFT_RESET_SOFTRESET_AUDDONE_MASK	0x00010001
29 
30 #define DELAY_US				5
31 #define ACP7X_TIMEOUT				5000
32 
33 #define ACP7X_PGFSM_CNTL_POWER_ON_MASK		7
34 #define ACP7X_PGFSM_STATUS_MASK			0x3F
35 
36 /* time in ms for runtime suspend delay */
37 #define ACP_SUSPEND_DELAY_MS			2000
38 
39 struct acp_hw_ops {
40 	int (*acp_init)(void __iomem *acp_base, struct device *dev);
41 	int (*acp_deinit)(void __iomem *acp_base, struct device *dev);
42 	int (*acp_suspend)(struct device *dev);
43 	int (*acp_resume)(struct device *dev);
44 	int (*acp_suspend_runtime)(struct device *dev);
45 	int (*acp_resume_runtime)(struct device *dev);
46 };
47 
48 struct acp7x_dev_data {
49 	void __iomem *acp7x_base;
50 	struct acp_hw_ops *hw_ops;
51 	u32 addr;
52 	u32 reg_range;
53 	u32 acp_rev;
54 };
55 
56 void acp7x_hw_init_ops(struct acp_hw_ops *hw_ops);
57 
58 static inline int acp_hw_init(struct acp7x_dev_data *adata, struct device *dev)
59 {
60 	if (adata && adata->hw_ops && adata->hw_ops->acp_init)
61 		return adata->hw_ops->acp_init(adata->acp7x_base, dev);
62 	return -EOPNOTSUPP;
63 }
64 
65 static inline int acp_hw_deinit(struct acp7x_dev_data *adata, struct device *dev)
66 {
67 	if (adata && adata->hw_ops && adata->hw_ops->acp_deinit)
68 		return adata->hw_ops->acp_deinit(adata->acp7x_base, dev);
69 	return -EOPNOTSUPP;
70 }
71 
72 static inline int acp_hw_suspend(struct device *dev)
73 {
74 	struct acp7x_dev_data *adata = dev_get_drvdata(dev);
75 
76 	if (adata && adata->hw_ops && adata->hw_ops->acp_suspend)
77 		return adata->hw_ops->acp_suspend(dev);
78 	return -EOPNOTSUPP;
79 }
80 
81 static inline int acp_hw_resume(struct device *dev)
82 {
83 	struct acp7x_dev_data *adata = dev_get_drvdata(dev);
84 
85 	if (adata && adata->hw_ops && adata->hw_ops->acp_resume)
86 		return adata->hw_ops->acp_resume(dev);
87 	return -EOPNOTSUPP;
88 }
89 
90 static inline int acp_hw_suspend_runtime(struct device *dev)
91 {
92 	struct acp7x_dev_data *adata = dev_get_drvdata(dev);
93 
94 	if (adata && adata->hw_ops && adata->hw_ops->acp_suspend_runtime)
95 		return adata->hw_ops->acp_suspend_runtime(dev);
96 	return -EOPNOTSUPP;
97 }
98 
99 static inline int acp_hw_runtime_resume(struct device *dev)
100 {
101 	struct acp7x_dev_data *adata = dev_get_drvdata(dev);
102 
103 	if (adata && adata->hw_ops && adata->hw_ops->acp_resume_runtime)
104 		return adata->hw_ops->acp_resume_runtime(dev);
105 	return -EOPNOTSUPP;
106 }
107 
108 int snd_amd_acp_find_config(struct pci_dev *pci);
109 
110 #endif /* __SOUND_SOC_AMD_ACP7X_H */
111