Sun Mar 1 15:06:09 2015 UTC ()
remove debug printf


(jmcneill)
diff -r1.5 -r1.6 src/sys/arch/arm/amlogic/amlogic_board.c

cvs diff -r1.5 -r1.6 src/sys/arch/arm/amlogic/Attic/amlogic_board.c (switch to unified diff)

--- src/sys/arch/arm/amlogic/Attic/amlogic_board.c 2015/02/28 22:53:25 1.5
+++ src/sys/arch/arm/amlogic/Attic/amlogic_board.c 2015/03/01 15:06:09 1.6
@@ -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
49bus_space_handle_t amlogic_core_bsh; 49bus_space_handle_t amlogic_core_bsh;
50 50
51struct arm32_bus_dma_tag amlogic_dma_tag = { 51struct 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
64void 64void
65amlogic_bootstrap(void) 65amlogic_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
77uint32_t 77uint32_t
78amlogic_get_rate_xtal(void) 78amlogic_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
87uint32_t 87uint32_t
88amlogic_get_rate_sys(void) 88amlogic_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
107uint32_t 107uint32_t
108amlogic_get_rate_a9(void) 108amlogic_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
150uint32_t 150uint32_t
151amlogic_get_rate_a9periph(void) 151amlogic_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
160static void 160static void
161amlogic_usbphy_clkgate_enable(int port) 161amlogic_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
185void 185void
186amlogic_usbphy_init(int port) 186amlogic_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}