xref: /rk3399_rockchip-uboot/include/dwmmc.h (revision 757bff49ba3159d71ccacabdb68f8309b1eb6613)
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