xref: /openbmc/linux/sound/soc/sti/uniperif.h (revision 00a82008)
1af873fceSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2e1ecace6SArnaud Pouliquen /*
3e1ecace6SArnaud Pouliquen  * Copyright (C) STMicroelectronics SA 2015
4e1ecace6SArnaud Pouliquen  * Authors: Arnaud Pouliquen <arnaud.pouliquen@st.com>
5e1ecace6SArnaud Pouliquen  *          for STMicroelectronics.
6e1ecace6SArnaud Pouliquen  */
7e1ecace6SArnaud Pouliquen 
8e1ecace6SArnaud Pouliquen #ifndef __SND_ST_AUD_UNIPERIF_H
9e1ecace6SArnaud Pouliquen #define __SND_ST_AUD_UNIPERIF_H
10e1ecace6SArnaud Pouliquen 
11e1ecace6SArnaud Pouliquen #include <linux/regmap.h>
12e1ecace6SArnaud Pouliquen 
1376c2145dSArnaud Pouliquen #include <sound/dmaengine_pcm.h>
1476c2145dSArnaud Pouliquen 
15e1ecace6SArnaud Pouliquen /*
16e1ecace6SArnaud Pouliquen  * Register access macros
17e1ecace6SArnaud Pouliquen  */
18e1ecace6SArnaud Pouliquen 
19e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_REG(ip, offset, shift, mask) \
20e1ecace6SArnaud Pouliquen 	((readl_relaxed(ip->base + offset) >> shift) & mask)
21e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_REG(ip, offset, shift, mask, value) \
22e1ecace6SArnaud Pouliquen 	writel_relaxed(((readl_relaxed(ip->base + offset) & \
23e1ecace6SArnaud Pouliquen 	~(mask << shift)) | (((value) & mask) << shift)), ip->base + offset)
24e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_BIT_REG(ip, offset, shift, mask, value) \
25e1ecace6SArnaud Pouliquen 	writel_relaxed((((value) & mask) << shift), ip->base + offset)
26e1ecace6SArnaud Pouliquen 
27e1ecace6SArnaud Pouliquen /*
285ba10dd4SMoise Gergaud  * UNIPERIF_SOFT_RST reg
29e1ecace6SArnaud Pouliquen  */
30e1ecace6SArnaud Pouliquen 
31e1ecace6SArnaud Pouliquen #define UNIPERIF_SOFT_RST_OFFSET(ip) 0x0000
32e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_SOFT_RST(ip) \
33e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? \
34e1ecace6SArnaud Pouliquen 		readl_relaxed(ip->base + UNIPERIF_SOFT_RST_OFFSET(ip)) : 0)
35e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_SOFT_RST(ip, value) \
36e1ecace6SArnaud Pouliquen 	writel_relaxed(value, ip->base + UNIPERIF_SOFT_RST_OFFSET(ip))
37e1ecace6SArnaud Pouliquen 
38e1ecace6SArnaud Pouliquen /* SOFT_RST */
39e1ecace6SArnaud Pouliquen #define UNIPERIF_SOFT_RST_SOFT_RST_SHIFT(ip) 0x0
40e1ecace6SArnaud Pouliquen #define UNIPERIF_SOFT_RST_SOFT_RST_MASK(ip) 0x1
41e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_SOFT_RST_SOFT_RST(ip) \
42e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_BIT_REG(ip, \
43e1ecace6SArnaud Pouliquen 		UNIPERIF_SOFT_RST_OFFSET(ip), \
44e1ecace6SArnaud Pouliquen 		UNIPERIF_SOFT_RST_SOFT_RST_SHIFT(ip), \
45e1ecace6SArnaud Pouliquen 		UNIPERIF_SOFT_RST_SOFT_RST_MASK(ip), 1)
46e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_SOFT_RST_SOFT_RST(ip) \
47e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
48e1ecace6SArnaud Pouliquen 		UNIPERIF_SOFT_RST_OFFSET(ip), \
49e1ecace6SArnaud Pouliquen 		UNIPERIF_SOFT_RST_SOFT_RST_SHIFT(ip), \
50e1ecace6SArnaud Pouliquen 		UNIPERIF_SOFT_RST_SOFT_RST_MASK(ip))
51e1ecace6SArnaud Pouliquen 
52e1ecace6SArnaud Pouliquen /*
535ba10dd4SMoise Gergaud  * UNIPERIF_FIFO_DATA reg
54e1ecace6SArnaud Pouliquen  */
55e1ecace6SArnaud Pouliquen 
56e1ecace6SArnaud Pouliquen #define UNIPERIF_FIFO_DATA_OFFSET(ip) 0x0004
57e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_DATA(ip, value) \
58e1ecace6SArnaud Pouliquen 	writel_relaxed(value, ip->base + UNIPERIF_FIFO_DATA_OFFSET(ip))
59e1ecace6SArnaud Pouliquen 
60e1ecace6SArnaud Pouliquen /*
615ba10dd4SMoise Gergaud  * UNIPERIF_CHANNEL_STA_REGN reg
62e1ecace6SArnaud Pouliquen  */
63e1ecace6SArnaud Pouliquen 
64e1ecace6SArnaud Pouliquen #define UNIPERIF_CHANNEL_STA_REGN(ip, n) (0x0060 + (4 * n))
65e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CHANNEL_STA_REGN(ip) \
66e1ecace6SArnaud Pouliquen 	readl_relaxed(ip->base + UNIPERIF_CHANNEL_STA_REGN(ip, n))
67e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CHANNEL_STA_REGN(ip, n, value) \
68e1ecace6SArnaud Pouliquen 	writel_relaxed(value, ip->base + \
69e1ecace6SArnaud Pouliquen 			UNIPERIF_CHANNEL_STA_REGN(ip, n))
70e1ecace6SArnaud Pouliquen 
71e1ecace6SArnaud Pouliquen #define UNIPERIF_CHANNEL_STA_REG0_OFFSET(ip) 0x0060
72e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CHANNEL_STA_REG0(ip) \
73e1ecace6SArnaud Pouliquen 	readl_relaxed(ip->base + UNIPERIF_CHANNEL_STA_REG0_OFFSET(ip))
74e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CHANNEL_STA_REG0(ip, value) \
75e1ecace6SArnaud Pouliquen 	writel_relaxed(value, ip->base + UNIPERIF_CHANNEL_STA_REG0_OFFSET(ip))
76e1ecace6SArnaud Pouliquen 
77e1ecace6SArnaud Pouliquen #define UNIPERIF_CHANNEL_STA_REG1_OFFSET(ip) 0x0064
78e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CHANNEL_STA_REG1(ip) \
79e1ecace6SArnaud Pouliquen 	readl_relaxed(ip->base + UNIPERIF_CHANNEL_STA_REG1_OFFSET(ip))
80e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CHANNEL_STA_REG1(ip, value) \
81e1ecace6SArnaud Pouliquen 	writel_relaxed(value, ip->base + UNIPERIF_CHANNEL_STA_REG1_OFFSET(ip))
82e1ecace6SArnaud Pouliquen 
83e1ecace6SArnaud Pouliquen #define UNIPERIF_CHANNEL_STA_REG2_OFFSET(ip) 0x0068
84e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CHANNEL_STA_REG2(ip) \
85e1ecace6SArnaud Pouliquen 	readl_relaxed(ip->base + UNIPERIF_CHANNEL_STA_REG2_OFFSET(ip))
86e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CHANNEL_STA_REG2(ip, value) \
87e1ecace6SArnaud Pouliquen 	writel_relaxed(value, ip->base + UNIPERIF_CHANNEL_STA_REG2_OFFSET(ip))
88e1ecace6SArnaud Pouliquen 
89e1ecace6SArnaud Pouliquen #define UNIPERIF_CHANNEL_STA_REG3_OFFSET(ip) 0x006C
90e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CHANNEL_STA_REG3(ip) \
91e1ecace6SArnaud Pouliquen 	readl_relaxed(ip->base + UNIPERIF_CHANNEL_STA_REG3_OFFSET(ip))
92e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CHANNEL_STA_REG3(ip, value) \
93e1ecace6SArnaud Pouliquen 	writel_relaxed(value, ip->base + UNIPERIF_CHANNEL_STA_REG3_OFFSET(ip))
94e1ecace6SArnaud Pouliquen 
95e1ecace6SArnaud Pouliquen #define UNIPERIF_CHANNEL_STA_REG4_OFFSET(ip) 0x0070
96e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CHANNEL_STA_REG4(ip) \
97e1ecace6SArnaud Pouliquen 	readl_relaxed(ip->base + UNIPERIF_CHANNEL_STA_REG4_OFFSET(ip))
98e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CHANNEL_STA_REG4(ip, value) \
99e1ecace6SArnaud Pouliquen 	writel_relaxed(value, ip->base + UNIPERIF_CHANNEL_STA_REG4_OFFSET(ip))
100e1ecace6SArnaud Pouliquen 
101e1ecace6SArnaud Pouliquen #define UNIPERIF_CHANNEL_STA_REG5_OFFSET(ip) 0x0074
102e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CHANNEL_STA_REG5(ip) \
103e1ecace6SArnaud Pouliquen 	readl_relaxed(ip->base + UNIPERIF_CHANNEL_STA_REG5_OFFSET(ip))
104e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CHANNEL_STA_REG5(ip, value) \
105e1ecace6SArnaud Pouliquen 	writel_relaxed(value, ip->base + UNIPERIF_CHANNEL_STA_REG5_OFFSET(ip))
106e1ecace6SArnaud Pouliquen 
107e1ecace6SArnaud Pouliquen /*
1085ba10dd4SMoise Gergaud  *  UNIPERIF_ITS reg
109e1ecace6SArnaud Pouliquen  */
110e1ecace6SArnaud Pouliquen 
111e1ecace6SArnaud Pouliquen #define UNIPERIF_ITS_OFFSET(ip) 0x000C
112e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_ITS(ip) \
113e1ecace6SArnaud Pouliquen 	readl_relaxed(ip->base + UNIPERIF_ITS_OFFSET(ip))
114e1ecace6SArnaud Pouliquen 
115e1ecace6SArnaud Pouliquen /* MEM_BLK_READ */
116e1ecace6SArnaud Pouliquen #define UNIPERIF_ITS_MEM_BLK_READ_SHIFT(ip) 5
117e1ecace6SArnaud Pouliquen #define UNIPERIF_ITS_MEM_BLK_READ_MASK(ip) \
118e1ecace6SArnaud Pouliquen 	(BIT(UNIPERIF_ITS_MEM_BLK_READ_SHIFT(ip)))
119e1ecace6SArnaud Pouliquen 
120e1ecace6SArnaud Pouliquen /* FIFO_ERROR */
121e1ecace6SArnaud Pouliquen #define UNIPERIF_ITS_FIFO_ERROR_SHIFT(ip) \
122e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 0 : 8)
123e1ecace6SArnaud Pouliquen #define UNIPERIF_ITS_FIFO_ERROR_MASK(ip) \
124e1ecace6SArnaud Pouliquen 	(BIT(UNIPERIF_ITS_FIFO_ERROR_SHIFT(ip)))
125e1ecace6SArnaud Pouliquen 
126e1ecace6SArnaud Pouliquen /* DMA_ERROR */
127e1ecace6SArnaud Pouliquen #define UNIPERIF_ITS_DMA_ERROR_SHIFT(ip) 9
128e1ecace6SArnaud Pouliquen #define UNIPERIF_ITS_DMA_ERROR_MASK(ip) \
129e1ecace6SArnaud Pouliquen 	(BIT(UNIPERIF_ITS_DMA_ERROR_SHIFT(ip)))
130e1ecace6SArnaud Pouliquen 
131e1ecace6SArnaud Pouliquen /* UNDERFLOW_REC_DONE */
132e1ecace6SArnaud Pouliquen #define UNIPERIF_ITS_UNDERFLOW_REC_DONE_SHIFT(ip) \
133e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? -1 : 12)
134e1ecace6SArnaud Pouliquen #define UNIPERIF_ITS_UNDERFLOW_REC_DONE_MASK(ip) \
135e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? \
136e1ecace6SArnaud Pouliquen 		0 : (BIT(UNIPERIF_ITS_UNDERFLOW_REC_DONE_SHIFT(ip))))
137e1ecace6SArnaud Pouliquen 
138e1ecace6SArnaud Pouliquen /* UNDERFLOW_REC_FAILED */
139e1ecace6SArnaud Pouliquen #define UNIPERIF_ITS_UNDERFLOW_REC_FAILED_SHIFT(ip) \
140e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? -1 : 13)
141e1ecace6SArnaud Pouliquen #define UNIPERIF_ITS_UNDERFLOW_REC_FAILED_MASK(ip) \
142e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? \
143e1ecace6SArnaud Pouliquen 		0 : (BIT(UNIPERIF_ITS_UNDERFLOW_REC_FAILED_SHIFT(ip))))
144e1ecace6SArnaud Pouliquen 
145e1ecace6SArnaud Pouliquen /*
1465ba10dd4SMoise Gergaud  *  UNIPERIF_ITS_BCLR reg
147e1ecace6SArnaud Pouliquen  */
148e1ecace6SArnaud Pouliquen 
149e1ecace6SArnaud Pouliquen /* FIFO_ERROR */
150e1ecace6SArnaud Pouliquen #define UNIPERIF_ITS_BCLR_FIFO_ERROR_SHIFT(ip) \
151e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 0 : 8)
152e1ecace6SArnaud Pouliquen #define UNIPERIF_ITS_BCLR_FIFO_ERROR_MASK(ip) \
153e1ecace6SArnaud Pouliquen 	(BIT(UNIPERIF_ITS_BCLR_FIFO_ERROR_SHIFT(ip)))
154e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_ITS_BCLR_FIFO_ERROR(ip) \
155e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_ITS_BCLR(ip, \
156e1ecace6SArnaud Pouliquen 		UNIPERIF_ITS_BCLR_FIFO_ERROR_MASK(ip))
157e1ecace6SArnaud Pouliquen 
158e1ecace6SArnaud Pouliquen #define UNIPERIF_ITS_BCLR_OFFSET(ip) 0x0010
159e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_ITS_BCLR(ip, value) \
160e1ecace6SArnaud Pouliquen 	writel_relaxed(value, ip->base + UNIPERIF_ITS_BCLR_OFFSET(ip))
161e1ecace6SArnaud Pouliquen 
162e1ecace6SArnaud Pouliquen /*
1635ba10dd4SMoise Gergaud  *  UNIPERIF_ITM reg
164e1ecace6SArnaud Pouliquen  */
165e1ecace6SArnaud Pouliquen 
166e1ecace6SArnaud Pouliquen #define UNIPERIF_ITM_OFFSET(ip) 0x0018
167e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_ITM(ip) \
168e1ecace6SArnaud Pouliquen 	readl_relaxed(ip->base + UNIPERIF_ITM_OFFSET(ip))
169e1ecace6SArnaud Pouliquen 
170e1ecace6SArnaud Pouliquen /* FIFO_ERROR */
171e1ecace6SArnaud Pouliquen #define UNIPERIF_ITM_FIFO_ERROR_SHIFT(ip) \
172e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 0 : 8)
173e1ecace6SArnaud Pouliquen #define UNIPERIF_ITM_FIFO_ERROR_MASK(ip) \
174e1ecace6SArnaud Pouliquen 	(BIT(UNIPERIF_ITM_FIFO_ERROR_SHIFT(ip)))
175e1ecace6SArnaud Pouliquen 
176e1ecace6SArnaud Pouliquen /* UNDERFLOW_REC_DONE */
177e1ecace6SArnaud Pouliquen #define UNIPERIF_ITM_UNDERFLOW_REC_DONE_SHIFT(ip) \
178e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? -1 : 12)
179e1ecace6SArnaud Pouliquen #define UNIPERIF_ITM_UNDERFLOW_REC_DONE_MASK(ip) \
180e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? \
181e1ecace6SArnaud Pouliquen 		0 : (BIT(UNIPERIF_ITM_UNDERFLOW_REC_DONE_SHIFT(ip))))
182e1ecace6SArnaud Pouliquen 
183e1ecace6SArnaud Pouliquen /* UNDERFLOW_REC_FAILED */
184e1ecace6SArnaud Pouliquen #define UNIPERIF_ITM_UNDERFLOW_REC_FAILED_SHIFT(ip) \
185e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? -1 : 13)
186e1ecace6SArnaud Pouliquen #define UNIPERIF_ITM_UNDERFLOW_REC_FAILED_MASK(ip) \
187e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? \
188e1ecace6SArnaud Pouliquen 		0 : (BIT(UNIPERIF_ITM_UNDERFLOW_REC_FAILED_SHIFT(ip))))
189e1ecace6SArnaud Pouliquen 
190e1ecace6SArnaud Pouliquen /*
1915ba10dd4SMoise Gergaud  *  UNIPERIF_ITM_BCLR reg
192e1ecace6SArnaud Pouliquen  */
193e1ecace6SArnaud Pouliquen 
194e1ecace6SArnaud Pouliquen #define UNIPERIF_ITM_BCLR_OFFSET(ip) 0x001c
195e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_ITM_BCLR(ip, value) \
196e1ecace6SArnaud Pouliquen 	writel_relaxed(value, ip->base + UNIPERIF_ITM_BCLR_OFFSET(ip))
197e1ecace6SArnaud Pouliquen 
198e1ecace6SArnaud Pouliquen /* FIFO_ERROR */
199e1ecace6SArnaud Pouliquen #define UNIPERIF_ITM_BCLR_FIFO_ERROR_SHIFT(ip) \
200e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 0 : 8)
201e1ecace6SArnaud Pouliquen #define UNIPERIF_ITM_BCLR_FIFO_ERROR_MASK(ip) \
202e1ecace6SArnaud Pouliquen 	(BIT(UNIPERIF_ITM_BCLR_FIFO_ERROR_SHIFT(ip)))
203e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_ITM_BCLR_FIFO_ERROR(ip) \
204e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_ITM_BCLR(ip, \
205e1ecace6SArnaud Pouliquen 		UNIPERIF_ITM_BCLR_FIFO_ERROR_MASK(ip))
206e1ecace6SArnaud Pouliquen 
207e1ecace6SArnaud Pouliquen /* DMA_ERROR */
208e1ecace6SArnaud Pouliquen #define UNIPERIF_ITM_BCLR_DMA_ERROR_SHIFT(ip) 9
209e1ecace6SArnaud Pouliquen #define UNIPERIF_ITM_BCLR_DMA_ERROR_MASK(ip) \
210e1ecace6SArnaud Pouliquen 	(BIT(UNIPERIF_ITM_BCLR_DMA_ERROR_SHIFT(ip)))
211e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_ITM_BCLR_DMA_ERROR(ip) \
212e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_ITM_BCLR(ip, \
213e1ecace6SArnaud Pouliquen 		UNIPERIF_ITM_BCLR_DMA_ERROR_MASK(ip))
214e1ecace6SArnaud Pouliquen 
215e1ecace6SArnaud Pouliquen /*
2165ba10dd4SMoise Gergaud  *  UNIPERIF_ITM_BSET reg
217e1ecace6SArnaud Pouliquen  */
218e1ecace6SArnaud Pouliquen 
219e1ecace6SArnaud Pouliquen #define UNIPERIF_ITM_BSET_OFFSET(ip) 0x0020
220e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_ITM_BSET(ip, value) \
221e1ecace6SArnaud Pouliquen 	writel_relaxed(value, ip->base + UNIPERIF_ITM_BSET_OFFSET(ip))
222e1ecace6SArnaud Pouliquen 
223e1ecace6SArnaud Pouliquen /* FIFO_ERROR */
224e1ecace6SArnaud Pouliquen #define UNIPERIF_ITM_BSET_FIFO_ERROR_SHIFT(ip) \
225e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 0 : 8)
226e1ecace6SArnaud Pouliquen #define UNIPERIF_ITM_BSET_FIFO_ERROR_MASK(ip) \
227e1ecace6SArnaud Pouliquen 	(BIT(UNIPERIF_ITM_BSET_FIFO_ERROR_SHIFT(ip)))
228e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_ITM_BSET_FIFO_ERROR(ip) \
229e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_ITM_BSET(ip, \
230e1ecace6SArnaud Pouliquen 		UNIPERIF_ITM_BSET_FIFO_ERROR_MASK(ip))
231e1ecace6SArnaud Pouliquen 
232e1ecace6SArnaud Pouliquen /* MEM_BLK_READ */
233e1ecace6SArnaud Pouliquen #define UNIPERIF_ITM_BSET_MEM_BLK_READ_SHIFT(ip) 5
234e1ecace6SArnaud Pouliquen #define UNIPERIF_ITM_BSET_MEM_BLK_READ_MASK(ip) \
235e1ecace6SArnaud Pouliquen 	(BIT(UNIPERIF_ITM_BSET_MEM_BLK_READ_SHIFT(ip)))
236e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_ITM_BSET_MEM_BLK_READ(ip) \
237e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_ITM_BSET(ip, \
238e1ecace6SArnaud Pouliquen 		UNIPERIF_ITM_BSET_MEM_BLK_READ_MASK(ip))
239e1ecace6SArnaud Pouliquen 
240e1ecace6SArnaud Pouliquen /* DMA_ERROR */
241e1ecace6SArnaud Pouliquen #define UNIPERIF_ITM_BSET_DMA_ERROR_SHIFT(ip) 9
242e1ecace6SArnaud Pouliquen #define UNIPERIF_ITM_BSET_DMA_ERROR_MASK(ip) \
243e1ecace6SArnaud Pouliquen 	(BIT(UNIPERIF_ITM_BSET_DMA_ERROR_SHIFT(ip)))
244e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_ITM_BSET_DMA_ERROR(ip) \
245e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_ITM_BSET(ip, \
246e1ecace6SArnaud Pouliquen 		UNIPERIF_ITM_BSET_DMA_ERROR_MASK(ip))
247e1ecace6SArnaud Pouliquen 
248e1ecace6SArnaud Pouliquen /* UNDERFLOW_REC_DONE */
249e1ecace6SArnaud Pouliquen #define UNIPERIF_ITM_BSET_UNDERFLOW_REC_DONE_SHIFT(ip) \
250e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? -1 : 12)
251e1ecace6SArnaud Pouliquen #define UNIPERIF_ITM_BSET_UNDERFLOW_REC_DONE_MASK(ip) \
252e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? \
253e1ecace6SArnaud Pouliquen 		0 : (BIT(UNIPERIF_ITM_BSET_UNDERFLOW_REC_DONE_SHIFT(ip))))
254e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_ITM_BSET_UNDERFLOW_REC_DONE(ip) \
255e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_ITM_BSET(ip, \
256e1ecace6SArnaud Pouliquen 		UNIPERIF_ITM_BSET_UNDERFLOW_REC_DONE_MASK(ip))
257e1ecace6SArnaud Pouliquen 
258e1ecace6SArnaud Pouliquen /* UNDERFLOW_REC_FAILED */
259e1ecace6SArnaud Pouliquen #define UNIPERIF_ITM_BSET_UNDERFLOW_REC_FAILED_SHIFT(ip) \
260e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? -1 : 13)
261e1ecace6SArnaud Pouliquen #define UNIPERIF_ITM_BSET_UNDERFLOW_REC_FAILED_MASK(ip) \
262e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? \
263e1ecace6SArnaud Pouliquen 		0 : (BIT(UNIPERIF_ITM_BSET_UNDERFLOW_REC_FAILED_SHIFT(ip))))
264e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_ITM_BSET_UNDERFLOW_REC_FAILED(ip) \
265e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_ITM_BSET(ip, \
266e1ecace6SArnaud Pouliquen 		UNIPERIF_ITM_BSET_UNDERFLOW_REC_FAILED_MASK(ip))
267e1ecace6SArnaud Pouliquen 
268e1ecace6SArnaud Pouliquen /*
269e1ecace6SArnaud Pouliquen  * UNIPERIF_CONFIG reg
270e1ecace6SArnaud Pouliquen  */
271e1ecace6SArnaud Pouliquen 
272e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_OFFSET(ip) 0x0040
273e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CONFIG(ip) \
274e1ecace6SArnaud Pouliquen 	readl_relaxed(ip->base + UNIPERIF_CONFIG_OFFSET(ip))
275e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG(ip, value) \
276e1ecace6SArnaud Pouliquen 	writel_relaxed(value, ip->base + UNIPERIF_CONFIG_OFFSET(ip))
277e1ecace6SArnaud Pouliquen 
278e1ecace6SArnaud Pouliquen /* PARITY_CNTR */
279e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_PARITY_CNTR_SHIFT(ip) 0
280e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_PARITY_CNTR_MASK(ip) 0x1
281e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CONFIG_PARITY_CNTR(ip) \
282e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
283e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
284e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_PARITY_CNTR_SHIFT(ip), \
285e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_PARITY_CNTR_MASK(ip))
286e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_PARITY_CNTR_BY_HW(ip) \
287e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
288e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
289e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_PARITY_CNTR_SHIFT(ip), \
290e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_PARITY_CNTR_MASK(ip), 0)
291e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_PARITY_CNTR_BY_SW(ip) \
292e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
293e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
294e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_PARITY_CNTR_SHIFT(ip), \
295e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_PARITY_CNTR_MASK(ip), 1)
296e1ecace6SArnaud Pouliquen 
297e1ecace6SArnaud Pouliquen /* CHANNEL_STA_CNTR */
298e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_CHANNEL_STA_CNTR_SHIFT(ip) 1
299e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_CHANNEL_STA_CNTR_MASK(ip) 0x1
300e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CONFIG_CHANNEL_STA_CNTR(ip) \
301e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
302e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
303e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_CHANNEL_STA_CNTR_SHIFT(ip), \
304e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_CHANNEL_STA_CNTR_MASK(ip))
305e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_CHANNEL_STA_CNTR_BY_SW(ip) \
306e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
307e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
308e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_CHANNEL_STA_CNTR_SHIFT(ip), \
309e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_CHANNEL_STA_CNTR_MASK(ip), 0)
310e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_CHANNEL_STA_CNTR_BY_HW(ip) \
311e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
312e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip),    \
313e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_CHANNEL_STA_CNTR_SHIFT(ip), \
314e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_CHANNEL_STA_CNTR_MASK(ip), 1)
315e1ecace6SArnaud Pouliquen 
316e1ecace6SArnaud Pouliquen /* USER_DAT_CNTR */
317e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_USER_DAT_CNTR_SHIFT(ip) 2
318e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_USER_DAT_CNTR_MASK(ip) 0x1
319e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CONFIG_USER_DAT_CNTR(ip) \
320e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
321e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
322e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_USER_DAT_CNTR_SHIFT(ip), \
323e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_USER_DAT_CNTR_MASK(ip))
324e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_USER_DAT_CNTR_BY_HW(ip) \
325e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
326e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
327e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_USER_DAT_CNTR_SHIFT(ip), \
328e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_USER_DAT_CNTR_MASK(ip), 1)
329e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_USER_DAT_CNTR_BY_SW(ip) \
330e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
331e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
332e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_USER_DAT_CNTR_SHIFT(ip), \
333e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_USER_DAT_CNTR_MASK(ip), 0)
334e1ecace6SArnaud Pouliquen 
335e1ecace6SArnaud Pouliquen /* VALIDITY_DAT_CNTR */
336e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_VALIDITY_DAT_CNTR_SHIFT(ip) 3
337e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_VALIDITY_DAT_CNTR_MASK(ip) 0x1
338e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CONFIG_VALIDITY_DAT_CNTR(ip) \
339e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
340e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
341e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_VALIDITY_DAT_CNTR_SHIFT(ip), \
342e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_VALIDITY_DAT_CNTR_MASK(ip))
343e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_VALIDITY_DAT_CNTR_BY_SW(ip) \
344e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
345e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
346e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_VALIDITY_DAT_CNTR_SHIFT(ip), \
347e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_VALIDITY_DAT_CNTR_MASK(ip), 0)
348e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_VALIDITY_DAT_CNTR_BY_HW(ip) \
349e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
350e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
351e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_VALIDITY_DAT_CNTR_SHIFT(ip), \
352e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_VALIDITY_DAT_CNTR_MASK(ip), 1)
353e1ecace6SArnaud Pouliquen 
354e1ecace6SArnaud Pouliquen /* ONE_BIT_AUD_SUPPORT */
355e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_ONE_BIT_AUD_SHIFT(ip) 4
356e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_ONE_BIT_AUD_MASK(ip) 0x1
357e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CONFIG_ONE_BIT_AUD(ip) \
358e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
359e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
360e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_ONE_BIT_AUD_SHIFT(ip), \
361e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_ONE_BIT_AUD_MASK(ip))
362e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_ONE_BIT_AUD_DISABLE(ip) \
363e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
364e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
365e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_ONE_BIT_AUD_SHIFT(ip), \
366e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_ONE_BIT_AUD_MASK(ip), 0)
367e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_ONE_BIT_AUD_ENABLE(ip) \
368e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
369e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
370e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_ONE_BIT_AUD_SHIFT(ip), \
371e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_ONE_BIT_AUD_MASK(ip), 1)
372e1ecace6SArnaud Pouliquen 
373e1ecace6SArnaud Pouliquen /* MEMORY_FMT */
374e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_MEM_FMT_SHIFT(ip) 5
375e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_MEM_FMT_MASK(ip) 0x1
376e1ecace6SArnaud Pouliquen #define VALUE_UNIPERIF_CONFIG_MEM_FMT_16_0(ip) 0
377e1ecace6SArnaud Pouliquen #define VALUE_UNIPERIF_CONFIG_MEM_FMT_16_16(ip) 1
378e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CONFIG_MEM_FMT(ip) \
379e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
380e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
381e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_MEM_FMT_SHIFT(ip), \
382e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_MEM_FMT_MASK(ip))
383e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_MEM_FMT(ip, value)	\
384e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
385e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
386e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_MEM_FMT_SHIFT(ip), \
387e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_MEM_FMT_MASK(ip), value)
388e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_MEM_FMT_16_0(ip)   \
389e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_CONFIG_MEM_FMT(ip, \
390e1ecace6SArnaud Pouliquen 		VALUE_UNIPERIF_CONFIG_MEM_FMT_16_0(ip))
391e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_MEM_FMT_16_16(ip) \
392e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_CONFIG_MEM_FMT(ip, \
393e1ecace6SArnaud Pouliquen 		VALUE_UNIPERIF_CONFIG_MEM_FMT_16_16(ip))
394e1ecace6SArnaud Pouliquen 
395e1ecace6SArnaud Pouliquen /* REPEAT_CHL_STS */
396e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_REPEAT_CHL_STS_SHIFT(ip) 6
397e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_REPEAT_CHL_STS_MASK(ip) 0x1
398e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CONFIG_REPEAT_CHL_STS(ip) \
399e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
400e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
401e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_REPEAT_CHL_STS_SHIFT(ip), \
402e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_REPEAT_CHL_STS_MASK(ip))
403e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_REPEAT_CHL_STS_ENABLE(ip) \
404e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
405e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
406e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_REPEAT_CHL_STS_SHIFT(ip), \
407e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_REPEAT_CHL_STS_MASK(ip), 0)
408e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_REPEAT_CHL_STS_DISABLE(ip) \
409e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
410e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
411e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_REPEAT_CHL_STS_SHIFT(ip), \
412e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_REPEAT_CHL_STS_MASK(ip), 1)
413e1ecace6SArnaud Pouliquen 
414e1ecace6SArnaud Pouliquen /* BACK_STALL_REQ */
415e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_BACK_STALL_REQ_SHIFT(ip) \
416e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 7 : -1)
417e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_BACK_STALL_REQ_MASK(ip) 0x1
418e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CONFIG_BACK_STALL_REQ(ip) \
419e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
420e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
421e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_BACK_STALL_REQ_SHIFT(ip), \
422e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_BACK_STALL_REQ_MASK(ip))
423e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_BACK_STALL_REQ_DISABLE(ip) \
424e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
425e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
426e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_BACK_STALL_REQ_SHIFT(ip), \
427e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_BACK_STALL_REQ_MASK(ip), 0)
428e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_BACK_STALL_REQ_ENABLE(ip) \
429e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
430e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
431e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_BACK_STALL_REQ_SHIFT(ip), \
432e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_BACK_STALL_REQ_MASK(ip), 1)
433e1ecace6SArnaud Pouliquen 
434e1ecace6SArnaud Pouliquen /* FDMA_TRIGGER_LIMIT */
435e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_DMA_TRIG_LIMIT_SHIFT(ip) 8
436e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_DMA_TRIG_LIMIT_MASK(ip) 0x7F
437e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CONFIG_DMA_TRIG_LIMIT(ip) \
438e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
439e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
440e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_DMA_TRIG_LIMIT_SHIFT(ip), \
441e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_DMA_TRIG_LIMIT_MASK(ip))
442e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_DMA_TRIG_LIMIT(ip, value) \
443e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
444e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
445e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_DMA_TRIG_LIMIT_SHIFT(ip), \
446e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_DMA_TRIG_LIMIT_MASK(ip), value)
447e1ecace6SArnaud Pouliquen 
448e1ecace6SArnaud Pouliquen /* CHL_STS_UPDATE */
449e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_CHL_STS_UPDATE_SHIFT(ip) \
450e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 16 : -1)
451e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_CHL_STS_UPDATE_MASK(ip) 0x1
452e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CONFIG_CHL_STS_UPDATE(ip) \
453e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
454e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip),  \
455e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_CHL_STS_UPDATE_SHIFT(ip), \
456e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_CHL_STS_UPDATE_MASK(ip))
457e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_CHL_STS_UPDATE(ip) \
458e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
459e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
460e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_CHL_STS_UPDATE_SHIFT(ip), \
461e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_CHL_STS_UPDATE_MASK(ip), 1)
462e1ecace6SArnaud Pouliquen 
463e1ecace6SArnaud Pouliquen /* IDLE_MOD */
464e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_IDLE_MOD_SHIFT(ip) 18
465e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_IDLE_MOD_MASK(ip) 0x1
466e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CONFIG_IDLE_MOD(ip) \
467e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
468e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
469e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_IDLE_MOD_SHIFT(ip), \
470e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_IDLE_MOD_MASK(ip))
471e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_IDLE_MOD_DISABLE(ip) \
472e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
473e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
474e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_IDLE_MOD_SHIFT(ip), \
475e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_IDLE_MOD_MASK(ip), 0)
476e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_IDLE_MOD_ENABLE(ip) \
477e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
478e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
479e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_IDLE_MOD_SHIFT(ip), \
480e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_IDLE_MOD_MASK(ip), 1)
481e1ecace6SArnaud Pouliquen 
482e1ecace6SArnaud Pouliquen /* SUBFRAME_SELECTION */
483e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_SUBFRAME_SEL_SHIFT(ip) 19
484e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_SUBFRAME_SEL_MASK(ip) 0x1
485e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CONFIG_SUBFRAME_SEL(ip) \
486e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
487e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
488e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_SUBFRAME_SEL_SHIFT(ip), \
489e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_SUBFRAME_SEL_MASK(ip))
490e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_SUBFRAME_SEL_SUBF1_SUBF0(ip) \
491e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
492e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
493e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_SUBFRAME_SEL_SHIFT(ip), \
494e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_SUBFRAME_SEL_MASK(ip), 1)
495e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_SUBFRAME_SEL_SUBF0_SUBF1(ip) \
496e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
497e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
498e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_SUBFRAME_SEL_SHIFT(ip), \
499e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_SUBFRAME_SEL_MASK(ip), 0)
500e1ecace6SArnaud Pouliquen 
501e1ecace6SArnaud Pouliquen /* FULL_SW_CONTROL */
502e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_SPDIF_SW_CTRL_SHIFT(ip) 20
503e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_SPDIF_SW_CTRL_MASK(ip) 0x1
504e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CONFIG_SPDIF_SW_CTRL(ip) \
505e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
506e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
507e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_SPDIF_SW_CTRL_SHIFT(ip), \
508e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_SPDIF_SW_CTRL_MASK(ip))
509e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_SPDIF_SW_CTRL_ENABLE(ip) \
510e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
511e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
512e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_SPDIF_SW_CTRL_SHIFT(ip), \
513e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_SPDIF_SW_CTRL_MASK(ip), 1)
514e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_SPDIF_SW_CTRL_DISABLE(ip) \
515e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
516e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
517e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_SPDIF_SW_CTRL_SHIFT(ip), \
518e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_SPDIF_SW_CTRL_MASK(ip), 0)
519e1ecace6SArnaud Pouliquen 
520e1ecace6SArnaud Pouliquen /* MASTER_CLKEDGE */
521e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_MSTR_CLKEDGE_SHIFT(ip) \
522e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 24 : -1)
523e1ecace6SArnaud Pouliquen #define UNIPERIF_CONFIG_MSTR_CLKEDGE_MASK(ip) 0x1
524e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CONFIG_MSTR_CLKEDGE(ip) \
525e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
526e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
527e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_MSTR_CLKEDGE_SHIFT(ip), \
528e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_MSTR_CLKEDGE_MASK(ip))
529e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_MSTR_CLKEDGE_FALLING(ip) \
530e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
531e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
532e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_MSTR_CLKEDGE_SHIFT(ip), \
533e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_MSTR_CLKEDGE_MASK(ip), 1)
534e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CONFIG_MSTR_CLKEDGE_RISING(ip) \
535e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
536e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_OFFSET(ip), \
537e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_MSTR_CLKEDGE_SHIFT(ip), \
538e1ecace6SArnaud Pouliquen 		UNIPERIF_CONFIG_MSTR_CLKEDGE_MASK(ip), 0)
539e1ecace6SArnaud Pouliquen 
540e1ecace6SArnaud Pouliquen /*
541e1ecace6SArnaud Pouliquen  * UNIPERIF_CTRL reg
542e1ecace6SArnaud Pouliquen  */
543e1ecace6SArnaud Pouliquen 
544e1ecace6SArnaud Pouliquen #define UNIPERIF_CTRL_OFFSET(ip) 0x0044
545e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CTRL(ip) \
546e1ecace6SArnaud Pouliquen 	readl_relaxed(ip->base + UNIPERIF_CTRL_OFFSET(ip))
547e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CTRL(ip, value) \
548e1ecace6SArnaud Pouliquen 	writel_relaxed(value, ip->base + UNIPERIF_CTRL_OFFSET(ip))
549e1ecace6SArnaud Pouliquen 
550e1ecace6SArnaud Pouliquen /* OPERATION */
551e1ecace6SArnaud Pouliquen #define UNIPERIF_CTRL_OPERATION_SHIFT(ip) 0
552e1ecace6SArnaud Pouliquen #define UNIPERIF_CTRL_OPERATION_MASK(ip) 0x7
553e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CTRL_OPERATION(ip) \
554e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
555e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
556e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OPERATION_SHIFT(ip), \
557e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OPERATION_MASK(ip))
558e1ecace6SArnaud Pouliquen #define VALUE_UNIPERIF_CTRL_OPERATION_OFF(ip) 0
559e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CTRL_OPERATION_OFF(ip) \
560e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
561e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
562e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OPERATION_SHIFT(ip), \
563e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OPERATION_MASK(ip), \
564e1ecace6SArnaud Pouliquen 		VALUE_UNIPERIF_CTRL_OPERATION_OFF(ip))
565e1ecace6SArnaud Pouliquen #define VALUE_UNIPERIF_CTRL_OPERATION_MUTE_PCM_NULL(ip) \
566e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 1 : -1)
567e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CTRL_OPERATION_MUTE_PCM_NULL(ip) \
568e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
569e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
570e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OPERATION_SHIFT(ip), \
571e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OPERATION_MASK(ip), \
572e1ecace6SArnaud Pouliquen 		VALUE_UNIPERIF_CTRL_OPERATION_MUTE_PCM_NULL(ip))
573e1ecace6SArnaud Pouliquen #define VALUE_UNIPERIF_CTRL_OPERATION_MUTE_PAUSE_BURST(ip) \
574e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 2 : -1)
575e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CTRL_OPERATION_MUTE_PAUSE_BURST(ip) \
576e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
577e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
578e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OPERATION_SHIFT(ip), \
579e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OPERATION_MASK(ip), \
580e1ecace6SArnaud Pouliquen 		VALUE_UNIPERIF_CTRL_OPERATION_MUTE_PAUSE_BURST(ip))
581e1ecace6SArnaud Pouliquen #define VALUE_UNIPERIF_CTRL_OPERATION_PCM_DATA(ip) 3
582e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CTRL_OPERATION_PCM_DATA(ip) \
583e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
584e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
585e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OPERATION_SHIFT(ip), \
586e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OPERATION_MASK(ip), \
587e1ecace6SArnaud Pouliquen 		VALUE_UNIPERIF_CTRL_OPERATION_PCM_DATA(ip))
588e1ecace6SArnaud Pouliquen /* This is the same as above! */
589e1ecace6SArnaud Pouliquen #define VALUE_UNIPERIF_CTRL_OPERATION_AUDIO_DATA(ip) 3
590e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CTRL_OPERATION_AUDIO_DATA(ip) \
591e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
592e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
593e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OPERATION_SHIFT(ip), \
594e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OPERATION_MASK(ip), \
595e1ecace6SArnaud Pouliquen 		VALUE_UNIPERIF_CTRL_OPERATION_AUDIO_DATA(ip))
596e1ecace6SArnaud Pouliquen #define VALUE_UNIPERIF_CTRL_OPERATION_ENC_DATA(ip) 4
597e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CTRL_OPERATION_ENC_DATA(ip) \
598e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
599e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
600e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OPERATION_SHIFT(ip), \
601e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OPERATION_MASK(ip), \
602e1ecace6SArnaud Pouliquen 		VALUE_UNIPERIF_CTRL_OPERATION_ENC_DATA(ip))
603e1ecace6SArnaud Pouliquen #define VALUE_UNIPERIF_CTRL_OPERATION_CD_DATA(ip) \
604e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 5 : -1)
605e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CTRL_OPERATION_CD_DATA(ip) \
606e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
607e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
608e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OPERATION_SHIFT(ip), \
609e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OPERATION_MASK(ip), \
610e1ecace6SArnaud Pouliquen 		VALUE_UNIPERIF_CTRL_OPERATION_CD_DATA(ip))
611e1ecace6SArnaud Pouliquen #define VALUE_UNIPERIF_CTRL_OPERATION_STANDBY(ip) \
612e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? -1 : 7)
613e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CTRL_OPERATION_STANDBY(ip) \
614e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
615e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
616e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OPERATION_SHIFT(ip), \
617e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OPERATION_MASK(ip), \
618e1ecace6SArnaud Pouliquen 		VALUE_UNIPERIF_CTRL_OPERATION_STANDBY(ip))
619e1ecace6SArnaud Pouliquen 
620e1ecace6SArnaud Pouliquen /* EXIT_STBY_ON_EOBLOCK */
621e1ecace6SArnaud Pouliquen #define UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_SHIFT(ip) \
622e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? -1 : 3)
623e1ecace6SArnaud Pouliquen #define UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_MASK(ip) 0x1
624e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK(ip) \
625e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
626e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
627e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_SHIFT(ip), \
628e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_MASK(ip))
629e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_OFF(ip) \
630e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
631e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
632e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_SHIFT(ip), \
633e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_MASK(ip), 0)
634e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_ON(ip) \
635e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
636e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
637e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_SHIFT(ip), \
638e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_EXIT_STBY_ON_EOBLOCK_MASK(ip), 1)
639e1ecace6SArnaud Pouliquen 
640e1ecace6SArnaud Pouliquen /* ROUNDING */
641e1ecace6SArnaud Pouliquen #define UNIPERIF_CTRL_ROUNDING_SHIFT(ip) 4
642e1ecace6SArnaud Pouliquen #define UNIPERIF_CTRL_ROUNDING_MASK(ip) 0x1
643e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CTRL_ROUNDING(ip) \
644e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
645e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
646e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_ROUNDING_SHIFT(ip), \
647e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_ROUNDING_MASK(ip))
648e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CTRL_ROUNDING_OFF(ip) \
649e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
650e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
651e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_ROUNDING_SHIFT(ip), \
652e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_ROUNDING_MASK(ip), 0)
653e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CTRL_ROUNDING_ON(ip) \
654e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
655e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
656e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_ROUNDING_SHIFT(ip), \
657e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_ROUNDING_MASK(ip), 1)
658e1ecace6SArnaud Pouliquen 
659e1ecace6SArnaud Pouliquen /* DIVIDER */
660e1ecace6SArnaud Pouliquen #define UNIPERIF_CTRL_DIVIDER_SHIFT(ip) 5
661e1ecace6SArnaud Pouliquen #define UNIPERIF_CTRL_DIVIDER_MASK(ip) 0xff
662e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CTRL_DIVIDER(ip) \
663e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
664e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
665e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_DIVIDER_SHIFT(ip), \
666e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_DIVIDER_MASK(ip))
667e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CTRL_DIVIDER(ip, value) \
668e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
669e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
670e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_DIVIDER_SHIFT(ip), \
671e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_DIVIDER_MASK(ip), value)
672e1ecace6SArnaud Pouliquen 
673e1ecace6SArnaud Pouliquen /* BYTE_SWAP */
674e1ecace6SArnaud Pouliquen #define UNIPERIF_CTRL_BYTE_SWP_SHIFT(ip) \
675e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 13 : -1)
676e1ecace6SArnaud Pouliquen #define UNIPERIF_CTRL_BYTE_SWP_MASK(ip) 0x1
677e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CTRL_BYTE_SWP(ip) \
678e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
679e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
680e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_BYTE_SWP_SHIFT(ip), \
681e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_BYTE_SWP_MASK(ip))
682e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CTRL_BYTE_SWP_OFF(ip) \
683e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
684e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
685e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_BYTE_SWP_SHIFT(ip), \
686e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_BYTE_SWP_MASK(ip), 0)
687e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CTRL_BYTE_SWP_ON(ip) \
688e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
689e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
690e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_BYTE_SWP_SHIFT(ip), \
691e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_BYTE_SWP_MASK(ip), 1)
692e1ecace6SArnaud Pouliquen 
693e1ecace6SArnaud Pouliquen /* ZERO_STUFFING_HW_SW */
694e1ecace6SArnaud Pouliquen #define UNIPERIF_CTRL_ZERO_STUFF_SHIFT(ip) \
695e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 14 : -1)
696e1ecace6SArnaud Pouliquen #define UNIPERIF_CTRL_ZERO_STUFF_MASK(ip) 0x1
697e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CTRL_ZERO_STUFF(ip) \
698e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
699e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
700e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_ZERO_STUFF_SHIFT(ip), \
701e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_ZERO_STUFF_MASK(ip))
702e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CTRL_ZERO_STUFF_HW(ip) \
703e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
704e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
705e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_ZERO_STUFF_SHIFT(ip), \
706e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_ZERO_STUFF_MASK(ip), 1)
707e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CTRL_ZERO_STUFF_SW(ip) \
708e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
709e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
710e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_ZERO_STUFF_SHIFT(ip), \
711e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_ZERO_STUFF_MASK(ip), 0)
712e1ecace6SArnaud Pouliquen 
713e1ecace6SArnaud Pouliquen /* SPDIF_LAT */
714e1ecace6SArnaud Pouliquen #define UNIPERIF_CTRL_SPDIF_LAT_SHIFT(ip) \
715e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 16 : -1)
716e1ecace6SArnaud Pouliquen #define UNIPERIF_CTRL_SPDIF_LAT_MASK(ip) 0x1
717e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CTRL_SPDIF_LAT(ip) \
718e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
719e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
720e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_SPDIF_LAT_SHIFT(ip), \
721e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_SPDIF_LAT_MASK(ip))
722e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CTRL_SPDIF_LAT_ON(ip) \
723e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
724e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
725e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_SPDIF_LAT_SHIFT(ip), \
726e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_SPDIF_LAT_MASK(ip), 1)
727e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CTRL_SPDIF_LAT_OFF(ip) \
728e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
729e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
730e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_SPDIF_LAT_SHIFT(ip), \
731e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_SPDIF_LAT_MASK(ip), 0)
732e1ecace6SArnaud Pouliquen 
733e1ecace6SArnaud Pouliquen /* EN_SPDIF_FORMATTING */
734e1ecace6SArnaud Pouliquen #define UNIPERIF_CTRL_SPDIF_FMT_SHIFT(ip) 17
735e1ecace6SArnaud Pouliquen #define UNIPERIF_CTRL_SPDIF_FMT_MASK(ip) 0x1
736e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CTRL_SPDIF_FMT(ip) \
737e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
738e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
739e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_SPDIF_FMT_SHIFT(ip), \
740e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_SPDIF_FMT_MASK(ip))
741e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CTRL_SPDIF_FMT_ON(ip) \
742e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
743e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
744e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_SPDIF_FMT_SHIFT(ip), \
745e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_SPDIF_FMT_MASK(ip), 1)
746e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CTRL_SPDIF_FMT_OFF(ip) \
747e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
748e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
749e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_SPDIF_FMT_SHIFT(ip), \
750e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_SPDIF_FMT_MASK(ip), 0)
751e1ecace6SArnaud Pouliquen 
752e1ecace6SArnaud Pouliquen /* READER_OUT_SELECT */
753e1ecace6SArnaud Pouliquen #define UNIPERIF_CTRL_READER_OUT_SEL_SHIFT(ip) \
754e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 18 : -1)
755e1ecace6SArnaud Pouliquen #define UNIPERIF_CTRL_READER_OUT_SEL_MASK(ip) 0x1
756e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CTRL_READER_OUT_SEL(ip) \
757e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
758e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
759e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_READER_OUT_SEL_SHIFT(ip), \
760e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_READER_OUT_SEL_MASK(ip))
761e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CTRL_READER_OUT_SEL_IN_MEM(ip) \
762e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
763e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
764e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_READER_OUT_SEL_SHIFT(ip), \
765e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_READER_OUT_SEL_MASK(ip), 0)
766e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CTRL_READER_OUT_SEL_ON_I2S_LINE(ip) \
767e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
768e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
769e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_READER_OUT_SEL_SHIFT(ip), \
7705ba10dd4SMoise Gergaud 		UNIPERIF_CTRL_READER_OUT_SEL_MASK(ip), 1)
771e1ecace6SArnaud Pouliquen 
772e1ecace6SArnaud Pouliquen /* UNDERFLOW_REC_WINDOW */
773e1ecace6SArnaud Pouliquen #define UNIPERIF_CTRL_UNDERFLOW_REC_WINDOW_SHIFT(ip) 20
774e1ecace6SArnaud Pouliquen #define UNIPERIF_CTRL_UNDERFLOW_REC_WINDOW_MASK(ip) 0xff
775e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CTRL_UNDERFLOW_REC_WINDOW(ip) \
776e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
777e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
778e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_UNDERFLOW_REC_WINDOW_SHIFT(ip), \
779e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_UNDERFLOW_REC_WINDOW_MASK(ip))
780e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CTRL_UNDERFLOW_REC_WINDOW(ip, value) \
781e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
782e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_OFFSET(ip), \
783e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_UNDERFLOW_REC_WINDOW_SHIFT(ip), \
784e1ecace6SArnaud Pouliquen 		UNIPERIF_CTRL_UNDERFLOW_REC_WINDOW_MASK(ip), value)
785e1ecace6SArnaud Pouliquen 
786e1ecace6SArnaud Pouliquen /*
787e1ecace6SArnaud Pouliquen  * UNIPERIF_I2S_FMT a.k.a UNIPERIF_FORMAT reg
788e1ecace6SArnaud Pouliquen  */
789e1ecace6SArnaud Pouliquen 
790e1ecace6SArnaud Pouliquen #define UNIPERIF_I2S_FMT_OFFSET(ip) 0x0048
791e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_I2S_FMT(ip) \
792e1ecace6SArnaud Pouliquen 	readl_relaxed(ip->base + UNIPERIF_I2S_FMT_OFFSET(ip))
793e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_I2S_FMT(ip, value) \
794e1ecace6SArnaud Pouliquen 	writel_relaxed(value, ip->base + UNIPERIF_I2S_FMT_OFFSET(ip))
795e1ecace6SArnaud Pouliquen 
796e1ecace6SArnaud Pouliquen /* NBIT */
797e1ecace6SArnaud Pouliquen #define UNIPERIF_I2S_FMT_NBIT_SHIFT(ip) 0
798e1ecace6SArnaud Pouliquen #define UNIPERIF_I2S_FMT_NBIT_MASK(ip) 0x1
799e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_I2S_FMT_NBIT(ip) \
800e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
801e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
802e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_NBIT_SHIFT(ip), \
803e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_NBIT_MASK(ip))
804e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_I2S_FMT_NBIT_32(ip) \
805e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
806e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
807e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_NBIT_SHIFT(ip), \
808e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_NBIT_MASK(ip), 0)
809e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_I2S_FMT_NBIT_16(ip) \
810e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
811e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
812e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_NBIT_SHIFT(ip), \
813e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_NBIT_MASK(ip), 1)
814e1ecace6SArnaud Pouliquen 
815e1ecace6SArnaud Pouliquen /* DATA_SIZE */
816e1ecace6SArnaud Pouliquen #define UNIPERIF_I2S_FMT_DATA_SIZE_SHIFT(ip) 1
817e1ecace6SArnaud Pouliquen #define UNIPERIF_I2S_FMT_DATA_SIZE_MASK(ip) 0x7
818e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_I2S_FMT_DATA_SIZE(ip) \
819e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
820e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
821e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_DATA_SIZE_SHIFT(ip), \
822e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_DATA_SIZE_MASK(ip))
823e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_I2S_FMT_DATA_SIZE_16(ip) \
824e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
825e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
826e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_DATA_SIZE_SHIFT(ip), \
827e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_DATA_SIZE_MASK(ip), 0)
828e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_I2S_FMT_DATA_SIZE_18(ip) \
829e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
830e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
831e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_DATA_SIZE_SHIFT(ip), \
832e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_DATA_SIZE_MASK(ip), 1)
833e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_I2S_FMT_DATA_SIZE_20(ip) \
834e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
835e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
836e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_DATA_SIZE_SHIFT(ip), \
837e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_DATA_SIZE_MASK(ip), 2)
838e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_I2S_FMT_DATA_SIZE_24(ip) \
839e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
840e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
841e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_DATA_SIZE_SHIFT(ip), \
842e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_DATA_SIZE_MASK(ip), 3)
843e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_I2S_FMTL_DATA_SIZE_28(ip) \
844e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
845e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
846e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_DATA_SIZE_SHIFT(ip), \
847e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_DATA_SIZE_MASK(ip), 4)
848e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_I2S_FMT_DATA_SIZE_32(ip) \
849e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
850e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
851e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_DATA_SIZE_SHIFT(ip), \
852e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_DATA_SIZE_MASK(ip), 5)
853e1ecace6SArnaud Pouliquen 
854e1ecace6SArnaud Pouliquen /* LR_POL */
855e1ecace6SArnaud Pouliquen #define UNIPERIF_I2S_FMT_LR_POL_SHIFT(ip) 4
856e1ecace6SArnaud Pouliquen #define UNIPERIF_I2S_FMT_LR_POL_MASK(ip) 0x1
857e1ecace6SArnaud Pouliquen #define VALUE_UNIPERIF_I2S_FMT_LR_POL_LOW(ip) 0x0
858e1ecace6SArnaud Pouliquen #define VALUE_UNIPERIF_I2S_FMT_LR_POL_HIG(ip) 0x1
859e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_I2S_FMT_LR_POL(ip) \
860e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
861e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
862e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_LR_POL_SHIFT(ip), \
863e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_LR_POL_MASK(ip))
864e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_I2S_FMT_LR_POL(ip, value) \
865e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
866e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
867e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_LR_POL_SHIFT(ip), \
868e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_LR_POL_MASK(ip), value)
869e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_I2S_FMT_LR_POL_LOW(ip) \
870e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_I2S_FMT_LR_POL(ip, \
871e1ecace6SArnaud Pouliquen 		VALUE_UNIPERIF_I2S_FMT_LR_POL_LOW(ip))
872e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_I2S_FMT_LR_POL_HIG(ip) \
873e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_I2S_FMT_LR_POL(ip, \
874e1ecace6SArnaud Pouliquen 		VALUE_UNIPERIF_I2S_FMT_LR_POL_HIG(ip))
875e1ecace6SArnaud Pouliquen 
876e1ecace6SArnaud Pouliquen /* SCLK_EDGE */
877e1ecace6SArnaud Pouliquen #define UNIPERIF_I2S_FMT_SCLK_EDGE_SHIFT(ip) 5
878e1ecace6SArnaud Pouliquen #define UNIPERIF_I2S_FMT_SCLK_EDGE_MASK(ip) 0x1
879e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_I2S_FMT_SCLK_EDGE(ip) \
880e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
881e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
882e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_SCLK_EDGE_SHIFT(ip), \
883e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_SCLK_EDGE_MASK(ip))
884e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_I2S_FMT_SCLK_EDGE_RISING(ip) \
885e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
886e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
887e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_SCLK_EDGE_SHIFT(ip), \
888e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_SCLK_EDGE_MASK(ip), 0)
889e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_I2S_FMT_SCLK_EDGE_FALLING(ip) \
890e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
891e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
892e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_SCLK_EDGE_SHIFT(ip), \
893e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_SCLK_EDGE_MASK(ip), 1)
894e1ecace6SArnaud Pouliquen 
895e1ecace6SArnaud Pouliquen /* PADDING */
896e1ecace6SArnaud Pouliquen #define UNIPERIF_I2S_FMT_PADDING_SHIFT(ip) 6
897e1ecace6SArnaud Pouliquen #define UNIPERIF_I2S_FMT_PADDING_MASK(ip) 0x1
898e1ecace6SArnaud Pouliquen #define UNIPERIF_I2S_FMT_PADDING_MASK(ip) 0x1
899e1ecace6SArnaud Pouliquen #define VALUE_UNIPERIF_I2S_FMT_PADDING_I2S_MODE(ip) 0x0
900e1ecace6SArnaud Pouliquen #define VALUE_UNIPERIF_I2S_FMT_PADDING_SONY_MODE(ip) 0x1
901e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_I2S_FMT_PADDING(ip) \
902e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
903e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
904e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_PADDING_SHIFT(ip), \
905e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_PADDING_MASK(ip))
906e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_I2S_FMT_PADDING(ip, value) \
907e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
908e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
909e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_PADDING_SHIFT(ip), \
910e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_PADDING_MASK(ip), value)
911e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_I2S_FMT_PADDING_I2S_MODE(ip) \
912e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_I2S_FMT_PADDING(ip, \
913e1ecace6SArnaud Pouliquen 		VALUE_UNIPERIF_I2S_FMT_PADDING_I2S_MODE(ip))
914e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_I2S_FMT_PADDING_SONY_MODE(ip) \
915e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_I2S_FMT_PADDING(ip, \
916e1ecace6SArnaud Pouliquen 		VALUE_UNIPERIF_I2S_FMT_PADDING_SONY_MODE(ip))
917e1ecace6SArnaud Pouliquen 
918e1ecace6SArnaud Pouliquen /* ALIGN */
919e1ecace6SArnaud Pouliquen #define UNIPERIF_I2S_FMT_ALIGN_SHIFT(ip) 7
920e1ecace6SArnaud Pouliquen #define UNIPERIF_I2S_FMT_ALIGN_MASK(ip) 0x1
921e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_I2S_FMT_ALIGN(ip) \
922e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
923e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
924e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_ALIGN_SHIFT(ip), \
925e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_ALIGN_MASK(ip))
926e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_I2S_FMT_ALIGN_LEFT(ip) \
927e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
928e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
929e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_ALIGN_SHIFT(ip), \
930e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_ALIGN_MASK(ip), 0)
931e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_I2S_FMT_ALIGN_RIGHT(ip) \
932e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
933e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
934e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_ALIGN_SHIFT(ip), \
935e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_ALIGN_MASK(ip), 1)
936e1ecace6SArnaud Pouliquen 
937e1ecace6SArnaud Pouliquen /* ORDER */
938e1ecace6SArnaud Pouliquen #define UNIPERIF_I2S_FMT_ORDER_SHIFT(ip) 8
939e1ecace6SArnaud Pouliquen #define UNIPERIF_I2S_FMT_ORDER_MASK(ip) 0x1
940e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_I2S_FMT_ORDER(ip) \
941e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
942e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
943e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_ORDER_SHIFT(ip), \
944e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_ORDER_MASK(ip))
945e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_I2S_FMT_ORDER_LSB(ip) \
946e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
947e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
948e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_ORDER_SHIFT(ip), \
949e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_ORDER_MASK(ip), 0)
950e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_I2S_FMT_ORDER_MSB(ip) \
951e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
952e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
953e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_ORDER_SHIFT(ip), \
954e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_ORDER_MASK(ip), 1)
955e1ecace6SArnaud Pouliquen 
956e1ecace6SArnaud Pouliquen /* NUM_CH */
957e1ecace6SArnaud Pouliquen #define UNIPERIF_I2S_FMT_NUM_CH_SHIFT(ip) 9
958e1ecace6SArnaud Pouliquen #define UNIPERIF_I2S_FMT_NUM_CH_MASK(ip) 0x7
959e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_I2S_FMT_NUM_CH(ip) \
960e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
961e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
962e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_NUM_CH_SHIFT(ip), \
963e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_NUM_CH_MASK(ip))
964e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_I2S_FMT_NUM_CH(ip, value) \
965e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
966e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
967e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_NUM_CH_SHIFT(ip), \
968e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_NUM_CH_MASK(ip), value)
969e1ecace6SArnaud Pouliquen 
970e1ecace6SArnaud Pouliquen /* NO_OF_SAMPLES_TO_READ */
971e1ecace6SArnaud Pouliquen #define UNIPERIF_I2S_FMT_NO_OF_SAMPLES_TO_READ_SHIFT(ip) 12
972e1ecace6SArnaud Pouliquen #define UNIPERIF_I2S_FMT_NO_OF_SAMPLES_TO_READ_MASK(ip) 0xfffff
973e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_I2S_FMT_NO_OF_SAMPLES_TO_READ(ip) \
974e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
975e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
976e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_NO_OF_SAMPLES_TO_READ_SHIFT(ip), \
977e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_NO_OF_SAMPLES_TO_READ_MASK(ip))
978e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_I2S_FMT_NO_OF_SAMPLES_TO_READ(ip, value) \
979e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
980e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_OFFSET(ip), \
981e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_NO_OF_SAMPLES_TO_READ_SHIFT(ip), \
982e1ecace6SArnaud Pouliquen 		UNIPERIF_I2S_FMT_NO_OF_SAMPLES_TO_READ_MASK(ip), value)
983e1ecace6SArnaud Pouliquen 
984e1ecace6SArnaud Pouliquen /*
985e1ecace6SArnaud Pouliquen  * UNIPERIF_BIT_CONTROL reg
986e1ecace6SArnaud Pouliquen  */
987e1ecace6SArnaud Pouliquen 
988e1ecace6SArnaud Pouliquen #define UNIPERIF_BIT_CONTROL_OFFSET(ip)  \
989e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? -1 : 0x004c)
990e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_BIT_CONTROL(ip) \
991e1ecace6SArnaud Pouliquen 	readl_relaxed(ip->base + UNIPERIF_BIT_CONTROL_OFFSET(ip))
992e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_BIT_CONTROL(ip, value) \
993e1ecace6SArnaud Pouliquen 	writel_relaxed(value, ip->base + UNIPERIF_BIT_CONTROL_OFFSET(ip))
994e1ecace6SArnaud Pouliquen 
995e1ecace6SArnaud Pouliquen /* CLR_UNDERFLOW_DURATION */
996e1ecace6SArnaud Pouliquen #define UNIPERIF_BIT_CONTROL_CLR_UNDERFLOW_DURATION_SHIFT(ip) 0
997e1ecace6SArnaud Pouliquen #define UNIPERIF_BIT_CONTROL_CLR_UNDERFLOW_DURATION_MASK(ip) 0x1
998e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_BIT_CONTROL_CLR_UNDERFLOW_DURATION(ip) \
999e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
1000e1ecace6SArnaud Pouliquen 		UNIPERIF_BIT_CONTROL_OFFSET(ip), \
1001e1ecace6SArnaud Pouliquen 		UNIPERIF_BIT_CONTROL_CLR_UNDERFLOW_DURATION_SHIFT(ip), \
1002e1ecace6SArnaud Pouliquen 		UNIPERIF_BIT_CONTROL_CLR_UNDERFLOW_DURATION_MASK(ip))
1003e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_BIT_CONTROL_CLR_UNDERFLOW_DURATION(ip) \
1004e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
1005e1ecace6SArnaud Pouliquen 		UNIPERIF_BIT_CONTROL_OFFSET(ip), \
1006e1ecace6SArnaud Pouliquen 		UNIPERIF_BIT_CONTROL_CLR_UNDERFLOW_DURATION_SHIFT(ip), \
1007e1ecace6SArnaud Pouliquen 		UNIPERIF_BIT_CONTROL_CLR_UNDERFLOW_DURATION_MASK(ip), 1)
1008e1ecace6SArnaud Pouliquen 
1009e1ecace6SArnaud Pouliquen /* CHL_STS_UPDATE */
1010e1ecace6SArnaud Pouliquen #define UNIPERIF_BIT_CONTROL_CHL_STS_UPDATE_SHIFT(ip) 1
1011e1ecace6SArnaud Pouliquen #define UNIPERIF_BIT_CONTROL_CHL_STS_UPDATE_MASK(ip) 0x1
1012e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_BIT_CONTROL_CHL_STS_UPDATE(ip) \
1013e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
1014e1ecace6SArnaud Pouliquen 		UNIPERIF_BIT_CONTROL_OFFSET(ip), \
1015e1ecace6SArnaud Pouliquen 		UNIPERIF_BIT_CONTROL_CHL_STS_UPDATE_SHIFT(ip), \
1016e1ecace6SArnaud Pouliquen 		UNIPERIF_BIT_CONTROL_CHL_STS_UPDATE_MASK(ip))
1017e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_BIT_CONTROL_CHL_STS_UPDATE(ip) \
1018e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_BIT_REG(ip, \
1019e1ecace6SArnaud Pouliquen 		UNIPERIF_BIT_CONTROL_OFFSET(ip), \
1020e1ecace6SArnaud Pouliquen 		UNIPERIF_BIT_CONTROL_CHL_STS_UPDATE_SHIFT(ip), \
1021e1ecace6SArnaud Pouliquen 		UNIPERIF_BIT_CONTROL_CHL_STS_UPDATE_MASK(ip), 1)
1022e1ecace6SArnaud Pouliquen 
1023e1ecace6SArnaud Pouliquen /*
1024e1ecace6SArnaud Pouliquen  * UNIPERIF_STATUS_1 reg
1025e1ecace6SArnaud Pouliquen  */
1026e1ecace6SArnaud Pouliquen 
1027e1ecace6SArnaud Pouliquen #define UNIPERIF_STATUS_1_OFFSET(ip) 0x0050
1028e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_STATUS_1(ip) \
1029e1ecace6SArnaud Pouliquen 	readl_relaxed(ip->base + UNIPERIF_STATUS_1_OFFSET(ip))
1030e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_STATUS_1(ip, value) \
1031e1ecace6SArnaud Pouliquen 	writel_relaxed(value, ip->base + UNIPERIF_STATUS_1_OFFSET(ip))
1032e1ecace6SArnaud Pouliquen 
1033e1ecace6SArnaud Pouliquen /* UNDERFLOW_DURATION */
1034e1ecace6SArnaud Pouliquen #define UNIPERIF_STATUS_1_UNDERFLOW_DURATION_SHIFT(ip) \
1035e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? -1 : 0)
1036e1ecace6SArnaud Pouliquen #define UNIPERIF_STATUS_1_UNDERFLOW_DURATION_MASK(ip) 0xff
1037e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_STATUS_1_UNDERFLOW_DURATION(ip) \
1038e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
1039e1ecace6SArnaud Pouliquen 		UNIPERIF_STATUS_1_OFFSET(ip), \
1040e1ecace6SArnaud Pouliquen 		UNIPERIF_STATUS_1_UNDERFLOW_DURATION_SHIFT(ip), \
1041e1ecace6SArnaud Pouliquen 		UNIPERIF_STATUS_1_UNDERFLOW_DURATION_MASK(ip))
1042e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_STATUS_1_UNDERFLOW_DURATION(ip, value) \
1043e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
1044e1ecace6SArnaud Pouliquen 		UNIPERIF_STATUS_1_OFFSET(ip), \
1045e1ecace6SArnaud Pouliquen 		UNIPERIF_STATUS_1_UNDERFLOW_DURATION_SHIFT(ip), \
1046e1ecace6SArnaud Pouliquen 		UNIPERIF_STATUS_1_UNDERFLOW_DURATION_MASK(ip), value)
1047e1ecace6SArnaud Pouliquen 
1048e1ecace6SArnaud Pouliquen /*
10495ba10dd4SMoise Gergaud  * UNIPERIF_CHANNEL_STA_REGN reg
1050e1ecace6SArnaud Pouliquen  */
1051e1ecace6SArnaud Pouliquen 
1052e1ecace6SArnaud Pouliquen #define UNIPERIF_CHANNEL_STA_REGN(ip, n) (0x0060 + (4 * n))
1053e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_CHANNEL_STA_REGN(ip) \
1054e1ecace6SArnaud Pouliquen 	readl_relaxed(ip->base + UNIPERIF_CHANNEL_STA_REGN(ip, n))
1055e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_CHANNEL_STA_REGN(ip, n, value) \
1056e1ecace6SArnaud Pouliquen 	writel_relaxed(value, ip->base + \
1057e1ecace6SArnaud Pouliquen 			UNIPERIF_CHANNEL_STA_REGN(ip, n))
1058e1ecace6SArnaud Pouliquen 
1059e1ecace6SArnaud Pouliquen /*
10605ba10dd4SMoise Gergaud  * UNIPERIF_USER_VALIDITY reg
1061e1ecace6SArnaud Pouliquen  */
1062e1ecace6SArnaud Pouliquen 
1063e1ecace6SArnaud Pouliquen #define UNIPERIF_USER_VALIDITY_OFFSET(ip) 0x0090
1064e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_USER_VALIDITY(ip) \
1065e1ecace6SArnaud Pouliquen 	readl_relaxed(ip->base + UNIPERIF_USER_VALIDITY_OFFSET(ip))
1066e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_USER_VALIDITY(ip, value) \
1067e1ecace6SArnaud Pouliquen 	writel_relaxed(value, ip->base + UNIPERIF_USER_VALIDITY_OFFSET(ip))
1068e1ecace6SArnaud Pouliquen 
1069e1ecace6SArnaud Pouliquen /* VALIDITY_LEFT_AND_RIGHT */
1070e1ecace6SArnaud Pouliquen #define UNIPERIF_USER_VALIDITY_VALIDITY_LR_SHIFT(ip) 0
1071e1ecace6SArnaud Pouliquen #define UNIPERIF_USER_VALIDITY_VALIDITY_LR_MASK(ip) 0x3
1072e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(ip) \
1073e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
1074e1ecace6SArnaud Pouliquen 		UNIPERIF_USER_VALIDITY_OFFSET(ip), \
1075e1ecace6SArnaud Pouliquen 		UNIPERIF_USER_VALIDITY_VALIDITY_LR_SHIFT(ip), \
1076e1ecace6SArnaud Pouliquen 		UNIPERIF_USER_VALIDITY_VALIDITY_LR_MASK(ip))
1077e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(ip, value) \
1078e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
1079e1ecace6SArnaud Pouliquen 		UNIPERIF_USER_VALIDITY_OFFSET(ip), \
1080e1ecace6SArnaud Pouliquen 		UNIPERIF_USER_VALIDITY_VALIDITY_LR_SHIFT(ip), \
1081e1ecace6SArnaud Pouliquen 		UNIPERIF_USER_VALIDITY_VALIDITY_LR_MASK(ip), \
1082e1ecace6SArnaud Pouliquen 		value ? 0x3 : 0)
1083e1ecace6SArnaud Pouliquen 
1084e1ecace6SArnaud Pouliquen /*
1085e1ecace6SArnaud Pouliquen  * UNIPERIF_DBG_STANDBY_LEFT_SP reg
1086e1ecace6SArnaud Pouliquen  */
1087e1ecace6SArnaud Pouliquen #define UNIPERIF_DBG_STANDBY_LEFT_SP_OFFSET(ip) 0x0150
1088e1ecace6SArnaud Pouliquen #define UNIPERIF_DBG_STANDBY_LEFT_SP_SHIFT(ip) \
1089e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? -1 : 0)
1090e1ecace6SArnaud Pouliquen #define UNIPERIF_DBG_STANDBY_LEFT_SP_MASK(ip) \
1091e1ecace6SArnaud Pouliquen 	((ip)->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0 ? 0 : 0xFFFFFF)
1092e1ecace6SArnaud Pouliquen #define GET_UNIPERIF_DBG_STANDBY_LEFT_SP(ip) \
1093e1ecace6SArnaud Pouliquen 	GET_UNIPERIF_REG(ip, \
1094e1ecace6SArnaud Pouliquen 		UNIPERIF_DBG_STANDBY_LEFT_SP_OFFSET(ip), \
1095e1ecace6SArnaud Pouliquen 		UNIPERIF_DBG_STANDBY_LEFT_SP_SHIFT(ip), \
1096e1ecace6SArnaud Pouliquen 		UNIPERIF_DBG_STANDBY_LEFT_SP_MASK(ip))
1097e1ecace6SArnaud Pouliquen #define SET_UNIPERIF_DBG_STANDBY_LEFT_SP(ip, value) \
1098e1ecace6SArnaud Pouliquen 	SET_UNIPERIF_REG(ip, \
1099e1ecace6SArnaud Pouliquen 		UNIPERIF_DBG_STANDBY_LEFT_SP_OFFSET(ip), \
1100e1ecace6SArnaud Pouliquen 		UNIPERIF_DBG_STANDBY_LEFT_SP_SHIFT(ip), \
1101e1ecace6SArnaud Pouliquen 		UNIPERIF_DBG_STANDBY_LEFT_SP_MASK(ip), value)
110276c2145dSArnaud Pouliquen 
110376c2145dSArnaud Pouliquen /*
110438535e8eSMoise Gergaud  * UNIPERIF_TDM_ENABLE
110538535e8eSMoise Gergaud  */
110638535e8eSMoise Gergaud #define UNIPERIF_TDM_ENABLE_OFFSET(ip) 0x0118
110738535e8eSMoise Gergaud #define GET_UNIPERIF_TDM_ENABLE(ip) \
110838535e8eSMoise Gergaud 	readl_relaxed(ip->base + UNIPERIF_TDM_ENABLE_OFFSET(ip))
110938535e8eSMoise Gergaud #define SET_UNIPERIF_TDM_ENABLE(ip, value) \
111038535e8eSMoise Gergaud 	writel_relaxed(value, ip->base + UNIPERIF_TDM_ENABLE_OFFSET(ip))
111138535e8eSMoise Gergaud 
111238535e8eSMoise Gergaud /* TDM_ENABLE */
111338535e8eSMoise Gergaud #define UNIPERIF_TDM_ENABLE_EN_TDM_SHIFT(ip) 0x0
111438535e8eSMoise Gergaud #define UNIPERIF_TDM_ENABLE_EN_TDM_MASK(ip) 0x1
111538535e8eSMoise Gergaud #define GET_UNIPERIF_TDM_ENABLE_EN_TDM(ip) \
111638535e8eSMoise Gergaud 		GET_UNIPERIF_REG(ip, \
111738535e8eSMoise Gergaud 		UNIPERIF_TDM_ENABLE_OFFSET(ip), \
111838535e8eSMoise Gergaud 		UNIPERIF_TDM_ENABLE_EN_TDM_SHIFT(ip), \
111938535e8eSMoise Gergaud 		UNIPERIF_TDM_ENABLE_EN_TDM_MASK(ip))
112038535e8eSMoise Gergaud #define SET_UNIPERIF_TDM_ENABLE_TDM_ENABLE(ip) \
112138535e8eSMoise Gergaud 		SET_UNIPERIF_REG(ip, \
112238535e8eSMoise Gergaud 		UNIPERIF_TDM_ENABLE_OFFSET(ip), \
112338535e8eSMoise Gergaud 		UNIPERIF_TDM_ENABLE_EN_TDM_SHIFT(ip), \
112438535e8eSMoise Gergaud 		UNIPERIF_TDM_ENABLE_EN_TDM_MASK(ip), 1)
112538535e8eSMoise Gergaud #define SET_UNIPERIF_TDM_ENABLE_TDM_DISABLE(ip) \
112638535e8eSMoise Gergaud 		SET_UNIPERIF_REG(ip, \
112738535e8eSMoise Gergaud 		UNIPERIF_TDM_ENABLE_OFFSET(ip), \
112838535e8eSMoise Gergaud 		UNIPERIF_TDM_ENABLE_EN_TDM_SHIFT(ip), \
112938535e8eSMoise Gergaud 		UNIPERIF_TDM_ENABLE_EN_TDM_MASK(ip), 0)
113038535e8eSMoise Gergaud 
113138535e8eSMoise Gergaud /*
113238535e8eSMoise Gergaud  * UNIPERIF_TDM_FS_REF_FREQ
113338535e8eSMoise Gergaud  */
113438535e8eSMoise Gergaud #define UNIPERIF_TDM_FS_REF_FREQ_OFFSET(ip) 0x011c
113538535e8eSMoise Gergaud #define GET_UNIPERIF_TDM_FS_REF_FREQ(ip) \
113638535e8eSMoise Gergaud 	readl_relaxed(ip->base + UNIPERIF_TDM_FS_REF_FREQ_OFFSET(ip))
113738535e8eSMoise Gergaud #define SET_UNIPERIF_TDM_FS_REF_FREQ(ip, value) \
113838535e8eSMoise Gergaud 	writel_relaxed(value, ip->base + \
113938535e8eSMoise Gergaud 			UNIPERIF_TDM_FS_REF_FREQ_OFFSET(ip))
114038535e8eSMoise Gergaud 
114138535e8eSMoise Gergaud /* REF_FREQ */
114238535e8eSMoise Gergaud #define UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ_SHIFT(ip) 0x0
114338535e8eSMoise Gergaud #define VALUE_UNIPERIF_TDM_FS_REF_FREQ_8KHZ(ip) 0
114438535e8eSMoise Gergaud #define VALUE_UNIPERIF_TDM_FS_REF_FREQ_16KHZ(ip) 1
114538535e8eSMoise Gergaud #define VALUE_UNIPERIF_TDM_FS_REF_FREQ_32KHZ(ip) 2
114638535e8eSMoise Gergaud #define VALUE_UNIPERIF_TDM_FS_REF_FREQ_48KHZ(ip) 3
114738535e8eSMoise Gergaud #define UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ_MASK(ip) 0x3
114838535e8eSMoise Gergaud #define GET_UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ(ip) \
114938535e8eSMoise Gergaud 		GET_UNIPERIF_REG(ip, \
115038535e8eSMoise Gergaud 		UNIPERIF_TDM_FS_REF_FREQ_OFFSET(ip), \
115138535e8eSMoise Gergaud 		UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ_SHIFT(ip), \
115238535e8eSMoise Gergaud 		UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ_MASK(ip))
115338535e8eSMoise Gergaud #define SET_UNIPERIF_TDM_FS_REF_FREQ_8KHZ(ip) \
115438535e8eSMoise Gergaud 		SET_UNIPERIF_REG(ip, \
115538535e8eSMoise Gergaud 		UNIPERIF_TDM_FS_REF_FREQ_OFFSET(ip), \
115638535e8eSMoise Gergaud 		UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ_SHIFT(ip), \
115738535e8eSMoise Gergaud 		UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ_MASK(ip), \
115838535e8eSMoise Gergaud 		VALUE_UNIPERIF_TDM_FS_REF_FREQ_8KHZ(ip))
115938535e8eSMoise Gergaud #define SET_UNIPERIF_TDM_FS_REF_FREQ_16KHZ(ip) \
116038535e8eSMoise Gergaud 		SET_UNIPERIF_REG(ip, \
116138535e8eSMoise Gergaud 		UNIPERIF_TDM_FS_REF_FREQ_OFFSET(ip), \
116238535e8eSMoise Gergaud 		UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ_SHIFT(ip), \
116338535e8eSMoise Gergaud 		UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ_MASK(ip), \
116438535e8eSMoise Gergaud 		VALUE_UNIPERIF_TDM_FS_REF_FREQ_16KHZ(ip))
116538535e8eSMoise Gergaud #define SET_UNIPERIF_TDM_FS_REF_FREQ_32KHZ(ip) \
116638535e8eSMoise Gergaud 		SET_UNIPERIF_REG(ip, \
116738535e8eSMoise Gergaud 		UNIPERIF_TDM_FS_REF_FREQ_OFFSET(ip), \
116838535e8eSMoise Gergaud 		UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ_SHIFT(ip), \
116938535e8eSMoise Gergaud 		UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ_MASK(ip), \
117038535e8eSMoise Gergaud 		VALUE_UNIPERIF_TDM_FS_REF_FREQ_32KHZ(ip))
117138535e8eSMoise Gergaud #define SET_UNIPERIF_TDM_FS_REF_FREQ_48KHZ(ip) \
117238535e8eSMoise Gergaud 		SET_UNIPERIF_REG(ip, \
117338535e8eSMoise Gergaud 		UNIPERIF_TDM_FS_REF_FREQ_OFFSET(ip), \
117438535e8eSMoise Gergaud 		UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ_SHIFT(ip), \
117538535e8eSMoise Gergaud 		UNIPERIF_TDM_FS_REF_FREQ_REF_FREQ_MASK(ip), \
117638535e8eSMoise Gergaud 		VALUE_UNIPERIF_TDM_FS_REF_FREQ_48KHZ(ip))
117738535e8eSMoise Gergaud 
117838535e8eSMoise Gergaud /*
117938535e8eSMoise Gergaud  * UNIPERIF_TDM_FS_REF_DIV
118038535e8eSMoise Gergaud  */
118138535e8eSMoise Gergaud #define UNIPERIF_TDM_FS_REF_DIV_OFFSET(ip) 0x0120
118238535e8eSMoise Gergaud #define GET_UNIPERIF_TDM_FS_REF_DIV(ip) \
118338535e8eSMoise Gergaud 	readl_relaxed(ip->base + UNIPERIF_TDM_FS_REF_DIV_OFFSET(ip))
118438535e8eSMoise Gergaud #define SET_UNIPERIF_TDM_FS_REF_DIV(ip, value) \
118538535e8eSMoise Gergaud 		writel_relaxed(value, ip->base + \
118638535e8eSMoise Gergaud 			UNIPERIF_TDM_FS_REF_DIV_OFFSET(ip))
118738535e8eSMoise Gergaud 
118838535e8eSMoise Gergaud /* NUM_TIMESLOT */
118938535e8eSMoise Gergaud #define UNIPERIF_TDM_FS_REF_DIV_NUM_TIMESLOT_SHIFT(ip) 0x0
119038535e8eSMoise Gergaud #define UNIPERIF_TDM_FS_REF_DIV_NUM_TIMESLOT_MASK(ip) 0xff
119138535e8eSMoise Gergaud #define GET_UNIPERIF_TDM_FS_REF_DIV_NUM_TIMESLOT(ip) \
119238535e8eSMoise Gergaud 		GET_UNIPERIF_REG(ip, \
119338535e8eSMoise Gergaud 		UNIPERIF_TDM_FS_REF_DIV_OFFSET(ip), \
119438535e8eSMoise Gergaud 		UNIPERIF_TDM_FS_REF_DIV_NUM_TIMESLOT_SHIFT(ip), \
119538535e8eSMoise Gergaud 		UNIPERIF_TDM_FS_REF_DIV_NUM_TIMESLOT_MASK(ip))
119638535e8eSMoise Gergaud #define SET_UNIPERIF_TDM_FS_REF_DIV_NUM_TIMESLOT(ip, value) \
119738535e8eSMoise Gergaud 		SET_UNIPERIF_REG(ip, \
119838535e8eSMoise Gergaud 		UNIPERIF_TDM_FS_REF_DIV_OFFSET(ip), \
119938535e8eSMoise Gergaud 		UNIPERIF_TDM_FS_REF_DIV_NUM_TIMESLOT_SHIFT(ip), \
120038535e8eSMoise Gergaud 		UNIPERIF_TDM_FS_REF_DIV_NUM_TIMESLOT_MASK(ip), value)
120138535e8eSMoise Gergaud 
120238535e8eSMoise Gergaud /*
120338535e8eSMoise Gergaud  * UNIPERIF_TDM_WORD_POS_X_Y
120438535e8eSMoise Gergaud  * 32 bits of UNIPERIF_TDM_WORD_POS_X_Y register shall be set in 1 shot
120538535e8eSMoise Gergaud  */
120638535e8eSMoise Gergaud #define UNIPERIF_TDM_WORD_POS_1_2_OFFSET(ip) 0x013c
120738535e8eSMoise Gergaud #define UNIPERIF_TDM_WORD_POS_3_4_OFFSET(ip) 0x0140
120838535e8eSMoise Gergaud #define UNIPERIF_TDM_WORD_POS_5_6_OFFSET(ip) 0x0144
120938535e8eSMoise Gergaud #define UNIPERIF_TDM_WORD_POS_7_8_OFFSET(ip) 0x0148
121038535e8eSMoise Gergaud #define GET_UNIPERIF_TDM_WORD_POS(ip, words) \
121138535e8eSMoise Gergaud 	readl_relaxed(ip->base + UNIPERIF_TDM_WORD_POS_##words##_OFFSET(ip))
121238535e8eSMoise Gergaud #define SET_UNIPERIF_TDM_WORD_POS(ip, words, value) \
121338535e8eSMoise Gergaud 		writel_relaxed(value, ip->base + \
121438535e8eSMoise Gergaud 		UNIPERIF_TDM_WORD_POS_##words##_OFFSET(ip))
121538535e8eSMoise Gergaud /*
121676c2145dSArnaud Pouliquen  * uniperipheral IP capabilities
121776c2145dSArnaud Pouliquen  */
121876c2145dSArnaud Pouliquen 
121976c2145dSArnaud Pouliquen #define UNIPERIF_FIFO_SIZE		70 /* FIFO is 70 cells deep */
122076c2145dSArnaud Pouliquen #define UNIPERIF_FIFO_FRAMES		4  /* FDMA trigger limit in frames */
122176c2145dSArnaud Pouliquen 
12225295a0dcSMoise Gergaud #define UNIPERIF_TYPE_IS_HDMI(p) \
12235a4326d1SArnaud Pouliquen 	((p)->type == SND_ST_UNIPERIF_TYPE_HDMI)
12245295a0dcSMoise Gergaud #define UNIPERIF_TYPE_IS_PCM(p) \
12255a4326d1SArnaud Pouliquen 	((p)->type == SND_ST_UNIPERIF_TYPE_PCM)
12265295a0dcSMoise Gergaud #define UNIPERIF_TYPE_IS_SPDIF(p) \
12275a4326d1SArnaud Pouliquen 	((p)->type == SND_ST_UNIPERIF_TYPE_SPDIF)
12285295a0dcSMoise Gergaud #define UNIPERIF_TYPE_IS_IEC958(p) \
12295295a0dcSMoise Gergaud 	(UNIPERIF_TYPE_IS_HDMI(p) || \
12305295a0dcSMoise Gergaud 		UNIPERIF_TYPE_IS_SPDIF(p))
12319a00a3e9SMoise Gergaud #define UNIPERIF_TYPE_IS_TDM(p) \
12325a4326d1SArnaud Pouliquen 	((p)->type == SND_ST_UNIPERIF_TYPE_TDM)
12339a00a3e9SMoise Gergaud 
123476c2145dSArnaud Pouliquen /*
123576c2145dSArnaud Pouliquen  * Uniperipheral IP revisions
123676c2145dSArnaud Pouliquen  */
123776c2145dSArnaud Pouliquen enum uniperif_version {
123876c2145dSArnaud Pouliquen 	SND_ST_UNIPERIF_VERSION_UNKNOWN,
123976c2145dSArnaud Pouliquen 	/* SASG1 (Orly), Newman */
124076c2145dSArnaud Pouliquen 	SND_ST_UNIPERIF_VERSION_C6AUD0_UNI_1_0,
124176c2145dSArnaud Pouliquen 	/* SASC1, SASG2 (Orly2) */
124276c2145dSArnaud Pouliquen 	SND_ST_UNIPERIF_VERSION_UNI_PLR_1_0,
124376c2145dSArnaud Pouliquen 	/* SASC1, SASG2 (Orly2), TELSS, Cannes */
124476c2145dSArnaud Pouliquen 	SND_ST_UNIPERIF_VERSION_UNI_RDR_1_0,
124576c2145dSArnaud Pouliquen 	/* TELSS (SASC1) */
124676c2145dSArnaud Pouliquen 	SND_ST_UNIPERIF_VERSION_TDM_PLR_1_0,
124776c2145dSArnaud Pouliquen 	/* Cannes/Monaco */
124876c2145dSArnaud Pouliquen 	SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0
124976c2145dSArnaud Pouliquen };
125076c2145dSArnaud Pouliquen 
125176c2145dSArnaud Pouliquen enum uniperif_type {
12525a4326d1SArnaud Pouliquen 	SND_ST_UNIPERIF_TYPE_NONE	= 0x00,
12535a4326d1SArnaud Pouliquen 	SND_ST_UNIPERIF_TYPE_HDMI	= 0x01,
12545a4326d1SArnaud Pouliquen 	SND_ST_UNIPERIF_TYPE_PCM	= 0x02,
12555a4326d1SArnaud Pouliquen 	SND_ST_UNIPERIF_TYPE_SPDIF	= 0x04,
12565a4326d1SArnaud Pouliquen 	SND_ST_UNIPERIF_TYPE_TDM	= 0x08
125776c2145dSArnaud Pouliquen };
125876c2145dSArnaud Pouliquen 
125976c2145dSArnaud Pouliquen enum uniperif_state {
126076c2145dSArnaud Pouliquen 	UNIPERIF_STATE_STOPPED,
126176c2145dSArnaud Pouliquen 	UNIPERIF_STATE_STARTED,
126276c2145dSArnaud Pouliquen 	UNIPERIF_STATE_STANDBY,
126376c2145dSArnaud Pouliquen 	UNIPERIF_STATE_UNDERFLOW,
126476c2145dSArnaud Pouliquen 	UNIPERIF_STATE_OVERFLOW = UNIPERIF_STATE_UNDERFLOW,
126576c2145dSArnaud Pouliquen 	UNIPERIF_STATE_XRUN
126676c2145dSArnaud Pouliquen };
126776c2145dSArnaud Pouliquen 
126876c2145dSArnaud Pouliquen enum uniperif_iec958_encoding_mode {
126976c2145dSArnaud Pouliquen 	UNIPERIF_IEC958_ENCODING_MODE_PCM,
127076c2145dSArnaud Pouliquen 	UNIPERIF_IEC958_ENCODING_MODE_ENCODED
127176c2145dSArnaud Pouliquen };
127276c2145dSArnaud Pouliquen 
127344f948bdSMoise Gergaud enum uniperif_word_pos {
127444f948bdSMoise Gergaud 	WORD_1_2,
127544f948bdSMoise Gergaud 	WORD_3_4,
127644f948bdSMoise Gergaud 	WORD_5_6,
127744f948bdSMoise Gergaud 	WORD_7_8,
127844f948bdSMoise Gergaud 	WORD_MAX
127944f948bdSMoise Gergaud };
128044f948bdSMoise Gergaud 
128176c2145dSArnaud Pouliquen struct uniperif_iec958_settings {
128276c2145dSArnaud Pouliquen 	enum uniperif_iec958_encoding_mode encoding_mode;
128376c2145dSArnaud Pouliquen 	struct snd_aes_iec958 iec958;
128476c2145dSArnaud Pouliquen };
128576c2145dSArnaud Pouliquen 
128644f948bdSMoise Gergaud struct dai_tdm_slot {
128744f948bdSMoise Gergaud 	unsigned int mask;
128844f948bdSMoise Gergaud 	int slots;
128944f948bdSMoise Gergaud 	int slot_width;
129044f948bdSMoise Gergaud 	unsigned int avail_slots;
129144f948bdSMoise Gergaud };
129244f948bdSMoise Gergaud 
129376c2145dSArnaud Pouliquen struct uniperif {
129476c2145dSArnaud Pouliquen 	/* System information */
12955a4326d1SArnaud Pouliquen 	enum uniperif_type type;
12965a4326d1SArnaud Pouliquen 	int underflow_enabled; /* Underflow recovery mode */
129776c2145dSArnaud Pouliquen 	struct device *dev;
12985a4326d1SArnaud Pouliquen 	int id; /* instance value of the uniperipheral IP */
129976c2145dSArnaud Pouliquen 	int ver; /* IP version, used by register access macros */
130076c2145dSArnaud Pouliquen 	struct regmap_field *clk_sel;
13013ee15cacSMoise Gergaud 	struct regmap_field *valid_sel;
1302d05d862eSArnaud Pouliquen 	spinlock_t irq_lock; /* use to prevent race condition with IRQ */
130376c2145dSArnaud Pouliquen 
130476c2145dSArnaud Pouliquen 	/* capabilities */
130576c2145dSArnaud Pouliquen 	const struct snd_pcm_hardware *hw;
130676c2145dSArnaud Pouliquen 
130776c2145dSArnaud Pouliquen 	/* Resources */
130876c2145dSArnaud Pouliquen 	struct resource *mem_region;
1309b917abb4SLars-Peter Clausen 	void __iomem *base;
131076c2145dSArnaud Pouliquen 	unsigned long fifo_phys_address;
131176c2145dSArnaud Pouliquen 	int irq;
131276c2145dSArnaud Pouliquen 
131376c2145dSArnaud Pouliquen 	/* Clocks */
131476c2145dSArnaud Pouliquen 	struct clk *clk;
131576c2145dSArnaud Pouliquen 	int mclk;
1316fa050796SArnaud Pouliquen 	int clk_adj;
131776c2145dSArnaud Pouliquen 
131876c2145dSArnaud Pouliquen 	/* Runtime data */
131976c2145dSArnaud Pouliquen 	enum uniperif_state state;
132076c2145dSArnaud Pouliquen 
132176c2145dSArnaud Pouliquen 	struct snd_pcm_substream *substream;
132276c2145dSArnaud Pouliquen 
132376c2145dSArnaud Pouliquen 	/* Specific to IEC958 player */
132476c2145dSArnaud Pouliquen 	struct uniperif_iec958_settings stream_settings;
1325fa050796SArnaud Pouliquen 	struct mutex ctrl_lock; /* For resource updated by stream and controls*/
132676c2145dSArnaud Pouliquen 
132776c2145dSArnaud Pouliquen 	/*alsa ctrl*/
132876c2145dSArnaud Pouliquen 	struct snd_kcontrol_new *snd_ctrls;
132976c2145dSArnaud Pouliquen 	int num_ctrls;
133076c2145dSArnaud Pouliquen 
133176c2145dSArnaud Pouliquen 	/* dai properties */
133276c2145dSArnaud Pouliquen 	unsigned int daifmt;
133344f948bdSMoise Gergaud 	struct dai_tdm_slot tdm_slot;
133476c2145dSArnaud Pouliquen 
133576c2145dSArnaud Pouliquen 	/* DAI callbacks */
133676c2145dSArnaud Pouliquen 	const struct snd_soc_dai_ops *dai_ops;
133776c2145dSArnaud Pouliquen };
133876c2145dSArnaud Pouliquen 
133976c2145dSArnaud Pouliquen struct sti_uniperiph_dai {
134076c2145dSArnaud Pouliquen 	int stream;
134176c2145dSArnaud Pouliquen 	struct uniperif *uni;
134276c2145dSArnaud Pouliquen 	struct snd_dmaengine_dai_dma_data dma_data;
134376c2145dSArnaud Pouliquen };
134476c2145dSArnaud Pouliquen 
134576c2145dSArnaud Pouliquen struct sti_uniperiph_data {
134676c2145dSArnaud Pouliquen 	struct platform_device *pdev;
134776c2145dSArnaud Pouliquen 	struct snd_soc_dai_driver *dai;
134876c2145dSArnaud Pouliquen 	struct sti_uniperiph_dai dai_data;
134976c2145dSArnaud Pouliquen };
135076c2145dSArnaud Pouliquen 
135197d73032SPierre-Louis Bossart static __maybe_unused const struct snd_pcm_hardware uni_tdm_hw = {
13529a00a3e9SMoise Gergaud 	.info = SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER |
13539a00a3e9SMoise Gergaud 		SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_MMAP |
13549a00a3e9SMoise Gergaud 		SNDRV_PCM_INFO_MMAP_VALID,
13559a00a3e9SMoise Gergaud 
13569a00a3e9SMoise Gergaud 	.formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE,
13579a00a3e9SMoise Gergaud 
13589a00a3e9SMoise Gergaud 	.rates = SNDRV_PCM_RATE_CONTINUOUS,
13599a00a3e9SMoise Gergaud 	.rate_min = 8000,
13609a00a3e9SMoise Gergaud 	.rate_max = 48000,
13619a00a3e9SMoise Gergaud 
13629a00a3e9SMoise Gergaud 	.channels_min = 1,
13639a00a3e9SMoise Gergaud 	.channels_max = 32,
13649a00a3e9SMoise Gergaud 
13659a00a3e9SMoise Gergaud 	.periods_min = 2,
13669a00a3e9SMoise Gergaud 	.periods_max = 10,
13679a00a3e9SMoise Gergaud 
13689a00a3e9SMoise Gergaud 	.period_bytes_min = 128,
13699a00a3e9SMoise Gergaud 	.period_bytes_max = 64 * PAGE_SIZE,
13709a00a3e9SMoise Gergaud 	.buffer_bytes_max = 256 * PAGE_SIZE
13719a00a3e9SMoise Gergaud };
13729a00a3e9SMoise Gergaud 
137376c2145dSArnaud Pouliquen /* uniperiph player*/
137476c2145dSArnaud Pouliquen int uni_player_init(struct platform_device *pdev,
1375*00a82008SPierre-Louis Bossart 		    struct uniperif *player);
137676c2145dSArnaud Pouliquen int uni_player_resume(struct uniperif *player);
137776c2145dSArnaud Pouliquen 
1378c3a0003aSArnaud Pouliquen /* uniperiph reader */
1379c3a0003aSArnaud Pouliquen int uni_reader_init(struct platform_device *pdev,
1380*00a82008SPierre-Louis Bossart 		    struct uniperif *reader);
1381f3bd847eSArnaud Pouliquen 
1382f3bd847eSArnaud Pouliquen /* common */
1383f3bd847eSArnaud Pouliquen int sti_uniperiph_dai_set_fmt(struct snd_soc_dai *dai,
1384f3bd847eSArnaud Pouliquen 			      unsigned int fmt);
1385f3bd847eSArnaud Pouliquen 
1386f3bd847eSArnaud Pouliquen int sti_uniperiph_dai_hw_params(struct snd_pcm_substream *substream,
1387f3bd847eSArnaud Pouliquen 				struct snd_pcm_hw_params *params,
1388f3bd847eSArnaud Pouliquen 				struct snd_soc_dai *dai);
1389f3bd847eSArnaud Pouliquen 
sti_uniperiph_get_user_frame_size(struct snd_pcm_runtime * runtime)13908d8b1e2eSMoise Gergaud static inline int sti_uniperiph_get_user_frame_size(
13918d8b1e2eSMoise Gergaud 	struct snd_pcm_runtime *runtime)
13928d8b1e2eSMoise Gergaud {
13938d8b1e2eSMoise Gergaud 	return (runtime->channels * snd_pcm_format_width(runtime->format) / 8);
13948d8b1e2eSMoise Gergaud }
13958d8b1e2eSMoise Gergaud 
sti_uniperiph_get_unip_tdm_frame_size(struct uniperif * uni)13968d8b1e2eSMoise Gergaud static inline int sti_uniperiph_get_unip_tdm_frame_size(struct uniperif *uni)
13978d8b1e2eSMoise Gergaud {
13988d8b1e2eSMoise Gergaud 	return (uni->tdm_slot.slots * uni->tdm_slot.slot_width / 8);
13998d8b1e2eSMoise Gergaud }
14008d8b1e2eSMoise Gergaud 
14014c88f89fSArnaud Pouliquen int  sti_uniperiph_reset(struct uniperif *uni);
14024c88f89fSArnaud Pouliquen 
140344f948bdSMoise Gergaud int sti_uniperiph_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
140444f948bdSMoise Gergaud 			       unsigned int rx_mask, int slots,
140544f948bdSMoise Gergaud 			       int slot_width);
140644f948bdSMoise Gergaud 
140744f948bdSMoise Gergaud int sti_uniperiph_get_tdm_word_pos(struct uniperif *uni,
140844f948bdSMoise Gergaud 				   unsigned int *word_pos);
140944f948bdSMoise Gergaud 
141072199787SMoise Gergaud int sti_uniperiph_fix_tdm_chan(struct snd_pcm_hw_params *params,
141172199787SMoise Gergaud 			       struct snd_pcm_hw_rule *rule);
141272199787SMoise Gergaud 
141372199787SMoise Gergaud int sti_uniperiph_fix_tdm_format(struct snd_pcm_hw_params *params,
141472199787SMoise Gergaud 				 struct snd_pcm_hw_rule *rule);
141572199787SMoise Gergaud 
141676c2145dSArnaud Pouliquen #endif
1417