1*050a99a6SPankaj Gupta /* 2*050a99a6SPankaj Gupta * Copyright (c) 2015, 2016 Freescale Semiconductor, Inc. 3*050a99a6SPankaj Gupta * Copyright 2017-2021 NXP 4*050a99a6SPankaj Gupta * 5*050a99a6SPankaj Gupta * SPDX-License-Identifier: BSD-3-Clause 6*050a99a6SPankaj Gupta * 7*050a99a6SPankaj Gupta */ 8*050a99a6SPankaj Gupta 9*050a99a6SPankaj Gupta #ifndef SD_MMC_H 10*050a99a6SPankaj Gupta #define SD_MMC_H 11*050a99a6SPankaj Gupta 12*050a99a6SPankaj Gupta #include <lib/mmio.h> 13*050a99a6SPankaj Gupta 14*050a99a6SPankaj Gupta /* operating freq */ 15*050a99a6SPankaj Gupta #define CARD_IDENTIFICATION_FREQ 400000 16*050a99a6SPankaj Gupta #define SD_SS_25MHZ 20000000 17*050a99a6SPankaj Gupta #define SD_HS_50MHZ 40000000 18*050a99a6SPankaj Gupta #define MMC_SS_20MHZ 15000000 19*050a99a6SPankaj Gupta #define MMC_HS_26MHZ 20000000 20*050a99a6SPankaj Gupta #define MMC_HS_52MHZ 40000000 21*050a99a6SPankaj Gupta 22*050a99a6SPankaj Gupta /* Need to check this value ? */ 23*050a99a6SPankaj Gupta #define MAX_PLATFORM_CLOCK 800000000 24*050a99a6SPankaj Gupta 25*050a99a6SPankaj Gupta /* eSDHC system control register defines */ 26*050a99a6SPankaj Gupta #define ESDHC_SYSCTL_DTOCV(t) (((t) & 0xF) << 16) 27*050a99a6SPankaj Gupta #define ESDHC_SYSCTL_SDCLKFS(f) (((f) & 0xFF) << 8) 28*050a99a6SPankaj Gupta #define ESDHC_SYSCTL_DVS(d) (((d) & 0xF) << 4) 29*050a99a6SPankaj Gupta #define ESDHC_SYSCTL_SDCLKEN (0x00000008) 30*050a99a6SPankaj Gupta #define ESDHC_SYSCTL_RSTA (0x01000000) 31*050a99a6SPankaj Gupta 32*050a99a6SPankaj Gupta /* Data timeout counter value. SDHC_CLK x 227 */ 33*050a99a6SPankaj Gupta #define TIMEOUT_COUNTER_SDCLK_2_27 0xE 34*050a99a6SPankaj Gupta #define ESDHC_SYSCTL_INITA 0x08000000 35*050a99a6SPankaj Gupta 36*050a99a6SPankaj Gupta /* eSDHC interrupt status enable register defines */ 37*050a99a6SPankaj Gupta #define ESDHC_IRQSTATEN_CINS 0x00000040 38*050a99a6SPankaj Gupta #define ESDHC_IRQSTATEN_BWR 0x00000010 39*050a99a6SPankaj Gupta 40*050a99a6SPankaj Gupta /* eSDHC interrupt status register defines */ 41*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_DMAE (0x10000000) 42*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_AC12E (0x01000000) 43*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_DEBE (0x00400000) 44*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_DCE (0x00200000) 45*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_DTOE (0x00100000) 46*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_CIE (0x00080000) 47*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_CEBE (0x00040000) 48*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_CCE (0x00020000) 49*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_CTOE (0x00010000) 50*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_CINT (0x00000100) 51*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_CRM (0x00000080) 52*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_CINS (0x00000040) 53*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_BRR (0x00000020) 54*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_BWR (0x00000010) 55*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_DINT (0x00000008) 56*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_BGE (0x00000004) 57*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_TC (0x00000002) 58*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_CC (0x00000001) 59*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_CMD_ERR (ESDHC_IRQSTAT_CIE |\ 60*050a99a6SPankaj Gupta ESDHC_IRQSTAT_CEBE |\ 61*050a99a6SPankaj Gupta ESDHC_IRQSTAT_CCE) 62*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_DATA_ERR (ESDHC_IRQSTAT_DEBE |\ 63*050a99a6SPankaj Gupta ESDHC_IRQSTAT_DCE |\ 64*050a99a6SPankaj Gupta ESDHC_IRQSTAT_DTOE) 65*050a99a6SPankaj Gupta #define ESDHC_IRQSTAT_CLEAR_ALL (0xFFFFFFFF) 66*050a99a6SPankaj Gupta 67*050a99a6SPankaj Gupta /* eSDHC present state register defines */ 68*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_CLSL 0x00800000 69*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_WPSPL 0x00080000 70*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_CDPL 0x00040000 71*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_CINS 0x00010000 72*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_BREN 0x00000800 73*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_BWEN 0x00000400 74*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_RTA 0x00000200 75*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_WTA 0x00000100 76*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_SDOFF 0x00000080 77*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_PEROFF 0x00000040 78*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_HCKOFF 0x00000020 79*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_IPGOFF 0x00000010 80*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_DLA 0x00000004 81*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_CDIHB 0x00000002 82*050a99a6SPankaj Gupta #define ESDHC_PRSSTAT_CIHB 0x00000001 83*050a99a6SPankaj Gupta 84*050a99a6SPankaj Gupta /* eSDHC protocol control register defines */ 85*050a99a6SPankaj Gupta #define ESDHC_PROCTL_EMODE_LE 0x00000020 86*050a99a6SPankaj Gupta #define ESDHC_PROCTL_DTW_1BIT 0x00000000 87*050a99a6SPankaj Gupta #define ESDHC_PROCTL_DTW_4BIT 0x00000002 88*050a99a6SPankaj Gupta #define ESDHC_PROCTL_DTW_8BIT 0x00000004 89*050a99a6SPankaj Gupta 90*050a99a6SPankaj Gupta /* Watermark Level Register (WML) */ 91*050a99a6SPankaj Gupta #define ESDHC_WML_RD_WML(w) ((w) & 0x7F) 92*050a99a6SPankaj Gupta #define ESDHC_WML_WR_WML(w) (((w) & 0x7F) << 16) 93*050a99a6SPankaj Gupta #define ESDHC_WML_RD_BRST(w) (((w) & 0xF) << 8) 94*050a99a6SPankaj Gupta #define ESDHC_WML_WR_BRST(w) (((w) & 0xF) << 24) 95*050a99a6SPankaj Gupta #define ESDHC_WML_WR_BRST_MASK (0x0F000000) 96*050a99a6SPankaj Gupta #define ESDHC_WML_RD_BRST_MASK (0x00000F00) 97*050a99a6SPankaj Gupta #define ESDHC_WML_RD_WML_MASK (0x0000007F) 98*050a99a6SPankaj Gupta #define ESDHC_WML_WR_WML_MASK (0x007F0000) 99*050a99a6SPankaj Gupta #define WML_512_BYTES (0x0) 100*050a99a6SPankaj Gupta #define BURST_128_BYTES (0x0) 101*050a99a6SPankaj Gupta 102*050a99a6SPankaj Gupta /* eSDHC control register define */ 103*050a99a6SPankaj Gupta #define ESDHC_DCR_SNOOP 0x00000040 104*050a99a6SPankaj Gupta 105*050a99a6SPankaj Gupta /* ESDHC Block attributes register */ 106*050a99a6SPankaj Gupta #define ESDHC_BLKATTR_BLKCNT(c) (((c) & 0xffff) << 16) 107*050a99a6SPankaj Gupta #define ESDHC_BLKATTR_BLKSZE(s) ((s) & 0xfff) 108*050a99a6SPankaj Gupta 109*050a99a6SPankaj Gupta /* Transfer Type Register */ 110*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_CMD(c) (((c) & 0x3F) << 24) 111*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_CMDTYP_NORMAL (0x0) 112*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_CMDTYP_SUSPEND (0x00400000) 113*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_CMDTYP_RESUME (0x00800000) 114*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_CMDTYP_ABORT (0x00C00000) 115*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_DPSEL (0x00200000) 116*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_CICEN (0x00100000) 117*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_CCCEN (0x00080000) 118*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_RSPTYP_NONE (0x0) 119*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_RSPTYP_136 (0x00010000) 120*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_RSPTYP_48 (0x00020000) 121*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_RSPTYP_48_BUSY (0x00030000) 122*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_MSBSEL (0x00000020) 123*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_DTDSEL (0x00000010) 124*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_AC12EN (0x00000004) 125*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_BCEN (0x00000002) 126*050a99a6SPankaj Gupta #define ESDHC_XFERTYP_DMAEN (0x00000001) 127*050a99a6SPankaj Gupta 128*050a99a6SPankaj Gupta #define MMC_VDD_HIGH_VOLTAGE 0x00000100 129*050a99a6SPankaj Gupta 130*050a99a6SPankaj Gupta /* command index */ 131*050a99a6SPankaj Gupta #define CMD0 0 132*050a99a6SPankaj Gupta #define CMD1 1 133*050a99a6SPankaj Gupta #define CMD2 2 134*050a99a6SPankaj Gupta #define CMD3 3 135*050a99a6SPankaj Gupta #define CMD5 5 136*050a99a6SPankaj Gupta #define CMD6 6 137*050a99a6SPankaj Gupta #define CMD7 7 138*050a99a6SPankaj Gupta #define CMD8 8 139*050a99a6SPankaj Gupta #define CMD9 9 140*050a99a6SPankaj Gupta #define CMD12 12 141*050a99a6SPankaj Gupta #define CMD13 13 142*050a99a6SPankaj Gupta #define CMD14 14 143*050a99a6SPankaj Gupta #define CMD16 16 144*050a99a6SPankaj Gupta #define CMD17 17 145*050a99a6SPankaj Gupta #define CMD18 18 146*050a99a6SPankaj Gupta #define CMD19 19 147*050a99a6SPankaj Gupta #define CMD24 24 148*050a99a6SPankaj Gupta #define CMD41 41 149*050a99a6SPankaj Gupta #define CMD42 42 150*050a99a6SPankaj Gupta #define CMD51 51 151*050a99a6SPankaj Gupta #define CMD55 55 152*050a99a6SPankaj Gupta #define CMD56 56 153*050a99a6SPankaj Gupta #define ACMD6 CMD6 154*050a99a6SPankaj Gupta #define ACMD13 CMD13 155*050a99a6SPankaj Gupta #define ACMD41 CMD41 156*050a99a6SPankaj Gupta #define ACMD42 CMD42 157*050a99a6SPankaj Gupta #define ACMD51 CMD51 158*050a99a6SPankaj Gupta 159*050a99a6SPankaj Gupta /* commands abbreviations */ 160*050a99a6SPankaj Gupta #define CMD_GO_IDLE_STATE CMD0 161*050a99a6SPankaj Gupta #define CMD_MMC_SEND_OP_COND CMD1 162*050a99a6SPankaj Gupta #define CMD_ALL_SEND_CID CMD2 163*050a99a6SPankaj Gupta #define CMD_SEND_RELATIVE_ADDR CMD3 164*050a99a6SPankaj Gupta #define CMD_SET_DSR CMD4 165*050a99a6SPankaj Gupta #define CMD_SWITCH_FUNC CMD6 166*050a99a6SPankaj Gupta #define CMD_SELECT_CARD CMD7 167*050a99a6SPankaj Gupta #define CMD_DESELECT_CARD CMD7 168*050a99a6SPankaj Gupta #define CMD_SEND_IF_COND CMD8 169*050a99a6SPankaj Gupta #define CMD_MMC_SEND_EXT_CSD CMD8 170*050a99a6SPankaj Gupta #define CMD_SEND_CSD CMD9 171*050a99a6SPankaj Gupta #define CMD_SEND_CID CMD10 172*050a99a6SPankaj Gupta #define CMD_STOP_TRANSMISSION CMD12 173*050a99a6SPankaj Gupta #define CMD_SEND_STATUS CMD13 174*050a99a6SPankaj Gupta #define CMD_BUS_TEST_R CMD14 175*050a99a6SPankaj Gupta #define CMD_GO_INACTIVE_STATE CMD15 176*050a99a6SPankaj Gupta #define CMD_SET_BLOCKLEN CMD16 177*050a99a6SPankaj Gupta #define CMD_READ_SINGLE_BLOCK CMD17 178*050a99a6SPankaj Gupta #define CMD_READ_MULTIPLE_BLOCK CMD18 179*050a99a6SPankaj Gupta #define CMD_WRITE_SINGLE_BLOCK CMD24 180*050a99a6SPankaj Gupta #define CMD_BUS_TEST_W CMD19 181*050a99a6SPankaj Gupta #define CMD_APP_CMD CMD55 182*050a99a6SPankaj Gupta #define CMD_GEN_CMD CMD56 183*050a99a6SPankaj Gupta #define CMD_SET_BUS_WIDTH ACMD6 184*050a99a6SPankaj Gupta #define CMD_SD_STATUS ACMD13 185*050a99a6SPankaj Gupta #define CMD_SD_SEND_OP_COND ACMD41 186*050a99a6SPankaj Gupta #define CMD_SET_CLR_CARD_DETECT ACMD42 187*050a99a6SPankaj Gupta #define CMD_SEND_SCR ACMD51 188*050a99a6SPankaj Gupta 189*050a99a6SPankaj Gupta /* MMC card spec version */ 190*050a99a6SPankaj Gupta #define MMC_CARD_VERSION_1_2 0 191*050a99a6SPankaj Gupta #define MMC_CARD_VERSION_1_4 1 192*050a99a6SPankaj Gupta #define MMC_CARD_VERSION_2_X 2 193*050a99a6SPankaj Gupta #define MMC_CARD_VERSION_3_X 3 194*050a99a6SPankaj Gupta #define MMC_CARD_VERSION_4_X 4 195*050a99a6SPankaj Gupta 196*050a99a6SPankaj Gupta /* SD Card Spec Version */ 197*050a99a6SPankaj Gupta /* May need to add version 3 here? */ 198*050a99a6SPankaj Gupta #define SD_CARD_VERSION_1_0 0 199*050a99a6SPankaj Gupta #define SD_CARD_VERSION_1_10 1 200*050a99a6SPankaj Gupta #define SD_CARD_VERSION_2_0 2 201*050a99a6SPankaj Gupta 202*050a99a6SPankaj Gupta /* card types */ 203*050a99a6SPankaj Gupta #define MMC_CARD 0 204*050a99a6SPankaj Gupta #define SD_CARD 1 205*050a99a6SPankaj Gupta #define NOT_SD_CARD MMC_CARD 206*050a99a6SPankaj Gupta 207*050a99a6SPankaj Gupta /* Card rca */ 208*050a99a6SPankaj Gupta #define SD_MMC_CARD_RCA 0x1 209*050a99a6SPankaj Gupta #define BLOCK_LEN_512 512 210*050a99a6SPankaj Gupta 211*050a99a6SPankaj Gupta /* card state */ 212*050a99a6SPankaj Gupta #define STATE_IDLE 0 213*050a99a6SPankaj Gupta #define STATE_READY 1 214*050a99a6SPankaj Gupta #define STATE_IDENT 2 215*050a99a6SPankaj Gupta #define STATE_STBY 3 216*050a99a6SPankaj Gupta #define STATE_TRAN 4 217*050a99a6SPankaj Gupta #define STATE_DATA 5 218*050a99a6SPankaj Gupta #define STATE_RCV 6 219*050a99a6SPankaj Gupta #define STATE_PRG 7 220*050a99a6SPankaj Gupta #define STATE_DIS 8 221*050a99a6SPankaj Gupta 222*050a99a6SPankaj Gupta /* Card OCR register */ 223*050a99a6SPankaj Gupta /* VDD voltage window 1,65 to 1.95 */ 224*050a99a6SPankaj Gupta #define MMC_OCR_VDD_165_195 0x00000080 225*050a99a6SPankaj Gupta /* VDD voltage window 2.7-2.8 */ 226*050a99a6SPankaj Gupta #define MMC_OCR_VDD_FF8 0x00FF8000 227*050a99a6SPankaj Gupta #define MMC_OCR_CCS 0x40000000/* Card Capacity */ 228*050a99a6SPankaj Gupta #define MMC_OCR_BUSY 0x80000000/* busy bit */ 229*050a99a6SPankaj Gupta #define SD_OCR_HCS 0x40000000/* High capacity host */ 230*050a99a6SPankaj Gupta #define MMC_OCR_SECTOR_MODE 0x40000000/* Access Mode as Sector */ 231*050a99a6SPankaj Gupta 232*050a99a6SPankaj Gupta /* mmc Switch function */ 233*050a99a6SPankaj Gupta #define SET_EXT_CSD_HS_TIMING 0x03B90100/* set High speed */ 234*050a99a6SPankaj Gupta 235*050a99a6SPankaj Gupta /* check supports switching or not */ 236*050a99a6SPankaj Gupta #define SD_SWITCH_FUNC_CHECK_MODE 0x00FFFFF1 237*050a99a6SPankaj Gupta #define SD_SWITCH_FUNC_SWITCH_MODE 0x80FFFFF1/* switch */ 238*050a99a6SPankaj Gupta #define SD_SWITCH_FUNC_HIGH_SPEED 0x02/* HIGH SPEED FUNC */ 239*050a99a6SPankaj Gupta #define SWITCH_ERROR 0x00000080 240*050a99a6SPankaj Gupta 241*050a99a6SPankaj Gupta /* errors in sending commands */ 242*050a99a6SPankaj Gupta #define RESP_TIMEOUT 0x1 243*050a99a6SPankaj Gupta #define COMMAND_ERROR 0x2 244*050a99a6SPankaj Gupta /* error in response */ 245*050a99a6SPankaj Gupta #define R1_ERROR (1 << 19) 246*050a99a6SPankaj Gupta #define R1_CURRENT_STATE(x) (((x) & 0x00001E00) >> 9) 247*050a99a6SPankaj Gupta 248*050a99a6SPankaj Gupta /* Host Controller Capabilities */ 249*050a99a6SPankaj Gupta #define ESDHC_HOSTCAPBLT_DMAS (0x00400000) 250*050a99a6SPankaj Gupta 251*050a99a6SPankaj Gupta 252*050a99a6SPankaj Gupta /* SD/MMC memory map */ 253*050a99a6SPankaj Gupta struct esdhc_regs { 254*050a99a6SPankaj Gupta uint32_t dsaddr; /* dma system address */ 255*050a99a6SPankaj Gupta uint32_t blkattr; /* Block attributes */ 256*050a99a6SPankaj Gupta uint32_t cmdarg; /* Command argument */ 257*050a99a6SPankaj Gupta uint32_t xfertyp; /* Command transfer type */ 258*050a99a6SPankaj Gupta uint32_t cmdrsp[4]; /* Command response0,1,2,3 */ 259*050a99a6SPankaj Gupta uint32_t datport; /* Data buffer access port */ 260*050a99a6SPankaj Gupta uint32_t prsstat; /* Present state */ 261*050a99a6SPankaj Gupta uint32_t proctl; /* Protocol control */ 262*050a99a6SPankaj Gupta uint32_t sysctl; /* System control */ 263*050a99a6SPankaj Gupta uint32_t irqstat; /* Interrupt status */ 264*050a99a6SPankaj Gupta uint32_t irqstaten; /* Interrupt status enable */ 265*050a99a6SPankaj Gupta uint32_t irqsigen; /* Interrupt signal enable */ 266*050a99a6SPankaj Gupta uint32_t autoc12err; /* Auto CMD12 status */ 267*050a99a6SPankaj Gupta uint32_t hostcapblt; /* Host controller capabilities */ 268*050a99a6SPankaj Gupta uint32_t wml; /* Watermark level */ 269*050a99a6SPankaj Gupta uint32_t res1[2]; 270*050a99a6SPankaj Gupta uint32_t fevt; /* Force event */ 271*050a99a6SPankaj Gupta uint32_t res2; 272*050a99a6SPankaj Gupta uint32_t adsaddrl; 273*050a99a6SPankaj Gupta uint32_t adsaddrh; 274*050a99a6SPankaj Gupta uint32_t res3[39]; 275*050a99a6SPankaj Gupta uint32_t hostver; /* Host controller version */ 276*050a99a6SPankaj Gupta uint32_t res4; 277*050a99a6SPankaj Gupta uint32_t dmaerr; /* DMA error address */ 278*050a99a6SPankaj Gupta uint32_t dmaerrh; /* DMA error address high */ 279*050a99a6SPankaj Gupta uint32_t dmaerrattr; /* DMA error atrribute */ 280*050a99a6SPankaj Gupta uint32_t res5; 281*050a99a6SPankaj Gupta uint32_t hostcapblt2;/* Host controller capabilities2 */ 282*050a99a6SPankaj Gupta uint32_t res6[2]; 283*050a99a6SPankaj Gupta uint32_t tcr; /* Tuning control */ 284*050a99a6SPankaj Gupta uint32_t res7[7]; 285*050a99a6SPankaj Gupta uint32_t dirctrl; /* Direction control */ 286*050a99a6SPankaj Gupta uint32_t ccr; /* Clock control */ 287*050a99a6SPankaj Gupta uint32_t res8[177]; 288*050a99a6SPankaj Gupta uint32_t ctl; /* Control register */ 289*050a99a6SPankaj Gupta }; 290*050a99a6SPankaj Gupta 291*050a99a6SPankaj Gupta /* SD/MMC card attributes */ 292*050a99a6SPankaj Gupta struct card_attributes { 293*050a99a6SPankaj Gupta uint32_t type; /* sd or mmc card */ 294*050a99a6SPankaj Gupta uint32_t version; /* version */ 295*050a99a6SPankaj Gupta uint32_t block_len; /* block length */ 296*050a99a6SPankaj Gupta uint32_t bus_freq; /* sdhc bus frequency */ 297*050a99a6SPankaj Gupta uint16_t rca; /* relative card address */ 298*050a99a6SPankaj Gupta uint8_t is_high_capacity; /* high capacity */ 299*050a99a6SPankaj Gupta }; 300*050a99a6SPankaj Gupta 301*050a99a6SPankaj Gupta struct mmc { 302*050a99a6SPankaj Gupta struct esdhc_regs *esdhc_regs; 303*050a99a6SPankaj Gupta struct card_attributes card; 304*050a99a6SPankaj Gupta 305*050a99a6SPankaj Gupta uint32_t block_len; 306*050a99a6SPankaj Gupta uint32_t voltages_caps; /* supported voltaes */ 307*050a99a6SPankaj Gupta uint32_t dma_support; /* DMA support */ 308*050a99a6SPankaj Gupta }; 309*050a99a6SPankaj Gupta 310*050a99a6SPankaj Gupta enum cntrl_num { 311*050a99a6SPankaj Gupta SDHC1 = 0, 312*050a99a6SPankaj Gupta SDHC2 313*050a99a6SPankaj Gupta }; 314*050a99a6SPankaj Gupta 315*050a99a6SPankaj Gupta int sd_emmc_init(uintptr_t *block_dev_spec, 316*050a99a6SPankaj Gupta uintptr_t nxp_esdhc_addr, 317*050a99a6SPankaj Gupta size_t nxp_sd_block_offset, 318*050a99a6SPankaj Gupta size_t nxp_sd_block_size, 319*050a99a6SPankaj Gupta bool card_detect); 320*050a99a6SPankaj Gupta 321*050a99a6SPankaj Gupta int esdhc_emmc_init(struct mmc *mmc, bool card_detect); 322*050a99a6SPankaj Gupta int esdhc_read(struct mmc *mmc, uint32_t src_offset, uintptr_t dst, 323*050a99a6SPankaj Gupta size_t size); 324*050a99a6SPankaj Gupta int esdhc_write(struct mmc *mmc, uintptr_t src, uint32_t dst_offset, 325*050a99a6SPankaj Gupta size_t size); 326*050a99a6SPankaj Gupta 327*050a99a6SPankaj Gupta #ifdef NXP_ESDHC_BE 328*050a99a6SPankaj Gupta #define esdhc_in32(a) bswap32(mmio_read_32((uintptr_t)(a))) 329*050a99a6SPankaj Gupta #define esdhc_out32(a, v) mmio_write_32((uintptr_t)(a), bswap32(v)) 330*050a99a6SPankaj Gupta #elif defined(NXP_ESDHC_LE) 331*050a99a6SPankaj Gupta #define esdhc_in32(a) mmio_read_32((uintptr_t)(a)) 332*050a99a6SPankaj Gupta #define esdhc_out32(a, v) mmio_write_32((uintptr_t)(a), (v)) 333*050a99a6SPankaj Gupta #else 334*050a99a6SPankaj Gupta #error Please define CCSR ESDHC register endianness 335*050a99a6SPankaj Gupta #endif 336*050a99a6SPankaj Gupta 337*050a99a6SPankaj Gupta #endif /*SD_MMC_H*/ 338