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