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