xref: /OK3568_Linux_fs/u-boot/include/atmel_mci.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) 2005-2006 Atmel Corporation
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun #ifndef __ATMEL_MCI_H__
7*4882a593Smuzhiyun #define __ATMEL_MCI_H__
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun int atmel_mci_init(void *regs);
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #ifndef __ASSEMBLY__
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun /*
14*4882a593Smuzhiyun  * Structure for struct SoC access.
15*4882a593Smuzhiyun  * Names starting with '_' are fillers.
16*4882a593Smuzhiyun  */
17*4882a593Smuzhiyun typedef struct atmel_mci {
18*4882a593Smuzhiyun 	/*	reg	Offset */
19*4882a593Smuzhiyun 	u32	cr;	/* 0x00 */
20*4882a593Smuzhiyun 	u32	mr;	/* 0x04 */
21*4882a593Smuzhiyun 	u32	dtor;	/* 0x08 */
22*4882a593Smuzhiyun 	u32	sdcr;	/* 0x0c */
23*4882a593Smuzhiyun 	u32	argr;	/* 0x10 */
24*4882a593Smuzhiyun 	u32	cmdr;	/* 0x14 */
25*4882a593Smuzhiyun 	u32	blkr;	/* 0x18 */
26*4882a593Smuzhiyun 	u32	_1c;	/* 0x1c */
27*4882a593Smuzhiyun 	u32	rspr;	/* 0x20 */
28*4882a593Smuzhiyun 	u32	rspr1;	/* 0x24 */
29*4882a593Smuzhiyun 	u32	rspr2;	/* 0x28 */
30*4882a593Smuzhiyun 	u32	rspr3;	/* 0x2c */
31*4882a593Smuzhiyun 	u32	rdr;	/* 0x30 */
32*4882a593Smuzhiyun 	u32	tdr;	/* 0x34 */
33*4882a593Smuzhiyun 	u32	_38;	/* 0x38 */
34*4882a593Smuzhiyun 	u32	_3c;	/* 0x3c */
35*4882a593Smuzhiyun 	u32	sr;	/* 0x40 */
36*4882a593Smuzhiyun 	u32	ier;	/* 0x44 */
37*4882a593Smuzhiyun 	u32	idr;	/* 0x48 */
38*4882a593Smuzhiyun 	u32	imr;	/* 0x4c */
39*4882a593Smuzhiyun 	u32	dma;	/* 0x50 */
40*4882a593Smuzhiyun 	u32	cfg;	/* 0x54 */
41*4882a593Smuzhiyun 	u32	reserved[41];
42*4882a593Smuzhiyun 	u32	version;
43*4882a593Smuzhiyun } atmel_mci_t;
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun #endif /* __ASSEMBLY__ */
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun /* Bitfields in CR */
48*4882a593Smuzhiyun #define MMCI_MCIEN_OFFSET			0
49*4882a593Smuzhiyun #define MMCI_MCIEN_SIZE				1
50*4882a593Smuzhiyun #define MMCI_MCIDIS_OFFSET			1
51*4882a593Smuzhiyun #define MMCI_MCIDIS_SIZE			1
52*4882a593Smuzhiyun #define MMCI_PWSEN_OFFSET			2
53*4882a593Smuzhiyun #define MMCI_PWSEN_SIZE				1
54*4882a593Smuzhiyun #define MMCI_PWSDIS_OFFSET			3
55*4882a593Smuzhiyun #define MMCI_PWSDIS_SIZE			1
56*4882a593Smuzhiyun #define MMCI_SWRST_OFFSET			7
57*4882a593Smuzhiyun #define MMCI_SWRST_SIZE				1
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun /* Bitfields in MR */
60*4882a593Smuzhiyun #define MMCI_CLKDIV_OFFSET			0
61*4882a593Smuzhiyun #define MMCI_CLKDIV_SIZE			8
62*4882a593Smuzhiyun #define MMCI_PWSDIV_OFFSET			8
63*4882a593Smuzhiyun #define MMCI_PWSDIV_SIZE			3
64*4882a593Smuzhiyun #define MMCI_RDPROOF_OFFSET			11
65*4882a593Smuzhiyun #define MMCI_RDPROOF_SIZE			1
66*4882a593Smuzhiyun #define MMCI_WRPROOF_OFFSET			12
67*4882a593Smuzhiyun #define MMCI_WRPROOF_SIZE			1
68*4882a593Smuzhiyun #define MMCI_PDCPADV_OFFSET			14
69*4882a593Smuzhiyun #define MMCI_PDCPADV_SIZE			1
70*4882a593Smuzhiyun #define MMCI_PDCMODE_OFFSET			15
71*4882a593Smuzhiyun #define MMCI_PDCMODE_SIZE			1
72*4882a593Smuzhiyun /* MCI IP version >= 0x500, MR bit 16 used for CLKODD */
73*4882a593Smuzhiyun #define MMCI_CLKODD_OFFSET			16
74*4882a593Smuzhiyun #define MMCI_CLKODD_SIZE			1
75*4882a593Smuzhiyun /* MCI IP version < 0x200, MR higher 16bits for BLKLEN */
76*4882a593Smuzhiyun #define MMCI_BLKLEN_OFFSET			16
77*4882a593Smuzhiyun #define MMCI_BLKLEN_SIZE			16
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun /* Bitfields in DTOR */
80*4882a593Smuzhiyun #define MMCI_DTOCYC_OFFSET			0
81*4882a593Smuzhiyun #define MMCI_DTOCYC_SIZE			4
82*4882a593Smuzhiyun #define MMCI_DTOMUL_OFFSET			4
83*4882a593Smuzhiyun #define MMCI_DTOMUL_SIZE			3
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun /* Bitfields in SDCR */
86*4882a593Smuzhiyun #define MMCI_SCDSEL_OFFSET			0
87*4882a593Smuzhiyun #define MMCI_SCDSEL_SIZE			4
88*4882a593Smuzhiyun #define MMCI_SCDBUS_OFFSET			7
89*4882a593Smuzhiyun #define MMCI_SCDBUS_SIZE			1
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun /* Bitfields in ARGR */
92*4882a593Smuzhiyun #define MMCI_ARG_OFFSET				0
93*4882a593Smuzhiyun #define MMCI_ARG_SIZE				32
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun /* Bitfields in CMDR */
96*4882a593Smuzhiyun #define MMCI_CMDNB_OFFSET			0
97*4882a593Smuzhiyun #define MMCI_CMDNB_SIZE				6
98*4882a593Smuzhiyun #define MMCI_RSPTYP_OFFSET			6
99*4882a593Smuzhiyun #define MMCI_RSPTYP_SIZE			2
100*4882a593Smuzhiyun #define MMCI_SPCMD_OFFSET			8
101*4882a593Smuzhiyun #define MMCI_SPCMD_SIZE				3
102*4882a593Smuzhiyun #define MMCI_OPDCMD_OFFSET			11
103*4882a593Smuzhiyun #define MMCI_OPDCMD_SIZE			1
104*4882a593Smuzhiyun #define MMCI_MAXLAT_OFFSET			12
105*4882a593Smuzhiyun #define MMCI_MAXLAT_SIZE			1
106*4882a593Smuzhiyun #define MMCI_TRCMD_OFFSET			16
107*4882a593Smuzhiyun #define MMCI_TRCMD_SIZE				2
108*4882a593Smuzhiyun #define MMCI_TRDIR_OFFSET			18
109*4882a593Smuzhiyun #define MMCI_TRDIR_SIZE				1
110*4882a593Smuzhiyun #define MMCI_TRTYP_OFFSET			19
111*4882a593Smuzhiyun #define MMCI_TRTYP_SIZE				2
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun /* Bitfields in BLKR */
114*4882a593Smuzhiyun /* MMCI_BLKLEN_OFFSET/SIZE already defined in MR */
115*4882a593Smuzhiyun #define MMCI_BCNT_OFFSET			0
116*4882a593Smuzhiyun #define MMCI_BCNT_SIZE			16
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun /* Bitfields in RSPRx */
119*4882a593Smuzhiyun #define MMCI_RSP_OFFSET				0
120*4882a593Smuzhiyun #define MMCI_RSP_SIZE				32
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun /* Bitfields in SR/IER/IDR/IMR */
123*4882a593Smuzhiyun #define MMCI_CMDRDY_OFFSET			0
124*4882a593Smuzhiyun #define MMCI_CMDRDY_SIZE			1
125*4882a593Smuzhiyun #define MMCI_RXRDY_OFFSET			1
126*4882a593Smuzhiyun #define MMCI_RXRDY_SIZE				1
127*4882a593Smuzhiyun #define MMCI_TXRDY_OFFSET			2
128*4882a593Smuzhiyun #define MMCI_TXRDY_SIZE				1
129*4882a593Smuzhiyun #define MMCI_BLKE_OFFSET			3
130*4882a593Smuzhiyun #define MMCI_BLKE_SIZE				1
131*4882a593Smuzhiyun #define MMCI_DTIP_OFFSET			4
132*4882a593Smuzhiyun #define MMCI_DTIP_SIZE				1
133*4882a593Smuzhiyun #define MMCI_NOTBUSY_OFFSET			5
134*4882a593Smuzhiyun #define MMCI_NOTBUSY_SIZE			1
135*4882a593Smuzhiyun #define MMCI_ENDRX_OFFSET			6
136*4882a593Smuzhiyun #define MMCI_ENDRX_SIZE				1
137*4882a593Smuzhiyun #define MMCI_ENDTX_OFFSET			7
138*4882a593Smuzhiyun #define MMCI_ENDTX_SIZE				1
139*4882a593Smuzhiyun #define MMCI_RXBUFF_OFFSET			14
140*4882a593Smuzhiyun #define MMCI_RXBUFF_SIZE			1
141*4882a593Smuzhiyun #define MMCI_TXBUFE_OFFSET			15
142*4882a593Smuzhiyun #define MMCI_TXBUFE_SIZE			1
143*4882a593Smuzhiyun #define MMCI_RINDE_OFFSET			16
144*4882a593Smuzhiyun #define MMCI_RINDE_SIZE				1
145*4882a593Smuzhiyun #define MMCI_RDIRE_OFFSET			17
146*4882a593Smuzhiyun #define MMCI_RDIRE_SIZE				1
147*4882a593Smuzhiyun #define MMCI_RCRCE_OFFSET			18
148*4882a593Smuzhiyun #define MMCI_RCRCE_SIZE				1
149*4882a593Smuzhiyun #define MMCI_RENDE_OFFSET			19
150*4882a593Smuzhiyun #define MMCI_RENDE_SIZE				1
151*4882a593Smuzhiyun #define MMCI_RTOE_OFFSET			20
152*4882a593Smuzhiyun #define MMCI_RTOE_SIZE				1
153*4882a593Smuzhiyun #define MMCI_DCRCE_OFFSET			21
154*4882a593Smuzhiyun #define MMCI_DCRCE_SIZE				1
155*4882a593Smuzhiyun #define MMCI_DTOE_OFFSET			22
156*4882a593Smuzhiyun #define MMCI_DTOE_SIZE				1
157*4882a593Smuzhiyun #define MMCI_OVRE_OFFSET			30
158*4882a593Smuzhiyun #define MMCI_OVRE_SIZE				1
159*4882a593Smuzhiyun #define MMCI_UNRE_OFFSET			31
160*4882a593Smuzhiyun #define MMCI_UNRE_SIZE				1
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun /* Constants for DTOMUL */
163*4882a593Smuzhiyun #define MMCI_DTOMUL_1_CYCLE			0
164*4882a593Smuzhiyun #define MMCI_DTOMUL_16_CYCLES			1
165*4882a593Smuzhiyun #define MMCI_DTOMUL_128_CYCLES			2
166*4882a593Smuzhiyun #define MMCI_DTOMUL_256_CYCLES			3
167*4882a593Smuzhiyun #define MMCI_DTOMUL_1024_CYCLES			4
168*4882a593Smuzhiyun #define MMCI_DTOMUL_4096_CYCLES			5
169*4882a593Smuzhiyun #define MMCI_DTOMUL_65536_CYCLES		6
170*4882a593Smuzhiyun #define MMCI_DTOMUL_1048576_CYCLES		7
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun /* Constants for RSPTYP */
173*4882a593Smuzhiyun #define MMCI_RSPTYP_NO_RESP			0
174*4882a593Smuzhiyun #define MMCI_RSPTYP_48_BIT_RESP			1
175*4882a593Smuzhiyun #define MMCI_RSPTYP_136_BIT_RESP		2
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun /* Constants for SPCMD */
178*4882a593Smuzhiyun #define MMCI_SPCMD_NO_SPEC_CMD			0
179*4882a593Smuzhiyun #define MMCI_SPCMD_INIT_CMD			1
180*4882a593Smuzhiyun #define MMCI_SPCMD_SYNC_CMD			2
181*4882a593Smuzhiyun #define MMCI_SPCMD_INT_CMD			4
182*4882a593Smuzhiyun #define MMCI_SPCMD_INT_RESP			5
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun /* Constants for TRCMD */
185*4882a593Smuzhiyun #define MMCI_TRCMD_NO_TRANS			0
186*4882a593Smuzhiyun #define MMCI_TRCMD_START_TRANS			1
187*4882a593Smuzhiyun #define MMCI_TRCMD_STOP_TRANS			2
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun /* Constants for TRTYP */
190*4882a593Smuzhiyun #define MMCI_TRTYP_BLOCK			0
191*4882a593Smuzhiyun #define MMCI_TRTYP_MULTI_BLOCK			1
192*4882a593Smuzhiyun #define MMCI_TRTYP_STREAM			2
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun /* Bitfields in CFG */
195*4882a593Smuzhiyun #define MMCI_FIFOMODE_OFFSET			0
196*4882a593Smuzhiyun #define MMCI_FIFOMODE_SIZE			1
197*4882a593Smuzhiyun #define MMCI_FERRCTRL_OFFSET			4
198*4882a593Smuzhiyun #define MMCI_FERRCTRL_SIZE			1
199*4882a593Smuzhiyun #define MMCI_HSMODE_OFFSET			8
200*4882a593Smuzhiyun #define MMCI_HSMODE_SIZE			1
201*4882a593Smuzhiyun #define MMCI_LSYNC_OFFSET			12
202*4882a593Smuzhiyun #define MMCI_LSYNC_SIZE				1
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun /* Bit manipulation macros */
205*4882a593Smuzhiyun #define MMCI_BIT(name)					\
206*4882a593Smuzhiyun 	(1 << MMCI_##name##_OFFSET)
207*4882a593Smuzhiyun #define MMCI_BF(name,value)				\
208*4882a593Smuzhiyun 	(((value) & ((1 << MMCI_##name##_SIZE) - 1))	\
209*4882a593Smuzhiyun 	 << MMCI_##name##_OFFSET)
210*4882a593Smuzhiyun #define MMCI_BFEXT(name,value)				\
211*4882a593Smuzhiyun 	(((value) >> MMCI_##name##_OFFSET)\
212*4882a593Smuzhiyun 	 & ((1 << MMCI_##name##_SIZE) - 1))
213*4882a593Smuzhiyun #define MMCI_BFINS(name,value,old)			\
214*4882a593Smuzhiyun 	(((old) & ~(((1 << MMCI_##name##_SIZE) - 1)	\
215*4882a593Smuzhiyun 		    << MMCI_##name##_OFFSET))		\
216*4882a593Smuzhiyun 	 | MMCI_BF(name,value))
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun #endif /* __ATMEL_MCI_H__ */
219