1a8fe58ceSMaruthi Bayyavarapu /*
2a8fe58ceSMaruthi Bayyavarapu  * Copyright 2015 Advanced Micro Devices, Inc.
3a8fe58ceSMaruthi Bayyavarapu  *
4a8fe58ceSMaruthi Bayyavarapu  * Permission is hereby granted, free of charge, to any person obtaining a
5a8fe58ceSMaruthi Bayyavarapu  * copy of this software and associated documentation files (the "Software"),
6a8fe58ceSMaruthi Bayyavarapu  * to deal in the Software without restriction, including without limitation
7a8fe58ceSMaruthi Bayyavarapu  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8a8fe58ceSMaruthi Bayyavarapu  * and/or sell copies of the Software, and to permit persons to whom the
9a8fe58ceSMaruthi Bayyavarapu  * Software is furnished to do so, subject to the following conditions:
10a8fe58ceSMaruthi Bayyavarapu  *
11a8fe58ceSMaruthi Bayyavarapu  * The above copyright notice and this permission notice shall be included in
12a8fe58ceSMaruthi Bayyavarapu  * all copies or substantial portions of the Software.
13a8fe58ceSMaruthi Bayyavarapu  *
14a8fe58ceSMaruthi Bayyavarapu  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15a8fe58ceSMaruthi Bayyavarapu  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16a8fe58ceSMaruthi Bayyavarapu  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17a8fe58ceSMaruthi Bayyavarapu  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18a8fe58ceSMaruthi Bayyavarapu  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19a8fe58ceSMaruthi Bayyavarapu  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20a8fe58ceSMaruthi Bayyavarapu  * OTHER DEALINGS IN THE SOFTWARE.
21a8fe58ceSMaruthi Bayyavarapu  *
22a8fe58ceSMaruthi Bayyavarapu  * Authors: AMD
23a8fe58ceSMaruthi Bayyavarapu  *
24a8fe58ceSMaruthi Bayyavarapu  */
25a8fe58ceSMaruthi Bayyavarapu 
26a8fe58ceSMaruthi Bayyavarapu #include <linux/irqdomain.h>
27a8fe58ceSMaruthi Bayyavarapu #include <linux/platform_device.h>
28a8fe58ceSMaruthi Bayyavarapu #include <sound/designware_i2s.h>
29a8fe58ceSMaruthi Bayyavarapu #include <sound/pcm.h>
30a8fe58ceSMaruthi Bayyavarapu 
31a8fe58ceSMaruthi Bayyavarapu #include "amdgpu.h"
32a8fe58ceSMaruthi Bayyavarapu #include "atom.h"
33a8fe58ceSMaruthi Bayyavarapu #include "amdgpu_acp.h"
34a8fe58ceSMaruthi Bayyavarapu 
35a8fe58ceSMaruthi Bayyavarapu #include "acp_gfx_if.h"
36a8fe58ceSMaruthi Bayyavarapu 
37a8fe58ceSMaruthi Bayyavarapu #define ACP_TILE_ON_MASK                0x03
38a8fe58ceSMaruthi Bayyavarapu #define ACP_TILE_OFF_MASK               0x02
39a8fe58ceSMaruthi Bayyavarapu #define ACP_TILE_ON_RETAIN_REG_MASK     0x1f
40a8fe58ceSMaruthi Bayyavarapu #define ACP_TILE_OFF_RETAIN_REG_MASK    0x20
41a8fe58ceSMaruthi Bayyavarapu 
42a8fe58ceSMaruthi Bayyavarapu #define ACP_TILE_P1_MASK                0x3e
43a8fe58ceSMaruthi Bayyavarapu #define ACP_TILE_P2_MASK                0x3d
44a8fe58ceSMaruthi Bayyavarapu #define ACP_TILE_DSP0_MASK              0x3b
45a8fe58ceSMaruthi Bayyavarapu #define ACP_TILE_DSP1_MASK              0x37
46a8fe58ceSMaruthi Bayyavarapu 
47a8fe58ceSMaruthi Bayyavarapu #define ACP_TILE_DSP2_MASK              0x2f
48a8fe58ceSMaruthi Bayyavarapu 
49a8fe58ceSMaruthi Bayyavarapu #define ACP_DMA_REGS_END		0x146c0
50a8fe58ceSMaruthi Bayyavarapu #define ACP_I2S_PLAY_REGS_START		0x14840
51a8fe58ceSMaruthi Bayyavarapu #define ACP_I2S_PLAY_REGS_END		0x148b4
52a8fe58ceSMaruthi Bayyavarapu #define ACP_I2S_CAP_REGS_START		0x148b8
53a8fe58ceSMaruthi Bayyavarapu #define ACP_I2S_CAP_REGS_END		0x1496c
54a8fe58ceSMaruthi Bayyavarapu 
55a8fe58ceSMaruthi Bayyavarapu #define ACP_I2S_COMP1_CAP_REG_OFFSET	0xac
56a8fe58ceSMaruthi Bayyavarapu #define ACP_I2S_COMP2_CAP_REG_OFFSET	0xa8
57a8fe58ceSMaruthi Bayyavarapu #define ACP_I2S_COMP1_PLAY_REG_OFFSET	0x6c
58a8fe58ceSMaruthi Bayyavarapu #define ACP_I2S_COMP2_PLAY_REG_OFFSET	0x68
59a8fe58ceSMaruthi Bayyavarapu 
60a8fe58ceSMaruthi Bayyavarapu #define mmACP_PGFSM_RETAIN_REG		0x51c9
61a8fe58ceSMaruthi Bayyavarapu #define mmACP_PGFSM_CONFIG_REG		0x51ca
62a8fe58ceSMaruthi Bayyavarapu #define mmACP_PGFSM_READ_REG_0		0x51cc
63a8fe58ceSMaruthi Bayyavarapu 
64a8fe58ceSMaruthi Bayyavarapu #define mmACP_MEM_SHUT_DOWN_REQ_LO	0x51f8
65a8fe58ceSMaruthi Bayyavarapu #define mmACP_MEM_SHUT_DOWN_REQ_HI	0x51f9
66a8fe58ceSMaruthi Bayyavarapu #define mmACP_MEM_SHUT_DOWN_STS_LO	0x51fa
67a8fe58ceSMaruthi Bayyavarapu #define mmACP_MEM_SHUT_DOWN_STS_HI	0x51fb
68a8fe58ceSMaruthi Bayyavarapu 
69a8fe58ceSMaruthi Bayyavarapu #define ACP_TIMEOUT_LOOP		0x000000FF
70a8fe58ceSMaruthi Bayyavarapu #define ACP_DEVS			3
71a8fe58ceSMaruthi Bayyavarapu #define ACP_SRC_ID			162
72a8fe58ceSMaruthi Bayyavarapu 
73a8fe58ceSMaruthi Bayyavarapu enum {
74a8fe58ceSMaruthi Bayyavarapu 	ACP_TILE_P1 = 0,
75a8fe58ceSMaruthi Bayyavarapu 	ACP_TILE_P2,
76a8fe58ceSMaruthi Bayyavarapu 	ACP_TILE_DSP0,
77a8fe58ceSMaruthi Bayyavarapu 	ACP_TILE_DSP1,
78a8fe58ceSMaruthi Bayyavarapu 	ACP_TILE_DSP2,
79a8fe58ceSMaruthi Bayyavarapu };
80a8fe58ceSMaruthi Bayyavarapu 
81a8fe58ceSMaruthi Bayyavarapu static int acp_sw_init(void *handle)
82a8fe58ceSMaruthi Bayyavarapu {
83a8fe58ceSMaruthi Bayyavarapu 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
84a8fe58ceSMaruthi Bayyavarapu 
85a8fe58ceSMaruthi Bayyavarapu 	adev->acp.parent = adev->dev;
86a8fe58ceSMaruthi Bayyavarapu 
87a8fe58ceSMaruthi Bayyavarapu 	adev->acp.cgs_device =
88a8fe58ceSMaruthi Bayyavarapu 		amdgpu_cgs_create_device(adev);
89a8fe58ceSMaruthi Bayyavarapu 	if (!adev->acp.cgs_device)
90a8fe58ceSMaruthi Bayyavarapu 		return -EINVAL;
91a8fe58ceSMaruthi Bayyavarapu 
92a8fe58ceSMaruthi Bayyavarapu 	return 0;
93a8fe58ceSMaruthi Bayyavarapu }
94a8fe58ceSMaruthi Bayyavarapu 
95a8fe58ceSMaruthi Bayyavarapu static int acp_sw_fini(void *handle)
96a8fe58ceSMaruthi Bayyavarapu {
97a8fe58ceSMaruthi Bayyavarapu 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
98a8fe58ceSMaruthi Bayyavarapu 
99a8fe58ceSMaruthi Bayyavarapu 	if (adev->acp.cgs_device)
100a8fe58ceSMaruthi Bayyavarapu 		amdgpu_cgs_destroy_device(adev->acp.cgs_device);
101a8fe58ceSMaruthi Bayyavarapu 
102a8fe58ceSMaruthi Bayyavarapu 	return 0;
103a8fe58ceSMaruthi Bayyavarapu }
104a8fe58ceSMaruthi Bayyavarapu 
105a8fe58ceSMaruthi Bayyavarapu /**
106a8fe58ceSMaruthi Bayyavarapu  * acp_hw_init - start and test ACP block
107a8fe58ceSMaruthi Bayyavarapu  *
108a8fe58ceSMaruthi Bayyavarapu  * @adev: amdgpu_device pointer
109a8fe58ceSMaruthi Bayyavarapu  *
110a8fe58ceSMaruthi Bayyavarapu  */
111a8fe58ceSMaruthi Bayyavarapu static int acp_hw_init(void *handle)
112a8fe58ceSMaruthi Bayyavarapu {
113a8fe58ceSMaruthi Bayyavarapu 	int r;
114a8fe58ceSMaruthi Bayyavarapu 	uint64_t acp_base;
115a8fe58ceSMaruthi Bayyavarapu 	struct i2s_platform_data *i2s_pdata;
116a8fe58ceSMaruthi Bayyavarapu 
117a8fe58ceSMaruthi Bayyavarapu 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
118a8fe58ceSMaruthi Bayyavarapu 
119a8fe58ceSMaruthi Bayyavarapu 	const struct amdgpu_ip_block_version *ip_version =
120a8fe58ceSMaruthi Bayyavarapu 		amdgpu_get_ip_block(adev, AMD_IP_BLOCK_TYPE_ACP);
121a8fe58ceSMaruthi Bayyavarapu 
122a8fe58ceSMaruthi Bayyavarapu 	if (!ip_version)
123a8fe58ceSMaruthi Bayyavarapu 		return -EINVAL;
124a8fe58ceSMaruthi Bayyavarapu 
125a8fe58ceSMaruthi Bayyavarapu 	r = amd_acp_hw_init(adev->acp.cgs_device,
126a8fe58ceSMaruthi Bayyavarapu 			    ip_version->major, ip_version->minor);
127a8fe58ceSMaruthi Bayyavarapu 	/* -ENODEV means board uses AZ rather than ACP */
128a8fe58ceSMaruthi Bayyavarapu 	if (r == -ENODEV)
129a8fe58ceSMaruthi Bayyavarapu 		return 0;
130a8fe58ceSMaruthi Bayyavarapu 	else if (r)
131a8fe58ceSMaruthi Bayyavarapu 		return r;
132a8fe58ceSMaruthi Bayyavarapu 
133a8fe58ceSMaruthi Bayyavarapu 	r = cgs_get_pci_resource(adev->acp.cgs_device, CGS_RESOURCE_TYPE_MMIO,
134a8fe58ceSMaruthi Bayyavarapu 			0x5289, 0, &acp_base);
135a8fe58ceSMaruthi Bayyavarapu 	if (r == -ENODEV)
136a8fe58ceSMaruthi Bayyavarapu 		return 0;
137a8fe58ceSMaruthi Bayyavarapu 	else if (r)
138a8fe58ceSMaruthi Bayyavarapu 		return r;
139a8fe58ceSMaruthi Bayyavarapu 
140a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_cell = kzalloc(sizeof(struct mfd_cell) * ACP_DEVS,
141a8fe58ceSMaruthi Bayyavarapu 							GFP_KERNEL);
142a8fe58ceSMaruthi Bayyavarapu 
143a8fe58ceSMaruthi Bayyavarapu 	if (adev->acp.acp_cell == NULL)
144a8fe58ceSMaruthi Bayyavarapu 		return -ENOMEM;
145a8fe58ceSMaruthi Bayyavarapu 
146a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_res = kzalloc(sizeof(struct resource) * 4, GFP_KERNEL);
147a8fe58ceSMaruthi Bayyavarapu 
148a8fe58ceSMaruthi Bayyavarapu 	if (adev->acp.acp_res == NULL) {
149a8fe58ceSMaruthi Bayyavarapu 		kfree(adev->acp.acp_cell);
150a8fe58ceSMaruthi Bayyavarapu 		return -ENOMEM;
151a8fe58ceSMaruthi Bayyavarapu 	}
152a8fe58ceSMaruthi Bayyavarapu 
153a8fe58ceSMaruthi Bayyavarapu 	i2s_pdata = kzalloc(sizeof(struct i2s_platform_data) * 2, GFP_KERNEL);
154a8fe58ceSMaruthi Bayyavarapu 	if (i2s_pdata == NULL) {
155a8fe58ceSMaruthi Bayyavarapu 		kfree(adev->acp.acp_res);
156a8fe58ceSMaruthi Bayyavarapu 		kfree(adev->acp.acp_cell);
157a8fe58ceSMaruthi Bayyavarapu 		return -ENOMEM;
158a8fe58ceSMaruthi Bayyavarapu 	}
159a8fe58ceSMaruthi Bayyavarapu 
160a8fe58ceSMaruthi Bayyavarapu 	i2s_pdata[0].quirks = DW_I2S_QUIRK_COMP_REG_OFFSET;
161a8fe58ceSMaruthi Bayyavarapu 	i2s_pdata[0].cap = DWC_I2S_PLAY;
162a8fe58ceSMaruthi Bayyavarapu 	i2s_pdata[0].snd_rates = SNDRV_PCM_RATE_8000_96000;
163a8fe58ceSMaruthi Bayyavarapu 	i2s_pdata[0].i2s_reg_comp1 = ACP_I2S_COMP1_PLAY_REG_OFFSET;
164a8fe58ceSMaruthi Bayyavarapu 	i2s_pdata[0].i2s_reg_comp2 = ACP_I2S_COMP2_PLAY_REG_OFFSET;
165a8fe58ceSMaruthi Bayyavarapu 
166a8fe58ceSMaruthi Bayyavarapu 	i2s_pdata[1].quirks = DW_I2S_QUIRK_COMP_REG_OFFSET |
167a8fe58ceSMaruthi Bayyavarapu 				DW_I2S_QUIRK_COMP_PARAM1;
168a8fe58ceSMaruthi Bayyavarapu 	i2s_pdata[1].cap = DWC_I2S_RECORD;
169a8fe58ceSMaruthi Bayyavarapu 	i2s_pdata[1].snd_rates = SNDRV_PCM_RATE_8000_96000;
170a8fe58ceSMaruthi Bayyavarapu 	i2s_pdata[1].i2s_reg_comp1 = ACP_I2S_COMP1_CAP_REG_OFFSET;
171a8fe58ceSMaruthi Bayyavarapu 	i2s_pdata[1].i2s_reg_comp2 = ACP_I2S_COMP2_CAP_REG_OFFSET;
172a8fe58ceSMaruthi Bayyavarapu 
173a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_res[0].name = "acp2x_dma";
174a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_res[0].flags = IORESOURCE_MEM;
175a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_res[0].start = acp_base;
176a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_res[0].end = acp_base + ACP_DMA_REGS_END;
177a8fe58ceSMaruthi Bayyavarapu 
178a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_res[1].name = "acp2x_dw_i2s_play";
179a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_res[1].flags = IORESOURCE_MEM;
180a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_res[1].start = acp_base + ACP_I2S_PLAY_REGS_START;
181a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_res[1].end = acp_base + ACP_I2S_PLAY_REGS_END;
182a8fe58ceSMaruthi Bayyavarapu 
183a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_res[2].name = "acp2x_dw_i2s_cap";
184a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_res[2].flags = IORESOURCE_MEM;
185a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_res[2].start = acp_base + ACP_I2S_CAP_REGS_START;
186a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_res[2].end = acp_base + ACP_I2S_CAP_REGS_END;
187a8fe58ceSMaruthi Bayyavarapu 
188a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_res[3].name = "acp2x_dma_irq";
189a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_res[3].flags = IORESOURCE_IRQ;
190a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_res[3].start = amdgpu_irq_create_mapping(adev, 162);
191a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_res[3].end = adev->acp.acp_res[3].start;
192a8fe58ceSMaruthi Bayyavarapu 
193a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_cell[0].name = "acp_audio_dma";
194a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_cell[0].num_resources = 4;
195a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_cell[0].resources = &adev->acp.acp_res[0];
196a8fe58ceSMaruthi Bayyavarapu 
197a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_cell[1].name = "designware-i2s";
198a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_cell[1].num_resources = 1;
199a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_cell[1].resources = &adev->acp.acp_res[1];
200a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_cell[1].platform_data = &i2s_pdata[0];
201a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_cell[1].pdata_size = sizeof(struct i2s_platform_data);
202a8fe58ceSMaruthi Bayyavarapu 
203a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_cell[2].name = "designware-i2s";
204a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_cell[2].num_resources = 1;
205a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_cell[2].resources = &adev->acp.acp_res[2];
206a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_cell[2].platform_data = &i2s_pdata[1];
207a8fe58ceSMaruthi Bayyavarapu 	adev->acp.acp_cell[2].pdata_size = sizeof(struct i2s_platform_data);
208a8fe58ceSMaruthi Bayyavarapu 
209a8fe58ceSMaruthi Bayyavarapu 	r = mfd_add_hotplug_devices(adev->acp.parent, adev->acp.acp_cell,
210a8fe58ceSMaruthi Bayyavarapu 								ACP_DEVS);
211a8fe58ceSMaruthi Bayyavarapu 	if (r)
212a8fe58ceSMaruthi Bayyavarapu 		return r;
213a8fe58ceSMaruthi Bayyavarapu 
214a8fe58ceSMaruthi Bayyavarapu 	return 0;
215a8fe58ceSMaruthi Bayyavarapu }
216a8fe58ceSMaruthi Bayyavarapu 
217a8fe58ceSMaruthi Bayyavarapu /**
218a8fe58ceSMaruthi Bayyavarapu  * acp_hw_fini - stop the hardware block
219a8fe58ceSMaruthi Bayyavarapu  *
220a8fe58ceSMaruthi Bayyavarapu  * @adev: amdgpu_device pointer
221a8fe58ceSMaruthi Bayyavarapu  *
222a8fe58ceSMaruthi Bayyavarapu  */
223a8fe58ceSMaruthi Bayyavarapu static int acp_hw_fini(void *handle)
224a8fe58ceSMaruthi Bayyavarapu {
225a8fe58ceSMaruthi Bayyavarapu 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
226a8fe58ceSMaruthi Bayyavarapu 
227a8fe58ceSMaruthi Bayyavarapu 	mfd_remove_devices(adev->acp.parent);
228a8fe58ceSMaruthi Bayyavarapu 	kfree(adev->acp.acp_res);
229a8fe58ceSMaruthi Bayyavarapu 	kfree(adev->acp.acp_cell);
230a8fe58ceSMaruthi Bayyavarapu 
231a8fe58ceSMaruthi Bayyavarapu 	return 0;
232a8fe58ceSMaruthi Bayyavarapu }
233a8fe58ceSMaruthi Bayyavarapu 
234a8fe58ceSMaruthi Bayyavarapu static int acp_suspend(void *handle)
235a8fe58ceSMaruthi Bayyavarapu {
236a8fe58ceSMaruthi Bayyavarapu 	return 0;
237a8fe58ceSMaruthi Bayyavarapu }
238a8fe58ceSMaruthi Bayyavarapu 
239a8fe58ceSMaruthi Bayyavarapu static int acp_resume(void *handle)
240a8fe58ceSMaruthi Bayyavarapu {
241a8fe58ceSMaruthi Bayyavarapu 	return 0;
242a8fe58ceSMaruthi Bayyavarapu }
243a8fe58ceSMaruthi Bayyavarapu 
244a8fe58ceSMaruthi Bayyavarapu static int acp_early_init(void *handle)
245a8fe58ceSMaruthi Bayyavarapu {
246a8fe58ceSMaruthi Bayyavarapu 	return 0;
247a8fe58ceSMaruthi Bayyavarapu }
248a8fe58ceSMaruthi Bayyavarapu 
249a8fe58ceSMaruthi Bayyavarapu static bool acp_is_idle(void *handle)
250a8fe58ceSMaruthi Bayyavarapu {
251a8fe58ceSMaruthi Bayyavarapu 	return true;
252a8fe58ceSMaruthi Bayyavarapu }
253a8fe58ceSMaruthi Bayyavarapu 
254a8fe58ceSMaruthi Bayyavarapu static int acp_wait_for_idle(void *handle)
255a8fe58ceSMaruthi Bayyavarapu {
256a8fe58ceSMaruthi Bayyavarapu 	return 0;
257a8fe58ceSMaruthi Bayyavarapu }
258a8fe58ceSMaruthi Bayyavarapu 
259a8fe58ceSMaruthi Bayyavarapu static int acp_soft_reset(void *handle)
260a8fe58ceSMaruthi Bayyavarapu {
261a8fe58ceSMaruthi Bayyavarapu 	return 0;
262a8fe58ceSMaruthi Bayyavarapu }
263a8fe58ceSMaruthi Bayyavarapu 
264a8fe58ceSMaruthi Bayyavarapu static void acp_print_status(void *handle)
265a8fe58ceSMaruthi Bayyavarapu {
266a8fe58ceSMaruthi Bayyavarapu 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
267a8fe58ceSMaruthi Bayyavarapu 
268a8fe58ceSMaruthi Bayyavarapu 	dev_info(adev->dev, "ACP STATUS\n");
269a8fe58ceSMaruthi Bayyavarapu }
270a8fe58ceSMaruthi Bayyavarapu 
271a8fe58ceSMaruthi Bayyavarapu static int acp_set_clockgating_state(void *handle,
272a8fe58ceSMaruthi Bayyavarapu 				     enum amd_clockgating_state state)
273a8fe58ceSMaruthi Bayyavarapu {
274a8fe58ceSMaruthi Bayyavarapu 	return 0;
275a8fe58ceSMaruthi Bayyavarapu }
276a8fe58ceSMaruthi Bayyavarapu 
277a8fe58ceSMaruthi Bayyavarapu static int acp_set_powergating_state(void *handle,
278a8fe58ceSMaruthi Bayyavarapu 				     enum amd_powergating_state state)
279a8fe58ceSMaruthi Bayyavarapu {
280a8fe58ceSMaruthi Bayyavarapu 	return 0;
281a8fe58ceSMaruthi Bayyavarapu }
282a8fe58ceSMaruthi Bayyavarapu 
283a8fe58ceSMaruthi Bayyavarapu const struct amd_ip_funcs acp_ip_funcs = {
284a8fe58ceSMaruthi Bayyavarapu 	.early_init = acp_early_init,
285a8fe58ceSMaruthi Bayyavarapu 	.late_init = NULL,
286a8fe58ceSMaruthi Bayyavarapu 	.sw_init = acp_sw_init,
287a8fe58ceSMaruthi Bayyavarapu 	.sw_fini = acp_sw_fini,
288a8fe58ceSMaruthi Bayyavarapu 	.hw_init = acp_hw_init,
289a8fe58ceSMaruthi Bayyavarapu 	.hw_fini = acp_hw_fini,
290a8fe58ceSMaruthi Bayyavarapu 	.suspend = acp_suspend,
291a8fe58ceSMaruthi Bayyavarapu 	.resume = acp_resume,
292a8fe58ceSMaruthi Bayyavarapu 	.is_idle = acp_is_idle,
293a8fe58ceSMaruthi Bayyavarapu 	.wait_for_idle = acp_wait_for_idle,
294a8fe58ceSMaruthi Bayyavarapu 	.soft_reset = acp_soft_reset,
295a8fe58ceSMaruthi Bayyavarapu 	.print_status = acp_print_status,
296a8fe58ceSMaruthi Bayyavarapu 	.set_clockgating_state = acp_set_clockgating_state,
297a8fe58ceSMaruthi Bayyavarapu 	.set_powergating_state = acp_set_powergating_state,
298a8fe58ceSMaruthi Bayyavarapu };
299