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