162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright 2017-2021  NXP
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci ******************************************************************************
662306a36Sopenharmony_ci * Communication stack of audio with rpmsg
762306a36Sopenharmony_ci ******************************************************************************
862306a36Sopenharmony_ci * Packet structure:
962306a36Sopenharmony_ci *   A SRTM message consists of a 10 bytes header followed by 0~N bytes of data
1062306a36Sopenharmony_ci *
1162306a36Sopenharmony_ci *   +---------------+-------------------------------+
1262306a36Sopenharmony_ci *   |               |            Content            |
1362306a36Sopenharmony_ci *   +---------------+-------------------------------+
1462306a36Sopenharmony_ci *   |  Byte Offset  | 7   6   5   4   3   2   1   0 |
1562306a36Sopenharmony_ci *   +---------------+---+---+---+---+---+---+---+---+
1662306a36Sopenharmony_ci *   |       0       |           Category            |
1762306a36Sopenharmony_ci *   +---------------+---+---+---+---+---+---+---+---+
1862306a36Sopenharmony_ci *   |     1 ~ 2     |           Version             |
1962306a36Sopenharmony_ci *   +---------------+---+---+---+---+---+---+---+---+
2062306a36Sopenharmony_ci *   |       3       |             Type              |
2162306a36Sopenharmony_ci *   +---------------+---+---+---+---+---+---+---+---+
2262306a36Sopenharmony_ci *   |       4       |           Command             |
2362306a36Sopenharmony_ci *   +---------------+---+---+---+---+---+---+---+---+
2462306a36Sopenharmony_ci *   |       5       |           Reserved0           |
2562306a36Sopenharmony_ci *   +---------------+---+---+---+---+---+---+---+---+
2662306a36Sopenharmony_ci *   |       6       |           Reserved1           |
2762306a36Sopenharmony_ci *   +---------------+---+---+---+---+---+---+---+---+
2862306a36Sopenharmony_ci *   |       7       |           Reserved2           |
2962306a36Sopenharmony_ci *   +---------------+---+---+---+---+---+---+---+---+
3062306a36Sopenharmony_ci *   |       8       |           Reserved3           |
3162306a36Sopenharmony_ci *   +---------------+---+---+---+---+---+---+---+---+
3262306a36Sopenharmony_ci *   |       9       |           Reserved4           |
3362306a36Sopenharmony_ci *   +---------------+---+---+---+---+---+---+---+---+
3462306a36Sopenharmony_ci *   |       10      |            DATA 0             |
3562306a36Sopenharmony_ci *   +---------------+---+---+---+---+---+---+---+---+
3662306a36Sopenharmony_ci *   :   :   :   :   :   :   :   :   :   :   :   :   :
3762306a36Sopenharmony_ci *   +---------------+---+---+---+---+---+---+---+---+
3862306a36Sopenharmony_ci *   |   N + 10 - 1  |            DATA N-1           |
3962306a36Sopenharmony_ci *   +---------------+---+---+---+---+---+---+---+---+
4062306a36Sopenharmony_ci *
4162306a36Sopenharmony_ci *   +----------+------------+------------------------------------------------+
4262306a36Sopenharmony_ci *   |  Field   |    Byte    |                                                |
4362306a36Sopenharmony_ci *   +----------+------------+------------------------------------------------+
4462306a36Sopenharmony_ci *   | Category |     0      | The destination category.                      |
4562306a36Sopenharmony_ci *   +----------+------------+------------------------------------------------+
4662306a36Sopenharmony_ci *   | Version  |   1 ~ 2    | The category version of the sender of the      |
4762306a36Sopenharmony_ci *   |          |            | packet.                                        |
4862306a36Sopenharmony_ci *   |          |            | The first byte represent the major version of  |
4962306a36Sopenharmony_ci *   |          |            | the packet.The second byte represent the minor |
5062306a36Sopenharmony_ci *   |          |            | version of the packet.                         |
5162306a36Sopenharmony_ci *   +----------+------------+------------------------------------------------+
5262306a36Sopenharmony_ci *   |  Type    |     3      | The message type of current message packet.    |
5362306a36Sopenharmony_ci *   +----------+------------+------------------------------------------------+
5462306a36Sopenharmony_ci *   | Command  |     4      | The command byte sent to remote processor/SoC. |
5562306a36Sopenharmony_ci *   +----------+------------+------------------------------------------------+
5662306a36Sopenharmony_ci *   | Reserved |   5 ~ 9    | Reserved field for future extension.           |
5762306a36Sopenharmony_ci *   +----------+------------+------------------------------------------------+
5862306a36Sopenharmony_ci *   | Data     |     N      | The data payload of the message packet.        |
5962306a36Sopenharmony_ci *   +----------+------------+------------------------------------------------+
6062306a36Sopenharmony_ci *
6162306a36Sopenharmony_ci * Audio control:
6262306a36Sopenharmony_ci *   SRTM Audio Control Category Request Command Table:
6362306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
6462306a36Sopenharmony_ci *   | Category | Version | Type | Command | Data                          | Function              |
6562306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
6662306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x00 |  0x00   | Data[0]: Audio Device Index   | Open a TX Instance.   |
6762306a36Sopenharmony_ci *   |          |         |      |         | Data[1]:     format           |                       |
6862306a36Sopenharmony_ci *   |          |         |      |         | Data[2]:     channels         |                       |
6962306a36Sopenharmony_ci *   |          |         |      |         | Data[3-6]:   samplerate       |                       |
7062306a36Sopenharmony_ci *   |          |         |      |         | Data[7-10]:  buffer_addr      |                       |
7162306a36Sopenharmony_ci *   |          |         |      |         | Data[11-14]: buffer_size      |                       |
7262306a36Sopenharmony_ci *   |          |         |      |         | Data[15-18]: period_size      |                       |
7362306a36Sopenharmony_ci *   |          |         |      |         | Data[19-22]: buffer_tail      |                       |
7462306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
7562306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x00 |  0x01   | Data[0]: Audio Device Index   | Start a TX Instance.  |
7662306a36Sopenharmony_ci *   |          |         |      |         | Same as above command         |                       |
7762306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
7862306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x00 |  0x02   | Data[0]: Audio Device Index   | Pause a TX Instance.  |
7962306a36Sopenharmony_ci *   |          |         |      |         | Same as above command         |                       |
8062306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
8162306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x00 |  0x03   | Data[0]: Audio Device Index   | Resume a TX Instance. |
8262306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
8362306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x00 |  0x04   | Data[0]: Audio Device Index   | Stop a TX Instance.   |
8462306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
8562306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x00 |  0x05   | Data[0]: Audio Device Index   | Close a TX Instance.  |
8662306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
8762306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x00 |  0x06   | Data[0]: Audio Device Index   | Set Parameters for    |
8862306a36Sopenharmony_ci *   |          |         |      |         | Data[1]:     format           | a TX Instance.        |
8962306a36Sopenharmony_ci *   |          |         |      |         | Data[2]:     channels         |                       |
9062306a36Sopenharmony_ci *   |          |         |      |         | Data[3-6]:   samplerate       |                       |
9162306a36Sopenharmony_ci *   |          |         |      |         | Data[7-22]:  reserved         |                       |
9262306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
9362306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x00 |  0x07   | Data[0]: Audio Device Index   | Set TX Buffer.        |
9462306a36Sopenharmony_ci *   |          |         |      |         | Data[1-6]:   reserved         |                       |
9562306a36Sopenharmony_ci *   |          |         |      |         | Data[7-10]:  buffer_addr      |                       |
9662306a36Sopenharmony_ci *   |          |         |      |         | Data[11-14]: buffer_size      |                       |
9762306a36Sopenharmony_ci *   |          |         |      |         | Data[15-18]: period_size      |                       |
9862306a36Sopenharmony_ci *   |          |         |      |         | Data[19-22]: buffer_tail      |                       |
9962306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
10062306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x00 |  0x08   | Data[0]: Audio Device Index   | Suspend a TX Instance |
10162306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
10262306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x00 |  0x09   | Data[0]: Audio Device Index   | Resume a TX Instance. |
10362306a36Sopenharmony_ci *   |          |         |      |         | Data[1]:     format           |                       |
10462306a36Sopenharmony_ci *   |          |         |      |         | Data[2]:     channels         |                       |
10562306a36Sopenharmony_ci *   |          |         |      |         | Data[3-6]:   samplerate       |                       |
10662306a36Sopenharmony_ci *   |          |         |      |         | Data[7-10]:  buffer_addr      |                       |
10762306a36Sopenharmony_ci *   |          |         |      |         | Data[11-14]: buffer_size      |                       |
10862306a36Sopenharmony_ci *   |          |         |      |         | Data[15-18]: period_size      |                       |
10962306a36Sopenharmony_ci *   |          |         |      |         | Data[19-22]: buffer_tail      |                       |
11062306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
11162306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x00 |  0x0A   | Data[0]: Audio Device Index   | Open a RX Instance.   |
11262306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
11362306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x00 |  0x0B   | Data[0]: Audio Device Index   | Start a RX Instance.  |
11462306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
11562306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x00 |  0x0C   | Data[0]: Audio Device Index   | Pause a RX Instance.  |
11662306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
11762306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x00 |  0x0D   | Data[0]: Audio Device Index   | Resume a RX Instance. |
11862306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
11962306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x00 |  0x0E   | Data[0]: Audio Device Index   | Stop a RX Instance.   |
12062306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
12162306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x00 |  0x0F   | Data[0]: Audio Device Index   | Close a RX Instance.  |
12262306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
12362306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x00 |  0x10   | Data[0]: Audio Device Index   | Set Parameters for    |
12462306a36Sopenharmony_ci *   |          |         |      |         | Data[1]:     format           | a RX Instance.        |
12562306a36Sopenharmony_ci *   |          |         |      |         | Data[2]:     channels         |                       |
12662306a36Sopenharmony_ci *   |          |         |      |         | Data[3-6]:   samplerate       |                       |
12762306a36Sopenharmony_ci *   |          |         |      |         | Data[7-22]:  reserved         |                       |
12862306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
12962306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x00 |  0x11   | Data[0]: Audio Device Index   | Set RX Buffer.        |
13062306a36Sopenharmony_ci *   |          |         |      |         | Data[1-6]:   reserved         |                       |
13162306a36Sopenharmony_ci *   |          |         |      |         | Data[7-10]:  buffer_addr      |                       |
13262306a36Sopenharmony_ci *   |          |         |      |         | Data[11-14]: buffer_size      |                       |
13362306a36Sopenharmony_ci *   |          |         |      |         | Data[15-18]: period_size      |                       |
13462306a36Sopenharmony_ci *   |          |         |      |         | Data[19-22]: buffer_tail      |                       |
13562306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
13662306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x00 |  0x12   | Data[0]: Audio Device Index   | Suspend a RX Instance.|
13762306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
13862306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x00 |  0x13   | Data[0]: Audio Device Index   | Resume a RX Instance. |
13962306a36Sopenharmony_ci *   |          |         |      |         | Data[1]:     format           |                       |
14062306a36Sopenharmony_ci *   |          |         |      |         | Data[2]:     channels         |                       |
14162306a36Sopenharmony_ci *   |          |         |      |         | Data[3-6]:   samplerate       |                       |
14262306a36Sopenharmony_ci *   |          |         |      |         | Data[7-10]:  buffer_addr      |                       |
14362306a36Sopenharmony_ci *   |          |         |      |         | Data[11-14]: buffer_size      |                       |
14462306a36Sopenharmony_ci *   |          |         |      |         | Data[15-18]: period_size      |                       |
14562306a36Sopenharmony_ci *   |          |         |      |         | Data[19-22]: buffer_tail      |                       |
14662306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
14762306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x00 |  0x14   | Data[0]: Audio Device Index   | Set register value    |
14862306a36Sopenharmony_ci *   |          |         |      |         | Data[1-6]:   reserved         | to codec              |
14962306a36Sopenharmony_ci *   |          |         |      |         | Data[7-10]:  register         |                       |
15062306a36Sopenharmony_ci *   |          |         |      |         | Data[11-14]: value            |                       |
15162306a36Sopenharmony_ci *   |          |         |      |         | Data[15-22]: reserved         |                       |
15262306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
15362306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x00 |  0x15   | Data[0]: Audio Device Index   | Get register value    |
15462306a36Sopenharmony_ci *   |          |         |      |         | Data[1-6]:   reserved         | from codec            |
15562306a36Sopenharmony_ci *   |          |         |      |         | Data[7-10]:  register         |                       |
15662306a36Sopenharmony_ci *   |          |         |      |         | Data[11-22]: reserved         |                       |
15762306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
15862306a36Sopenharmony_ci *   Note 1: See <List of Sample Format> for available value of
15962306a36Sopenharmony_ci *           Sample Format;
16062306a36Sopenharmony_ci *   Note 2: See <List of Audio Channels> for available value of Channels;
16162306a36Sopenharmony_ci *   Note 3: Sample Rate of Set Parameters for an Audio TX Instance
16262306a36Sopenharmony_ci *           Command and Set Parameters for an Audio RX Instance Command is
16362306a36Sopenharmony_ci *           in little-endian format.
16462306a36Sopenharmony_ci *
16562306a36Sopenharmony_ci *   SRTM Audio Control Category Response Command Table:
16662306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
16762306a36Sopenharmony_ci *   | Category | Version | Type | Command | Data                          | Function              |
16862306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
16962306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x01 |  0x00   | Data[0]: Audio Device Index   | Reply for Open        |
17062306a36Sopenharmony_ci *   |          |         |      |         | Data[1]: Return code          | a TX Instance         |
17162306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
17262306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x01 |  0x01   | Data[0]: Audio Device Index   | Reply for Start       |
17362306a36Sopenharmony_ci *   |          |         |      |         | Data[1]: Return code          | a TX Instance         |
17462306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
17562306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x01 |  0x02   | Data[0]: Audio Device Index   | Reply for Pause       |
17662306a36Sopenharmony_ci *   |          |         |      |         | Data[1]: Return code          | a TX Instance         |
17762306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
17862306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x01 |  0x03   | Data[0]: Audio Device Index   | Reply for Resume      |
17962306a36Sopenharmony_ci *   |          |         |      |         | Data[1]: Return code          | a TX Instance         |
18062306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
18162306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x01 |  0x04   | Data[0]: Audio Device Index   | Reply for Stop        |
18262306a36Sopenharmony_ci *   |          |         |      |         | Data[1]: Return code          | a TX Instance         |
18362306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
18462306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x01 |  0x05   | Data[0]: Audio Device Index   | Reply for Close       |
18562306a36Sopenharmony_ci *   |          |         |      |         | Data[1]: Return code          | a TX Instance         |
18662306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
18762306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x01 |  0x06   | Data[0]: Audio Device Index   | Reply for Set Param   |
18862306a36Sopenharmony_ci *   |          |         |      |         | Data[1]: Return code          | for a TX Instance.    |
18962306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
19062306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x01 |  0x07   | Data[0]: Audio Device Index   | Reply for Set         |
19162306a36Sopenharmony_ci *   |          |         |      |         | Data[1]: Return code          | TX Buffer             |
19262306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
19362306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x01 |  0x08   | Data[0]: Audio Device Index   | Reply for Suspend     |
19462306a36Sopenharmony_ci *   |          |         |      |         | Data[1]: Return code          | a TX Instance         |
19562306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
19662306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x01 |  0x09   | Data[0]: Audio Device Index   | Reply for Resume      |
19762306a36Sopenharmony_ci *   |          |         |      |         | Data[1]: Return code          | a TX Instance         |
19862306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
19962306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x01 |  0x0A   | Data[0]: Audio Device Index   | Reply for Open        |
20062306a36Sopenharmony_ci *   |          |         |      |         | Data[1]: Return code          | a TX Instance         |
20162306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
20262306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x01 |  0x0B   | Data[0]: Audio Device Index   | Reply for Start       |
20362306a36Sopenharmony_ci *   |          |         |      |         | Data[1]: Return code          | a TX Instance         |
20462306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
20562306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x01 |  0x0C   | Data[0]: Audio Device Index   | Reply for Pause       |
20662306a36Sopenharmony_ci *   |          |         |      |         | Data[1]: Return code          | a TX Instance         |
20762306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
20862306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x01 |  0x0D   | Data[0]: Audio Device Index   | Reply for Resume      |
20962306a36Sopenharmony_ci *   |          |         |      |         | Data[1]: Return code          | a RX Instance         |
21062306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
21162306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x01 |  0x0E   | Data[0]: Audio Device Index   | Reply for Stop        |
21262306a36Sopenharmony_ci *   |          |         |      |         | Data[1]: Return code          | a RX Instance         |
21362306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
21462306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x01 |  0x0F   | Data[0]: Audio Device Index   | Reply for Close       |
21562306a36Sopenharmony_ci *   |          |         |      |         | Data[1]: Return code          | a RX Instance         |
21662306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
21762306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x01 |  0x10   | Data[0]: Audio Device Index   | Reply for Set Param   |
21862306a36Sopenharmony_ci *   |          |         |      |         | Data[1]: Return code          | for a RX Instance.    |
21962306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
22062306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x01 |  0x11   | Data[0]: Audio Device Index   | Reply for Set         |
22162306a36Sopenharmony_ci *   |          |         |      |         | Data[1]: Return code          | RX Buffer             |
22262306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
22362306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x01 |  0x12   | Data[0]: Audio Device Index   | Reply for Suspend     |
22462306a36Sopenharmony_ci *   |          |         |      |         | Data[1]: Return code          | a RX Instance         |
22562306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
22662306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x01 |  0x13   | Data[0]: Audio Device Index   | Reply for Resume      |
22762306a36Sopenharmony_ci *   |          |         |      |         | Data[1]: Return code          | a RX Instance         |
22862306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
22962306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x01 |  0x14   | Data[0]: Audio Device Index   | Reply for Set codec   |
23062306a36Sopenharmony_ci *   |          |         |      |         | Data[1]: Return code          | register value        |
23162306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
23262306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x01 |  0x15   | Data[0]: Audio Device Index   | Reply for Get codec   |
23362306a36Sopenharmony_ci *   |          |         |      |         | Data[1]: Return code          | register value        |
23462306a36Sopenharmony_ci *   |          |         |      |         | Data[2-6]:   reserved         |                       |
23562306a36Sopenharmony_ci *   |          |         |      |         | Data[7-10]:  register         |                       |
23662306a36Sopenharmony_ci *   |          |         |      |         | Data[11-14]: value            |                       |
23762306a36Sopenharmony_ci *   |          |         |      |         | Data[15-22]: reserved         |                       |
23862306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
23962306a36Sopenharmony_ci *
24062306a36Sopenharmony_ci *   SRTM Audio Control Category Notification Command Table:
24162306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
24262306a36Sopenharmony_ci *   | Category | Version | Type | Command | Data                          | Function              |
24362306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
24462306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x02 |  0x00   | Data[0]: Audio Device Index   | Notify one TX period  |
24562306a36Sopenharmony_ci *   |          |         |      |         |                               | is finished           |
24662306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
24762306a36Sopenharmony_ci *   |  0x03    | 0x0100  | 0x02 |  0x01   | Data[0]: Audio Device Index   | Notify one RX period  |
24862306a36Sopenharmony_ci *   |          |         |      |         |                               | is finished           |
24962306a36Sopenharmony_ci *   +----------+---------+------+---------+-------------------------------+-----------------------+
25062306a36Sopenharmony_ci *
25162306a36Sopenharmony_ci *   List of Sample Format:
25262306a36Sopenharmony_ci *   +------------------+-----------------------+
25362306a36Sopenharmony_ci *   | Sample Format    |   Description         |
25462306a36Sopenharmony_ci *   +------------------+-----------------------+
25562306a36Sopenharmony_ci *   |       0x0        | S16_LE                |
25662306a36Sopenharmony_ci *   +------------------+-----------------------+
25762306a36Sopenharmony_ci *   |       0x1        | S24_LE                |
25862306a36Sopenharmony_ci *   +------------------+-----------------------+
25962306a36Sopenharmony_ci *
26062306a36Sopenharmony_ci *   List of Audio Channels
26162306a36Sopenharmony_ci *   +------------------+-----------------------+
26262306a36Sopenharmony_ci *   |  Audio Channel   |   Description         |
26362306a36Sopenharmony_ci *   +------------------+-----------------------+
26462306a36Sopenharmony_ci *   |       0x0        | Left Channel          |
26562306a36Sopenharmony_ci *   +------------------+-----------------------+
26662306a36Sopenharmony_ci *   |       0x1        | Right Channel         |
26762306a36Sopenharmony_ci *   +------------------+---------------- ------+
26862306a36Sopenharmony_ci *   |       0x2        | Left & Right Channel  |
26962306a36Sopenharmony_ci *   +------------------+-----------------------+
27062306a36Sopenharmony_ci *
27162306a36Sopenharmony_ci */
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_ci#ifndef _IMX_PCM_RPMSG_H
27462306a36Sopenharmony_ci#define _IMX_PCM_RPMSG_H
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_ci#include <linux/pm_qos.h>
27762306a36Sopenharmony_ci#include <linux/interrupt.h>
27862306a36Sopenharmony_ci#include <sound/dmaengine_pcm.h>
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_ci#define RPMSG_TIMEOUT 1000
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_ci/* RPMSG Command (TYPE A)*/
28362306a36Sopenharmony_ci#define TX_OPEN		0x0
28462306a36Sopenharmony_ci#define	TX_START	0x1
28562306a36Sopenharmony_ci#define	TX_PAUSE	0x2
28662306a36Sopenharmony_ci#define	TX_RESTART	0x3
28762306a36Sopenharmony_ci#define	TX_TERMINATE	0x4
28862306a36Sopenharmony_ci#define	TX_CLOSE	0x5
28962306a36Sopenharmony_ci#define TX_HW_PARAM	0x6
29062306a36Sopenharmony_ci#define	TX_BUFFER	0x7
29162306a36Sopenharmony_ci#define	TX_SUSPEND	0x8
29262306a36Sopenharmony_ci#define	TX_RESUME	0x9
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_ci#define	RX_OPEN		0xA
29562306a36Sopenharmony_ci#define	RX_START	0xB
29662306a36Sopenharmony_ci#define	RX_PAUSE	0xC
29762306a36Sopenharmony_ci#define	RX_RESTART	0xD
29862306a36Sopenharmony_ci#define	RX_TERMINATE	0xE
29962306a36Sopenharmony_ci#define	RX_CLOSE	0xF
30062306a36Sopenharmony_ci#define	RX_HW_PARAM	0x10
30162306a36Sopenharmony_ci#define	RX_BUFFER	0x11
30262306a36Sopenharmony_ci#define	RX_SUSPEND	0x12
30362306a36Sopenharmony_ci#define	RX_RESUME	0x13
30462306a36Sopenharmony_ci#define SET_CODEC_VALUE 0x14
30562306a36Sopenharmony_ci#define GET_CODEC_VALUE 0x15
30662306a36Sopenharmony_ci#define	TX_POINTER	0x16
30762306a36Sopenharmony_ci#define	RX_POINTER	0x17
30862306a36Sopenharmony_ci/* Total msg numver for type A */
30962306a36Sopenharmony_ci#define MSG_TYPE_A_NUM  0x18
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci/* RPMSG Command (TYPE C)*/
31262306a36Sopenharmony_ci#define	TX_PERIOD_DONE	0x0
31362306a36Sopenharmony_ci#define	RX_PERIOD_DONE	0x1
31462306a36Sopenharmony_ci/* Total msg numver for type C */
31562306a36Sopenharmony_ci#define MSG_TYPE_C_NUM  0x2
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_ci#define MSG_MAX_NUM     (MSG_TYPE_A_NUM + MSG_TYPE_C_NUM)
31862306a36Sopenharmony_ci
31962306a36Sopenharmony_ci#define MSG_TYPE_A	0x0
32062306a36Sopenharmony_ci#define MSG_TYPE_B	0x1
32162306a36Sopenharmony_ci#define MSG_TYPE_C	0x2
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_ci#define RESP_NONE		0x0
32462306a36Sopenharmony_ci#define RESP_NOT_ALLOWED	0x1
32562306a36Sopenharmony_ci#define	RESP_SUCCESS		0x2
32662306a36Sopenharmony_ci#define	RESP_FAILED		0x3
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ci#define	RPMSG_S16_LE		0x0
32962306a36Sopenharmony_ci#define	RPMSG_S24_LE		0x1
33062306a36Sopenharmony_ci#define	RPMSG_S32_LE		0x2
33162306a36Sopenharmony_ci#define	RPMSG_DSD_U16_LE	49  /* SNDRV_PCM_FORMAT_DSD_U16_LE */
33262306a36Sopenharmony_ci#define	RPMSG_DSD_U24_LE	0x4
33362306a36Sopenharmony_ci#define	RPMSG_DSD_U32_LE	50  /* SNDRV_PCM_FORMAT_DSD_U32_LE */
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci#define	RPMSG_CH_LEFT		0x0
33662306a36Sopenharmony_ci#define	RPMSG_CH_RIGHT		0x1
33762306a36Sopenharmony_ci#define	RPMSG_CH_STEREO		0x2
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ci#define WORK_MAX_NUM    0x30
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci/* Category define */
34262306a36Sopenharmony_ci#define IMX_RMPSG_LIFECYCLE     1
34362306a36Sopenharmony_ci#define IMX_RPMSG_PMIC          2
34462306a36Sopenharmony_ci#define IMX_RPMSG_AUDIO         3
34562306a36Sopenharmony_ci#define IMX_RPMSG_KEY           4
34662306a36Sopenharmony_ci#define IMX_RPMSG_GPIO          5
34762306a36Sopenharmony_ci#define IMX_RPMSG_RTC           6
34862306a36Sopenharmony_ci#define IMX_RPMSG_SENSOR        7
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_ci/* rpmsg version */
35162306a36Sopenharmony_ci#define IMX_RMPSG_MAJOR         1
35262306a36Sopenharmony_ci#define IMX_RMPSG_MINOR         0
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_ci#define TX SNDRV_PCM_STREAM_PLAYBACK
35562306a36Sopenharmony_ci#define RX SNDRV_PCM_STREAM_CAPTURE
35662306a36Sopenharmony_ci
35762306a36Sopenharmony_ci/**
35862306a36Sopenharmony_ci * struct rpmsg_head: rpmsg header structure
35962306a36Sopenharmony_ci *
36062306a36Sopenharmony_ci * @cate: category
36162306a36Sopenharmony_ci * @major: major version
36262306a36Sopenharmony_ci * @minor: minor version
36362306a36Sopenharmony_ci * @type: message type (A/B/C)
36462306a36Sopenharmony_ci * @cmd: message command
36562306a36Sopenharmony_ci * @reserved: reserved space
36662306a36Sopenharmony_ci */
36762306a36Sopenharmony_cistruct rpmsg_head {
36862306a36Sopenharmony_ci	u8 cate;
36962306a36Sopenharmony_ci	u8 major;
37062306a36Sopenharmony_ci	u8 minor;
37162306a36Sopenharmony_ci	u8 type;
37262306a36Sopenharmony_ci	u8 cmd;
37362306a36Sopenharmony_ci	u8 reserved[5];
37462306a36Sopenharmony_ci} __packed;
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_ci/**
37762306a36Sopenharmony_ci * struct param_s: sent rpmsg parameter
37862306a36Sopenharmony_ci *
37962306a36Sopenharmony_ci * @audioindex: audio instance index
38062306a36Sopenharmony_ci * @format: audio format
38162306a36Sopenharmony_ci * @channels: audio channel number
38262306a36Sopenharmony_ci * @rate: sample rate
38362306a36Sopenharmony_ci * @buffer_addr: dma buffer physical address or register for SET_CODEC_VALUE
38462306a36Sopenharmony_ci * @buffer_size: dma buffer size or register value for SET_CODEC_VALUE
38562306a36Sopenharmony_ci * @period_size: period size
38662306a36Sopenharmony_ci * @buffer_tail: current period index
38762306a36Sopenharmony_ci */
38862306a36Sopenharmony_cistruct param_s {
38962306a36Sopenharmony_ci	unsigned char audioindex;
39062306a36Sopenharmony_ci	unsigned char format;
39162306a36Sopenharmony_ci	unsigned char channels;
39262306a36Sopenharmony_ci	unsigned int  rate;
39362306a36Sopenharmony_ci	unsigned int  buffer_addr;
39462306a36Sopenharmony_ci	unsigned int  buffer_size;
39562306a36Sopenharmony_ci	unsigned int  period_size;
39662306a36Sopenharmony_ci	unsigned int  buffer_tail;
39762306a36Sopenharmony_ci} __packed;
39862306a36Sopenharmony_ci
39962306a36Sopenharmony_ci/**
40062306a36Sopenharmony_ci * struct param_s: send rpmsg parameter
40162306a36Sopenharmony_ci *
40262306a36Sopenharmony_ci * @audioindex: audio instance index
40362306a36Sopenharmony_ci * @resp: response value
40462306a36Sopenharmony_ci * @reserved1: reserved space
40562306a36Sopenharmony_ci * @buffer_offset: the consumed offset of buffer
40662306a36Sopenharmony_ci * @reg_addr: register addr of codec
40762306a36Sopenharmony_ci * @reg_data: register value of codec
40862306a36Sopenharmony_ci * @reserved2: reserved space
40962306a36Sopenharmony_ci * @buffer_tail: current period index
41062306a36Sopenharmony_ci */
41162306a36Sopenharmony_cistruct param_r {
41262306a36Sopenharmony_ci	unsigned char audioindex;
41362306a36Sopenharmony_ci	unsigned char resp;
41462306a36Sopenharmony_ci	unsigned char reserved1[1];
41562306a36Sopenharmony_ci	unsigned int  buffer_offset;
41662306a36Sopenharmony_ci	unsigned int  reg_addr;
41762306a36Sopenharmony_ci	unsigned int  reg_data;
41862306a36Sopenharmony_ci	unsigned char reserved2[4];
41962306a36Sopenharmony_ci	unsigned int  buffer_tail;
42062306a36Sopenharmony_ci} __packed;
42162306a36Sopenharmony_ci
42262306a36Sopenharmony_ci/* Struct of sent message */
42362306a36Sopenharmony_cistruct rpmsg_s_msg {
42462306a36Sopenharmony_ci	struct rpmsg_head header;
42562306a36Sopenharmony_ci	struct param_s    param;
42662306a36Sopenharmony_ci};
42762306a36Sopenharmony_ci
42862306a36Sopenharmony_ci/* Struct of received message */
42962306a36Sopenharmony_cistruct rpmsg_r_msg {
43062306a36Sopenharmony_ci	struct rpmsg_head header;
43162306a36Sopenharmony_ci	struct param_r    param;
43262306a36Sopenharmony_ci};
43362306a36Sopenharmony_ci
43462306a36Sopenharmony_ci/* Struct of rpmsg */
43562306a36Sopenharmony_cistruct rpmsg_msg {
43662306a36Sopenharmony_ci	struct rpmsg_s_msg  s_msg;
43762306a36Sopenharmony_ci	struct rpmsg_r_msg  r_msg;
43862306a36Sopenharmony_ci};
43962306a36Sopenharmony_ci
44062306a36Sopenharmony_ci/* Struct of rpmsg for workqueue */
44162306a36Sopenharmony_cistruct work_of_rpmsg {
44262306a36Sopenharmony_ci	struct rpmsg_info   *info;
44362306a36Sopenharmony_ci	/* Sent msg for each work */
44462306a36Sopenharmony_ci	struct rpmsg_msg    msg;
44562306a36Sopenharmony_ci	struct work_struct  work;
44662306a36Sopenharmony_ci};
44762306a36Sopenharmony_ci
44862306a36Sopenharmony_ci/* Struct of timer */
44962306a36Sopenharmony_cistruct stream_timer {
45062306a36Sopenharmony_ci	struct timer_list   timer;
45162306a36Sopenharmony_ci	struct rpmsg_info   *info;
45262306a36Sopenharmony_ci	struct snd_pcm_substream *substream;
45362306a36Sopenharmony_ci};
45462306a36Sopenharmony_ci
45562306a36Sopenharmony_citypedef void (*dma_callback)(void *arg);
45662306a36Sopenharmony_ci
45762306a36Sopenharmony_ci/**
45862306a36Sopenharmony_ci * struct rpmsg_info: rpmsg audio information
45962306a36Sopenharmony_ci *
46062306a36Sopenharmony_ci * @rpdev: pointer of rpmsg_device
46162306a36Sopenharmony_ci * @dev: pointer for imx_pcm_rpmsg device
46262306a36Sopenharmony_ci * @cmd_complete: command is finished
46362306a36Sopenharmony_ci * @pm_qos_req: request of pm qos
46462306a36Sopenharmony_ci * @r_msg: received rpmsg
46562306a36Sopenharmony_ci * @msg: array of rpmsg
46662306a36Sopenharmony_ci * @notify: notification msg (type C) for TX & RX
46762306a36Sopenharmony_ci * @notify_updated: notification flag for TX & RX
46862306a36Sopenharmony_ci * @rpmsg_wq: rpmsg workqueue
46962306a36Sopenharmony_ci * @work_list: array of work list for workqueue
47062306a36Sopenharmony_ci * @work_write_index: write index of work list
47162306a36Sopenharmony_ci * @work_read_index: read index of work list
47262306a36Sopenharmony_ci * @msg_drop_count: counter of dropped msg for TX & RX
47362306a36Sopenharmony_ci * @num_period: period number for TX & RX
47462306a36Sopenharmony_ci * @callback_param: parameter for period elapse callback for TX & RX
47562306a36Sopenharmony_ci * @callback: period elapse callback for TX & RX
47662306a36Sopenharmony_ci * @send_message: function pointer for send message
47762306a36Sopenharmony_ci * @lock: spin lock for TX & RX
47862306a36Sopenharmony_ci * @wq_lock: lock for work queue
47962306a36Sopenharmony_ci * @msg_lock: lock for send message
48062306a36Sopenharmony_ci * @stream_timer: timer for tigger workqueue
48162306a36Sopenharmony_ci */
48262306a36Sopenharmony_cistruct rpmsg_info {
48362306a36Sopenharmony_ci	struct rpmsg_device      *rpdev;
48462306a36Sopenharmony_ci	struct device            *dev;
48562306a36Sopenharmony_ci	struct completion        cmd_complete;
48662306a36Sopenharmony_ci	struct pm_qos_request    pm_qos_req;
48762306a36Sopenharmony_ci
48862306a36Sopenharmony_ci	/* Received msg (global) */
48962306a36Sopenharmony_ci	struct rpmsg_r_msg       r_msg;
49062306a36Sopenharmony_ci	struct rpmsg_msg         msg[MSG_MAX_NUM];
49162306a36Sopenharmony_ci	/* period done */
49262306a36Sopenharmony_ci	struct rpmsg_msg         notify[2];
49362306a36Sopenharmony_ci	bool                     notify_updated[2];
49462306a36Sopenharmony_ci
49562306a36Sopenharmony_ci	struct workqueue_struct  *rpmsg_wq;
49662306a36Sopenharmony_ci	struct work_of_rpmsg	 work_list[WORK_MAX_NUM];
49762306a36Sopenharmony_ci	int                      work_write_index;
49862306a36Sopenharmony_ci	int                      work_read_index;
49962306a36Sopenharmony_ci	int                      msg_drop_count[2];
50062306a36Sopenharmony_ci	int                      num_period[2];
50162306a36Sopenharmony_ci	void                     *callback_param[2];
50262306a36Sopenharmony_ci	dma_callback             callback[2];
50362306a36Sopenharmony_ci	int (*send_message)(struct rpmsg_msg *msg, struct rpmsg_info *info);
50462306a36Sopenharmony_ci	spinlock_t               lock[2]; /* spin lock for resource protection */
50562306a36Sopenharmony_ci	spinlock_t               wq_lock; /* spin lock for resource protection */
50662306a36Sopenharmony_ci	struct mutex             msg_lock; /* mutex for resource protection */
50762306a36Sopenharmony_ci	struct stream_timer      stream_timer[2];
50862306a36Sopenharmony_ci};
50962306a36Sopenharmony_ci
51062306a36Sopenharmony_ci#define IMX_PCM_DRV_NAME "imx_pcm_rpmsg"
51162306a36Sopenharmony_ci
51262306a36Sopenharmony_ci#endif /* IMX_PCM_RPMSG_H */
513