| @@ -1,301 +1,299 @@ | | | @@ -1,301 +1,299 @@ |
1 | /* $NetBSD: amlogic_board.c,v 1.5 2015/02/28 22:53:25 jmcneill Exp $ */ | | 1 | /* $NetBSD: amlogic_board.c,v 1.6 2015/03/01 15:06:09 jmcneill Exp $ */ |
2 | | | 2 | |
3 | /*- | | 3 | /*- |
4 | * Copyright (c) 2015 Jared D. McNeill <jmcneill@invisible.ca> | | 4 | * Copyright (c) 2015 Jared D. McNeill <jmcneill@invisible.ca> |
5 | * All rights reserved. | | 5 | * All rights reserved. |
6 | * | | 6 | * |
7 | * Redistribution and use in source and binary forms, with or without | | 7 | * Redistribution and use in source and binary forms, with or without |
8 | * modification, are permitted provided that the following conditions | | 8 | * modification, are permitted provided that the following conditions |
9 | * are met: | | 9 | * are met: |
10 | * 1. Redistributions of source code must retain the above copyright | | 10 | * 1. Redistributions of source code must retain the above copyright |
11 | * notice, this list of conditions and the following disclaimer. | | 11 | * notice, this list of conditions and the following disclaimer. |
12 | * 2. Redistributions in binary form must reproduce the above copyright | | 12 | * 2. Redistributions in binary form must reproduce the above copyright |
13 | * notice, this list of conditions and the following disclaimer in the | | 13 | * notice, this list of conditions and the following disclaimer in the |
14 | * documentation and/or other materials provided with the distribution. | | 14 | * documentation and/or other materials provided with the distribution. |
15 | * | | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | | 16 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
17 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | | 17 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
18 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | | 18 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
19 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | | 19 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
20 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | | 20 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
21 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | | 21 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED | | 22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED |
23 | * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | | 23 | * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
24 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | | 24 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
25 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | | 25 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
26 | * SUCH DAMAGE. | | 26 | * SUCH DAMAGE. |
27 | */ | | 27 | */ |
28 | | | 28 | |
29 | #include "opt_amlogic.h" | | 29 | #include "opt_amlogic.h" |
30 | | | 30 | |
31 | #include <sys/cdefs.h> | | 31 | #include <sys/cdefs.h> |
32 | __KERNEL_RCSID(0, "$NetBSD: amlogic_board.c,v 1.5 2015/02/28 22:53:25 jmcneill Exp $"); | | 32 | __KERNEL_RCSID(0, "$NetBSD: amlogic_board.c,v 1.6 2015/03/01 15:06:09 jmcneill Exp $"); |
33 | | | 33 | |
34 | #define _ARM32_BUS_DMA_PRIVATE | | 34 | #define _ARM32_BUS_DMA_PRIVATE |
35 | #include <sys/param.h> | | 35 | #include <sys/param.h> |
36 | #include <sys/bus.h> | | 36 | #include <sys/bus.h> |
37 | #include <sys/cpu.h> | | 37 | #include <sys/cpu.h> |
38 | #include <sys/device.h> | | 38 | #include <sys/device.h> |
39 | | | 39 | |
40 | #include <uvm/uvm_extern.h> | | 40 | #include <uvm/uvm_extern.h> |
41 | | | 41 | |
42 | #include <arm/bootconfig.h> | | 42 | #include <arm/bootconfig.h> |
43 | #include <arm/cpufunc.h> | | 43 | #include <arm/cpufunc.h> |
44 | | | 44 | |
45 | #include <arm/amlogic/amlogic_reg.h> | | 45 | #include <arm/amlogic/amlogic_reg.h> |
46 | #include <arm/amlogic/amlogic_crureg.h> | | 46 | #include <arm/amlogic/amlogic_crureg.h> |
47 | #include <arm/amlogic/amlogic_var.h> | | 47 | #include <arm/amlogic/amlogic_var.h> |
48 | | | 48 | |
49 | bus_space_handle_t amlogic_core_bsh; | | 49 | bus_space_handle_t amlogic_core_bsh; |
50 | | | 50 | |
51 | struct arm32_bus_dma_tag amlogic_dma_tag = { | | 51 | struct arm32_bus_dma_tag amlogic_dma_tag = { |
52 | _BUS_DMAMAP_FUNCS, | | 52 | _BUS_DMAMAP_FUNCS, |
53 | _BUS_DMAMEM_FUNCS, | | 53 | _BUS_DMAMEM_FUNCS, |
54 | _BUS_DMATAG_FUNCS, | | 54 | _BUS_DMATAG_FUNCS, |
55 | }; | | 55 | }; |
56 | | | 56 | |
57 | #define CBUS_READ(x) \ | | 57 | #define CBUS_READ(x) \ |
58 | bus_space_read_4(&amlogic_bs_tag, amlogic_core_bsh, \ | | 58 | bus_space_read_4(&amlogic_bs_tag, amlogic_core_bsh, \ |
59 | AMLOGIC_CBUS_OFFSET + (x)) | | 59 | AMLOGIC_CBUS_OFFSET + (x)) |
60 | #define CBUS_WRITE(x, v) \ | | 60 | #define CBUS_WRITE(x, v) \ |
61 | bus_space_write_4(&amlogic_bs_tag, amlogic_core_bsh, \ | | 61 | bus_space_write_4(&amlogic_bs_tag, amlogic_core_bsh, \ |
62 | AMLOGIC_CBUS_OFFSET + (x), (v)) | | 62 | AMLOGIC_CBUS_OFFSET + (x), (v)) |
63 | | | 63 | |
64 | void | | 64 | void |
65 | amlogic_bootstrap(void) | | 65 | amlogic_bootstrap(void) |
66 | { | | 66 | { |
67 | int error; | | 67 | int error; |
68 | | | 68 | |
69 | error = bus_space_map(&amlogic_bs_tag, AMLOGIC_CORE_BASE, | | 69 | error = bus_space_map(&amlogic_bs_tag, AMLOGIC_CORE_BASE, |
70 | AMLOGIC_CORE_SIZE, 0, &amlogic_core_bsh); | | 70 | AMLOGIC_CORE_SIZE, 0, &amlogic_core_bsh); |
71 | if (error) | | 71 | if (error) |
72 | panic("%s: failed to map CORE registers: %d", __func__, error); | | 72 | panic("%s: failed to map CORE registers: %d", __func__, error); |
73 | | | 73 | |
74 | curcpu()->ci_data.cpu_cc_freq = amlogic_get_rate_a9(); | | 74 | curcpu()->ci_data.cpu_cc_freq = amlogic_get_rate_a9(); |
75 | } | | 75 | } |
76 | | | 76 | |
77 | uint32_t | | 77 | uint32_t |
78 | amlogic_get_rate_xtal(void) | | 78 | amlogic_get_rate_xtal(void) |
79 | { | | 79 | { |
80 | uint32_t ctlreg0; | | 80 | uint32_t ctlreg0; |
81 | | | 81 | |
82 | ctlreg0 = CBUS_READ(PREG_CTLREG0_ADDR_REG); | | 82 | ctlreg0 = CBUS_READ(PREG_CTLREG0_ADDR_REG); |
83 | | | 83 | |
84 | return __SHIFTOUT(ctlreg0, PREG_CTLREG0_ADDR_CLKRATE) * 1000000; | | 84 | return __SHIFTOUT(ctlreg0, PREG_CTLREG0_ADDR_CLKRATE) * 1000000; |
85 | } | | 85 | } |
86 | | | 86 | |
87 | uint32_t | | 87 | uint32_t |
88 | amlogic_get_rate_sys(void) | | 88 | amlogic_get_rate_sys(void) |
89 | { | | 89 | { |
90 | uint32_t cntl; | | 90 | uint32_t cntl; |
91 | uint64_t clk; | | 91 | uint64_t clk; |
92 | u_int mul, div, od; | | 92 | u_int mul, div, od; |
93 | | | 93 | |
94 | clk = amlogic_get_rate_xtal(); | | 94 | clk = amlogic_get_rate_xtal(); |
95 | cntl = CBUS_READ(HHI_SYS_PLL_CNTL_REG); | | 95 | cntl = CBUS_READ(HHI_SYS_PLL_CNTL_REG); |
96 | mul = __SHIFTOUT(cntl, HHI_SYS_PLL_CNTL_MUL); | | 96 | mul = __SHIFTOUT(cntl, HHI_SYS_PLL_CNTL_MUL); |
97 | div = __SHIFTOUT(cntl, HHI_SYS_PLL_CNTL_DIV); | | 97 | div = __SHIFTOUT(cntl, HHI_SYS_PLL_CNTL_DIV); |
98 | od = __SHIFTOUT(cntl, HHI_SYS_PLL_CNTL_OD); | | 98 | od = __SHIFTOUT(cntl, HHI_SYS_PLL_CNTL_OD); |
99 | | | 99 | |
100 | clk *= mul; | | 100 | clk *= mul; |
101 | clk /= div; | | 101 | clk /= div; |
102 | clk >>= od; | | 102 | clk >>= od; |
103 | | | 103 | |
104 | return (uint32_t)clk; | | 104 | return (uint32_t)clk; |
105 | } | | 105 | } |
106 | | | 106 | |
107 | uint32_t | | 107 | uint32_t |
108 | amlogic_get_rate_a9(void) | | 108 | amlogic_get_rate_a9(void) |
109 | { | | 109 | { |
110 | uint32_t cntl0, cntl1; | | 110 | uint32_t cntl0, cntl1; |
111 | uint32_t rate = 0; | | 111 | uint32_t rate = 0; |
112 | | | 112 | |
113 | cntl0 = CBUS_READ(HHI_SYS_CPU_CLK_CNTL0_REG); | | 113 | cntl0 = CBUS_READ(HHI_SYS_CPU_CLK_CNTL0_REG); |
114 | if (cntl0 & HHI_SYS_CPU_CLK_CNTL0_CLKSEL) { | | 114 | if (cntl0 & HHI_SYS_CPU_CLK_CNTL0_CLKSEL) { |
115 | switch (__SHIFTOUT(cntl0, HHI_SYS_CPU_CLK_CNTL0_PLLSEL)) { | | 115 | switch (__SHIFTOUT(cntl0, HHI_SYS_CPU_CLK_CNTL0_PLLSEL)) { |
116 | case 0: | | 116 | case 0: |
117 | rate = amlogic_get_rate_xtal(); | | 117 | rate = amlogic_get_rate_xtal(); |
118 | break; | | 118 | break; |
119 | case 1: | | 119 | case 1: |
120 | rate = amlogic_get_rate_sys(); | | 120 | rate = amlogic_get_rate_sys(); |
121 | break; | | 121 | break; |
122 | case 2: | | 122 | case 2: |
123 | rate = 1250000000; | | 123 | rate = 1250000000; |
124 | break; | | 124 | break; |
125 | } | | 125 | } |
126 | } else { | | 126 | } else { |
127 | rate = amlogic_get_rate_xtal(); | | 127 | rate = amlogic_get_rate_xtal(); |
128 | } | | 128 | } |
129 | | | 129 | |
130 | KASSERTMSG(rate != 0, "couldn't determine A9 rate"); | | 130 | KASSERTMSG(rate != 0, "couldn't determine A9 rate"); |
131 | | | 131 | |
132 | switch (__SHIFTOUT(cntl0, HHI_SYS_CPU_CLK_CNTL0_SOUTSEL)) { | | 132 | switch (__SHIFTOUT(cntl0, HHI_SYS_CPU_CLK_CNTL0_SOUTSEL)) { |
133 | case 0: | | 133 | case 0: |
134 | break; | | 134 | break; |
135 | case 1: | | 135 | case 1: |
136 | rate /= 2; | | 136 | rate /= 2; |
137 | break; | | 137 | break; |
138 | case 2: | | 138 | case 2: |
139 | rate /= 3; | | 139 | rate /= 3; |
140 | break; | | 140 | break; |
141 | case 3: | | 141 | case 3: |
142 | cntl1 = CBUS_READ(HHI_SYS_CPU_CLK_CNTL1_REG); | | 142 | cntl1 = CBUS_READ(HHI_SYS_CPU_CLK_CNTL1_REG); |
143 | rate /= (__SHIFTOUT(cntl1, HHI_SYS_CPU_CLK_CNTL1_SDIV) + 1); | | 143 | rate /= (__SHIFTOUT(cntl1, HHI_SYS_CPU_CLK_CNTL1_SDIV) + 1); |
144 | break; | | 144 | break; |
145 | } | | 145 | } |
146 | | | 146 | |
147 | return rate; | | 147 | return rate; |
148 | } | | 148 | } |
149 | | | 149 | |
150 | uint32_t | | 150 | uint32_t |
151 | amlogic_get_rate_a9periph(void) | | 151 | amlogic_get_rate_a9periph(void) |
152 | { | | 152 | { |
153 | const uint32_t cntl1 = CBUS_READ(HHI_SYS_CPU_CLK_CNTL1_REG); | | 153 | const uint32_t cntl1 = CBUS_READ(HHI_SYS_CPU_CLK_CNTL1_REG); |
154 | const u_int div = __SHIFTOUT(cntl1, | | 154 | const u_int div = __SHIFTOUT(cntl1, |
155 | HHI_SYS_CPU_CLK_CNTL1_PERIPH_CLK_MUX) + 2; | | 155 | HHI_SYS_CPU_CLK_CNTL1_PERIPH_CLK_MUX) + 2; |
156 | | | 156 | |
157 | return amlogic_get_rate_a9() / div; | | 157 | return amlogic_get_rate_a9() / div; |
158 | } | | 158 | } |
159 | | | 159 | |
160 | static void | | 160 | static void |
161 | amlogic_usbphy_clkgate_enable(int port) | | 161 | amlogic_usbphy_clkgate_enable(int port) |
162 | { | | 162 | { |
163 | switch (port) { | | 163 | switch (port) { |
164 | case 0: | | 164 | case 0: |
165 | CBUS_WRITE(EE_CLK_GATING1_REG, | | 165 | CBUS_WRITE(EE_CLK_GATING1_REG, |
166 | CBUS_READ(EE_CLK_GATING1_REG) | | | 166 | CBUS_READ(EE_CLK_GATING1_REG) | |
167 | EE_CLK_GATING1_USB_GENERAL | | | 167 | EE_CLK_GATING1_USB_GENERAL | |
168 | EE_CLK_GATING1_USB0); | | 168 | EE_CLK_GATING1_USB0); |
169 | CBUS_WRITE(EE_CLK_GATING2_REG, | | 169 | CBUS_WRITE(EE_CLK_GATING2_REG, |
170 | CBUS_READ(EE_CLK_GATING2_REG) | | | 170 | CBUS_READ(EE_CLK_GATING2_REG) | |
171 | EE_CLK_GATING2_USB0_TO_DDR); | | 171 | EE_CLK_GATING2_USB0_TO_DDR); |
172 | break; | | 172 | break; |
173 | case 1: | | 173 | case 1: |
174 | CBUS_WRITE(EE_CLK_GATING1_REG, | | 174 | CBUS_WRITE(EE_CLK_GATING1_REG, |
175 | CBUS_READ(EE_CLK_GATING1_REG) | | | 175 | CBUS_READ(EE_CLK_GATING1_REG) | |
176 | EE_CLK_GATING1_USB_GENERAL | | | 176 | EE_CLK_GATING1_USB_GENERAL | |
177 | EE_CLK_GATING1_USB1); | | 177 | EE_CLK_GATING1_USB1); |
178 | CBUS_WRITE(EE_CLK_GATING2_REG, | | 178 | CBUS_WRITE(EE_CLK_GATING2_REG, |
179 | CBUS_READ(EE_CLK_GATING2_REG) | | | 179 | CBUS_READ(EE_CLK_GATING2_REG) | |
180 | EE_CLK_GATING2_USB1_TO_DDR); | | 180 | EE_CLK_GATING2_USB1_TO_DDR); |
181 | break; | | 181 | break; |
182 | } | | 182 | } |
183 | } | | 183 | } |
184 | | | 184 | |
185 | void | | 185 | void |
186 | amlogic_usbphy_init(int port) | | 186 | amlogic_usbphy_init(int port) |
187 | { | | 187 | { |
188 | bus_space_tag_t bst = &amlogic_bs_tag; | | 188 | bus_space_tag_t bst = &amlogic_bs_tag; |
189 | bus_space_handle_t bsh = amlogic_core_bsh; | | 189 | bus_space_handle_t bsh = amlogic_core_bsh; |
190 | bus_size_t ctrl_reg, cfg_reg, adp_bc_reg, gpioao_reg; | | 190 | bus_size_t ctrl_reg, cfg_reg, adp_bc_reg, gpioao_reg; |
191 | uint32_t ctrl, cfg, adp_bc, gpioao; | | 191 | uint32_t ctrl, cfg, adp_bc, gpioao; |
192 | u_int pin, pol; | | 192 | u_int pin, pol; |
193 | bool gpio_power = false, gpio_reset = false, aca_enable = false; | | 193 | bool gpio_power = false, gpio_reset = false, aca_enable = false; |
194 | | | 194 | |
195 | gpioao_reg = AMLOGIC_GPIOAO_OFFSET; | | 195 | gpioao_reg = AMLOGIC_GPIOAO_OFFSET; |
196 | | | 196 | |
197 | switch (port) { | | 197 | switch (port) { |
198 | case 0: | | 198 | case 0: |
199 | cfg_reg = PREI_USB_PHY_A_CFG_REG; | | 199 | cfg_reg = PREI_USB_PHY_A_CFG_REG; |
200 | ctrl_reg = PREI_USB_PHY_A_CTRL_REG; | | 200 | ctrl_reg = PREI_USB_PHY_A_CTRL_REG; |
201 | adp_bc_reg = PREI_USB_PHY_A_ADP_BC_REG; | | 201 | adp_bc_reg = PREI_USB_PHY_A_ADP_BC_REG; |
202 | pin = 5; | | 202 | pin = 5; |
203 | pol = 1; | | 203 | pol = 1; |
204 | gpio_power = true; | | 204 | gpio_power = true; |
205 | break; | | 205 | break; |
206 | case 1: | | 206 | case 1: |
207 | cfg_reg = PREI_USB_PHY_B_CFG_REG; | | 207 | cfg_reg = PREI_USB_PHY_B_CFG_REG; |
208 | ctrl_reg = PREI_USB_PHY_B_CTRL_REG; | | 208 | ctrl_reg = PREI_USB_PHY_B_CTRL_REG; |
209 | adp_bc_reg = PREI_USB_PHY_B_ADP_BC_REG; | | 209 | adp_bc_reg = PREI_USB_PHY_B_ADP_BC_REG; |
210 | pin = 4; | | 210 | pin = 4; |
211 | pol = 0; | | 211 | pol = 0; |
212 | gpio_reset = true; | | 212 | gpio_reset = true; |
213 | aca_enable = true; | | 213 | aca_enable = true; |
214 | break; | | 214 | break; |
215 | default: | | 215 | default: |
216 | return; | | 216 | return; |
217 | } | | 217 | } |
218 | | | 218 | |
219 | if (port == 0) { | | 219 | if (port == 0) { |
220 | CBUS_WRITE(RESET1_REG, RESET1_USB); | | 220 | CBUS_WRITE(RESET1_REG, RESET1_USB); |
221 | } | | 221 | } |
222 | | | 222 | |
223 | amlogic_usbphy_clkgate_enable(port); | | 223 | amlogic_usbphy_clkgate_enable(port); |
224 | | | 224 | |
225 | if (gpio_power) { | | 225 | if (gpio_power) { |
226 | gpioao = bus_space_read_4(bst, bsh, gpioao_reg); | | 226 | gpioao = bus_space_read_4(bst, bsh, gpioao_reg); |
227 | gpioao &= ~__BIT(pin); /* OEN */ | | 227 | gpioao &= ~__BIT(pin); /* OEN */ |
228 | bus_space_write_4(bst, bsh, gpioao_reg, gpioao); | | 228 | bus_space_write_4(bst, bsh, gpioao_reg, gpioao); |
229 | if (pol) { | | 229 | if (pol) { |
230 | gpioao |= __BIT(pin + 16); /* OUT */ | | 230 | gpioao |= __BIT(pin + 16); /* OUT */ |
231 | } else { | | 231 | } else { |
232 | gpioao &= ~__BIT(pin + 16); /* OUT */ | | 232 | gpioao &= ~__BIT(pin + 16); /* OUT */ |
233 | } | | 233 | } |
234 | bus_space_write_4(bst, bsh, gpioao_reg, gpioao); | | 234 | bus_space_write_4(bst, bsh, gpioao_reg, gpioao); |
235 | } | | 235 | } |
236 | | | 236 | |
237 | delay(1000); | | 237 | delay(1000); |
238 | | | 238 | |
239 | cfg = CBUS_READ(cfg_reg); | | 239 | cfg = CBUS_READ(cfg_reg); |
240 | cfg |= PREI_USB_PHY_CFG_CLK_32K_ALT_SEL; | | 240 | cfg |= PREI_USB_PHY_CFG_CLK_32K_ALT_SEL; |
241 | CBUS_WRITE(cfg_reg, cfg); | | 241 | CBUS_WRITE(cfg_reg, cfg); |
242 | | | 242 | |
243 | ctrl = CBUS_READ(ctrl_reg); | | 243 | ctrl = CBUS_READ(ctrl_reg); |
244 | ctrl &= ~PREI_USB_PHY_CTRL_FSEL; | | 244 | ctrl &= ~PREI_USB_PHY_CTRL_FSEL; |
245 | ctrl |= __SHIFTIN(PREI_USB_PHY_CTRL_FSEL_24M, | | 245 | ctrl |= __SHIFTIN(PREI_USB_PHY_CTRL_FSEL_24M, |
246 | PREI_USB_PHY_CTRL_FSEL); | | 246 | PREI_USB_PHY_CTRL_FSEL); |
247 | ctrl |= PREI_USB_PHY_CTRL_POR; | | 247 | ctrl |= PREI_USB_PHY_CTRL_POR; |
248 | CBUS_WRITE(ctrl_reg, ctrl); | | 248 | CBUS_WRITE(ctrl_reg, ctrl); |
249 | | | 249 | |
250 | delay(1000); | | 250 | delay(1000); |
251 | | | 251 | |
252 | ctrl = CBUS_READ(ctrl_reg); | | 252 | ctrl = CBUS_READ(ctrl_reg); |
253 | ctrl &= ~PREI_USB_PHY_CTRL_POR; | | 253 | ctrl &= ~PREI_USB_PHY_CTRL_POR; |
254 | CBUS_WRITE(ctrl_reg, ctrl); | | 254 | CBUS_WRITE(ctrl_reg, ctrl); |
255 | | | 255 | |
256 | delay(50000); | | 256 | delay(50000); |
257 | | | 257 | |
258 | ctrl = CBUS_READ(ctrl_reg); | | 258 | ctrl = CBUS_READ(ctrl_reg); |
259 | | | 259 | |
260 | printf("USBPHY: port %d, ctrl %#x\n", port, ctrl); | | | |
261 | | | | |
262 | if ((ctrl & PREI_USB_PHY_CTRL_CLK_DET) == 0) | | 260 | if ((ctrl & PREI_USB_PHY_CTRL_CLK_DET) == 0) |
263 | printf("WARNING: USB PHY port %d clock not detected\n", port); | | 261 | printf("WARNING: USB PHY port %d clock not detected\n", port); |
264 | | | 262 | |
265 | if (aca_enable) { | | 263 | if (aca_enable) { |
266 | adp_bc = CBUS_READ(adp_bc_reg); | | 264 | adp_bc = CBUS_READ(adp_bc_reg); |
267 | adp_bc |= PREI_USB_PHY_ADP_BC_ACA_ENABLE; | | 265 | adp_bc |= PREI_USB_PHY_ADP_BC_ACA_ENABLE; |
268 | CBUS_WRITE(adp_bc_reg, adp_bc); | | 266 | CBUS_WRITE(adp_bc_reg, adp_bc); |
269 | | | 267 | |
270 | delay(1000); | | 268 | delay(1000); |
271 | | | 269 | |
272 | adp_bc = CBUS_READ(adp_bc_reg); | | 270 | adp_bc = CBUS_READ(adp_bc_reg); |
273 | if (adp_bc & PREI_USB_PHY_ADP_BC_ACA_FLOATING) | | 271 | if (adp_bc & PREI_USB_PHY_ADP_BC_ACA_FLOATING) |
274 | printf("WARNING: USB PHY port %d failed to enable " | | 272 | printf("WARNING: USB PHY port %d failed to enable " |
275 | "ACA detection\n", port); | | 273 | "ACA detection\n", port); |
276 | } | | 274 | } |
277 | | | 275 | |
278 | if (gpio_reset) { | | 276 | if (gpio_reset) { |
279 | /* Reset */ | | 277 | /* Reset */ |
280 | gpioao = bus_space_read_4(bst, bsh, gpioao_reg); | | 278 | gpioao = bus_space_read_4(bst, bsh, gpioao_reg); |
281 | gpioao &= ~__BIT(pin); /* OEN */ | | 279 | gpioao &= ~__BIT(pin); /* OEN */ |
282 | bus_space_write_4(bst, bsh, gpioao_reg, gpioao); | | 280 | bus_space_write_4(bst, bsh, gpioao_reg, gpioao); |
283 | if (pol) { | | 281 | if (pol) { |
284 | gpioao |= __BIT(pin + 16); /* OUT */ | | 282 | gpioao |= __BIT(pin + 16); /* OUT */ |
285 | } else { | | 283 | } else { |
286 | gpioao &= ~__BIT(pin + 16); /* OUT */ | | 284 | gpioao &= ~__BIT(pin + 16); /* OUT */ |
287 | } | | 285 | } |
288 | bus_space_write_4(bst, bsh, gpioao_reg, gpioao); | | 286 | bus_space_write_4(bst, bsh, gpioao_reg, gpioao); |
289 | | | 287 | |
290 | delay(1000); | | 288 | delay(1000); |
291 | | | 289 | |
292 | if (pol) { | | 290 | if (pol) { |
293 | gpioao &= ~__BIT(pin + 16); /* OUT */ | | 291 | gpioao &= ~__BIT(pin + 16); /* OUT */ |
294 | } else { | | 292 | } else { |
295 | gpioao |= __BIT(pin + 16); /* OUT */ | | 293 | gpioao |= __BIT(pin + 16); /* OUT */ |
296 | } | | 294 | } |
297 | bus_space_write_4(bst, bsh, gpioao_reg, gpioao); | | 295 | bus_space_write_4(bst, bsh, gpioao_reg, gpioao); |
298 | | | 296 | |
299 | delay(60000); | | 297 | delay(60000); |
300 | } | | 298 | } |
301 | } | | 299 | } |