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 0x3 332 #define RPMSG_DSD_U24_LE 0x4 333 #define RPMSG_DSD_U32_LE 0x5 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 header; 425 struct param_s param; 426 }; 427 428 /* Struct of received message */ 429 struct rpmsg_r_msg { 430 struct rpmsg_head header; 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