1/* SPDX-License-Identifier: GPL-2.0+ */
2/*
3 * Copyright 2017-2021  NXP
4 *
5 ******************************************************************************
6 * Communication stack of audio with rpmsg
7 ******************************************************************************
8 * Packet structure:
9 *   A SRTM message consists of a 10 bytes header followed by 0~N bytes of data
10 *
11 *   +---------------+-------------------------------+
12 *   |               |            Content            |
13 *   +---------------+-------------------------------+
14 *   |  Byte Offset  | 7   6   5   4   3   2   1   0 |
15 *   +---------------+---+---+---+---+---+---+---+---+
16 *   |       0       |           Category            |
17 *   +---------------+---+---+---+---+---+---+---+---+
18 *   |     1 ~ 2     |           Version             |
19 *   +---------------+---+---+---+---+---+---+---+---+
20 *   |       3       |             Type              |
21 *   +---------------+---+---+---+---+---+---+---+---+
22 *   |       4       |           Command             |
23 *   +---------------+---+---+---+---+---+---+---+---+
24 *   |       5       |           Reserved0           |
25 *   +---------------+---+---+---+---+---+---+---+---+
26 *   |       6       |           Reserved1           |
27 *   +---------------+---+---+---+---+---+---+---+---+
28 *   |       7       |           Reserved2           |
29 *   +---------------+---+---+---+---+---+---+---+---+
30 *   |       8       |           Reserved3           |
31 *   +---------------+---+---+---+---+---+---+---+---+
32 *   |       9       |           Reserved4           |
33 *   +---------------+---+---+---+---+---+---+---+---+
34 *   |       10      |            DATA 0             |
35 *   +---------------+---+---+---+---+---+---+---+---+
36 *   :   :   :   :   :   :   :   :   :   :   :   :   :
37 *   +---------------+---+---+---+---+---+---+---+---+
38 *   |   N + 10 - 1  |            DATA N-1           |
39 *   +---------------+---+---+---+---+---+---+---+---+
40 *
41 *   +----------+------------+------------------------------------------------+
42 *   |  Field   |    Byte    |                                                |
43 *   +----------+------------+------------------------------------------------+
44 *   | Category |     0      | The destination category.                      |
45 *   +----------+------------+------------------------------------------------+
46 *   | Version  |   1 ~ 2    | The category version of the sender of the      |
47 *   |          |            | packet.                                        |
48 *   |          |            | The first byte represent the major version of  |
49 *   |          |            | the packet.The second byte represent the minor |
50 *   |          |            | version of the packet.                         |
51 *   +----------+------------+------------------------------------------------+
52 *   |  Type    |     3      | The message type of current message packet.    |
53 *   +----------+------------+------------------------------------------------+
54 *   | Command  |     4      | The command byte sent to remote processor/SoC. |
55 *   +----------+------------+------------------------------------------------+
56 *   | Reserved |   5 ~ 9    | Reserved field for future extension.           |
57 *   +----------+------------+------------------------------------------------+
58 *   | Data     |     N      | The data payload of the message packet.        |
59 *   +----------+------------+------------------------------------------------+
60 *
61 * Audio control:
62 *   SRTM Audio Control Category Request Command Table:
63 *   +----------+---------+------+---------+-------------------------------+-----------------------+
64 *   | Category | Version | Type | Command | Data                          | Function              |
65 *   +----------+---------+------+---------+-------------------------------+-----------------------+
66 *   |  0x03    | 0x0100  | 0x00 |  0x00   | Data[0]: Audio Device Index   | Open a TX Instance.   |
67 *   |          |         |      |         | Data[1]:     format           |                       |
68 *   |          |         |      |         | Data[2]:     channels         |                       |
69 *   |          |         |      |         | Data[3-6]:   samplerate       |                       |
70 *   |          |         |      |         | Data[7-10]:  buffer_addr      |                       |
71 *   |          |         |      |         | Data[11-14]: buffer_size      |                       |
72 *   |          |         |      |         | Data[15-18]: period_size      |                       |
73 *   |          |         |      |         | Data[19-22]: buffer_tail      |                       |
74 *   +----------+---------+------+---------+-------------------------------+-----------------------+
75 *   |  0x03    | 0x0100  | 0x00 |  0x01   | Data[0]: Audio Device Index   | Start a TX Instance.  |
76 *   |          |         |      |         | Same as above command         |                       |
77 *   +----------+---------+------+---------+-------------------------------+-----------------------+
78 *   |  0x03    | 0x0100  | 0x00 |  0x02   | Data[0]: Audio Device Index   | Pause a TX Instance.  |
79 *   |          |         |      |         | Same as above command         |                       |
80 *   +----------+---------+------+---------+-------------------------------+-----------------------+
81 *   |  0x03    | 0x0100  | 0x00 |  0x03   | Data[0]: Audio Device Index   | Resume a TX Instance. |
82 *   +----------+---------+------+---------+-------------------------------+-----------------------+
83 *   |  0x03    | 0x0100  | 0x00 |  0x04   | Data[0]: Audio Device Index   | Stop a TX Instance.   |
84 *   +----------+---------+------+---------+-------------------------------+-----------------------+
85 *   |  0x03    | 0x0100  | 0x00 |  0x05   | Data[0]: Audio Device Index   | Close a TX Instance.  |
86 *   +----------+---------+------+---------+-------------------------------+-----------------------+
87 *   |  0x03    | 0x0100  | 0x00 |  0x06   | Data[0]: Audio Device Index   | Set Parameters for    |
88 *   |          |         |      |         | Data[1]:     format           | a TX Instance.        |
89 *   |          |         |      |         | Data[2]:     channels         |                       |
90 *   |          |         |      |         | Data[3-6]:   samplerate       |                       |
91 *   |          |         |      |         | Data[7-22]:  reserved         |                       |
92 *   +----------+---------+------+---------+-------------------------------+-----------------------+
93 *   |  0x03    | 0x0100  | 0x00 |  0x07   | Data[0]: Audio Device Index   | Set TX Buffer.        |
94 *   |          |         |      |         | Data[1-6]:   reserved         |                       |
95 *   |          |         |      |         | Data[7-10]:  buffer_addr      |                       |
96 *   |          |         |      |         | Data[11-14]: buffer_size      |                       |
97 *   |          |         |      |         | Data[15-18]: period_size      |                       |
98 *   |          |         |      |         | Data[19-22]: buffer_tail      |                       |
99 *   +----------+---------+------+---------+-------------------------------+-----------------------+
100 *   |  0x03    | 0x0100  | 0x00 |  0x08   | Data[0]: Audio Device Index   | Suspend a TX Instance |
101 *   +----------+---------+------+---------+-------------------------------+-----------------------+
102 *   |  0x03    | 0x0100  | 0x00 |  0x09   | Data[0]: Audio Device Index   | Resume a TX Instance. |
103 *   |          |         |      |         | Data[1]:     format           |                       |
104 *   |          |         |      |         | Data[2]:     channels         |                       |
105 *   |          |         |      |         | Data[3-6]:   samplerate       |                       |
106 *   |          |         |      |         | Data[7-10]:  buffer_addr      |                       |
107 *   |          |         |      |         | Data[11-14]: buffer_size      |                       |
108 *   |          |         |      |         | Data[15-18]: period_size      |                       |
109 *   |          |         |      |         | Data[19-22]: buffer_tail      |                       |
110 *   +----------+---------+------+---------+-------------------------------+-----------------------+
111 *   |  0x03    | 0x0100  | 0x00 |  0x0A   | Data[0]: Audio Device Index   | Open a RX Instance.   |
112 *   +----------+---------+------+---------+-------------------------------+-----------------------+
113 *   |  0x03    | 0x0100  | 0x00 |  0x0B   | Data[0]: Audio Device Index   | Start a RX Instance.  |
114 *   +----------+---------+------+---------+-------------------------------+-----------------------+
115 *   |  0x03    | 0x0100  | 0x00 |  0x0C   | Data[0]: Audio Device Index   | Pause a RX Instance.  |
116 *   +----------+---------+------+---------+-------------------------------+-----------------------+
117 *   |  0x03    | 0x0100  | 0x00 |  0x0D   | Data[0]: Audio Device Index   | Resume a RX Instance. |
118 *   +----------+---------+------+---------+-------------------------------+-----------------------+
119 *   |  0x03    | 0x0100  | 0x00 |  0x0E   | Data[0]: Audio Device Index   | Stop a RX Instance.   |
120 *   +----------+---------+------+---------+-------------------------------+-----------------------+
121 *   |  0x03    | 0x0100  | 0x00 |  0x0F   | Data[0]: Audio Device Index   | Close a RX Instance.  |
122 *   +----------+---------+------+---------+-------------------------------+-----------------------+
123 *   |  0x03    | 0x0100  | 0x00 |  0x10   | Data[0]: Audio Device Index   | Set Parameters for    |
124 *   |          |         |      |         | Data[1]:     format           | a RX Instance.        |
125 *   |          |         |      |         | Data[2]:     channels         |                       |
126 *   |          |         |      |         | Data[3-6]:   samplerate       |                       |
127 *   |          |         |      |         | Data[7-22]:  reserved         |                       |
128 *   +----------+---------+------+---------+-------------------------------+-----------------------+
129 *   |  0x03    | 0x0100  | 0x00 |  0x11   | Data[0]: Audio Device Index   | Set RX Buffer.        |
130 *   |          |         |      |         | Data[1-6]:   reserved         |                       |
131 *   |          |         |      |         | Data[7-10]:  buffer_addr      |                       |
132 *   |          |         |      |         | Data[11-14]: buffer_size      |                       |
133 *   |          |         |      |         | Data[15-18]: period_size      |                       |
134 *   |          |         |      |         | Data[19-22]: buffer_tail      |                       |
135 *   +----------+---------+------+---------+-------------------------------+-----------------------+
136 *   |  0x03    | 0x0100  | 0x00 |  0x12   | Data[0]: Audio Device Index   | Suspend a RX Instance.|
137 *   +----------+---------+------+---------+-------------------------------+-----------------------+
138 *   |  0x03    | 0x0100  | 0x00 |  0x13   | Data[0]: Audio Device Index   | Resume a RX Instance. |
139 *   |          |         |      |         | Data[1]:     format           |                       |
140 *   |          |         |      |         | Data[2]:     channels         |                       |
141 *   |          |         |      |         | Data[3-6]:   samplerate       |                       |
142 *   |          |         |      |         | Data[7-10]:  buffer_addr      |                       |
143 *   |          |         |      |         | Data[11-14]: buffer_size      |                       |
144 *   |          |         |      |         | Data[15-18]: period_size      |                       |
145 *   |          |         |      |         | Data[19-22]: buffer_tail      |                       |
146 *   +----------+---------+------+---------+-------------------------------+-----------------------+
147 *   |  0x03    | 0x0100  | 0x00 |  0x14   | Data[0]: Audio Device Index   | Set register value    |
148 *   |          |         |      |         | Data[1-6]:   reserved         | to codec              |
149 *   |          |         |      |         | Data[7-10]:  register         |                       |
150 *   |          |         |      |         | Data[11-14]: value            |                       |
151 *   |          |         |      |         | Data[15-22]: reserved         |                       |
152 *   +----------+---------+------+---------+-------------------------------+-----------------------+
153 *   |  0x03    | 0x0100  | 0x00 |  0x15   | Data[0]: Audio Device Index   | Get register value    |
154 *   |          |         |      |         | Data[1-6]:   reserved         | from codec            |
155 *   |          |         |      |         | Data[7-10]:  register         |                       |
156 *   |          |         |      |         | Data[11-22]: reserved         |                       |
157 *   +----------+---------+------+---------+-------------------------------+-----------------------+
158 *   Note 1: See <List of Sample Format> for available value of
159 *           Sample Format;
160 *   Note 2: See <List of Audio Channels> for available value of Channels;
161 *   Note 3: Sample Rate of Set Parameters for an Audio TX Instance
162 *           Command and Set Parameters for an Audio RX Instance Command is
163 *           in little-endian format.
164 *
165 *   SRTM Audio Control Category Response Command Table:
166 *   +----------+---------+------+---------+-------------------------------+-----------------------+
167 *   | Category | Version | Type | Command | Data                          | Function              |
168 *   +----------+---------+------+---------+-------------------------------+-----------------------+
169 *   |  0x03    | 0x0100  | 0x01 |  0x00   | Data[0]: Audio Device Index   | Reply for Open        |
170 *   |          |         |      |         | Data[1]: Return code          | a TX Instance         |
171 *   +----------+---------+------+---------+-------------------------------+-----------------------+
172 *   |  0x03    | 0x0100  | 0x01 |  0x01   | Data[0]: Audio Device Index   | Reply for Start       |
173 *   |          |         |      |         | Data[1]: Return code          | a TX Instance         |
174 *   +----------+---------+------+---------+-------------------------------+-----------------------+
175 *   |  0x03    | 0x0100  | 0x01 |  0x02   | Data[0]: Audio Device Index   | Reply for Pause       |
176 *   |          |         |      |         | Data[1]: Return code          | a TX Instance         |
177 *   +----------+---------+------+---------+-------------------------------+-----------------------+
178 *   |  0x03    | 0x0100  | 0x01 |  0x03   | Data[0]: Audio Device Index   | Reply for Resume      |
179 *   |          |         |      |         | Data[1]: Return code          | a TX Instance         |
180 *   +----------+---------+------+---------+-------------------------------+-----------------------+
181 *   |  0x03    | 0x0100  | 0x01 |  0x04   | Data[0]: Audio Device Index   | Reply for Stop        |
182 *   |          |         |      |         | Data[1]: Return code          | a TX Instance         |
183 *   +----------+---------+------+---------+-------------------------------+-----------------------+
184 *   |  0x03    | 0x0100  | 0x01 |  0x05   | Data[0]: Audio Device Index   | Reply for Close       |
185 *   |          |         |      |         | Data[1]: Return code          | a TX Instance         |
186 *   +----------+---------+------+---------+-------------------------------+-----------------------+
187 *   |  0x03    | 0x0100  | 0x01 |  0x06   | Data[0]: Audio Device Index   | Reply for Set Param   |
188 *   |          |         |      |         | Data[1]: Return code          | for a TX Instance.    |
189 *   +----------+---------+------+---------+-------------------------------+-----------------------+
190 *   |  0x03    | 0x0100  | 0x01 |  0x07   | Data[0]: Audio Device Index   | Reply for Set         |
191 *   |          |         |      |         | Data[1]: Return code          | TX Buffer             |
192 *   +----------+---------+------+---------+-------------------------------+-----------------------+
193 *   |  0x03    | 0x0100  | 0x01 |  0x08   | Data[0]: Audio Device Index   | Reply for Suspend     |
194 *   |          |         |      |         | Data[1]: Return code          | a TX Instance         |
195 *   +----------+---------+------+---------+-------------------------------+-----------------------+
196 *   |  0x03    | 0x0100  | 0x01 |  0x09   | Data[0]: Audio Device Index   | Reply for Resume      |
197 *   |          |         |      |         | Data[1]: Return code          | a TX Instance         |
198 *   +----------+---------+------+---------+-------------------------------+-----------------------+
199 *   |  0x03    | 0x0100  | 0x01 |  0x0A   | Data[0]: Audio Device Index   | Reply for Open        |
200 *   |          |         |      |         | Data[1]: Return code          | a TX Instance         |
201 *   +----------+---------+------+---------+-------------------------------+-----------------------+
202 *   |  0x03    | 0x0100  | 0x01 |  0x0B   | Data[0]: Audio Device Index   | Reply for Start       |
203 *   |          |         |      |         | Data[1]: Return code          | a TX Instance         |
204 *   +----------+---------+------+---------+-------------------------------+-----------------------+
205 *   |  0x03    | 0x0100  | 0x01 |  0x0C   | Data[0]: Audio Device Index   | Reply for Pause       |
206 *   |          |         |      |         | Data[1]: Return code          | a TX Instance         |
207 *   +----------+---------+------+---------+-------------------------------+-----------------------+
208 *   |  0x03    | 0x0100  | 0x01 |  0x0D   | Data[0]: Audio Device Index   | Reply for Resume      |
209 *   |          |         |      |         | Data[1]: Return code          | a RX Instance         |
210 *   +----------+---------+------+---------+-------------------------------+-----------------------+
211 *   |  0x03    | 0x0100  | 0x01 |  0x0E   | Data[0]: Audio Device Index   | Reply for Stop        |
212 *   |          |         |      |         | Data[1]: Return code          | a RX Instance         |
213 *   +----------+---------+------+---------+-------------------------------+-----------------------+
214 *   |  0x03    | 0x0100  | 0x01 |  0x0F   | Data[0]: Audio Device Index   | Reply for Close       |
215 *   |          |         |      |         | Data[1]: Return code          | a RX Instance         |
216 *   +----------+---------+------+---------+-------------------------------+-----------------------+
217 *   |  0x03    | 0x0100  | 0x01 |  0x10   | Data[0]: Audio Device Index   | Reply for Set Param   |
218 *   |          |         |      |         | Data[1]: Return code          | for a RX Instance.    |
219 *   +----------+---------+------+---------+-------------------------------+-----------------------+
220 *   |  0x03    | 0x0100  | 0x01 |  0x11   | Data[0]: Audio Device Index   | Reply for Set         |
221 *   |          |         |      |         | Data[1]: Return code          | RX Buffer             |
222 *   +----------+---------+------+---------+-------------------------------+-----------------------+
223 *   |  0x03    | 0x0100  | 0x01 |  0x12   | Data[0]: Audio Device Index   | Reply for Suspend     |
224 *   |          |         |      |         | Data[1]: Return code          | a RX Instance         |
225 *   +----------+---------+------+---------+-------------------------------+-----------------------+
226 *   |  0x03    | 0x0100  | 0x01 |  0x13   | Data[0]: Audio Device Index   | Reply for Resume      |
227 *   |          |         |      |         | Data[1]: Return code          | a RX Instance         |
228 *   +----------+---------+------+---------+-------------------------------+-----------------------+
229 *   |  0x03    | 0x0100  | 0x01 |  0x14   | Data[0]: Audio Device Index   | Reply for Set codec   |
230 *   |          |         |      |         | Data[1]: Return code          | register value        |
231 *   +----------+---------+------+---------+-------------------------------+-----------------------+
232 *   |  0x03    | 0x0100  | 0x01 |  0x15   | Data[0]: Audio Device Index   | Reply for Get codec   |
233 *   |          |         |      |         | Data[1]: Return code          | register value        |
234 *   |          |         |      |         | Data[2-6]:   reserved         |                       |
235 *   |          |         |      |         | Data[7-10]:  register         |                       |
236 *   |          |         |      |         | Data[11-14]: value            |                       |
237 *   |          |         |      |         | Data[15-22]: reserved         |                       |
238 *   +----------+---------+------+---------+-------------------------------+-----------------------+
239 *
240 *   SRTM Audio Control Category Notification Command Table:
241 *   +----------+---------+------+---------+-------------------------------+-----------------------+
242 *   | Category | Version | Type | Command | Data                          | Function              |
243 *   +----------+---------+------+---------+-------------------------------+-----------------------+
244 *   |  0x03    | 0x0100  | 0x02 |  0x00   | Data[0]: Audio Device Index   | Notify one TX period  |
245 *   |          |         |      |         |                               | is finished           |
246 *   +----------+---------+------+---------+-------------------------------+-----------------------+
247 *   |  0x03    | 0x0100  | 0x02 |  0x01   | Data[0]: Audio Device Index   | Notify one RX period  |
248 *   |          |         |      |         |                               | is finished           |
249 *   +----------+---------+------+---------+-------------------------------+-----------------------+
250 *
251 *   List of Sample Format:
252 *   +------------------+-----------------------+
253 *   | Sample Format    |   Description         |
254 *   +------------------+-----------------------+
255 *   |       0x0        | S16_LE                |
256 *   +------------------+-----------------------+
257 *   |       0x1        | S24_LE                |
258 *   +------------------+-----------------------+
259 *
260 *   List of Audio Channels
261 *   +------------------+-----------------------+
262 *   |  Audio Channel   |   Description         |
263 *   +------------------+-----------------------+
264 *   |       0x0        | Left Channel          |
265 *   +------------------+-----------------------+
266 *   |       0x1        | Right Channel         |
267 *   +------------------+---------------- ------+
268 *   |       0x2        | Left & Right Channel  |
269 *   +------------------+-----------------------+
270 *
271 */
272
273#ifndef _IMX_PCM_RPMSG_H
274#define _IMX_PCM_RPMSG_H
275
276#include <linux/pm_qos.h>
277#include <linux/interrupt.h>
278#include <sound/dmaengine_pcm.h>
279
280#define RPMSG_TIMEOUT 1000
281
282/* RPMSG Command (TYPE A)*/
283#define TX_OPEN		0x0
284#define	TX_START	0x1
285#define	TX_PAUSE	0x2
286#define	TX_RESTART	0x3
287#define	TX_TERMINATE	0x4
288#define	TX_CLOSE	0x5
289#define TX_HW_PARAM	0x6
290#define	TX_BUFFER	0x7
291#define	TX_SUSPEND	0x8
292#define	TX_RESUME	0x9
293
294#define	RX_OPEN		0xA
295#define	RX_START	0xB
296#define	RX_PAUSE	0xC
297#define	RX_RESTART	0xD
298#define	RX_TERMINATE	0xE
299#define	RX_CLOSE	0xF
300#define	RX_HW_PARAM	0x10
301#define	RX_BUFFER	0x11
302#define	RX_SUSPEND	0x12
303#define	RX_RESUME	0x13
304#define SET_CODEC_VALUE 0x14
305#define GET_CODEC_VALUE 0x15
306#define	TX_POINTER	0x16
307#define	RX_POINTER	0x17
308/* Total msg numver for type A */
309#define MSG_TYPE_A_NUM  0x18
310
311/* RPMSG Command (TYPE C)*/
312#define	TX_PERIOD_DONE	0x0
313#define	RX_PERIOD_DONE	0x1
314/* Total msg numver for type C */
315#define MSG_TYPE_C_NUM  0x2
316
317#define MSG_MAX_NUM     (MSG_TYPE_A_NUM + MSG_TYPE_C_NUM)
318
319#define MSG_TYPE_A	0x0
320#define MSG_TYPE_B	0x1
321#define MSG_TYPE_C	0x2
322
323#define RESP_NONE		0x0
324#define RESP_NOT_ALLOWED	0x1
325#define	RESP_SUCCESS		0x2
326#define	RESP_FAILED		0x3
327
328#define	RPMSG_S16_LE		0x0
329#define	RPMSG_S24_LE		0x1
330#define	RPMSG_S32_LE		0x2
331#define	RPMSG_DSD_U16_LE	49  /* SNDRV_PCM_FORMAT_DSD_U16_LE */
332#define	RPMSG_DSD_U24_LE	0x4
333#define	RPMSG_DSD_U32_LE	50  /* SNDRV_PCM_FORMAT_DSD_U32_LE */
334
335#define	RPMSG_CH_LEFT		0x0
336#define	RPMSG_CH_RIGHT		0x1
337#define	RPMSG_CH_STEREO		0x2
338
339#define WORK_MAX_NUM    0x30
340
341/* Category define */
342#define IMX_RMPSG_LIFECYCLE     1
343#define IMX_RPMSG_PMIC          2
344#define IMX_RPMSG_AUDIO         3
345#define IMX_RPMSG_KEY           4
346#define IMX_RPMSG_GPIO          5
347#define IMX_RPMSG_RTC           6
348#define IMX_RPMSG_SENSOR        7
349
350/* rpmsg version */
351#define IMX_RMPSG_MAJOR         1
352#define IMX_RMPSG_MINOR         0
353
354#define TX SNDRV_PCM_STREAM_PLAYBACK
355#define RX SNDRV_PCM_STREAM_CAPTURE
356
357/**
358 * struct rpmsg_head: rpmsg header structure
359 *
360 * @cate: category
361 * @major: major version
362 * @minor: minor version
363 * @type: message type (A/B/C)
364 * @cmd: message command
365 * @reserved: reserved space
366 */
367struct rpmsg_head {
368	u8 cate;
369	u8 major;
370	u8 minor;
371	u8 type;
372	u8 cmd;
373	u8 reserved[5];
374} __packed;
375
376/**
377 * struct param_s: sent rpmsg parameter
378 *
379 * @audioindex: audio instance index
380 * @format: audio format
381 * @channels: audio channel number
382 * @rate: sample rate
383 * @buffer_addr: dma buffer physical address or register for SET_CODEC_VALUE
384 * @buffer_size: dma buffer size or register value for SET_CODEC_VALUE
385 * @period_size: period size
386 * @buffer_tail: current period index
387 */
388struct param_s {
389	unsigned char audioindex;
390	unsigned char format;
391	unsigned char channels;
392	unsigned int  rate;
393	unsigned int  buffer_addr;
394	unsigned int  buffer_size;
395	unsigned int  period_size;
396	unsigned int  buffer_tail;
397} __packed;
398
399/**
400 * struct param_s: send rpmsg parameter
401 *
402 * @audioindex: audio instance index
403 * @resp: response value
404 * @reserved1: reserved space
405 * @buffer_offset: the consumed offset of buffer
406 * @reg_addr: register addr of codec
407 * @reg_data: register value of codec
408 * @reserved2: reserved space
409 * @buffer_tail: current period index
410 */
411struct param_r {
412	unsigned char audioindex;
413	unsigned char resp;
414	unsigned char reserved1[1];
415	unsigned int  buffer_offset;
416	unsigned int  reg_addr;
417	unsigned int  reg_data;
418	unsigned char reserved2[4];
419	unsigned int  buffer_tail;
420} __packed;
421
422/* Struct of sent message */
423struct rpmsg_s_msg {
424	struct rpmsg_head header;
425	struct param_s    param;
426};
427
428/* Struct of received message */
429struct rpmsg_r_msg {
430	struct rpmsg_head header;
431	struct param_r    param;
432};
433
434/* Struct of rpmsg */
435struct rpmsg_msg {
436	struct rpmsg_s_msg  s_msg;
437	struct rpmsg_r_msg  r_msg;
438};
439
440/* Struct of rpmsg for workqueue */
441struct work_of_rpmsg {
442	struct rpmsg_info   *info;
443	/* Sent msg for each work */
444	struct rpmsg_msg    msg;
445	struct work_struct  work;
446};
447
448/* Struct of timer */
449struct stream_timer {
450	struct timer_list   timer;
451	struct rpmsg_info   *info;
452	struct snd_pcm_substream *substream;
453};
454
455typedef void (*dma_callback)(void *arg);
456
457/**
458 * struct rpmsg_info: rpmsg audio information
459 *
460 * @rpdev: pointer of rpmsg_device
461 * @dev: pointer for imx_pcm_rpmsg device
462 * @cmd_complete: command is finished
463 * @pm_qos_req: request of pm qos
464 * @r_msg: received rpmsg
465 * @msg: array of rpmsg
466 * @notify: notification msg (type C) for TX & RX
467 * @notify_updated: notification flag for TX & RX
468 * @rpmsg_wq: rpmsg workqueue
469 * @work_list: array of work list for workqueue
470 * @work_write_index: write index of work list
471 * @work_read_index: read index of work list
472 * @msg_drop_count: counter of dropped msg for TX & RX
473 * @num_period: period number for TX & RX
474 * @callback_param: parameter for period elapse callback for TX & RX
475 * @callback: period elapse callback for TX & RX
476 * @send_message: function pointer for send message
477 * @lock: spin lock for TX & RX
478 * @wq_lock: lock for work queue
479 * @msg_lock: lock for send message
480 * @stream_timer: timer for tigger workqueue
481 */
482struct rpmsg_info {
483	struct rpmsg_device      *rpdev;
484	struct device            *dev;
485	struct completion        cmd_complete;
486	struct pm_qos_request    pm_qos_req;
487
488	/* Received msg (global) */
489	struct rpmsg_r_msg       r_msg;
490	struct rpmsg_msg         msg[MSG_MAX_NUM];
491	/* period done */
492	struct rpmsg_msg         notify[2];
493	bool                     notify_updated[2];
494
495	struct workqueue_struct  *rpmsg_wq;
496	struct work_of_rpmsg	 work_list[WORK_MAX_NUM];
497	int                      work_write_index;
498	int                      work_read_index;
499	int                      msg_drop_count[2];
500	int                      num_period[2];
501	void                     *callback_param[2];
502	dma_callback             callback[2];
503	int (*send_message)(struct rpmsg_msg *msg, struct rpmsg_info *info);
504	spinlock_t               lock[2]; /* spin lock for resource protection */
505	spinlock_t               wq_lock; /* spin lock for resource protection */
506	struct mutex             msg_lock; /* mutex for resource protection */
507	struct stream_timer      stream_timer[2];
508};
509
510#define IMX_PCM_DRV_NAME "imx_pcm_rpmsg"
511
512#endif /* IMX_PCM_RPMSG_H */
513