xref: /rk3399_rockchip-uboot/include/atmel_mci.h (revision 72fa467988e7944407a634ddc4bc6a2df685c04c)
1*72fa4679SSven Schnelle /*
2*72fa4679SSven Schnelle  * Copyright (C) 2005-2006 Atmel Corporation
3*72fa4679SSven Schnelle  *
4*72fa4679SSven Schnelle  * See file CREDITS for list of people who contributed to this
5*72fa4679SSven Schnelle  * project.
6*72fa4679SSven Schnelle  *
7*72fa4679SSven Schnelle  * This program is free software; you can redistribute it and/or
8*72fa4679SSven Schnelle  * modify it under the terms of the GNU General Public License as
9*72fa4679SSven Schnelle  * published by the Free Software Foundation; either version 2 of
10*72fa4679SSven Schnelle  * the License, or (at your option) any later version.
11*72fa4679SSven Schnelle  *
12*72fa4679SSven Schnelle  * This program is distributed in the hope that it will be useful,
13*72fa4679SSven Schnelle  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14*72fa4679SSven Schnelle  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*72fa4679SSven Schnelle  * GNU General Public License for more details.
16*72fa4679SSven Schnelle  *
17*72fa4679SSven Schnelle  * You should have received a copy of the GNU General Public License
18*72fa4679SSven Schnelle  * along with this program; if not, write to the Free Software
19*72fa4679SSven Schnelle  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
20*72fa4679SSven Schnelle  * MA 02111-1307 USA
21*72fa4679SSven Schnelle  */
22*72fa4679SSven Schnelle #ifndef __ATMEL_MCI_H__
23*72fa4679SSven Schnelle #define __ATMEL_MCI_H__
24*72fa4679SSven Schnelle 
25*72fa4679SSven Schnelle int atmel_mci_init(void *regs);
26*72fa4679SSven Schnelle 
27*72fa4679SSven Schnelle #ifndef __ASSEMBLY__
28*72fa4679SSven Schnelle 
29*72fa4679SSven Schnelle /*
30*72fa4679SSven Schnelle  * Structure for struct SoC access.
31*72fa4679SSven Schnelle  * Names starting with '_' are fillers.
32*72fa4679SSven Schnelle  */
33*72fa4679SSven Schnelle typedef struct atmel_mci {
34*72fa4679SSven Schnelle 	/*	reg	Offset */
35*72fa4679SSven Schnelle 	u32	cr;	/* 0x00 */
36*72fa4679SSven Schnelle 	u32	mr;	/* 0x04 */
37*72fa4679SSven Schnelle 	u32	dtor;	/* 0x08 */
38*72fa4679SSven Schnelle 	u32	sdcr;	/* 0x0c */
39*72fa4679SSven Schnelle 	u32	argr;	/* 0x10 */
40*72fa4679SSven Schnelle 	u32	cmdr;	/* 0x14 */
41*72fa4679SSven Schnelle 	u32	_18;	/* 0x18 */
42*72fa4679SSven Schnelle 	u32	_1c;	/* 0x1c */
43*72fa4679SSven Schnelle 	u32	rspr;	/* 0x20 */
44*72fa4679SSven Schnelle 	u32	rspr1;	/* 0x24 */
45*72fa4679SSven Schnelle 	u32	rspr2;	/* 0x28 */
46*72fa4679SSven Schnelle 	u32	rspr3;	/* 0x2c */
47*72fa4679SSven Schnelle 	u32	rdr;	/* 0x30 */
48*72fa4679SSven Schnelle 	u32	tdr;	/* 0x34 */
49*72fa4679SSven Schnelle 	u32	_38;	/* 0x38 */
50*72fa4679SSven Schnelle 	u32	_3c;	/* 0x3c */
51*72fa4679SSven Schnelle 	u32	sr;	/* 0x40 */
52*72fa4679SSven Schnelle 	u32	ier;	/* 0x44 */
53*72fa4679SSven Schnelle 	u32	idr;	/* 0x48 */
54*72fa4679SSven Schnelle 	u32	imr;	/* 0x4c */
55*72fa4679SSven Schnelle } atmel_mci_t;
56*72fa4679SSven Schnelle 
57*72fa4679SSven Schnelle #endif /* __ASSEMBLY__ */
58*72fa4679SSven Schnelle 
59*72fa4679SSven Schnelle /*
60*72fa4679SSven Schnelle  * NOTICE: Use of registers offsets is depreciated.
61*72fa4679SSven Schnelle  * These defines will be removed once the old driver
62*72fa4679SSven Schnelle  * is taken out of commision.
63*72fa4679SSven Schnelle  *
64*72fa4679SSven Schnelle  * Atmel MultiMedia Card Interface (MCI) registers
65*72fa4679SSven Schnelle  */
66*72fa4679SSven Schnelle #define MMCI_CR					0x0000
67*72fa4679SSven Schnelle #define MMCI_MR					0x0004
68*72fa4679SSven Schnelle #define MMCI_DTOR				0x0008
69*72fa4679SSven Schnelle #define MMCI_SDCR				0x000c
70*72fa4679SSven Schnelle #define MMCI_ARGR				0x0010
71*72fa4679SSven Schnelle #define MMCI_CMDR				0x0014
72*72fa4679SSven Schnelle #define MMCI_RSPR				0x0020
73*72fa4679SSven Schnelle #define MMCI_RSPR1				0x0024
74*72fa4679SSven Schnelle #define MMCI_RSPR2				0x0028
75*72fa4679SSven Schnelle #define MMCI_RSPR3				0x002c
76*72fa4679SSven Schnelle #define MMCI_RDR				0x0030
77*72fa4679SSven Schnelle #define MMCI_TDR				0x0034
78*72fa4679SSven Schnelle #define MMCI_SR					0x0040
79*72fa4679SSven Schnelle #define MMCI_IER				0x0044
80*72fa4679SSven Schnelle #define MMCI_IDR				0x0048
81*72fa4679SSven Schnelle #define MMCI_IMR				0x004c
82*72fa4679SSven Schnelle 
83*72fa4679SSven Schnelle /* Bitfields in CR */
84*72fa4679SSven Schnelle #define MMCI_MCIEN_OFFSET			0
85*72fa4679SSven Schnelle #define MMCI_MCIEN_SIZE				1
86*72fa4679SSven Schnelle #define MMCI_MCIDIS_OFFSET			1
87*72fa4679SSven Schnelle #define MMCI_MCIDIS_SIZE			1
88*72fa4679SSven Schnelle #define MMCI_PWSEN_OFFSET			2
89*72fa4679SSven Schnelle #define MMCI_PWSEN_SIZE				1
90*72fa4679SSven Schnelle #define MMCI_PWSDIS_OFFSET			3
91*72fa4679SSven Schnelle #define MMCI_PWSDIS_SIZE			1
92*72fa4679SSven Schnelle #define MMCI_SWRST_OFFSET			7
93*72fa4679SSven Schnelle #define MMCI_SWRST_SIZE				1
94*72fa4679SSven Schnelle 
95*72fa4679SSven Schnelle /* Bitfields in MR */
96*72fa4679SSven Schnelle #define MMCI_CLKDIV_OFFSET			0
97*72fa4679SSven Schnelle #define MMCI_CLKDIV_SIZE			8
98*72fa4679SSven Schnelle #define MMCI_PWSDIV_OFFSET			8
99*72fa4679SSven Schnelle #define MMCI_PWSDIV_SIZE			3
100*72fa4679SSven Schnelle #define MMCI_RDPROOF_OFFSET			11
101*72fa4679SSven Schnelle #define MMCI_RDPROOF_SIZE			1
102*72fa4679SSven Schnelle #define MMCI_WRPROOF_OFFSET			12
103*72fa4679SSven Schnelle #define MMCI_WRPROOF_SIZE			1
104*72fa4679SSven Schnelle #define MMCI_PDCPADV_OFFSET			14
105*72fa4679SSven Schnelle #define MMCI_PDCPADV_SIZE			1
106*72fa4679SSven Schnelle #define MMCI_PDCMODE_OFFSET			15
107*72fa4679SSven Schnelle #define MMCI_PDCMODE_SIZE			1
108*72fa4679SSven Schnelle #define MMCI_BLKLEN_OFFSET			16
109*72fa4679SSven Schnelle #define MMCI_BLKLEN_SIZE			16
110*72fa4679SSven Schnelle 
111*72fa4679SSven Schnelle /* Bitfields in DTOR */
112*72fa4679SSven Schnelle #define MMCI_DTOCYC_OFFSET			0
113*72fa4679SSven Schnelle #define MMCI_DTOCYC_SIZE			4
114*72fa4679SSven Schnelle #define MMCI_DTOMUL_OFFSET			4
115*72fa4679SSven Schnelle #define MMCI_DTOMUL_SIZE			3
116*72fa4679SSven Schnelle 
117*72fa4679SSven Schnelle /* Bitfields in SDCR */
118*72fa4679SSven Schnelle #define MMCI_SCDSEL_OFFSET			0
119*72fa4679SSven Schnelle #define MMCI_SCDSEL_SIZE			4
120*72fa4679SSven Schnelle #define MMCI_SCDBUS_OFFSET			7
121*72fa4679SSven Schnelle #define MMCI_SCDBUS_SIZE			1
122*72fa4679SSven Schnelle 
123*72fa4679SSven Schnelle /* Bitfields in ARGR */
124*72fa4679SSven Schnelle #define MMCI_ARG_OFFSET				0
125*72fa4679SSven Schnelle #define MMCI_ARG_SIZE				32
126*72fa4679SSven Schnelle 
127*72fa4679SSven Schnelle /* Bitfields in CMDR */
128*72fa4679SSven Schnelle #define MMCI_CMDNB_OFFSET			0
129*72fa4679SSven Schnelle #define MMCI_CMDNB_SIZE				6
130*72fa4679SSven Schnelle #define MMCI_RSPTYP_OFFSET			6
131*72fa4679SSven Schnelle #define MMCI_RSPTYP_SIZE			2
132*72fa4679SSven Schnelle #define MMCI_SPCMD_OFFSET			8
133*72fa4679SSven Schnelle #define MMCI_SPCMD_SIZE				3
134*72fa4679SSven Schnelle #define MMCI_OPDCMD_OFFSET			11
135*72fa4679SSven Schnelle #define MMCI_OPDCMD_SIZE			1
136*72fa4679SSven Schnelle #define MMCI_MAXLAT_OFFSET			12
137*72fa4679SSven Schnelle #define MMCI_MAXLAT_SIZE			1
138*72fa4679SSven Schnelle #define MMCI_TRCMD_OFFSET			16
139*72fa4679SSven Schnelle #define MMCI_TRCMD_SIZE				2
140*72fa4679SSven Schnelle #define MMCI_TRDIR_OFFSET			18
141*72fa4679SSven Schnelle #define MMCI_TRDIR_SIZE				1
142*72fa4679SSven Schnelle #define MMCI_TRTYP_OFFSET			19
143*72fa4679SSven Schnelle #define MMCI_TRTYP_SIZE				2
144*72fa4679SSven Schnelle 
145*72fa4679SSven Schnelle /* Bitfields in RSPRx */
146*72fa4679SSven Schnelle #define MMCI_RSP_OFFSET				0
147*72fa4679SSven Schnelle #define MMCI_RSP_SIZE				32
148*72fa4679SSven Schnelle 
149*72fa4679SSven Schnelle /* Bitfields in SR/IER/IDR/IMR */
150*72fa4679SSven Schnelle #define MMCI_CMDRDY_OFFSET			0
151*72fa4679SSven Schnelle #define MMCI_CMDRDY_SIZE			1
152*72fa4679SSven Schnelle #define MMCI_RXRDY_OFFSET			1
153*72fa4679SSven Schnelle #define MMCI_RXRDY_SIZE				1
154*72fa4679SSven Schnelle #define MMCI_TXRDY_OFFSET			2
155*72fa4679SSven Schnelle #define MMCI_TXRDY_SIZE				1
156*72fa4679SSven Schnelle #define MMCI_BLKE_OFFSET			3
157*72fa4679SSven Schnelle #define MMCI_BLKE_SIZE				1
158*72fa4679SSven Schnelle #define MMCI_DTIP_OFFSET			4
159*72fa4679SSven Schnelle #define MMCI_DTIP_SIZE				1
160*72fa4679SSven Schnelle #define MMCI_NOTBUSY_OFFSET			5
161*72fa4679SSven Schnelle #define MMCI_NOTBUSY_SIZE			1
162*72fa4679SSven Schnelle #define MMCI_ENDRX_OFFSET			6
163*72fa4679SSven Schnelle #define MMCI_ENDRX_SIZE				1
164*72fa4679SSven Schnelle #define MMCI_ENDTX_OFFSET			7
165*72fa4679SSven Schnelle #define MMCI_ENDTX_SIZE				1
166*72fa4679SSven Schnelle #define MMCI_RXBUFF_OFFSET			14
167*72fa4679SSven Schnelle #define MMCI_RXBUFF_SIZE			1
168*72fa4679SSven Schnelle #define MMCI_TXBUFE_OFFSET			15
169*72fa4679SSven Schnelle #define MMCI_TXBUFE_SIZE			1
170*72fa4679SSven Schnelle #define MMCI_RINDE_OFFSET			16
171*72fa4679SSven Schnelle #define MMCI_RINDE_SIZE				1
172*72fa4679SSven Schnelle #define MMCI_RDIRE_OFFSET			17
173*72fa4679SSven Schnelle #define MMCI_RDIRE_SIZE				1
174*72fa4679SSven Schnelle #define MMCI_RCRCE_OFFSET			18
175*72fa4679SSven Schnelle #define MMCI_RCRCE_SIZE				1
176*72fa4679SSven Schnelle #define MMCI_RENDE_OFFSET			19
177*72fa4679SSven Schnelle #define MMCI_RENDE_SIZE				1
178*72fa4679SSven Schnelle #define MMCI_RTOE_OFFSET			20
179*72fa4679SSven Schnelle #define MMCI_RTOE_SIZE				1
180*72fa4679SSven Schnelle #define MMCI_DCRCE_OFFSET			21
181*72fa4679SSven Schnelle #define MMCI_DCRCE_SIZE				1
182*72fa4679SSven Schnelle #define MMCI_DTOE_OFFSET			22
183*72fa4679SSven Schnelle #define MMCI_DTOE_SIZE				1
184*72fa4679SSven Schnelle #define MMCI_OVRE_OFFSET			30
185*72fa4679SSven Schnelle #define MMCI_OVRE_SIZE				1
186*72fa4679SSven Schnelle #define MMCI_UNRE_OFFSET			31
187*72fa4679SSven Schnelle #define MMCI_UNRE_SIZE				1
188*72fa4679SSven Schnelle 
189*72fa4679SSven Schnelle /* Constants for DTOMUL */
190*72fa4679SSven Schnelle #define MMCI_DTOMUL_1_CYCLE			0
191*72fa4679SSven Schnelle #define MMCI_DTOMUL_16_CYCLES			1
192*72fa4679SSven Schnelle #define MMCI_DTOMUL_128_CYCLES			2
193*72fa4679SSven Schnelle #define MMCI_DTOMUL_256_CYCLES			3
194*72fa4679SSven Schnelle #define MMCI_DTOMUL_1024_CYCLES			4
195*72fa4679SSven Schnelle #define MMCI_DTOMUL_4096_CYCLES			5
196*72fa4679SSven Schnelle #define MMCI_DTOMUL_65536_CYCLES		6
197*72fa4679SSven Schnelle #define MMCI_DTOMUL_1048576_CYCLES		7
198*72fa4679SSven Schnelle 
199*72fa4679SSven Schnelle /* Constants for RSPTYP */
200*72fa4679SSven Schnelle #define MMCI_RSPTYP_NO_RESP			0
201*72fa4679SSven Schnelle #define MMCI_RSPTYP_48_BIT_RESP			1
202*72fa4679SSven Schnelle #define MMCI_RSPTYP_136_BIT_RESP		2
203*72fa4679SSven Schnelle 
204*72fa4679SSven Schnelle /* Constants for SPCMD */
205*72fa4679SSven Schnelle #define MMCI_SPCMD_NO_SPEC_CMD			0
206*72fa4679SSven Schnelle #define MMCI_SPCMD_INIT_CMD			1
207*72fa4679SSven Schnelle #define MMCI_SPCMD_SYNC_CMD			2
208*72fa4679SSven Schnelle #define MMCI_SPCMD_INT_CMD			4
209*72fa4679SSven Schnelle #define MMCI_SPCMD_INT_RESP			5
210*72fa4679SSven Schnelle 
211*72fa4679SSven Schnelle /* Constants for TRCMD */
212*72fa4679SSven Schnelle #define MMCI_TRCMD_NO_TRANS			0
213*72fa4679SSven Schnelle #define MMCI_TRCMD_START_TRANS			1
214*72fa4679SSven Schnelle #define MMCI_TRCMD_STOP_TRANS			2
215*72fa4679SSven Schnelle 
216*72fa4679SSven Schnelle /* Constants for TRTYP */
217*72fa4679SSven Schnelle #define MMCI_TRTYP_BLOCK			0
218*72fa4679SSven Schnelle #define MMCI_TRTYP_MULTI_BLOCK			1
219*72fa4679SSven Schnelle #define MMCI_TRTYP_STREAM			2
220*72fa4679SSven Schnelle 
221*72fa4679SSven Schnelle /* Bit manipulation macros */
222*72fa4679SSven Schnelle #define MMCI_BIT(name)					\
223*72fa4679SSven Schnelle 	(1 << MMCI_##name##_OFFSET)
224*72fa4679SSven Schnelle #define MMCI_BF(name,value)				\
225*72fa4679SSven Schnelle 	(((value) & ((1 << MMCI_##name##_SIZE) - 1))	\
226*72fa4679SSven Schnelle 	 << MMCI_##name##_OFFSET)
227*72fa4679SSven Schnelle #define MMCI_BFEXT(name,value)				\
228*72fa4679SSven Schnelle 	(((value) >> MMCI_##name##_OFFSET)\
229*72fa4679SSven Schnelle 	 & ((1 << MMCI_##name##_SIZE) - 1))
230*72fa4679SSven Schnelle #define MMCI_BFINS(name,value,old)			\
231*72fa4679SSven Schnelle 	(((old) & ~(((1 << MMCI_##name##_SIZE) - 1)	\
232*72fa4679SSven Schnelle 		    << MMCI_##name##_OFFSET))		\
233*72fa4679SSven Schnelle 	 | MMCI_BF(name,value))
234*72fa4679SSven Schnelle 
235*72fa4679SSven Schnelle /*
236*72fa4679SSven Schnelle  * NOTICE: Use of registers offsets is depreciated.
237*72fa4679SSven Schnelle  * These defines will be removed once the old driver
238*72fa4679SSven Schnelle  * is taken out of commision.
239*72fa4679SSven Schnelle  *
240*72fa4679SSven Schnelle  * Register access macros
241*72fa4679SSven Schnelle  */
242*72fa4679SSven Schnelle #define mmci_readl(reg)					\
243*72fa4679SSven Schnelle 	readl((void *)ATMEL_BASE_MMCI + MMCI_##reg)
244*72fa4679SSven Schnelle #define mmci_writel(reg,value)				\
245*72fa4679SSven Schnelle 	writel((value), (void *)ATMEL_BASE_MMCI + MMCI_##reg)
246*72fa4679SSven Schnelle 
247*72fa4679SSven Schnelle #endif /* __ATMEL_MCI_H__ */
248