xref: /rk3399_rockchip-uboot/arch/arm/mach-davinci/include/mach/sdmmc_defs.h (revision b9cb64825b5e6efeb715abd8b48d9b12f98973e9)
1*3d357619SMasahiro Yamada /*
2*3d357619SMasahiro Yamada  * Davinci MMC Controller Defines - Based on Linux davinci_mmc.c
3*3d357619SMasahiro Yamada  *
4*3d357619SMasahiro Yamada  * Copyright (C) 2010 Texas Instruments Incorporated
5*3d357619SMasahiro Yamada  *
6*3d357619SMasahiro Yamada  * SPDX-License-Identifier:	GPL-2.0+
7*3d357619SMasahiro Yamada  */
8*3d357619SMasahiro Yamada 
9*3d357619SMasahiro Yamada #ifndef _SDMMC_DEFS_H_
10*3d357619SMasahiro Yamada #define _SDMMC_DEFS_H_
11*3d357619SMasahiro Yamada 
12*3d357619SMasahiro Yamada #include <asm/arch/hardware.h>
13*3d357619SMasahiro Yamada 
14*3d357619SMasahiro Yamada /* MMC Control Reg fields */
15*3d357619SMasahiro Yamada #define MMCCTL_DATRST		(1 << 0)
16*3d357619SMasahiro Yamada #define MMCCTL_CMDRST		(1 << 1)
17*3d357619SMasahiro Yamada #define MMCCTL_WIDTH_4_BIT	(1 << 2)
18*3d357619SMasahiro Yamada #define MMCCTL_DATEG_DISABLED	(0 << 6)
19*3d357619SMasahiro Yamada #define MMCCTL_DATEG_RISING	(1 << 6)
20*3d357619SMasahiro Yamada #define MMCCTL_DATEG_FALLING	(2 << 6)
21*3d357619SMasahiro Yamada #define MMCCTL_DATEG_BOTH	(3 << 6)
22*3d357619SMasahiro Yamada #define MMCCTL_PERMDR_LE	(0 << 9)
23*3d357619SMasahiro Yamada #define MMCCTL_PERMDR_BE	(1 << 9)
24*3d357619SMasahiro Yamada #define MMCCTL_PERMDX_LE	(0 << 10)
25*3d357619SMasahiro Yamada #define MMCCTL_PERMDX_BE	(1 << 10)
26*3d357619SMasahiro Yamada 
27*3d357619SMasahiro Yamada /* MMC Clock Control Reg fields */
28*3d357619SMasahiro Yamada #define MMCCLK_CLKEN		(1 << 8)
29*3d357619SMasahiro Yamada #define MMCCLK_CLKRT_MASK	(0xFF << 0)
30*3d357619SMasahiro Yamada 
31*3d357619SMasahiro Yamada /* MMC Status Reg0 fields */
32*3d357619SMasahiro Yamada #define MMCST0_DATDNE		(1 << 0)
33*3d357619SMasahiro Yamada #define MMCST0_BSYDNE		(1 << 1)
34*3d357619SMasahiro Yamada #define MMCST0_RSPDNE		(1 << 2)
35*3d357619SMasahiro Yamada #define MMCST0_TOUTRD		(1 << 3)
36*3d357619SMasahiro Yamada #define MMCST0_TOUTRS		(1 << 4)
37*3d357619SMasahiro Yamada #define MMCST0_CRCWR		(1 << 5)
38*3d357619SMasahiro Yamada #define MMCST0_CRCRD		(1 << 6)
39*3d357619SMasahiro Yamada #define MMCST0_CRCRS		(1 << 7)
40*3d357619SMasahiro Yamada #define MMCST0_DXRDY		(1 << 9)
41*3d357619SMasahiro Yamada #define MMCST0_DRRDY		(1 << 10)
42*3d357619SMasahiro Yamada #define MMCST0_DATED		(1 << 11)
43*3d357619SMasahiro Yamada #define MMCST0_TRNDNE		(1 << 12)
44*3d357619SMasahiro Yamada 
45*3d357619SMasahiro Yamada #define MMCST0_ERR_MASK		(0x00F8)
46*3d357619SMasahiro Yamada 
47*3d357619SMasahiro Yamada /* MMC Status Reg1 fields */
48*3d357619SMasahiro Yamada #define MMCST1_BUSY		(1 << 0)
49*3d357619SMasahiro Yamada #define MMCST1_CLKSTP		(1 << 1)
50*3d357619SMasahiro Yamada #define MMCST1_DXEMP		(1 << 2)
51*3d357619SMasahiro Yamada #define MMCST1_DRFUL		(1 << 3)
52*3d357619SMasahiro Yamada #define MMCST1_DAT3ST		(1 << 4)
53*3d357619SMasahiro Yamada #define MMCST1_FIFOEMP		(1 << 5)
54*3d357619SMasahiro Yamada #define MMCST1_FIFOFUL		(1 << 6)
55*3d357619SMasahiro Yamada 
56*3d357619SMasahiro Yamada /* MMC INT Mask Reg fields */
57*3d357619SMasahiro Yamada #define MMCIM_EDATDNE		(1 << 0)
58*3d357619SMasahiro Yamada #define MMCIM_EBSYDNE		(1 << 1)
59*3d357619SMasahiro Yamada #define MMCIM_ERSPDNE		(1 << 2)
60*3d357619SMasahiro Yamada #define MMCIM_ETOUTRD		(1 << 3)
61*3d357619SMasahiro Yamada #define MMCIM_ETOUTRS		(1 << 4)
62*3d357619SMasahiro Yamada #define MMCIM_ECRCWR		(1 << 5)
63*3d357619SMasahiro Yamada #define MMCIM_ECRCRD		(1 << 6)
64*3d357619SMasahiro Yamada #define MMCIM_ECRCRS		(1 << 7)
65*3d357619SMasahiro Yamada #define MMCIM_EDXRDY		(1 << 9)
66*3d357619SMasahiro Yamada #define MMCIM_EDRRDY		(1 << 10)
67*3d357619SMasahiro Yamada #define MMCIM_EDATED		(1 << 11)
68*3d357619SMasahiro Yamada #define MMCIM_ETRNDNE		(1 << 12)
69*3d357619SMasahiro Yamada 
70*3d357619SMasahiro Yamada #define MMCIM_MASKALL		(0xFFFFFFFF)
71*3d357619SMasahiro Yamada 
72*3d357619SMasahiro Yamada /* MMC Resp Tout Reg fields */
73*3d357619SMasahiro Yamada #define MMCTOR_TOR_MASK		(0xFF)		/* dont write to reg, | it */
74*3d357619SMasahiro Yamada #define MMCTOR_TOD_20_16_SHIFT  (8)
75*3d357619SMasahiro Yamada 
76*3d357619SMasahiro Yamada /* MMC Data Read Tout Reg fields */
77*3d357619SMasahiro Yamada #define MMCTOD_TOD_0_15_MASK	(0xFFFF)
78*3d357619SMasahiro Yamada 
79*3d357619SMasahiro Yamada /* MMC Block len Reg fields */
80*3d357619SMasahiro Yamada #define MMCBLEN_BLEN_MASK	(0xFFF)
81*3d357619SMasahiro Yamada 
82*3d357619SMasahiro Yamada /* MMC Num Blocks Reg fields */
83*3d357619SMasahiro Yamada #define MMCNBLK_NBLK_MASK	(0xFFFF)
84*3d357619SMasahiro Yamada #define MMCNBLK_NBLK_MAX	(0xFFFF)
85*3d357619SMasahiro Yamada 
86*3d357619SMasahiro Yamada /* MMC Num Blocks Counter Reg fields */
87*3d357619SMasahiro Yamada #define MMCNBLC_NBLC_MASK	(0xFFFF)
88*3d357619SMasahiro Yamada 
89*3d357619SMasahiro Yamada /* MMC Cmd Reg fields */
90*3d357619SMasahiro Yamada #define MMCCMD_CMD_MASK		(0x3F)
91*3d357619SMasahiro Yamada #define MMCCMD_PPLEN		(1 << 7)
92*3d357619SMasahiro Yamada #define MMCCMD_BSYEXP		(1 << 8)
93*3d357619SMasahiro Yamada #define MMCCMD_RSPFMT_NONE	(0 << 9)
94*3d357619SMasahiro Yamada #define MMCCMD_RSPFMT_R1567	(1 << 9)
95*3d357619SMasahiro Yamada #define MMCCMD_RSPFMT_R2	(2 << 9)
96*3d357619SMasahiro Yamada #define MMCCMD_RSPFMT_R3	(3 << 9)
97*3d357619SMasahiro Yamada #define MMCCMD_DTRW		(1 << 11)
98*3d357619SMasahiro Yamada #define MMCCMD_STRMTP		(1 << 12)
99*3d357619SMasahiro Yamada #define MMCCMD_WDATX		(1 << 13)
100*3d357619SMasahiro Yamada #define MMCCMD_INITCK		(1 << 14)
101*3d357619SMasahiro Yamada #define MMCCMD_DCLR		(1 << 15)
102*3d357619SMasahiro Yamada #define MMCCMD_DMATRIG		(1 << 16)
103*3d357619SMasahiro Yamada 
104*3d357619SMasahiro Yamada /* FIFO control Reg fields */
105*3d357619SMasahiro Yamada #define MMCFIFOCTL_FIFORST	(1 << 0)
106*3d357619SMasahiro Yamada #define MMCFIFOCTL_FIFODIR	(1 << 1)
107*3d357619SMasahiro Yamada #define MMCFIFOCTL_FIFOLEV	(1 << 2)
108*3d357619SMasahiro Yamada #define MMCFIFOCTL_ACCWD_4	(0 << 3)	/* access width of 4 bytes */
109*3d357619SMasahiro Yamada #define MMCFIFOCTL_ACCWD_3	(1 << 3)	/* access width of 3 bytes */
110*3d357619SMasahiro Yamada #define MMCFIFOCTL_ACCWD_2	(2 << 3)	/* access width of 2 bytes */
111*3d357619SMasahiro Yamada #define MMCFIFOCTL_ACCWD_1	(3 << 3)	/* access width of 1 byte */
112*3d357619SMasahiro Yamada 
113*3d357619SMasahiro Yamada /* Davinci MMC Register definitions */
114*3d357619SMasahiro Yamada struct davinci_mmc_regs {
115*3d357619SMasahiro Yamada 	dv_reg mmcctl;
116*3d357619SMasahiro Yamada 	dv_reg mmcclk;
117*3d357619SMasahiro Yamada 	dv_reg mmcst0;
118*3d357619SMasahiro Yamada 	dv_reg mmcst1;
119*3d357619SMasahiro Yamada 	dv_reg mmcim;
120*3d357619SMasahiro Yamada 	dv_reg mmctor;
121*3d357619SMasahiro Yamada 	dv_reg mmctod;
122*3d357619SMasahiro Yamada 	dv_reg mmcblen;
123*3d357619SMasahiro Yamada 	dv_reg mmcnblk;
124*3d357619SMasahiro Yamada 	dv_reg mmcnblc;
125*3d357619SMasahiro Yamada 	dv_reg mmcdrr;
126*3d357619SMasahiro Yamada 	dv_reg mmcdxr;
127*3d357619SMasahiro Yamada 	dv_reg mmccmd;
128*3d357619SMasahiro Yamada 	dv_reg mmcarghl;
129*3d357619SMasahiro Yamada 	dv_reg mmcrsp01;
130*3d357619SMasahiro Yamada 	dv_reg mmcrsp23;
131*3d357619SMasahiro Yamada 	dv_reg mmcrsp45;
132*3d357619SMasahiro Yamada 	dv_reg mmcrsp67;
133*3d357619SMasahiro Yamada 	dv_reg mmcdrsp;
134*3d357619SMasahiro Yamada 	dv_reg mmcetok;
135*3d357619SMasahiro Yamada 	dv_reg mmccidx;
136*3d357619SMasahiro Yamada 	dv_reg mmcckc;
137*3d357619SMasahiro Yamada 	dv_reg mmctorc;
138*3d357619SMasahiro Yamada 	dv_reg mmctodc;
139*3d357619SMasahiro Yamada 	dv_reg mmcblnc;
140*3d357619SMasahiro Yamada 	dv_reg sdioctl;
141*3d357619SMasahiro Yamada 	dv_reg sdiost0;
142*3d357619SMasahiro Yamada 	dv_reg sdioien;
143*3d357619SMasahiro Yamada 	dv_reg sdioist;
144*3d357619SMasahiro Yamada 	dv_reg mmcfifoctl;
145*3d357619SMasahiro Yamada };
146*3d357619SMasahiro Yamada 
147*3d357619SMasahiro Yamada /* Davinci MMC board definitions */
148*3d357619SMasahiro Yamada struct davinci_mmc {
149*3d357619SMasahiro Yamada 	struct davinci_mmc_regs *reg_base;	/* Register base address */
150*3d357619SMasahiro Yamada 	uint input_clk;		/* Input clock to MMC controller */
151*3d357619SMasahiro Yamada 	uint host_caps;		/* Host capabilities */
152*3d357619SMasahiro Yamada 	uint voltages;		/* Host supported voltages */
153*3d357619SMasahiro Yamada 	uint version;		/* MMC Controller version */
154*3d357619SMasahiro Yamada 	struct mmc_config cfg;
155*3d357619SMasahiro Yamada };
156*3d357619SMasahiro Yamada 
157*3d357619SMasahiro Yamada enum {
158*3d357619SMasahiro Yamada 	MMC_CTLR_VERSION_1 = 0,	/* DM644x and DM355 */
159*3d357619SMasahiro Yamada 	MMC_CTLR_VERSION_2,	/* DA830 */
160*3d357619SMasahiro Yamada };
161*3d357619SMasahiro Yamada 
162*3d357619SMasahiro Yamada int davinci_mmc_init(bd_t *bis, struct davinci_mmc *host);
163*3d357619SMasahiro Yamada 
164*3d357619SMasahiro Yamada #endif /* _SDMMC_DEFS_H */
165