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