xref: /rk3399_ARM-atf/include/drivers/nxp/sd/sd_mmc.h (revision 87311b4c16730b884c7e4ff01e3faea83f2731be)
1*050a99a6SPankaj Gupta /*
2*050a99a6SPankaj Gupta  * Copyright (c) 2015, 2016 Freescale Semiconductor, Inc.
3*050a99a6SPankaj Gupta  * Copyright 2017-2021 NXP
4*050a99a6SPankaj Gupta  *
5*050a99a6SPankaj Gupta  * SPDX-License-Identifier: BSD-3-Clause
6*050a99a6SPankaj Gupta  *
7*050a99a6SPankaj Gupta  */
8*050a99a6SPankaj Gupta 
9*050a99a6SPankaj Gupta #ifndef SD_MMC_H
10*050a99a6SPankaj Gupta #define SD_MMC_H
11*050a99a6SPankaj Gupta 
12*050a99a6SPankaj Gupta #include <lib/mmio.h>
13*050a99a6SPankaj Gupta 
14*050a99a6SPankaj Gupta /* operating freq */
15*050a99a6SPankaj Gupta #define CARD_IDENTIFICATION_FREQ	400000
16*050a99a6SPankaj Gupta #define SD_SS_25MHZ	20000000
17*050a99a6SPankaj Gupta #define SD_HS_50MHZ	40000000
18*050a99a6SPankaj Gupta #define MMC_SS_20MHZ	15000000
19*050a99a6SPankaj Gupta #define MMC_HS_26MHZ	20000000
20*050a99a6SPankaj Gupta #define MMC_HS_52MHZ	40000000
21*050a99a6SPankaj Gupta 
22*050a99a6SPankaj Gupta /* Need to check this value ? */
23*050a99a6SPankaj Gupta #define MAX_PLATFORM_CLOCK	800000000
24*050a99a6SPankaj Gupta 
25*050a99a6SPankaj Gupta /* eSDHC system control register defines */
26*050a99a6SPankaj Gupta #define ESDHC_SYSCTL_DTOCV(t)		(((t) & 0xF) << 16)
27*050a99a6SPankaj Gupta #define ESDHC_SYSCTL_SDCLKFS(f)		(((f) & 0xFF) << 8)
28*050a99a6SPankaj Gupta #define ESDHC_SYSCTL_DVS(d)		(((d) & 0xF) << 4)
29*050a99a6SPankaj Gupta #define ESDHC_SYSCTL_SDCLKEN		(0x00000008)
30*050a99a6SPankaj Gupta #define ESDHC_SYSCTL_RSTA		(0x01000000)
31*050a99a6SPankaj Gupta 
32*050a99a6SPankaj Gupta /* Data timeout counter value. SDHC_CLK x 227 */
33*050a99a6SPankaj Gupta #define TIMEOUT_COUNTER_SDCLK_2_27	0xE
34*050a99a6SPankaj Gupta #define ESDHC_SYSCTL_INITA	0x08000000
35*050a99a6SPankaj Gupta 
36*050a99a6SPankaj Gupta /* eSDHC interrupt status enable register defines */
37*050a99a6SPankaj Gupta #define ESDHC_IRQSTATEN_CINS	0x00000040
38*050a99a6SPankaj Gupta #define ESDHC_IRQSTATEN_BWR	0x00000010
39*050a99a6SPankaj Gupta 
40*050a99a6SPankaj Gupta /* eSDHC interrupt status register defines */
41*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_DMAE	(0x10000000)
42*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_AC12E	(0x01000000)
43*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_DEBE	(0x00400000)
44*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_DCE	(0x00200000)
45*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_DTOE	(0x00100000)
46*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_CIE	(0x00080000)
47*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_CEBE	(0x00040000)
48*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_CCE	(0x00020000)
49*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_CTOE	(0x00010000)
50*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_CINT	(0x00000100)
51*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_CRM	(0x00000080)
52*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_CINS	(0x00000040)
53*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_BRR	(0x00000020)
54*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_BWR	(0x00000010)
55*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_DINT	(0x00000008)
56*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_BGE	(0x00000004)
57*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_TC	(0x00000002)
58*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_CC	(0x00000001)
59*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_CMD_ERR	(ESDHC_IRQSTAT_CIE |\
60*050a99a6SPankaj Gupta 			ESDHC_IRQSTAT_CEBE |\
61*050a99a6SPankaj Gupta 			ESDHC_IRQSTAT_CCE)
62*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_DATA_ERR	(ESDHC_IRQSTAT_DEBE |\
63*050a99a6SPankaj Gupta 			ESDHC_IRQSTAT_DCE |\
64*050a99a6SPankaj Gupta 			ESDHC_IRQSTAT_DTOE)
65*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_CLEAR_ALL	(0xFFFFFFFF)
66*050a99a6SPankaj Gupta 
67*050a99a6SPankaj Gupta /* eSDHC present state register defines */
68*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_CLSL	0x00800000
69*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_WPSPL	0x00080000
70*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_CDPL	0x00040000
71*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_CINS	0x00010000
72*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_BREN	0x00000800
73*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_BWEN	0x00000400
74*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_RTA	0x00000200
75*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_WTA	0x00000100
76*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_SDOFF	0x00000080
77*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_PEROFF	0x00000040
78*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_HCKOFF	0x00000020
79*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_IPGOFF	0x00000010
80*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_DLA	0x00000004
81*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_CDIHB	0x00000002
82*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_CIHB	0x00000001
83*050a99a6SPankaj Gupta 
84*050a99a6SPankaj Gupta /* eSDHC protocol control register defines */
85*050a99a6SPankaj Gupta #define ESDHC_PROCTL_EMODE_LE	0x00000020
86*050a99a6SPankaj Gupta #define ESDHC_PROCTL_DTW_1BIT	0x00000000
87*050a99a6SPankaj Gupta #define ESDHC_PROCTL_DTW_4BIT	0x00000002
88*050a99a6SPankaj Gupta #define ESDHC_PROCTL_DTW_8BIT	0x00000004
89*050a99a6SPankaj Gupta 
90*050a99a6SPankaj Gupta /* Watermark Level Register (WML) */
91*050a99a6SPankaj Gupta #define ESDHC_WML_RD_WML(w)	((w) & 0x7F)
92*050a99a6SPankaj Gupta #define ESDHC_WML_WR_WML(w)	(((w) & 0x7F) << 16)
93*050a99a6SPankaj Gupta #define ESDHC_WML_RD_BRST(w)	(((w) & 0xF) << 8)
94*050a99a6SPankaj Gupta #define ESDHC_WML_WR_BRST(w)	(((w) & 0xF) << 24)
95*050a99a6SPankaj Gupta #define ESDHC_WML_WR_BRST_MASK	(0x0F000000)
96*050a99a6SPankaj Gupta #define ESDHC_WML_RD_BRST_MASK	(0x00000F00)
97*050a99a6SPankaj Gupta #define ESDHC_WML_RD_WML_MASK	(0x0000007F)
98*050a99a6SPankaj Gupta #define ESDHC_WML_WR_WML_MASK	(0x007F0000)
99*050a99a6SPankaj Gupta #define WML_512_BYTES		(0x0)
100*050a99a6SPankaj Gupta #define BURST_128_BYTES	(0x0)
101*050a99a6SPankaj Gupta 
102*050a99a6SPankaj Gupta /* eSDHC control register define */
103*050a99a6SPankaj Gupta #define ESDHC_DCR_SNOOP		0x00000040
104*050a99a6SPankaj Gupta 
105*050a99a6SPankaj Gupta /* ESDHC Block attributes register */
106*050a99a6SPankaj Gupta #define ESDHC_BLKATTR_BLKCNT(c)	(((c) & 0xffff) << 16)
107*050a99a6SPankaj Gupta #define ESDHC_BLKATTR_BLKSZE(s)	((s) & 0xfff)
108*050a99a6SPankaj Gupta 
109*050a99a6SPankaj Gupta /* Transfer Type Register */
110*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_CMD(c)	(((c) & 0x3F) << 24)
111*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_CMDTYP_NORMAL	(0x0)
112*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_CMDTYP_SUSPEND	(0x00400000)
113*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_CMDTYP_RESUME	(0x00800000)
114*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_CMDTYP_ABORT	(0x00C00000)
115*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_DPSEL	(0x00200000)
116*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_CICEN	(0x00100000)
117*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_CCCEN	(0x00080000)
118*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_RSPTYP_NONE	(0x0)
119*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_RSPTYP_136	(0x00010000)
120*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_RSPTYP_48	(0x00020000)
121*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_RSPTYP_48_BUSY	(0x00030000)
122*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_MSBSEL	(0x00000020)
123*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_DTDSEL	(0x00000010)
124*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_AC12EN	(0x00000004)
125*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_BCEN	(0x00000002)
126*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_DMAEN	(0x00000001)
127*050a99a6SPankaj Gupta 
128*050a99a6SPankaj Gupta #define MMC_VDD_HIGH_VOLTAGE	0x00000100
129*050a99a6SPankaj Gupta 
130*050a99a6SPankaj Gupta /* command index */
131*050a99a6SPankaj Gupta #define CMD0	0
132*050a99a6SPankaj Gupta #define CMD1	1
133*050a99a6SPankaj Gupta #define CMD2	2
134*050a99a6SPankaj Gupta #define CMD3	3
135*050a99a6SPankaj Gupta #define CMD5	5
136*050a99a6SPankaj Gupta #define CMD6	6
137*050a99a6SPankaj Gupta #define CMD7	7
138*050a99a6SPankaj Gupta #define CMD8	8
139*050a99a6SPankaj Gupta #define CMD9	9
140*050a99a6SPankaj Gupta #define CMD12	12
141*050a99a6SPankaj Gupta #define CMD13	13
142*050a99a6SPankaj Gupta #define CMD14	14
143*050a99a6SPankaj Gupta #define CMD16	16
144*050a99a6SPankaj Gupta #define CMD17	17
145*050a99a6SPankaj Gupta #define CMD18	18
146*050a99a6SPankaj Gupta #define CMD19	19
147*050a99a6SPankaj Gupta #define CMD24	24
148*050a99a6SPankaj Gupta #define CMD41	41
149*050a99a6SPankaj Gupta #define CMD42	42
150*050a99a6SPankaj Gupta #define CMD51	51
151*050a99a6SPankaj Gupta #define CMD55	55
152*050a99a6SPankaj Gupta #define CMD56	56
153*050a99a6SPankaj Gupta #define ACMD6	CMD6
154*050a99a6SPankaj Gupta #define ACMD13	CMD13
155*050a99a6SPankaj Gupta #define ACMD41	CMD41
156*050a99a6SPankaj Gupta #define ACMD42	CMD42
157*050a99a6SPankaj Gupta #define ACMD51	CMD51
158*050a99a6SPankaj Gupta 
159*050a99a6SPankaj Gupta /* commands abbreviations */
160*050a99a6SPankaj Gupta #define CMD_GO_IDLE_STATE	CMD0
161*050a99a6SPankaj Gupta #define CMD_MMC_SEND_OP_COND	CMD1
162*050a99a6SPankaj Gupta #define CMD_ALL_SEND_CID	CMD2
163*050a99a6SPankaj Gupta #define CMD_SEND_RELATIVE_ADDR	CMD3
164*050a99a6SPankaj Gupta #define CMD_SET_DSR	CMD4
165*050a99a6SPankaj Gupta #define CMD_SWITCH_FUNC	CMD6
166*050a99a6SPankaj Gupta #define CMD_SELECT_CARD	CMD7
167*050a99a6SPankaj Gupta #define CMD_DESELECT_CARD	CMD7
168*050a99a6SPankaj Gupta #define CMD_SEND_IF_COND	CMD8
169*050a99a6SPankaj Gupta #define CMD_MMC_SEND_EXT_CSD	CMD8
170*050a99a6SPankaj Gupta #define CMD_SEND_CSD	CMD9
171*050a99a6SPankaj Gupta #define CMD_SEND_CID	CMD10
172*050a99a6SPankaj Gupta #define CMD_STOP_TRANSMISSION	CMD12
173*050a99a6SPankaj Gupta #define CMD_SEND_STATUS	CMD13
174*050a99a6SPankaj Gupta #define CMD_BUS_TEST_R	CMD14
175*050a99a6SPankaj Gupta #define CMD_GO_INACTIVE_STATE	CMD15
176*050a99a6SPankaj Gupta #define CMD_SET_BLOCKLEN	CMD16
177*050a99a6SPankaj Gupta #define CMD_READ_SINGLE_BLOCK	CMD17
178*050a99a6SPankaj Gupta #define CMD_READ_MULTIPLE_BLOCK	CMD18
179*050a99a6SPankaj Gupta #define CMD_WRITE_SINGLE_BLOCK	CMD24
180*050a99a6SPankaj Gupta #define CMD_BUS_TEST_W	CMD19
181*050a99a6SPankaj Gupta #define CMD_APP_CMD	CMD55
182*050a99a6SPankaj Gupta #define CMD_GEN_CMD	CMD56
183*050a99a6SPankaj Gupta #define CMD_SET_BUS_WIDTH	ACMD6
184*050a99a6SPankaj Gupta #define CMD_SD_STATUS	ACMD13
185*050a99a6SPankaj Gupta #define CMD_SD_SEND_OP_COND	ACMD41
186*050a99a6SPankaj Gupta #define CMD_SET_CLR_CARD_DETECT	ACMD42
187*050a99a6SPankaj Gupta #define CMD_SEND_SCR	ACMD51
188*050a99a6SPankaj Gupta 
189*050a99a6SPankaj Gupta /* MMC card spec version */
190*050a99a6SPankaj Gupta #define MMC_CARD_VERSION_1_2	0
191*050a99a6SPankaj Gupta #define MMC_CARD_VERSION_1_4	1
192*050a99a6SPankaj Gupta #define MMC_CARD_VERSION_2_X	2
193*050a99a6SPankaj Gupta #define MMC_CARD_VERSION_3_X	3
194*050a99a6SPankaj Gupta #define MMC_CARD_VERSION_4_X	4
195*050a99a6SPankaj Gupta 
196*050a99a6SPankaj Gupta /* SD Card Spec Version */
197*050a99a6SPankaj Gupta /* May need to add version 3 here? */
198*050a99a6SPankaj Gupta #define SD_CARD_VERSION_1_0	0
199*050a99a6SPankaj Gupta #define SD_CARD_VERSION_1_10	1
200*050a99a6SPankaj Gupta #define SD_CARD_VERSION_2_0	2
201*050a99a6SPankaj Gupta 
202*050a99a6SPankaj Gupta /* card types */
203*050a99a6SPankaj Gupta #define MMC_CARD	0
204*050a99a6SPankaj Gupta #define SD_CARD		1
205*050a99a6SPankaj Gupta #define NOT_SD_CARD	MMC_CARD
206*050a99a6SPankaj Gupta 
207*050a99a6SPankaj Gupta /* Card rca */
208*050a99a6SPankaj Gupta #define SD_MMC_CARD_RCA	0x1
209*050a99a6SPankaj Gupta #define BLOCK_LEN_512	512
210*050a99a6SPankaj Gupta 
211*050a99a6SPankaj Gupta /* card state */
212*050a99a6SPankaj Gupta #define STATE_IDLE	0
213*050a99a6SPankaj Gupta #define STATE_READY	1
214*050a99a6SPankaj Gupta #define STATE_IDENT	2
215*050a99a6SPankaj Gupta #define STATE_STBY	3
216*050a99a6SPankaj Gupta #define STATE_TRAN	4
217*050a99a6SPankaj Gupta #define STATE_DATA	5
218*050a99a6SPankaj Gupta #define STATE_RCV	6
219*050a99a6SPankaj Gupta #define STATE_PRG	7
220*050a99a6SPankaj Gupta #define STATE_DIS	8
221*050a99a6SPankaj Gupta 
222*050a99a6SPankaj Gupta /* Card OCR register */
223*050a99a6SPankaj Gupta /* VDD voltage window 1,65 to 1.95 */
224*050a99a6SPankaj Gupta #define MMC_OCR_VDD_165_195	0x00000080
225*050a99a6SPankaj Gupta /* VDD voltage window 2.7-2.8 */
226*050a99a6SPankaj Gupta #define MMC_OCR_VDD_FF8	0x00FF8000
227*050a99a6SPankaj Gupta #define MMC_OCR_CCS	0x40000000/* Card Capacity */
228*050a99a6SPankaj Gupta #define MMC_OCR_BUSY	0x80000000/* busy bit */
229*050a99a6SPankaj Gupta #define SD_OCR_HCS	0x40000000/* High capacity host */
230*050a99a6SPankaj Gupta #define MMC_OCR_SECTOR_MODE	0x40000000/* Access Mode as Sector */
231*050a99a6SPankaj Gupta 
232*050a99a6SPankaj Gupta /* mmc Switch function */
233*050a99a6SPankaj Gupta #define SET_EXT_CSD_HS_TIMING	0x03B90100/* set High speed */
234*050a99a6SPankaj Gupta 
235*050a99a6SPankaj Gupta /* check supports switching or not */
236*050a99a6SPankaj Gupta #define SD_SWITCH_FUNC_CHECK_MODE	0x00FFFFF1
237*050a99a6SPankaj Gupta #define SD_SWITCH_FUNC_SWITCH_MODE	0x80FFFFF1/* switch */
238*050a99a6SPankaj Gupta #define SD_SWITCH_FUNC_HIGH_SPEED	0x02/* HIGH SPEED FUNC */
239*050a99a6SPankaj Gupta #define SWITCH_ERROR		0x00000080
240*050a99a6SPankaj Gupta 
241*050a99a6SPankaj Gupta /* errors in sending commands */
242*050a99a6SPankaj Gupta #define RESP_TIMEOUT	0x1
243*050a99a6SPankaj Gupta #define COMMAND_ERROR	0x2
244*050a99a6SPankaj Gupta /* error in response */
245*050a99a6SPankaj Gupta #define R1_ERROR	(1 << 19)
246*050a99a6SPankaj Gupta #define R1_CURRENT_STATE(x)	(((x) & 0x00001E00) >> 9)
247*050a99a6SPankaj Gupta 
248*050a99a6SPankaj Gupta /* Host Controller Capabilities */
249*050a99a6SPankaj Gupta #define ESDHC_HOSTCAPBLT_DMAS           (0x00400000)
250*050a99a6SPankaj Gupta 
251*050a99a6SPankaj Gupta 
252*050a99a6SPankaj Gupta /* SD/MMC memory map */
253*050a99a6SPankaj Gupta struct esdhc_regs {
254*050a99a6SPankaj Gupta 	uint32_t dsaddr;	/* dma system address */
255*050a99a6SPankaj Gupta 	uint32_t blkattr;	/* Block attributes */
256*050a99a6SPankaj Gupta 	uint32_t cmdarg;	/* Command argument */
257*050a99a6SPankaj Gupta 	uint32_t xfertyp;	/* Command transfer type */
258*050a99a6SPankaj Gupta 	uint32_t cmdrsp[4];	/* Command response0,1,2,3 */
259*050a99a6SPankaj Gupta 	uint32_t datport;	/* Data buffer access port */
260*050a99a6SPankaj Gupta 	uint32_t prsstat;	/* Present state */
261*050a99a6SPankaj Gupta 	uint32_t proctl;	/* Protocol control */
262*050a99a6SPankaj Gupta 	uint32_t sysctl;	/* System control */
263*050a99a6SPankaj Gupta 	uint32_t irqstat;	/* Interrupt status */
264*050a99a6SPankaj Gupta 	uint32_t irqstaten;	/* Interrupt status enable */
265*050a99a6SPankaj Gupta 	uint32_t irqsigen;	/* Interrupt signal enable */
266*050a99a6SPankaj Gupta 	uint32_t autoc12err;	/* Auto CMD12 status */
267*050a99a6SPankaj Gupta 	uint32_t hostcapblt;	/* Host controller capabilities */
268*050a99a6SPankaj Gupta 	uint32_t wml;	/* Watermark level */
269*050a99a6SPankaj Gupta 	uint32_t res1[2];
270*050a99a6SPankaj Gupta 	uint32_t fevt;	/* Force event */
271*050a99a6SPankaj Gupta 	uint32_t res2;
272*050a99a6SPankaj Gupta 	uint32_t adsaddrl;
273*050a99a6SPankaj Gupta 	uint32_t adsaddrh;
274*050a99a6SPankaj Gupta 	uint32_t res3[39];
275*050a99a6SPankaj Gupta 	uint32_t hostver;	/* Host controller version */
276*050a99a6SPankaj Gupta 	uint32_t res4;
277*050a99a6SPankaj Gupta 	uint32_t dmaerr;	/* DMA error address */
278*050a99a6SPankaj Gupta 	uint32_t dmaerrh;	/* DMA error address high */
279*050a99a6SPankaj Gupta 	uint32_t dmaerrattr; /* DMA error atrribute */
280*050a99a6SPankaj Gupta 	uint32_t res5;
281*050a99a6SPankaj Gupta 	uint32_t hostcapblt2;/* Host controller capabilities2 */
282*050a99a6SPankaj Gupta 	uint32_t res6[2];
283*050a99a6SPankaj Gupta 	uint32_t tcr;	/* Tuning control */
284*050a99a6SPankaj Gupta 	uint32_t res7[7];
285*050a99a6SPankaj Gupta 	uint32_t dirctrl;	/* Direction control */
286*050a99a6SPankaj Gupta 	uint32_t ccr;	/* Clock control */
287*050a99a6SPankaj Gupta 	uint32_t res8[177];
288*050a99a6SPankaj Gupta 	uint32_t ctl;	/* Control register */
289*050a99a6SPankaj Gupta };
290*050a99a6SPankaj Gupta 
291*050a99a6SPankaj Gupta /* SD/MMC card attributes */
292*050a99a6SPankaj Gupta struct card_attributes {
293*050a99a6SPankaj Gupta 	uint32_t type;	/* sd or mmc card */
294*050a99a6SPankaj Gupta 	uint32_t version;	/* version */
295*050a99a6SPankaj Gupta 	uint32_t block_len;	/* block length */
296*050a99a6SPankaj Gupta 	uint32_t bus_freq;	/* sdhc bus frequency */
297*050a99a6SPankaj Gupta 	uint16_t rca;	/* relative card address */
298*050a99a6SPankaj Gupta 	uint8_t is_high_capacity;	/* high capacity */
299*050a99a6SPankaj Gupta };
300*050a99a6SPankaj Gupta 
301*050a99a6SPankaj Gupta struct mmc {
302*050a99a6SPankaj Gupta 	struct esdhc_regs *esdhc_regs;
303*050a99a6SPankaj Gupta 	struct card_attributes card;
304*050a99a6SPankaj Gupta 
305*050a99a6SPankaj Gupta 	uint32_t block_len;
306*050a99a6SPankaj Gupta 	uint32_t voltages_caps;	/* supported voltaes */
307*050a99a6SPankaj Gupta 	uint32_t dma_support;	/* DMA support */
308*050a99a6SPankaj Gupta };
309*050a99a6SPankaj Gupta 
310*050a99a6SPankaj Gupta enum cntrl_num {
311*050a99a6SPankaj Gupta 	SDHC1 = 0,
312*050a99a6SPankaj Gupta 	SDHC2
313*050a99a6SPankaj Gupta };
314*050a99a6SPankaj Gupta 
315*050a99a6SPankaj Gupta int sd_emmc_init(uintptr_t *block_dev_spec,
316*050a99a6SPankaj Gupta 			uintptr_t nxp_esdhc_addr,
317*050a99a6SPankaj Gupta 			size_t nxp_sd_block_offset,
318*050a99a6SPankaj Gupta 			size_t nxp_sd_block_size,
319*050a99a6SPankaj Gupta 			bool card_detect);
320*050a99a6SPankaj Gupta 
321*050a99a6SPankaj Gupta int esdhc_emmc_init(struct mmc *mmc, bool card_detect);
322*050a99a6SPankaj Gupta int esdhc_read(struct mmc *mmc, uint32_t src_offset, uintptr_t dst,
323*050a99a6SPankaj Gupta 	       size_t size);
324*050a99a6SPankaj Gupta int esdhc_write(struct mmc *mmc, uintptr_t src, uint32_t dst_offset,
325*050a99a6SPankaj Gupta 		size_t size);
326*050a99a6SPankaj Gupta 
327*050a99a6SPankaj Gupta #ifdef NXP_ESDHC_BE
328*050a99a6SPankaj Gupta #define esdhc_in32(a)           bswap32(mmio_read_32((uintptr_t)(a)))
329*050a99a6SPankaj Gupta #define esdhc_out32(a, v)       mmio_write_32((uintptr_t)(a), bswap32(v))
330*050a99a6SPankaj Gupta #elif defined(NXP_ESDHC_LE)
331*050a99a6SPankaj Gupta #define esdhc_in32(a)           mmio_read_32((uintptr_t)(a))
332*050a99a6SPankaj Gupta #define esdhc_out32(a, v)       mmio_write_32((uintptr_t)(a), (v))
333*050a99a6SPankaj Gupta #else
334*050a99a6SPankaj Gupta #error Please define CCSR ESDHC register endianness
335*050a99a6SPankaj Gupta #endif
336*050a99a6SPankaj Gupta 
337*050a99a6SPankaj Gupta #endif /*SD_MMC_H*/
338