1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
3 // This file is provided under a dual BSD/GPLv2 license. When using or
4 // redistributing this file, you may do so under either license.
6 // Copyright(c) 2023 Advanced Micro Devices, Inc.
8 // Authors: Syed Saba Kareem <Syed.SabaKareem@amd.com>
12 * Common file to be used by amd platforms
16 #include <linux/pci.h>
17 #include <linux/export.h>
19 void acp_enable_interrupts(struct acp_dev_data *adata)
21 struct acp_resource *rsrc = adata->rsrc;
24 writel(0x01, ACP_EXTERNAL_INTR_ENB(adata));
25 ext_intr_ctrl = readl(ACP_EXTERNAL_INTR_CNTL(adata, rsrc->irqp_used));
26 ext_intr_ctrl |= ACP_ERROR_MASK;
27 writel(ext_intr_ctrl, ACP_EXTERNAL_INTR_CNTL(adata, rsrc->irqp_used));
29 EXPORT_SYMBOL_NS_GPL(acp_enable_interrupts, SND_SOC_ACP_COMMON);
31 void acp_disable_interrupts(struct acp_dev_data *adata)
33 struct acp_resource *rsrc = adata->rsrc;
35 writel(ACP_EXT_INTR_STAT_CLEAR_MASK, ACP_EXTERNAL_INTR_STAT(adata, rsrc->irqp_used));
36 writel(0x00, ACP_EXTERNAL_INTR_ENB(adata));
38 EXPORT_SYMBOL_NS_GPL(acp_disable_interrupts, SND_SOC_ACP_COMMON);
40 static int acp_power_on(struct acp_chip_info *chip)
42 u32 val, acp_pgfsm_stat_reg, acp_pgfsm_ctrl_reg;
46 switch (chip->acp_rev) {
48 acp_pgfsm_stat_reg = ACP_PGFSM_STATUS;
49 acp_pgfsm_ctrl_reg = ACP_PGFSM_CONTROL;
52 acp_pgfsm_stat_reg = ACP6X_PGFSM_STATUS;
53 acp_pgfsm_ctrl_reg = ACP6X_PGFSM_CONTROL;
59 val = readl(base + acp_pgfsm_stat_reg);
60 if (val == ACP_POWERED_ON)
63 if ((val & ACP_PGFSM_STATUS_MASK) != ACP_POWER_ON_IN_PROGRESS)
64 writel(ACP_PGFSM_CNTL_POWER_ON_MASK, base + acp_pgfsm_ctrl_reg);
66 return readl_poll_timeout(base + acp_pgfsm_stat_reg, val,
67 !val, DELAY_US, ACP_TIMEOUT);
70 static int acp_reset(void __iomem *base)
75 writel(1, base + ACP_SOFT_RESET);
76 ret = readl_poll_timeout(base + ACP_SOFT_RESET, val, val & ACP_SOFT_RST_DONE_MASK,
77 DELAY_US, ACP_TIMEOUT);
81 writel(0, base + ACP_SOFT_RESET);
82 return readl_poll_timeout(base + ACP_SOFT_RESET, val, !val, DELAY_US, ACP_TIMEOUT);
85 int acp_init(struct acp_chip_info *chip)
90 ret = acp_power_on(chip);
92 pr_err("ACP power on failed\n");
95 writel(0x01, chip->base + ACP_CONTROL);
98 ret = acp_reset(chip->base);
100 pr_err("ACP reset failed\n");
105 EXPORT_SYMBOL_NS_GPL(acp_init, SND_SOC_ACP_COMMON);
107 int acp_deinit(void __iomem *base)
112 ret = acp_reset(base);
116 writel(0, base + ACP_CONTROL);
119 EXPORT_SYMBOL_NS_GPL(acp_deinit, SND_SOC_ACP_COMMON);
121 int smn_write(struct pci_dev *dev, u32 smn_addr, u32 data)
123 pci_write_config_dword(dev, 0x60, smn_addr);
124 pci_write_config_dword(dev, 0x64, data);
127 EXPORT_SYMBOL_NS_GPL(smn_write, SND_SOC_ACP_COMMON);
129 int smn_read(struct pci_dev *dev, u32 smn_addr)
133 pci_write_config_dword(dev, 0x60, smn_addr);
134 pci_read_config_dword(dev, 0x64, &data);
137 EXPORT_SYMBOL_NS_GPL(smn_read, SND_SOC_ACP_COMMON);
139 MODULE_LICENSE("Dual BSD/GPL");