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