1 1.11 thorpej /* $NetBSD: tegra_usbphy.c,v 1.11 2021/01/27 03:10:19 thorpej Exp $ */ 2 1.1 jmcneill 3 1.1 jmcneill /*- 4 1.1 jmcneill * Copyright (c) 2015 Jared D. McNeill <jmcneill (at) invisible.ca> 5 1.1 jmcneill * All rights reserved. 6 1.1 jmcneill * 7 1.1 jmcneill * Redistribution and use in source and binary forms, with or without 8 1.1 jmcneill * modification, are permitted provided that the following conditions 9 1.1 jmcneill * are met: 10 1.1 jmcneill * 1. Redistributions of source code must retain the above copyright 11 1.1 jmcneill * notice, this list of conditions and the following disclaimer. 12 1.1 jmcneill * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 jmcneill * notice, this list of conditions and the following disclaimer in the 14 1.1 jmcneill * documentation and/or other materials provided with the distribution. 15 1.1 jmcneill * 16 1.1 jmcneill * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 1.1 jmcneill * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 1.1 jmcneill * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 1.1 jmcneill * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 1.1 jmcneill * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21 1.1 jmcneill * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 1.1 jmcneill * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23 1.1 jmcneill * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 1.1 jmcneill * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 1.1 jmcneill * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 1.1 jmcneill * SUCH DAMAGE. 27 1.1 jmcneill */ 28 1.1 jmcneill 29 1.1 jmcneill #include <sys/cdefs.h> 30 1.11 thorpej __KERNEL_RCSID(0, "$NetBSD: tegra_usbphy.c,v 1.11 2021/01/27 03:10:19 thorpej Exp $"); 31 1.1 jmcneill 32 1.1 jmcneill #include <sys/param.h> 33 1.1 jmcneill #include <sys/bus.h> 34 1.1 jmcneill #include <sys/device.h> 35 1.1 jmcneill #include <sys/intr.h> 36 1.1 jmcneill #include <sys/systm.h> 37 1.1 jmcneill #include <sys/kernel.h> 38 1.5 jmcneill #include <sys/atomic.h> 39 1.1 jmcneill 40 1.3 jmcneill #include <arm/nvidia/tegra_reg.h> 41 1.1 jmcneill #include <arm/nvidia/tegra_var.h> 42 1.1 jmcneill #include <arm/nvidia/tegra_usbreg.h> 43 1.1 jmcneill 44 1.3 jmcneill #include <dev/fdt/fdtvar.h> 45 1.3 jmcneill 46 1.1 jmcneill static int tegra_usbphy_match(device_t, cfdata_t, void *); 47 1.1 jmcneill static void tegra_usbphy_attach(device_t, device_t, void *); 48 1.1 jmcneill 49 1.1 jmcneill struct tegra_usbphy_softc { 50 1.1 jmcneill device_t sc_dev; 51 1.1 jmcneill bus_space_tag_t sc_bst; 52 1.1 jmcneill bus_space_handle_t sc_bsh; 53 1.3 jmcneill int sc_phandle; 54 1.5 jmcneill struct clk *sc_clk_reg; 55 1.5 jmcneill struct clk *sc_clk_pll; 56 1.5 jmcneill struct clk *sc_clk_utmip; 57 1.5 jmcneill struct fdtbus_reset *sc_rst_usb; 58 1.5 jmcneill struct fdtbus_reset *sc_rst_utmip; 59 1.1 jmcneill 60 1.1 jmcneill struct tegra_gpio_pin *sc_pin_vbus; 61 1.4 jmcneill uint32_t sc_hssync_start_delay; 62 1.4 jmcneill uint32_t sc_idle_wait_delay; 63 1.4 jmcneill uint32_t sc_elastic_limit; 64 1.4 jmcneill uint32_t sc_term_range_adj; 65 1.4 jmcneill uint32_t sc_xcvr_setup; 66 1.4 jmcneill uint32_t sc_xcvr_lsfslew; 67 1.4 jmcneill uint32_t sc_xcvr_lsrslew; 68 1.4 jmcneill uint32_t sc_hssquelch_level; 69 1.4 jmcneill uint32_t sc_hsdiscon_level; 70 1.4 jmcneill uint32_t sc_xcvr_hsslew; 71 1.1 jmcneill }; 72 1.1 jmcneill 73 1.1 jmcneill static int tegra_usbphy_parse_properties(struct tegra_usbphy_softc *); 74 1.1 jmcneill static void tegra_usbphy_utmip_init(struct tegra_usbphy_softc *); 75 1.1 jmcneill 76 1.1 jmcneill CFATTACH_DECL_NEW(tegra_usbphy, sizeof(struct tegra_usbphy_softc), 77 1.1 jmcneill tegra_usbphy_match, tegra_usbphy_attach, NULL, NULL); 78 1.1 jmcneill 79 1.11 thorpej static const struct device_compatible_entry compat_data[] = { 80 1.11 thorpej { .compat = "nvidia,tegra210-usb-phy" }, 81 1.11 thorpej { .compat = "nvidia,tegra124-usb-phy" }, 82 1.11 thorpej { .compat = "nvidia,tegra30-usb-phy" }, 83 1.11 thorpej DEVICE_COMPAT_EOL 84 1.11 thorpej }; 85 1.11 thorpej 86 1.1 jmcneill static int 87 1.1 jmcneill tegra_usbphy_match(device_t parent, cfdata_t cf, void *aux) 88 1.1 jmcneill { 89 1.3 jmcneill struct fdt_attach_args * const faa = aux; 90 1.3 jmcneill 91 1.11 thorpej return of_compatible_match(faa->faa_phandle, compat_data); 92 1.1 jmcneill } 93 1.1 jmcneill 94 1.1 jmcneill static void 95 1.1 jmcneill tegra_usbphy_attach(device_t parent, device_t self, void *aux) 96 1.1 jmcneill { 97 1.1 jmcneill struct tegra_usbphy_softc * const sc = device_private(self); 98 1.3 jmcneill struct fdt_attach_args * const faa = aux; 99 1.3 jmcneill struct fdtbus_regulator *reg; 100 1.5 jmcneill const int phandle = faa->faa_phandle; 101 1.3 jmcneill bus_addr_t addr; 102 1.3 jmcneill bus_size_t size; 103 1.3 jmcneill int error; 104 1.3 jmcneill 105 1.5 jmcneill if (fdtbus_get_reg(phandle, 0, &addr, &size) != 0) { 106 1.3 jmcneill aprint_error(": couldn't get registers\n"); 107 1.3 jmcneill return; 108 1.3 jmcneill } 109 1.5 jmcneill sc->sc_clk_reg = fdtbus_clock_get(phandle, "reg"); 110 1.5 jmcneill if (sc->sc_clk_reg == NULL) { 111 1.5 jmcneill aprint_error(": couldn't get clock reg\n"); 112 1.5 jmcneill return; 113 1.5 jmcneill } 114 1.5 jmcneill sc->sc_clk_pll = fdtbus_clock_get(phandle, "pll_u"); 115 1.5 jmcneill if (sc->sc_clk_pll == NULL) { 116 1.5 jmcneill aprint_error(": couldn't get clock pll_u\n"); 117 1.5 jmcneill return; 118 1.5 jmcneill } 119 1.5 jmcneill sc->sc_clk_utmip = fdtbus_clock_get(phandle, "utmi-pads"); 120 1.5 jmcneill if (sc->sc_clk_utmip == NULL) { 121 1.5 jmcneill aprint_error(": couldn't get clock utmi-pads\n"); 122 1.5 jmcneill return; 123 1.5 jmcneill } 124 1.5 jmcneill sc->sc_rst_usb = fdtbus_reset_get(phandle, "usb"); 125 1.5 jmcneill if (sc->sc_rst_usb == NULL) { 126 1.5 jmcneill aprint_error(": couldn't get reset usb\n"); 127 1.5 jmcneill return; 128 1.5 jmcneill } 129 1.5 jmcneill sc->sc_rst_utmip = fdtbus_reset_get(phandle, "utmi-pads"); 130 1.5 jmcneill if (sc->sc_rst_utmip == NULL) { 131 1.5 jmcneill aprint_error(": couldn't get reset utmi-pads\n"); 132 1.5 jmcneill return; 133 1.5 jmcneill } 134 1.1 jmcneill 135 1.1 jmcneill sc->sc_dev = self; 136 1.5 jmcneill sc->sc_phandle = phandle; 137 1.3 jmcneill sc->sc_bst = faa->faa_bst; 138 1.3 jmcneill error = bus_space_map(sc->sc_bst, addr, size, 0, &sc->sc_bsh); 139 1.3 jmcneill if (error) { 140 1.10 skrll aprint_error(": couldn't map %#" PRIxBUSADDR ": %d", addr, error); 141 1.3 jmcneill return; 142 1.3 jmcneill } 143 1.1 jmcneill 144 1.1 jmcneill aprint_naive("\n"); 145 1.5 jmcneill aprint_normal(": USB PHY\n"); 146 1.1 jmcneill 147 1.1 jmcneill if (tegra_usbphy_parse_properties(sc) != 0) 148 1.1 jmcneill return; 149 1.1 jmcneill 150 1.5 jmcneill fdtbus_reset_assert(sc->sc_rst_usb); 151 1.5 jmcneill error = clk_enable(sc->sc_clk_reg); 152 1.5 jmcneill if (error) { 153 1.5 jmcneill aprint_error_dev(self, "couldn't enable clock reg: %d\n", 154 1.5 jmcneill error); 155 1.5 jmcneill return; 156 1.5 jmcneill } 157 1.5 jmcneill fdtbus_reset_deassert(sc->sc_rst_usb); 158 1.1 jmcneill 159 1.1 jmcneill tegra_usbphy_utmip_init(sc); 160 1.1 jmcneill 161 1.5 jmcneill reg = fdtbus_regulator_acquire(phandle, "vbus-supply"); 162 1.3 jmcneill if (reg) { 163 1.1 jmcneill const uint32_t v = bus_space_read_4(sc->sc_bst, sc->sc_bsh, 164 1.1 jmcneill TEGRA_EHCI_PHY_VBUS_SENSORS_REG); 165 1.1 jmcneill if ((v & TEGRA_EHCI_PHY_VBUS_SENSORS_A_VBUS_VLD_STS) == 0) { 166 1.3 jmcneill fdtbus_regulator_enable(reg); 167 1.1 jmcneill } else { 168 1.1 jmcneill aprint_normal_dev(self, "VBUS input active\n"); 169 1.1 jmcneill } 170 1.1 jmcneill } 171 1.1 jmcneill } 172 1.1 jmcneill 173 1.1 jmcneill static int 174 1.1 jmcneill tegra_usbphy_parse_properties(struct tegra_usbphy_softc *sc) 175 1.1 jmcneill { 176 1.3 jmcneill #define PROPGET(k, v) \ 177 1.4 jmcneill if (of_getprop_uint32(sc->sc_phandle, (k), (v))) { \ 178 1.1 jmcneill aprint_error_dev(sc->sc_dev, \ 179 1.1 jmcneill "missing property '%s'\n", (k)); \ 180 1.1 jmcneill return EIO; \ 181 1.4 jmcneill } 182 1.1 jmcneill 183 1.1 jmcneill PROPGET("nvidia,hssync-start-delay", &sc->sc_hssync_start_delay); 184 1.1 jmcneill PROPGET("nvidia,idle-wait-delay", &sc->sc_idle_wait_delay); 185 1.1 jmcneill PROPGET("nvidia,elastic-limit", &sc->sc_elastic_limit); 186 1.1 jmcneill PROPGET("nvidia,term-range-adj", &sc->sc_term_range_adj); 187 1.1 jmcneill PROPGET("nvidia,xcvr-setup", &sc->sc_xcvr_setup); 188 1.1 jmcneill PROPGET("nvidia,xcvr-lsfslew", &sc->sc_xcvr_lsfslew); 189 1.1 jmcneill PROPGET("nvidia,xcvr-lsrslew", &sc->sc_xcvr_lsrslew); 190 1.1 jmcneill PROPGET("nvidia,hssquelch-level", &sc->sc_hssquelch_level); 191 1.1 jmcneill PROPGET("nvidia,hsdiscon-level", &sc->sc_hsdiscon_level); 192 1.1 jmcneill PROPGET("nvidia,xcvr-hsslew", &sc->sc_xcvr_hsslew); 193 1.1 jmcneill 194 1.1 jmcneill return 0; 195 1.1 jmcneill #undef PROPGET 196 1.1 jmcneill } 197 1.1 jmcneill 198 1.1 jmcneill static void 199 1.1 jmcneill tegra_usbphy_utmip_init(struct tegra_usbphy_softc *sc) 200 1.1 jmcneill { 201 1.1 jmcneill bus_space_tag_t bst = sc->sc_bst; 202 1.1 jmcneill bus_space_handle_t bsh = sc->sc_bsh; 203 1.1 jmcneill int retry; 204 1.1 jmcneill 205 1.1 jmcneill /* Put UTMIP PHY into reset before programming UTMIP config registers */ 206 1.1 jmcneill tegra_reg_set_clear(bst, bsh, TEGRA_EHCI_SUSP_CTRL_REG, 207 1.1 jmcneill TEGRA_EHCI_SUSP_CTRL_UTMIP_RESET, 0); 208 1.1 jmcneill 209 1.1 jmcneill /* Enable UTMIP PHY mode */ 210 1.1 jmcneill tegra_reg_set_clear(bst, bsh, TEGRA_EHCI_SUSP_CTRL_REG, 211 1.1 jmcneill TEGRA_EHCI_SUSP_CTRL_UTMIP_PHY_ENB, 0); 212 1.1 jmcneill 213 1.1 jmcneill /* Stop crystal clock */ 214 1.1 jmcneill tegra_reg_set_clear(bst, bsh, TEGRA_EHCI_UTMIP_MISC_CFG1_REG, 215 1.1 jmcneill 0, TEGRA_EHCI_UTMIP_MISC_CFG1_PHY_XTAL_CLOCKEN); 216 1.1 jmcneill delay(1); 217 1.1 jmcneill 218 1.1 jmcneill /* Clear session status */ 219 1.1 jmcneill tegra_reg_set_clear(bst, bsh, TEGRA_EHCI_PHY_VBUS_SENSORS_REG, 220 1.1 jmcneill 0, 221 1.1 jmcneill TEGRA_EHCI_PHY_VBUS_SENSORS_B_VLD_SW_VALUE | 222 1.1 jmcneill TEGRA_EHCI_PHY_VBUS_SENSORS_B_VLD_SW_EN); 223 1.1 jmcneill 224 1.1 jmcneill /* Transceiver configuration */ 225 1.1 jmcneill tegra_reg_set_clear(bst, bsh, TEGRA_EHCI_UTMIP_XCVR_CFG0_REG, 226 1.1 jmcneill __SHIFTIN(4, TEGRA_EHCI_UTMIP_XCVR_CFG0_SETUP) | 227 1.1 jmcneill __SHIFTIN(3, TEGRA_EHCI_UTMIP_XCVR_CFG0_SETUP_MSB) | 228 1.1 jmcneill __SHIFTIN(sc->sc_xcvr_hsslew, 229 1.1 jmcneill TEGRA_EHCI_UTMIP_XCVR_CFG0_HSSLEW_MSB), 230 1.1 jmcneill TEGRA_EHCI_UTMIP_XCVR_CFG0_SETUP | 231 1.1 jmcneill TEGRA_EHCI_UTMIP_XCVR_CFG0_SETUP_MSB | 232 1.1 jmcneill TEGRA_EHCI_UTMIP_XCVR_CFG0_HSSLEW_MSB); 233 1.1 jmcneill tegra_reg_set_clear(bst, bsh, TEGRA_EHCI_UTMIP_XCVR_CFG1_REG, 234 1.1 jmcneill __SHIFTIN(sc->sc_term_range_adj, 235 1.1 jmcneill TEGRA_EHCI_UTMIP_XCVR_CFG1_TERM_RANGE_ADJ), 236 1.1 jmcneill TEGRA_EHCI_UTMIP_XCVR_CFG1_TERM_RANGE_ADJ); 237 1.1 jmcneill 238 1.6 skrll if (of_getprop_bool(sc->sc_phandle, "nvidia,has-utmi-pad-registers")) { 239 1.1 jmcneill tegra_reg_set_clear(bst, bsh, TEGRA_EHCI_UTMIP_BIAS_CFG0_REG, 240 1.1 jmcneill TEGRA_EHCI_UTMIP_BIAS_CFG0_HSDISCON_LEVEL_MSB | 241 1.1 jmcneill __SHIFTIN(sc->sc_hsdiscon_level, 242 1.1 jmcneill TEGRA_EHCI_UTMIP_BIAS_CFG0_HSDISCON_LEVEL), 243 1.5 jmcneill TEGRA_EHCI_UTMIP_BIAS_CFG0_BIASPD | 244 1.1 jmcneill TEGRA_EHCI_UTMIP_BIAS_CFG0_HSDISCON_LEVEL); 245 1.5 jmcneill delay(25); 246 1.5 jmcneill tegra_reg_set_clear(bst, bsh, TEGRA_EHCI_UTMIP_BIAS_CFG1_REG, 247 1.5 jmcneill 0, TEGRA_EHCI_UTMIP_BIAS_CFG1_PDTRK_POWERDOWN); 248 1.1 jmcneill } 249 1.1 jmcneill 250 1.1 jmcneill /* Misc config */ 251 1.1 jmcneill tegra_reg_set_clear(bst, bsh, TEGRA_EHCI_UTMIP_MISC_CFG0_REG, 252 1.1 jmcneill 0, 253 1.1 jmcneill TEGRA_EHCI_UTMIP_MISC_CFG0_SUSPEND_EXIT_ON_EDGE); 254 1.1 jmcneill 255 1.1 jmcneill /* BIAS cell power down lag */ 256 1.1 jmcneill tegra_reg_set_clear(bst, bsh, TEGRA_EHCI_UTMIP_BIAS_CFG1_REG, 257 1.1 jmcneill __SHIFTIN(5, TEGRA_EHCI_UTMIP_BIAS_CFG1_PDTRK_COUNT), 258 1.1 jmcneill TEGRA_EHCI_UTMIP_BIAS_CFG1_PDTRK_COUNT); 259 1.1 jmcneill 260 1.1 jmcneill /* Debounce config */ 261 1.1 jmcneill tegra_reg_set_clear(bst, bsh, TEGRA_EHCI_UTMIP_DEBOUNCE_CFG0_REG, 262 1.1 jmcneill __SHIFTIN(0x7530, TEGRA_EHCI_UTMIP_DEBOUNCE_CFG0_A), 263 1.1 jmcneill TEGRA_EHCI_UTMIP_DEBOUNCE_CFG0_A); 264 1.1 jmcneill 265 1.1 jmcneill /* Transmit signal preamble config */ 266 1.1 jmcneill tegra_reg_set_clear(bst, bsh, TEGRA_EHCI_UTMIP_TX_CFG0_REG, 267 1.1 jmcneill TEGRA_EHCI_UTMIP_TX_CFG0_FS_PREAMBLE_J, 0); 268 1.1 jmcneill 269 1.1 jmcneill /* Power-down battery charger circuit */ 270 1.1 jmcneill tegra_reg_set_clear(bst, bsh, TEGRA_EHCI_UTMIP_BAT_CHRG_CFG0_REG, 271 1.1 jmcneill TEGRA_EHCI_UTMIP_BAT_CHRG_CFG0_PD_CHRG, 0); 272 1.1 jmcneill 273 1.1 jmcneill /* Select low speed bias method */ 274 1.1 jmcneill tegra_reg_set_clear(bst, bsh, TEGRA_EHCI_UTMIP_XCVR_CFG0_REG, 275 1.1 jmcneill 0, TEGRA_EHCI_UTMIP_XCVR_CFG0_LSBIAS_SEL); 276 1.1 jmcneill 277 1.1 jmcneill /* High speed receive config */ 278 1.1 jmcneill tegra_reg_set_clear(bst, bsh, TEGRA_EHCI_UTMIP_HSRX_CFG0_REG, 279 1.1 jmcneill __SHIFTIN(sc->sc_idle_wait_delay, 280 1.1 jmcneill TEGRA_EHCI_UTMIP_HSRX_CFG0_IDLE_WAIT) | 281 1.1 jmcneill __SHIFTIN(sc->sc_elastic_limit, 282 1.1 jmcneill TEGRA_EHCI_UTMIP_HSRX_CFG0_ELASTIC_LIMIT), 283 1.1 jmcneill TEGRA_EHCI_UTMIP_HSRX_CFG0_IDLE_WAIT | 284 1.1 jmcneill TEGRA_EHCI_UTMIP_HSRX_CFG0_ELASTIC_LIMIT); 285 1.1 jmcneill tegra_reg_set_clear(bst, bsh, TEGRA_EHCI_UTMIP_HSRX_CFG1_REG, 286 1.1 jmcneill __SHIFTIN(sc->sc_hssync_start_delay, 287 1.1 jmcneill TEGRA_EHCI_UTMIP_HSRX_CFG1_SYNC_START_DLY), 288 1.1 jmcneill TEGRA_EHCI_UTMIP_HSRX_CFG1_SYNC_START_DLY); 289 1.1 jmcneill 290 1.1 jmcneill /* Start crystal clock */ 291 1.1 jmcneill delay(1); 292 1.1 jmcneill tegra_reg_set_clear(bst, bsh, TEGRA_EHCI_UTMIP_MISC_CFG1_REG, 293 1.1 jmcneill TEGRA_EHCI_UTMIP_MISC_CFG1_PHY_XTAL_CLOCKEN, 0); 294 1.1 jmcneill 295 1.1 jmcneill /* Bring UTMIP PHY out of reset */ 296 1.1 jmcneill tegra_reg_set_clear(bst, bsh, TEGRA_EHCI_SUSP_CTRL_REG, 297 1.1 jmcneill 0, TEGRA_EHCI_SUSP_CTRL_UTMIP_RESET); 298 1.1 jmcneill for (retry = 100000; retry > 0; retry--) { 299 1.1 jmcneill const uint32_t susp = bus_space_read_4(bst, bsh, 300 1.1 jmcneill TEGRA_EHCI_SUSP_CTRL_REG); 301 1.1 jmcneill if (susp & TEGRA_EHCI_SUSP_CTRL_PHY_CLK_VALID) 302 1.1 jmcneill break; 303 1.1 jmcneill delay(1); 304 1.1 jmcneill } 305 1.1 jmcneill if (retry == 0) { 306 1.1 jmcneill aprint_error_dev(sc->sc_dev, "PHY clock is not valid\n"); 307 1.1 jmcneill return; 308 1.1 jmcneill } 309 1.1 jmcneill 310 1.1 jmcneill /* Disable ICUSB transceiver */ 311 1.1 jmcneill tegra_reg_set_clear(bst, bsh, TEGRA_EHCI_ICUSB_CTRL_REG, 312 1.1 jmcneill 0, 313 1.1 jmcneill TEGRA_EHCI_ICUSB_CTRL_ENB1); 314 1.1 jmcneill 315 1.1 jmcneill /* Power up UTMPI transceiver */ 316 1.1 jmcneill tegra_reg_set_clear(bst, bsh, TEGRA_EHCI_UTMIP_XCVR_CFG0_REG, 317 1.1 jmcneill 0, 318 1.1 jmcneill TEGRA_EHCI_UTMIP_XCVR_CFG0_PD_POWERDOWN | 319 1.1 jmcneill TEGRA_EHCI_UTMIP_XCVR_CFG0_PD2_POWERDOWN | 320 1.1 jmcneill TEGRA_EHCI_UTMIP_XCVR_CFG0_PDZI_POWERDOWN); 321 1.1 jmcneill tegra_reg_set_clear(bst, bsh, TEGRA_EHCI_UTMIP_XCVR_CFG1_REG, 322 1.1 jmcneill 0, 323 1.1 jmcneill TEGRA_EHCI_UTMIP_XCVR_CFG1_PDDISC_POWERDOWN | 324 1.1 jmcneill TEGRA_EHCI_UTMIP_XCVR_CFG1_PDCHRP_POWERDOWN | 325 1.1 jmcneill TEGRA_EHCI_UTMIP_XCVR_CFG1_PDDR_POWERDOWN); 326 1.1 jmcneill } 327