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