xref: /rk3399_ARM-atf/include/drivers/rpi3/sdhost/rpi3_sdhost.h (revision 24ddb6ce01ec7c9007e16ed35ca5fff1eb5846df)
10503adf4SYing-Chun Liu (PaulLiu) /*
20503adf4SYing-Chun Liu (PaulLiu)  * Copyright (c) 2019, Linaro Limited
30503adf4SYing-Chun Liu (PaulLiu)  * Copyright (c) 2019, Ying-Chun Liu (PaulLiu) <paul.liu@linaro.org>
40503adf4SYing-Chun Liu (PaulLiu)  *
50503adf4SYing-Chun Liu (PaulLiu)  * SPDX-License-Identifier: BSD-3-Clause
60503adf4SYing-Chun Liu (PaulLiu)  */
70503adf4SYing-Chun Liu (PaulLiu) 
80503adf4SYing-Chun Liu (PaulLiu) #ifndef RPI3_SDHOST_H
90503adf4SYing-Chun Liu (PaulLiu) #define	RPI3_SDHOST_H
100503adf4SYing-Chun Liu (PaulLiu) 
110503adf4SYing-Chun Liu (PaulLiu) #include <drivers/mmc.h>
120503adf4SYing-Chun Liu (PaulLiu) #include <stdint.h>
130503adf4SYing-Chun Liu (PaulLiu) #include <platform_def.h>
140503adf4SYing-Chun Liu (PaulLiu) 
150503adf4SYing-Chun Liu (PaulLiu) struct rpi3_sdhost_params {
160503adf4SYing-Chun Liu (PaulLiu) 	uintptr_t	reg_base;
170503adf4SYing-Chun Liu (PaulLiu) 	uint32_t	clk_rate;
18*bd96d533SRob Newberry 	uint32_t	clk_rate_initial;
190503adf4SYing-Chun Liu (PaulLiu) 	uint32_t	bus_width;
200503adf4SYing-Chun Liu (PaulLiu) 	uint32_t        flags;
210503adf4SYing-Chun Liu (PaulLiu) 	uint32_t	current_cmd;
220503adf4SYing-Chun Liu (PaulLiu) 	uint8_t		cmdbusy;
230503adf4SYing-Chun Liu (PaulLiu) 	uint8_t		mmc_app_cmd;
240503adf4SYing-Chun Liu (PaulLiu) 	uint32_t	ns_per_fifo_word;
250503adf4SYing-Chun Liu (PaulLiu) 
260503adf4SYing-Chun Liu (PaulLiu) 	uint32_t	sdcard_rca;
270503adf4SYing-Chun Liu (PaulLiu) 	uint32_t	gpio48_pinselect[6];
280503adf4SYing-Chun Liu (PaulLiu) };
290503adf4SYing-Chun Liu (PaulLiu) 
300503adf4SYing-Chun Liu (PaulLiu) void rpi3_sdhost_init(struct rpi3_sdhost_params *params,
310503adf4SYing-Chun Liu (PaulLiu) 		      struct mmc_device_info *mmc_dev_info);
320503adf4SYing-Chun Liu (PaulLiu) void rpi3_sdhost_stop(void);
330503adf4SYing-Chun Liu (PaulLiu) 
340503adf4SYing-Chun Liu (PaulLiu) /* Registers */
350503adf4SYing-Chun Liu (PaulLiu) #define HC_COMMAND			0x00        /* Command and flags */
360503adf4SYing-Chun Liu (PaulLiu) #define HC_ARGUMENT			0x04
370503adf4SYing-Chun Liu (PaulLiu) #define HC_TIMEOUTCOUNTER		0x08
380503adf4SYing-Chun Liu (PaulLiu) #define HC_CLOCKDIVISOR			0x0c
390503adf4SYing-Chun Liu (PaulLiu) #define HC_RESPONSE_0			0x10
400503adf4SYing-Chun Liu (PaulLiu) #define HC_RESPONSE_1			0x14
410503adf4SYing-Chun Liu (PaulLiu) #define HC_RESPONSE_2			0x18
420503adf4SYing-Chun Liu (PaulLiu) #define HC_RESPONSE_3			0x1c
430503adf4SYing-Chun Liu (PaulLiu) #define HC_HOSTSTATUS			0x20
440503adf4SYing-Chun Liu (PaulLiu) #define HC_POWER			0x30
450503adf4SYing-Chun Liu (PaulLiu) #define HC_DEBUG			0x34
460503adf4SYing-Chun Liu (PaulLiu) #define HC_HOSTCONFIG			0x38
470503adf4SYing-Chun Liu (PaulLiu) #define HC_BLOCKSIZE			0x3c
480503adf4SYing-Chun Liu (PaulLiu) #define HC_DATAPORT			0x40
490503adf4SYing-Chun Liu (PaulLiu) #define HC_BLOCKCOUNT			0x50
500503adf4SYing-Chun Liu (PaulLiu) 
510503adf4SYing-Chun Liu (PaulLiu) /* Flags for HC_COMMAND register */
520503adf4SYing-Chun Liu (PaulLiu) #define HC_CMD_ENABLE			0x8000
530503adf4SYing-Chun Liu (PaulLiu) #define HC_CMD_FAILED			0x4000
540503adf4SYing-Chun Liu (PaulLiu) #define HC_CMD_BUSY			0x0800
550503adf4SYing-Chun Liu (PaulLiu) #define HC_CMD_RESPONSE_NONE		0x0400
560503adf4SYing-Chun Liu (PaulLiu) #define HC_CMD_RESPONSE_LONG		0x0200
570503adf4SYing-Chun Liu (PaulLiu) #define HC_CMD_WRITE			0x0080
580503adf4SYing-Chun Liu (PaulLiu) #define HC_CMD_READ			0x0040
590503adf4SYing-Chun Liu (PaulLiu) #define HC_CMD_COMMAND_MASK		0x003f
600503adf4SYing-Chun Liu (PaulLiu) 
61*bd96d533SRob Newberry #define RPI3_SDHOST_MAX_CLOCK		250000000	// technically, we should obtain this number from the mailbox
62*bd96d533SRob Newberry 
630503adf4SYing-Chun Liu (PaulLiu) #define HC_CLOCKDIVISOR_MAXVAL		0x07ff
640503adf4SYing-Chun Liu (PaulLiu) #define HC_CLOCKDIVISOR_PREFERVAL	0x027b
650503adf4SYing-Chun Liu (PaulLiu) #define HC_CLOCKDIVISOR_SLOWVAL		0x0148
660503adf4SYing-Chun Liu (PaulLiu) #define HC_CLOCKDIVISOR_STOPVAL		0x01fb
670503adf4SYing-Chun Liu (PaulLiu) 
680503adf4SYing-Chun Liu (PaulLiu) /* Flags for HC_HOSTSTATUS register */
690503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTST_HAVEDATA		0x0001
700503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTST_ERROR_FIFO		0x0008
710503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTST_ERROR_CRC7		0x0010
720503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTST_ERROR_CRC16		0x0020
730503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTST_TIMEOUT_CMD		0x0040
740503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTST_TIMEOUT_DATA		0x0080
750503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTST_INT_BLOCK		0x0200
760503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTST_INT_BUSY		0x0400
770503adf4SYing-Chun Liu (PaulLiu) 
780503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTST_RESET			0xffff
790503adf4SYing-Chun Liu (PaulLiu) 
800503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTST_MASK_ERROR_DATA	(HC_HSTST_ERROR_FIFO | \
810503adf4SYing-Chun Liu (PaulLiu) 					 HC_HSTST_ERROR_CRC7 | \
820503adf4SYing-Chun Liu (PaulLiu) 					 HC_HSTST_ERROR_CRC16 | \
830503adf4SYing-Chun Liu (PaulLiu) 					 HC_HSTST_TIMEOUT_DATA)
840503adf4SYing-Chun Liu (PaulLiu) 
850503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTST_MASK_ERROR_ALL		(HC_HSTST_MASK_ERROR_DATA | \
860503adf4SYing-Chun Liu (PaulLiu) 					 HC_HSTST_TIMEOUT_CMD)
870503adf4SYing-Chun Liu (PaulLiu) 
880503adf4SYing-Chun Liu (PaulLiu) /* Flags for HC_HOSTCONFIG register */
890503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTCF_INTBUS_WIDE		0x0002
900503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTCF_EXTBUS_4BIT		0x0004
910503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTCF_SLOW_CARD		0x0008
920503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTCF_INT_DATA		0x0010
930503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTCF_INT_BLOCK		0x0100
940503adf4SYing-Chun Liu (PaulLiu) #define HC_HSTCF_INT_BUSY		0x0400
950503adf4SYing-Chun Liu (PaulLiu) 
960503adf4SYing-Chun Liu (PaulLiu) /* Flags for HC_DEBUG register */
970503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FIFO_THRESH_WRITE_SHIFT	9
980503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FIFO_THRESH_READ_SHIFT	14
990503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FIFO_THRESH_MASK		0x001f
1000503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_MASK			0xf
1010503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_IDENTMODE		0x0
1020503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_DATAMODE		0x1
1030503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_READDATA		0x2
1040503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_WRITEDATA		0x3
1050503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_READWAIT		0x4
1060503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_READCRC		0x5
1070503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_WRITECRC		0x6
1080503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_WRITEWAIT1		0x7
1090503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_POWERDOWN		0x8
1100503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_POWERUP		0x9
1110503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_WRITESTART1		0xa
1120503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_WRITESTART2		0xb
1130503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_GENPULSES		0xc
1140503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_WRITEWAIT2		0xd
1150503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FSM_STARTPOWDOWN		0xf
1160503adf4SYing-Chun Liu (PaulLiu) #define HC_DBG_FORCE_DATA_MODE		0x40000
1170503adf4SYing-Chun Liu (PaulLiu) 
1180503adf4SYing-Chun Liu (PaulLiu) /* Settings */
1190503adf4SYing-Chun Liu (PaulLiu) #define HC_FIFO_SIZE			16
1200503adf4SYing-Chun Liu (PaulLiu) #define HC_FIFO_THRESH_READ		4
1210503adf4SYing-Chun Liu (PaulLiu) #define HC_FIFO_THRESH_WRITE		4
1220503adf4SYing-Chun Liu (PaulLiu) 
1230503adf4SYing-Chun Liu (PaulLiu) #define HC_TIMEOUT_DEFAULT		0x00f00000
1240503adf4SYing-Chun Liu (PaulLiu) #define HC_TIMEOUT_IDLE			0x00a00000
1250503adf4SYing-Chun Liu (PaulLiu) 
1260503adf4SYing-Chun Liu (PaulLiu) #endif  /* RPI3_SDHOST_H */
127