xref: /OK3568_Linux_fs/kernel/sound/soc/tegra/tegra30_i2s.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * tegra30_i2s.h - Definitions for Tegra30 I2S driver
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (c) 2011,2012, NVIDIA CORPORATION.  All rights reserved.
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #ifndef __TEGRA30_I2S_H__
9*4882a593Smuzhiyun #define __TEGRA30_I2S_H__
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include "tegra_pcm.h"
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun /* Register offsets from TEGRA30_I2S*_BASE */
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL				0x0
16*4882a593Smuzhiyun #define TEGRA30_I2S_TIMING				0x4
17*4882a593Smuzhiyun #define TEGRA30_I2S_OFFSET				0x08
18*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL				0x0c
19*4882a593Smuzhiyun #define TEGRA30_I2S_SLOT_CTRL				0x10
20*4882a593Smuzhiyun #define TEGRA30_I2S_CIF_RX_CTRL				0x14
21*4882a593Smuzhiyun #define TEGRA30_I2S_CIF_TX_CTRL				0x18
22*4882a593Smuzhiyun #define TEGRA30_I2S_FLOWCTL				0x1c
23*4882a593Smuzhiyun #define TEGRA30_I2S_TX_STEP				0x20
24*4882a593Smuzhiyun #define TEGRA30_I2S_FLOW_STATUS				0x24
25*4882a593Smuzhiyun #define TEGRA30_I2S_FLOW_TOTAL				0x28
26*4882a593Smuzhiyun #define TEGRA30_I2S_FLOW_OVER				0x2c
27*4882a593Smuzhiyun #define TEGRA30_I2S_FLOW_UNDER				0x30
28*4882a593Smuzhiyun #define TEGRA30_I2S_LCOEF_1_4_0				0x34
29*4882a593Smuzhiyun #define TEGRA30_I2S_LCOEF_1_4_1				0x38
30*4882a593Smuzhiyun #define TEGRA30_I2S_LCOEF_1_4_2				0x3c
31*4882a593Smuzhiyun #define TEGRA30_I2S_LCOEF_1_4_3				0x40
32*4882a593Smuzhiyun #define TEGRA30_I2S_LCOEF_1_4_4				0x44
33*4882a593Smuzhiyun #define TEGRA30_I2S_LCOEF_1_4_5				0x48
34*4882a593Smuzhiyun #define TEGRA30_I2S_LCOEF_2_4_0				0x4c
35*4882a593Smuzhiyun #define TEGRA30_I2S_LCOEF_2_4_1				0x50
36*4882a593Smuzhiyun #define TEGRA30_I2S_LCOEF_2_4_2				0x54
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun /* Fields in TEGRA30_I2S_CTRL */
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_XFER_EN_TX			(1 << 31)
41*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_XFER_EN_RX			(1 << 30)
42*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_CG_EN				(1 << 29)
43*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_SOFT_RESET			(1 << 28)
44*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_TX_FLOWCTL_EN			(1 << 27)
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_OBS_SEL_SHIFT			24
47*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_OBS_SEL_MASK			(7 << TEGRA30_I2S_CTRL_OBS_SEL_SHIFT)
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun #define TEGRA30_I2S_FRAME_FORMAT_LRCK			0
50*4882a593Smuzhiyun #define TEGRA30_I2S_FRAME_FORMAT_FSYNC			1
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_FRAME_FORMAT_SHIFT		12
53*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_FRAME_FORMAT_MASK		(7                              << TEGRA30_I2S_CTRL_FRAME_FORMAT_SHIFT)
54*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_FRAME_FORMAT_LRCK		(TEGRA30_I2S_FRAME_FORMAT_LRCK  << TEGRA30_I2S_CTRL_FRAME_FORMAT_SHIFT)
55*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_FRAME_FORMAT_FSYNC		(TEGRA30_I2S_FRAME_FORMAT_FSYNC << TEGRA30_I2S_CTRL_FRAME_FORMAT_SHIFT)
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_MASTER_ENABLE			(1 << 10)
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun #define TEGRA30_I2S_LRCK_LEFT_LOW			0
60*4882a593Smuzhiyun #define TEGRA30_I2S_LRCK_RIGHT_LOW			1
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_LRCK_SHIFT			9
63*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_LRCK_MASK			(1                          << TEGRA30_I2S_CTRL_LRCK_SHIFT)
64*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_LRCK_L_LOW			(TEGRA30_I2S_LRCK_LEFT_LOW  << TEGRA30_I2S_CTRL_LRCK_SHIFT)
65*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_LRCK_R_LOW			(TEGRA30_I2S_LRCK_RIGHT_LOW << TEGRA30_I2S_CTRL_LRCK_SHIFT)
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_LPBK_ENABLE			(1 << 8)
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun #define TEGRA30_I2S_BIT_CODE_LINEAR			0
70*4882a593Smuzhiyun #define TEGRA30_I2S_BIT_CODE_ULAW			1
71*4882a593Smuzhiyun #define TEGRA30_I2S_BIT_CODE_ALAW			2
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_BIT_CODE_SHIFT			4
74*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_BIT_CODE_MASK			(3                           << TEGRA30_I2S_CTRL_BIT_CODE_SHIFT)
75*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_BIT_CODE_LINEAR		(TEGRA30_I2S_BIT_CODE_LINEAR << TEGRA30_I2S_CTRL_BIT_CODE_SHIFT)
76*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_BIT_CODE_ULAW			(TEGRA30_I2S_BIT_CODE_ULAW   << TEGRA30_I2S_CTRL_BIT_CODE_SHIFT)
77*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_BIT_CODE_ALAW			(TEGRA30_I2S_BIT_CODE_ALAW   << TEGRA30_I2S_CTRL_BIT_CODE_SHIFT)
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun #define TEGRA30_I2S_BITS_8				1
80*4882a593Smuzhiyun #define TEGRA30_I2S_BITS_12				2
81*4882a593Smuzhiyun #define TEGRA30_I2S_BITS_16				3
82*4882a593Smuzhiyun #define TEGRA30_I2S_BITS_20				4
83*4882a593Smuzhiyun #define TEGRA30_I2S_BITS_24				5
84*4882a593Smuzhiyun #define TEGRA30_I2S_BITS_28				6
85*4882a593Smuzhiyun #define TEGRA30_I2S_BITS_32				7
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun /* Sample container size; see {RX,TX}_MASK field in CH_CTRL below */
88*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_BIT_SIZE_SHIFT			0
89*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_BIT_SIZE_MASK			(7                   << TEGRA30_I2S_CTRL_BIT_SIZE_SHIFT)
90*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_BIT_SIZE_8			(TEGRA30_I2S_BITS_8  << TEGRA30_I2S_CTRL_BIT_SIZE_SHIFT)
91*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_BIT_SIZE_12			(TEGRA30_I2S_BITS_12 << TEGRA30_I2S_CTRL_BIT_SIZE_SHIFT)
92*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_BIT_SIZE_16			(TEGRA30_I2S_BITS_16 << TEGRA30_I2S_CTRL_BIT_SIZE_SHIFT)
93*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_BIT_SIZE_20			(TEGRA30_I2S_BITS_20 << TEGRA30_I2S_CTRL_BIT_SIZE_SHIFT)
94*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_BIT_SIZE_24			(TEGRA30_I2S_BITS_24 << TEGRA30_I2S_CTRL_BIT_SIZE_SHIFT)
95*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_BIT_SIZE_28			(TEGRA30_I2S_BITS_28 << TEGRA30_I2S_CTRL_BIT_SIZE_SHIFT)
96*4882a593Smuzhiyun #define TEGRA30_I2S_CTRL_BIT_SIZE_32			(TEGRA30_I2S_BITS_32 << TEGRA30_I2S_CTRL_BIT_SIZE_SHIFT)
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun /* Fields in TEGRA30_I2S_TIMING */
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun #define TEGRA30_I2S_TIMING_NON_SYM_ENABLE		(1 << 12)
101*4882a593Smuzhiyun #define TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT	0
102*4882a593Smuzhiyun #define TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US	0x7ff
103*4882a593Smuzhiyun #define TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_MASK	(TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US << TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT)
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun /* Fields in TEGRA30_I2S_OFFSET */
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun #define TEGRA30_I2S_OFFSET_RX_DATA_OFFSET_SHIFT		16
108*4882a593Smuzhiyun #define TEGRA30_I2S_OFFSET_RX_DATA_OFFSET_MASK_US	0x7ff
109*4882a593Smuzhiyun #define TEGRA30_I2S_OFFSET_RX_DATA_OFFSET_MASK		(TEGRA30_I2S_OFFSET_RX_DATA_OFFSET_MASK_US << TEGRA30_I2S_OFFSET_RX_DATA_OFFSET_SHIFT)
110*4882a593Smuzhiyun #define TEGRA30_I2S_OFFSET_TX_DATA_OFFSET_SHIFT		0
111*4882a593Smuzhiyun #define TEGRA30_I2S_OFFSET_TX_DATA_OFFSET_MASK_US	0x7ff
112*4882a593Smuzhiyun #define TEGRA30_I2S_OFFSET_TX_DATA_OFFSET_MASK		(TEGRA30_I2S_OFFSET_TX_DATA_OFFSET_MASK_US << TEGRA30_I2S_OFFSET_TX_DATA_OFFSET_SHIFT)
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun /* Fields in TEGRA30_I2S_CH_CTRL */
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun /* (FSYNC width - 1) in bit clocks */
117*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_FSYNC_WIDTH_SHIFT		24
118*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_FSYNC_WIDTH_MASK_US		0xff
119*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_FSYNC_WIDTH_MASK		(TEGRA30_I2S_CH_CTRL_FSYNC_WIDTH_MASK_US << TEGRA30_I2S_CH_CTRL_FSYNC_WIDTH_SHIFT)
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun #define TEGRA30_I2S_HIGHZ_NO				0
122*4882a593Smuzhiyun #define TEGRA30_I2S_HIGHZ_YES				1
123*4882a593Smuzhiyun #define TEGRA30_I2S_HIGHZ_ON_HALF_BIT_CLK		2
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_HIGHZ_CTRL_SHIFT		12
126*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_HIGHZ_CTRL_MASK		(3                                 << TEGRA30_I2S_CH_CTRL_HIGHZ_CTRL_SHIFT)
127*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_HIGHZ_CTRL_NO		(TEGRA30_I2S_HIGHZ_NO              << TEGRA30_I2S_CH_CTRL_HIGHZ_CTRL_SHIFT)
128*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_HIGHZ_CTRL_YES		(TEGRA30_I2S_HIGHZ_YES             << TEGRA30_I2S_CH_CTRL_HIGHZ_CTRL_SHIFT)
129*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_HIGHZ_CTRL_ON_HALF_BIT_CLK	(TEGRA30_I2S_HIGHZ_ON_HALF_BIT_CLK << TEGRA30_I2S_CH_CTRL_HIGHZ_CTRL_SHIFT)
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun #define TEGRA30_I2S_MSB_FIRST				0
132*4882a593Smuzhiyun #define TEGRA30_I2S_LSB_FIRST				1
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_RX_BIT_ORDER_SHIFT		10
135*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_RX_BIT_ORDER_MASK		(1                     << TEGRA30_I2S_CH_CTRL_RX_BIT_ORDER_SHIFT)
136*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_RX_BIT_ORDER_MSB_FIRST	(TEGRA30_I2S_MSB_FIRST << TEGRA30_I2S_CH_CTRL_RX_BIT_ORDER_SHIFT)
137*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_RX_BIT_ORDER_LSB_FIRST	(TEGRA30_I2S_LSB_FIRST << TEGRA30_I2S_CH_CTRL_RX_BIT_ORDER_SHIFT)
138*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_TX_BIT_ORDER_SHIFT		9
139*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_TX_BIT_ORDER_MASK		(1                     << TEGRA30_I2S_CH_CTRL_TX_BIT_ORDER_SHIFT)
140*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_TX_BIT_ORDER_MSB_FIRST	(TEGRA30_I2S_MSB_FIRST << TEGRA30_I2S_CH_CTRL_TX_BIT_ORDER_SHIFT)
141*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_TX_BIT_ORDER_LSB_FIRST	(TEGRA30_I2S_LSB_FIRST << TEGRA30_I2S_CH_CTRL_TX_BIT_ORDER_SHIFT)
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun #define TEGRA30_I2S_POS_EDGE				0
144*4882a593Smuzhiyun #define TEGRA30_I2S_NEG_EDGE				1
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_EGDE_CTRL_SHIFT		8
147*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_EGDE_CTRL_MASK		(1                    << TEGRA30_I2S_CH_CTRL_EGDE_CTRL_SHIFT)
148*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_EGDE_CTRL_POS_EDGE		(TEGRA30_I2S_POS_EDGE << TEGRA30_I2S_CH_CTRL_EGDE_CTRL_SHIFT)
149*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_EGDE_CTRL_NEG_EDGE		(TEGRA30_I2S_NEG_EDGE << TEGRA30_I2S_CH_CTRL_EGDE_CTRL_SHIFT)
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun /* Sample size is # bits from BIT_SIZE minus this field */
152*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_RX_MASK_BITS_SHIFT		4
153*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_RX_MASK_BITS_MASK_US	7
154*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_RX_MASK_BITS_MASK		(TEGRA30_I2S_CH_CTRL_RX_MASK_BITS_MASK_US << TEGRA30_I2S_CH_CTRL_RX_MASK_BITS_SHIFT)
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_TX_MASK_BITS_SHIFT		0
157*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_TX_MASK_BITS_MASK_US	7
158*4882a593Smuzhiyun #define TEGRA30_I2S_CH_CTRL_TX_MASK_BITS_MASK		(TEGRA30_I2S_CH_CTRL_TX_MASK_BITS_MASK_US << TEGRA30_I2S_CH_CTRL_TX_MASK_BITS_SHIFT)
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun /* Fields in TEGRA30_I2S_SLOT_CTRL */
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun /* Number of slots in frame, minus 1 */
163*4882a593Smuzhiyun #define TEGRA30_I2S_SLOT_CTRL_TOTAL_SLOTS_SHIFT		16
164*4882a593Smuzhiyun #define TEGRA30_I2S_SLOT_CTRL_TOTAL_SLOTS_MASK_US	7
165*4882a593Smuzhiyun #define TEGRA30_I2S_SLOT_CTRL_TOTAL_SLOTS_MASK		(TEGRA30_I2S_SLOT_CTRL_TOTAL_SLOTS_MASK_US << TEGRA30_I2S_SLOT_CTRL_TOTAL_SLOTS_SHIFT)
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun /* TDM mode slot enable bitmask */
168*4882a593Smuzhiyun #define TEGRA30_I2S_SLOT_CTRL_RX_SLOT_ENABLES_SHIFT	8
169*4882a593Smuzhiyun #define TEGRA30_I2S_SLOT_CTRL_RX_SLOT_ENABLES_MASK	(0xff << TEGRA30_I2S_SLOT_CTRL_RX_SLOT_ENABLES_SHIFT)
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun #define TEGRA30_I2S_SLOT_CTRL_TX_SLOT_ENABLES_SHIFT	0
172*4882a593Smuzhiyun #define TEGRA30_I2S_SLOT_CTRL_TX_SLOT_ENABLES_MASK	(0xff << TEGRA30_I2S_SLOT_CTRL_TX_SLOT_ENABLES_SHIFT)
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun /* Fields in TEGRA30_I2S_CIF_RX_CTRL */
175*4882a593Smuzhiyun /* Uses field from TEGRA30_AUDIOCIF_CTRL_* in tegra30_ahub.h */
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun /* Fields in TEGRA30_I2S_CIF_TX_CTRL */
178*4882a593Smuzhiyun /* Uses field from TEGRA30_AUDIOCIF_CTRL_* in tegra30_ahub.h */
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun /* Fields in TEGRA30_I2S_FLOWCTL */
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun #define TEGRA30_I2S_FILTER_LINEAR			0
183*4882a593Smuzhiyun #define TEGRA30_I2S_FILTER_QUAD				1
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun #define TEGRA30_I2S_FLOWCTL_FILTER_SHIFT		31
186*4882a593Smuzhiyun #define TEGRA30_I2S_FLOWCTL_FILTER_MASK			(1                         << TEGRA30_I2S_FLOWCTL_FILTER_SHIFT)
187*4882a593Smuzhiyun #define TEGRA30_I2S_FLOWCTL_FILTER_LINEAR		(TEGRA30_I2S_FILTER_LINEAR << TEGRA30_I2S_FLOWCTL_FILTER_SHIFT)
188*4882a593Smuzhiyun #define TEGRA30_I2S_FLOWCTL_FILTER_QUAD			(TEGRA30_I2S_FILTER_QUAD   << TEGRA30_I2S_FLOWCTL_FILTER_SHIFT)
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun /* Fields in TEGRA30_I2S_TX_STEP */
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun #define TEGRA30_I2S_TX_STEP_SHIFT			0
193*4882a593Smuzhiyun #define TEGRA30_I2S_TX_STEP_MASK_US			0xffff
194*4882a593Smuzhiyun #define TEGRA30_I2S_TX_STEP_MASK			(TEGRA30_I2S_TX_STEP_MASK_US << TEGRA30_I2S_TX_STEP_SHIFT)
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun /* Fields in TEGRA30_I2S_FLOW_STATUS */
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun #define TEGRA30_I2S_FLOW_STATUS_UNDERFLOW		(1 << 31)
199*4882a593Smuzhiyun #define TEGRA30_I2S_FLOW_STATUS_OVERFLOW		(1 << 30)
200*4882a593Smuzhiyun #define TEGRA30_I2S_FLOW_STATUS_MONITOR_INT_EN		(1 << 4)
201*4882a593Smuzhiyun #define TEGRA30_I2S_FLOW_STATUS_COUNTER_CLR		(1 << 3)
202*4882a593Smuzhiyun #define TEGRA30_I2S_FLOW_STATUS_MONITOR_CLR		(1 << 2)
203*4882a593Smuzhiyun #define TEGRA30_I2S_FLOW_STATUS_COUNTER_EN		(1 << 1)
204*4882a593Smuzhiyun #define TEGRA30_I2S_FLOW_STATUS_MONITOR_EN		(1 << 0)
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun /*
207*4882a593Smuzhiyun  * There are no fields in TEGRA30_I2S_FLOW_TOTAL, TEGRA30_I2S_FLOW_OVER,
208*4882a593Smuzhiyun  * TEGRA30_I2S_FLOW_UNDER; they are counters taking the whole register.
209*4882a593Smuzhiyun  */
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun /* Fields in TEGRA30_I2S_LCOEF_* */
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun #define TEGRA30_I2S_LCOEF_COEF_SHIFT			0
214*4882a593Smuzhiyun #define TEGRA30_I2S_LCOEF_COEF_MASK_US			0xffff
215*4882a593Smuzhiyun #define TEGRA30_I2S_LCOEF_COEF_MASK			(TEGRA30_I2S_LCOEF_COEF_MASK_US << TEGRA30_I2S_LCOEF_COEF_SHIFT)
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun struct tegra30_i2s_soc_data {
218*4882a593Smuzhiyun 	void (*set_audio_cif)(struct regmap *regmap,
219*4882a593Smuzhiyun 			      unsigned int reg,
220*4882a593Smuzhiyun 			      struct tegra30_ahub_cif_conf *conf);
221*4882a593Smuzhiyun };
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun struct tegra30_i2s {
224*4882a593Smuzhiyun 	const struct tegra30_i2s_soc_data *soc_data;
225*4882a593Smuzhiyun 	struct snd_soc_dai_driver dai;
226*4882a593Smuzhiyun 	int cif_id;
227*4882a593Smuzhiyun 	struct clk *clk_i2s;
228*4882a593Smuzhiyun 	enum tegra30_ahub_txcif capture_i2s_cif;
229*4882a593Smuzhiyun 	enum tegra30_ahub_rxcif capture_fifo_cif;
230*4882a593Smuzhiyun 	char capture_dma_chan[8];
231*4882a593Smuzhiyun 	struct snd_dmaengine_dai_dma_data capture_dma_data;
232*4882a593Smuzhiyun 	enum tegra30_ahub_rxcif playback_i2s_cif;
233*4882a593Smuzhiyun 	enum tegra30_ahub_txcif playback_fifo_cif;
234*4882a593Smuzhiyun 	char playback_dma_chan[8];
235*4882a593Smuzhiyun 	struct snd_dmaengine_dai_dma_data playback_dma_data;
236*4882a593Smuzhiyun 	struct regmap *regmap;
237*4882a593Smuzhiyun 	struct snd_dmaengine_pcm_config dma_config;
238*4882a593Smuzhiyun };
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun #endif
241