summaryrefslogtreecommitdiff
path: root/sound/soc/rockchip/rockchip_sai.h
blob: c359c5d0311cae3ca4d45309e54c88d059bf254a (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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * ALSA SoC Audio Layer - Rockchip SAI Controller driver
 *
 * Copyright (c) 2022 Rockchip Electronics Co. Ltd.
 */

#ifndef _ROCKCHIP_SAI_H
#define _ROCKCHIP_SAI_H

/* XCR Transmit / Receive Control Register */
#define SAI_XCR_START_SEL_MASK		BIT(23)
#define SAI_XCR_START_SEL_CHAINED	BIT(23)
#define SAI_XCR_START_SEL_STANDALONE	0
#define SAI_XCR_EDGE_SHIFT_MASK		BIT(22)
#define SAI_XCR_EDGE_SHIFT_1		BIT(22)
#define SAI_XCR_EDGE_SHIFT_0		0
#define SAI_XCR_CSR_MASK		GENMASK(21, 20)
#define SAI_XCR_CSR(x)			((x - 1) << 20)
#define SAI_XCR_CSR_V(v)		((((v) & SAI_XCR_CSR_MASK) >> 20) + 1)
#define SAI_XCR_SJM_MASK		BIT(19)
#define SAI_XCR_SJM_L			BIT(19)
#define SAI_XCR_SJM_R			0
#define SAI_XCR_FBM_MASK		BIT(18)
#define SAI_XCR_FBM_LSB			BIT(18)
#define SAI_XCR_FBM_MSB			0
#define SAI_XCR_SNB_MASK		GENMASK(17, 11)
#define SAI_XCR_SNB(x)			((x - 1) << 11)
#define SAI_XCR_VDJ_MASK		BIT(10)
#define SAI_XCR_VDJ_L			BIT(10)
#define SAI_XCR_VDJ_R			0
#define SAI_XCR_SBW_MASK		GENMASK(9, 5)
#define SAI_XCR_SBW(x)			((x - 1) << 5)
#define SAI_XCR_SBW_V(v)		((((v) & SAI_XCR_SBW_MASK) >> 5) + 1)
#define SAI_XCR_VDW_MASK		GENMASK(4, 0)
#define SAI_XCR_VDW(x)			((x - 1) << 0)

/* FSCR Frame Sync Control Register */
#define SAI_FSCR_EDGE_MASK		BIT(24)
#define SAI_FSCR_EDGE_DUAL		BIT(24)
#define SAI_FSCR_EDGE_RISING		0
#define SAI_FSCR_FPW_MASK		GENMASK(23, 12)
#define SAI_FSCR_FPW(x)			((x - 1) << 12)
#define SAI_FSCR_FW_MASK		GENMASK(11, 0)
#define SAI_FSCR_FW(x)			((x - 1) << 0)
#define SAI_FSCR_FW_V(v)		((((v) & SAI_FSCR_FW_MASK) >> 0) + 1)

/* MONO_CR Mono Control Register */
#define SAI_MCR_RX_MONO_SLOT_MASK	GENMASK(8, 2)
#define SAI_MCR_RX_MONO_SLOT_SEL(x)	((x - 1) << 2)
#define SAI_MCR_RX_MONO_MASK		BIT(1)
#define SAI_MCR_RX_MONO_EN		BIT(1)
#define SAI_MCR_RX_MONO_DIS		0
#define SAI_MCR_TX_MONO_MASK		BIT(0)
#define SAI_MCR_TX_MONO_EN		BIT(0)
#define SAI_MCR_TX_MONO_DIS		0

/* XFER Transfer Start Register */
#define SAI_XFER_RX_IDLE		BIT(8)
#define SAI_XFER_TX_IDLE		BIT(7)
#define SAI_XFER_FS_IDLE		BIT(6)
/*
 * Used for TX only (VERSION >= SAI_VER_2311)
 *
 * SCLK/FSYNC auto gated when TX FIFO empty.
 */
#define SAI_XFER_TX_AUTO_MASK		BIT(6)
#define SAI_XFER_TX_AUTO_EN		BIT(6)
#define SAI_XFER_TX_AUTO_DIS		0
#define SAI_XFER_RX_CNT_MASK		BIT(5)
#define SAI_XFER_RX_CNT_EN		BIT(5)
#define SAI_XFER_RX_CNT_DIS		0
#define SAI_XFER_TX_CNT_MASK		BIT(4)
#define SAI_XFER_TX_CNT_EN		BIT(4)
#define SAI_XFER_TX_CNT_DIS		0
#define SAI_XFER_RXS_MASK		BIT(3)
#define SAI_XFER_RXS_EN			BIT(3)
#define SAI_XFER_RXS_DIS		0
#define SAI_XFER_TXS_MASK		BIT(2)
#define SAI_XFER_TXS_EN			BIT(2)
#define SAI_XFER_TXS_DIS		0
#define SAI_XFER_FSS_MASK		BIT(1)
#define SAI_XFER_FSS_EN			BIT(1)
#define SAI_XFER_FSS_DIS		0
#define SAI_XFER_CLK_MASK		BIT(0)
#define SAI_XFER_CLK_EN			BIT(0)
#define SAI_XFER_CLK_DIS		0

/* CLR Clear Logic Register */
#define SAI_CLR_FCR			BIT(3)	/* TODO: what is this? */
#define SAI_CLR_FSC			BIT(2)
#define SAI_CLR_RXC			BIT(1)
#define SAI_CLR_TXC			BIT(0)

/* CKR Clock Generation Register */
#define SAI_CKR_MDIV_MASK		GENMASK(14, 3)
#define SAI_CKR_MDIV(x)			((x - 1) << 3)
#define SAI_CKR_MSS_MASK		BIT(2)
#define SAI_CKR_MSS_SLAVE		BIT(2)
#define SAI_CKR_MSS_MASTER		0
#define SAI_CKR_CKP_MASK		BIT(1)
#define SAI_CKR_CKP_INVERTED		BIT(1)
#define SAI_CKR_CKP_NORMAL		0
#define SAI_CKR_FSP_MASK		BIT(0)
#define SAI_CKR_FSP_INVERTED		BIT(0)
#define SAI_CKR_FSP_NORMAL		0

/* DMACR DMA Control Register */
#define SAI_DMACR_RDE_MASK		BIT(24)
#define SAI_DMACR_RDE(x)		((x) << 24)
#define SAI_DMACR_RDL_MASK		GENMASK(20, 16)
#define SAI_DMACR_RDL(x)		((x - 1) << 16)
#define SAI_DMACR_RDL_V(v)		((((v) & SAI_DMACR_RDL_MASK) >> 16) + 1)
#define SAI_DMACR_TDE_MASK		BIT(8)
#define SAI_DMACR_TDE(x)		((x) << 8)
#define SAI_DMACR_TDL_MASK		GENMASK(4, 0)
#define SAI_DMACR_TDL(x)		((x) << 0)
#define SAI_DMACR_TDL_V(v)		(((v) & SAI_DMACR_TDL_MASK) >> 0)

/* INTCR Interrupt Ctrl Register */
#define SAI_INTCR_FSLOSTC			BIT(28)
#define SAI_INTCR_FSLOST_MASK		BIT(27)
#define SAI_INTCR_FSLOST(x)		((x) << 27)
#define SAI_INTCR_FSERRC			BIT(26)
#define SAI_INTCR_FSERR_MASK		BIT(25)
#define SAI_INTCR_FSERR(x)		((x) << 25)
#define SAI_INTCR_RXOIC			BIT(18)
#define SAI_INTCR_RXOIE_MASK		BIT(17)
#define SAI_INTCR_RXOIE(x)		((x) << 17)
#define SAI_INTCR_TXUIC			BIT(2)
#define SAI_INTCR_TXUIE_MASK		BIT(1)
#define SAI_INTCR_TXUIE(x)		((x) << 1)

/* INTSR Interrupt Status Register */
#define SAI_INTSR_FSLOSTI_INA		0
#define SAI_INTSR_FSLOSTI_ACT		BIT(19)
#define SAI_INTSR_FSERRI_INA		0
#define SAI_INTSR_FSERRI_ACT		BIT(18)
#define SAI_INTSR_RXOI_INA		0
#define SAI_INTSR_RXOI_ACT		BIT(17)
#define SAI_INTSR_TXUI_INA		0
#define SAI_INTSR_TXUI_ACT		BIT(1)

/* PATH_SEL: Transfer / Receive Path Select Register */
#define SAI_RX_PATH_SHIFT(x)		(8 + (x) * 2)
#define SAI_RX_PATH_MASK(x)		(0x3 << SAI_RX_PATH_SHIFT(x))
#define SAI_RX_PATH(x, v)		((v) << SAI_RX_PATH_SHIFT(x))
#define SAI_TX_PATH_SHIFT(x)		(0 + (x) * 2)
#define SAI_TX_PATH_MASK(x)		(0x3 << SAI_TX_PATH_SHIFT(x))
#define SAI_TX_PATH(x, v)		((v) << SAI_TX_PATH_SHIFT(x))

/* XSHIFT: Transfer / Receive Frame Sync Shift Register */

/*
 * TX-ONLY: LEFT Direction Feature
 * +------------------------------------------------+
 * | DATA LEFTx (step: 0.5 cycle) | FSYNC Edge      |
 * +------------------------------------------------+
 */
#define SAI_XSHIFT_LEFT_MASK		GENMASK(25, 24)
#define SAI_XSHIFT_LEFT(x)		((x) << 24)
/*
 * +------------------------------------------------+
 * | FSYNC Edge | DATA RIGHTx (step: 0.5 cycle)     |
 * +------------------------------------------------+
 */
#define SAI_XSHIFT_RIGHT_MASK		GENMASK(23, 0)
#define SAI_XSHIFT_RIGHT(x)		(x)

/* XFIFOLR: Transfer / Receive FIFO Level Register */
#define SAI_FIFOLR_XFL3_SHIFT		18
#define SAI_FIFOLR_XFL3_MASK		GENMASK(23, 18)
#define SAI_FIFOLR_XFL2_SHIFT		12
#define SAI_FIFOLR_XFL2_MASK		GENMASK(17, 12)
#define SAI_FIFOLR_XFL1_SHIFT		6
#define SAI_FIFOLR_XFL1_MASK		GENMASK(11, 6)
#define SAI_FIFOLR_XFL0_SHIFT		0
#define SAI_FIFOLR_XFL0_MASK		GENMASK(5, 0)

/* STATUS Status Register (VERSION >= SAI_VER_2307) */
#define SAI_STATUS_RX_IDLE		BIT(3)
#define SAI_STATUS_TX_IDLE		BIT(2)
#define SAI_STATUS_FS_IDLE		BIT(1)

/* VERSION */
/*
 * Updates:
 *
 * VERSION >= SAI_VER_2311
 *
 * Support Frame Sync xN (FSXN)
 * Support Frame Sync Error Detect (FSE)
 * Support Frame Sync Lost Detect (FSLOST)
 * Support Force Clear (FCR)
 * Support SAIn-Chained (e.g. SAI0-CLK-DATA + SAI3-DATA +...)
 * Support Transmit Auto Gate Mode
 * Support Timing Shift Left for TX
 *
 * Optimize SCLK/FSYNC Timing Alignment
 *
 * VERSION >= SAI_VER_2403
 *
 * Support Loopback LR Select (e.g. L:MIC R:LP)
 *
 */
#define SAI_VER_2307			0x23073576
#define SAI_VER_2311			0x23112118
#define SAI_VER_2401			0x24013506
#define SAI_VER_2403			0x24031103

/* FS_TIMEOUT: Frame Sync Timeout Register */
#define SAI_FS_TIMEOUT_VAL_MASK		GENMASK(31, 1)
#define SAI_FS_TIMEOUT_VAL(x)		((x) << 1)
#define SAI_FS_TIMEOUT_EN_MASK		BIT(0)
#define SAI_FS_TIMEOUT_EN(x)		((x) << 0)

/* SAI Registers */
#define SAI_TXCR			(0x0000)
#define SAI_FSCR			(0x0004)
#define SAI_RXCR			(0x0008)
#define SAI_MONO_CR			(0x000c)
#define SAI_XFER			(0x0010)
#define SAI_CLR				(0x0014)
#define SAI_CKR				(0x0018)
#define SAI_TXFIFOLR			(0x001c)
#define SAI_RXFIFOLR			(0x0020)
#define SAI_DMACR			(0x0024)
#define SAI_INTCR			(0x0028)
#define SAI_INTSR			(0x002c)
#define SAI_TXDR			(0x0030)
#define SAI_RXDR			(0x0034)
#define SAI_PATH_SEL			(0x0038)
#define SAI_TX_SLOT_MASK0		(0x003c)
#define SAI_TX_SLOT_MASK1		(0x0040)
#define SAI_TX_SLOT_MASK2		(0x0044)
#define SAI_TX_SLOT_MASK3		(0x0048)
#define SAI_RX_SLOT_MASK0		(0x004c)
#define SAI_RX_SLOT_MASK1		(0x0050)
#define SAI_RX_SLOT_MASK2		(0x0054)
#define SAI_RX_SLOT_MASK3		(0x0058)
#define SAI_TX_DATA_CNT			(0x005c)
#define SAI_RX_DATA_CNT			(0x0060)
#define SAI_TX_SHIFT			(0x0064)
#define SAI_RX_SHIFT			(0x0068)
#define SAI_STATUS			(0x006c)
#define SAI_VERSION			(0x0070)
#define SAI_FSXN			(0x0074)
#define SAI_FS_TIMEOUT			(0x0078)
#define SAI_LOOPBACK_LR			(0x007c)

#endif /* _ROCKCHIP_SAI_H */