1*757bff49SJaehoon Chung /* 2*757bff49SJaehoon Chung * (C) Copyright 2012 SAMSUNG Electronics 3*757bff49SJaehoon Chung * Jaehoon Chung <jh80.chung@samsung.com> 4*757bff49SJaehoon Chung * 5*757bff49SJaehoon Chung * This program is free software; you can redistribute it and/or 6*757bff49SJaehoon Chung * modify it under the terms of the GNU General Public License as 7*757bff49SJaehoon Chung * published by the Free Software Foundation; either version 2 of 8*757bff49SJaehoon Chung * the License, or (at your option) any later version. 9*757bff49SJaehoon Chung * 10*757bff49SJaehoon Chung * This program is distributed in the hope that it will be useful, 11*757bff49SJaehoon Chung * but WITHOUT ANY WARRANTY; without even the implied warranty of 12*757bff49SJaehoon Chung * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13*757bff49SJaehoon Chung * GNU General Public License for more details. 14*757bff49SJaehoon Chung * 15*757bff49SJaehoon Chung * You should have received a copy of the GNU General Public License 16*757bff49SJaehoon Chung * along with this program; if not, write to the Free Software 17*757bff49SJaehoon Chung * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18*757bff49SJaehoon Chung * 19*757bff49SJaehoon Chung */ 20*757bff49SJaehoon Chung 21*757bff49SJaehoon Chung #ifndef __DWMMC_HW_H 22*757bff49SJaehoon Chung #define __DWMMC_HW_H 23*757bff49SJaehoon Chung 24*757bff49SJaehoon Chung #include <asm/io.h> 25*757bff49SJaehoon Chung #include <mmc.h> 26*757bff49SJaehoon Chung 27*757bff49SJaehoon Chung #define DWMCI_CTRL 0x000 28*757bff49SJaehoon Chung #define DWMCI_PWREN 0x004 29*757bff49SJaehoon Chung #define DWMCI_CLKDIV 0x008 30*757bff49SJaehoon Chung #define DWMCI_CLKSRC 0x00C 31*757bff49SJaehoon Chung #define DWMCI_CLKENA 0x010 32*757bff49SJaehoon Chung #define DWMCI_TMOUT 0x014 33*757bff49SJaehoon Chung #define DWMCI_CTYPE 0x018 34*757bff49SJaehoon Chung #define DWMCI_BLKSIZ 0x01C 35*757bff49SJaehoon Chung #define DWMCI_BYTCNT 0x020 36*757bff49SJaehoon Chung #define DWMCI_INTMASK 0x024 37*757bff49SJaehoon Chung #define DWMCI_CMDARG 0x028 38*757bff49SJaehoon Chung #define DWMCI_CMD 0x02C 39*757bff49SJaehoon Chung #define DWMCI_RESP0 0x030 40*757bff49SJaehoon Chung #define DWMCI_RESP1 0x034 41*757bff49SJaehoon Chung #define DWMCI_RESP2 0x038 42*757bff49SJaehoon Chung #define DWMCI_RESP3 0x03C 43*757bff49SJaehoon Chung #define DWMCI_MINTSTS 0x040 44*757bff49SJaehoon Chung #define DWMCI_RINTSTS 0x044 45*757bff49SJaehoon Chung #define DWMCI_STATUS 0x048 46*757bff49SJaehoon Chung #define DWMCI_FIFOTH 0x04C 47*757bff49SJaehoon Chung #define DWMCI_CDETECT 0x050 48*757bff49SJaehoon Chung #define DWMCI_WRTPRT 0x054 49*757bff49SJaehoon Chung #define DWMCI_GPIO 0x058 50*757bff49SJaehoon Chung #define DWMCI_TCMCNT 0x05C 51*757bff49SJaehoon Chung #define DWMCI_TBBCNT 0x060 52*757bff49SJaehoon Chung #define DWMCI_DEBNCE 0x064 53*757bff49SJaehoon Chung #define DWMCI_USRID 0x068 54*757bff49SJaehoon Chung #define DWMCI_VERID 0x06C 55*757bff49SJaehoon Chung #define DWMCI_HCON 0x070 56*757bff49SJaehoon Chung #define DWMCI_UHS_REG 0x074 57*757bff49SJaehoon Chung #define DWMCI_BMOD 0x080 58*757bff49SJaehoon Chung #define DWMCI_PLDMND 0x084 59*757bff49SJaehoon Chung #define DWMCI_DBADDR 0x088 60*757bff49SJaehoon Chung #define DWMCI_IDSTS 0x08C 61*757bff49SJaehoon Chung #define DWMCI_IDINTEN 0x090 62*757bff49SJaehoon Chung #define DWMCI_DSCADDR 0x094 63*757bff49SJaehoon Chung #define DWMCI_BUFADDR 0x098 64*757bff49SJaehoon Chung #define DWMCI_DATA 0x200 65*757bff49SJaehoon Chung 66*757bff49SJaehoon Chung /* Interrupt Mask register */ 67*757bff49SJaehoon Chung #define DWMCI_INTMSK_ALL 0xffffffff 68*757bff49SJaehoon Chung #define DWMCI_INTMSK_RE (1 << 1) 69*757bff49SJaehoon Chung #define DWMCI_INTMSK_CDONE (1 << 2) 70*757bff49SJaehoon Chung #define DWMCI_INTMSK_DTO (1 << 3) 71*757bff49SJaehoon Chung #define DWMCI_INTMSK_TXDR (1 << 4) 72*757bff49SJaehoon Chung #define DWMCI_INTMSK_RXDR (1 << 5) 73*757bff49SJaehoon Chung #define DWMCI_INTMSK_DCRC (1 << 7) 74*757bff49SJaehoon Chung #define DWMCI_INTMSK_RTO (1 << 8) 75*757bff49SJaehoon Chung #define DWMCI_INTMSK_DRTO (1 << 9) 76*757bff49SJaehoon Chung #define DWMCI_INTMSK_HTO (1 << 10) 77*757bff49SJaehoon Chung #define DWMCI_INTMSK_FRUN (1 << 11) 78*757bff49SJaehoon Chung #define DWMCI_INTMSK_HLE (1 << 12) 79*757bff49SJaehoon Chung #define DWMCI_INTMSK_SBE (1 << 13) 80*757bff49SJaehoon Chung #define DWMCI_INTMSK_ACD (1 << 14) 81*757bff49SJaehoon Chung #define DWMCI_INTMSK_EBE (1 << 15) 82*757bff49SJaehoon Chung 83*757bff49SJaehoon Chung /* Raw interrupt Regsiter */ 84*757bff49SJaehoon Chung #define DWMCI_DATA_ERR (DWMCI_INTMSK_EBE | DWMCI_INTMSK_SBE | DWMCI_INTMSK_HLE |\ 85*757bff49SJaehoon Chung DWMCI_INTMSK_FRUN | DWMCI_INTMSK_EBE | DWMCI_INTMSK_DCRC) 86*757bff49SJaehoon Chung #define DWMCI_DATA_TOUT (DWMCI_INTMSK_HTO | DWMCI_INTMSK_DRTO) 87*757bff49SJaehoon Chung /* CTRL register */ 88*757bff49SJaehoon Chung #define DWMCI_CTRL_RESET (1 << 0) 89*757bff49SJaehoon Chung #define DWMCI_CTRL_FIFO_RESET (1 << 1) 90*757bff49SJaehoon Chung #define DWMCI_CTRL_DMA_RESET (1 << 2) 91*757bff49SJaehoon Chung #define DWMCI_DMA_EN (1 << 5) 92*757bff49SJaehoon Chung #define DWMCI_CTRL_SEND_AS_CCSD (1 << 10) 93*757bff49SJaehoon Chung #define DWMCI_IDMAC_EN (1 << 25) 94*757bff49SJaehoon Chung #define DWMCI_RESET_ALL (DWMCI_CTRL_RESET | DWMCI_CTRL_FIFO_RESET |\ 95*757bff49SJaehoon Chung DWMCI_CTRL_DMA_RESET) 96*757bff49SJaehoon Chung 97*757bff49SJaehoon Chung /* CMD register */ 98*757bff49SJaehoon Chung #define DWMCI_CMD_RESP_EXP (1 << 6) 99*757bff49SJaehoon Chung #define DWMCI_CMD_RESP_LENGTH (1 << 7) 100*757bff49SJaehoon Chung #define DWMCI_CMD_CHECK_CRC (1 << 8) 101*757bff49SJaehoon Chung #define DWMCI_CMD_DATA_EXP (1 << 9) 102*757bff49SJaehoon Chung #define DWMCI_CMD_RW (1 << 10) 103*757bff49SJaehoon Chung #define DWMCI_CMD_SEND_STOP (1 << 12) 104*757bff49SJaehoon Chung #define DWMCI_CMD_ABORT_STOP (1 << 14) 105*757bff49SJaehoon Chung #define DWMCI_CMD_PRV_DAT_WAIT (1 << 13) 106*757bff49SJaehoon Chung #define DWMCI_CMD_UPD_CLK (1 << 21) 107*757bff49SJaehoon Chung #define DWMCI_CMD_USE_HOLD_REG (1 << 29) 108*757bff49SJaehoon Chung #define DWMCI_CMD_START (1 << 31) 109*757bff49SJaehoon Chung 110*757bff49SJaehoon Chung /* CLKENA register */ 111*757bff49SJaehoon Chung #define DWMCI_CLKEN_ENABLE (1 << 0) 112*757bff49SJaehoon Chung #define DWMCI_CLKEN_LOW_PWR (1 << 16) 113*757bff49SJaehoon Chung 114*757bff49SJaehoon Chung /* Card-type registe */ 115*757bff49SJaehoon Chung #define DWMCI_CTYPE_1BIT 0 116*757bff49SJaehoon Chung #define DWMCI_CTYPE_4BIT (1 << 0) 117*757bff49SJaehoon Chung #define DWMCI_CTYPE_8BIT (1 << 16) 118*757bff49SJaehoon Chung 119*757bff49SJaehoon Chung /* Status Register */ 120*757bff49SJaehoon Chung #define DWMCI_BUSY (1 << 9) 121*757bff49SJaehoon Chung 122*757bff49SJaehoon Chung /* FIFOTH Register */ 123*757bff49SJaehoon Chung #define MSIZE(x) ((x) << 28) 124*757bff49SJaehoon Chung #define RX_WMARK(x) ((x) << 16) 125*757bff49SJaehoon Chung #define TX_WMARK(x) (x) 126*757bff49SJaehoon Chung 127*757bff49SJaehoon Chung #define DWMCI_IDMAC_OWN (1 << 31) 128*757bff49SJaehoon Chung #define DWMCI_IDMAC_CH (1 << 4) 129*757bff49SJaehoon Chung #define DWMCI_IDMAC_FS (1 << 3) 130*757bff49SJaehoon Chung #define DWMCI_IDMAC_LD (1 << 2) 131*757bff49SJaehoon Chung 132*757bff49SJaehoon Chung /* Bus Mode Register */ 133*757bff49SJaehoon Chung #define DWMCI_BMOD_IDMAC_RESET (1 << 0) 134*757bff49SJaehoon Chung #define DWMCI_BMOD_IDMAC_FB (1 << 1) 135*757bff49SJaehoon Chung #define DWMCI_BMOD_IDMAC_EN (1 << 7) 136*757bff49SJaehoon Chung 137*757bff49SJaehoon Chung struct dwmci_host { 138*757bff49SJaehoon Chung char *name; 139*757bff49SJaehoon Chung void *ioaddr; 140*757bff49SJaehoon Chung unsigned int quirks; 141*757bff49SJaehoon Chung unsigned int caps; 142*757bff49SJaehoon Chung unsigned int version; 143*757bff49SJaehoon Chung unsigned int clock; 144*757bff49SJaehoon Chung unsigned int bus_hz; 145*757bff49SJaehoon Chung int dev_index; 146*757bff49SJaehoon Chung int buswidth; 147*757bff49SJaehoon Chung u32 fifoth_val; 148*757bff49SJaehoon Chung struct mmc *mmc; 149*757bff49SJaehoon Chung 150*757bff49SJaehoon Chung void (*clksel)(struct dwmci_host *host); 151*757bff49SJaehoon Chung unsigned int (*mmc_clk)(int dev_index); 152*757bff49SJaehoon Chung }; 153*757bff49SJaehoon Chung 154*757bff49SJaehoon Chung struct dwmci_idmac { 155*757bff49SJaehoon Chung u32 flags; 156*757bff49SJaehoon Chung u32 cnt; 157*757bff49SJaehoon Chung u32 addr; 158*757bff49SJaehoon Chung u32 next_addr; 159*757bff49SJaehoon Chung }; 160*757bff49SJaehoon Chung 161*757bff49SJaehoon Chung static inline void dwmci_writel(struct dwmci_host *host, int reg, u32 val) 162*757bff49SJaehoon Chung { 163*757bff49SJaehoon Chung writel(val, host->ioaddr + reg); 164*757bff49SJaehoon Chung } 165*757bff49SJaehoon Chung 166*757bff49SJaehoon Chung static inline void dwmci_writew(struct dwmci_host *host, int reg, u16 val) 167*757bff49SJaehoon Chung { 168*757bff49SJaehoon Chung writew(val, host->ioaddr + reg); 169*757bff49SJaehoon Chung } 170*757bff49SJaehoon Chung 171*757bff49SJaehoon Chung static inline void dwmci_writeb(struct dwmci_host *host, int reg, u8 val) 172*757bff49SJaehoon Chung { 173*757bff49SJaehoon Chung writeb(val, host->ioaddr + reg); 174*757bff49SJaehoon Chung } 175*757bff49SJaehoon Chung static inline u32 dwmci_readl(struct dwmci_host *host, int reg) 176*757bff49SJaehoon Chung { 177*757bff49SJaehoon Chung return readl(host->ioaddr + reg); 178*757bff49SJaehoon Chung } 179*757bff49SJaehoon Chung 180*757bff49SJaehoon Chung static inline u16 dwmci_readw(struct dwmci_host *host, int reg) 181*757bff49SJaehoon Chung { 182*757bff49SJaehoon Chung return readw(host->ioaddr + reg); 183*757bff49SJaehoon Chung } 184*757bff49SJaehoon Chung 185*757bff49SJaehoon Chung static inline u8 dwmci_readb(struct dwmci_host *host, int reg) 186*757bff49SJaehoon Chung { 187*757bff49SJaehoon Chung return readb(host->ioaddr + reg); 188*757bff49SJaehoon Chung } 189*757bff49SJaehoon Chung 190*757bff49SJaehoon Chung int add_dwmci(struct dwmci_host *host, u32 max_clk, u32 min_clk); 191*757bff49SJaehoon Chung #endif /* __DWMMC_HW_H */ 192