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