1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * (C) Copyright 2007-2011 3*4882a593Smuzhiyun * Allwinner Technology Co., Ltd. <www.allwinnertech.com> 4*4882a593Smuzhiyun * Aaron <leafy.myeh@allwinnertech.com> 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * MMC register definition for allwinner sunxi platform. 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 9*4882a593Smuzhiyun */ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #ifndef _SUNXI_MMC_H 12*4882a593Smuzhiyun #define _SUNXI_MMC_H 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #include <linux/types.h> 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun struct sunxi_mmc { 17*4882a593Smuzhiyun u32 gctrl; /* 0x00 global control */ 18*4882a593Smuzhiyun u32 clkcr; /* 0x04 clock control */ 19*4882a593Smuzhiyun u32 timeout; /* 0x08 time out */ 20*4882a593Smuzhiyun u32 width; /* 0x0c bus width */ 21*4882a593Smuzhiyun u32 blksz; /* 0x10 block size */ 22*4882a593Smuzhiyun u32 bytecnt; /* 0x14 byte count */ 23*4882a593Smuzhiyun u32 cmd; /* 0x18 command */ 24*4882a593Smuzhiyun u32 arg; /* 0x1c argument */ 25*4882a593Smuzhiyun u32 resp0; /* 0x20 response 0 */ 26*4882a593Smuzhiyun u32 resp1; /* 0x24 response 1 */ 27*4882a593Smuzhiyun u32 resp2; /* 0x28 response 2 */ 28*4882a593Smuzhiyun u32 resp3; /* 0x2c response 3 */ 29*4882a593Smuzhiyun u32 imask; /* 0x30 interrupt mask */ 30*4882a593Smuzhiyun u32 mint; /* 0x34 masked interrupt status */ 31*4882a593Smuzhiyun u32 rint; /* 0x38 raw interrupt status */ 32*4882a593Smuzhiyun u32 status; /* 0x3c status */ 33*4882a593Smuzhiyun u32 ftrglevel; /* 0x40 FIFO threshold watermark*/ 34*4882a593Smuzhiyun u32 funcsel; /* 0x44 function select */ 35*4882a593Smuzhiyun u32 cbcr; /* 0x48 CIU byte count */ 36*4882a593Smuzhiyun u32 bbcr; /* 0x4c BIU byte count */ 37*4882a593Smuzhiyun u32 dbgc; /* 0x50 debug enable */ 38*4882a593Smuzhiyun u32 res0; /* 0x54 reserved */ 39*4882a593Smuzhiyun u32 a12a; /* 0x58 Auto command 12 argument */ 40*4882a593Smuzhiyun u32 ntsr; /* 0x5c New timing set register */ 41*4882a593Smuzhiyun u32 res1[8]; 42*4882a593Smuzhiyun u32 dmac; /* 0x80 internal DMA control */ 43*4882a593Smuzhiyun u32 dlba; /* 0x84 internal DMA descr list base address */ 44*4882a593Smuzhiyun u32 idst; /* 0x88 internal DMA status */ 45*4882a593Smuzhiyun u32 idie; /* 0x8c internal DMA interrupt enable */ 46*4882a593Smuzhiyun u32 chda; /* 0x90 */ 47*4882a593Smuzhiyun u32 cbda; /* 0x94 */ 48*4882a593Smuzhiyun u32 res2[26]; 49*4882a593Smuzhiyun #ifdef CONFIG_SUNXI_GEN_SUN6I 50*4882a593Smuzhiyun u32 res3[64]; 51*4882a593Smuzhiyun #endif 52*4882a593Smuzhiyun u32 fifo; /* 0x100 / 0x200 FIFO access address */ 53*4882a593Smuzhiyun }; 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun #define SUNXI_MMC_CLK_POWERSAVE (0x1 << 17) 56*4882a593Smuzhiyun #define SUNXI_MMC_CLK_ENABLE (0x1 << 16) 57*4882a593Smuzhiyun #define SUNXI_MMC_CLK_DIVIDER_MASK (0xff) 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun #define SUNXI_MMC_GCTRL_SOFT_RESET (0x1 << 0) 60*4882a593Smuzhiyun #define SUNXI_MMC_GCTRL_FIFO_RESET (0x1 << 1) 61*4882a593Smuzhiyun #define SUNXI_MMC_GCTRL_DMA_RESET (0x1 << 2) 62*4882a593Smuzhiyun #define SUNXI_MMC_GCTRL_RESET (SUNXI_MMC_GCTRL_SOFT_RESET|\ 63*4882a593Smuzhiyun SUNXI_MMC_GCTRL_FIFO_RESET|\ 64*4882a593Smuzhiyun SUNXI_MMC_GCTRL_DMA_RESET) 65*4882a593Smuzhiyun #define SUNXI_MMC_GCTRL_DMA_ENABLE (0x1 << 5) 66*4882a593Smuzhiyun #define SUNXI_MMC_GCTRL_ACCESS_BY_AHB (0x1 << 31) 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun #define SUNXI_MMC_CMD_RESP_EXPIRE (0x1 << 6) 69*4882a593Smuzhiyun #define SUNXI_MMC_CMD_LONG_RESPONSE (0x1 << 7) 70*4882a593Smuzhiyun #define SUNXI_MMC_CMD_CHK_RESPONSE_CRC (0x1 << 8) 71*4882a593Smuzhiyun #define SUNXI_MMC_CMD_DATA_EXPIRE (0x1 << 9) 72*4882a593Smuzhiyun #define SUNXI_MMC_CMD_WRITE (0x1 << 10) 73*4882a593Smuzhiyun #define SUNXI_MMC_CMD_AUTO_STOP (0x1 << 12) 74*4882a593Smuzhiyun #define SUNXI_MMC_CMD_WAIT_PRE_OVER (0x1 << 13) 75*4882a593Smuzhiyun #define SUNXI_MMC_CMD_SEND_INIT_SEQ (0x1 << 15) 76*4882a593Smuzhiyun #define SUNXI_MMC_CMD_UPCLK_ONLY (0x1 << 21) 77*4882a593Smuzhiyun #define SUNXI_MMC_CMD_START (0x1 << 31) 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun #define SUNXI_MMC_RINT_RESP_ERROR (0x1 << 1) 80*4882a593Smuzhiyun #define SUNXI_MMC_RINT_COMMAND_DONE (0x1 << 2) 81*4882a593Smuzhiyun #define SUNXI_MMC_RINT_DATA_OVER (0x1 << 3) 82*4882a593Smuzhiyun #define SUNXI_MMC_RINT_TX_DATA_REQUEST (0x1 << 4) 83*4882a593Smuzhiyun #define SUNXI_MMC_RINT_RX_DATA_REQUEST (0x1 << 5) 84*4882a593Smuzhiyun #define SUNXI_MMC_RINT_RESP_CRC_ERROR (0x1 << 6) 85*4882a593Smuzhiyun #define SUNXI_MMC_RINT_DATA_CRC_ERROR (0x1 << 7) 86*4882a593Smuzhiyun #define SUNXI_MMC_RINT_RESP_TIMEOUT (0x1 << 8) 87*4882a593Smuzhiyun #define SUNXI_MMC_RINT_DATA_TIMEOUT (0x1 << 9) 88*4882a593Smuzhiyun #define SUNXI_MMC_RINT_VOLTAGE_CHANGE_DONE (0x1 << 10) 89*4882a593Smuzhiyun #define SUNXI_MMC_RINT_FIFO_RUN_ERROR (0x1 << 11) 90*4882a593Smuzhiyun #define SUNXI_MMC_RINT_HARD_WARE_LOCKED (0x1 << 12) 91*4882a593Smuzhiyun #define SUNXI_MMC_RINT_START_BIT_ERROR (0x1 << 13) 92*4882a593Smuzhiyun #define SUNXI_MMC_RINT_AUTO_COMMAND_DONE (0x1 << 14) 93*4882a593Smuzhiyun #define SUNXI_MMC_RINT_END_BIT_ERROR (0x1 << 15) 94*4882a593Smuzhiyun #define SUNXI_MMC_RINT_SDIO_INTERRUPT (0x1 << 16) 95*4882a593Smuzhiyun #define SUNXI_MMC_RINT_CARD_INSERT (0x1 << 30) 96*4882a593Smuzhiyun #define SUNXI_MMC_RINT_CARD_REMOVE (0x1 << 31) 97*4882a593Smuzhiyun #define SUNXI_MMC_RINT_INTERRUPT_ERROR_BIT \ 98*4882a593Smuzhiyun (SUNXI_MMC_RINT_RESP_ERROR | \ 99*4882a593Smuzhiyun SUNXI_MMC_RINT_RESP_CRC_ERROR | \ 100*4882a593Smuzhiyun SUNXI_MMC_RINT_DATA_CRC_ERROR | \ 101*4882a593Smuzhiyun SUNXI_MMC_RINT_RESP_TIMEOUT | \ 102*4882a593Smuzhiyun SUNXI_MMC_RINT_DATA_TIMEOUT | \ 103*4882a593Smuzhiyun SUNXI_MMC_RINT_VOLTAGE_CHANGE_DONE | \ 104*4882a593Smuzhiyun SUNXI_MMC_RINT_FIFO_RUN_ERROR | \ 105*4882a593Smuzhiyun SUNXI_MMC_RINT_HARD_WARE_LOCKED | \ 106*4882a593Smuzhiyun SUNXI_MMC_RINT_START_BIT_ERROR | \ 107*4882a593Smuzhiyun SUNXI_MMC_RINT_END_BIT_ERROR) /* 0xbfc2 */ 108*4882a593Smuzhiyun #define SUNXI_MMC_RINT_INTERRUPT_DONE_BIT \ 109*4882a593Smuzhiyun (SUNXI_MMC_RINT_AUTO_COMMAND_DONE | \ 110*4882a593Smuzhiyun SUNXI_MMC_RINT_DATA_OVER | \ 111*4882a593Smuzhiyun SUNXI_MMC_RINT_COMMAND_DONE | \ 112*4882a593Smuzhiyun SUNXI_MMC_RINT_VOLTAGE_CHANGE_DONE) 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun #define SUNXI_MMC_STATUS_RXWL_FLAG (0x1 << 0) 115*4882a593Smuzhiyun #define SUNXI_MMC_STATUS_TXWL_FLAG (0x1 << 1) 116*4882a593Smuzhiyun #define SUNXI_MMC_STATUS_FIFO_EMPTY (0x1 << 2) 117*4882a593Smuzhiyun #define SUNXI_MMC_STATUS_FIFO_FULL (0x1 << 3) 118*4882a593Smuzhiyun #define SUNXI_MMC_STATUS_CARD_PRESENT (0x1 << 8) 119*4882a593Smuzhiyun #define SUNXI_MMC_STATUS_CARD_DATA_BUSY (0x1 << 9) 120*4882a593Smuzhiyun #define SUNXI_MMC_STATUS_DATA_FSM_BUSY (0x1 << 10) 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun #define SUNXI_MMC_NTSR_MODE_SEL_NEW (0x1 << 31) 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun #define SUNXI_MMC_IDMAC_RESET (0x1 << 0) 125*4882a593Smuzhiyun #define SUNXI_MMC_IDMAC_FIXBURST (0x1 << 1) 126*4882a593Smuzhiyun #define SUNXI_MMC_IDMAC_ENABLE (0x1 << 7) 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun #define SUNXI_MMC_IDIE_TXIRQ (0x1 << 0) 129*4882a593Smuzhiyun #define SUNXI_MMC_IDIE_RXIRQ (0x1 << 1) 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun #define SUNXI_MMC_COMMON_CLK_GATE (1 << 16) 132*4882a593Smuzhiyun #define SUNXI_MMC_COMMON_RESET (1 << 18) 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun struct mmc *sunxi_mmc_init(int sdc_no); 135*4882a593Smuzhiyun #endif /* _SUNXI_MMC_H */ 136