1 1.9 skrll /* $NetBSD: octeon_xhci.c,v 1.9 2022/09/29 07:00:46 skrll Exp $ */ 2 1.1 jmcneill /* $OpenBSD: octxhci.c,v 1.4 2019/09/29 04:32:23 visa Exp $ */ 3 1.1 jmcneill 4 1.1 jmcneill /* 5 1.1 jmcneill * Copyright (c) 2017 Visa Hankala 6 1.1 jmcneill * Copyright (c) 2020 Jared McNeill <jmcneill (at) invisible.ca> 7 1.1 jmcneill * 8 1.1 jmcneill * Permission to use, copy, modify, and distribute this software for any 9 1.1 jmcneill * purpose with or without fee is hereby granted, provided that the above 10 1.1 jmcneill * copyright notice and this permission notice appear in all copies. 11 1.1 jmcneill * 12 1.1 jmcneill * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13 1.1 jmcneill * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14 1.1 jmcneill * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 15 1.1 jmcneill * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16 1.1 jmcneill * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17 1.1 jmcneill * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18 1.1 jmcneill * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19 1.1 jmcneill */ 20 1.1 jmcneill 21 1.1 jmcneill /* 22 1.1 jmcneill * Driver for OCTEON USB3 controller bridge. 23 1.1 jmcneill */ 24 1.1 jmcneill 25 1.1 jmcneill #include <sys/param.h> 26 1.1 jmcneill #include <sys/systm.h> 27 1.1 jmcneill #include <sys/device.h> 28 1.1 jmcneill 29 1.1 jmcneill #include <mips/cavium/octeonvar.h> 30 1.1 jmcneill 31 1.1 jmcneill #include <mips/cavium/dev/octeon_xhcireg.h> 32 1.1 jmcneill 33 1.1 jmcneill #include <dev/usb/usb.h> 34 1.1 jmcneill #include <dev/usb/usbdi.h> 35 1.1 jmcneill #include <dev/usb/usbdivar.h> 36 1.1 jmcneill #include <dev/usb/usb_mem.h> 37 1.1 jmcneill #include <dev/usb/xhcireg.h> 38 1.1 jmcneill #include <dev/usb/xhcivar.h> 39 1.1 jmcneill 40 1.1 jmcneill #include <dev/fdt/fdtvar.h> 41 1.1 jmcneill 42 1.1 jmcneill #define XCTL_RD_8(sc, reg) \ 43 1.1 jmcneill bus_space_read_8((sc)->sc_iot, (sc)->sc_ioh, (reg)) 44 1.1 jmcneill #define XCTL_WR_8(sc, reg, val) \ 45 1.1 jmcneill bus_space_write_8((sc)->sc_iot, (sc)->sc_ioh, (reg), (val)) 46 1.1 jmcneill 47 1.1 jmcneill struct octxhci_softc { 48 1.1 jmcneill struct xhci_softc sc_xhci; 49 1.1 jmcneill bus_space_tag_t sc_iot; 50 1.1 jmcneill bus_space_handle_t sc_ioh; 51 1.1 jmcneill struct fdtbus_gpio_pin *sc_power_gpio; 52 1.1 jmcneill int sc_unit; 53 1.1 jmcneill }; 54 1.1 jmcneill 55 1.1 jmcneill static int octxhci_match(device_t, cfdata_t, void *); 56 1.1 jmcneill static void octxhci_attach(device_t, device_t, void *); 57 1.1 jmcneill 58 1.1 jmcneill static int octxhci_dwc3_init(struct xhci_softc *); 59 1.1 jmcneill static void octxhci_uctl_init(struct octxhci_softc *, uint64_t, uint64_t); 60 1.1 jmcneill 61 1.1 jmcneill static void octxhci_bus_io_init(bus_space_tag_t, void *); 62 1.1 jmcneill 63 1.1 jmcneill static struct mips_bus_space octxhci_bus_tag; 64 1.1 jmcneill 65 1.1 jmcneill CFATTACH_DECL_NEW(octxhci, sizeof(struct octxhci_softc), 66 1.1 jmcneill octxhci_match, octxhci_attach, NULL, NULL); 67 1.1 jmcneill 68 1.4 thorpej static const struct device_compatible_entry compat_data[] = { 69 1.4 thorpej { .compat = "cavium,octeon-7130-usb-uctl" }, 70 1.4 thorpej DEVICE_COMPAT_EOL 71 1.1 jmcneill }; 72 1.1 jmcneill 73 1.1 jmcneill int 74 1.1 jmcneill octxhci_match(device_t parent, cfdata_t cf, void *aux) 75 1.1 jmcneill { 76 1.1 jmcneill struct fdt_attach_args * const faa = aux; 77 1.1 jmcneill 78 1.4 thorpej return of_compatible_match(faa->faa_phandle, compat_data); 79 1.1 jmcneill } 80 1.1 jmcneill 81 1.1 jmcneill void 82 1.1 jmcneill octxhci_attach(device_t parent, device_t self, void *aux) 83 1.1 jmcneill { 84 1.1 jmcneill struct octxhci_softc *osc = device_private(self); 85 1.1 jmcneill struct xhci_softc *sc = &osc->sc_xhci; 86 1.1 jmcneill struct fdt_attach_args * const faa = aux; 87 1.1 jmcneill const int phandle = faa->faa_phandle; 88 1.1 jmcneill const char *clock_type_hs; 89 1.1 jmcneill const char *clock_type_ss; 90 1.1 jmcneill u_int clock_freq, clock_sel; 91 1.1 jmcneill char intrstr[128]; 92 1.1 jmcneill int child, error; 93 1.1 jmcneill bus_addr_t addr; 94 1.1 jmcneill bus_size_t size; 95 1.1 jmcneill void *ih; 96 1.1 jmcneill 97 1.1 jmcneill osc->sc_iot = faa->faa_bst; 98 1.1 jmcneill 99 1.1 jmcneill if (fdtbus_get_reg(phandle, 0, &addr, &size) != 0) { 100 1.1 jmcneill aprint_error(": couldn't get bridge registers\n"); 101 1.1 jmcneill return; 102 1.1 jmcneill } 103 1.1 jmcneill if (bus_space_map(osc->sc_iot, addr, size, 0, &osc->sc_ioh) != 0) { 104 1.1 jmcneill aprint_error(": couldn't map bridge registers\n"); 105 1.1 jmcneill return; 106 1.1 jmcneill } 107 1.1 jmcneill osc->sc_power_gpio = fdtbus_gpio_acquire(phandle, "power", 108 1.1 jmcneill GPIO_PIN_OUTPUT); 109 1.1 jmcneill osc->sc_unit = (addr >> 24) & 0x1; 110 1.1 jmcneill 111 1.1 jmcneill octxhci_bus_io_init(&octxhci_bus_tag, NULL); 112 1.1 jmcneill 113 1.1 jmcneill sc->sc_dev = self; 114 1.1 jmcneill sc->sc_bus.ub_hcpriv = sc; 115 1.1 jmcneill sc->sc_bus.ub_dmatag = faa->faa_dmat; 116 1.1 jmcneill sc->sc_iot = &octxhci_bus_tag; 117 1.3 jmcneill sc->sc_ios = size; 118 1.1 jmcneill 119 1.1 jmcneill child = of_find_bycompat(phandle, "synopsys,dwc3"); 120 1.1 jmcneill if (child == -1) { 121 1.1 jmcneill aprint_error(": couldn't find dwc3 child node\n"); 122 1.1 jmcneill return; 123 1.1 jmcneill } 124 1.1 jmcneill if (fdtbus_get_reg(child, 0, &addr, &size) != 0) { 125 1.1 jmcneill aprint_error(": couldn't get xhci registers\n"); 126 1.1 jmcneill return; 127 1.1 jmcneill } 128 1.1 jmcneill if (bus_space_map(sc->sc_iot, addr, size, 0, &sc->sc_ioh) != 0) { 129 1.1 jmcneill aprint_error(": couldn't map xhci registers\n"); 130 1.1 jmcneill return; 131 1.1 jmcneill } 132 1.1 jmcneill 133 1.1 jmcneill if (of_getprop_uint32(phandle, "refclk-frequency", &clock_freq) != 0) { 134 1.1 jmcneill aprint_error(": couldn't get refclk-frequency property\n"); 135 1.1 jmcneill return; 136 1.1 jmcneill } 137 1.1 jmcneill clock_type_hs = fdtbus_get_string(phandle, "refclk-type-hs"); 138 1.1 jmcneill if (clock_type_hs == NULL) { 139 1.1 jmcneill aprint_error(": couldn't get refclk-type-hs property\n"); 140 1.1 jmcneill return; 141 1.1 jmcneill } 142 1.1 jmcneill clock_type_ss = fdtbus_get_string(phandle, "refclk-type-ss"); 143 1.1 jmcneill if (clock_type_ss == NULL) { 144 1.1 jmcneill aprint_error(": couldn't get refclk-type-ss property\n"); 145 1.1 jmcneill return; 146 1.1 jmcneill } 147 1.1 jmcneill 148 1.1 jmcneill clock_sel = 0; 149 1.1 jmcneill if (strcmp(clock_type_ss, "dlmc_ref_clk1") == 0) 150 1.1 jmcneill clock_sel |= 1; 151 1.1 jmcneill if (strcmp(clock_type_hs, "pll_ref_clk") == 0) 152 1.1 jmcneill clock_sel |= 2; 153 1.1 jmcneill 154 1.1 jmcneill octxhci_uctl_init(osc, clock_freq, clock_sel); 155 1.1 jmcneill 156 1.1 jmcneill if (octxhci_dwc3_init(sc) != 0) { 157 1.1 jmcneill /* Error message has been printed already. */ 158 1.1 jmcneill return; 159 1.1 jmcneill } 160 1.1 jmcneill 161 1.1 jmcneill if (!fdtbus_intr_str(child, 0, intrstr, sizeof(intrstr))) { 162 1.1 jmcneill aprint_error_dev(self, "failed to decode interrupt\n"); 163 1.1 jmcneill return; 164 1.1 jmcneill } 165 1.1 jmcneill 166 1.1 jmcneill ih = fdtbus_intr_establish(child, 0, IPL_USB, FDT_INTR_MPSAFE, 167 1.1 jmcneill xhci_intr, sc); 168 1.1 jmcneill if (ih == NULL) { 169 1.1 jmcneill aprint_error_dev(self, "couldn't establish interrupt on %s\n", 170 1.1 jmcneill intrstr); 171 1.1 jmcneill return; 172 1.1 jmcneill } 173 1.1 jmcneill aprint_normal_dev(self, "interrupting on %s\n", intrstr); 174 1.1 jmcneill 175 1.1 jmcneill sc->sc_bus.ub_revision = USBREV_3_0; 176 1.1 jmcneill error = xhci_init(sc); 177 1.1 jmcneill if (error != 0) { 178 1.1 jmcneill aprint_error_dev(self, "init failed, error = %d\n", error); 179 1.1 jmcneill return; 180 1.1 jmcneill } 181 1.1 jmcneill 182 1.6 thorpej sc->sc_child = config_found(self, &sc->sc_bus, usbctlprint, CFARGS_NONE); 183 1.5 thorpej sc->sc_child2 = config_found(self, &sc->sc_bus2, usbctlprint, 184 1.6 thorpej CFARGS_NONE); 185 1.1 jmcneill } 186 1.1 jmcneill 187 1.1 jmcneill void 188 1.1 jmcneill octxhci_uctl_init(struct octxhci_softc *sc, uint64_t clock_freq, 189 1.1 jmcneill uint64_t clock_sel) 190 1.1 jmcneill { 191 1.1 jmcneill static const uint32_t clock_divs[] = { 1, 2, 4, 6, 8, 16, 24, 32 }; 192 1.1 jmcneill uint64_t i, val; 193 1.1 jmcneill uint64_t ioclock = octeon_ioclock_speed(); 194 1.1 jmcneill uint64_t mpll_mult; 195 1.1 jmcneill uint64_t refclk_fsel; 196 1.1 jmcneill #if notyet 197 1.1 jmcneill int output_sel; 198 1.1 jmcneill #endif 199 1.1 jmcneill 200 1.1 jmcneill /* 201 1.1 jmcneill * Put the bridge controller, USB core, PHY, and clock divider 202 1.1 jmcneill * into reset. 203 1.1 jmcneill */ 204 1.1 jmcneill val = XCTL_RD_8(sc, XCTL_CTL); 205 1.1 jmcneill val |= XCTL_CTL_UCTL_RST; 206 1.1 jmcneill val |= XCTL_CTL_UAHC_RST; 207 1.1 jmcneill val |= XCTL_CTL_UPHY_RST; 208 1.1 jmcneill XCTL_WR_8(sc, XCTL_CTL, val); 209 1.1 jmcneill val = XCTL_RD_8(sc, XCTL_CTL); 210 1.1 jmcneill val |= XCTL_CTL_CLKDIV_RST; 211 1.1 jmcneill XCTL_WR_8(sc, XCTL_CTL, val); 212 1.1 jmcneill 213 1.1 jmcneill /* Select IO clock divisor. */ 214 1.1 jmcneill for (i = 0; i < __arraycount(clock_divs); i++) { 215 1.1 jmcneill if (ioclock / clock_divs[i] < 300000000) 216 1.1 jmcneill break; 217 1.1 jmcneill } 218 1.1 jmcneill 219 1.1 jmcneill /* Update the divisor and enable the clock. */ 220 1.1 jmcneill val = XCTL_RD_8(sc, XCTL_CTL); 221 1.1 jmcneill val &= ~XCTL_CTL_CLKDIV_SEL; 222 1.1 jmcneill val |= (i << XCTL_CTL_CLKDIV_SEL_SHIFT) & XCTL_CTL_CLKDIV_SEL; 223 1.1 jmcneill val |= XCTL_CTL_CLK_EN; 224 1.1 jmcneill XCTL_WR_8(sc, XCTL_CTL, val); 225 1.1 jmcneill 226 1.1 jmcneill /* Take the clock divider out of reset. */ 227 1.1 jmcneill val = XCTL_RD_8(sc, XCTL_CTL); 228 1.1 jmcneill val &= ~XCTL_CTL_CLKDIV_RST; 229 1.1 jmcneill XCTL_WR_8(sc, XCTL_CTL, val); 230 1.1 jmcneill 231 1.1 jmcneill /* Select the reference clock. */ 232 1.1 jmcneill switch (clock_freq) { 233 1.1 jmcneill case 50000000: 234 1.1 jmcneill refclk_fsel = 0x07; 235 1.1 jmcneill mpll_mult = 0x32; 236 1.1 jmcneill break; 237 1.1 jmcneill case 125000000: 238 1.1 jmcneill refclk_fsel = 0x07; 239 1.1 jmcneill mpll_mult = 0x28; 240 1.1 jmcneill break; 241 1.1 jmcneill case 100000000: 242 1.1 jmcneill default: 243 1.1 jmcneill if (clock_sel < 2) 244 1.1 jmcneill refclk_fsel = 0x27; 245 1.1 jmcneill else 246 1.1 jmcneill refclk_fsel = 0x07; 247 1.1 jmcneill mpll_mult = 0x19; 248 1.1 jmcneill break; 249 1.1 jmcneill } 250 1.1 jmcneill 251 1.1 jmcneill /* Set the clock and power up PHYs. */ 252 1.1 jmcneill val = XCTL_RD_8(sc, XCTL_CTL); 253 1.1 jmcneill val &= ~XCTL_CTL_REFCLK_SEL; 254 1.1 jmcneill val |= clock_sel << XCTL_CTL_REFCLK_SEL_SHIFT; 255 1.1 jmcneill val &= ~XCTL_CTL_REFCLK_DIV2; 256 1.1 jmcneill val &= ~XCTL_CTL_REFCLK_FSEL; 257 1.1 jmcneill val |= refclk_fsel << XCTL_CTL_REFCLK_FSEL_SHIFT; 258 1.1 jmcneill val &= ~XCTL_CTL_MPLL_MULT; 259 1.1 jmcneill val |= mpll_mult << XCTL_CTL_MPLL_MULT_SHIFT; 260 1.1 jmcneill val |= XCTL_CTL_SSC_EN; 261 1.1 jmcneill val |= XCTL_CTL_REFCLK_SSP_EN; 262 1.1 jmcneill val |= XCTL_CTL_SSPOWER_EN; 263 1.1 jmcneill val |= XCTL_CTL_HSPOWER_EN; 264 1.1 jmcneill XCTL_WR_8(sc, XCTL_CTL, val); 265 1.1 jmcneill 266 1.1 jmcneill delay(100); 267 1.1 jmcneill 268 1.1 jmcneill /* Take the bridge out of reset. */ 269 1.1 jmcneill val = XCTL_RD_8(sc, XCTL_CTL); 270 1.1 jmcneill val &= ~XCTL_CTL_UCTL_RST; 271 1.1 jmcneill XCTL_WR_8(sc, XCTL_CTL, val); 272 1.1 jmcneill 273 1.1 jmcneill delay(100); 274 1.1 jmcneill 275 1.1 jmcneill #if notyet 276 1.1 jmcneill if (sc->sc_power_gpio[0] != 0) { 277 1.1 jmcneill if (sc->sc_unit == 0) 278 1.1 jmcneill output_sel = GPIO_CONFIG_MD_USB0_VBUS_CTRL; 279 1.1 jmcneill else 280 1.1 jmcneill output_sel = GPIO_CONFIG_MD_USB1_VBUS_CTRL; 281 1.1 jmcneill gpio_controller_config_pin(sc->sc_power_gpio, 282 1.1 jmcneill GPIO_CONFIG_OUTPUT | output_sel); 283 1.1 jmcneill 284 1.1 jmcneill /* Enable port power control. */ 285 1.1 jmcneill val = XCTL_RD_8(sc, XCTL_HOST_CFG); 286 1.1 jmcneill val |= XCTL_HOST_CFG_PPC_EN; 287 1.1 jmcneill if (sc->sc_power_gpio[2] & GPIO_ACTIVE_LOW) 288 1.1 jmcneill val &= ~XCTL_HOST_CFG_PPC_ACTIVE_HIGH_EN; 289 1.1 jmcneill else 290 1.1 jmcneill val |= XCTL_HOST_CFG_PPC_ACTIVE_HIGH_EN; 291 1.1 jmcneill XCTL_WR_8(sc, XCTL_HOST_CFG, val); 292 1.1 jmcneill } else { 293 1.1 jmcneill /* Disable port power control. */ 294 1.1 jmcneill val = XCTL_RD_8(sc, XCTL_HOST_CFG); 295 1.1 jmcneill val &= ~XCTL_HOST_CFG_PPC_EN; 296 1.1 jmcneill XCTL_WR_8(sc, XCTL_HOST_CFG, val); 297 1.1 jmcneill } 298 1.1 jmcneill #else 299 1.1 jmcneill /* Disable port power control. */ 300 1.1 jmcneill val = XCTL_RD_8(sc, XCTL_HOST_CFG); 301 1.1 jmcneill val &= ~XCTL_HOST_CFG_PPC_EN; 302 1.1 jmcneill XCTL_WR_8(sc, XCTL_HOST_CFG, val); 303 1.1 jmcneill #endif 304 1.1 jmcneill 305 1.1 jmcneill /* Enable host-only mode. */ 306 1.1 jmcneill val = XCTL_RD_8(sc, XCTL_CTL); 307 1.1 jmcneill val &= ~XCTL_CTL_DRD_MODE; 308 1.1 jmcneill XCTL_WR_8(sc, XCTL_CTL, val); 309 1.1 jmcneill 310 1.1 jmcneill delay(100); 311 1.1 jmcneill 312 1.1 jmcneill /* Take the USB core out of reset. */ 313 1.1 jmcneill val = XCTL_RD_8(sc, XCTL_CTL); 314 1.1 jmcneill val &= ~XCTL_CTL_UAHC_RST; 315 1.1 jmcneill XCTL_WR_8(sc, XCTL_CTL, val); 316 1.1 jmcneill 317 1.1 jmcneill delay(100); 318 1.1 jmcneill 319 1.1 jmcneill val = XCTL_RD_8(sc, XCTL_CTL); 320 1.1 jmcneill val |= XCTL_CTL_CSCLK_EN; 321 1.1 jmcneill XCTL_WR_8(sc, XCTL_CTL, val); 322 1.1 jmcneill 323 1.1 jmcneill /* Take the PHY out of reset. */ 324 1.1 jmcneill val = XCTL_RD_8(sc, XCTL_CTL); 325 1.1 jmcneill val &= ~XCTL_CTL_UPHY_RST; 326 1.1 jmcneill XCTL_WR_8(sc, XCTL_CTL, val); 327 1.1 jmcneill (void)XCTL_RD_8(sc, XCTL_CTL); 328 1.1 jmcneill 329 1.7 msaitoh /* Fix endianness. */ 330 1.1 jmcneill val = XCTL_RD_8(sc, XCTL_SHIM_CFG); 331 1.1 jmcneill val &= ~XCTL_SHIM_CFG_CSR_BYTE_SWAP; 332 1.1 jmcneill val &= ~XCTL_SHIM_CFG_DMA_BYTE_SWAP; 333 1.2 simonb val |= __SHIFTIN(XCTL_SHIM_ENDIAN_BIG, XCTL_SHIM_CFG_DMA_BYTE_SWAP); 334 1.2 simonb val |= __SHIFTIN(XCTL_SHIM_ENDIAN_BIG, XCTL_SHIM_CFG_CSR_BYTE_SWAP); 335 1.1 jmcneill XCTL_WR_8(sc, XCTL_SHIM_CFG, val); 336 1.1 jmcneill (void)XCTL_RD_8(sc, XCTL_SHIM_CFG); 337 1.1 jmcneill } 338 1.1 jmcneill 339 1.1 jmcneill int 340 1.1 jmcneill octxhci_dwc3_init(struct xhci_softc *sc) 341 1.1 jmcneill { 342 1.1 jmcneill bus_space_handle_t ioh = sc->sc_ioh; 343 1.1 jmcneill uint32_t rev; 344 1.1 jmcneill uint32_t val; 345 1.1 jmcneill 346 1.1 jmcneill val = bus_space_read_4(sc->sc_iot, ioh, DWC3_GSNPSID); 347 1.1 jmcneill if ((val & 0xffff0000u) != 0x55330000u) { 348 1.1 jmcneill aprint_error(": no DWC3 core (DWC3_GSNPSID=%08x)\n", val); 349 1.1 jmcneill return EIO; 350 1.1 jmcneill } 351 1.1 jmcneill rev = val & 0xffffu; 352 1.1 jmcneill aprint_normal(": DWC3 rev 0x%04x\n", rev); 353 1.1 jmcneill 354 1.1 jmcneill val = bus_space_read_4(sc->sc_iot, ioh, DWC3_GUSB3PIPECTL(0)); 355 1.1 jmcneill val &= ~DWC3_GUSB3PIPECTL_UX_EXIT_PX; 356 1.1 jmcneill val |= DWC3_GUSB3PIPECTL_SUSPHY; 357 1.1 jmcneill bus_space_write_4(sc->sc_iot, ioh, DWC3_GUSB3PIPECTL(0), val); 358 1.1 jmcneill 359 1.1 jmcneill val = bus_space_read_4(sc->sc_iot, ioh, DWC3_GUSB2PHYCFG(0)); 360 1.1 jmcneill val |= DWC3_GUSB2PHYCFG_SUSPHY; 361 1.1 jmcneill bus_space_write_4(sc->sc_iot, ioh, DWC3_GUSB2PHYCFG(0), val); 362 1.1 jmcneill 363 1.1 jmcneill /* Set the controller into host mode. */ 364 1.1 jmcneill val = bus_space_read_4(sc->sc_iot, ioh, DWC3_GCTL); 365 1.1 jmcneill val &= ~DWC3_GCTL_PRTCAP_MASK; 366 1.1 jmcneill val |= DWC3_GCTL_PRTCAP_HOST; 367 1.1 jmcneill bus_space_write_4(sc->sc_iot, ioh, DWC3_GCTL, val); 368 1.1 jmcneill 369 1.1 jmcneill val = bus_space_read_4(sc->sc_iot, ioh, DWC3_GCTL); 370 1.1 jmcneill val &= ~DWC3_GCTL_SCALEDOWN_MASK; 371 1.1 jmcneill val &= ~DWC3_GCTL_DISSCRAMBLE; 372 1.1 jmcneill if (rev >= DWC3_REV_210A && rev <= DWC3_REV_250A) 373 1.1 jmcneill val |= DWC3_GCTL_DSBLCLKGTNG | DWC3_GCTL_SOFITPSYNC; 374 1.1 jmcneill else 375 1.1 jmcneill val &= ~DWC3_GCTL_DSBLCLKGTNG; 376 1.1 jmcneill bus_space_write_4(sc->sc_iot, ioh, DWC3_GCTL, val); 377 1.1 jmcneill 378 1.1 jmcneill return 0; 379 1.1 jmcneill } 380 1.1 jmcneill 381 1.1 jmcneill /* ---- bus_space(9) */ 382 1.8 skrll #define CHIP octxhci 383 1.1 jmcneill #define CHIP_IO 384 1.1 jmcneill #define CHIP_LITTLE_ENDIAN 385 1.1 jmcneill 386 1.1 jmcneill #define CHIP_W1_BUS_START(v) 0x0000000000000000ULL 387 1.1 jmcneill #define CHIP_W1_BUS_END(v) 0x7fffffffffffffffULL 388 1.1 jmcneill #define CHIP_W1_SYS_START(v) 0x8000000000000000ULL 389 1.1 jmcneill #define CHIP_W1_SYS_END(v) 0xffffffffffffffffULL 390 1.1 jmcneill 391 1.1 jmcneill #include <mips/mips/bus_space_alignstride_chipdep.c> 392