xref: /OK3568_Linux_fs/kernel/sound/arm/aaci.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  *  linux/sound/arm/aaci.c - ARM PrimeCell AACI PL041 driver
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  *  Copyright (C) 2003 Deep Blue Solutions, Ltd, All Rights Reserved.
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun #ifndef AACI_H
8*4882a593Smuzhiyun #define AACI_H
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun /*
11*4882a593Smuzhiyun  * Control and status register offsets
12*4882a593Smuzhiyun  *  P39.
13*4882a593Smuzhiyun  */
14*4882a593Smuzhiyun #define AACI_CSCH1	0x000
15*4882a593Smuzhiyun #define AACI_CSCH2	0x014
16*4882a593Smuzhiyun #define AACI_CSCH3	0x028
17*4882a593Smuzhiyun #define AACI_CSCH4	0x03c
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun #define AACI_RXCR	0x000	/* 29 bits Control Rx FIFO */
20*4882a593Smuzhiyun #define AACI_TXCR	0x004	/* 17 bits Control Tx FIFO */
21*4882a593Smuzhiyun #define AACI_SR		0x008	/* 12 bits Status */
22*4882a593Smuzhiyun #define AACI_ISR	0x00c	/* 7 bits  Int Status */
23*4882a593Smuzhiyun #define AACI_IE 	0x010	/* 7 bits  Int Enable */
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun /*
26*4882a593Smuzhiyun  * Other registers
27*4882a593Smuzhiyun  */
28*4882a593Smuzhiyun #define AACI_SL1RX	0x050
29*4882a593Smuzhiyun #define AACI_SL1TX	0x054
30*4882a593Smuzhiyun #define AACI_SL2RX	0x058
31*4882a593Smuzhiyun #define AACI_SL2TX	0x05c
32*4882a593Smuzhiyun #define AACI_SL12RX	0x060
33*4882a593Smuzhiyun #define AACI_SL12TX	0x064
34*4882a593Smuzhiyun #define AACI_SLFR	0x068	/* slot flags */
35*4882a593Smuzhiyun #define AACI_SLISTAT	0x06c	/* slot interrupt status */
36*4882a593Smuzhiyun #define AACI_SLIEN	0x070	/* slot interrupt enable */
37*4882a593Smuzhiyun #define AACI_INTCLR	0x074	/* interrupt clear */
38*4882a593Smuzhiyun #define AACI_MAINCR	0x078	/* main control */
39*4882a593Smuzhiyun #define AACI_RESET	0x07c	/* reset control */
40*4882a593Smuzhiyun #define AACI_SYNC	0x080	/* sync control */
41*4882a593Smuzhiyun #define AACI_ALLINTS	0x084	/* all fifo interrupt status */
42*4882a593Smuzhiyun #define AACI_MAINFR	0x088	/* main flag register */
43*4882a593Smuzhiyun #define AACI_DR1	0x090	/* data read/written fifo 1 */
44*4882a593Smuzhiyun #define AACI_DR2	0x0b0	/* data read/written fifo 2 */
45*4882a593Smuzhiyun #define AACI_DR3	0x0d0	/* data read/written fifo 3 */
46*4882a593Smuzhiyun #define AACI_DR4	0x0f0	/* data read/written fifo 4 */
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun /*
49*4882a593Smuzhiyun  * TX/RX fifo control register (CR). P48
50*4882a593Smuzhiyun  */
51*4882a593Smuzhiyun #define CR_FEN		(1 << 16)	/* fifo enable */
52*4882a593Smuzhiyun #define CR_COMPACT	(1 << 15)	/* compact mode */
53*4882a593Smuzhiyun #define CR_SZ16		(0 << 13)	/* 16 bits */
54*4882a593Smuzhiyun #define CR_SZ18		(1 << 13)	/* 18 bits */
55*4882a593Smuzhiyun #define CR_SZ20		(2 << 13)	/* 20 bits */
56*4882a593Smuzhiyun #define CR_SZ12		(3 << 13)	/* 12 bits */
57*4882a593Smuzhiyun #define CR_SL12		(1 << 12)
58*4882a593Smuzhiyun #define CR_SL11		(1 << 11)
59*4882a593Smuzhiyun #define CR_SL10		(1 << 10)
60*4882a593Smuzhiyun #define CR_SL9		(1 << 9)
61*4882a593Smuzhiyun #define CR_SL8		(1 << 8)
62*4882a593Smuzhiyun #define CR_SL7		(1 << 7)
63*4882a593Smuzhiyun #define CR_SL6		(1 << 6)
64*4882a593Smuzhiyun #define CR_SL5		(1 << 5)
65*4882a593Smuzhiyun #define CR_SL4		(1 << 4)
66*4882a593Smuzhiyun #define CR_SL3		(1 << 3)
67*4882a593Smuzhiyun #define CR_SL2		(1 << 2)
68*4882a593Smuzhiyun #define CR_SL1		(1 << 1)
69*4882a593Smuzhiyun #define CR_EN		(1 << 0)	/* transmit enable */
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun /*
72*4882a593Smuzhiyun  * status register bits. P49
73*4882a593Smuzhiyun  */
74*4882a593Smuzhiyun #define SR_RXTOFE	(1 << 11)	/* rx timeout fifo empty */
75*4882a593Smuzhiyun #define SR_TXTO		(1 << 10)	/* rx timeout fifo nonempty */
76*4882a593Smuzhiyun #define SR_TXU		(1 << 9)	/* tx underrun */
77*4882a593Smuzhiyun #define SR_RXO		(1 << 8)	/* rx overrun */
78*4882a593Smuzhiyun #define SR_TXB		(1 << 7)	/* tx busy */
79*4882a593Smuzhiyun #define SR_RXB		(1 << 6)	/* rx busy */
80*4882a593Smuzhiyun #define SR_TXFF		(1 << 5)	/* tx fifo full */
81*4882a593Smuzhiyun #define SR_RXFF		(1 << 4)	/* rx fifo full */
82*4882a593Smuzhiyun #define SR_TXHE		(1 << 3)	/* tx fifo half empty */
83*4882a593Smuzhiyun #define SR_RXHF		(1 << 2)	/* rx fifo half full */
84*4882a593Smuzhiyun #define SR_TXFE		(1 << 1)	/* tx fifo empty */
85*4882a593Smuzhiyun #define SR_RXFE		(1 << 0)	/* rx fifo empty */
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun /*
88*4882a593Smuzhiyun  * interrupt status register bits.
89*4882a593Smuzhiyun  */
90*4882a593Smuzhiyun #define ISR_RXTOFEINTR	(1 << 6)	/* rx fifo empty */
91*4882a593Smuzhiyun #define ISR_URINTR	(1 << 5)	/* tx underflow */
92*4882a593Smuzhiyun #define ISR_ORINTR	(1 << 4)	/* rx overflow */
93*4882a593Smuzhiyun #define ISR_RXINTR	(1 << 3)	/* rx fifo */
94*4882a593Smuzhiyun #define ISR_TXINTR	(1 << 2)	/* tx fifo intr */
95*4882a593Smuzhiyun #define ISR_RXTOINTR	(1 << 1)	/* tx timeout */
96*4882a593Smuzhiyun #define ISR_TXCINTR	(1 << 0)	/* tx complete */
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun /*
99*4882a593Smuzhiyun  * interrupt enable register bits.
100*4882a593Smuzhiyun  */
101*4882a593Smuzhiyun #define IE_RXTOIE	(1 << 6)
102*4882a593Smuzhiyun #define IE_URIE		(1 << 5)
103*4882a593Smuzhiyun #define IE_ORIE		(1 << 4)
104*4882a593Smuzhiyun #define IE_RXIE		(1 << 3)
105*4882a593Smuzhiyun #define IE_TXIE		(1 << 2)
106*4882a593Smuzhiyun #define IE_RXTIE	(1 << 1)
107*4882a593Smuzhiyun #define IE_TXCIE	(1 << 0)
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun /*
110*4882a593Smuzhiyun  * interrupt status. P51
111*4882a593Smuzhiyun  */
112*4882a593Smuzhiyun #define ISR_RXTOFE	(1 << 6)	/* rx timeout fifo empty */
113*4882a593Smuzhiyun #define ISR_UR		(1 << 5)	/* tx fifo underrun */
114*4882a593Smuzhiyun #define ISR_OR		(1 << 4)	/* rx fifo overrun */
115*4882a593Smuzhiyun #define ISR_RX		(1 << 3)	/* rx interrupt status */
116*4882a593Smuzhiyun #define ISR_TX		(1 << 2)	/* tx interrupt status */
117*4882a593Smuzhiyun #define ISR_RXTO	(1 << 1)	/* rx timeout */
118*4882a593Smuzhiyun #define ISR_TXC		(1 << 0)	/* tx complete */
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun /*
121*4882a593Smuzhiyun  * interrupt enable. P52
122*4882a593Smuzhiyun  */
123*4882a593Smuzhiyun #define IE_RXTOFE	(1 << 6)	/* rx timeout fifo empty */
124*4882a593Smuzhiyun #define IE_UR		(1 << 5)	/* tx fifo underrun */
125*4882a593Smuzhiyun #define IE_OR		(1 << 4)	/* rx fifo overrun */
126*4882a593Smuzhiyun #define IE_RX		(1 << 3)	/* rx interrupt status */
127*4882a593Smuzhiyun #define IE_TX		(1 << 2)	/* tx interrupt status */
128*4882a593Smuzhiyun #define IE_RXTO		(1 << 1)	/* rx timeout */
129*4882a593Smuzhiyun #define IE_TXC		(1 << 0)	/* tx complete */
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun /*
132*4882a593Smuzhiyun  * slot flag register bits. P56
133*4882a593Smuzhiyun  */
134*4882a593Smuzhiyun #define SLFR_RWIS	(1 << 13)	/* raw wake-up interrupt status */
135*4882a593Smuzhiyun #define SLFR_RGPIOINTR	(1 << 12)	/* raw gpio interrupt */
136*4882a593Smuzhiyun #define SLFR_12TXE	(1 << 11)	/* slot 12 tx empty */
137*4882a593Smuzhiyun #define SLFR_12RXV	(1 << 10)	/* slot 12 rx valid */
138*4882a593Smuzhiyun #define SLFR_2TXE	(1 << 9)	/* slot 2 tx empty */
139*4882a593Smuzhiyun #define SLFR_2RXV	(1 << 8)	/* slot 2 rx valid */
140*4882a593Smuzhiyun #define SLFR_1TXE	(1 << 7)	/* slot 1 tx empty */
141*4882a593Smuzhiyun #define SLFR_1RXV	(1 << 6)	/* slot 1 rx valid */
142*4882a593Smuzhiyun #define SLFR_12TXB	(1 << 5)	/* slot 12 tx busy */
143*4882a593Smuzhiyun #define SLFR_12RXB	(1 << 4)	/* slot 12 rx busy */
144*4882a593Smuzhiyun #define SLFR_2TXB	(1 << 3)	/* slot 2 tx busy */
145*4882a593Smuzhiyun #define SLFR_2RXB	(1 << 2)	/* slot 2 rx busy */
146*4882a593Smuzhiyun #define SLFR_1TXB	(1 << 1)	/* slot 1 tx busy */
147*4882a593Smuzhiyun #define SLFR_1RXB	(1 << 0)	/* slot 1 rx busy */
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun /*
150*4882a593Smuzhiyun  * Interrupt clear register.
151*4882a593Smuzhiyun  */
152*4882a593Smuzhiyun #define ICLR_RXTOFEC4	(1 << 12)
153*4882a593Smuzhiyun #define ICLR_RXTOFEC3	(1 << 11)
154*4882a593Smuzhiyun #define ICLR_RXTOFEC2	(1 << 10)
155*4882a593Smuzhiyun #define ICLR_RXTOFEC1	(1 << 9)
156*4882a593Smuzhiyun #define ICLR_TXUEC4	(1 << 8)
157*4882a593Smuzhiyun #define ICLR_TXUEC3	(1 << 7)
158*4882a593Smuzhiyun #define ICLR_TXUEC2	(1 << 6)
159*4882a593Smuzhiyun #define ICLR_TXUEC1	(1 << 5)
160*4882a593Smuzhiyun #define ICLR_RXOEC4	(1 << 4)
161*4882a593Smuzhiyun #define ICLR_RXOEC3	(1 << 3)
162*4882a593Smuzhiyun #define ICLR_RXOEC2	(1 << 2)
163*4882a593Smuzhiyun #define ICLR_RXOEC1	(1 << 1)
164*4882a593Smuzhiyun #define ICLR_WISC	(1 << 0)
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun /*
167*4882a593Smuzhiyun  * Main control register bits. P62
168*4882a593Smuzhiyun  */
169*4882a593Smuzhiyun #define MAINCR_SCRA(x)	((x) << 10)	/* secondary codec reg access */
170*4882a593Smuzhiyun #define MAINCR_DMAEN	(1 << 9)	/* dma enable */
171*4882a593Smuzhiyun #define MAINCR_SL12TXEN	(1 << 8)	/* slot 12 transmit enable */
172*4882a593Smuzhiyun #define MAINCR_SL12RXEN	(1 << 7)	/* slot 12 receive enable */
173*4882a593Smuzhiyun #define MAINCR_SL2TXEN	(1 << 6)	/* slot 2 transmit enable */
174*4882a593Smuzhiyun #define MAINCR_SL2RXEN	(1 << 5)	/* slot 2 receive enable */
175*4882a593Smuzhiyun #define MAINCR_SL1TXEN	(1 << 4)	/* slot 1 transmit enable */
176*4882a593Smuzhiyun #define MAINCR_SL1RXEN	(1 << 3)	/* slot 1 receive enable */
177*4882a593Smuzhiyun #define MAINCR_LPM	(1 << 2)	/* low power mode */
178*4882a593Smuzhiyun #define MAINCR_LOOPBK	(1 << 1)	/* loopback */
179*4882a593Smuzhiyun #define MAINCR_IE	(1 << 0)	/* aaci interface enable */
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun /*
182*4882a593Smuzhiyun  * Reset register bits. P65
183*4882a593Smuzhiyun  */
184*4882a593Smuzhiyun #define RESET_NRST	(1 << 0)
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun /*
187*4882a593Smuzhiyun  * Sync register bits. P65
188*4882a593Smuzhiyun  */
189*4882a593Smuzhiyun #define SYNC_FORCE	(1 << 0)
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun /*
192*4882a593Smuzhiyun  * Main flag register bits. P66
193*4882a593Smuzhiyun  */
194*4882a593Smuzhiyun #define MAINFR_TXB	(1 << 1)	/* transmit busy */
195*4882a593Smuzhiyun #define MAINFR_RXB	(1 << 0)	/* receive busy */
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun struct aaci_runtime {
200*4882a593Smuzhiyun 	void			__iomem *base;
201*4882a593Smuzhiyun 	void			__iomem *fifo;
202*4882a593Smuzhiyun 	spinlock_t		lock;
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun 	struct ac97_pcm		*pcm;
205*4882a593Smuzhiyun 	int			pcm_open;
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun 	u32			cr;
208*4882a593Smuzhiyun 	struct snd_pcm_substream	*substream;
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 	unsigned int		period;	/* byte size of a "period" */
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun 	/*
213*4882a593Smuzhiyun 	 * PIO support
214*4882a593Smuzhiyun 	 */
215*4882a593Smuzhiyun 	void			*start;
216*4882a593Smuzhiyun 	void			*end;
217*4882a593Smuzhiyun 	void			*ptr;
218*4882a593Smuzhiyun 	int			bytes;
219*4882a593Smuzhiyun 	unsigned int		fifo_bytes;
220*4882a593Smuzhiyun };
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun struct aaci {
223*4882a593Smuzhiyun 	struct amba_device	*dev;
224*4882a593Smuzhiyun 	struct snd_card		*card;
225*4882a593Smuzhiyun 	void			__iomem *base;
226*4882a593Smuzhiyun 	unsigned int		fifo_depth;
227*4882a593Smuzhiyun 	unsigned int		users;
228*4882a593Smuzhiyun 	struct mutex		irq_lock;
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun 	/* AC'97 */
231*4882a593Smuzhiyun 	struct mutex		ac97_sem;
232*4882a593Smuzhiyun 	struct snd_ac97_bus	*ac97_bus;
233*4882a593Smuzhiyun 	struct snd_ac97		*ac97;
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun 	u32			maincr;
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun 	struct aaci_runtime	playback;
238*4882a593Smuzhiyun 	struct aaci_runtime	capture;
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun 	struct snd_pcm		*pcm;
241*4882a593Smuzhiyun };
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun #define ACSTREAM_FRONT		0
244*4882a593Smuzhiyun #define ACSTREAM_SURROUND	1
245*4882a593Smuzhiyun #define ACSTREAM_LFE		2
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun #endif
248