1*3fe3b4fbSDrEagle /* 2*3fe3b4fbSDrEagle * Marvell MMC/SD/SDIO driver 3*3fe3b4fbSDrEagle * 4*3fe3b4fbSDrEagle * (C) Copyright 2012 5*3fe3b4fbSDrEagle * Marvell Semiconductor <www.marvell.com> 6*3fe3b4fbSDrEagle * Written-by: Maen Suleiman, Gerald Kerma 7*3fe3b4fbSDrEagle * 8*3fe3b4fbSDrEagle * SPDX-License-Identifier: GPL-2.0+ 9*3fe3b4fbSDrEagle */ 10*3fe3b4fbSDrEagle 11*3fe3b4fbSDrEagle #ifndef __MVEBU_MMC_H__ 12*3fe3b4fbSDrEagle #define __MVEBU_MMC_H__ 13*3fe3b4fbSDrEagle 14*3fe3b4fbSDrEagle /* needed for the mmc_cfg definition */ 15*3fe3b4fbSDrEagle #include <mmc.h> 16*3fe3b4fbSDrEagle 17*3fe3b4fbSDrEagle #define MMC_BLOCK_SIZE 512 18*3fe3b4fbSDrEagle 19*3fe3b4fbSDrEagle /* 20*3fe3b4fbSDrEagle * Clock rates 21*3fe3b4fbSDrEagle */ 22*3fe3b4fbSDrEagle 23*3fe3b4fbSDrEagle #define MVEBU_MMC_CLOCKRATE_MAX 50000000 24*3fe3b4fbSDrEagle #define MVEBU_MMC_BASE_DIV_MAX 0x7ff 25*3fe3b4fbSDrEagle #define MVEBU_MMC_BASE_FAST_CLOCK CONFIG_SYS_TCLK 26*3fe3b4fbSDrEagle #define MVEBU_MMC_BASE_FAST_CLK_100 100000000 27*3fe3b4fbSDrEagle #define MVEBU_MMC_BASE_FAST_CLK_200 200000000 28*3fe3b4fbSDrEagle 29*3fe3b4fbSDrEagle /* SDIO register */ 30*3fe3b4fbSDrEagle #define SDIO_SYS_ADDR_LOW 0x000 31*3fe3b4fbSDrEagle #define SDIO_SYS_ADDR_HI 0x004 32*3fe3b4fbSDrEagle #define SDIO_BLK_SIZE 0x008 33*3fe3b4fbSDrEagle #define SDIO_BLK_COUNT 0x00c 34*3fe3b4fbSDrEagle #define SDIO_ARG_LOW 0x010 35*3fe3b4fbSDrEagle #define SDIO_ARG_HI 0x014 36*3fe3b4fbSDrEagle #define SDIO_XFER_MODE 0x018 37*3fe3b4fbSDrEagle #define SDIO_CMD 0x01c 38*3fe3b4fbSDrEagle #define SDIO_RSP(i) (0x020 + ((i)<<2)) 39*3fe3b4fbSDrEagle #define SDIO_RSP0 0x020 40*3fe3b4fbSDrEagle #define SDIO_RSP1 0x024 41*3fe3b4fbSDrEagle #define SDIO_RSP2 0x028 42*3fe3b4fbSDrEagle #define SDIO_RSP3 0x02c 43*3fe3b4fbSDrEagle #define SDIO_RSP4 0x030 44*3fe3b4fbSDrEagle #define SDIO_RSP5 0x034 45*3fe3b4fbSDrEagle #define SDIO_RSP6 0x038 46*3fe3b4fbSDrEagle #define SDIO_RSP7 0x03c 47*3fe3b4fbSDrEagle #define SDIO_BUF_DATA_PORT 0x040 48*3fe3b4fbSDrEagle #define SDIO_RSVED 0x044 49*3fe3b4fbSDrEagle #define SDIO_HW_STATE 0x048 50*3fe3b4fbSDrEagle #define SDIO_PRESENT_STATE0 0x048 51*3fe3b4fbSDrEagle #define SDIO_PRESENT_STATE1 0x04c 52*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL 0x050 53*3fe3b4fbSDrEagle #define SDIO_BLK_GAP_CTRL 0x054 54*3fe3b4fbSDrEagle #define SDIO_CLK_CTRL 0x058 55*3fe3b4fbSDrEagle #define SDIO_SW_RESET 0x05c 56*3fe3b4fbSDrEagle #define SDIO_NOR_INTR_STATUS 0x060 57*3fe3b4fbSDrEagle #define SDIO_ERR_INTR_STATUS 0x064 58*3fe3b4fbSDrEagle #define SDIO_NOR_STATUS_EN 0x068 59*3fe3b4fbSDrEagle #define SDIO_ERR_STATUS_EN 0x06c 60*3fe3b4fbSDrEagle #define SDIO_NOR_INTR_EN 0x070 61*3fe3b4fbSDrEagle #define SDIO_ERR_INTR_EN 0x074 62*3fe3b4fbSDrEagle #define SDIO_AUTOCMD12_ERR_STATUS 0x078 63*3fe3b4fbSDrEagle #define SDIO_CURR_BYTE_LEFT 0x07c 64*3fe3b4fbSDrEagle #define SDIO_CURR_BLK_LEFT 0x080 65*3fe3b4fbSDrEagle #define SDIO_AUTOCMD12_ARG_LOW 0x084 66*3fe3b4fbSDrEagle #define SDIO_AUTOCMD12_ARG_HI 0x088 67*3fe3b4fbSDrEagle #define SDIO_AUTOCMD12_INDEX 0x08c 68*3fe3b4fbSDrEagle #define SDIO_AUTO_RSP(i) (0x090 + ((i)<<2)) 69*3fe3b4fbSDrEagle #define SDIO_AUTO_RSP0 0x090 70*3fe3b4fbSDrEagle #define SDIO_AUTO_RSP1 0x094 71*3fe3b4fbSDrEagle #define SDIO_AUTO_RSP2 0x098 72*3fe3b4fbSDrEagle #define SDIO_CLK_DIV 0x128 73*3fe3b4fbSDrEagle 74*3fe3b4fbSDrEagle #define WINDOW_CTRL(i) (0x108 + ((i) << 3)) 75*3fe3b4fbSDrEagle #define WINDOW_BASE(i) (0x10c + ((i) << 3)) 76*3fe3b4fbSDrEagle 77*3fe3b4fbSDrEagle /* SDIO_PRESENT_STATE */ 78*3fe3b4fbSDrEagle #define CARD_BUSY (1 << 1) 79*3fe3b4fbSDrEagle #define CMD_INHIBIT (1 << 0) 80*3fe3b4fbSDrEagle #define CMD_TXACTIVE (1 << 8) 81*3fe3b4fbSDrEagle #define CMD_RXACTIVE (1 << 9) 82*3fe3b4fbSDrEagle #define CMD_AUTOCMD12ACTIVE (1 << 14) 83*3fe3b4fbSDrEagle #define CMD_BUS_BUSY (CMD_AUTOCMD12ACTIVE | \ 84*3fe3b4fbSDrEagle CMD_RXACTIVE | \ 85*3fe3b4fbSDrEagle CMD_TXACTIVE | \ 86*3fe3b4fbSDrEagle CMD_INHIBIT | \ 87*3fe3b4fbSDrEagle CARD_BUSY) 88*3fe3b4fbSDrEagle 89*3fe3b4fbSDrEagle /* 90*3fe3b4fbSDrEagle * SDIO_CMD 91*3fe3b4fbSDrEagle */ 92*3fe3b4fbSDrEagle 93*3fe3b4fbSDrEagle #define SDIO_CMD_RSP_NONE (0 << 0) 94*3fe3b4fbSDrEagle #define SDIO_CMD_RSP_136 (1 << 0) 95*3fe3b4fbSDrEagle #define SDIO_CMD_RSP_48 (2 << 0) 96*3fe3b4fbSDrEagle #define SDIO_CMD_RSP_48BUSY (3 << 0) 97*3fe3b4fbSDrEagle 98*3fe3b4fbSDrEagle #define SDIO_CMD_CHECK_DATACRC16 (1 << 2) 99*3fe3b4fbSDrEagle #define SDIO_CMD_CHECK_CMDCRC (1 << 3) 100*3fe3b4fbSDrEagle #define SDIO_CMD_INDX_CHECK (1 << 4) 101*3fe3b4fbSDrEagle #define SDIO_CMD_DATA_PRESENT (1 << 5) 102*3fe3b4fbSDrEagle #define SDIO_UNEXPECTED_RESP (1 << 7) 103*3fe3b4fbSDrEagle 104*3fe3b4fbSDrEagle #define SDIO_CMD_INDEX(x) ((x) << 8) 105*3fe3b4fbSDrEagle 106*3fe3b4fbSDrEagle /* 107*3fe3b4fbSDrEagle * SDIO_XFER_MODE 108*3fe3b4fbSDrEagle */ 109*3fe3b4fbSDrEagle 110*3fe3b4fbSDrEagle #define SDIO_XFER_MODE_STOP_CLK (1 << 5) 111*3fe3b4fbSDrEagle #define SDIO_XFER_MODE_HW_WR_DATA_EN (1 << 1) 112*3fe3b4fbSDrEagle #define SDIO_XFER_MODE_AUTO_CMD12 (1 << 2) 113*3fe3b4fbSDrEagle #define SDIO_XFER_MODE_INT_CHK_EN (1 << 3) 114*3fe3b4fbSDrEagle #define SDIO_XFER_MODE_TO_HOST (1 << 4) 115*3fe3b4fbSDrEagle #define SDIO_XFER_MODE_DMA (0 << 6) 116*3fe3b4fbSDrEagle 117*3fe3b4fbSDrEagle /* 118*3fe3b4fbSDrEagle * SDIO_HOST_CTRL 119*3fe3b4fbSDrEagle */ 120*3fe3b4fbSDrEagle 121*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_PUSH_PULL_EN (1 << 0) 122*3fe3b4fbSDrEagle 123*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_CARD_TYPE_MEM_ONLY (0 << 1) 124*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_CARD_TYPE_IO_ONLY (1 << 1) 125*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_CARD_TYPE_IO_MEM_COMBO (2 << 1) 126*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_CARD_TYPE_IO_MMC (3 << 1) 127*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_CARD_TYPE_MASK (3 << 1) 128*3fe3b4fbSDrEagle 129*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_BIG_ENDIAN (1 << 3) 130*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_LSB_FIRST (1 << 4) 131*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_DATA_WIDTH_1_BIT (0 << 9) 132*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_DATA_WIDTH_4_BITS (1 << 9) 133*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_HI_SPEED_EN (1 << 10) 134*3fe3b4fbSDrEagle 135*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_TMOUT_MAX 0xf 136*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_TMOUT_MASK (0xf << 11) 137*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_TMOUT(x) ((x) << 11) 138*3fe3b4fbSDrEagle #define SDIO_HOST_CTRL_TMOUT_EN (1 << 15) 139*3fe3b4fbSDrEagle 140*3fe3b4fbSDrEagle /* 141*3fe3b4fbSDrEagle * SDIO_SW_RESET 142*3fe3b4fbSDrEagle */ 143*3fe3b4fbSDrEagle 144*3fe3b4fbSDrEagle #define SDIO_SW_RESET_NOW (1 << 8) 145*3fe3b4fbSDrEagle 146*3fe3b4fbSDrEagle /* 147*3fe3b4fbSDrEagle * Normal interrupt status bits 148*3fe3b4fbSDrEagle */ 149*3fe3b4fbSDrEagle 150*3fe3b4fbSDrEagle #define SDIO_NOR_ERROR (1 << 15) 151*3fe3b4fbSDrEagle #define SDIO_NOR_UNEXP_RSP (1 << 14) 152*3fe3b4fbSDrEagle #define SDIO_NOR_AUTOCMD12_DONE (1 << 13) 153*3fe3b4fbSDrEagle #define SDIO_NOR_SUSPEND_ON (1 << 12) 154*3fe3b4fbSDrEagle #define SDIO_NOR_LMB_FF_8W_AVAIL (1 << 11) 155*3fe3b4fbSDrEagle #define SDIO_NOR_LMB_FF_8W_FILLED (1 << 10) 156*3fe3b4fbSDrEagle #define SDIO_NOR_READ_WAIT_ON (1 << 9) 157*3fe3b4fbSDrEagle #define SDIO_NOR_CARD_INT (1 << 8) 158*3fe3b4fbSDrEagle #define SDIO_NOR_READ_READY (1 << 5) 159*3fe3b4fbSDrEagle #define SDIO_NOR_WRITE_READY (1 << 4) 160*3fe3b4fbSDrEagle #define SDIO_NOR_DMA_INI (1 << 3) 161*3fe3b4fbSDrEagle #define SDIO_NOR_BLK_GAP_EVT (1 << 2) 162*3fe3b4fbSDrEagle #define SDIO_NOR_XFER_DONE (1 << 1) 163*3fe3b4fbSDrEagle #define SDIO_NOR_CMD_DONE (1 << 0) 164*3fe3b4fbSDrEagle 165*3fe3b4fbSDrEagle /* 166*3fe3b4fbSDrEagle * Error status bits 167*3fe3b4fbSDrEagle */ 168*3fe3b4fbSDrEagle 169*3fe3b4fbSDrEagle #define SDIO_ERR_CRC_STATUS (1 << 14) 170*3fe3b4fbSDrEagle #define SDIO_ERR_CRC_STARTBIT (1 << 13) 171*3fe3b4fbSDrEagle #define SDIO_ERR_CRC_ENDBIT (1 << 12) 172*3fe3b4fbSDrEagle #define SDIO_ERR_RESP_TBIT (1 << 11) 173*3fe3b4fbSDrEagle #define SDIO_ERR_XFER_SIZE (1 << 10) 174*3fe3b4fbSDrEagle #define SDIO_ERR_CMD_STARTBIT (1 << 9) 175*3fe3b4fbSDrEagle #define SDIO_ERR_AUTOCMD12 (1 << 8) 176*3fe3b4fbSDrEagle #define SDIO_ERR_DATA_ENDBIT (1 << 6) 177*3fe3b4fbSDrEagle #define SDIO_ERR_DATA_CRC (1 << 5) 178*3fe3b4fbSDrEagle #define SDIO_ERR_DATA_TIMEOUT (1 << 4) 179*3fe3b4fbSDrEagle #define SDIO_ERR_CMD_INDEX (1 << 3) 180*3fe3b4fbSDrEagle #define SDIO_ERR_CMD_ENDBIT (1 << 2) 181*3fe3b4fbSDrEagle #define SDIO_ERR_CMD_CRC (1 << 1) 182*3fe3b4fbSDrEagle #define SDIO_ERR_CMD_TIMEOUT (1 << 0) 183*3fe3b4fbSDrEagle /* enable all for polling */ 184*3fe3b4fbSDrEagle #define SDIO_POLL_MASK 0xffff 185*3fe3b4fbSDrEagle 186*3fe3b4fbSDrEagle /* 187*3fe3b4fbSDrEagle * CMD12 error status bits 188*3fe3b4fbSDrEagle */ 189*3fe3b4fbSDrEagle 190*3fe3b4fbSDrEagle #define SDIO_AUTOCMD12_ERR_NOTEXE (1 << 0) 191*3fe3b4fbSDrEagle #define SDIO_AUTOCMD12_ERR_TIMEOUT (1 << 1) 192*3fe3b4fbSDrEagle #define SDIO_AUTOCMD12_ERR_CRC (1 << 2) 193*3fe3b4fbSDrEagle #define SDIO_AUTOCMD12_ERR_ENDBIT (1 << 3) 194*3fe3b4fbSDrEagle #define SDIO_AUTOCMD12_ERR_INDEX (1 << 4) 195*3fe3b4fbSDrEagle #define SDIO_AUTOCMD12_ERR_RESP_T_BIT (1 << 5) 196*3fe3b4fbSDrEagle #define SDIO_AUTOCMD12_ERR_RESP_STARTBIT (1 << 6) 197*3fe3b4fbSDrEagle 198*3fe3b4fbSDrEagle #define MMC_RSP_PRESENT (1 << 0) 199*3fe3b4fbSDrEagle /* 136 bit response */ 200*3fe3b4fbSDrEagle #define MMC_RSP_136 (1 << 1) 201*3fe3b4fbSDrEagle /* expect valid crc */ 202*3fe3b4fbSDrEagle #define MMC_RSP_CRC (1 << 2) 203*3fe3b4fbSDrEagle /* card may send busy */ 204*3fe3b4fbSDrEagle #define MMC_RSP_BUSY (1 << 3) 205*3fe3b4fbSDrEagle /* response contains opcode */ 206*3fe3b4fbSDrEagle #define MMC_RSP_OPCODE (1 << 4) 207*3fe3b4fbSDrEagle 208*3fe3b4fbSDrEagle #define MMC_BUSMODE_OPENDRAIN 1 209*3fe3b4fbSDrEagle #define MMC_BUSMODE_PUSHPULL 2 210*3fe3b4fbSDrEagle 211*3fe3b4fbSDrEagle #define MMC_BUS_WIDTH_1 0 212*3fe3b4fbSDrEagle #define MMC_BUS_WIDTH_4 2 213*3fe3b4fbSDrEagle #define MMC_BUS_WIDTH_8 3 214*3fe3b4fbSDrEagle 215*3fe3b4fbSDrEagle /* Can the host do 4 bit transfers */ 216*3fe3b4fbSDrEagle #define MMC_CAP_4_BIT_DATA (1 << 0) 217*3fe3b4fbSDrEagle /* Can do MMC high-speed timing */ 218*3fe3b4fbSDrEagle #define MMC_CAP_MMC_HIGHSPEED (1 << 1) 219*3fe3b4fbSDrEagle /* Can do SD high-speed timing */ 220*3fe3b4fbSDrEagle #define MMC_CAP_SD_HIGHSPEED (1 << 2) 221*3fe3b4fbSDrEagle /* Can signal pending SDIO IRQs */ 222*3fe3b4fbSDrEagle #define MMC_CAP_SDIO_IRQ (1 << 3) 223*3fe3b4fbSDrEagle /* Talks only SPI protocols */ 224*3fe3b4fbSDrEagle #define MMC_CAP_SPI (1 << 4) 225*3fe3b4fbSDrEagle /* Needs polling for card-detection */ 226*3fe3b4fbSDrEagle #define MMC_CAP_NEEDS_POLL (1 << 5) 227*3fe3b4fbSDrEagle /* Can the host do 8 bit transfers */ 228*3fe3b4fbSDrEagle #define MMC_CAP_8_BIT_DATA (1 << 6) 229*3fe3b4fbSDrEagle 230*3fe3b4fbSDrEagle /* Nonremovable e.g. eMMC */ 231*3fe3b4fbSDrEagle #define MMC_CAP_NONREMOVABLE (1 << 8) 232*3fe3b4fbSDrEagle /* Waits while card is busy */ 233*3fe3b4fbSDrEagle #define MMC_CAP_WAIT_WHILE_BUSY (1 << 9) 234*3fe3b4fbSDrEagle /* Allow erase/trim commands */ 235*3fe3b4fbSDrEagle #define MMC_CAP_ERASE (1 << 10) 236*3fe3b4fbSDrEagle /* can support DDR mode at 1.8V */ 237*3fe3b4fbSDrEagle #define MMC_CAP_1_8V_DDR (1 << 11) 238*3fe3b4fbSDrEagle /* can support DDR mode at 1.2V */ 239*3fe3b4fbSDrEagle #define MMC_CAP_1_2V_DDR (1 << 12) 240*3fe3b4fbSDrEagle /* Can power off after boot */ 241*3fe3b4fbSDrEagle #define MMC_CAP_POWER_OFF_CARD (1 << 13) 242*3fe3b4fbSDrEagle /* CMD14/CMD19 bus width ok */ 243*3fe3b4fbSDrEagle #define MMC_CAP_BUS_WIDTH_TEST (1 << 14) 244*3fe3b4fbSDrEagle /* Host supports UHS SDR12 mode */ 245*3fe3b4fbSDrEagle #define MMC_CAP_UHS_SDR12 (1 << 15) 246*3fe3b4fbSDrEagle /* Host supports UHS SDR25 mode */ 247*3fe3b4fbSDrEagle #define MMC_CAP_UHS_SDR25 (1 << 16) 248*3fe3b4fbSDrEagle /* Host supports UHS SDR50 mode */ 249*3fe3b4fbSDrEagle #define MMC_CAP_UHS_SDR50 (1 << 17) 250*3fe3b4fbSDrEagle /* Host supports UHS SDR104 mode */ 251*3fe3b4fbSDrEagle #define MMC_CAP_UHS_SDR104 (1 << 18) 252*3fe3b4fbSDrEagle /* Host supports UHS DDR50 mode */ 253*3fe3b4fbSDrEagle #define MMC_CAP_UHS_DDR50 (1 << 19) 254*3fe3b4fbSDrEagle /* Host supports Driver Type A */ 255*3fe3b4fbSDrEagle #define MMC_CAP_DRIVER_TYPE_A (1 << 23) 256*3fe3b4fbSDrEagle /* Host supports Driver Type C */ 257*3fe3b4fbSDrEagle #define MMC_CAP_DRIVER_TYPE_C (1 << 24) 258*3fe3b4fbSDrEagle /* Host supports Driver Type D */ 259*3fe3b4fbSDrEagle #define MMC_CAP_DRIVER_TYPE_D (1 << 25) 260*3fe3b4fbSDrEagle /* CMD23 supported. */ 261*3fe3b4fbSDrEagle #define MMC_CAP_CMD23 (1 << 30) 262*3fe3b4fbSDrEagle /* Hardware reset */ 263*3fe3b4fbSDrEagle #define MMC_CAP_HW_RESET (1 << 31) 264*3fe3b4fbSDrEagle 265*3fe3b4fbSDrEagle struct mvebu_mmc_cfg { 266*3fe3b4fbSDrEagle u32 mvebu_mmc_base; 267*3fe3b4fbSDrEagle u32 mvebu_mmc_clk; 268*3fe3b4fbSDrEagle u8 max_bus_width; 269*3fe3b4fbSDrEagle struct mmc_config cfg; 270*3fe3b4fbSDrEagle }; 271*3fe3b4fbSDrEagle 272*3fe3b4fbSDrEagle /* 273*3fe3b4fbSDrEagle * Functions prototypes 274*3fe3b4fbSDrEagle */ 275*3fe3b4fbSDrEagle 276*3fe3b4fbSDrEagle int mvebu_mmc_init(bd_t *bis); 277*3fe3b4fbSDrEagle 278*3fe3b4fbSDrEagle #endif /* __MVEBU_MMC_H__ */ 279