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 
19 enum {
20 	MTK_ADSP_MBOX_REPLY,
21 	MTK_ADSP_MBOX_REQUEST,
22 	MTK_ADSP_MBOX_NUM,
23 };
24 
25 struct mtk_adsp_ipc;
26 
27 struct mtk_adsp_ipc_ops {
28 	void (*handle_reply)(struct mtk_adsp_ipc *ipc);
29 	void (*handle_request)(struct mtk_adsp_ipc *ipc);
30 };
31 
32 struct 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 
40 struct 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 
mtk_adsp_ipc_set_data(struct mtk_adsp_ipc * ipc,void * data)47 static inline void mtk_adsp_ipc_set_data(struct mtk_adsp_ipc *ipc, void *data)
48 {
49 	if (!ipc)
50 		return;
51 
52 	ipc->private_data = data;
53 }
54 
mtk_adsp_ipc_get_data(struct mtk_adsp_ipc * ipc)55 static inline void *mtk_adsp_ipc_get_data(struct mtk_adsp_ipc *ipc)
56 {
57 	if (!ipc)
58 		return NULL;
59 
60 	return ipc->private_data;
61 }
62 
63 int mtk_adsp_ipc_send(struct mtk_adsp_ipc *ipc, unsigned int idx, uint32_t op);
64 
65 #endif /* MTK_ADSP_IPC_H */
66