xref: /OK3568_Linux_fs/kernel/sound/soc/sti/uniperif.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (C) STMicroelectronics SA 2015
4*4882a593Smuzhiyun  * Authors: Arnaud Pouliquen <arnaud.pouliquen@st.com>
5*4882a593Smuzhiyun  *          for STMicroelectronics.
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #ifndef __SND_ST_AUD_UNIPERIF_H
9*4882a593Smuzhiyun #define __SND_ST_AUD_UNIPERIF_H
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include <linux/regmap.h>
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include <sound/dmaengine_pcm.h>
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun /*
16*4882a593Smuzhiyun  * Register access macros
17*4882a593Smuzhiyun  */
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun #define GET_UNIPERIF_REG(ip, offset, shift, mask) \
20*4882a593Smuzhiyun 	((readl_relaxed(ip->base + offset) >> shift) & mask)
21*4882a593Smuzhiyun #define SET_UNIPERIF_REG(ip, offset, shift, mask, value) \
22*4882a593Smuzhiyun 	writel_relaxed(((readl_relaxed(ip->base + offset) & \
23*4882a593Smuzhiyun 	~(mask << shift)) | (((value) & mask) << shift)), ip->base + offset)
24*4882a593Smuzhiyun #define SET_UNIPERIF_BIT_REG(ip, offset, shift, mask, value) \
25*4882a593Smuzhiyun 	writel_relaxed((((value) & mask) << shift), ip->base + offset)
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun /*
28*4882a593Smuzhiyun  * UNIPERIF_SOFT_RST reg
29*4882a593Smuzhiyun  */
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #define UNIPERIF_SOFT_RST_OFFSET(ip) 0x0000
32*4882a593Smuzhiyun #define GET_UNIPERIF_SOFT_RST(ip) \
33*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? \
34*4882a593Smuzhiyun 		readl_relaxed(ip->base + UNIPERIF_SOFT_RST_OFFSET(ip)) : 0)
35*4882a593Smuzhiyun #define SET_UNIPERIF_SOFT_RST(ip, value) \
36*4882a593Smuzhiyun 	writel_relaxed(value, ip->base + UNIPERIF_SOFT_RST_OFFSET(ip))
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun /* SOFT_RST */
39*4882a593Smuzhiyun #define UNIPERIF_SOFT_RST_SOFT_RST_SHIFT(ip) 0x0
40*4882a593Smuzhiyun #define UNIPERIF_SOFT_RST_SOFT_RST_MASK(ip) 0x1
41*4882a593Smuzhiyun #define SET_UNIPERIF_SOFT_RST_SOFT_RST(ip) \
42*4882a593Smuzhiyun 	SET_UNIPERIF_BIT_REG(ip, \
43*4882a593Smuzhiyun 		UNIPERIF_SOFT_RST_OFFSET(ip), \
44*4882a593Smuzhiyun 		UNIPERIF_SOFT_RST_SOFT_RST_SHIFT(ip), \
45*4882a593Smuzhiyun 		UNIPERIF_SOFT_RST_SOFT_RST_MASK(ip), 1)
46*4882a593Smuzhiyun #define GET_UNIPERIF_SOFT_RST_SOFT_RST(ip) \
47*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
48*4882a593Smuzhiyun 		UNIPERIF_SOFT_RST_OFFSET(ip), \
49*4882a593Smuzhiyun 		UNIPERIF_SOFT_RST_SOFT_RST_SHIFT(ip), \
50*4882a593Smuzhiyun 		UNIPERIF_SOFT_RST_SOFT_RST_MASK(ip))
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun /*
53*4882a593Smuzhiyun  * UNIPERIF_FIFO_DATA reg
54*4882a593Smuzhiyun  */
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun #define UNIPERIF_FIFO_DATA_OFFSET(ip) 0x0004
57*4882a593Smuzhiyun #define SET_UNIPERIF_DATA(ip, value) \
58*4882a593Smuzhiyun 	writel_relaxed(value, ip->base + UNIPERIF_FIFO_DATA_OFFSET(ip))
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun /*
61*4882a593Smuzhiyun  * UNIPERIF_CHANNEL_STA_REGN reg
62*4882a593Smuzhiyun  */
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun #define UNIPERIF_CHANNEL_STA_REGN(ip, n) (0x0060 + (4 * n))
65*4882a593Smuzhiyun #define GET_UNIPERIF_CHANNEL_STA_REGN(ip) \
66*4882a593Smuzhiyun 	readl_relaxed(ip->base + UNIPERIF_CHANNEL_STA_REGN(ip, n))
67*4882a593Smuzhiyun #define SET_UNIPERIF_CHANNEL_STA_REGN(ip, n, value) \
68*4882a593Smuzhiyun 	writel_relaxed(value, ip->base + \
69*4882a593Smuzhiyun 			UNIPERIF_CHANNEL_STA_REGN(ip, n))
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun #define UNIPERIF_CHANNEL_STA_REG0_OFFSET(ip) 0x0060
72*4882a593Smuzhiyun #define GET_UNIPERIF_CHANNEL_STA_REG0(ip) \
73*4882a593Smuzhiyun 	readl_relaxed(ip->base + UNIPERIF_CHANNEL_STA_REG0_OFFSET(ip))
74*4882a593Smuzhiyun #define SET_UNIPERIF_CHANNEL_STA_REG0(ip, value) \
75*4882a593Smuzhiyun 	writel_relaxed(value, ip->base + UNIPERIF_CHANNEL_STA_REG0_OFFSET(ip))
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun #define UNIPERIF_CHANNEL_STA_REG1_OFFSET(ip) 0x0064
78*4882a593Smuzhiyun #define GET_UNIPERIF_CHANNEL_STA_REG1(ip) \
79*4882a593Smuzhiyun 	readl_relaxed(ip->base + UNIPERIF_CHANNEL_STA_REG1_OFFSET(ip))
80*4882a593Smuzhiyun #define SET_UNIPERIF_CHANNEL_STA_REG1(ip, value) \
81*4882a593Smuzhiyun 	writel_relaxed(value, ip->base + UNIPERIF_CHANNEL_STA_REG1_OFFSET(ip))
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun #define UNIPERIF_CHANNEL_STA_REG2_OFFSET(ip) 0x0068
84*4882a593Smuzhiyun #define GET_UNIPERIF_CHANNEL_STA_REG2(ip) \
85*4882a593Smuzhiyun 	readl_relaxed(ip->base + UNIPERIF_CHANNEL_STA_REG2_OFFSET(ip))
86*4882a593Smuzhiyun #define SET_UNIPERIF_CHANNEL_STA_REG2(ip, value) \
87*4882a593Smuzhiyun 	writel_relaxed(value, ip->base + UNIPERIF_CHANNEL_STA_REG2_OFFSET(ip))
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun #define UNIPERIF_CHANNEL_STA_REG3_OFFSET(ip) 0x006C
90*4882a593Smuzhiyun #define GET_UNIPERIF_CHANNEL_STA_REG3(ip) \
91*4882a593Smuzhiyun 	readl_relaxed(ip->base + UNIPERIF_CHANNEL_STA_REG3_OFFSET(ip))
92*4882a593Smuzhiyun #define SET_UNIPERIF_CHANNEL_STA_REG3(ip, value) \
93*4882a593Smuzhiyun 	writel_relaxed(value, ip->base + UNIPERIF_CHANNEL_STA_REG3_OFFSET(ip))
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun #define UNIPERIF_CHANNEL_STA_REG4_OFFSET(ip) 0x0070
96*4882a593Smuzhiyun #define GET_UNIPERIF_CHANNEL_STA_REG4(ip) \
97*4882a593Smuzhiyun 	readl_relaxed(ip->base + UNIPERIF_CHANNEL_STA_REG4_OFFSET(ip))
98*4882a593Smuzhiyun #define SET_UNIPERIF_CHANNEL_STA_REG4(ip, value) \
99*4882a593Smuzhiyun 	writel_relaxed(value, ip->base + UNIPERIF_CHANNEL_STA_REG4_OFFSET(ip))
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun #define UNIPERIF_CHANNEL_STA_REG5_OFFSET(ip) 0x0074
102*4882a593Smuzhiyun #define GET_UNIPERIF_CHANNEL_STA_REG5(ip) \
103*4882a593Smuzhiyun 	readl_relaxed(ip->base + UNIPERIF_CHANNEL_STA_REG5_OFFSET(ip))
104*4882a593Smuzhiyun #define SET_UNIPERIF_CHANNEL_STA_REG5(ip, value) \
105*4882a593Smuzhiyun 	writel_relaxed(value, ip->base + UNIPERIF_CHANNEL_STA_REG5_OFFSET(ip))
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun /*
108*4882a593Smuzhiyun  *  UNIPERIF_ITS reg
109*4882a593Smuzhiyun  */
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun #define UNIPERIF_ITS_OFFSET(ip) 0x000C
112*4882a593Smuzhiyun #define GET_UNIPERIF_ITS(ip) \
113*4882a593Smuzhiyun 	readl_relaxed(ip->base + UNIPERIF_ITS_OFFSET(ip))
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun /* MEM_BLK_READ */
116*4882a593Smuzhiyun #define UNIPERIF_ITS_MEM_BLK_READ_SHIFT(ip) 5
117*4882a593Smuzhiyun #define UNIPERIF_ITS_MEM_BLK_READ_MASK(ip) \
118*4882a593Smuzhiyun 	(BIT(UNIPERIF_ITS_MEM_BLK_READ_SHIFT(ip)))
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun /* FIFO_ERROR */
121*4882a593Smuzhiyun #define UNIPERIF_ITS_FIFO_ERROR_SHIFT(ip) \
122*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 0 : 8)
123*4882a593Smuzhiyun #define UNIPERIF_ITS_FIFO_ERROR_MASK(ip) \
124*4882a593Smuzhiyun 	(BIT(UNIPERIF_ITS_FIFO_ERROR_SHIFT(ip)))
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun /* DMA_ERROR */
127*4882a593Smuzhiyun #define UNIPERIF_ITS_DMA_ERROR_SHIFT(ip) 9
128*4882a593Smuzhiyun #define UNIPERIF_ITS_DMA_ERROR_MASK(ip) \
129*4882a593Smuzhiyun 	(BIT(UNIPERIF_ITS_DMA_ERROR_SHIFT(ip)))
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun /* UNDERFLOW_REC_DONE */
132*4882a593Smuzhiyun #define UNIPERIF_ITS_UNDERFLOW_REC_DONE_SHIFT(ip) \
133*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? -1 : 12)
134*4882a593Smuzhiyun #define UNIPERIF_ITS_UNDERFLOW_REC_DONE_MASK(ip) \
135*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? \
136*4882a593Smuzhiyun 		0 : (BIT(UNIPERIF_ITS_UNDERFLOW_REC_DONE_SHIFT(ip))))
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun /* UNDERFLOW_REC_FAILED */
139*4882a593Smuzhiyun #define UNIPERIF_ITS_UNDERFLOW_REC_FAILED_SHIFT(ip) \
140*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? -1 : 13)
141*4882a593Smuzhiyun #define UNIPERIF_ITS_UNDERFLOW_REC_FAILED_MASK(ip) \
142*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? \
143*4882a593Smuzhiyun 		0 : (BIT(UNIPERIF_ITS_UNDERFLOW_REC_FAILED_SHIFT(ip))))
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun /*
146*4882a593Smuzhiyun  *  UNIPERIF_ITS_BCLR reg
147*4882a593Smuzhiyun  */
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun /* FIFO_ERROR */
150*4882a593Smuzhiyun #define UNIPERIF_ITS_BCLR_FIFO_ERROR_SHIFT(ip) \
151*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 0 : 8)
152*4882a593Smuzhiyun #define UNIPERIF_ITS_BCLR_FIFO_ERROR_MASK(ip) \
153*4882a593Smuzhiyun 	(BIT(UNIPERIF_ITS_BCLR_FIFO_ERROR_SHIFT(ip)))
154*4882a593Smuzhiyun #define SET_UNIPERIF_ITS_BCLR_FIFO_ERROR(ip) \
155*4882a593Smuzhiyun 	SET_UNIPERIF_ITS_BCLR(ip, \
156*4882a593Smuzhiyun 		UNIPERIF_ITS_BCLR_FIFO_ERROR_MASK(ip))
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun #define UNIPERIF_ITS_BCLR_OFFSET(ip) 0x0010
159*4882a593Smuzhiyun #define SET_UNIPERIF_ITS_BCLR(ip, value) \
160*4882a593Smuzhiyun 	writel_relaxed(value, ip->base + UNIPERIF_ITS_BCLR_OFFSET(ip))
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun /*
163*4882a593Smuzhiyun  *  UNIPERIF_ITM reg
164*4882a593Smuzhiyun  */
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun #define UNIPERIF_ITM_OFFSET(ip) 0x0018
167*4882a593Smuzhiyun #define GET_UNIPERIF_ITM(ip) \
168*4882a593Smuzhiyun 	readl_relaxed(ip->base + UNIPERIF_ITM_OFFSET(ip))
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun /* FIFO_ERROR */
171*4882a593Smuzhiyun #define UNIPERIF_ITM_FIFO_ERROR_SHIFT(ip) \
172*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 0 : 8)
173*4882a593Smuzhiyun #define UNIPERIF_ITM_FIFO_ERROR_MASK(ip) \
174*4882a593Smuzhiyun 	(BIT(UNIPERIF_ITM_FIFO_ERROR_SHIFT(ip)))
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun /* UNDERFLOW_REC_DONE */
177*4882a593Smuzhiyun #define UNIPERIF_ITM_UNDERFLOW_REC_DONE_SHIFT(ip) \
178*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? -1 : 12)
179*4882a593Smuzhiyun #define UNIPERIF_ITM_UNDERFLOW_REC_DONE_MASK(ip) \
180*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? \
181*4882a593Smuzhiyun 		0 : (BIT(UNIPERIF_ITM_UNDERFLOW_REC_DONE_SHIFT(ip))))
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun /* UNDERFLOW_REC_FAILED */
184*4882a593Smuzhiyun #define UNIPERIF_ITM_UNDERFLOW_REC_FAILED_SHIFT(ip) \
185*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? -1 : 13)
186*4882a593Smuzhiyun #define UNIPERIF_ITM_UNDERFLOW_REC_FAILED_MASK(ip) \
187*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? \
188*4882a593Smuzhiyun 		0 : (BIT(UNIPERIF_ITM_UNDERFLOW_REC_FAILED_SHIFT(ip))))
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun /*
191*4882a593Smuzhiyun  *  UNIPERIF_ITM_BCLR reg
192*4882a593Smuzhiyun  */
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun #define UNIPERIF_ITM_BCLR_OFFSET(ip) 0x001c
195*4882a593Smuzhiyun #define SET_UNIPERIF_ITM_BCLR(ip, value) \
196*4882a593Smuzhiyun 	writel_relaxed(value, ip->base + UNIPERIF_ITM_BCLR_OFFSET(ip))
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun /* FIFO_ERROR */
199*4882a593Smuzhiyun #define UNIPERIF_ITM_BCLR_FIFO_ERROR_SHIFT(ip) \
200*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 0 : 8)
201*4882a593Smuzhiyun #define UNIPERIF_ITM_BCLR_FIFO_ERROR_MASK(ip) \
202*4882a593Smuzhiyun 	(BIT(UNIPERIF_ITM_BCLR_FIFO_ERROR_SHIFT(ip)))
203*4882a593Smuzhiyun #define SET_UNIPERIF_ITM_BCLR_FIFO_ERROR(ip) \
204*4882a593Smuzhiyun 	SET_UNIPERIF_ITM_BCLR(ip, \
205*4882a593Smuzhiyun 		UNIPERIF_ITM_BCLR_FIFO_ERROR_MASK(ip))
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun /* DMA_ERROR */
208*4882a593Smuzhiyun #define UNIPERIF_ITM_BCLR_DMA_ERROR_SHIFT(ip) 9
209*4882a593Smuzhiyun #define UNIPERIF_ITM_BCLR_DMA_ERROR_MASK(ip) \
210*4882a593Smuzhiyun 	(BIT(UNIPERIF_ITM_BCLR_DMA_ERROR_SHIFT(ip)))
211*4882a593Smuzhiyun #define SET_UNIPERIF_ITM_BCLR_DMA_ERROR(ip) \
212*4882a593Smuzhiyun 	SET_UNIPERIF_ITM_BCLR(ip, \
213*4882a593Smuzhiyun 		UNIPERIF_ITM_BCLR_DMA_ERROR_MASK(ip))
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun /*
216*4882a593Smuzhiyun  *  UNIPERIF_ITM_BSET reg
217*4882a593Smuzhiyun  */
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun #define UNIPERIF_ITM_BSET_OFFSET(ip) 0x0020
220*4882a593Smuzhiyun #define SET_UNIPERIF_ITM_BSET(ip, value) \
221*4882a593Smuzhiyun 	writel_relaxed(value, ip->base + UNIPERIF_ITM_BSET_OFFSET(ip))
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun /* FIFO_ERROR */
224*4882a593Smuzhiyun #define UNIPERIF_ITM_BSET_FIFO_ERROR_SHIFT(ip) \
225*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 0 : 8)
226*4882a593Smuzhiyun #define UNIPERIF_ITM_BSET_FIFO_ERROR_MASK(ip) \
227*4882a593Smuzhiyun 	(BIT(UNIPERIF_ITM_BSET_FIFO_ERROR_SHIFT(ip)))
228*4882a593Smuzhiyun #define SET_UNIPERIF_ITM_BSET_FIFO_ERROR(ip) \
229*4882a593Smuzhiyun 	SET_UNIPERIF_ITM_BSET(ip, \
230*4882a593Smuzhiyun 		UNIPERIF_ITM_BSET_FIFO_ERROR_MASK(ip))
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun /* MEM_BLK_READ */
233*4882a593Smuzhiyun #define UNIPERIF_ITM_BSET_MEM_BLK_READ_SHIFT(ip) 5
234*4882a593Smuzhiyun #define UNIPERIF_ITM_BSET_MEM_BLK_READ_MASK(ip) \
235*4882a593Smuzhiyun 	(BIT(UNIPERIF_ITM_BSET_MEM_BLK_READ_SHIFT(ip)))
236*4882a593Smuzhiyun #define SET_UNIPERIF_ITM_BSET_MEM_BLK_READ(ip) \
237*4882a593Smuzhiyun 	SET_UNIPERIF_ITM_BSET(ip, \
238*4882a593Smuzhiyun 		UNIPERIF_ITM_BSET_MEM_BLK_READ_MASK(ip))
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun /* DMA_ERROR */
241*4882a593Smuzhiyun #define UNIPERIF_ITM_BSET_DMA_ERROR_SHIFT(ip) 9
242*4882a593Smuzhiyun #define UNIPERIF_ITM_BSET_DMA_ERROR_MASK(ip) \
243*4882a593Smuzhiyun 	(BIT(UNIPERIF_ITM_BSET_DMA_ERROR_SHIFT(ip)))
244*4882a593Smuzhiyun #define SET_UNIPERIF_ITM_BSET_DMA_ERROR(ip) \
245*4882a593Smuzhiyun 	SET_UNIPERIF_ITM_BSET(ip, \
246*4882a593Smuzhiyun 		UNIPERIF_ITM_BSET_DMA_ERROR_MASK(ip))
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun /* UNDERFLOW_REC_DONE */
249*4882a593Smuzhiyun #define UNIPERIF_ITM_BSET_UNDERFLOW_REC_DONE_SHIFT(ip) \
250*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? -1 : 12)
251*4882a593Smuzhiyun #define UNIPERIF_ITM_BSET_UNDERFLOW_REC_DONE_MASK(ip) \
252*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? \
253*4882a593Smuzhiyun 		0 : (BIT(UNIPERIF_ITM_BSET_UNDERFLOW_REC_DONE_SHIFT(ip))))
254*4882a593Smuzhiyun #define SET_UNIPERIF_ITM_BSET_UNDERFLOW_REC_DONE(ip) \
255*4882a593Smuzhiyun 	SET_UNIPERIF_ITM_BSET(ip, \
256*4882a593Smuzhiyun 		UNIPERIF_ITM_BSET_UNDERFLOW_REC_DONE_MASK(ip))
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun /* UNDERFLOW_REC_FAILED */
259*4882a593Smuzhiyun #define UNIPERIF_ITM_BSET_UNDERFLOW_REC_FAILED_SHIFT(ip) \
260*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? -1 : 13)
261*4882a593Smuzhiyun #define UNIPERIF_ITM_BSET_UNDERFLOW_REC_FAILED_MASK(ip) \
262*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? \
263*4882a593Smuzhiyun 		0 : (BIT(UNIPERIF_ITM_BSET_UNDERFLOW_REC_FAILED_SHIFT(ip))))
264*4882a593Smuzhiyun #define SET_UNIPERIF_ITM_BSET_UNDERFLOW_REC_FAILED(ip) \
265*4882a593Smuzhiyun 	SET_UNIPERIF_ITM_BSET(ip, \
266*4882a593Smuzhiyun 		UNIPERIF_ITM_BSET_UNDERFLOW_REC_FAILED_MASK(ip))
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun /*
269*4882a593Smuzhiyun  * UNIPERIF_CONFIG reg
270*4882a593Smuzhiyun  */
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun #define UNIPERIF_CONFIG_OFFSET(ip) 0x0040
273*4882a593Smuzhiyun #define GET_UNIPERIF_CONFIG(ip) \
274*4882a593Smuzhiyun 	readl_relaxed(ip->base + UNIPERIF_CONFIG_OFFSET(ip))
275*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG(ip, value) \
276*4882a593Smuzhiyun 	writel_relaxed(value, ip->base + UNIPERIF_CONFIG_OFFSET(ip))
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun /* PARITY_CNTR */
279*4882a593Smuzhiyun #define UNIPERIF_CONFIG_PARITY_CNTR_SHIFT(ip) 0
280*4882a593Smuzhiyun #define UNIPERIF_CONFIG_PARITY_CNTR_MASK(ip) 0x1
281*4882a593Smuzhiyun #define GET_UNIPERIF_CONFIG_PARITY_CNTR(ip) \
282*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
283*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
284*4882a593Smuzhiyun 		UNIPERIF_CONFIG_PARITY_CNTR_SHIFT(ip), \
285*4882a593Smuzhiyun 		UNIPERIF_CONFIG_PARITY_CNTR_MASK(ip))
286*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_PARITY_CNTR_BY_HW(ip) \
287*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
288*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
289*4882a593Smuzhiyun 		UNIPERIF_CONFIG_PARITY_CNTR_SHIFT(ip), \
290*4882a593Smuzhiyun 		UNIPERIF_CONFIG_PARITY_CNTR_MASK(ip), 0)
291*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_PARITY_CNTR_BY_SW(ip) \
292*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
293*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
294*4882a593Smuzhiyun 		UNIPERIF_CONFIG_PARITY_CNTR_SHIFT(ip), \
295*4882a593Smuzhiyun 		UNIPERIF_CONFIG_PARITY_CNTR_MASK(ip), 1)
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun /* CHANNEL_STA_CNTR */
298*4882a593Smuzhiyun #define UNIPERIF_CONFIG_CHANNEL_STA_CNTR_SHIFT(ip) 1
299*4882a593Smuzhiyun #define UNIPERIF_CONFIG_CHANNEL_STA_CNTR_MASK(ip) 0x1
300*4882a593Smuzhiyun #define GET_UNIPERIF_CONFIG_CHANNEL_STA_CNTR(ip) \
301*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
302*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
303*4882a593Smuzhiyun 		UNIPERIF_CONFIG_CHANNEL_STA_CNTR_SHIFT(ip), \
304*4882a593Smuzhiyun 		UNIPERIF_CONFIG_CHANNEL_STA_CNTR_MASK(ip))
305*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_CHANNEL_STA_CNTR_BY_SW(ip) \
306*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
307*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
308*4882a593Smuzhiyun 		UNIPERIF_CONFIG_CHANNEL_STA_CNTR_SHIFT(ip), \
309*4882a593Smuzhiyun 		UNIPERIF_CONFIG_CHANNEL_STA_CNTR_MASK(ip), 0)
310*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_CHANNEL_STA_CNTR_BY_HW(ip) \
311*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
312*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip),    \
313*4882a593Smuzhiyun 		UNIPERIF_CONFIG_CHANNEL_STA_CNTR_SHIFT(ip), \
314*4882a593Smuzhiyun 		UNIPERIF_CONFIG_CHANNEL_STA_CNTR_MASK(ip), 1)
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun /* USER_DAT_CNTR */
317*4882a593Smuzhiyun #define UNIPERIF_CONFIG_USER_DAT_CNTR_SHIFT(ip) 2
318*4882a593Smuzhiyun #define UNIPERIF_CONFIG_USER_DAT_CNTR_MASK(ip) 0x1
319*4882a593Smuzhiyun #define GET_UNIPERIF_CONFIG_USER_DAT_CNTR(ip) \
320*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
321*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
322*4882a593Smuzhiyun 		UNIPERIF_CONFIG_USER_DAT_CNTR_SHIFT(ip), \
323*4882a593Smuzhiyun 		UNIPERIF_CONFIG_USER_DAT_CNTR_MASK(ip))
324*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_USER_DAT_CNTR_BY_HW(ip) \
325*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
326*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
327*4882a593Smuzhiyun 		UNIPERIF_CONFIG_USER_DAT_CNTR_SHIFT(ip), \
328*4882a593Smuzhiyun 		UNIPERIF_CONFIG_USER_DAT_CNTR_MASK(ip), 1)
329*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_USER_DAT_CNTR_BY_SW(ip) \
330*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
331*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
332*4882a593Smuzhiyun 		UNIPERIF_CONFIG_USER_DAT_CNTR_SHIFT(ip), \
333*4882a593Smuzhiyun 		UNIPERIF_CONFIG_USER_DAT_CNTR_MASK(ip), 0)
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun /* VALIDITY_DAT_CNTR */
336*4882a593Smuzhiyun #define UNIPERIF_CONFIG_VALIDITY_DAT_CNTR_SHIFT(ip) 3
337*4882a593Smuzhiyun #define UNIPERIF_CONFIG_VALIDITY_DAT_CNTR_MASK(ip) 0x1
338*4882a593Smuzhiyun #define GET_UNIPERIF_CONFIG_VALIDITY_DAT_CNTR(ip) \
339*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
340*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
341*4882a593Smuzhiyun 		UNIPERIF_CONFIG_VALIDITY_DAT_CNTR_SHIFT(ip), \
342*4882a593Smuzhiyun 		UNIPERIF_CONFIG_VALIDITY_DAT_CNTR_MASK(ip))
343*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_VALIDITY_DAT_CNTR_BY_SW(ip) \
344*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
345*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
346*4882a593Smuzhiyun 		UNIPERIF_CONFIG_VALIDITY_DAT_CNTR_SHIFT(ip), \
347*4882a593Smuzhiyun 		UNIPERIF_CONFIG_VALIDITY_DAT_CNTR_MASK(ip), 0)
348*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_VALIDITY_DAT_CNTR_BY_HW(ip) \
349*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
350*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
351*4882a593Smuzhiyun 		UNIPERIF_CONFIG_VALIDITY_DAT_CNTR_SHIFT(ip), \
352*4882a593Smuzhiyun 		UNIPERIF_CONFIG_VALIDITY_DAT_CNTR_MASK(ip), 1)
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun /* ONE_BIT_AUD_SUPPORT */
355*4882a593Smuzhiyun #define UNIPERIF_CONFIG_ONE_BIT_AUD_SHIFT(ip) 4
356*4882a593Smuzhiyun #define UNIPERIF_CONFIG_ONE_BIT_AUD_MASK(ip) 0x1
357*4882a593Smuzhiyun #define GET_UNIPERIF_CONFIG_ONE_BIT_AUD(ip) \
358*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
359*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
360*4882a593Smuzhiyun 		UNIPERIF_CONFIG_ONE_BIT_AUD_SHIFT(ip), \
361*4882a593Smuzhiyun 		UNIPERIF_CONFIG_ONE_BIT_AUD_MASK(ip))
362*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_ONE_BIT_AUD_DISABLE(ip) \
363*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
364*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
365*4882a593Smuzhiyun 		UNIPERIF_CONFIG_ONE_BIT_AUD_SHIFT(ip), \
366*4882a593Smuzhiyun 		UNIPERIF_CONFIG_ONE_BIT_AUD_MASK(ip), 0)
367*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_ONE_BIT_AUD_ENABLE(ip) \
368*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
369*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
370*4882a593Smuzhiyun 		UNIPERIF_CONFIG_ONE_BIT_AUD_SHIFT(ip), \
371*4882a593Smuzhiyun 		UNIPERIF_CONFIG_ONE_BIT_AUD_MASK(ip), 1)
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun /* MEMORY_FMT */
374*4882a593Smuzhiyun #define UNIPERIF_CONFIG_MEM_FMT_SHIFT(ip) 5
375*4882a593Smuzhiyun #define UNIPERIF_CONFIG_MEM_FMT_MASK(ip) 0x1
376*4882a593Smuzhiyun #define VALUE_UNIPERIF_CONFIG_MEM_FMT_16_0(ip) 0
377*4882a593Smuzhiyun #define VALUE_UNIPERIF_CONFIG_MEM_FMT_16_16(ip) 1
378*4882a593Smuzhiyun #define GET_UNIPERIF_CONFIG_MEM_FMT(ip) \
379*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
380*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
381*4882a593Smuzhiyun 		UNIPERIF_CONFIG_MEM_FMT_SHIFT(ip), \
382*4882a593Smuzhiyun 		UNIPERIF_CONFIG_MEM_FMT_MASK(ip))
383*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_MEM_FMT(ip, value)	\
384*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
385*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
386*4882a593Smuzhiyun 		UNIPERIF_CONFIG_MEM_FMT_SHIFT(ip), \
387*4882a593Smuzhiyun 		UNIPERIF_CONFIG_MEM_FMT_MASK(ip), value)
388*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_MEM_FMT_16_0(ip)   \
389*4882a593Smuzhiyun 	SET_UNIPERIF_CONFIG_MEM_FMT(ip, \
390*4882a593Smuzhiyun 		VALUE_UNIPERIF_CONFIG_MEM_FMT_16_0(ip))
391*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_MEM_FMT_16_16(ip) \
392*4882a593Smuzhiyun 	SET_UNIPERIF_CONFIG_MEM_FMT(ip, \
393*4882a593Smuzhiyun 		VALUE_UNIPERIF_CONFIG_MEM_FMT_16_16(ip))
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun /* REPEAT_CHL_STS */
396*4882a593Smuzhiyun #define UNIPERIF_CONFIG_REPEAT_CHL_STS_SHIFT(ip) 6
397*4882a593Smuzhiyun #define UNIPERIF_CONFIG_REPEAT_CHL_STS_MASK(ip) 0x1
398*4882a593Smuzhiyun #define GET_UNIPERIF_CONFIG_REPEAT_CHL_STS(ip) \
399*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
400*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
401*4882a593Smuzhiyun 		UNIPERIF_CONFIG_REPEAT_CHL_STS_SHIFT(ip), \
402*4882a593Smuzhiyun 		UNIPERIF_CONFIG_REPEAT_CHL_STS_MASK(ip))
403*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_REPEAT_CHL_STS_ENABLE(ip) \
404*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
405*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
406*4882a593Smuzhiyun 		UNIPERIF_CONFIG_REPEAT_CHL_STS_SHIFT(ip), \
407*4882a593Smuzhiyun 		UNIPERIF_CONFIG_REPEAT_CHL_STS_MASK(ip), 0)
408*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_REPEAT_CHL_STS_DISABLE(ip) \
409*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
410*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
411*4882a593Smuzhiyun 		UNIPERIF_CONFIG_REPEAT_CHL_STS_SHIFT(ip), \
412*4882a593Smuzhiyun 		UNIPERIF_CONFIG_REPEAT_CHL_STS_MASK(ip), 1)
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun /* BACK_STALL_REQ */
415*4882a593Smuzhiyun #define UNIPERIF_CONFIG_BACK_STALL_REQ_SHIFT(ip) \
416*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 7 : -1)
417*4882a593Smuzhiyun #define UNIPERIF_CONFIG_BACK_STALL_REQ_MASK(ip) 0x1
418*4882a593Smuzhiyun #define GET_UNIPERIF_CONFIG_BACK_STALL_REQ(ip) \
419*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
420*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
421*4882a593Smuzhiyun 		UNIPERIF_CONFIG_BACK_STALL_REQ_SHIFT(ip), \
422*4882a593Smuzhiyun 		UNIPERIF_CONFIG_BACK_STALL_REQ_MASK(ip))
423*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_BACK_STALL_REQ_DISABLE(ip) \
424*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
425*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
426*4882a593Smuzhiyun 		UNIPERIF_CONFIG_BACK_STALL_REQ_SHIFT(ip), \
427*4882a593Smuzhiyun 		UNIPERIF_CONFIG_BACK_STALL_REQ_MASK(ip), 0)
428*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_BACK_STALL_REQ_ENABLE(ip) \
429*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
430*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
431*4882a593Smuzhiyun 		UNIPERIF_CONFIG_BACK_STALL_REQ_SHIFT(ip), \
432*4882a593Smuzhiyun 		UNIPERIF_CONFIG_BACK_STALL_REQ_MASK(ip), 1)
433*4882a593Smuzhiyun 
434*4882a593Smuzhiyun /* FDMA_TRIGGER_LIMIT */
435*4882a593Smuzhiyun #define UNIPERIF_CONFIG_DMA_TRIG_LIMIT_SHIFT(ip) 8
436*4882a593Smuzhiyun #define UNIPERIF_CONFIG_DMA_TRIG_LIMIT_MASK(ip) 0x7F
437*4882a593Smuzhiyun #define GET_UNIPERIF_CONFIG_DMA_TRIG_LIMIT(ip) \
438*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
439*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
440*4882a593Smuzhiyun 		UNIPERIF_CONFIG_DMA_TRIG_LIMIT_SHIFT(ip), \
441*4882a593Smuzhiyun 		UNIPERIF_CONFIG_DMA_TRIG_LIMIT_MASK(ip))
442*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_DMA_TRIG_LIMIT(ip, value) \
443*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
444*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
445*4882a593Smuzhiyun 		UNIPERIF_CONFIG_DMA_TRIG_LIMIT_SHIFT(ip), \
446*4882a593Smuzhiyun 		UNIPERIF_CONFIG_DMA_TRIG_LIMIT_MASK(ip), value)
447*4882a593Smuzhiyun 
448*4882a593Smuzhiyun /* CHL_STS_UPDATE */
449*4882a593Smuzhiyun #define UNIPERIF_CONFIG_CHL_STS_UPDATE_SHIFT(ip) \
450*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 16 : -1)
451*4882a593Smuzhiyun #define UNIPERIF_CONFIG_CHL_STS_UPDATE_MASK(ip) 0x1
452*4882a593Smuzhiyun #define GET_UNIPERIF_CONFIG_CHL_STS_UPDATE(ip) \
453*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
454*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip),  \
455*4882a593Smuzhiyun 		UNIPERIF_CONFIG_CHL_STS_UPDATE_SHIFT(ip), \
456*4882a593Smuzhiyun 		UNIPERIF_CONFIG_CHL_STS_UPDATE_MASK(ip))
457*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_CHL_STS_UPDATE(ip) \
458*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
459*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
460*4882a593Smuzhiyun 		UNIPERIF_CONFIG_CHL_STS_UPDATE_SHIFT(ip), \
461*4882a593Smuzhiyun 		UNIPERIF_CONFIG_CHL_STS_UPDATE_MASK(ip), 1)
462*4882a593Smuzhiyun 
463*4882a593Smuzhiyun /* IDLE_MOD */
464*4882a593Smuzhiyun #define UNIPERIF_CONFIG_IDLE_MOD_SHIFT(ip) 18
465*4882a593Smuzhiyun #define UNIPERIF_CONFIG_IDLE_MOD_MASK(ip) 0x1
466*4882a593Smuzhiyun #define GET_UNIPERIF_CONFIG_IDLE_MOD(ip) \
467*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
468*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
469*4882a593Smuzhiyun 		UNIPERIF_CONFIG_IDLE_MOD_SHIFT(ip), \
470*4882a593Smuzhiyun 		UNIPERIF_CONFIG_IDLE_MOD_MASK(ip))
471*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_IDLE_MOD_DISABLE(ip) \
472*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
473*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
474*4882a593Smuzhiyun 		UNIPERIF_CONFIG_IDLE_MOD_SHIFT(ip), \
475*4882a593Smuzhiyun 		UNIPERIF_CONFIG_IDLE_MOD_MASK(ip), 0)
476*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_IDLE_MOD_ENABLE(ip) \
477*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
478*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
479*4882a593Smuzhiyun 		UNIPERIF_CONFIG_IDLE_MOD_SHIFT(ip), \
480*4882a593Smuzhiyun 		UNIPERIF_CONFIG_IDLE_MOD_MASK(ip), 1)
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun /* SUBFRAME_SELECTION */
483*4882a593Smuzhiyun #define UNIPERIF_CONFIG_SUBFRAME_SEL_SHIFT(ip) 19
484*4882a593Smuzhiyun #define UNIPERIF_CONFIG_SUBFRAME_SEL_MASK(ip) 0x1
485*4882a593Smuzhiyun #define GET_UNIPERIF_CONFIG_SUBFRAME_SEL(ip) \
486*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
487*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
488*4882a593Smuzhiyun 		UNIPERIF_CONFIG_SUBFRAME_SEL_SHIFT(ip), \
489*4882a593Smuzhiyun 		UNIPERIF_CONFIG_SUBFRAME_SEL_MASK(ip))
490*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_SUBFRAME_SEL_SUBF1_SUBF0(ip) \
491*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
492*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
493*4882a593Smuzhiyun 		UNIPERIF_CONFIG_SUBFRAME_SEL_SHIFT(ip), \
494*4882a593Smuzhiyun 		UNIPERIF_CONFIG_SUBFRAME_SEL_MASK(ip), 1)
495*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_SUBFRAME_SEL_SUBF0_SUBF1(ip) \
496*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
497*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
498*4882a593Smuzhiyun 		UNIPERIF_CONFIG_SUBFRAME_SEL_SHIFT(ip), \
499*4882a593Smuzhiyun 		UNIPERIF_CONFIG_SUBFRAME_SEL_MASK(ip), 0)
500*4882a593Smuzhiyun 
501*4882a593Smuzhiyun /* FULL_SW_CONTROL */
502*4882a593Smuzhiyun #define UNIPERIF_CONFIG_SPDIF_SW_CTRL_SHIFT(ip) 20
503*4882a593Smuzhiyun #define UNIPERIF_CONFIG_SPDIF_SW_CTRL_MASK(ip) 0x1
504*4882a593Smuzhiyun #define GET_UNIPERIF_CONFIG_SPDIF_SW_CTRL(ip) \
505*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
506*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
507*4882a593Smuzhiyun 		UNIPERIF_CONFIG_SPDIF_SW_CTRL_SHIFT(ip), \
508*4882a593Smuzhiyun 		UNIPERIF_CONFIG_SPDIF_SW_CTRL_MASK(ip))
509*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_SPDIF_SW_CTRL_ENABLE(ip) \
510*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
511*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
512*4882a593Smuzhiyun 		UNIPERIF_CONFIG_SPDIF_SW_CTRL_SHIFT(ip), \
513*4882a593Smuzhiyun 		UNIPERIF_CONFIG_SPDIF_SW_CTRL_MASK(ip), 1)
514*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_SPDIF_SW_CTRL_DISABLE(ip) \
515*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
516*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
517*4882a593Smuzhiyun 		UNIPERIF_CONFIG_SPDIF_SW_CTRL_SHIFT(ip), \
518*4882a593Smuzhiyun 		UNIPERIF_CONFIG_SPDIF_SW_CTRL_MASK(ip), 0)
519*4882a593Smuzhiyun 
520*4882a593Smuzhiyun /* MASTER_CLKEDGE */
521*4882a593Smuzhiyun #define UNIPERIF_CONFIG_MSTR_CLKEDGE_SHIFT(ip) \
522*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 24 : -1)
523*4882a593Smuzhiyun #define UNIPERIF_CONFIG_MSTR_CLKEDGE_MASK(ip) 0x1
524*4882a593Smuzhiyun #define GET_UNIPERIF_CONFIG_MSTR_CLKEDGE(ip) \
525*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
526*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
527*4882a593Smuzhiyun 		UNIPERIF_CONFIG_MSTR_CLKEDGE_SHIFT(ip), \
528*4882a593Smuzhiyun 		UNIPERIF_CONFIG_MSTR_CLKEDGE_MASK(ip))
529*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_MSTR_CLKEDGE_FALLING(ip) \
530*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
531*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
532*4882a593Smuzhiyun 		UNIPERIF_CONFIG_MSTR_CLKEDGE_SHIFT(ip), \
533*4882a593Smuzhiyun 		UNIPERIF_CONFIG_MSTR_CLKEDGE_MASK(ip), 1)
534*4882a593Smuzhiyun #define SET_UNIPERIF_CONFIG_MSTR_CLKEDGE_RISING(ip) \
535*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
536*4882a593Smuzhiyun 		UNIPERIF_CONFIG_OFFSET(ip), \
537*4882a593Smuzhiyun 		UNIPERIF_CONFIG_MSTR_CLKEDGE_SHIFT(ip), \
538*4882a593Smuzhiyun 		UNIPERIF_CONFIG_MSTR_CLKEDGE_MASK(ip), 0)
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun /*
541*4882a593Smuzhiyun  * UNIPERIF_CTRL reg
542*4882a593Smuzhiyun  */
543*4882a593Smuzhiyun 
544*4882a593Smuzhiyun #define UNIPERIF_CTRL_OFFSET(ip) 0x0044
545*4882a593Smuzhiyun #define GET_UNIPERIF_CTRL(ip) \
546*4882a593Smuzhiyun 	readl_relaxed(ip->base + UNIPERIF_CTRL_OFFSET(ip))
547*4882a593Smuzhiyun #define SET_UNIPERIF_CTRL(ip, value) \
548*4882a593Smuzhiyun 	writel_relaxed(value, ip->base + UNIPERIF_CTRL_OFFSET(ip))
549*4882a593Smuzhiyun 
550*4882a593Smuzhiyun /* OPERATION */
551*4882a593Smuzhiyun #define UNIPERIF_CTRL_OPERATION_SHIFT(ip) 0
552*4882a593Smuzhiyun #define UNIPERIF_CTRL_OPERATION_MASK(ip) 0x7
553*4882a593Smuzhiyun #define GET_UNIPERIF_CTRL_OPERATION(ip) \
554*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
555*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
556*4882a593Smuzhiyun 		UNIPERIF_CTRL_OPERATION_SHIFT(ip), \
557*4882a593Smuzhiyun 		UNIPERIF_CTRL_OPERATION_MASK(ip))
558*4882a593Smuzhiyun #define VALUE_UNIPERIF_CTRL_OPERATION_OFF(ip) 0
559*4882a593Smuzhiyun #define SET_UNIPERIF_CTRL_OPERATION_OFF(ip) \
560*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
561*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
562*4882a593Smuzhiyun 		UNIPERIF_CTRL_OPERATION_SHIFT(ip), \
563*4882a593Smuzhiyun 		UNIPERIF_CTRL_OPERATION_MASK(ip), \
564*4882a593Smuzhiyun 		VALUE_UNIPERIF_CTRL_OPERATION_OFF(ip))
565*4882a593Smuzhiyun #define VALUE_UNIPERIF_CTRL_OPERATION_MUTE_PCM_NULL(ip) \
566*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 1 : -1)
567*4882a593Smuzhiyun #define SET_UNIPERIF_CTRL_OPERATION_MUTE_PCM_NULL(ip) \
568*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
569*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
570*4882a593Smuzhiyun 		UNIPERIF_CTRL_OPERATION_SHIFT(ip), \
571*4882a593Smuzhiyun 		UNIPERIF_CTRL_OPERATION_MASK(ip), \
572*4882a593Smuzhiyun 		VALUE_UNIPERIF_CTRL_OPERATION_MUTE_PCM_NULL(ip))
573*4882a593Smuzhiyun #define VALUE_UNIPERIF_CTRL_OPERATION_MUTE_PAUSE_BURST(ip) \
574*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 2 : -1)
575*4882a593Smuzhiyun #define SET_UNIPERIF_CTRL_OPERATION_MUTE_PAUSE_BURST(ip) \
576*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
577*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
578*4882a593Smuzhiyun 		UNIPERIF_CTRL_OPERATION_SHIFT(ip), \
579*4882a593Smuzhiyun 		UNIPERIF_CTRL_OPERATION_MASK(ip), \
580*4882a593Smuzhiyun 		VALUE_UNIPERIF_CTRL_OPERATION_MUTE_PAUSE_BURST(ip))
581*4882a593Smuzhiyun #define VALUE_UNIPERIF_CTRL_OPERATION_PCM_DATA(ip) 3
582*4882a593Smuzhiyun #define SET_UNIPERIF_CTRL_OPERATION_PCM_DATA(ip) \
583*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
584*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
585*4882a593Smuzhiyun 		UNIPERIF_CTRL_OPERATION_SHIFT(ip), \
586*4882a593Smuzhiyun 		UNIPERIF_CTRL_OPERATION_MASK(ip), \
587*4882a593Smuzhiyun 		VALUE_UNIPERIF_CTRL_OPERATION_PCM_DATA(ip))
588*4882a593Smuzhiyun /* This is the same as above! */
589*4882a593Smuzhiyun #define VALUE_UNIPERIF_CTRL_OPERATION_AUDIO_DATA(ip) 3
590*4882a593Smuzhiyun #define SET_UNIPERIF_CTRL_OPERATION_AUDIO_DATA(ip) \
591*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
592*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
593*4882a593Smuzhiyun 		UNIPERIF_CTRL_OPERATION_SHIFT(ip), \
594*4882a593Smuzhiyun 		UNIPERIF_CTRL_OPERATION_MASK(ip), \
595*4882a593Smuzhiyun 		VALUE_UNIPERIF_CTRL_OPERATION_AUDIO_DATA(ip))
596*4882a593Smuzhiyun #define VALUE_UNIPERIF_CTRL_OPERATION_ENC_DATA(ip) 4
597*4882a593Smuzhiyun #define SET_UNIPERIF_CTRL_OPERATION_ENC_DATA(ip) \
598*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
599*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
600*4882a593Smuzhiyun 		UNIPERIF_CTRL_OPERATION_SHIFT(ip), \
601*4882a593Smuzhiyun 		UNIPERIF_CTRL_OPERATION_MASK(ip), \
602*4882a593Smuzhiyun 		VALUE_UNIPERIF_CTRL_OPERATION_ENC_DATA(ip))
603*4882a593Smuzhiyun #define VALUE_UNIPERIF_CTRL_OPERATION_CD_DATA(ip) \
604*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 5 : -1)
605*4882a593Smuzhiyun #define SET_UNIPERIF_CTRL_OPERATION_CD_DATA(ip) \
606*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
607*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
608*4882a593Smuzhiyun 		UNIPERIF_CTRL_OPERATION_SHIFT(ip), \
609*4882a593Smuzhiyun 		UNIPERIF_CTRL_OPERATION_MASK(ip), \
610*4882a593Smuzhiyun 		VALUE_UNIPERIF_CTRL_OPERATION_CD_DATA(ip))
611*4882a593Smuzhiyun #define VALUE_UNIPERIF_CTRL_OPERATION_STANDBY(ip) \
612*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? -1 : 7)
613*4882a593Smuzhiyun #define SET_UNIPERIF_CTRL_OPERATION_STANDBY(ip) \
614*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
615*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
616*4882a593Smuzhiyun 		UNIPERIF_CTRL_OPERATION_SHIFT(ip), \
617*4882a593Smuzhiyun 		UNIPERIF_CTRL_OPERATION_MASK(ip), \
618*4882a593Smuzhiyun 		VALUE_UNIPERIF_CTRL_OPERATION_STANDBY(ip))
619*4882a593Smuzhiyun 
620*4882a593Smuzhiyun /* EXIT_STBY_ON_EOBLOCK */
621*4882a593Smuzhiyun #define UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_SHIFT(ip) \
622*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? -1 : 3)
623*4882a593Smuzhiyun #define UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_MASK(ip) 0x1
624*4882a593Smuzhiyun #define GET_UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK(ip) \
625*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
626*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
627*4882a593Smuzhiyun 		UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_SHIFT(ip), \
628*4882a593Smuzhiyun 		UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_MASK(ip))
629*4882a593Smuzhiyun #define SET_UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_OFF(ip) \
630*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
631*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
632*4882a593Smuzhiyun 		UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_SHIFT(ip), \
633*4882a593Smuzhiyun 		UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_MASK(ip), 0)
634*4882a593Smuzhiyun #define SET_UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_ON(ip) \
635*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
636*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
637*4882a593Smuzhiyun 		UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_SHIFT(ip), \
638*4882a593Smuzhiyun 		UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_MASK(ip), 1)
639*4882a593Smuzhiyun 
640*4882a593Smuzhiyun /* ROUNDING */
641*4882a593Smuzhiyun #define UNIPERIF_CTRL_ROUNDING_SHIFT(ip) 4
642*4882a593Smuzhiyun #define UNIPERIF_CTRL_ROUNDING_MASK(ip) 0x1
643*4882a593Smuzhiyun #define GET_UNIPERIF_CTRL_ROUNDING(ip) \
644*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
645*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
646*4882a593Smuzhiyun 		UNIPERIF_CTRL_ROUNDING_SHIFT(ip), \
647*4882a593Smuzhiyun 		UNIPERIF_CTRL_ROUNDING_MASK(ip))
648*4882a593Smuzhiyun #define SET_UNIPERIF_CTRL_ROUNDING_OFF(ip) \
649*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
650*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
651*4882a593Smuzhiyun 		UNIPERIF_CTRL_ROUNDING_SHIFT(ip), \
652*4882a593Smuzhiyun 		UNIPERIF_CTRL_ROUNDING_MASK(ip), 0)
653*4882a593Smuzhiyun #define SET_UNIPERIF_CTRL_ROUNDING_ON(ip) \
654*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
655*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
656*4882a593Smuzhiyun 		UNIPERIF_CTRL_ROUNDING_SHIFT(ip), \
657*4882a593Smuzhiyun 		UNIPERIF_CTRL_ROUNDING_MASK(ip), 1)
658*4882a593Smuzhiyun 
659*4882a593Smuzhiyun /* DIVIDER */
660*4882a593Smuzhiyun #define UNIPERIF_CTRL_DIVIDER_SHIFT(ip) 5
661*4882a593Smuzhiyun #define UNIPERIF_CTRL_DIVIDER_MASK(ip) 0xff
662*4882a593Smuzhiyun #define GET_UNIPERIF_CTRL_DIVIDER(ip) \
663*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
664*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
665*4882a593Smuzhiyun 		UNIPERIF_CTRL_DIVIDER_SHIFT(ip), \
666*4882a593Smuzhiyun 		UNIPERIF_CTRL_DIVIDER_MASK(ip))
667*4882a593Smuzhiyun #define SET_UNIPERIF_CTRL_DIVIDER(ip, value) \
668*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
669*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
670*4882a593Smuzhiyun 		UNIPERIF_CTRL_DIVIDER_SHIFT(ip), \
671*4882a593Smuzhiyun 		UNIPERIF_CTRL_DIVIDER_MASK(ip), value)
672*4882a593Smuzhiyun 
673*4882a593Smuzhiyun /* BYTE_SWAP */
674*4882a593Smuzhiyun #define UNIPERIF_CTRL_BYTE_SWP_SHIFT(ip) \
675*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 13 : -1)
676*4882a593Smuzhiyun #define UNIPERIF_CTRL_BYTE_SWP_MASK(ip) 0x1
677*4882a593Smuzhiyun #define GET_UNIPERIF_CTRL_BYTE_SWP(ip) \
678*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
679*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
680*4882a593Smuzhiyun 		UNIPERIF_CTRL_BYTE_SWP_SHIFT(ip), \
681*4882a593Smuzhiyun 		UNIPERIF_CTRL_BYTE_SWP_MASK(ip))
682*4882a593Smuzhiyun #define SET_UNIPERIF_CTRL_BYTE_SWP_OFF(ip) \
683*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
684*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
685*4882a593Smuzhiyun 		UNIPERIF_CTRL_BYTE_SWP_SHIFT(ip), \
686*4882a593Smuzhiyun 		UNIPERIF_CTRL_BYTE_SWP_MASK(ip), 0)
687*4882a593Smuzhiyun #define SET_UNIPERIF_CTRL_BYTE_SWP_ON(ip) \
688*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
689*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
690*4882a593Smuzhiyun 		UNIPERIF_CTRL_BYTE_SWP_SHIFT(ip), \
691*4882a593Smuzhiyun 		UNIPERIF_CTRL_BYTE_SWP_MASK(ip), 1)
692*4882a593Smuzhiyun 
693*4882a593Smuzhiyun /* ZERO_STUFFING_HW_SW */
694*4882a593Smuzhiyun #define UNIPERIF_CTRL_ZERO_STUFF_SHIFT(ip) \
695*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 14 : -1)
696*4882a593Smuzhiyun #define UNIPERIF_CTRL_ZERO_STUFF_MASK(ip) 0x1
697*4882a593Smuzhiyun #define GET_UNIPERIF_CTRL_ZERO_STUFF(ip) \
698*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
699*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
700*4882a593Smuzhiyun 		UNIPERIF_CTRL_ZERO_STUFF_SHIFT(ip), \
701*4882a593Smuzhiyun 		UNIPERIF_CTRL_ZERO_STUFF_MASK(ip))
702*4882a593Smuzhiyun #define SET_UNIPERIF_CTRL_ZERO_STUFF_HW(ip) \
703*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
704*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
705*4882a593Smuzhiyun 		UNIPERIF_CTRL_ZERO_STUFF_SHIFT(ip), \
706*4882a593Smuzhiyun 		UNIPERIF_CTRL_ZERO_STUFF_MASK(ip), 1)
707*4882a593Smuzhiyun #define SET_UNIPERIF_CTRL_ZERO_STUFF_SW(ip) \
708*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
709*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
710*4882a593Smuzhiyun 		UNIPERIF_CTRL_ZERO_STUFF_SHIFT(ip), \
711*4882a593Smuzhiyun 		UNIPERIF_CTRL_ZERO_STUFF_MASK(ip), 0)
712*4882a593Smuzhiyun 
713*4882a593Smuzhiyun /* SPDIF_LAT */
714*4882a593Smuzhiyun #define UNIPERIF_CTRL_SPDIF_LAT_SHIFT(ip) \
715*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 16 : -1)
716*4882a593Smuzhiyun #define UNIPERIF_CTRL_SPDIF_LAT_MASK(ip) 0x1
717*4882a593Smuzhiyun #define GET_UNIPERIF_CTRL_SPDIF_LAT(ip) \
718*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
719*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
720*4882a593Smuzhiyun 		UNIPERIF_CTRL_SPDIF_LAT_SHIFT(ip), \
721*4882a593Smuzhiyun 		UNIPERIF_CTRL_SPDIF_LAT_MASK(ip))
722*4882a593Smuzhiyun #define SET_UNIPERIF_CTRL_SPDIF_LAT_ON(ip) \
723*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
724*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
725*4882a593Smuzhiyun 		UNIPERIF_CTRL_SPDIF_LAT_SHIFT(ip), \
726*4882a593Smuzhiyun 		UNIPERIF_CTRL_SPDIF_LAT_MASK(ip), 1)
727*4882a593Smuzhiyun #define SET_UNIPERIF_CTRL_SPDIF_LAT_OFF(ip) \
728*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
729*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
730*4882a593Smuzhiyun 		UNIPERIF_CTRL_SPDIF_LAT_SHIFT(ip), \
731*4882a593Smuzhiyun 		UNIPERIF_CTRL_SPDIF_LAT_MASK(ip), 0)
732*4882a593Smuzhiyun 
733*4882a593Smuzhiyun /* EN_SPDIF_FORMATTING */
734*4882a593Smuzhiyun #define UNIPERIF_CTRL_SPDIF_FMT_SHIFT(ip) 17
735*4882a593Smuzhiyun #define UNIPERIF_CTRL_SPDIF_FMT_MASK(ip) 0x1
736*4882a593Smuzhiyun #define GET_UNIPERIF_CTRL_SPDIF_FMT(ip) \
737*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
738*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
739*4882a593Smuzhiyun 		UNIPERIF_CTRL_SPDIF_FMT_SHIFT(ip), \
740*4882a593Smuzhiyun 		UNIPERIF_CTRL_SPDIF_FMT_MASK(ip))
741*4882a593Smuzhiyun #define SET_UNIPERIF_CTRL_SPDIF_FMT_ON(ip) \
742*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
743*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
744*4882a593Smuzhiyun 		UNIPERIF_CTRL_SPDIF_FMT_SHIFT(ip), \
745*4882a593Smuzhiyun 		UNIPERIF_CTRL_SPDIF_FMT_MASK(ip), 1)
746*4882a593Smuzhiyun #define SET_UNIPERIF_CTRL_SPDIF_FMT_OFF(ip) \
747*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
748*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
749*4882a593Smuzhiyun 		UNIPERIF_CTRL_SPDIF_FMT_SHIFT(ip), \
750*4882a593Smuzhiyun 		UNIPERIF_CTRL_SPDIF_FMT_MASK(ip), 0)
751*4882a593Smuzhiyun 
752*4882a593Smuzhiyun /* READER_OUT_SELECT */
753*4882a593Smuzhiyun #define UNIPERIF_CTRL_READER_OUT_SEL_SHIFT(ip) \
754*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 18 : -1)
755*4882a593Smuzhiyun #define UNIPERIF_CTRL_READER_OUT_SEL_MASK(ip) 0x1
756*4882a593Smuzhiyun #define GET_UNIPERIF_CTRL_READER_OUT_SEL(ip) \
757*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
758*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
759*4882a593Smuzhiyun 		UNIPERIF_CTRL_READER_OUT_SEL_SHIFT(ip), \
760*4882a593Smuzhiyun 		UNIPERIF_CTRL_READER_OUT_SEL_MASK(ip))
761*4882a593Smuzhiyun #define SET_UNIPERIF_CTRL_READER_OUT_SEL_IN_MEM(ip) \
762*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
763*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
764*4882a593Smuzhiyun 		UNIPERIF_CTRL_READER_OUT_SEL_SHIFT(ip), \
765*4882a593Smuzhiyun 		UNIPERIF_CTRL_READER_OUT_SEL_MASK(ip), 0)
766*4882a593Smuzhiyun #define SET_UNIPERIF_CTRL_READER_OUT_SEL_ON_I2S_LINE(ip) \
767*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
768*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
769*4882a593Smuzhiyun 		UNIPERIF_CTRL_READER_OUT_SEL_SHIFT(ip), \
770*4882a593Smuzhiyun 		UNIPERIF_CTRL_READER_OUT_SEL_MASK(ip), 1)
771*4882a593Smuzhiyun 
772*4882a593Smuzhiyun /* UNDERFLOW_REC_WINDOW */
773*4882a593Smuzhiyun #define UNIPERIF_CTRL_UNDERFLOW_REC_WINDOW_SHIFT(ip) 20
774*4882a593Smuzhiyun #define UNIPERIF_CTRL_UNDERFLOW_REC_WINDOW_MASK(ip) 0xff
775*4882a593Smuzhiyun #define GET_UNIPERIF_CTRL_UNDERFLOW_REC_WINDOW(ip) \
776*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
777*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
778*4882a593Smuzhiyun 		UNIPERIF_CTRL_UNDERFLOW_REC_WINDOW_SHIFT(ip), \
779*4882a593Smuzhiyun 		UNIPERIF_CTRL_UNDERFLOW_REC_WINDOW_MASK(ip))
780*4882a593Smuzhiyun #define SET_UNIPERIF_CTRL_UNDERFLOW_REC_WINDOW(ip, value) \
781*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
782*4882a593Smuzhiyun 		UNIPERIF_CTRL_OFFSET(ip), \
783*4882a593Smuzhiyun 		UNIPERIF_CTRL_UNDERFLOW_REC_WINDOW_SHIFT(ip), \
784*4882a593Smuzhiyun 		UNIPERIF_CTRL_UNDERFLOW_REC_WINDOW_MASK(ip), value)
785*4882a593Smuzhiyun 
786*4882a593Smuzhiyun /*
787*4882a593Smuzhiyun  * UNIPERIF_I2S_FMT a.k.a UNIPERIF_FORMAT reg
788*4882a593Smuzhiyun  */
789*4882a593Smuzhiyun 
790*4882a593Smuzhiyun #define UNIPERIF_I2S_FMT_OFFSET(ip) 0x0048
791*4882a593Smuzhiyun #define GET_UNIPERIF_I2S_FMT(ip) \
792*4882a593Smuzhiyun 	readl_relaxed(ip->base + UNIPERIF_I2S_FMT_OFFSET(ip))
793*4882a593Smuzhiyun #define SET_UNIPERIF_I2S_FMT(ip, value) \
794*4882a593Smuzhiyun 	writel_relaxed(value, ip->base + UNIPERIF_I2S_FMT_OFFSET(ip))
795*4882a593Smuzhiyun 
796*4882a593Smuzhiyun /* NBIT */
797*4882a593Smuzhiyun #define UNIPERIF_I2S_FMT_NBIT_SHIFT(ip) 0
798*4882a593Smuzhiyun #define UNIPERIF_I2S_FMT_NBIT_MASK(ip) 0x1
799*4882a593Smuzhiyun #define GET_UNIPERIF_I2S_FMT_NBIT(ip) \
800*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
801*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
802*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_NBIT_SHIFT(ip), \
803*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_NBIT_MASK(ip))
804*4882a593Smuzhiyun #define SET_UNIPERIF_I2S_FMT_NBIT_32(ip) \
805*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
806*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
807*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_NBIT_SHIFT(ip), \
808*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_NBIT_MASK(ip), 0)
809*4882a593Smuzhiyun #define SET_UNIPERIF_I2S_FMT_NBIT_16(ip) \
810*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
811*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
812*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_NBIT_SHIFT(ip), \
813*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_NBIT_MASK(ip), 1)
814*4882a593Smuzhiyun 
815*4882a593Smuzhiyun /* DATA_SIZE */
816*4882a593Smuzhiyun #define UNIPERIF_I2S_FMT_DATA_SIZE_SHIFT(ip) 1
817*4882a593Smuzhiyun #define UNIPERIF_I2S_FMT_DATA_SIZE_MASK(ip) 0x7
818*4882a593Smuzhiyun #define GET_UNIPERIF_I2S_FMT_DATA_SIZE(ip) \
819*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
820*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
821*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_DATA_SIZE_SHIFT(ip), \
822*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_DATA_SIZE_MASK(ip))
823*4882a593Smuzhiyun #define SET_UNIPERIF_I2S_FMT_DATA_SIZE_16(ip) \
824*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
825*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
826*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_DATA_SIZE_SHIFT(ip), \
827*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_DATA_SIZE_MASK(ip), 0)
828*4882a593Smuzhiyun #define SET_UNIPERIF_I2S_FMT_DATA_SIZE_18(ip) \
829*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
830*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
831*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_DATA_SIZE_SHIFT(ip), \
832*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_DATA_SIZE_MASK(ip), 1)
833*4882a593Smuzhiyun #define SET_UNIPERIF_I2S_FMT_DATA_SIZE_20(ip) \
834*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
835*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
836*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_DATA_SIZE_SHIFT(ip), \
837*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_DATA_SIZE_MASK(ip), 2)
838*4882a593Smuzhiyun #define SET_UNIPERIF_I2S_FMT_DATA_SIZE_24(ip) \
839*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
840*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
841*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_DATA_SIZE_SHIFT(ip), \
842*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_DATA_SIZE_MASK(ip), 3)
843*4882a593Smuzhiyun #define SET_UNIPERIF_I2S_FMTL_DATA_SIZE_28(ip) \
844*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
845*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
846*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_DATA_SIZE_SHIFT(ip), \
847*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_DATA_SIZE_MASK(ip), 4)
848*4882a593Smuzhiyun #define SET_UNIPERIF_I2S_FMT_DATA_SIZE_32(ip) \
849*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
850*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
851*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_DATA_SIZE_SHIFT(ip), \
852*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_DATA_SIZE_MASK(ip), 5)
853*4882a593Smuzhiyun 
854*4882a593Smuzhiyun /* LR_POL */
855*4882a593Smuzhiyun #define UNIPERIF_I2S_FMT_LR_POL_SHIFT(ip) 4
856*4882a593Smuzhiyun #define UNIPERIF_I2S_FMT_LR_POL_MASK(ip) 0x1
857*4882a593Smuzhiyun #define VALUE_UNIPERIF_I2S_FMT_LR_POL_LOW(ip) 0x0
858*4882a593Smuzhiyun #define VALUE_UNIPERIF_I2S_FMT_LR_POL_HIG(ip) 0x1
859*4882a593Smuzhiyun #define GET_UNIPERIF_I2S_FMT_LR_POL(ip) \
860*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
861*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
862*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_LR_POL_SHIFT(ip), \
863*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_LR_POL_MASK(ip))
864*4882a593Smuzhiyun #define SET_UNIPERIF_I2S_FMT_LR_POL(ip, value) \
865*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
866*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
867*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_LR_POL_SHIFT(ip), \
868*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_LR_POL_MASK(ip), value)
869*4882a593Smuzhiyun #define SET_UNIPERIF_I2S_FMT_LR_POL_LOW(ip) \
870*4882a593Smuzhiyun 	SET_UNIPERIF_I2S_FMT_LR_POL(ip, \
871*4882a593Smuzhiyun 		VALUE_UNIPERIF_I2S_FMT_LR_POL_LOW(ip))
872*4882a593Smuzhiyun #define SET_UNIPERIF_I2S_FMT_LR_POL_HIG(ip) \
873*4882a593Smuzhiyun 	SET_UNIPERIF_I2S_FMT_LR_POL(ip, \
874*4882a593Smuzhiyun 		VALUE_UNIPERIF_I2S_FMT_LR_POL_HIG(ip))
875*4882a593Smuzhiyun 
876*4882a593Smuzhiyun /* SCLK_EDGE */
877*4882a593Smuzhiyun #define UNIPERIF_I2S_FMT_SCLK_EDGE_SHIFT(ip) 5
878*4882a593Smuzhiyun #define UNIPERIF_I2S_FMT_SCLK_EDGE_MASK(ip) 0x1
879*4882a593Smuzhiyun #define GET_UNIPERIF_I2S_FMT_SCLK_EDGE(ip) \
880*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
881*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
882*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_SCLK_EDGE_SHIFT(ip), \
883*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_SCLK_EDGE_MASK(ip))
884*4882a593Smuzhiyun #define SET_UNIPERIF_I2S_FMT_SCLK_EDGE_RISING(ip) \
885*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
886*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
887*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_SCLK_EDGE_SHIFT(ip), \
888*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_SCLK_EDGE_MASK(ip), 0)
889*4882a593Smuzhiyun #define SET_UNIPERIF_I2S_FMT_SCLK_EDGE_FALLING(ip) \
890*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
891*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
892*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_SCLK_EDGE_SHIFT(ip), \
893*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_SCLK_EDGE_MASK(ip), 1)
894*4882a593Smuzhiyun 
895*4882a593Smuzhiyun /* PADDING */
896*4882a593Smuzhiyun #define UNIPERIF_I2S_FMT_PADDING_SHIFT(ip) 6
897*4882a593Smuzhiyun #define UNIPERIF_I2S_FMT_PADDING_MASK(ip) 0x1
898*4882a593Smuzhiyun #define UNIPERIF_I2S_FMT_PADDING_MASK(ip) 0x1
899*4882a593Smuzhiyun #define VALUE_UNIPERIF_I2S_FMT_PADDING_I2S_MODE(ip) 0x0
900*4882a593Smuzhiyun #define VALUE_UNIPERIF_I2S_FMT_PADDING_SONY_MODE(ip) 0x1
901*4882a593Smuzhiyun #define GET_UNIPERIF_I2S_FMT_PADDING(ip) \
902*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
903*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
904*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_PADDING_SHIFT(ip), \
905*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_PADDING_MASK(ip))
906*4882a593Smuzhiyun #define SET_UNIPERIF_I2S_FMT_PADDING(ip, value) \
907*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
908*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
909*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_PADDING_SHIFT(ip), \
910*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_PADDING_MASK(ip), value)
911*4882a593Smuzhiyun #define SET_UNIPERIF_I2S_FMT_PADDING_I2S_MODE(ip) \
912*4882a593Smuzhiyun 	SET_UNIPERIF_I2S_FMT_PADDING(ip, \
913*4882a593Smuzhiyun 		VALUE_UNIPERIF_I2S_FMT_PADDING_I2S_MODE(ip))
914*4882a593Smuzhiyun #define SET_UNIPERIF_I2S_FMT_PADDING_SONY_MODE(ip) \
915*4882a593Smuzhiyun 	SET_UNIPERIF_I2S_FMT_PADDING(ip, \
916*4882a593Smuzhiyun 		VALUE_UNIPERIF_I2S_FMT_PADDING_SONY_MODE(ip))
917*4882a593Smuzhiyun 
918*4882a593Smuzhiyun /* ALIGN */
919*4882a593Smuzhiyun #define UNIPERIF_I2S_FMT_ALIGN_SHIFT(ip) 7
920*4882a593Smuzhiyun #define UNIPERIF_I2S_FMT_ALIGN_MASK(ip) 0x1
921*4882a593Smuzhiyun #define GET_UNIPERIF_I2S_FMT_ALIGN(ip) \
922*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
923*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
924*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_ALIGN_SHIFT(ip), \
925*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_ALIGN_MASK(ip))
926*4882a593Smuzhiyun #define SET_UNIPERIF_I2S_FMT_ALIGN_LEFT(ip) \
927*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
928*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
929*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_ALIGN_SHIFT(ip), \
930*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_ALIGN_MASK(ip), 0)
931*4882a593Smuzhiyun #define SET_UNIPERIF_I2S_FMT_ALIGN_RIGHT(ip) \
932*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
933*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
934*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_ALIGN_SHIFT(ip), \
935*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_ALIGN_MASK(ip), 1)
936*4882a593Smuzhiyun 
937*4882a593Smuzhiyun /* ORDER */
938*4882a593Smuzhiyun #define UNIPERIF_I2S_FMT_ORDER_SHIFT(ip) 8
939*4882a593Smuzhiyun #define UNIPERIF_I2S_FMT_ORDER_MASK(ip) 0x1
940*4882a593Smuzhiyun #define GET_UNIPERIF_I2S_FMT_ORDER(ip) \
941*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
942*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
943*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_ORDER_SHIFT(ip), \
944*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_ORDER_MASK(ip))
945*4882a593Smuzhiyun #define SET_UNIPERIF_I2S_FMT_ORDER_LSB(ip) \
946*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
947*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
948*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_ORDER_SHIFT(ip), \
949*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_ORDER_MASK(ip), 0)
950*4882a593Smuzhiyun #define SET_UNIPERIF_I2S_FMT_ORDER_MSB(ip) \
951*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
952*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
953*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_ORDER_SHIFT(ip), \
954*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_ORDER_MASK(ip), 1)
955*4882a593Smuzhiyun 
956*4882a593Smuzhiyun /* NUM_CH */
957*4882a593Smuzhiyun #define UNIPERIF_I2S_FMT_NUM_CH_SHIFT(ip) 9
958*4882a593Smuzhiyun #define UNIPERIF_I2S_FMT_NUM_CH_MASK(ip) 0x7
959*4882a593Smuzhiyun #define GET_UNIPERIF_I2S_FMT_NUM_CH(ip) \
960*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
961*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
962*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_NUM_CH_SHIFT(ip), \
963*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_NUM_CH_MASK(ip))
964*4882a593Smuzhiyun #define SET_UNIPERIF_I2S_FMT_NUM_CH(ip, value) \
965*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
966*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
967*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_NUM_CH_SHIFT(ip), \
968*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_NUM_CH_MASK(ip), value)
969*4882a593Smuzhiyun 
970*4882a593Smuzhiyun /* NO_OF_SAMPLES_TO_READ */
971*4882a593Smuzhiyun #define UNIPERIF_I2S_FMT_NO_OF_SAMPLES_TO_READ_SHIFT(ip) 12
972*4882a593Smuzhiyun #define UNIPERIF_I2S_FMT_NO_OF_SAMPLES_TO_READ_MASK(ip) 0xfffff
973*4882a593Smuzhiyun #define GET_UNIPERIF_I2S_FMT_NO_OF_SAMPLES_TO_READ(ip) \
974*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
975*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
976*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_NO_OF_SAMPLES_TO_READ_SHIFT(ip), \
977*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_NO_OF_SAMPLES_TO_READ_MASK(ip))
978*4882a593Smuzhiyun #define SET_UNIPERIF_I2S_FMT_NO_OF_SAMPLES_TO_READ(ip, value) \
979*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
980*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_OFFSET(ip), \
981*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_NO_OF_SAMPLES_TO_READ_SHIFT(ip), \
982*4882a593Smuzhiyun 		UNIPERIF_I2S_FMT_NO_OF_SAMPLES_TO_READ_MASK(ip), value)
983*4882a593Smuzhiyun 
984*4882a593Smuzhiyun /*
985*4882a593Smuzhiyun  * UNIPERIF_BIT_CONTROL reg
986*4882a593Smuzhiyun  */
987*4882a593Smuzhiyun 
988*4882a593Smuzhiyun #define UNIPERIF_BIT_CONTROL_OFFSET(ip)  \
989*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? -1 : 0x004c)
990*4882a593Smuzhiyun #define GET_UNIPERIF_BIT_CONTROL(ip) \
991*4882a593Smuzhiyun 	readl_relaxed(ip->base + UNIPERIF_BIT_CONTROL_OFFSET(ip))
992*4882a593Smuzhiyun #define SET_UNIPERIF_BIT_CONTROL(ip, value) \
993*4882a593Smuzhiyun 	writel_relaxed(value, ip->base + UNIPERIF_BIT_CONTROL_OFFSET(ip))
994*4882a593Smuzhiyun 
995*4882a593Smuzhiyun /* CLR_UNDERFLOW_DURATION */
996*4882a593Smuzhiyun #define UNIPERIF_BIT_CONTROL_CLR_UNDERFLOW_DURATION_SHIFT(ip) 0
997*4882a593Smuzhiyun #define UNIPERIF_BIT_CONTROL_CLR_UNDERFLOW_DURATION_MASK(ip) 0x1
998*4882a593Smuzhiyun #define GET_UNIPERIF_BIT_CONTROL_CLR_UNDERFLOW_DURATION(ip) \
999*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
1000*4882a593Smuzhiyun 		UNIPERIF_BIT_CONTROL_OFFSET(ip), \
1001*4882a593Smuzhiyun 		UNIPERIF_BIT_CONTROL_CLR_UNDERFLOW_DURATION_SHIFT(ip), \
1002*4882a593Smuzhiyun 		UNIPERIF_BIT_CONTROL_CLR_UNDERFLOW_DURATION_MASK(ip))
1003*4882a593Smuzhiyun #define SET_UNIPERIF_BIT_CONTROL_CLR_UNDERFLOW_DURATION(ip) \
1004*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
1005*4882a593Smuzhiyun 		UNIPERIF_BIT_CONTROL_OFFSET(ip), \
1006*4882a593Smuzhiyun 		UNIPERIF_BIT_CONTROL_CLR_UNDERFLOW_DURATION_SHIFT(ip), \
1007*4882a593Smuzhiyun 		UNIPERIF_BIT_CONTROL_CLR_UNDERFLOW_DURATION_MASK(ip), 1)
1008*4882a593Smuzhiyun 
1009*4882a593Smuzhiyun /* CHL_STS_UPDATE */
1010*4882a593Smuzhiyun #define UNIPERIF_BIT_CONTROL_CHL_STS_UPDATE_SHIFT(ip) 1
1011*4882a593Smuzhiyun #define UNIPERIF_BIT_CONTROL_CHL_STS_UPDATE_MASK(ip) 0x1
1012*4882a593Smuzhiyun #define GET_UNIPERIF_BIT_CONTROL_CHL_STS_UPDATE(ip) \
1013*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
1014*4882a593Smuzhiyun 		UNIPERIF_BIT_CONTROL_OFFSET(ip), \
1015*4882a593Smuzhiyun 		UNIPERIF_BIT_CONTROL_CHL_STS_UPDATE_SHIFT(ip), \
1016*4882a593Smuzhiyun 		UNIPERIF_BIT_CONTROL_CHL_STS_UPDATE_MASK(ip))
1017*4882a593Smuzhiyun #define SET_UNIPERIF_BIT_CONTROL_CHL_STS_UPDATE(ip) \
1018*4882a593Smuzhiyun 	SET_UNIPERIF_BIT_REG(ip, \
1019*4882a593Smuzhiyun 		UNIPERIF_BIT_CONTROL_OFFSET(ip), \
1020*4882a593Smuzhiyun 		UNIPERIF_BIT_CONTROL_CHL_STS_UPDATE_SHIFT(ip), \
1021*4882a593Smuzhiyun 		UNIPERIF_BIT_CONTROL_CHL_STS_UPDATE_MASK(ip), 1)
1022*4882a593Smuzhiyun 
1023*4882a593Smuzhiyun /*
1024*4882a593Smuzhiyun  * UNIPERIF_STATUS_1 reg
1025*4882a593Smuzhiyun  */
1026*4882a593Smuzhiyun 
1027*4882a593Smuzhiyun #define UNIPERIF_STATUS_1_OFFSET(ip) 0x0050
1028*4882a593Smuzhiyun #define GET_UNIPERIF_STATUS_1(ip) \
1029*4882a593Smuzhiyun 	readl_relaxed(ip->base + UNIPERIF_STATUS_1_OFFSET(ip))
1030*4882a593Smuzhiyun #define SET_UNIPERIF_STATUS_1(ip, value) \
1031*4882a593Smuzhiyun 	writel_relaxed(value, ip->base + UNIPERIF_STATUS_1_OFFSET(ip))
1032*4882a593Smuzhiyun 
1033*4882a593Smuzhiyun /* UNDERFLOW_DURATION */
1034*4882a593Smuzhiyun #define UNIPERIF_STATUS_1_UNDERFLOW_DURATION_SHIFT(ip) \
1035*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? -1 : 0)
1036*4882a593Smuzhiyun #define UNIPERIF_STATUS_1_UNDERFLOW_DURATION_MASK(ip) 0xff
1037*4882a593Smuzhiyun #define GET_UNIPERIF_STATUS_1_UNDERFLOW_DURATION(ip) \
1038*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
1039*4882a593Smuzhiyun 		UNIPERIF_STATUS_1_OFFSET(ip), \
1040*4882a593Smuzhiyun 		UNIPERIF_STATUS_1_UNDERFLOW_DURATION_SHIFT(ip), \
1041*4882a593Smuzhiyun 		UNIPERIF_STATUS_1_UNDERFLOW_DURATION_MASK(ip))
1042*4882a593Smuzhiyun #define SET_UNIPERIF_STATUS_1_UNDERFLOW_DURATION(ip, value) \
1043*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
1044*4882a593Smuzhiyun 		UNIPERIF_STATUS_1_OFFSET(ip), \
1045*4882a593Smuzhiyun 		UNIPERIF_STATUS_1_UNDERFLOW_DURATION_SHIFT(ip), \
1046*4882a593Smuzhiyun 		UNIPERIF_STATUS_1_UNDERFLOW_DURATION_MASK(ip), value)
1047*4882a593Smuzhiyun 
1048*4882a593Smuzhiyun /*
1049*4882a593Smuzhiyun  * UNIPERIF_CHANNEL_STA_REGN reg
1050*4882a593Smuzhiyun  */
1051*4882a593Smuzhiyun 
1052*4882a593Smuzhiyun #define UNIPERIF_CHANNEL_STA_REGN(ip, n) (0x0060 + (4 * n))
1053*4882a593Smuzhiyun #define GET_UNIPERIF_CHANNEL_STA_REGN(ip) \
1054*4882a593Smuzhiyun 	readl_relaxed(ip->base + UNIPERIF_CHANNEL_STA_REGN(ip, n))
1055*4882a593Smuzhiyun #define SET_UNIPERIF_CHANNEL_STA_REGN(ip, n, value) \
1056*4882a593Smuzhiyun 	writel_relaxed(value, ip->base + \
1057*4882a593Smuzhiyun 			UNIPERIF_CHANNEL_STA_REGN(ip, n))
1058*4882a593Smuzhiyun 
1059*4882a593Smuzhiyun /*
1060*4882a593Smuzhiyun  * UNIPERIF_USER_VALIDITY reg
1061*4882a593Smuzhiyun  */
1062*4882a593Smuzhiyun 
1063*4882a593Smuzhiyun #define UNIPERIF_USER_VALIDITY_OFFSET(ip) 0x0090
1064*4882a593Smuzhiyun #define GET_UNIPERIF_USER_VALIDITY(ip) \
1065*4882a593Smuzhiyun 	readl_relaxed(ip->base + UNIPERIF_USER_VALIDITY_OFFSET(ip))
1066*4882a593Smuzhiyun #define SET_UNIPERIF_USER_VALIDITY(ip, value) \
1067*4882a593Smuzhiyun 	writel_relaxed(value, ip->base + UNIPERIF_USER_VALIDITY_OFFSET(ip))
1068*4882a593Smuzhiyun 
1069*4882a593Smuzhiyun /* VALIDITY_LEFT_AND_RIGHT */
1070*4882a593Smuzhiyun #define UNIPERIF_USER_VALIDITY_VALIDITY_LR_SHIFT(ip) 0
1071*4882a593Smuzhiyun #define UNIPERIF_USER_VALIDITY_VALIDITY_LR_MASK(ip) 0x3
1072*4882a593Smuzhiyun #define GET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(ip) \
1073*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
1074*4882a593Smuzhiyun 		UNIPERIF_USER_VALIDITY_OFFSET(ip), \
1075*4882a593Smuzhiyun 		UNIPERIF_USER_VALIDITY_VALIDITY_LR_SHIFT(ip), \
1076*4882a593Smuzhiyun 		UNIPERIF_USER_VALIDITY_VALIDITY_LR_MASK(ip))
1077*4882a593Smuzhiyun #define SET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(ip, value) \
1078*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
1079*4882a593Smuzhiyun 		UNIPERIF_USER_VALIDITY_OFFSET(ip), \
1080*4882a593Smuzhiyun 		UNIPERIF_USER_VALIDITY_VALIDITY_LR_SHIFT(ip), \
1081*4882a593Smuzhiyun 		UNIPERIF_USER_VALIDITY_VALIDITY_LR_MASK(ip), \
1082*4882a593Smuzhiyun 		value ? 0x3 : 0)
1083*4882a593Smuzhiyun 
1084*4882a593Smuzhiyun /*
1085*4882a593Smuzhiyun  * UNIPERIF_DBG_STANDBY_LEFT_SP reg
1086*4882a593Smuzhiyun  */
1087*4882a593Smuzhiyun #define UNIPERIF_DBG_STANDBY_LEFT_SP_OFFSET(ip) 0x0150
1088*4882a593Smuzhiyun #define UNIPERIF_DBG_STANDBY_LEFT_SP_SHIFT(ip) \
1089*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? -1 : 0)
1090*4882a593Smuzhiyun #define UNIPERIF_DBG_STANDBY_LEFT_SP_MASK(ip) \
1091*4882a593Smuzhiyun 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 0 : 0xFFFFFF)
1092*4882a593Smuzhiyun #define GET_UNIPERIF_DBG_STANDBY_LEFT_SP(ip) \
1093*4882a593Smuzhiyun 	GET_UNIPERIF_REG(ip, \
1094*4882a593Smuzhiyun 		UNIPERIF_DBG_STANDBY_LEFT_SP_OFFSET(ip), \
1095*4882a593Smuzhiyun 		UNIPERIF_DBG_STANDBY_LEFT_SP_SHIFT(ip), \
1096*4882a593Smuzhiyun 		UNIPERIF_DBG_STANDBY_LEFT_SP_MASK(ip))
1097*4882a593Smuzhiyun #define SET_UNIPERIF_DBG_STANDBY_LEFT_SP(ip, value) \
1098*4882a593Smuzhiyun 	SET_UNIPERIF_REG(ip, \
1099*4882a593Smuzhiyun 		UNIPERIF_DBG_STANDBY_LEFT_SP_OFFSET(ip), \
1100*4882a593Smuzhiyun 		UNIPERIF_DBG_STANDBY_LEFT_SP_SHIFT(ip), \
1101*4882a593Smuzhiyun 		UNIPERIF_DBG_STANDBY_LEFT_SP_MASK(ip), value)
1102*4882a593Smuzhiyun 
1103*4882a593Smuzhiyun /*
1104*4882a593Smuzhiyun  * UNIPERIF_TDM_ENABLE
1105*4882a593Smuzhiyun  */
1106*4882a593Smuzhiyun #define UNIPERIF_TDM_ENABLE_OFFSET(ip) 0x0118
1107*4882a593Smuzhiyun #define GET_UNIPERIF_TDM_ENABLE(ip) \
1108*4882a593Smuzhiyun 	readl_relaxed(ip->base + UNIPERIF_TDM_ENABLE_OFFSET(ip))
1109*4882a593Smuzhiyun #define SET_UNIPERIF_TDM_ENABLE(ip, value) \
1110*4882a593Smuzhiyun 	writel_relaxed(value, ip->base + UNIPERIF_TDM_ENABLE_OFFSET(ip))
1111*4882a593Smuzhiyun 
1112*4882a593Smuzhiyun /* TDM_ENABLE */
1113*4882a593Smuzhiyun #define UNIPERIF_TDM_ENABLE_EN_TDM_SHIFT(ip) 0x0
1114*4882a593Smuzhiyun #define UNIPERIF_TDM_ENABLE_EN_TDM_MASK(ip) 0x1
1115*4882a593Smuzhiyun #define GET_UNIPERIF_TDM_ENABLE_EN_TDM(ip) \
1116*4882a593Smuzhiyun 		GET_UNIPERIF_REG(ip, \
1117*4882a593Smuzhiyun 		UNIPERIF_TDM_ENABLE_OFFSET(ip), \
1118*4882a593Smuzhiyun 		UNIPERIF_TDM_ENABLE_EN_TDM_SHIFT(ip), \
1119*4882a593Smuzhiyun 		UNIPERIF_TDM_ENABLE_EN_TDM_MASK(ip))
1120*4882a593Smuzhiyun #define SET_UNIPERIF_TDM_ENABLE_TDM_ENABLE(ip) \
1121*4882a593Smuzhiyun 		SET_UNIPERIF_REG(ip, \
1122*4882a593Smuzhiyun 		UNIPERIF_TDM_ENABLE_OFFSET(ip), \
1123*4882a593Smuzhiyun 		UNIPERIF_TDM_ENABLE_EN_TDM_SHIFT(ip), \
1124*4882a593Smuzhiyun 		UNIPERIF_TDM_ENABLE_EN_TDM_MASK(ip), 1)
1125*4882a593Smuzhiyun #define SET_UNIPERIF_TDM_ENABLE_TDM_DISABLE(ip) \
1126*4882a593Smuzhiyun 		SET_UNIPERIF_REG(ip, \
1127*4882a593Smuzhiyun 		UNIPERIF_TDM_ENABLE_OFFSET(ip), \
1128*4882a593Smuzhiyun 		UNIPERIF_TDM_ENABLE_EN_TDM_SHIFT(ip), \
1129*4882a593Smuzhiyun 		UNIPERIF_TDM_ENABLE_EN_TDM_MASK(ip), 0)
1130*4882a593Smuzhiyun 
1131*4882a593Smuzhiyun /*
1132*4882a593Smuzhiyun  * UNIPERIF_TDM_FS_REF_FREQ
1133*4882a593Smuzhiyun  */
1134*4882a593Smuzhiyun #define UNIPERIF_TDM_FS_REF_FREQ_OFFSET(ip) 0x011c
1135*4882a593Smuzhiyun #define GET_UNIPERIF_TDM_FS_REF_FREQ(ip) \
1136*4882a593Smuzhiyun 	readl_relaxed(ip->base + UNIPERIF_TDM_FS_REF_FREQ_OFFSET(ip))
1137*4882a593Smuzhiyun #define SET_UNIPERIF_TDM_FS_REF_FREQ(ip, value) \
1138*4882a593Smuzhiyun 	writel_relaxed(value, ip->base + \
1139*4882a593Smuzhiyun 			UNIPERIF_TDM_FS_REF_FREQ_OFFSET(ip))
1140*4882a593Smuzhiyun 
1141*4882a593Smuzhiyun /* REF_FREQ */
1142*4882a593Smuzhiyun #define UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ_SHIFT(ip) 0x0
1143*4882a593Smuzhiyun #define VALUE_UNIPERIF_TDM_FS_REF_FREQ_8KHZ(ip) 0
1144*4882a593Smuzhiyun #define VALUE_UNIPERIF_TDM_FS_REF_FREQ_16KHZ(ip) 1
1145*4882a593Smuzhiyun #define VALUE_UNIPERIF_TDM_FS_REF_FREQ_32KHZ(ip) 2
1146*4882a593Smuzhiyun #define VALUE_UNIPERIF_TDM_FS_REF_FREQ_48KHZ(ip) 3
1147*4882a593Smuzhiyun #define UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ_MASK(ip) 0x3
1148*4882a593Smuzhiyun #define GET_UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ(ip) \
1149*4882a593Smuzhiyun 		GET_UNIPERIF_REG(ip, \
1150*4882a593Smuzhiyun 		UNIPERIF_TDM_FS_REF_FREQ_OFFSET(ip), \
1151*4882a593Smuzhiyun 		UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ_SHIFT(ip), \
1152*4882a593Smuzhiyun 		UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ_MASK(ip))
1153*4882a593Smuzhiyun #define SET_UNIPERIF_TDM_FS_REF_FREQ_8KHZ(ip) \
1154*4882a593Smuzhiyun 		SET_UNIPERIF_REG(ip, \
1155*4882a593Smuzhiyun 		UNIPERIF_TDM_FS_REF_FREQ_OFFSET(ip), \
1156*4882a593Smuzhiyun 		UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ_SHIFT(ip), \
1157*4882a593Smuzhiyun 		UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ_MASK(ip), \
1158*4882a593Smuzhiyun 		VALUE_UNIPERIF_TDM_FS_REF_FREQ_8KHZ(ip))
1159*4882a593Smuzhiyun #define SET_UNIPERIF_TDM_FS_REF_FREQ_16KHZ(ip) \
1160*4882a593Smuzhiyun 		SET_UNIPERIF_REG(ip, \
1161*4882a593Smuzhiyun 		UNIPERIF_TDM_FS_REF_FREQ_OFFSET(ip), \
1162*4882a593Smuzhiyun 		UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ_SHIFT(ip), \
1163*4882a593Smuzhiyun 		UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ_MASK(ip), \
1164*4882a593Smuzhiyun 		VALUE_UNIPERIF_TDM_FS_REF_FREQ_16KHZ(ip))
1165*4882a593Smuzhiyun #define SET_UNIPERIF_TDM_FS_REF_FREQ_32KHZ(ip) \
1166*4882a593Smuzhiyun 		SET_UNIPERIF_REG(ip, \
1167*4882a593Smuzhiyun 		UNIPERIF_TDM_FS_REF_FREQ_OFFSET(ip), \
1168*4882a593Smuzhiyun 		UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ_SHIFT(ip), \
1169*4882a593Smuzhiyun 		UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ_MASK(ip), \
1170*4882a593Smuzhiyun 		VALUE_UNIPERIF_TDM_FS_REF_FREQ_32KHZ(ip))
1171*4882a593Smuzhiyun #define SET_UNIPERIF_TDM_FS_REF_FREQ_48KHZ(ip) \
1172*4882a593Smuzhiyun 		SET_UNIPERIF_REG(ip, \
1173*4882a593Smuzhiyun 		UNIPERIF_TDM_FS_REF_FREQ_OFFSET(ip), \
1174*4882a593Smuzhiyun 		UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ_SHIFT(ip), \
1175*4882a593Smuzhiyun 		UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ_MASK(ip), \
1176*4882a593Smuzhiyun 		VALUE_UNIPERIF_TDM_FS_REF_FREQ_48KHZ(ip))
1177*4882a593Smuzhiyun 
1178*4882a593Smuzhiyun /*
1179*4882a593Smuzhiyun  * UNIPERIF_TDM_FS_REF_DIV
1180*4882a593Smuzhiyun  */
1181*4882a593Smuzhiyun #define UNIPERIF_TDM_FS_REF_DIV_OFFSET(ip) 0x0120
1182*4882a593Smuzhiyun #define GET_UNIPERIF_TDM_FS_REF_DIV(ip) \
1183*4882a593Smuzhiyun 	readl_relaxed(ip->base + UNIPERIF_TDM_FS_REF_DIV_OFFSET(ip))
1184*4882a593Smuzhiyun #define SET_UNIPERIF_TDM_FS_REF_DIV(ip, value) \
1185*4882a593Smuzhiyun 		writel_relaxed(value, ip->base + \
1186*4882a593Smuzhiyun 			UNIPERIF_TDM_FS_REF_DIV_OFFSET(ip))
1187*4882a593Smuzhiyun 
1188*4882a593Smuzhiyun /* NUM_TIMESLOT */
1189*4882a593Smuzhiyun #define UNIPERIF_TDM_FS_REF_DIV_NUM_TIMESLOT_SHIFT(ip) 0x0
1190*4882a593Smuzhiyun #define UNIPERIF_TDM_FS_REF_DIV_NUM_TIMESLOT_MASK(ip) 0xff
1191*4882a593Smuzhiyun #define GET_UNIPERIF_TDM_FS_REF_DIV_NUM_TIMESLOT(ip) \
1192*4882a593Smuzhiyun 		GET_UNIPERIF_REG(ip, \
1193*4882a593Smuzhiyun 		UNIPERIF_TDM_FS_REF_DIV_OFFSET(ip), \
1194*4882a593Smuzhiyun 		UNIPERIF_TDM_FS_REF_DIV_NUM_TIMESLOT_SHIFT(ip), \
1195*4882a593Smuzhiyun 		UNIPERIF_TDM_FS_REF_DIV_NUM_TIMESLOT_MASK(ip))
1196*4882a593Smuzhiyun #define SET_UNIPERIF_TDM_FS_REF_DIV_NUM_TIMESLOT(ip, value) \
1197*4882a593Smuzhiyun 		SET_UNIPERIF_REG(ip, \
1198*4882a593Smuzhiyun 		UNIPERIF_TDM_FS_REF_DIV_OFFSET(ip), \
1199*4882a593Smuzhiyun 		UNIPERIF_TDM_FS_REF_DIV_NUM_TIMESLOT_SHIFT(ip), \
1200*4882a593Smuzhiyun 		UNIPERIF_TDM_FS_REF_DIV_NUM_TIMESLOT_MASK(ip), value)
1201*4882a593Smuzhiyun 
1202*4882a593Smuzhiyun /*
1203*4882a593Smuzhiyun  * UNIPERIF_TDM_WORD_POS_X_Y
1204*4882a593Smuzhiyun  * 32 bits of UNIPERIF_TDM_WORD_POS_X_Y register shall be set in 1 shot
1205*4882a593Smuzhiyun  */
1206*4882a593Smuzhiyun #define UNIPERIF_TDM_WORD_POS_1_2_OFFSET(ip) 0x013c
1207*4882a593Smuzhiyun #define UNIPERIF_TDM_WORD_POS_3_4_OFFSET(ip) 0x0140
1208*4882a593Smuzhiyun #define UNIPERIF_TDM_WORD_POS_5_6_OFFSET(ip) 0x0144
1209*4882a593Smuzhiyun #define UNIPERIF_TDM_WORD_POS_7_8_OFFSET(ip) 0x0148
1210*4882a593Smuzhiyun #define GET_UNIPERIF_TDM_WORD_POS(ip, words) \
1211*4882a593Smuzhiyun 	readl_relaxed(ip->base + UNIPERIF_TDM_WORD_POS_##words##_OFFSET(ip))
1212*4882a593Smuzhiyun #define SET_UNIPERIF_TDM_WORD_POS(ip, words, value) \
1213*4882a593Smuzhiyun 		writel_relaxed(value, ip->base + \
1214*4882a593Smuzhiyun 		UNIPERIF_TDM_WORD_POS_##words##_OFFSET(ip))
1215*4882a593Smuzhiyun /*
1216*4882a593Smuzhiyun  * uniperipheral IP capabilities
1217*4882a593Smuzhiyun  */
1218*4882a593Smuzhiyun 
1219*4882a593Smuzhiyun #define UNIPERIF_FIFO_SIZE		70 /* FIFO is 70 cells deep */
1220*4882a593Smuzhiyun #define UNIPERIF_FIFO_FRAMES		4  /* FDMA trigger limit in frames */
1221*4882a593Smuzhiyun 
1222*4882a593Smuzhiyun #define UNIPERIF_TYPE_IS_HDMI(p) \
1223*4882a593Smuzhiyun 	((p)->type == SND_ST_UNIPERIF_TYPE_HDMI)
1224*4882a593Smuzhiyun #define UNIPERIF_TYPE_IS_PCM(p) \
1225*4882a593Smuzhiyun 	((p)->type == SND_ST_UNIPERIF_TYPE_PCM)
1226*4882a593Smuzhiyun #define UNIPERIF_TYPE_IS_SPDIF(p) \
1227*4882a593Smuzhiyun 	((p)->type == SND_ST_UNIPERIF_TYPE_SPDIF)
1228*4882a593Smuzhiyun #define UNIPERIF_TYPE_IS_IEC958(p) \
1229*4882a593Smuzhiyun 	(UNIPERIF_TYPE_IS_HDMI(p) || \
1230*4882a593Smuzhiyun 		UNIPERIF_TYPE_IS_SPDIF(p))
1231*4882a593Smuzhiyun #define UNIPERIF_TYPE_IS_TDM(p) \
1232*4882a593Smuzhiyun 	((p)->type == SND_ST_UNIPERIF_TYPE_TDM)
1233*4882a593Smuzhiyun 
1234*4882a593Smuzhiyun /*
1235*4882a593Smuzhiyun  * Uniperipheral IP revisions
1236*4882a593Smuzhiyun  */
1237*4882a593Smuzhiyun enum uniperif_version {
1238*4882a593Smuzhiyun 	SND_ST_UNIPERIF_VERSION_UNKNOWN,
1239*4882a593Smuzhiyun 	/* SASG1 (Orly), Newman */
1240*4882a593Smuzhiyun 	SND_ST_UNIPERIF_VERSION_C6AUD0_UNI_1_0,
1241*4882a593Smuzhiyun 	/* SASC1, SASG2 (Orly2) */
1242*4882a593Smuzhiyun 	SND_ST_UNIPERIF_VERSION_UNI_PLR_1_0,
1243*4882a593Smuzhiyun 	/* SASC1, SASG2 (Orly2), TELSS, Cannes */
1244*4882a593Smuzhiyun 	SND_ST_UNIPERIF_VERSION_UNI_RDR_1_0,
1245*4882a593Smuzhiyun 	/* TELSS (SASC1) */
1246*4882a593Smuzhiyun 	SND_ST_UNIPERIF_VERSION_TDM_PLR_1_0,
1247*4882a593Smuzhiyun 	/* Cannes/Monaco */
1248*4882a593Smuzhiyun 	SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0
1249*4882a593Smuzhiyun };
1250*4882a593Smuzhiyun 
1251*4882a593Smuzhiyun enum uniperif_type {
1252*4882a593Smuzhiyun 	SND_ST_UNIPERIF_TYPE_NONE	= 0x00,
1253*4882a593Smuzhiyun 	SND_ST_UNIPERIF_TYPE_HDMI	= 0x01,
1254*4882a593Smuzhiyun 	SND_ST_UNIPERIF_TYPE_PCM	= 0x02,
1255*4882a593Smuzhiyun 	SND_ST_UNIPERIF_TYPE_SPDIF	= 0x04,
1256*4882a593Smuzhiyun 	SND_ST_UNIPERIF_TYPE_TDM	= 0x08
1257*4882a593Smuzhiyun };
1258*4882a593Smuzhiyun 
1259*4882a593Smuzhiyun enum uniperif_state {
1260*4882a593Smuzhiyun 	UNIPERIF_STATE_STOPPED,
1261*4882a593Smuzhiyun 	UNIPERIF_STATE_STARTED,
1262*4882a593Smuzhiyun 	UNIPERIF_STATE_STANDBY,
1263*4882a593Smuzhiyun 	UNIPERIF_STATE_UNDERFLOW,
1264*4882a593Smuzhiyun 	UNIPERIF_STATE_OVERFLOW = UNIPERIF_STATE_UNDERFLOW,
1265*4882a593Smuzhiyun 	UNIPERIF_STATE_XRUN
1266*4882a593Smuzhiyun };
1267*4882a593Smuzhiyun 
1268*4882a593Smuzhiyun enum uniperif_iec958_encoding_mode {
1269*4882a593Smuzhiyun 	UNIPERIF_IEC958_ENCODING_MODE_PCM,
1270*4882a593Smuzhiyun 	UNIPERIF_IEC958_ENCODING_MODE_ENCODED
1271*4882a593Smuzhiyun };
1272*4882a593Smuzhiyun 
1273*4882a593Smuzhiyun enum uniperif_word_pos {
1274*4882a593Smuzhiyun 	WORD_1_2,
1275*4882a593Smuzhiyun 	WORD_3_4,
1276*4882a593Smuzhiyun 	WORD_5_6,
1277*4882a593Smuzhiyun 	WORD_7_8,
1278*4882a593Smuzhiyun 	WORD_MAX
1279*4882a593Smuzhiyun };
1280*4882a593Smuzhiyun 
1281*4882a593Smuzhiyun struct uniperif_iec958_settings {
1282*4882a593Smuzhiyun 	enum uniperif_iec958_encoding_mode encoding_mode;
1283*4882a593Smuzhiyun 	struct snd_aes_iec958 iec958;
1284*4882a593Smuzhiyun };
1285*4882a593Smuzhiyun 
1286*4882a593Smuzhiyun struct dai_tdm_slot {
1287*4882a593Smuzhiyun 	unsigned int mask;
1288*4882a593Smuzhiyun 	int slots;
1289*4882a593Smuzhiyun 	int slot_width;
1290*4882a593Smuzhiyun 	unsigned int avail_slots;
1291*4882a593Smuzhiyun };
1292*4882a593Smuzhiyun 
1293*4882a593Smuzhiyun struct uniperif {
1294*4882a593Smuzhiyun 	/* System information */
1295*4882a593Smuzhiyun 	enum uniperif_type type;
1296*4882a593Smuzhiyun 	int underflow_enabled; /* Underflow recovery mode */
1297*4882a593Smuzhiyun 	struct device *dev;
1298*4882a593Smuzhiyun 	int id; /* instance value of the uniperipheral IP */
1299*4882a593Smuzhiyun 	int ver; /* IP version, used by register access macros */
1300*4882a593Smuzhiyun 	struct regmap_field *clk_sel;
1301*4882a593Smuzhiyun 	struct regmap_field *valid_sel;
1302*4882a593Smuzhiyun 	spinlock_t irq_lock; /* use to prevent race condition with IRQ */
1303*4882a593Smuzhiyun 
1304*4882a593Smuzhiyun 	/* capabilities */
1305*4882a593Smuzhiyun 	const struct snd_pcm_hardware *hw;
1306*4882a593Smuzhiyun 
1307*4882a593Smuzhiyun 	/* Resources */
1308*4882a593Smuzhiyun 	struct resource *mem_region;
1309*4882a593Smuzhiyun 	void __iomem *base;
1310*4882a593Smuzhiyun 	unsigned long fifo_phys_address;
1311*4882a593Smuzhiyun 	int irq;
1312*4882a593Smuzhiyun 
1313*4882a593Smuzhiyun 	/* Clocks */
1314*4882a593Smuzhiyun 	struct clk *clk;
1315*4882a593Smuzhiyun 	int mclk;
1316*4882a593Smuzhiyun 	int clk_adj;
1317*4882a593Smuzhiyun 
1318*4882a593Smuzhiyun 	/* Runtime data */
1319*4882a593Smuzhiyun 	enum uniperif_state state;
1320*4882a593Smuzhiyun 
1321*4882a593Smuzhiyun 	struct snd_pcm_substream *substream;
1322*4882a593Smuzhiyun 
1323*4882a593Smuzhiyun 	/* Specific to IEC958 player */
1324*4882a593Smuzhiyun 	struct uniperif_iec958_settings stream_settings;
1325*4882a593Smuzhiyun 	struct mutex ctrl_lock; /* For resource updated by stream and controls*/
1326*4882a593Smuzhiyun 
1327*4882a593Smuzhiyun 	/*alsa ctrl*/
1328*4882a593Smuzhiyun 	struct snd_kcontrol_new *snd_ctrls;
1329*4882a593Smuzhiyun 	int num_ctrls;
1330*4882a593Smuzhiyun 
1331*4882a593Smuzhiyun 	/* dai properties */
1332*4882a593Smuzhiyun 	unsigned int daifmt;
1333*4882a593Smuzhiyun 	struct dai_tdm_slot tdm_slot;
1334*4882a593Smuzhiyun 
1335*4882a593Smuzhiyun 	/* DAI callbacks */
1336*4882a593Smuzhiyun 	const struct snd_soc_dai_ops *dai_ops;
1337*4882a593Smuzhiyun };
1338*4882a593Smuzhiyun 
1339*4882a593Smuzhiyun struct sti_uniperiph_dai {
1340*4882a593Smuzhiyun 	int stream;
1341*4882a593Smuzhiyun 	struct uniperif *uni;
1342*4882a593Smuzhiyun 	struct snd_dmaengine_dai_dma_data dma_data;
1343*4882a593Smuzhiyun };
1344*4882a593Smuzhiyun 
1345*4882a593Smuzhiyun struct sti_uniperiph_data {
1346*4882a593Smuzhiyun 	struct platform_device *pdev;
1347*4882a593Smuzhiyun 	struct snd_soc_dai_driver *dai;
1348*4882a593Smuzhiyun 	struct sti_uniperiph_dai dai_data;
1349*4882a593Smuzhiyun };
1350*4882a593Smuzhiyun 
1351*4882a593Smuzhiyun static __maybe_unused const struct snd_pcm_hardware uni_tdm_hw = {
1352*4882a593Smuzhiyun 	.info = SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER |
1353*4882a593Smuzhiyun 		SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_MMAP |
1354*4882a593Smuzhiyun 		SNDRV_PCM_INFO_MMAP_VALID,
1355*4882a593Smuzhiyun 
1356*4882a593Smuzhiyun 	.formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE,
1357*4882a593Smuzhiyun 
1358*4882a593Smuzhiyun 	.rates = SNDRV_PCM_RATE_CONTINUOUS,
1359*4882a593Smuzhiyun 	.rate_min = 8000,
1360*4882a593Smuzhiyun 	.rate_max = 48000,
1361*4882a593Smuzhiyun 
1362*4882a593Smuzhiyun 	.channels_min = 1,
1363*4882a593Smuzhiyun 	.channels_max = 32,
1364*4882a593Smuzhiyun 
1365*4882a593Smuzhiyun 	.periods_min = 2,
1366*4882a593Smuzhiyun 	.periods_max = 10,
1367*4882a593Smuzhiyun 
1368*4882a593Smuzhiyun 	.period_bytes_min = 128,
1369*4882a593Smuzhiyun 	.period_bytes_max = 64 * PAGE_SIZE,
1370*4882a593Smuzhiyun 	.buffer_bytes_max = 256 * PAGE_SIZE
1371*4882a593Smuzhiyun };
1372*4882a593Smuzhiyun 
1373*4882a593Smuzhiyun /* uniperiph player*/
1374*4882a593Smuzhiyun int uni_player_init(struct platform_device *pdev,
1375*4882a593Smuzhiyun 		    struct uniperif *uni_player);
1376*4882a593Smuzhiyun int uni_player_resume(struct uniperif *player);
1377*4882a593Smuzhiyun 
1378*4882a593Smuzhiyun /* uniperiph reader */
1379*4882a593Smuzhiyun int uni_reader_init(struct platform_device *pdev,
1380*4882a593Smuzhiyun 		    struct uniperif *uni_reader);
1381*4882a593Smuzhiyun 
1382*4882a593Smuzhiyun /* common */
1383*4882a593Smuzhiyun int sti_uniperiph_dai_set_fmt(struct snd_soc_dai *dai,
1384*4882a593Smuzhiyun 			      unsigned int fmt);
1385*4882a593Smuzhiyun 
1386*4882a593Smuzhiyun int sti_uniperiph_dai_hw_params(struct snd_pcm_substream *substream,
1387*4882a593Smuzhiyun 				struct snd_pcm_hw_params *params,
1388*4882a593Smuzhiyun 				struct snd_soc_dai *dai);
1389*4882a593Smuzhiyun 
sti_uniperiph_get_user_frame_size(struct snd_pcm_runtime * runtime)1390*4882a593Smuzhiyun static inline int sti_uniperiph_get_user_frame_size(
1391*4882a593Smuzhiyun 	struct snd_pcm_runtime *runtime)
1392*4882a593Smuzhiyun {
1393*4882a593Smuzhiyun 	return (runtime->channels * snd_pcm_format_width(runtime->format) / 8);
1394*4882a593Smuzhiyun }
1395*4882a593Smuzhiyun 
sti_uniperiph_get_unip_tdm_frame_size(struct uniperif * uni)1396*4882a593Smuzhiyun static inline int sti_uniperiph_get_unip_tdm_frame_size(struct uniperif *uni)
1397*4882a593Smuzhiyun {
1398*4882a593Smuzhiyun 	return (uni->tdm_slot.slots * uni->tdm_slot.slot_width / 8);
1399*4882a593Smuzhiyun }
1400*4882a593Smuzhiyun 
1401*4882a593Smuzhiyun int  sti_uniperiph_reset(struct uniperif *uni);
1402*4882a593Smuzhiyun 
1403*4882a593Smuzhiyun int sti_uniperiph_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
1404*4882a593Smuzhiyun 			       unsigned int rx_mask, int slots,
1405*4882a593Smuzhiyun 			       int slot_width);
1406*4882a593Smuzhiyun 
1407*4882a593Smuzhiyun int sti_uniperiph_get_tdm_word_pos(struct uniperif *uni,
1408*4882a593Smuzhiyun 				   unsigned int *word_pos);
1409*4882a593Smuzhiyun 
1410*4882a593Smuzhiyun int sti_uniperiph_fix_tdm_chan(struct snd_pcm_hw_params *params,
1411*4882a593Smuzhiyun 			       struct snd_pcm_hw_rule *rule);
1412*4882a593Smuzhiyun 
1413*4882a593Smuzhiyun int sti_uniperiph_fix_tdm_format(struct snd_pcm_hw_params *params,
1414*4882a593Smuzhiyun 				 struct snd_pcm_hw_rule *rule);
1415*4882a593Smuzhiyun 
1416*4882a593Smuzhiyun #endif
1417