1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Copyright (c) 2022 MediaTek Inc.
4 */
5
6#ifndef MTK_ADSP_IPC_H
7#define MTK_ADSP_IPC_H
8
9#include <linux/device.h>
10#include <linux/types.h>
11#include <linux/mailbox_controller.h>
12#include <linux/mailbox_client.h>
13
14#define MTK_ADSP_IPC_REQ 0
15#define MTK_ADSP_IPC_RSP 1
16#define MTK_ADSP_IPC_OP_REQ 0x1
17#define MTK_ADSP_IPC_OP_RSP 0x2
18
19enum {
20	MTK_ADSP_MBOX_REPLY,
21	MTK_ADSP_MBOX_REQUEST,
22	MTK_ADSP_MBOX_NUM,
23};
24
25struct mtk_adsp_ipc;
26
27struct mtk_adsp_ipc_ops {
28	void (*handle_reply)(struct mtk_adsp_ipc *ipc);
29	void (*handle_request)(struct mtk_adsp_ipc *ipc);
30};
31
32struct mtk_adsp_chan {
33	struct mtk_adsp_ipc *ipc;
34	struct mbox_client cl;
35	struct mbox_chan *ch;
36	char *name;
37	int idx;
38};
39
40struct mtk_adsp_ipc {
41	struct mtk_adsp_chan chans[MTK_ADSP_MBOX_NUM];
42	struct device *dev;
43	struct mtk_adsp_ipc_ops *ops;
44	void *private_data;
45};
46
47static inline void mtk_adsp_ipc_set_data(struct mtk_adsp_ipc *ipc, void *data)
48{
49	ipc->private_data = data;
50}
51
52static inline void *mtk_adsp_ipc_get_data(struct mtk_adsp_ipc *ipc)
53{
54	return ipc->private_data;
55}
56
57int mtk_adsp_ipc_send(struct mtk_adsp_ipc *ipc, unsigned int idx, uint32_t op);
58
59#endif /* MTK_ADSP_IPC_H */
60