1*54fd6939SJiyong Park /* 2*54fd6939SJiyong Park * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. 3*54fd6939SJiyong Park * 4*54fd6939SJiyong Park * SPDX-License-Identifier: BSD-3-Clause 5*54fd6939SJiyong Park */ 6*54fd6939SJiyong Park 7*54fd6939SJiyong Park #ifndef IMX_USDHC_H 8*54fd6939SJiyong Park #define IMX_USDHC_H 9*54fd6939SJiyong Park 10*54fd6939SJiyong Park #include <drivers/mmc.h> 11*54fd6939SJiyong Park 12*54fd6939SJiyong Park typedef struct imx_usdhc_params { 13*54fd6939SJiyong Park uintptr_t reg_base; 14*54fd6939SJiyong Park int clk_rate; 15*54fd6939SJiyong Park int bus_width; 16*54fd6939SJiyong Park unsigned int flags; 17*54fd6939SJiyong Park } imx_usdhc_params_t; 18*54fd6939SJiyong Park 19*54fd6939SJiyong Park void imx_usdhc_init(imx_usdhc_params_t *params, 20*54fd6939SJiyong Park struct mmc_device_info *mmc_dev_info); 21*54fd6939SJiyong Park 22*54fd6939SJiyong Park /* iMX MMC registers definition */ 23*54fd6939SJiyong Park #define DSADDR 0x000 24*54fd6939SJiyong Park #define BLKATT 0x004 25*54fd6939SJiyong Park #define CMDARG 0x008 26*54fd6939SJiyong Park #define CMDRSP0 0x010 27*54fd6939SJiyong Park #define CMDRSP1 0x014 28*54fd6939SJiyong Park #define CMDRSP2 0x018 29*54fd6939SJiyong Park #define CMDRSP3 0x01c 30*54fd6939SJiyong Park 31*54fd6939SJiyong Park #define XFERTYPE 0x00c 32*54fd6939SJiyong Park #define XFERTYPE_CMD(x) (((x) & 0x3f) << 24) 33*54fd6939SJiyong Park #define XFERTYPE_CMDTYP_ABORT (3 << 22) 34*54fd6939SJiyong Park #define XFERTYPE_DPSEL BIT(21) 35*54fd6939SJiyong Park #define XFERTYPE_CICEN BIT(20) 36*54fd6939SJiyong Park #define XFERTYPE_CCCEN BIT(19) 37*54fd6939SJiyong Park #define XFERTYPE_RSPTYP_136 BIT(16) 38*54fd6939SJiyong Park #define XFERTYPE_RSPTYP_48 BIT(17) 39*54fd6939SJiyong Park #define XFERTYPE_RSPTYP_48_BUSY (BIT(16) | BIT(17)) 40*54fd6939SJiyong Park 41*54fd6939SJiyong Park #define PSTATE 0x024 42*54fd6939SJiyong Park #define PSTATE_DAT0 BIT(24) 43*54fd6939SJiyong Park #define PSTATE_DLA BIT(2) 44*54fd6939SJiyong Park #define PSTATE_CDIHB BIT(1) 45*54fd6939SJiyong Park #define PSTATE_CIHB BIT(0) 46*54fd6939SJiyong Park 47*54fd6939SJiyong Park #define PROTCTRL 0x028 48*54fd6939SJiyong Park #define PROTCTRL_LE BIT(5) 49*54fd6939SJiyong Park #define PROTCTRL_WIDTH_4 BIT(1) 50*54fd6939SJiyong Park #define PROTCTRL_WIDTH_8 BIT(2) 51*54fd6939SJiyong Park #define PROTCTRL_WIDTH_MASK 0x6 52*54fd6939SJiyong Park 53*54fd6939SJiyong Park #define SYSCTRL 0x02c 54*54fd6939SJiyong Park #define SYSCTRL_RSTD BIT(26) 55*54fd6939SJiyong Park #define SYSCTRL_RSTC BIT(25) 56*54fd6939SJiyong Park #define SYSCTRL_RSTA BIT(24) 57*54fd6939SJiyong Park #define SYSCTRL_CLOCK_MASK 0x0000fff0 58*54fd6939SJiyong Park #define SYSCTRL_TIMEOUT_MASK 0x000f0000 59*54fd6939SJiyong Park #define SYSCTRL_TIMEOUT(x) ((0xf & (x)) << 16) 60*54fd6939SJiyong Park 61*54fd6939SJiyong Park #define INTSTAT 0x030 62*54fd6939SJiyong Park #define INTSTAT_DMAE BIT(28) 63*54fd6939SJiyong Park #define INTSTAT_DEBE BIT(22) 64*54fd6939SJiyong Park #define INTSTAT_DCE BIT(21) 65*54fd6939SJiyong Park #define INTSTAT_DTOE BIT(20) 66*54fd6939SJiyong Park #define INTSTAT_CIE BIT(19) 67*54fd6939SJiyong Park #define INTSTAT_CEBE BIT(18) 68*54fd6939SJiyong Park #define INTSTAT_CCE BIT(17) 69*54fd6939SJiyong Park #define INTSTAT_DINT BIT(3) 70*54fd6939SJiyong Park #define INTSTAT_BGE BIT(2) 71*54fd6939SJiyong Park #define INTSTAT_TC BIT(1) 72*54fd6939SJiyong Park #define INTSTAT_CC BIT(0) 73*54fd6939SJiyong Park #define CMD_ERR (INTSTAT_CIE | INTSTAT_CEBE | INTSTAT_CCE) 74*54fd6939SJiyong Park #define DATA_ERR (INTSTAT_DMAE | INTSTAT_DEBE | INTSTAT_DCE | \ 75*54fd6939SJiyong Park INTSTAT_DTOE) 76*54fd6939SJiyong Park #define DATA_COMPLETE (INTSTAT_DINT | INTSTAT_TC) 77*54fd6939SJiyong Park 78*54fd6939SJiyong Park #define INTSTATEN 0x034 79*54fd6939SJiyong Park #define INTSTATEN_DEBE BIT(22) 80*54fd6939SJiyong Park #define INTSTATEN_DCE BIT(21) 81*54fd6939SJiyong Park #define INTSTATEN_DTOE BIT(20) 82*54fd6939SJiyong Park #define INTSTATEN_CIE BIT(19) 83*54fd6939SJiyong Park #define INTSTATEN_CEBE BIT(18) 84*54fd6939SJiyong Park #define INTSTATEN_CCE BIT(17) 85*54fd6939SJiyong Park #define INTSTATEN_CTOE BIT(16) 86*54fd6939SJiyong Park #define INTSTATEN_CINT BIT(8) 87*54fd6939SJiyong Park #define INTSTATEN_BRR BIT(5) 88*54fd6939SJiyong Park #define INTSTATEN_BWR BIT(4) 89*54fd6939SJiyong Park #define INTSTATEN_DINT BIT(3) 90*54fd6939SJiyong Park #define INTSTATEN_TC BIT(1) 91*54fd6939SJiyong Park #define INTSTATEN_CC BIT(0) 92*54fd6939SJiyong Park #define EMMC_INTSTATEN_BITS (INTSTATEN_CC | INTSTATEN_TC | INTSTATEN_DINT | \ 93*54fd6939SJiyong Park INTSTATEN_BWR | INTSTATEN_BRR | INTSTATEN_CINT | \ 94*54fd6939SJiyong Park INTSTATEN_CTOE | INTSTATEN_CCE | INTSTATEN_CEBE | \ 95*54fd6939SJiyong Park INTSTATEN_CIE | INTSTATEN_DTOE | INTSTATEN_DCE | \ 96*54fd6939SJiyong Park INTSTATEN_DEBE) 97*54fd6939SJiyong Park 98*54fd6939SJiyong Park #define INTSIGEN 0x038 99*54fd6939SJiyong Park 100*54fd6939SJiyong Park #define WATERMARKLEV 0x044 101*54fd6939SJiyong Park #define WMKLV_RD_MASK 0xff 102*54fd6939SJiyong Park #define WMKLV_WR_MASK 0x00ff0000 103*54fd6939SJiyong Park #define WMKLV_MASK (WMKLV_RD_MASK | WMKLV_WR_MASK) 104*54fd6939SJiyong Park 105*54fd6939SJiyong Park #define MIXCTRL 0x048 106*54fd6939SJiyong Park #define MIXCTRL_MSBSEL BIT(5) 107*54fd6939SJiyong Park #define MIXCTRL_DTDSEL BIT(4) 108*54fd6939SJiyong Park #define MIXCTRL_DDREN BIT(3) 109*54fd6939SJiyong Park #define MIXCTRL_AC12EN BIT(2) 110*54fd6939SJiyong Park #define MIXCTRL_BCEN BIT(1) 111*54fd6939SJiyong Park #define MIXCTRL_DMAEN BIT(0) 112*54fd6939SJiyong Park #define MIXCTRL_DATMASK 0x7f 113*54fd6939SJiyong Park 114*54fd6939SJiyong Park #define DLLCTRL 0x060 115*54fd6939SJiyong Park 116*54fd6939SJiyong Park #define CLKTUNECTRLSTS 0x068 117*54fd6939SJiyong Park 118*54fd6939SJiyong Park #define VENDSPEC 0x0c0 119*54fd6939SJiyong Park #define VENDSPEC_RSRV1 BIT(29) 120*54fd6939SJiyong Park #define VENDSPEC_CARD_CLKEN BIT(14) 121*54fd6939SJiyong Park #define VENDSPEC_PER_CLKEN BIT(13) 122*54fd6939SJiyong Park #define VENDSPEC_AHB_CLKEN BIT(12) 123*54fd6939SJiyong Park #define VENDSPEC_IPG_CLKEN BIT(11) 124*54fd6939SJiyong Park #define VENDSPEC_AC12_CHKBUSY BIT(3) 125*54fd6939SJiyong Park #define VENDSPEC_EXTDMA BIT(0) 126*54fd6939SJiyong Park #define VENDSPEC_INIT (VENDSPEC_RSRV1 | VENDSPEC_CARD_CLKEN | \ 127*54fd6939SJiyong Park VENDSPEC_PER_CLKEN | VENDSPEC_AHB_CLKEN | \ 128*54fd6939SJiyong Park VENDSPEC_IPG_CLKEN | VENDSPEC_AC12_CHKBUSY | \ 129*54fd6939SJiyong Park VENDSPEC_EXTDMA) 130*54fd6939SJiyong Park 131*54fd6939SJiyong Park #define MMCBOOT 0x0c4 132*54fd6939SJiyong Park 133*54fd6939SJiyong Park #define mmio_clrsetbits32(addr, clear, set) mmio_write_32(addr, (mmio_read_32(addr) & ~(clear)) | (set)) 134*54fd6939SJiyong Park #define mmio_clrbits32(addr, clear) mmio_write_32(addr, mmio_read_32(addr) & ~(clear)) 135*54fd6939SJiyong Park #define mmio_setbits32(addr, set) mmio_write_32(addr, mmio_read_32(addr) | (set)) 136*54fd6939SJiyong Park 137*54fd6939SJiyong Park #endif /* IMX_USDHC_H */ 138