xref: /arm-trusted-firmware/plat/brcm/board/stingray/src/sdio.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2019-2020, Broadcom
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <errno.h>
8*91f16700Schasinglulu #include <stdbool.h>
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <common/debug.h>
11*91f16700Schasinglulu #include <drivers/delay_timer.h>
12*91f16700Schasinglulu #include <lib/mmio.h>
13*91f16700Schasinglulu 
14*91f16700Schasinglulu #include <sdio.h>
15*91f16700Schasinglulu #include <sr_def.h>
16*91f16700Schasinglulu #include <sr_utils.h>
17*91f16700Schasinglulu 
18*91f16700Schasinglulu const SDIO_CFG sr_sdio0_cfg = {
19*91f16700Schasinglulu 	.cfg_base = SR_IPROC_SDIO0_CFG_BASE,
20*91f16700Schasinglulu 	.sid_base = SR_IPROC_SDIO0_SID_BASE,
21*91f16700Schasinglulu 	.io_ctrl_base = SR_IPROC_SDIO0_IOCTRL_BASE,
22*91f16700Schasinglulu 	.pad_base = SR_IPROC_SDIO0_PAD_BASE,
23*91f16700Schasinglulu };
24*91f16700Schasinglulu const SDIO_CFG sr_sdio1_cfg = {
25*91f16700Schasinglulu 	.cfg_base = SR_IPROC_SDIO1_CFG_BASE,
26*91f16700Schasinglulu 	.sid_base = SR_IPROC_SDIO1_SID_BASE,
27*91f16700Schasinglulu 	.io_ctrl_base = SR_IPROC_SDIO1_IOCTRL_BASE,
28*91f16700Schasinglulu 	.pad_base = SR_IPROC_SDIO1_PAD_BASE,
29*91f16700Schasinglulu };
30*91f16700Schasinglulu 
31*91f16700Schasinglulu void brcm_stingray_sdio_init(void)
32*91f16700Schasinglulu {
33*91f16700Schasinglulu 	unsigned int val;
34*91f16700Schasinglulu 	const SDIO_CFG *sdio0_cfg, *sdio1_cfg;
35*91f16700Schasinglulu 
36*91f16700Schasinglulu 	sdio0_cfg = &sr_sdio0_cfg;
37*91f16700Schasinglulu 	sdio1_cfg = &sr_sdio1_cfg;
38*91f16700Schasinglulu 
39*91f16700Schasinglulu 	INFO("set sdio0 caps\n");
40*91f16700Schasinglulu 	/* SDIO0 CAPS0 */
41*91f16700Schasinglulu 	val = SDIO0_CAP0_CFG;
42*91f16700Schasinglulu 	INFO("caps0 0x%x\n", val);
43*91f16700Schasinglulu 	mmio_write_32(sdio0_cfg->cfg_base + ICFG_SDIO_CAP0, val);
44*91f16700Schasinglulu 
45*91f16700Schasinglulu 	/* SDIO0 CAPS1 */
46*91f16700Schasinglulu 	val = SDIO0_CAP1_CFG;
47*91f16700Schasinglulu 	INFO("caps1 0x%x\n", val);
48*91f16700Schasinglulu 	mmio_write_32(sdio0_cfg->cfg_base + ICFG_SDIO_CAP1, val);
49*91f16700Schasinglulu 
50*91f16700Schasinglulu 	mmio_write_32(sdio0_cfg->cfg_base + ICFG_SDIO_STRAPSTATUS_0,
51*91f16700Schasinglulu 		      SDIO_PRESETVAL0);
52*91f16700Schasinglulu 	mmio_write_32(sdio0_cfg->cfg_base + ICFG_SDIO_STRAPSTATUS_1,
53*91f16700Schasinglulu 		      SDIO_PRESETVAL1);
54*91f16700Schasinglulu 	mmio_write_32(sdio0_cfg->cfg_base + ICFG_SDIO_STRAPSTATUS_2,
55*91f16700Schasinglulu 		      SDIO_PRESETVAL2);
56*91f16700Schasinglulu 	mmio_write_32(sdio0_cfg->cfg_base + ICFG_SDIO_STRAPSTATUS_3,
57*91f16700Schasinglulu 		      SDIO_PRESETVAL3);
58*91f16700Schasinglulu 	mmio_write_32(sdio0_cfg->cfg_base + ICFG_SDIO_STRAPSTATUS_4,
59*91f16700Schasinglulu 		      SDIO_PRESETVAL4);
60*91f16700Schasinglulu 
61*91f16700Schasinglulu 	val = SR_SID_VAL(0x3, 0x0, 0x2) << SDIO_SID_SHIFT;
62*91f16700Schasinglulu 	mmio_write_32(sdio0_cfg->sid_base + ICFG_SDIO_SID_ARADDR, val);
63*91f16700Schasinglulu 	mmio_write_32(sdio0_cfg->sid_base + ICFG_SDIO_SID_AWADDR, val);
64*91f16700Schasinglulu 
65*91f16700Schasinglulu 	val = mmio_read_32(sdio0_cfg->io_ctrl_base);
66*91f16700Schasinglulu 	val &= ~(0xff << 23); /* Clear ARCACHE and AWCACHE */
67*91f16700Schasinglulu 	val |= (0xb7 << 23); /* Set ARCACHE and AWCACHE */
68*91f16700Schasinglulu 	mmio_write_32(sdio0_cfg->io_ctrl_base, val);
69*91f16700Schasinglulu 
70*91f16700Schasinglulu 	mmio_clrsetbits_32(sdio0_cfg->pad_base + PAD_SDIO_CLK,
71*91f16700Schasinglulu 			   PAD_SDIO_MASK, PAD_SDIO_VALUE);
72*91f16700Schasinglulu 	mmio_clrsetbits_32(sdio0_cfg->pad_base + PAD_SDIO_DATA0,
73*91f16700Schasinglulu 			   PAD_SDIO_MASK, PAD_SDIO_VALUE);
74*91f16700Schasinglulu 	mmio_clrsetbits_32(sdio0_cfg->pad_base + PAD_SDIO_DATA1,
75*91f16700Schasinglulu 			   PAD_SDIO_MASK, PAD_SDIO_VALUE);
76*91f16700Schasinglulu 	mmio_clrsetbits_32(sdio0_cfg->pad_base + PAD_SDIO_DATA2,
77*91f16700Schasinglulu 			   PAD_SDIO_MASK, PAD_SDIO_VALUE);
78*91f16700Schasinglulu 	mmio_clrsetbits_32(sdio0_cfg->pad_base + PAD_SDIO_DATA3,
79*91f16700Schasinglulu 			   PAD_SDIO_MASK, PAD_SDIO_VALUE);
80*91f16700Schasinglulu 	mmio_clrsetbits_32(sdio0_cfg->pad_base + PAD_SDIO_DATA4,
81*91f16700Schasinglulu 			   PAD_SDIO_MASK, PAD_SDIO_VALUE);
82*91f16700Schasinglulu 	mmio_clrsetbits_32(sdio0_cfg->pad_base + PAD_SDIO_DATA5,
83*91f16700Schasinglulu 			   PAD_SDIO_MASK, PAD_SDIO_VALUE);
84*91f16700Schasinglulu 	mmio_clrsetbits_32(sdio0_cfg->pad_base + PAD_SDIO_DATA6,
85*91f16700Schasinglulu 			   PAD_SDIO_MASK, PAD_SDIO_VALUE);
86*91f16700Schasinglulu 	mmio_clrsetbits_32(sdio0_cfg->pad_base + PAD_SDIO_DATA7,
87*91f16700Schasinglulu 			   PAD_SDIO_MASK, PAD_SDIO_VALUE);
88*91f16700Schasinglulu 	mmio_clrsetbits_32(sdio0_cfg->pad_base + PAD_SDIO_CMD,
89*91f16700Schasinglulu 			   PAD_SDIO_MASK, PAD_SDIO_VALUE);
90*91f16700Schasinglulu 
91*91f16700Schasinglulu 	INFO("set sdio1 caps\n");
92*91f16700Schasinglulu 
93*91f16700Schasinglulu 	/* SDIO1 CAPS0 */
94*91f16700Schasinglulu 	val = SDIO1_CAP0_CFG;
95*91f16700Schasinglulu 	INFO("caps0 0x%x\n", val);
96*91f16700Schasinglulu 	mmio_write_32(sdio1_cfg->cfg_base + ICFG_SDIO_CAP0, val);
97*91f16700Schasinglulu 	/* SDIO1 CAPS1 */
98*91f16700Schasinglulu 	val = SDIO1_CAP1_CFG;
99*91f16700Schasinglulu 	INFO("caps1 0x%x\n", val);
100*91f16700Schasinglulu 	mmio_write_32(sdio1_cfg->cfg_base + ICFG_SDIO_CAP1, val);
101*91f16700Schasinglulu 
102*91f16700Schasinglulu 	mmio_write_32(sdio1_cfg->cfg_base + ICFG_SDIO_STRAPSTATUS_0,
103*91f16700Schasinglulu 		      SDIO_PRESETVAL0);
104*91f16700Schasinglulu 	mmio_write_32(sdio1_cfg->cfg_base + ICFG_SDIO_STRAPSTATUS_1,
105*91f16700Schasinglulu 		      SDIO_PRESETVAL1);
106*91f16700Schasinglulu 	mmio_write_32(sdio1_cfg->cfg_base + ICFG_SDIO_STRAPSTATUS_2,
107*91f16700Schasinglulu 		      SDIO_PRESETVAL2);
108*91f16700Schasinglulu 	mmio_write_32(sdio1_cfg->cfg_base + ICFG_SDIO_STRAPSTATUS_3,
109*91f16700Schasinglulu 		      SDIO_PRESETVAL3);
110*91f16700Schasinglulu 	mmio_write_32(sdio1_cfg->cfg_base + ICFG_SDIO_STRAPSTATUS_4,
111*91f16700Schasinglulu 		      SDIO_PRESETVAL4);
112*91f16700Schasinglulu 
113*91f16700Schasinglulu 	val = SR_SID_VAL(0x3, 0x0, 0x3) << SDIO_SID_SHIFT;
114*91f16700Schasinglulu 	mmio_write_32(sdio1_cfg->sid_base + ICFG_SDIO_SID_ARADDR, val);
115*91f16700Schasinglulu 	mmio_write_32(sdio1_cfg->sid_base + ICFG_SDIO_SID_AWADDR, val);
116*91f16700Schasinglulu 
117*91f16700Schasinglulu 	val = mmio_read_32(sdio1_cfg->io_ctrl_base);
118*91f16700Schasinglulu 	val &= ~(0xff << 23); /* Clear ARCACHE and AWCACHE */
119*91f16700Schasinglulu 	val |= (0xb7 << 23); /* Set ARCACHE and AWCACHE */
120*91f16700Schasinglulu 	mmio_write_32(sdio1_cfg->io_ctrl_base, val);
121*91f16700Schasinglulu 
122*91f16700Schasinglulu 	mmio_clrsetbits_32(sdio1_cfg->pad_base + PAD_SDIO_CLK,
123*91f16700Schasinglulu 			   PAD_SDIO_MASK, PAD_SDIO_VALUE);
124*91f16700Schasinglulu 	mmio_clrsetbits_32(sdio1_cfg->pad_base + PAD_SDIO_DATA0,
125*91f16700Schasinglulu 			   PAD_SDIO_MASK, PAD_SDIO_VALUE);
126*91f16700Schasinglulu 	mmio_clrsetbits_32(sdio1_cfg->pad_base + PAD_SDIO_DATA1,
127*91f16700Schasinglulu 			   PAD_SDIO_MASK, PAD_SDIO_VALUE);
128*91f16700Schasinglulu 	mmio_clrsetbits_32(sdio1_cfg->pad_base + PAD_SDIO_DATA2,
129*91f16700Schasinglulu 			   PAD_SDIO_MASK, PAD_SDIO_VALUE);
130*91f16700Schasinglulu 	mmio_clrsetbits_32(sdio1_cfg->pad_base + PAD_SDIO_DATA3,
131*91f16700Schasinglulu 			   PAD_SDIO_MASK, PAD_SDIO_VALUE);
132*91f16700Schasinglulu 	mmio_clrsetbits_32(sdio1_cfg->pad_base + PAD_SDIO_DATA4,
133*91f16700Schasinglulu 			   PAD_SDIO_MASK, PAD_SDIO_VALUE);
134*91f16700Schasinglulu 	mmio_clrsetbits_32(sdio1_cfg->pad_base + PAD_SDIO_DATA5,
135*91f16700Schasinglulu 			   PAD_SDIO_MASK, PAD_SDIO_VALUE);
136*91f16700Schasinglulu 	mmio_clrsetbits_32(sdio1_cfg->pad_base + PAD_SDIO_DATA6,
137*91f16700Schasinglulu 			   PAD_SDIO_MASK, PAD_SDIO_VALUE);
138*91f16700Schasinglulu 	mmio_clrsetbits_32(sdio1_cfg->pad_base + PAD_SDIO_DATA7,
139*91f16700Schasinglulu 			   PAD_SDIO_MASK, PAD_SDIO_VALUE);
140*91f16700Schasinglulu 	mmio_clrsetbits_32(sdio1_cfg->pad_base + PAD_SDIO_CMD,
141*91f16700Schasinglulu 			   PAD_SDIO_MASK, PAD_SDIO_VALUE);
142*91f16700Schasinglulu 
143*91f16700Schasinglulu 	INFO("sdio init done\n");
144*91f16700Schasinglulu }
145