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

source code of linux/sound/soc/fsl/imx-pcm-rpmsg.h