summaryrefslogtreecommitdiff
path: root/include/uapi/linux/mxc_asrc.h
blob: 837deea53f5bd9026a321816e9b1e9655491537b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
/*
 * Copyright 2008-2014 Freescale Semiconductor, Inc. All Rights Reserved.
 *
 * The code contained herein is licensed under the GNU General Public
 * License. You may obtain a copy of the GNU General Public License
 * Version 2 or later at the following locations:
 *
 * http://www.opensource.org/licenses/gpl-license.html
 * http://www.gnu.org/copyleft/gpl.html
 *
 * @file mxc_asrc.h
 *
 * @brief i.MX Asynchronous Sample Rate Converter
 *
 * @ingroup Audio
 */

#ifndef __MXC_ASRC_UAPI_H__
#define __MXC_ASRC_UAPI_H__

#define ASRC_IOC_MAGIC		'C'

#define ASRC_REQ_PAIR		_IOWR(ASRC_IOC_MAGIC, 0, struct asrc_req)
#define ASRC_CONFIG_PAIR	_IOWR(ASRC_IOC_MAGIC, 1, struct asrc_config)
#define ASRC_RELEASE_PAIR	_IOW(ASRC_IOC_MAGIC, 2, enum asrc_pair_index)
#define ASRC_CONVERT		_IOW(ASRC_IOC_MAGIC, 3, struct asrc_convert_buffer)
#define ASRC_START_CONV		_IOW(ASRC_IOC_MAGIC, 4, enum asrc_pair_index)
#define ASRC_STOP_CONV		_IOW(ASRC_IOC_MAGIC, 5, enum asrc_pair_index)
#define ASRC_STATUS		_IOW(ASRC_IOC_MAGIC, 6, struct asrc_status_flags)
#define ASRC_FLUSH		_IOW(ASRC_IOC_MAGIC, 7, enum asrc_pair_index)

enum asrc_pair_index {
	ASRC_INVALID_PAIR = -1,
	ASRC_PAIR_A = 0,
	ASRC_PAIR_B = 1,
	ASRC_PAIR_C = 2,
};

#define ASRC_PAIR_MAX_NUM	(ASRC_PAIR_C + 1)

enum asrc_inclk {
	INCLK_NONE = 0x03,
	INCLK_ESAI_RX = 0x00,
	INCLK_SSI1_RX = 0x01,
	INCLK_SSI2_RX = 0x02,
	INCLK_SSI3_RX = 0x07,
	INCLK_SPDIF_RX = 0x04,
	INCLK_MLB_CLK = 0x05,
	INCLK_PAD = 0x06,
	INCLK_ESAI_TX = 0x08,
	INCLK_SSI1_TX = 0x09,
	INCLK_SSI2_TX = 0x0a,
	INCLK_SSI3_TX = 0x0b,
	INCLK_SPDIF_TX = 0x0c,
	INCLK_ASRCK1_CLK = 0x0f,
/* imx8 */
	INCLK_AUD_PLL_DIV_CLK0 = 0x10,
	INCLK_AUD_PLL_DIV_CLK1 = 0x11,
	INCLK_AUD_CLK0         = 0x12,
	INCLK_AUD_CLK1         = 0x13,
	INCLK_ESAI0_RX_CLK     = 0x14,
	INCLK_ESAI0_TX_CLK     = 0x15,
	INCLK_SPDIF0_RX        = 0x16,
	INCLK_SPDIF1_RX        = 0x17,
	INCLK_SAI0_RX_BCLK     = 0x18,
	INCLK_SAI0_TX_BCLK     = 0x19,
	INCLK_SAI1_RX_BCLK     = 0x1a,
	INCLK_SAI1_TX_BCLK     = 0x1b,
	INCLK_SAI2_RX_BCLK     = 0x1c,
	INCLK_SAI3_RX_BCLK     = 0x1d,
	INCLK_ASRC0_MUX_CLK    = 0x1e,

	INCLK_ESAI1_RX_CLK     = 0x20,
	INCLK_ESAI1_TX_CLK     = 0x21,
	INCLK_SAI6_TX_BCLK     = 0x22,
	INCLK_HDMI_RX_SAI0_RX_BCLK     = 0x24,
	INCLK_HDMI_TX_SAI0_TX_BCLK     = 0x25,
};

enum asrc_outclk {
	OUTCLK_NONE = 0x03,
	OUTCLK_ESAI_TX = 0x00,
	OUTCLK_SSI1_TX = 0x01,
	OUTCLK_SSI2_TX = 0x02,
	OUTCLK_SSI3_TX = 0x07,
	OUTCLK_SPDIF_TX = 0x04,
	OUTCLK_MLB_CLK = 0x05,
	OUTCLK_PAD = 0x06,
	OUTCLK_ESAI_RX = 0x08,
	OUTCLK_SSI1_RX = 0x09,
	OUTCLK_SSI2_RX = 0x0a,
	OUTCLK_SSI3_RX = 0x0b,
	OUTCLK_SPDIF_RX = 0x0c,
	OUTCLK_ASRCK1_CLK = 0x0f,

/* imx8 */
	OUTCLK_AUD_PLL_DIV_CLK0 = 0x10,
	OUTCLK_AUD_PLL_DIV_CLK1 = 0x11,
	OUTCLK_AUD_CLK0         = 0x12,
	OUTCLK_AUD_CLK1         = 0x13,
	OUTCLK_ESAI0_RX_CLK     = 0x14,
	OUTCLK_ESAI0_TX_CLK     = 0x15,
	OUTCLK_SPDIF0_RX        = 0x16,
	OUTCLK_SPDIF1_RX        = 0x17,
	OUTCLK_SAI0_RX_BCLK     = 0x18,
	OUTCLK_SAI0_TX_BCLK     = 0x19,
	OUTCLK_SAI1_RX_BCLK     = 0x1a,
	OUTCLK_SAI1_TX_BCLK     = 0x1b,
	OUTCLK_SAI2_RX_BCLK     = 0x1c,
	OUTCLK_SAI3_RX_BCLK     = 0x1d,
	OUTCLK_ASRCO_MUX_CLK    = 0x1e,

	OUTCLK_ESAI1_RX_CLK     = 0x20,
	OUTCLK_ESAI1_TX_CLK     = 0x21,
	OUTCLK_SAI6_TX_BCLK     = 0x22,
	OUTCLK_HDMI_RX_SAI0_RX_BCLK     = 0x24,
	OUTCLK_HDMI_TX_SAI0_TX_BCLK     = 0x25,
};

enum asrc_word_width {
	ASRC_WIDTH_24_BIT = 0,
	ASRC_WIDTH_16_BIT = 1,
	ASRC_WIDTH_8_BIT = 2,
};

struct asrc_config {
	enum asrc_pair_index pair;
	unsigned int channel_num;
	unsigned int buffer_num;
	unsigned int dma_buffer_size;
	unsigned int input_sample_rate;
	unsigned int output_sample_rate;
	enum asrc_word_width input_word_width;
	enum asrc_word_width output_word_width;
	enum asrc_inclk inclk;
	enum asrc_outclk outclk;
};

struct asrc_req {
	unsigned int chn_num;
	enum asrc_pair_index index;
};

struct asrc_querybuf {
	unsigned int buffer_index;
	unsigned int input_length;
	unsigned int output_length;
	unsigned long input_offset;
	unsigned long output_offset;
};

struct asrc_convert_buffer {
	void *input_buffer_vaddr;
	void *output_buffer_vaddr;
	unsigned int input_buffer_length;
	unsigned int output_buffer_length;
};

struct asrc_status_flags {
	enum asrc_pair_index index;
	unsigned int overload_error;
};

enum asrc_error_status {
	ASRC_TASK_Q_OVERLOAD		= 0x01,
	ASRC_OUTPUT_TASK_OVERLOAD	= 0x02,
	ASRC_INPUT_TASK_OVERLOAD	= 0x04,
	ASRC_OUTPUT_BUFFER_OVERFLOW	= 0x08,
	ASRC_INPUT_BUFFER_UNDERRUN	= 0x10,
};
#endif/* __MXC_ASRC_UAPI_H__ */