1*bffde63dSSheetal Tigadoli /* 2*bffde63dSSheetal Tigadoli * Copyright (c) 2016 - 2020, Broadcom 3*bffde63dSSheetal Tigadoli * 4*bffde63dSSheetal Tigadoli * SPDX-License-Identifier: BSD-3-Clause 5*bffde63dSSheetal Tigadoli */ 6*bffde63dSSheetal Tigadoli 7*bffde63dSSheetal Tigadoli #ifndef CHAL_SD_H 8*bffde63dSSheetal Tigadoli #define CHAL_SD_H 9*bffde63dSSheetal Tigadoli 10*bffde63dSSheetal Tigadoli #include <stddef.h> 11*bffde63dSSheetal Tigadoli 12*bffde63dSSheetal Tigadoli #define BASE_CLK_FREQ (200 * 1000 * 1000) 13*bffde63dSSheetal Tigadoli #define INIT_CLK_FREQ (400 * 1000) 14*bffde63dSSheetal Tigadoli 15*bffde63dSSheetal Tigadoli #define SD_ERROR_RECOVERABLE 0 16*bffde63dSSheetal Tigadoli #define SD_ERROR_NON_RECOVERABLE 1 17*bffde63dSSheetal Tigadoli 18*bffde63dSSheetal Tigadoli #define SD_OK 0 19*bffde63dSSheetal Tigadoli #define SD_FAIL (-1) 20*bffde63dSSheetal Tigadoli #define SD_INVALID_HANDLE (-2) 21*bffde63dSSheetal Tigadoli #define SD_CEATA_INIT_ERROR (-3) 22*bffde63dSSheetal Tigadoli #define SD_RESET_ERROR (-4) 23*bffde63dSSheetal Tigadoli #define SD_CARD_INIT_ERROR (-5) 24*bffde63dSSheetal Tigadoli #define SD_INV_DATA_WIDTH (-6) 25*bffde63dSSheetal Tigadoli #define SD_SET_BUS_WIDTH_ERROR (-7) 26*bffde63dSSheetal Tigadoli #define SD_DMA_NOT_SUPPORT (-8) 27*bffde63dSSheetal Tigadoli #define SD_SDIO_READ_ERROR (-9) 28*bffde63dSSheetal Tigadoli #define SD_SDIO_WRITE_ERROR (-10) 29*bffde63dSSheetal Tigadoli #define SD_WRITE_ERROR (-11) 30*bffde63dSSheetal Tigadoli #define SD_READ_ERROR (-12) 31*bffde63dSSheetal Tigadoli #define SD_READ_SIZE_ERROR (-13) 32*bffde63dSSheetal Tigadoli #define SD_RW_ADDRESS_ERROR (-14) 33*bffde63dSSheetal Tigadoli #define SD_XFER_ADDRESS_ERROR (-15) 34*bffde63dSSheetal Tigadoli #define SD_DATA_XFER_ADDR_ERROR (-16) 35*bffde63dSSheetal Tigadoli #define SD_DATA_XFER_ERROR (-17) 36*bffde63dSSheetal Tigadoli #define SD_WRITE_SIZE_ERROR (-18) 37*bffde63dSSheetal Tigadoli #define SD_CMD_STATUS_UPDATE_ERR (-19) 38*bffde63dSSheetal Tigadoli #define SD_CMD12_ERROR (-20) 39*bffde63dSSheetal Tigadoli #define SD_CMD_DATA_ERROR (-21) 40*bffde63dSSheetal Tigadoli #define SD_CMD_TIMEOUT (-22) 41*bffde63dSSheetal Tigadoli #define SD_CMD_NO_RESPONSE (-22) 42*bffde63dSSheetal Tigadoli #define SD_CMD_ABORT_ERROR (-23) 43*bffde63dSSheetal Tigadoli #define SD_CMD_INVALID (-24) 44*bffde63dSSheetal Tigadoli #define SD_CMD_RESUME_ERROR (-25) 45*bffde63dSSheetal Tigadoli #define SD_CMD_ERR_INVALID_RESPONSE (-26) 46*bffde63dSSheetal Tigadoli #define SD_WAIT_TIMEOUT (-27) 47*bffde63dSSheetal Tigadoli #define SD_READ_TIMEOUT (-28) 48*bffde63dSSheetal Tigadoli #define SD_CEATA_REST_ERROR (-29) 49*bffde63dSSheetal Tigadoli #define SD_INIT_CAED_FAILED (-30) 50*bffde63dSSheetal Tigadoli #define SD_ERROR_CLOCK_OFFLIMIT (-31) 51*bffde63dSSheetal Tigadoli #define SD_INV_SLOT (-32) 52*bffde63dSSheetal Tigadoli 53*bffde63dSSheetal Tigadoli #define SD_NOR_INTERRUPTS 0x000000FF 54*bffde63dSSheetal Tigadoli #define SD_ERR_INTERRUPTS 0x03FF0000 55*bffde63dSSheetal Tigadoli #define SD_CMD_ERROR_INT 0x010F0000 56*bffde63dSSheetal Tigadoli #define SD_DAT_ERROR_INT 0x02F00000 57*bffde63dSSheetal Tigadoli #define SD_DAT_TIMEOUT 0x00100000 58*bffde63dSSheetal Tigadoli 59*bffde63dSSheetal Tigadoli /* Operation modes */ 60*bffde63dSSheetal Tigadoli #define SD_PIO_MODE 0 61*bffde63dSSheetal Tigadoli #define SD_INT_MODE 1 62*bffde63dSSheetal Tigadoli 63*bffde63dSSheetal Tigadoli /* Support both ADMA and SDMA (for version 2.0 and above) */ 64*bffde63dSSheetal Tigadoli #define SD_DMA_OFF 0 65*bffde63dSSheetal Tigadoli #define SD_DMA_SDMA 1 66*bffde63dSSheetal Tigadoli #define SD_DMA_ADMA 2 67*bffde63dSSheetal Tigadoli 68*bffde63dSSheetal Tigadoli #define SD_NORMAL_SPEED 0 69*bffde63dSSheetal Tigadoli #define SD_HIGH_SPEED 1 70*bffde63dSSheetal Tigadoli 71*bffde63dSSheetal Tigadoli #define SD_XFER_CARD_TO_HOST 3 72*bffde63dSSheetal Tigadoli #define SD_XFER_HOST_TO_CARD 4 73*bffde63dSSheetal Tigadoli 74*bffde63dSSheetal Tigadoli #define SD_CARD_DETECT_AUTO 0 75*bffde63dSSheetal Tigadoli #define SD_CARD_DETECT_SD 1 76*bffde63dSSheetal Tigadoli #define SD_CARD_DETECT_SDIO 2 77*bffde63dSSheetal Tigadoli #define SD_CARD_DETECT_MMC 3 78*bffde63dSSheetal Tigadoli #define SD_CARD_DETECT_CEATA 4 79*bffde63dSSheetal Tigadoli 80*bffde63dSSheetal Tigadoli #define SD_ABORT_SYNC_MODE 0 81*bffde63dSSheetal Tigadoli #define SD_ABORT_ASYNC_MODE 1 82*bffde63dSSheetal Tigadoli 83*bffde63dSSheetal Tigadoli #define SD_CMD_ERROR_FLAGS (0x18F << 16) 84*bffde63dSSheetal Tigadoli #define SD_DATA_ERROR_FLAGS (0x70 << 16) 85*bffde63dSSheetal Tigadoli #define SD_AUTO_CMD12_ERROR_FLAGS (0x9F) 86*bffde63dSSheetal Tigadoli 87*bffde63dSSheetal Tigadoli #define SD_CARD_STATUS_ERROR 0x10000000 88*bffde63dSSheetal Tigadoli #define SD_CMD_MISSING 0x80000000 89*bffde63dSSheetal Tigadoli #define SD_ERROR_INT 0x8000 90*bffde63dSSheetal Tigadoli 91*bffde63dSSheetal Tigadoli #define SD_TRAN_HIGH_SPEED 0x32 92*bffde63dSSheetal Tigadoli #define SD_CARD_HIGH_CAPACITY 0x40000000 93*bffde63dSSheetal Tigadoli #define SD_CARD_POWER_UP_STATUS 0x80000000 94*bffde63dSSheetal Tigadoli 95*bffde63dSSheetal Tigadoli #define SD_HOST_CORE_TIMEOUT 0x0E 96*bffde63dSSheetal Tigadoli 97*bffde63dSSheetal Tigadoli /* SD CARD and Host Controllers bus width */ 98*bffde63dSSheetal Tigadoli #define SD_BUS_DATA_WIDTH_1BIT 0x00 99*bffde63dSSheetal Tigadoli #define SD_BUS_DATA_WIDTH_4BIT 0x02 100*bffde63dSSheetal Tigadoli #define SD_BUS_DATA_WIDTH_8BIT 0x20 101*bffde63dSSheetal Tigadoli 102*bffde63dSSheetal Tigadoli /* dma boundary settings */ 103*bffde63dSSheetal Tigadoli #define SD_DMA_BOUNDARY_4K 0 104*bffde63dSSheetal Tigadoli #define SD_DMA_BOUNDARY_8K (1 << 12) 105*bffde63dSSheetal Tigadoli #define SD_DMA_BOUNDARY_16K (2 << 12) 106*bffde63dSSheetal Tigadoli #define SD_DMA_BOUNDARY_32K (3 << 12) 107*bffde63dSSheetal Tigadoli #define SD_DMA_BOUNDARY_64K (4 << 12) 108*bffde63dSSheetal Tigadoli #define SD_DMA_BOUNDARY_128K (5 << 12) 109*bffde63dSSheetal Tigadoli #define SD_DMA_BOUNDARY_256K (6 << 12) 110*bffde63dSSheetal Tigadoli #define SD_DMA_BOUNDARY_512K (7 << 12) 111*bffde63dSSheetal Tigadoli 112*bffde63dSSheetal Tigadoli #define SD_CMDR_CMD_NORMAL 0x00000000 113*bffde63dSSheetal Tigadoli #define SD_CMDR_CMD_SUSPEND 0x00400000 114*bffde63dSSheetal Tigadoli #define SD_CMDR_CMD_RESUME 0x00800000 115*bffde63dSSheetal Tigadoli #define SD_CMDR_CMD_ABORT 0x00c00000 116*bffde63dSSheetal Tigadoli 117*bffde63dSSheetal Tigadoli #define SD_CMDR_RSP_TYPE_NONE 0x0 118*bffde63dSSheetal Tigadoli #define SD_CMDR_RSP_TYPE_R2 0x1 119*bffde63dSSheetal Tigadoli #define SD_CMDR_RSP_TYPE_R3_4 0x2 120*bffde63dSSheetal Tigadoli #define SD_CMDR_RSP_TYPE_R1_5_6 0x2 121*bffde63dSSheetal Tigadoli #define SD_CMDR_RSP_TYPE_R1b_5b 0x3 122*bffde63dSSheetal Tigadoli #define SD_CMDR_RSP_TYPE_S 16 123*bffde63dSSheetal Tigadoli 124*bffde63dSSheetal Tigadoli struct sd_ctrl_info { 125*bffde63dSSheetal Tigadoli uint32_t blkReg; /* current block register cache value */ 126*bffde63dSSheetal Tigadoli uint32_t cmdReg; /* current command register cache value */ 127*bffde63dSSheetal Tigadoli uint32_t argReg; /* current argument register cache value */ 128*bffde63dSSheetal Tigadoli uint32_t cmdIndex; /* current command index */ 129*bffde63dSSheetal Tigadoli uint32_t cmdStatus; /* current command status, cmd/data compelete */ 130*bffde63dSSheetal Tigadoli uint16_t rca; /* relative card address */ 131*bffde63dSSheetal Tigadoli uint32_t ocr; /* operation codition */ 132*bffde63dSSheetal Tigadoli uint32_t eventList; /* events list */ 133*bffde63dSSheetal Tigadoli uint32_t blkGapEnable; 134*bffde63dSSheetal Tigadoli 135*bffde63dSSheetal Tigadoli uint32_t capability; /* controller's capbilities */ 136*bffde63dSSheetal Tigadoli uint32_t maxCurrent; /* maximum current supported */ 137*bffde63dSSheetal Tigadoli uint32_t present; /* if card is inserted or removed */ 138*bffde63dSSheetal Tigadoli uint32_t version; /* SD spec version 1.0 or 2.0 */ 139*bffde63dSSheetal Tigadoli uint32_t vendor; /* vendor number */ 140*bffde63dSSheetal Tigadoli 141*bffde63dSSheetal Tigadoli uintptr_t sdRegBaseAddr; /* sdio control registers */ 142*bffde63dSSheetal Tigadoli uintptr_t hostRegBaseAddr; /* SD Host control registers */ 143*bffde63dSSheetal Tigadoli }; 144*bffde63dSSheetal Tigadoli 145*bffde63dSSheetal Tigadoli struct sd_cfg { 146*bffde63dSSheetal Tigadoli uint32_t mode; /* interrupt or polling */ 147*bffde63dSSheetal Tigadoli uint32_t dma; /* dma enabled or disabled */ 148*bffde63dSSheetal Tigadoli uint32_t retryLimit; /* command retry limit */ 149*bffde63dSSheetal Tigadoli uint32_t speedMode; /* speed mode, 0 standard, 1 high speed */ 150*bffde63dSSheetal Tigadoli uint32_t voltage; /* voltage level */ 151*bffde63dSSheetal Tigadoli uint32_t blockSize; /* access block size (512 for HC card) */ 152*bffde63dSSheetal Tigadoli uint32_t dmaBoundary; /* dma address boundary */ 153*bffde63dSSheetal Tigadoli uint32_t detSignal; /* card det signal src, for test purpose only */ 154*bffde63dSSheetal Tigadoli uint32_t rdWaiting; 155*bffde63dSSheetal Tigadoli uint32_t wakeupOut; 156*bffde63dSSheetal Tigadoli uint32_t wakeupIn; 157*bffde63dSSheetal Tigadoli uint32_t wakeupInt; 158*bffde63dSSheetal Tigadoli uint32_t wfe_retry; 159*bffde63dSSheetal Tigadoli uint32_t gapInt; 160*bffde63dSSheetal Tigadoli uint32_t readWait; 161*bffde63dSSheetal Tigadoli uint32_t led; 162*bffde63dSSheetal Tigadoli }; 163*bffde63dSSheetal Tigadoli 164*bffde63dSSheetal Tigadoli struct sd_dev { 165*bffde63dSSheetal Tigadoli struct sd_cfg cfg; /* SD configuration */ 166*bffde63dSSheetal Tigadoli struct sd_ctrl_info ctrl; /* SD info */ 167*bffde63dSSheetal Tigadoli }; 168*bffde63dSSheetal Tigadoli 169*bffde63dSSheetal Tigadoli int32_t chal_sd_start(CHAL_HANDLE *sdHandle, uint32_t mode, 170*bffde63dSSheetal Tigadoli uint32_t sdBase, uint32_t hostBase); 171*bffde63dSSheetal Tigadoli int32_t chal_sd_config(CHAL_HANDLE *sdHandle, uint32_t speed, 172*bffde63dSSheetal Tigadoli uint32_t retry, uint32_t boundary, 173*bffde63dSSheetal Tigadoli uint32_t blkSize, uint32_t dma); 174*bffde63dSSheetal Tigadoli int32_t chal_sd_stop(void); 175*bffde63dSSheetal Tigadoli int32_t chal_sd_set_dma(CHAL_HANDLE *sdHandle, uint32_t mode); 176*bffde63dSSheetal Tigadoli uintptr_t chal_sd_get_dma_addr(CHAL_HANDLE *handle); 177*bffde63dSSheetal Tigadoli int32_t chal_sd_config_bus_width(CHAL_HANDLE *sdHandle, int32_t width); 178*bffde63dSSheetal Tigadoli int32_t chal_sd_send_cmd(CHAL_HANDLE *sdHandle, uint32_t cmdIndex, 179*bffde63dSSheetal Tigadoli uint32_t arg, uint32_t options); 180*bffde63dSSheetal Tigadoli int32_t chal_sd_set_dma_addr(CHAL_HANDLE *sdHandle, uintptr_t address); 181*bffde63dSSheetal Tigadoli int32_t chal_sd_set_clock(CHAL_HANDLE *sdHandle, 182*bffde63dSSheetal Tigadoli uint32_t div_ctrl_setting, uint32_t on); 183*bffde63dSSheetal Tigadoli uint32_t chal_sd_freq_2_div_ctrl_setting(uint32_t desired_freq); 184*bffde63dSSheetal Tigadoli int32_t chal_sd_setup_xfer(CHAL_HANDLE *sdHandle, uint8_t *data, 185*bffde63dSSheetal Tigadoli uint32_t length, int32_t dir); 186*bffde63dSSheetal Tigadoli int32_t chal_sd_write_buffer(CHAL_HANDLE *sdHandle, uint32_t length, 187*bffde63dSSheetal Tigadoli uint8_t *data); 188*bffde63dSSheetal Tigadoli int32_t chal_sd_read_buffer(CHAL_HANDLE *sdHandle, uint32_t length, 189*bffde63dSSheetal Tigadoli uint8_t *data); 190*bffde63dSSheetal Tigadoli int32_t chal_sd_reset_line(CHAL_HANDLE *sdHandle, uint32_t line); 191*bffde63dSSheetal Tigadoli int32_t chal_sd_get_response(CHAL_HANDLE *sdHandle, uint32_t *resp); 192*bffde63dSSheetal Tigadoli int32_t chal_sd_clear_pending_irq(CHAL_HANDLE *sdHandle); 193*bffde63dSSheetal Tigadoli int32_t chal_sd_get_irq_status(CHAL_HANDLE *sdHandle); 194*bffde63dSSheetal Tigadoli int32_t chal_sd_clear_irq(CHAL_HANDLE *sdHandle, uint32_t mask); 195*bffde63dSSheetal Tigadoli uint32_t chal_sd_get_present_status(CHAL_HANDLE *sdHandle); 196*bffde63dSSheetal Tigadoli int32_t chal_sd_get_atuo12_error(CHAL_HANDLE *sdHandle); 197*bffde63dSSheetal Tigadoli void chal_sd_set_speed(CHAL_HANDLE *sdHandle, uint32_t speed); 198*bffde63dSSheetal Tigadoli int32_t chal_sd_check_cap(CHAL_HANDLE *sdHandle, uint32_t cap); 199*bffde63dSSheetal Tigadoli void chal_sd_set_irq_signal(CHAL_HANDLE *sdHandle, uint32_t mask, 200*bffde63dSSheetal Tigadoli uint32_t state); 201*bffde63dSSheetal Tigadoli void chal_sd_dump_fifo(CHAL_HANDLE *sdHandle); 202*bffde63dSSheetal Tigadoli #endif /* CHAL_SD_H */ 203