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