Sound Open Firmware
Loading...
Searching...
No Matches
esai.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: BSD-3-Clause
2 *
3 * Copyright 2019 NXP
4 *
5 * Author: Daniel Baluta <daniel.baluta@nxp.com>
6 */
7
8#ifndef __SOF_DRIVERS_ESAI_H__
9#define __SOF_DRIVERS_ESAI_H__
10
11#include <rtos/bit.h>
12#include <sof/lib/dai.h>
13#include <sof/trace/trace.h>
14#include <user/trace.h>
15
16/* ESAI Register Map */
17#define REG_ESAI_ETDR 0x00
18#define REG_ESAI_ERDR 0x04
19#define REG_ESAI_ECR 0x08
20#define REG_ESAI_ESR 0x0C
21#define REG_ESAI_TFCR 0x10
22#define REG_ESAI_TFSR 0x14
23#define REG_ESAI_RFCR 0x18
24#define REG_ESAI_RFSR 0x1C
25#define REG_ESAI_xFCR(rx) (rx ? REG_ESAI_RFCR : REG_ESAI_TFCR)
26#define REG_ESAI_xFSR(rx) (rx ? REG_ESAI_RFSR : REG_ESAI_TFSR)
27#define REG_ESAI_TX0 0x80
28#define REG_ESAI_TX1 0x84
29#define REG_ESAI_TX2 0x88
30#define REG_ESAI_TX3 0x8C
31#define REG_ESAI_TX4 0x90
32#define REG_ESAI_TX5 0x94
33#define REG_ESAI_TSR 0x98
34#define REG_ESAI_RX0 0xA0
35#define REG_ESAI_RX1 0xA4
36#define REG_ESAI_RX2 0xA8
37#define REG_ESAI_RX3 0xAC
38#define REG_ESAI_SAISR 0xCC
39#define REG_ESAI_SAICR 0xD0
40#define REG_ESAI_TCR 0xD4
41#define REG_ESAI_TCCR 0xD8
42#define REG_ESAI_RCR 0xDC
43#define REG_ESAI_RCCR 0xE0
44#define REG_ESAI_xCR(rx) (rx ? REG_ESAI_RCR : REG_ESAI_TCR)
45#define REG_ESAI_xCCR(rx) (rx ? REG_ESAI_RCCR : REG_ESAI_TCCR)
46#define REG_ESAI_TSMA 0xE4
47#define REG_ESAI_TSMB 0xE8
48#define REG_ESAI_RSMA 0xEC
49#define REG_ESAI_RSMB 0xF0
50#define REG_ESAI_xSMA(rx) (rx ? REG_ESAI_RSMA : REG_ESAI_TSMA)
51#define REG_ESAI_xSMB(rx) (rx ? REG_ESAI_RSMB : REG_ESAI_TSMB)
52#define REG_ESAI_PRRC 0xF8
53#define REG_ESAI_PCRC 0xFC
54
55#define ESAI_ECR_ETI BIT(19)
56#define ESAI_ECR_ETO BIT(18)
57#define ESAI_ECR_ERI BIT(17)
58#define ESAI_ECR_ERO BIT(16)
59#define ESAI_ECR_ERST BIT(1)
60#define ESAI_ECR_ESAIEN BIT(0)
61
62#define ESAI_ESR_TINIT BIT(10)
63#define ESAI_ESR_RFF BIT(9)
64#define ESAI_ESR_TFE BIT(8)
65#define ESAI_ESR_TLS BIT(7)
66#define ESAI_ESR_TDE BIT(6)
67#define ESAI_ESR_TED BIT(5)
68#define ESAI_ESR_TD BIT(4)
69#define ESAI_ESR_RLS BIT(3)
70#define ESAI_ESR_RDE BIT(2)
71#define ESAI_ESR_RED BIT(1)
72#define ESAI_ESR_RD BIT(0)
73
74#define ESAI_xFCR_TIEN BIT(19)
75#define ESAI_xFCR_xWA_SHIFT 16
76#define ESAI_xFCR_xWA_WIDTH 3
77#define ESAI_xFCR_xWA_MASK MASK(18, 16)
78#define ESAI_xFCR_xWA(v) SET_BITS(18, 16, 8 - ((v) >> 2))
79#define ESAI_xFCR_xFWM_SHIFT 8
80#define ESAI_xFCR_xFWM_WIDTH 8
81#define ESAI_xFCR_xFWM_MASK MASK(15, 8)
82#define ESAI_xFCR_xFWM(v) SET_BITS(15, 8, (v) - 1)
83#define ESAI_xFCR_xE_SHIFT 2
84#define ESAI_xFCR_TE_WIDTH 6
85#define ESAI_xFCR_RE_WIDTH 4
86#define ESAI_xFCR_TE_MASK MASK(7, 2)
87#define ESAI_xFCR_RE_MASK MASK(5, 2)
88#define ESAI_xFCR_xE_MASK(rx) (rx ? ESAI_xFCR_RE_MASK : ESAI_xFCR_TE_MASK)
89#define ESAI_xFCR_TE(x) SET_BITS(7, 2, MASK((x) - 1, 0))
90#define ESAI_xFCR_RE(x) SET_BITS(5, 2, MASK((x) - 1, 0))
91#define ESAI_xFCR_xE(rx, x) (rx ? ESAI_xFCR_RE(x) : ESAI_xFCR_TE(x))
92#define ESAI_xFCR_xFR_SHIFT 1
93#define ESAI_xFCR_xFR_MASK BIT(1)
94#define ESAI_xFCR_xFR BIT(1)
95#define ESAI_xFCR_xFEN_SHIFT 0
96#define ESAI_xFCR_xFEN BIT(0)
97#define ESAI_xFCR_xFEN_MASK BIT(0)
98
99#define ESAI_xFSR_NTFO_MASK MASK(14, 12)
100#define ESAI_xFSR_NTFI_MASK MASK(10, 8)
101#define ESAI_xFSR_NRFO_MASK MASK(9, 8)
102#define ESAI_xFSR_NRFI_MASK MASK(13, 12)
103#define ESAI_xFSR_xFCNT_MASK MASK(7, 0)
104
105#define ESAI_SAISR_TODFE BIT(17)
106#define ESAI_SAISR_TEDE BIT(16)
107#define ESAI_SAISR_TDE BIT(15)
108#define ESAI_SAISR_TUE BIT(14)
109#define ESAI_SAISR_TFS BIT(13)
110#define ESAI_SAISR_RODF BIT(10)
111#define ESAI_SAISR_REDF BIT(9)
112#define ESAI_SAISR_RDF BIT(8)
113#define ESAI_SAISR_ROE BIT(7)
114#define ESAI_SAISR_RFS BIT(6)
115#define ESAI_SAISR_IF2 BIT(2)
116#define ESAI_SAISR_IF1 BIT(1)
117#define ESAI_SAISR_IF0 BIT(0)
118
119#define ESAI_SAICR_ALC BIT(8)
120#define ESAI_SAICR_TEBE BIT(7)
121#define ESAI_SAICR_SYN BIT(6)
122#define ESAI_SAICR_OF2 BIT(2)
123#define ESAI_SAICR_OF1 BIT(1)
124#define ESAI_SAICR_OF0 BIT(0)
125
126#define ESAI_xCR_xLIE BIT(23)
127#define ESAI_xCR_xIE BIT(22)
128#define ESAI_xCR_xEDIE BIT(21)
129#define ESAI_xCR_xEIE BIT(20)
130#define ESAI_xCR_xPR BIT(19)
131#define ESAI_xCR_PADC BIT(17) /* only valid on tx */
132#define ESAI_xCR_xFSR BIT(16)
133#define ESAI_xCR_xFSL BIT(15)
134#define ESAI_xCR_xSWS_MASK MASK(14, 10)
135
136/* The following macro is actually made to fit the table 16-44 in the i.MX8QXP
137 * manual, ESAI chapter.
138 */
139#define ESAI_xCR_xSWS_VAL(s, w) ((w) < 24 ? ((s) - (w) + (((w) - 8) >> 2)) \
140 : ((s) < 32 ? 0x1e : 0x1f))
141#define ESAI_xCR_xSWS(s, w) SET_BITS(14, 10, ESAI_xCR_xSWS_VAL(s, w))
142#define ESAI_xCR_xMOD_MASK MASK(9, 8)
143#define ESAI_xCR_xMOD_NORMAL SET_BITS(9, 8, 0)
144#define ESAI_xCR_xMOD_NETWORK SET_BITS(9, 8, 1)
145#define ESAI_xCR_xMOD_AC97 SET_BITS(9, 8, 3)
146#define ESAI_xCR_xWA BIT(7)
147#define ESAI_xCR_xSHFD BIT(6)
148#define ESAI_xCR_TE_MASK MASK(5, 0)
149#define ESAI_xCR_TE_SET(v) SET_BITS(5, 0, v)
150#define ESAI_xCR_TE(v) ESAI_xCR_TE_SET(MASK((v) - 1, 0))
151#define ESAI_xCR_RE_MASK MASK(3, 0)
152#define ESAI_xCR_RE_SET(v) SET_BITS(3, 0, v)
153#define ESAI_xCR_RE(v) ESAI_xCR_RE_SET(MASK((v) - 1, 0))
154#define ESAI_xCR_xE_MASK(rx) (rx ? ESAI_xCR_RE_MASK : ESAI_xCR_TE_MASK)
155#define ESAI_xCR_xE(rx, v) (rx ? ESAI_xCR_RE(v) : ESAI_xCR_TE(v))
156
157#define ESAI_xCCR_xHCKD BIT(23)
158#define ESAI_xCCR_xFSD BIT(22)
159#define ESAI_xCCR_xCKD BIT(21)
160#define ESAI_xCCR_xHCKP BIT(20)
161#define ESAI_xCCR_xFSP BIT(19)
162#define ESAI_xCCR_xCKP BIT(18)
163#define ESAI_xCCR_xFP_MASK MASK(17, 14)
164#define ESAI_xCCR_xFP(div) SET_BITS(17, 14, (div) - 1)
165#define ESAI_xCCR_xDC_MASK MASK(13, 9)
166#define ESAI_xCCR_xDC(v) SET_BITS(13, 9, (v) - 1)
167#define ESAI_xCCR_xDC_AC97 SET_BITS(13, 9, 0x0C)
168#define ESAI_xCCR_xPSR_MASK MASK(8, 8)
169#define ESAI_xCCR_xPSR_BYPASS SET_BITS(8, 8, 1)
170#define ESAI_xCCR_xPSR_DIV8 SET_BITS(8, 8, 0)
171#define ESAI_xCCR_xPM_MASK MASK(7, 0)
172#define ESAI_xCCR_xPM(v) SET_BITS(7, 0, (v) - 1)
173
174#define ESAI_xSMA_xS_MASK MASK(15, 0)
175#define ESAI_xSMA_xS(v) SET_BITS(15, 0, v)
176#define ESAI_xSMB_xS_MASK MASK(15, 0)
177#define ESAI_xSMB_xS(v) SET_BITS(15, 0, (v) >> 16)
178#define ESAI_xSMA_xS_CHANS(ch) ESAI_xSMA_xS(MASK((ch) - 1, 0))
179#define ESAI_xSMB_xS_CHANS(ch) ESAI_xSMB_xS(MASK((ch) - 1, 0))
180
181#define ESAI_PRRC_PDC_MASK MASK(11, 0)
182#define ESAI_PRRC_PDC(v) SET_BITS(11, 0, v)
183
184#define ESAI_PCRC_PC_MASK MASK(11, 0)
185#define ESAI_PCRC_PC(v) SET_BITS(11, 0, v)
186
187#define ESAI_GPIO MASK(11, 0)
188
189#define EDMA_ESAI_IRQ 442
190
191#define EDMA_ESAI_TX_CHAN 7
192#define EDMA_ESAI_RX_CHAN 6
193
194extern const struct dai_driver esai_driver;
195#endif /* __SOF_DRIVERS_ESAI_H__ */
const struct dai_driver esai_driver