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 | */ |
367 | struct 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 | */ |
388 | struct 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 | */ |
411 | struct 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 */ |
423 | struct rpmsg_s_msg { |
424 | struct rpmsg_head ; |
425 | struct param_s param; |
426 | }; |
427 | |
428 | /* Struct of received message */ |
429 | struct rpmsg_r_msg { |
430 | struct rpmsg_head ; |
431 | struct param_r param; |
432 | }; |
433 | |
434 | /* Struct of rpmsg */ |
435 | struct rpmsg_msg { |
436 | struct rpmsg_s_msg s_msg; |
437 | struct rpmsg_r_msg r_msg; |
438 | }; |
439 | |
440 | /* Struct of rpmsg for workqueue */ |
441 | struct 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 */ |
449 | struct stream_timer { |
450 | struct timer_list timer; |
451 | struct rpmsg_info *info; |
452 | struct snd_pcm_substream *substream; |
453 | }; |
454 | |
455 | typedef 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 | */ |
482 | struct 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 | |