1/* SPDX-License-Identifier: GPL-2.0+ */
2/*
3 * Copyright 2019 NXP
4 *
5 * Header file for the DSP IPC implementation
6 */
7
8#ifndef _IMX_DSP_IPC_H
9#define _IMX_DSP_IPC_H
10
11#include <linux/device.h>
12#include <linux/types.h>
13#include <linux/mailbox_client.h>
14
15#define DSP_MU_CHAN_NUM		4
16
17struct imx_dsp_chan {
18	struct imx_dsp_ipc *ipc;
19	struct mbox_client cl;
20	struct mbox_chan *ch;
21	char *name;
22	int idx;
23};
24
25struct imx_dsp_ops {
26	void (*handle_reply)(struct imx_dsp_ipc *ipc);
27	void (*handle_request)(struct imx_dsp_ipc *ipc);
28};
29
30struct imx_dsp_ipc {
31	/* Host <-> DSP communication uses 2 txdb and 2 rxdb channels */
32	struct imx_dsp_chan chans[DSP_MU_CHAN_NUM];
33	struct device *dev;
34	struct imx_dsp_ops *ops;
35	void *private_data;
36};
37
38static inline void imx_dsp_set_data(struct imx_dsp_ipc *ipc, void *data)
39{
40	ipc->private_data = data;
41}
42
43static inline void *imx_dsp_get_data(struct imx_dsp_ipc *ipc)
44{
45	return ipc->private_data;
46}
47
48#if IS_ENABLED(CONFIG_IMX_DSP)
49
50int imx_dsp_ring_doorbell(struct imx_dsp_ipc *dsp, unsigned int chan_idx);
51
52struct mbox_chan *imx_dsp_request_channel(struct imx_dsp_ipc *ipc, int idx);
53void imx_dsp_free_channel(struct imx_dsp_ipc *ipc, int idx);
54
55#else
56
57static inline int imx_dsp_ring_doorbell(struct imx_dsp_ipc *ipc,
58					unsigned int chan_idx)
59{
60	return -ENOTSUPP;
61}
62
63struct mbox_chan *imx_dsp_request_channel(struct imx_dsp_ipc *ipc, int idx)
64{
65	return ERR_PTR(-EOPNOTSUPP);
66}
67
68void imx_dsp_free_channel(struct imx_dsp_ipc *ipc, int idx) { }
69
70#endif
71#endif /* _IMX_DSP_IPC_H */
72