xref: /rk3399_ARM-atf/include/drivers/rpi3/sdhost/rpi3_sdhost.h (revision 0503adf4f336afb731b5804c52c8d0d301926b61)
1*0503adf4SYing-Chun Liu (PaulLiu) /*
2*0503adf4SYing-Chun Liu (PaulLiu)  * Copyright (c) 2019, Linaro Limited
3*0503adf4SYing-Chun Liu (PaulLiu)  * Copyright (c) 2019, Ying-Chun Liu (PaulLiu) <paul.liu@linaro.org>
4*0503adf4SYing-Chun Liu (PaulLiu)  *
5*0503adf4SYing-Chun Liu (PaulLiu)  * SPDX-License-Identifier: BSD-3-Clause
6*0503adf4SYing-Chun Liu (PaulLiu)  */
7*0503adf4SYing-Chun Liu (PaulLiu) 
8*0503adf4SYing-Chun Liu (PaulLiu) #ifndef RPI3_SDHOST_H
9*0503adf4SYing-Chun Liu (PaulLiu) #define	RPI3_SDHOST_H
10*0503adf4SYing-Chun Liu (PaulLiu) 
11*0503adf4SYing-Chun Liu (PaulLiu) #include <drivers/mmc.h>
12*0503adf4SYing-Chun Liu (PaulLiu) #include <stdint.h>
13*0503adf4SYing-Chun Liu (PaulLiu) #include <platform_def.h>
14*0503adf4SYing-Chun Liu (PaulLiu) 
15*0503adf4SYing-Chun Liu (PaulLiu) struct rpi3_sdhost_params {
16*0503adf4SYing-Chun Liu (PaulLiu) 	uintptr_t	reg_base;
17*0503adf4SYing-Chun Liu (PaulLiu) 	uint32_t	clk_rate;
18*0503adf4SYing-Chun Liu (PaulLiu) 	uint32_t	bus_width;
19*0503adf4SYing-Chun Liu (PaulLiu) 	uint32_t        flags;
20*0503adf4SYing-Chun Liu (PaulLiu) 	uint32_t	current_cmd;
21*0503adf4SYing-Chun Liu (PaulLiu) 	uint8_t		cmdbusy;
22*0503adf4SYing-Chun Liu (PaulLiu) 	uint8_t		mmc_app_cmd;
23*0503adf4SYing-Chun Liu (PaulLiu) 	uint32_t	ns_per_fifo_word;
24*0503adf4SYing-Chun Liu (PaulLiu) 	uint32_t	crc_err_retries;
25*0503adf4SYing-Chun Liu (PaulLiu) 
26*0503adf4SYing-Chun Liu (PaulLiu) 	uint32_t	sdcard_rca;
27*0503adf4SYing-Chun Liu (PaulLiu) 	uint32_t	gpio48_pinselect[6];
28*0503adf4SYing-Chun Liu (PaulLiu) };
29*0503adf4SYing-Chun Liu (PaulLiu) 
30*0503adf4SYing-Chun Liu (PaulLiu) void rpi3_sdhost_init(struct rpi3_sdhost_params *params,
31*0503adf4SYing-Chun Liu (PaulLiu) 		      struct mmc_device_info *mmc_dev_info);
32*0503adf4SYing-Chun Liu (PaulLiu) void rpi3_sdhost_stop(void);
33*0503adf4SYing-Chun Liu (PaulLiu) 
34*0503adf4SYing-Chun Liu (PaulLiu) /* Registers */
35*0503adf4SYing-Chun Liu (PaulLiu) #define HC_COMMAND			0x00        /* Command and flags */
36*0503adf4SYing-Chun Liu (PaulLiu) #define HC_ARGUMENT			0x04
37*0503adf4SYing-Chun Liu (PaulLiu) #define HC_TIMEOUTCOUNTER		0x08
38*0503adf4SYing-Chun Liu (PaulLiu) #define HC_CLOCKDIVISOR			0x0c
39*0503adf4SYing-Chun Liu (PaulLiu) #define HC_RESPONSE_0			0x10
40*0503adf4SYing-Chun Liu (PaulLiu) #define HC_RESPONSE_1			0x14
41*0503adf4SYing-Chun Liu (PaulLiu) #define HC_RESPONSE_2			0x18
42*0503adf4SYing-Chun Liu (PaulLiu) #define HC_RESPONSE_3			0x1c
43*0503adf4SYing-Chun Liu (PaulLiu) #define HC_HOSTSTATUS			0x20
44*0503adf4SYing-Chun Liu (PaulLiu) #define HC_POWER			0x30
45*0503adf4SYing-Chun Liu (PaulLiu) #define HC_DEBUG			0x34
46*0503adf4SYing-Chun Liu (PaulLiu) #define HC_HOSTCONFIG			0x38
47*0503adf4SYing-Chun Liu (PaulLiu) #define HC_BLOCKSIZE			0x3c
48*0503adf4SYing-Chun Liu (PaulLiu) #define HC_DATAPORT			0x40
49*0503adf4SYing-Chun Liu (PaulLiu) #define HC_BLOCKCOUNT			0x50
50*0503adf4SYing-Chun Liu (PaulLiu) 
51*0503adf4SYing-Chun Liu (PaulLiu) /* Flags for HC_COMMAND register */
52*0503adf4SYing-Chun Liu (PaulLiu) #define HC_CMD_ENABLE			0x8000
53*0503adf4SYing-Chun Liu (PaulLiu) #define HC_CMD_FAILED			0x4000
54*0503adf4SYing-Chun Liu (PaulLiu) #define HC_CMD_BUSY			0x0800
55*0503adf4SYing-Chun Liu (PaulLiu) #define HC_CMD_RESPONSE_NONE		0x0400
56*0503adf4SYing-Chun Liu (PaulLiu) #define HC_CMD_RESPONSE_LONG		0x0200
57*0503adf4SYing-Chun Liu (PaulLiu) #define HC_CMD_WRITE			0x0080
58*0503adf4SYing-Chun Liu (PaulLiu) #define HC_CMD_READ			0x0040
59*0503adf4SYing-Chun Liu (PaulLiu) #define HC_CMD_COMMAND_MASK		0x003f
60*0503adf4SYing-Chun Liu (PaulLiu) 
61*0503adf4SYing-Chun Liu (PaulLiu) #define HC_CLOCKDIVISOR_MAXVAL		0x07ff
62*0503adf4SYing-Chun Liu (PaulLiu) #define HC_CLOCKDIVISOR_PREFERVAL	0x027b
63*0503adf4SYing-Chun Liu (PaulLiu) #define HC_CLOCKDIVISOR_SLOWVAL		0x0148
64*0503adf4SYing-Chun Liu (PaulLiu) #define HC_CLOCKDIVISOR_STOPVAL		0x01fb
65*0503adf4SYing-Chun Liu (PaulLiu) 
66*0503adf4SYing-Chun Liu (PaulLiu) /* Flags for HC_HOSTSTATUS register */
67*0503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTST_HAVEDATA		0x0001
68*0503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTST_ERROR_FIFO		0x0008
69*0503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTST_ERROR_CRC7		0x0010
70*0503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTST_ERROR_CRC16		0x0020
71*0503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTST_TIMEOUT_CMD		0x0040
72*0503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTST_TIMEOUT_DATA		0x0080
73*0503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTST_INT_BLOCK		0x0200
74*0503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTST_INT_BUSY		0x0400
75*0503adf4SYing-Chun Liu (PaulLiu) 
76*0503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTST_RESET			0xffff
77*0503adf4SYing-Chun Liu (PaulLiu) 
78*0503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTST_MASK_ERROR_DATA	(HC_HSTST_ERROR_FIFO | \
79*0503adf4SYing-Chun Liu (PaulLiu) 					 HC_HSTST_ERROR_CRC7 | \
80*0503adf4SYing-Chun Liu (PaulLiu) 					 HC_HSTST_ERROR_CRC16 | \
81*0503adf4SYing-Chun Liu (PaulLiu) 					 HC_HSTST_TIMEOUT_DATA)
82*0503adf4SYing-Chun Liu (PaulLiu) 
83*0503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTST_MASK_ERROR_ALL		(HC_HSTST_MASK_ERROR_DATA | \
84*0503adf4SYing-Chun Liu (PaulLiu) 					 HC_HSTST_TIMEOUT_CMD)
85*0503adf4SYing-Chun Liu (PaulLiu) 
86*0503adf4SYing-Chun Liu (PaulLiu) /* Flags for HC_HOSTCONFIG register */
87*0503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTCF_INTBUS_WIDE		0x0002
88*0503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTCF_EXTBUS_4BIT		0x0004
89*0503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTCF_SLOW_CARD		0x0008
90*0503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTCF_INT_DATA		0x0010
91*0503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTCF_INT_BLOCK		0x0100
92*0503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTCF_INT_BUSY		0x0400
93*0503adf4SYing-Chun Liu (PaulLiu) 
94*0503adf4SYing-Chun Liu (PaulLiu) /* Flags for HC_DEBUG register */
95*0503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FIFO_THRESH_WRITE_SHIFT	9
96*0503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FIFO_THRESH_READ_SHIFT	14
97*0503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FIFO_THRESH_MASK		0x001f
98*0503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_MASK			0xf
99*0503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_IDENTMODE		0x0
100*0503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_DATAMODE		0x1
101*0503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_READDATA		0x2
102*0503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_WRITEDATA		0x3
103*0503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_READWAIT		0x4
104*0503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_READCRC		0x5
105*0503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_WRITECRC		0x6
106*0503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_WRITEWAIT1		0x7
107*0503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_POWERDOWN		0x8
108*0503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_POWERUP		0x9
109*0503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_WRITESTART1		0xa
110*0503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_WRITESTART2		0xb
111*0503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_GENPULSES		0xc
112*0503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_WRITEWAIT2		0xd
113*0503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_STARTPOWDOWN		0xf
114*0503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FORCE_DATA_MODE		0x40000
115*0503adf4SYing-Chun Liu (PaulLiu) 
116*0503adf4SYing-Chun Liu (PaulLiu) /* Settings */
117*0503adf4SYing-Chun Liu (PaulLiu) #define HC_FIFO_SIZE			16
118*0503adf4SYing-Chun Liu (PaulLiu) #define HC_FIFO_THRESH_READ		4
119*0503adf4SYing-Chun Liu (PaulLiu) #define HC_FIFO_THRESH_WRITE		4
120*0503adf4SYing-Chun Liu (PaulLiu) 
121*0503adf4SYing-Chun Liu (PaulLiu) #define HC_TIMEOUT_DEFAULT		0x00f00000
122*0503adf4SYing-Chun Liu (PaulLiu) #define HC_TIMEOUT_IDLE			0x00a00000
123*0503adf4SYing-Chun Liu (PaulLiu) 
124*0503adf4SYing-Chun Liu (PaulLiu) #endif  /* RPI3_SDHOST_H */
125