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