linux/sound/soc/fsl/imx-pcm-rpmsg.h
<<
>>
Prefs
   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