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