• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  
17  struct 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  
25  struct imx_dsp_ops {
26  	void (*handle_reply)(struct imx_dsp_ipc *ipc);
27  	void (*handle_request)(struct imx_dsp_ipc *ipc);
28  };
29  
30  struct 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  
imx_dsp_set_data(struct imx_dsp_ipc * ipc,void * data)38  static inline void imx_dsp_set_data(struct imx_dsp_ipc *ipc, void *data)
39  {
40  	if (!ipc)
41  		return;
42  
43  	ipc->private_data = data;
44  }
45  
imx_dsp_get_data(struct imx_dsp_ipc * ipc)46  static inline void *imx_dsp_get_data(struct imx_dsp_ipc *ipc)
47  {
48  	if (!ipc)
49  		return NULL;
50  
51  	return ipc->private_data;
52  }
53  
54  #if IS_ENABLED(CONFIG_IMX_DSP)
55  
56  int imx_dsp_ring_doorbell(struct imx_dsp_ipc *dsp, unsigned int chan_idx);
57  
58  struct mbox_chan *imx_dsp_request_channel(struct imx_dsp_ipc *ipc, int idx);
59  void imx_dsp_free_channel(struct imx_dsp_ipc *ipc, int idx);
60  
61  #else
62  
imx_dsp_ring_doorbell(struct imx_dsp_ipc * ipc,unsigned int chan_idx)63  static inline int imx_dsp_ring_doorbell(struct imx_dsp_ipc *ipc,
64  					unsigned int chan_idx)
65  {
66  	return -ENOTSUPP;
67  }
68  
imx_dsp_request_channel(struct imx_dsp_ipc * ipc,int idx)69  struct mbox_chan *imx_dsp_request_channel(struct imx_dsp_ipc *ipc, int idx)
70  {
71  	return ERR_PTR(-EOPNOTSUPP);
72  }
73  
imx_dsp_free_channel(struct imx_dsp_ipc * ipc,int idx)74  void imx_dsp_free_channel(struct imx_dsp_ipc *ipc, int idx) { }
75  
76  #endif
77  #endif /* _IMX_DSP_IPC_H */
78