xref: /rk3399_rockchip-uboot/include/mvebu_mmc.h (revision 3fe3b4fb1c5adb00502276312696e38e9a7e9b5b)
1*3fe3b4fbSDrEagle /*
2*3fe3b4fbSDrEagle  * Marvell MMC/SD/SDIO driver
3*3fe3b4fbSDrEagle  *
4*3fe3b4fbSDrEagle  * (C) Copyright 2012
5*3fe3b4fbSDrEagle  * Marvell Semiconductor <www.marvell.com>
6*3fe3b4fbSDrEagle  * Written-by: Maen Suleiman, Gerald Kerma
7*3fe3b4fbSDrEagle  *
8*3fe3b4fbSDrEagle  * SPDX-License-Identifier:	GPL-2.0+
9*3fe3b4fbSDrEagle  */
10*3fe3b4fbSDrEagle 
11*3fe3b4fbSDrEagle #ifndef __MVEBU_MMC_H__
12*3fe3b4fbSDrEagle #define __MVEBU_MMC_H__
13*3fe3b4fbSDrEagle 
14*3fe3b4fbSDrEagle /* needed for the mmc_cfg definition */
15*3fe3b4fbSDrEagle #include <mmc.h>
16*3fe3b4fbSDrEagle 
17*3fe3b4fbSDrEagle #define MMC_BLOCK_SIZE				512
18*3fe3b4fbSDrEagle 
19*3fe3b4fbSDrEagle /*
20*3fe3b4fbSDrEagle  * Clock rates
21*3fe3b4fbSDrEagle  */
22*3fe3b4fbSDrEagle 
23*3fe3b4fbSDrEagle #define MVEBU_MMC_CLOCKRATE_MAX			50000000
24*3fe3b4fbSDrEagle #define MVEBU_MMC_BASE_DIV_MAX			0x7ff
25*3fe3b4fbSDrEagle #define MVEBU_MMC_BASE_FAST_CLOCK		CONFIG_SYS_TCLK
26*3fe3b4fbSDrEagle #define MVEBU_MMC_BASE_FAST_CLK_100		100000000
27*3fe3b4fbSDrEagle #define MVEBU_MMC_BASE_FAST_CLK_200		200000000
28*3fe3b4fbSDrEagle 
29*3fe3b4fbSDrEagle /* SDIO register */
30*3fe3b4fbSDrEagle #define SDIO_SYS_ADDR_LOW			0x000
31*3fe3b4fbSDrEagle #define SDIO_SYS_ADDR_HI			0x004
32*3fe3b4fbSDrEagle #define SDIO_BLK_SIZE				0x008
33*3fe3b4fbSDrEagle #define SDIO_BLK_COUNT				0x00c
34*3fe3b4fbSDrEagle #define SDIO_ARG_LOW				0x010
35*3fe3b4fbSDrEagle #define SDIO_ARG_HI				0x014
36*3fe3b4fbSDrEagle #define SDIO_XFER_MODE				0x018
37*3fe3b4fbSDrEagle #define SDIO_CMD				0x01c
38*3fe3b4fbSDrEagle #define SDIO_RSP(i)				(0x020 + ((i)<<2))
39*3fe3b4fbSDrEagle #define SDIO_RSP0				0x020
40*3fe3b4fbSDrEagle #define SDIO_RSP1				0x024
41*3fe3b4fbSDrEagle #define SDIO_RSP2				0x028
42*3fe3b4fbSDrEagle #define SDIO_RSP3				0x02c
43*3fe3b4fbSDrEagle #define SDIO_RSP4				0x030
44*3fe3b4fbSDrEagle #define SDIO_RSP5				0x034
45*3fe3b4fbSDrEagle #define SDIO_RSP6				0x038
46*3fe3b4fbSDrEagle #define SDIO_RSP7				0x03c
47*3fe3b4fbSDrEagle #define SDIO_BUF_DATA_PORT			0x040
48*3fe3b4fbSDrEagle #define SDIO_RSVED				0x044
49*3fe3b4fbSDrEagle #define SDIO_HW_STATE				0x048
50*3fe3b4fbSDrEagle #define SDIO_PRESENT_STATE0			0x048
51*3fe3b4fbSDrEagle #define SDIO_PRESENT_STATE1			0x04c
52*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL				0x050
53*3fe3b4fbSDrEagle #define SDIO_BLK_GAP_CTRL			0x054
54*3fe3b4fbSDrEagle #define SDIO_CLK_CTRL				0x058
55*3fe3b4fbSDrEagle #define SDIO_SW_RESET				0x05c
56*3fe3b4fbSDrEagle #define SDIO_NOR_INTR_STATUS			0x060
57*3fe3b4fbSDrEagle #define SDIO_ERR_INTR_STATUS			0x064
58*3fe3b4fbSDrEagle #define SDIO_NOR_STATUS_EN			0x068
59*3fe3b4fbSDrEagle #define SDIO_ERR_STATUS_EN			0x06c
60*3fe3b4fbSDrEagle #define SDIO_NOR_INTR_EN			0x070
61*3fe3b4fbSDrEagle #define SDIO_ERR_INTR_EN			0x074
62*3fe3b4fbSDrEagle #define SDIO_AUTOCMD12_ERR_STATUS		0x078
63*3fe3b4fbSDrEagle #define SDIO_CURR_BYTE_LEFT			0x07c
64*3fe3b4fbSDrEagle #define SDIO_CURR_BLK_LEFT			0x080
65*3fe3b4fbSDrEagle #define SDIO_AUTOCMD12_ARG_LOW			0x084
66*3fe3b4fbSDrEagle #define SDIO_AUTOCMD12_ARG_HI			0x088
67*3fe3b4fbSDrEagle #define SDIO_AUTOCMD12_INDEX			0x08c
68*3fe3b4fbSDrEagle #define SDIO_AUTO_RSP(i)			(0x090 + ((i)<<2))
69*3fe3b4fbSDrEagle #define SDIO_AUTO_RSP0				0x090
70*3fe3b4fbSDrEagle #define SDIO_AUTO_RSP1				0x094
71*3fe3b4fbSDrEagle #define SDIO_AUTO_RSP2				0x098
72*3fe3b4fbSDrEagle #define SDIO_CLK_DIV				0x128
73*3fe3b4fbSDrEagle 
74*3fe3b4fbSDrEagle #define WINDOW_CTRL(i)				(0x108 + ((i) << 3))
75*3fe3b4fbSDrEagle #define WINDOW_BASE(i)				(0x10c + ((i) << 3))
76*3fe3b4fbSDrEagle 
77*3fe3b4fbSDrEagle /* SDIO_PRESENT_STATE */
78*3fe3b4fbSDrEagle #define CARD_BUSY				(1 << 1)
79*3fe3b4fbSDrEagle #define CMD_INHIBIT				(1 << 0)
80*3fe3b4fbSDrEagle #define CMD_TXACTIVE				(1 << 8)
81*3fe3b4fbSDrEagle #define CMD_RXACTIVE				(1 << 9)
82*3fe3b4fbSDrEagle #define CMD_AUTOCMD12ACTIVE			(1 << 14)
83*3fe3b4fbSDrEagle #define CMD_BUS_BUSY				(CMD_AUTOCMD12ACTIVE |	\
84*3fe3b4fbSDrEagle 						CMD_RXACTIVE |	\
85*3fe3b4fbSDrEagle 						CMD_TXACTIVE |	\
86*3fe3b4fbSDrEagle 						CMD_INHIBIT |	\
87*3fe3b4fbSDrEagle 						CARD_BUSY)
88*3fe3b4fbSDrEagle 
89*3fe3b4fbSDrEagle /*
90*3fe3b4fbSDrEagle  * SDIO_CMD
91*3fe3b4fbSDrEagle  */
92*3fe3b4fbSDrEagle 
93*3fe3b4fbSDrEagle #define SDIO_CMD_RSP_NONE			(0 << 0)
94*3fe3b4fbSDrEagle #define SDIO_CMD_RSP_136			(1 << 0)
95*3fe3b4fbSDrEagle #define SDIO_CMD_RSP_48				(2 << 0)
96*3fe3b4fbSDrEagle #define SDIO_CMD_RSP_48BUSY			(3 << 0)
97*3fe3b4fbSDrEagle 
98*3fe3b4fbSDrEagle #define SDIO_CMD_CHECK_DATACRC16		(1 << 2)
99*3fe3b4fbSDrEagle #define SDIO_CMD_CHECK_CMDCRC			(1 << 3)
100*3fe3b4fbSDrEagle #define SDIO_CMD_INDX_CHECK			(1 << 4)
101*3fe3b4fbSDrEagle #define SDIO_CMD_DATA_PRESENT			(1 << 5)
102*3fe3b4fbSDrEagle #define SDIO_UNEXPECTED_RESP			(1 << 7)
103*3fe3b4fbSDrEagle 
104*3fe3b4fbSDrEagle #define SDIO_CMD_INDEX(x)			((x) << 8)
105*3fe3b4fbSDrEagle 
106*3fe3b4fbSDrEagle /*
107*3fe3b4fbSDrEagle  * SDIO_XFER_MODE
108*3fe3b4fbSDrEagle  */
109*3fe3b4fbSDrEagle 
110*3fe3b4fbSDrEagle #define SDIO_XFER_MODE_STOP_CLK			(1 << 5)
111*3fe3b4fbSDrEagle #define SDIO_XFER_MODE_HW_WR_DATA_EN		(1 << 1)
112*3fe3b4fbSDrEagle #define SDIO_XFER_MODE_AUTO_CMD12		(1 << 2)
113*3fe3b4fbSDrEagle #define SDIO_XFER_MODE_INT_CHK_EN		(1 << 3)
114*3fe3b4fbSDrEagle #define SDIO_XFER_MODE_TO_HOST			(1 << 4)
115*3fe3b4fbSDrEagle #define SDIO_XFER_MODE_DMA			(0 << 6)
116*3fe3b4fbSDrEagle 
117*3fe3b4fbSDrEagle /*
118*3fe3b4fbSDrEagle  * SDIO_HOST_CTRL
119*3fe3b4fbSDrEagle  */
120*3fe3b4fbSDrEagle 
121*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_PUSH_PULL_EN		(1 << 0)
122*3fe3b4fbSDrEagle 
123*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_CARD_TYPE_MEM_ONLY	(0 << 1)
124*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_CARD_TYPE_IO_ONLY	(1 << 1)
125*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_CARD_TYPE_IO_MEM_COMBO	(2 << 1)
126*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_CARD_TYPE_IO_MMC		(3 << 1)
127*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_CARD_TYPE_MASK		(3 << 1)
128*3fe3b4fbSDrEagle 
129*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_BIG_ENDIAN		(1 << 3)
130*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_LSB_FIRST		(1 << 4)
131*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_DATA_WIDTH_1_BIT		(0 << 9)
132*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_DATA_WIDTH_4_BITS	(1 << 9)
133*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_HI_SPEED_EN		(1 << 10)
134*3fe3b4fbSDrEagle 
135*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_TMOUT_MAX		0xf
136*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_TMOUT_MASK		(0xf << 11)
137*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_TMOUT(x)			((x) << 11)
138*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_TMOUT_EN			(1 << 15)
139*3fe3b4fbSDrEagle 
140*3fe3b4fbSDrEagle /*
141*3fe3b4fbSDrEagle  * SDIO_SW_RESET
142*3fe3b4fbSDrEagle  */
143*3fe3b4fbSDrEagle 
144*3fe3b4fbSDrEagle #define SDIO_SW_RESET_NOW			(1 << 8)
145*3fe3b4fbSDrEagle 
146*3fe3b4fbSDrEagle /*
147*3fe3b4fbSDrEagle  * Normal interrupt status bits
148*3fe3b4fbSDrEagle  */
149*3fe3b4fbSDrEagle 
150*3fe3b4fbSDrEagle #define SDIO_NOR_ERROR				(1 << 15)
151*3fe3b4fbSDrEagle #define SDIO_NOR_UNEXP_RSP			(1 << 14)
152*3fe3b4fbSDrEagle #define SDIO_NOR_AUTOCMD12_DONE			(1 << 13)
153*3fe3b4fbSDrEagle #define SDIO_NOR_SUSPEND_ON			(1 << 12)
154*3fe3b4fbSDrEagle #define SDIO_NOR_LMB_FF_8W_AVAIL		(1 << 11)
155*3fe3b4fbSDrEagle #define SDIO_NOR_LMB_FF_8W_FILLED		(1 << 10)
156*3fe3b4fbSDrEagle #define SDIO_NOR_READ_WAIT_ON			(1 << 9)
157*3fe3b4fbSDrEagle #define SDIO_NOR_CARD_INT			(1 << 8)
158*3fe3b4fbSDrEagle #define SDIO_NOR_READ_READY			(1 << 5)
159*3fe3b4fbSDrEagle #define SDIO_NOR_WRITE_READY			(1 << 4)
160*3fe3b4fbSDrEagle #define SDIO_NOR_DMA_INI			(1 << 3)
161*3fe3b4fbSDrEagle #define SDIO_NOR_BLK_GAP_EVT			(1 << 2)
162*3fe3b4fbSDrEagle #define SDIO_NOR_XFER_DONE			(1 << 1)
163*3fe3b4fbSDrEagle #define SDIO_NOR_CMD_DONE			(1 << 0)
164*3fe3b4fbSDrEagle 
165*3fe3b4fbSDrEagle /*
166*3fe3b4fbSDrEagle  * Error status bits
167*3fe3b4fbSDrEagle  */
168*3fe3b4fbSDrEagle 
169*3fe3b4fbSDrEagle #define SDIO_ERR_CRC_STATUS			(1 << 14)
170*3fe3b4fbSDrEagle #define SDIO_ERR_CRC_STARTBIT			(1 << 13)
171*3fe3b4fbSDrEagle #define SDIO_ERR_CRC_ENDBIT			(1 << 12)
172*3fe3b4fbSDrEagle #define SDIO_ERR_RESP_TBIT			(1 << 11)
173*3fe3b4fbSDrEagle #define SDIO_ERR_XFER_SIZE			(1 << 10)
174*3fe3b4fbSDrEagle #define SDIO_ERR_CMD_STARTBIT			(1 << 9)
175*3fe3b4fbSDrEagle #define SDIO_ERR_AUTOCMD12			(1 << 8)
176*3fe3b4fbSDrEagle #define SDIO_ERR_DATA_ENDBIT			(1 << 6)
177*3fe3b4fbSDrEagle #define SDIO_ERR_DATA_CRC			(1 << 5)
178*3fe3b4fbSDrEagle #define SDIO_ERR_DATA_TIMEOUT			(1 << 4)
179*3fe3b4fbSDrEagle #define SDIO_ERR_CMD_INDEX			(1 << 3)
180*3fe3b4fbSDrEagle #define SDIO_ERR_CMD_ENDBIT			(1 << 2)
181*3fe3b4fbSDrEagle #define SDIO_ERR_CMD_CRC			(1 << 1)
182*3fe3b4fbSDrEagle #define SDIO_ERR_CMD_TIMEOUT			(1 << 0)
183*3fe3b4fbSDrEagle /* enable all for polling */
184*3fe3b4fbSDrEagle #define SDIO_POLL_MASK				0xffff
185*3fe3b4fbSDrEagle 
186*3fe3b4fbSDrEagle /*
187*3fe3b4fbSDrEagle  * CMD12 error status bits
188*3fe3b4fbSDrEagle  */
189*3fe3b4fbSDrEagle 
190*3fe3b4fbSDrEagle #define SDIO_AUTOCMD12_ERR_NOTEXE		(1 << 0)
191*3fe3b4fbSDrEagle #define SDIO_AUTOCMD12_ERR_TIMEOUT		(1 << 1)
192*3fe3b4fbSDrEagle #define SDIO_AUTOCMD12_ERR_CRC			(1 << 2)
193*3fe3b4fbSDrEagle #define SDIO_AUTOCMD12_ERR_ENDBIT		(1 << 3)
194*3fe3b4fbSDrEagle #define SDIO_AUTOCMD12_ERR_INDEX		(1 << 4)
195*3fe3b4fbSDrEagle #define SDIO_AUTOCMD12_ERR_RESP_T_BIT		(1 << 5)
196*3fe3b4fbSDrEagle #define SDIO_AUTOCMD12_ERR_RESP_STARTBIT	(1 << 6)
197*3fe3b4fbSDrEagle 
198*3fe3b4fbSDrEagle #define MMC_RSP_PRESENT				(1 << 0)
199*3fe3b4fbSDrEagle /* 136 bit response */
200*3fe3b4fbSDrEagle #define MMC_RSP_136				(1 << 1)
201*3fe3b4fbSDrEagle /* expect valid crc */
202*3fe3b4fbSDrEagle #define MMC_RSP_CRC				(1 << 2)
203*3fe3b4fbSDrEagle /* card may send busy */
204*3fe3b4fbSDrEagle #define MMC_RSP_BUSY				(1 << 3)
205*3fe3b4fbSDrEagle /* response contains opcode */
206*3fe3b4fbSDrEagle #define MMC_RSP_OPCODE				(1 << 4)
207*3fe3b4fbSDrEagle 
208*3fe3b4fbSDrEagle #define MMC_BUSMODE_OPENDRAIN			1
209*3fe3b4fbSDrEagle #define MMC_BUSMODE_PUSHPULL			2
210*3fe3b4fbSDrEagle 
211*3fe3b4fbSDrEagle #define MMC_BUS_WIDTH_1				0
212*3fe3b4fbSDrEagle #define MMC_BUS_WIDTH_4				2
213*3fe3b4fbSDrEagle #define MMC_BUS_WIDTH_8				3
214*3fe3b4fbSDrEagle 
215*3fe3b4fbSDrEagle /* Can the host do 4 bit transfers */
216*3fe3b4fbSDrEagle #define MMC_CAP_4_BIT_DATA			(1 << 0)
217*3fe3b4fbSDrEagle /* Can do MMC high-speed timing */
218*3fe3b4fbSDrEagle #define MMC_CAP_MMC_HIGHSPEED			(1 << 1)
219*3fe3b4fbSDrEagle /* Can do SD high-speed timing */
220*3fe3b4fbSDrEagle #define MMC_CAP_SD_HIGHSPEED			(1 << 2)
221*3fe3b4fbSDrEagle /* Can signal pending SDIO IRQs */
222*3fe3b4fbSDrEagle #define MMC_CAP_SDIO_IRQ			(1 << 3)
223*3fe3b4fbSDrEagle /* Talks only SPI protocols */
224*3fe3b4fbSDrEagle #define MMC_CAP_SPI				(1 << 4)
225*3fe3b4fbSDrEagle /* Needs polling for card-detection */
226*3fe3b4fbSDrEagle #define MMC_CAP_NEEDS_POLL			(1 << 5)
227*3fe3b4fbSDrEagle /* Can the host do 8 bit transfers */
228*3fe3b4fbSDrEagle #define MMC_CAP_8_BIT_DATA			(1 << 6)
229*3fe3b4fbSDrEagle 
230*3fe3b4fbSDrEagle /* Nonremovable e.g. eMMC */
231*3fe3b4fbSDrEagle #define MMC_CAP_NONREMOVABLE			(1 << 8)
232*3fe3b4fbSDrEagle /* Waits while card is busy */
233*3fe3b4fbSDrEagle #define MMC_CAP_WAIT_WHILE_BUSY			(1 << 9)
234*3fe3b4fbSDrEagle /* Allow erase/trim commands */
235*3fe3b4fbSDrEagle #define MMC_CAP_ERASE				(1 << 10)
236*3fe3b4fbSDrEagle /* can support DDR mode at 1.8V */
237*3fe3b4fbSDrEagle #define MMC_CAP_1_8V_DDR			(1 << 11)
238*3fe3b4fbSDrEagle /* can support DDR mode at 1.2V */
239*3fe3b4fbSDrEagle #define MMC_CAP_1_2V_DDR			(1 << 12)
240*3fe3b4fbSDrEagle /* Can power off after boot */
241*3fe3b4fbSDrEagle #define MMC_CAP_POWER_OFF_CARD			(1 << 13)
242*3fe3b4fbSDrEagle /* CMD14/CMD19 bus width ok */
243*3fe3b4fbSDrEagle #define MMC_CAP_BUS_WIDTH_TEST			(1 << 14)
244*3fe3b4fbSDrEagle /* Host supports UHS SDR12 mode */
245*3fe3b4fbSDrEagle #define MMC_CAP_UHS_SDR12			(1 << 15)
246*3fe3b4fbSDrEagle /* Host supports UHS SDR25 mode */
247*3fe3b4fbSDrEagle #define MMC_CAP_UHS_SDR25			(1 << 16)
248*3fe3b4fbSDrEagle /* Host supports UHS SDR50 mode */
249*3fe3b4fbSDrEagle #define MMC_CAP_UHS_SDR50			(1 << 17)
250*3fe3b4fbSDrEagle /* Host supports UHS SDR104 mode */
251*3fe3b4fbSDrEagle #define MMC_CAP_UHS_SDR104			(1 << 18)
252*3fe3b4fbSDrEagle /* Host supports UHS DDR50 mode */
253*3fe3b4fbSDrEagle #define MMC_CAP_UHS_DDR50			(1 << 19)
254*3fe3b4fbSDrEagle /* Host supports Driver Type A */
255*3fe3b4fbSDrEagle #define MMC_CAP_DRIVER_TYPE_A			(1 << 23)
256*3fe3b4fbSDrEagle /* Host supports Driver Type C */
257*3fe3b4fbSDrEagle #define MMC_CAP_DRIVER_TYPE_C			(1 << 24)
258*3fe3b4fbSDrEagle /* Host supports Driver Type D */
259*3fe3b4fbSDrEagle #define MMC_CAP_DRIVER_TYPE_D			(1 << 25)
260*3fe3b4fbSDrEagle /* CMD23 supported. */
261*3fe3b4fbSDrEagle #define MMC_CAP_CMD23				(1 << 30)
262*3fe3b4fbSDrEagle /* Hardware reset */
263*3fe3b4fbSDrEagle #define MMC_CAP_HW_RESET			(1 << 31)
264*3fe3b4fbSDrEagle 
265*3fe3b4fbSDrEagle struct mvebu_mmc_cfg {
266*3fe3b4fbSDrEagle 	u32	mvebu_mmc_base;
267*3fe3b4fbSDrEagle 	u32	mvebu_mmc_clk;
268*3fe3b4fbSDrEagle 	u8	max_bus_width;
269*3fe3b4fbSDrEagle 	struct mmc_config cfg;
270*3fe3b4fbSDrEagle };
271*3fe3b4fbSDrEagle 
272*3fe3b4fbSDrEagle /*
273*3fe3b4fbSDrEagle  * Functions prototypes
274*3fe3b4fbSDrEagle  */
275*3fe3b4fbSDrEagle 
276*3fe3b4fbSDrEagle int mvebu_mmc_init(bd_t *bis);
277*3fe3b4fbSDrEagle 
278*3fe3b4fbSDrEagle #endif /* __MVEBU_MMC_H__ */
279