Module Name: src
Committed By: jmcneill
Date: Mon Sep 25 00:03:34 UTC 2017
Modified Files:
src/sys/arch/arm/nvidia: tegra210_car.c tegra210_xusbpad.c tegra_xusb.c
Log Message:
USB works on Tegra X1 now.
To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/arm/nvidia/tegra210_car.c \
src/sys/arch/arm/nvidia/tegra_xusb.c
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/arm/nvidia/tegra210_xusbpad.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/arm/nvidia/tegra210_car.c
diff -u src/sys/arch/arm/nvidia/tegra210_car.c:1.10 src/sys/arch/arm/nvidia/tegra210_car.c:1.11
--- src/sys/arch/arm/nvidia/tegra210_car.c:1.10 Sun Sep 24 20:09:53 2017
+++ src/sys/arch/arm/nvidia/tegra210_car.c Mon Sep 25 00:03:34 2017
@@ -1,4 +1,5 @@
-/* $NetBSD: tegra210_car.c,v 1.10 2017/09/24 20:09:53 jmcneill Exp $ */
+/* $NetBSD: tegra210_car.c,v 1.11 2017/09/25 00:03:34 jmcneill Exp $ */
+#define TEGRA210_CAR_DEBUG
/*-
* Copyright (c) 2015-2017 Jared McNeill <[email protected]>
@@ -27,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tegra210_car.c,v 1.10 2017/09/24 20:09:53 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra210_car.c,v 1.11 2017/09/25 00:03:34 jmcneill Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -538,6 +539,15 @@ static struct tegra_clk tegra210_car_clo
CAR_CLKSRC_XUSB_FALCON_REG, CAR_CLKSRC_XUSB_FALCON_DIV),
CLK_DIV("USB2_HSIC_TRK", "CLK_M",
CAR_CLKSRC_USB2_HSIC_TRK_REG, CAR_CLKSRC_USB2_HSIC_TRK_DIV),
+ CLK_DIV("DIV_PLL_U_OUT1", "PLL_U",
+ CAR_PLLU_OUTA_REG, CAR_PLLU_OUTA_OUT1_RATIO),
+ CLK_DIV("DIV_PLL_U_OUT2", "PLL_U",
+ CAR_PLLU_OUTA_REG, CAR_PLLU_OUTA_OUT2_RATIO),
+
+ CLK_GATE("PLL_U_OUT1", "DIV_PLL_U_OUT1",
+ CAR_PLLU_OUTA_REG, CAR_PLLU_OUTA_REG, CAR_PLLU_OUTA_OUT1_CLKEN),
+ CLK_GATE("PLL_U_OUT2", "DIV_PLL_U_OUT2",
+ CAR_PLLU_OUTA_REG, CAR_PLLU_OUTA_REG, CAR_PLLU_OUTA_OUT2_CLKEN),
CLK_GATE_L("UARTA", "DIV_UARTA", CAR_DEV_L_UARTA),
CLK_GATE_L("UARTB", "DIV_UARTB", CAR_DEV_L_UARTB),
@@ -553,10 +563,11 @@ static struct tegra_clk tegra210_car_clo
CLK_GATE_V("I2C4", "DIV_I2C4", CAR_DEV_V_I2C4),
CLK_GATE_H("I2C5", "DIV_I2C5", CAR_DEV_H_I2C5),
CLK_GATE_X("I2C6", "DIV_I2C6", CAR_DEV_X_I2C6),
+ CLK_GATE_W("XUSB_GATE", "CLK_M", CAR_DEV_W_XUSB),
CLK_GATE_U("XUSB_HOST", "XUSB_HOST_SRC", CAR_DEV_U_XUSB_HOST),
CLK_GATE_W("XUSB_SS", "XUSB_SS_SRC", CAR_DEV_W_XUSB_SS),
CLK_GATE_H("FUSE", "CLK_M", CAR_DEV_H_FUSE),
- CLK_GATE_Y("USB2_TRK", "UBS2_HSIC_TRK", CAR_DEV_Y_USB2_TRK),
+ CLK_GATE_Y("USB2_TRK", "USB2_HSIC_TRK", CAR_DEV_Y_USB2_TRK),
CLK_GATE_Y("HSIC_TRK", "USB2_HSIC_TRK", CAR_DEV_Y_HSIC_TRK),
CLK_GATE_H("APBDMA", "CLK_M", CAR_DEV_H_APBDMA),
CLK_GATE_L("USBD", "PLL_U_480M", CAR_DEV_L_USBD),
@@ -566,15 +577,20 @@ static struct tegra_clk tegra210_car_clo
struct tegra210_init_parent {
const char *clock;
const char *parent;
+ u_int rate;
+ u_int enable;
} tegra210_init_parents[] = {
- { "SDMMC1", "PLL_P" },
- { "SDMMC2", "PLL_P" },
- { "SDMMC3", "PLL_P" },
- { "SDMMC4", "PLL_P" },
- { "XUSB_HOST_SRC", "PLL_P" },
- { "XUSB_FALCON_SRC", "PLL_P" },
- { "XUSB_SS_SRC", "PLL_U_480M" },
- { "XUSB_FS_SRC", "PLL_U_48M" },
+ { "SDMMC1", "PLL_P", 0, 0 },
+ { "SDMMC2", "PLL_P", 0, 0 },
+ { "SDMMC3", "PLL_P", 0, 0 },
+ { "SDMMC4", "PLL_P", 0, 0 },
+ { "XUSB_GATE", NULL, 0, 1 },
+ { "XUSB_HOST_SRC", "PLL_P", 102000000, 0 },
+ { "XUSB_FALCON_SRC", "PLL_P", 204000000, 0 },
+ { "XUSB_SS_SRC", "PLL_U_480M", 120000000, 0 },
+ { "XUSB_FS_SRC", "PLL_U_48M", 48000000, 0 },
+ { "PLL_U_OUT1", NULL, 48000000, 1 },
+ { "PLL_U_OUT2", NULL, 60000000, 1 },
};
struct tegra210_car_rst {
@@ -719,18 +735,38 @@ tegra210_car_parent_init(struct tegra210
for (n = 0; n < __arraycount(tegra210_init_parents); n++) {
clk = clk_get(&sc->sc_clkdom, tegra210_init_parents[n].clock);
- KASSERT(clk != NULL);
- clk_parent = clk_get(&sc->sc_clkdom,
- tegra210_init_parents[n].parent);
- KASSERT(clk_parent != NULL);
-
- error = clk_set_parent(clk, clk_parent);
- if (error) {
- aprint_error_dev(sc->sc_dev,
- "couldn't set '%s' parent to '%s': %d\n",
- clk->name, clk_parent->name, error);
+ KASSERTMSG(clk != NULL, "tegra210 clock %s not found", tegra210_init_parents[n].clock);
+
+ if (tegra210_init_parents[n].parent != NULL) {
+ clk_parent = clk_get(&sc->sc_clkdom,
+ tegra210_init_parents[n].parent);
+ KASSERT(clk_parent != NULL);
+
+ error = clk_set_parent(clk, clk_parent);
+ if (error) {
+ aprint_error_dev(sc->sc_dev,
+ "couldn't set '%s' parent to '%s': %d\n",
+ clk->name, clk_parent->name, error);
+ }
+ clk_put(clk_parent);
+ }
+ if (tegra210_init_parents[n].rate != 0) {
+ error = clk_set_rate(clk, tegra210_init_parents[n].rate);
+ if (error) {
+ aprint_error_dev(sc->sc_dev,
+ "couldn't set '%s' rate to %u Hz: %d\n",
+ clk->name, tegra210_init_parents[n].rate,
+ error);
+ }
+ }
+ if (tegra210_init_parents[n].enable) {
+ error = clk_enable(clk);
+ if (error) {
+ aprint_error_dev(sc->sc_dev,
+ "couldn't enable '%s': %d\n", clk->name,
+ error);
+ }
}
- clk_put(clk_parent);
clk_put(clk);
}
}
Index: src/sys/arch/arm/nvidia/tegra_xusb.c
diff -u src/sys/arch/arm/nvidia/tegra_xusb.c:1.10 src/sys/arch/arm/nvidia/tegra_xusb.c:1.11
--- src/sys/arch/arm/nvidia/tegra_xusb.c:1.10 Sun Sep 24 20:09:22 2017
+++ src/sys/arch/arm/nvidia/tegra_xusb.c Mon Sep 25 00:03:34 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_xusb.c,v 1.10 2017/09/24 20:09:22 jmcneill Exp $ */
+/* $NetBSD: tegra_xusb.c,v 1.11 2017/09/25 00:03:34 jmcneill Exp $ */
/*
* Copyright (c) 2016 Jonathan A. Kollasch
@@ -30,7 +30,7 @@
#include "opt_tegra.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tegra_xusb.c,v 1.10 2017/09/24 20:09:22 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra_xusb.c,v 1.11 2017/09/25 00:03:34 jmcneill Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -113,6 +113,8 @@ struct tegra_xusb_softc {
struct fw_dma sc_fw_dma;
struct clk *sc_clk_ss_src;
enum xusb_type sc_type;
+
+ bool sc_scale_ss_clock;
};
static uint32_t csb_read_4(struct tegra_xusb_softc * const, bus_size_t);
@@ -168,10 +170,20 @@ tegra_xusb_attach(device_t parent, devic
sc->sc_iot = faa->faa_bst;
sc->sc_bus.ub_hcpriv = sc;
sc->sc_bus.ub_dmatag = faa->faa_dmat;
+ sc->sc_quirks = XHCI_DEFERRED_START;
psc->sc_phandle = faa->faa_phandle;
psc->sc_type = of_search_compatible(faa->faa_phandle, compat_data)->data;
- if (fdtbus_get_reg(faa->faa_phandle, 0, &addr, &size) != 0) {
+ switch (psc->sc_type) {
+ case XUSB_T124:
+ psc->sc_scale_ss_clock = true;
+ break;
+ default:
+ psc->sc_scale_ss_clock = false;
+ break;
+ }
+
+ if (fdtbus_get_reg_byname(faa->faa_phandle, "hcd", &addr, &size) != 0) {
aprint_error(": couldn't get registers\n");
return;
}
@@ -182,7 +194,7 @@ tegra_xusb_attach(device_t parent, devic
}
DPRINTF(sc->sc_dev, "mapped %#llx\n", (uint64_t)addr);
- if (fdtbus_get_reg(faa->faa_phandle, 1, &addr, &size) != 0) {
+ if (fdtbus_get_reg_byname(faa->faa_phandle, "fpci", &addr, &size) != 0) {
aprint_error(": couldn't get registers\n");
return;
}
@@ -193,7 +205,7 @@ tegra_xusb_attach(device_t parent, devic
}
DPRINTF(sc->sc_dev, "mapped %#llx\n", (uint64_t)addr);
- if (fdtbus_get_reg(faa->faa_phandle, 2, &addr, &size) != 0) {
+ if (fdtbus_get_reg_byname(faa->faa_phandle, "ipfs", &addr, &size) != 0) {
aprint_error(": couldn't get registers\n");
return;
}
@@ -210,7 +222,7 @@ tegra_xusb_attach(device_t parent, devic
}
psc->sc_ih = fdtbus_intr_establish(faa->faa_phandle, 0, IPL_USB,
- 0, xhci_intr, sc);
+ FDT_INTR_MPSAFE, xhci_intr, sc);
if (psc->sc_ih == NULL) {
aprint_error_dev(self, "failed to establish interrupt on %s\n",
intrstr);
@@ -224,7 +236,7 @@ tegra_xusb_attach(device_t parent, devic
}
psc->sc_ih_mbox = fdtbus_intr_establish(faa->faa_phandle, 1, IPL_VM,
- 0, tegra_xusb_intr_mbox, psc);
+ FDT_INTR_MPSAFE, tegra_xusb_intr_mbox, psc);
if (psc->sc_ih_mbox == NULL) {
aprint_error_dev(self, "failed to establish interrupt on %s\n",
intrstr);
@@ -282,7 +294,7 @@ tegra_xusb_attach(device_t parent, devic
tegra_xusb_attach_check(sc, psc->sc_clk_ss_src == NULL,
"failed to get xusb_ss_src clock");
- if (psc->sc_type == XUSB_T124) {
+ if (psc->sc_scale_ss_clock) {
rate = clk_get_rate(psc->sc_clk_ss_src);
DPRINTF(sc->sc_dev, "xusb_ss_src rate %u\n", rate);
error = clk_set_rate(psc->sc_clk_ss_src, 2000000);
@@ -397,7 +409,6 @@ tegra_xusb_mountroot(device_t self)
val = csb_read_4(psc, XUSB_CSB_FALCON_CPUCTL_REG);
DPRINTF(sc->sc_dev, "XUSB_FALC_CPUCTL 0x%x\n", val);
-
error = xhci_init(sc);
if (error) {
aprint_error_dev(self, "init failed, error=%d\n", error);
@@ -408,6 +419,8 @@ tegra_xusb_mountroot(device_t self)
sc->sc_child2 = config_found(self, &sc->sc_bus2, usbctlprint);
+ xhci_start(sc);
+
error = xusb_mailbox_send(psc, 0x01000000);
if (error) {
aprint_error_dev(self, "send failed, error=%d\n", error);
@@ -456,23 +469,28 @@ tegra_xusb_intr_mbox(void *v)
break;
case 4:
case 5:
- DPRINTF(sc->sc_dev, "SSPI_CLOCK %u\n", data * 1000);
- rate = clk_get_rate(psc->sc_clk_ss_src);
- DPRINTF(sc->sc_dev, "rate of psc->sc_clk_ss_src %u\n",
- rate);
- error = clk_set_rate(psc->sc_clk_ss_src, data * 1000);
- if (error != 0)
- goto clk_fail;
- rate = clk_get_rate(psc->sc_clk_ss_src);
- DPRINTF(sc->sc_dev,
- "rate of psc->sc_clk_ss_src %u after\n", rate);
- if (data == (rate / 1000)) {
+ if (psc->sc_scale_ss_clock) {
+ DPRINTF(sc->sc_dev, "SSPI_CLOCK %u\n", data * 1000);
+ rate = clk_get_rate(psc->sc_clk_ss_src);
+ DPRINTF(sc->sc_dev, "rate of psc->sc_clk_ss_src %u\n",
+ rate);
+ error = clk_set_rate(psc->sc_clk_ss_src, data * 1000);
+ if (error != 0)
+ goto clk_fail;
+ rate = clk_get_rate(psc->sc_clk_ss_src);
+ DPRINTF(sc->sc_dev,
+ "rate of psc->sc_clk_ss_src %u after\n", rate);
+ if (data == (rate / 1000)) {
+ msg = __SHIFTIN(128, MAILBOX_DATA_TYPE) |
+ __SHIFTIN(rate / 1000, MAILBOX_DATA_DATA);
+ } else
+clk_fail:
+ msg = __SHIFTIN(129, MAILBOX_DATA_TYPE) |
+ __SHIFTIN(rate / 1000, MAILBOX_DATA_DATA);
+ } else {
msg = __SHIFTIN(128, MAILBOX_DATA_TYPE) |
- __SHIFTIN(rate / 1000, MAILBOX_DATA_DATA);
- } else
-clk_fail:
- msg = __SHIFTIN(129, MAILBOX_DATA_TYPE) |
- __SHIFTIN(rate / 1000, MAILBOX_DATA_DATA);
+ __SHIFTIN(data, MAILBOX_DATA_DATA);
+ }
xusb_mailbox_send(psc, msg);
break;
case 9:
Index: src/sys/arch/arm/nvidia/tegra210_xusbpad.c
diff -u src/sys/arch/arm/nvidia/tegra210_xusbpad.c:1.6 src/sys/arch/arm/nvidia/tegra210_xusbpad.c:1.7
--- src/sys/arch/arm/nvidia/tegra210_xusbpad.c:1.6 Sun Sep 24 20:09:53 2017
+++ src/sys/arch/arm/nvidia/tegra210_xusbpad.c Mon Sep 25 00:03:34 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra210_xusbpad.c,v 1.6 2017/09/24 20:09:53 jmcneill Exp $ */
+/* $NetBSD: tegra210_xusbpad.c,v 1.7 2017/09/25 00:03:34 jmcneill Exp $ */
/*-
* Copyright (c) 2017 Jared McNeill <[email protected]>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tegra210_xusbpad.c,v 1.6 2017/09/24 20:09:53 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra210_xusbpad.c,v 1.7 2017/09/25 00:03:34 jmcneill Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -66,6 +66,33 @@ __KERNEL_RCSID(0, "$NetBSD: tegra210_xus
#define XUSB_PADCTL_USB3_PAD_MUX_FORCE_SATA_PAD_IDDQ_DISABLE __BIT(8)
#define XUSB_PADCTL_USB3_PAD_MUX_FORCE_PCIE_PAD_IDDQ_DISABLE(n) __BIT(1 + (n))
+#define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPADn_CTL_1_REG(n) (0x84 + (n) * 0x40)
+#define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPADn_CTL_1_VREG_LEV __BITS(8,7)
+#define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPADn_CTL_1_VREG_FIX18 __BIT(6)
+
+#define XUSB_PADCTL_USB2_OTG_PADn_CTL_0_REG(n) (0x88 + (n) * 0x40)
+#define XUSB_PADCTL_USB2_OTG_PADn_CTL_0_PD_ZI __BIT(29)
+#define XUSB_PADCTL_USB2_OTG_PADn_CTL_0_PD2 __BIT(27)
+#define XUSB_PADCTL_USB2_OTG_PADn_CTL_0_PD __BIT(26)
+#define XUSB_PADCTL_USB2_OTG_PADn_CTL_0_HS_CURR_LEVEL __BITS(5,0)
+
+#define XUSB_PADCTL_USB2_OTG_PADn_CTL_1_REG(n) (0x8c + (n) * 0x40)
+#define XUSB_PADCTL_USB2_OTG_PADn_CTL_1_RPD_CTRL __BITS(30,26)
+#define XUSB_PADCTL_USB2_OTG_PADn_CTL_1_TERM_RANGE_ADJ __BITS(6,3)
+#define XUSB_PADCTL_USB2_OTG_PADn_CTL_1_PD_DR __BIT(2)
+#define XUSB_PADCTL_USB2_OTG_PADn_CTL_1_PD_DISC_OVRD __BIT(1)
+#define XUSB_PADCTL_USB2_OTG_PADn_CTL_1_PD_CHRP_OVRD __BIT(0)
+
+#define XUSB_PADCTL_USB2_BIAS_PAD_CTL_0_REG 0x284
+#define XUSB_PADCTL_USB2_BIAS_PAD_CTL_0_PD __BIT(11)
+#define XUSB_PADCTL_USB2_BIAS_PAD_CTL_0_HS_DISCON_LEVEL __BITS(5,3)
+#define XUSB_PADCTL_USB2_BIAS_PAD_CTL_0_HS_SQUELCH_LEVEL __BITS(2,0)
+
+#define XUSB_PADCTL_USB2_BIAS_PAD_CTL_1_REG 0x288
+#define XUSB_PADCTL_USB2_BIAS_PAD_CTL_1_PD_TRK __BIT(26)
+#define XUSB_PADCTL_USB2_BIAS_PAD_CTL_1_TRK_DONE_RESET_TIMER __BITS(25,19)
+#define XUSB_PADCTL_USB2_BIAS_PAD_CTL_1_TRK_START_TIMER __BITS(18,12)
+
#define XUSB_PADCTL_UPHY_PLL_P0_CTL_1_REG 0x360
#define XUSB_PADCTL_UPHY_PLL_P0_CTL_1_FREQ_PSDIV __BITS(29,28)
#define XUSB_PADCTL_UPHY_PLL_P0_CTL_1_FREQ_NDIV __BITS(27,20)
@@ -112,6 +139,14 @@ __KERNEL_RCSID(0, "$NetBSD: tegra210_xus
#define XUSB_PADCTL_UPHY_USB3_PADn_ECTL_6_REG(n) (0xa74 + (n) * 0x40)
+#define FUSE_SKUCALIB_REG 0xf0
+#define FUSE_SKUCALIB_HS_CURR_LEVEL(n) \
+ ((n) == 0 ? __BITS(6,0) : __BITS(((n) - 1) * 6 + 17, ((n) - 1) * 6 + 11))
+#define FUSE_SKUCALIB_HS_TERM_RANGE_ADJ __BITS(10,7)
+
+#define FUSE_USBCALIB_REG 0x250
+#define FUSE_USBCALIB_EXT_RPD_CTRL __BITS(4,0)
+
struct tegra210_xusbpad_softc {
device_t sc_dev;
int sc_phandle;
@@ -278,6 +313,59 @@ tegra210_xusbpad_lane_enable_pcie(struct
XUSB_PADCTL_USB3_PAD_MUX_FORCE_PCIE_PAD_IDDQ_DISABLE(index), 0);
}
+static void
+tegra210_xusbpad_lane_enable_usb2(struct tegra210_xusbpad_softc *sc, int index)
+{
+ uint32_t skucalib, usbcalib;
+
+ skucalib = tegra_fuse_read(FUSE_SKUCALIB_REG);
+ const u_int hs_curr_level = __SHIFTOUT(skucalib, FUSE_SKUCALIB_HS_CURR_LEVEL((u_int)index));
+ const u_int hs_term_range_adj = __SHIFTOUT(skucalib, FUSE_SKUCALIB_HS_TERM_RANGE_ADJ);
+
+ usbcalib = tegra_fuse_read(FUSE_USBCALIB_REG);
+ const u_int ext_rpd_ctrl = __SHIFTOUT(usbcalib, FUSE_USBCALIB_EXT_RPD_CTRL);
+
+ SETCLR4(sc, XUSB_PADCTL_USB2_PAD_MUX_REG,
+ __SHIFTIN(XUSB_PADCTL_USB2_PAD_MUX_USB2_BIAS_PAD_XUSB,
+ XUSB_PADCTL_USB2_PAD_MUX_USB2_BIAS_PAD),
+ XUSB_PADCTL_USB2_PAD_MUX_USB2_BIAS_PAD);
+
+ SETCLR4(sc, XUSB_PADCTL_USB2_BIAS_PAD_CTL_0_REG,
+ __SHIFTIN(0x7, XUSB_PADCTL_USB2_BIAS_PAD_CTL_0_HS_DISCON_LEVEL) |
+ __SHIFTIN(0x0, XUSB_PADCTL_USB2_BIAS_PAD_CTL_0_HS_SQUELCH_LEVEL),
+ XUSB_PADCTL_USB2_BIAS_PAD_CTL_0_HS_DISCON_LEVEL |
+ XUSB_PADCTL_USB2_BIAS_PAD_CTL_0_HS_SQUELCH_LEVEL);
+ SETCLR4(sc, XUSB_PADCTL_USB2_OTG_PADn_CTL_0_REG(index),
+ __SHIFTIN(hs_curr_level, XUSB_PADCTL_USB2_OTG_PADn_CTL_0_HS_CURR_LEVEL),
+ XUSB_PADCTL_USB2_OTG_PADn_CTL_0_HS_CURR_LEVEL |
+ XUSB_PADCTL_USB2_OTG_PADn_CTL_0_PD |
+ XUSB_PADCTL_USB2_OTG_PADn_CTL_0_PD2 |
+ XUSB_PADCTL_USB2_OTG_PADn_CTL_0_PD_ZI);
+ SETCLR4(sc, XUSB_PADCTL_USB2_OTG_PADn_CTL_1_REG(index),
+ __SHIFTIN(hs_term_range_adj, XUSB_PADCTL_USB2_OTG_PADn_CTL_1_TERM_RANGE_ADJ) |
+ __SHIFTIN(ext_rpd_ctrl, XUSB_PADCTL_USB2_OTG_PADn_CTL_1_RPD_CTRL),
+ XUSB_PADCTL_USB2_OTG_PADn_CTL_1_TERM_RANGE_ADJ |
+ XUSB_PADCTL_USB2_OTG_PADn_CTL_1_RPD_CTRL |
+ XUSB_PADCTL_USB2_OTG_PADn_CTL_1_PD_DR |
+ XUSB_PADCTL_USB2_OTG_PADn_CTL_1_PD_CHRP_OVRD |
+ XUSB_PADCTL_USB2_OTG_PADn_CTL_1_PD_DISC_OVRD);
+ SETCLR4(sc, XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPADn_CTL_1_REG(index),
+ XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPADn_CTL_1_VREG_FIX18,
+ XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPADn_CTL_1_VREG_LEV);
+
+ SETCLR4(sc, XUSB_PADCTL_USB2_BIAS_PAD_CTL_1_REG,
+ __SHIFTIN(0x1e, XUSB_PADCTL_USB2_BIAS_PAD_CTL_1_TRK_START_TIMER) |
+ __SHIFTIN(0xa, XUSB_PADCTL_USB2_BIAS_PAD_CTL_1_TRK_DONE_RESET_TIMER),
+ XUSB_PADCTL_USB2_BIAS_PAD_CTL_1_TRK_START_TIMER |
+ XUSB_PADCTL_USB2_BIAS_PAD_CTL_1_TRK_DONE_RESET_TIMER);
+ SETCLR4(sc, XUSB_PADCTL_USB2_BIAS_PAD_CTL_0_REG,
+ 0, XUSB_PADCTL_USB2_BIAS_PAD_CTL_0_PD);
+ delay(1);
+ SETCLR4(sc, XUSB_PADCTL_USB2_BIAS_PAD_CTL_1_REG,
+ 0, XUSB_PADCTL_USB2_BIAS_PAD_CTL_1_PD_TRK);
+ delay(50);
+}
+
#define XUSBPAD_LANE(n, i, r, m, f, ef) \
{ \
.name = (n), \
@@ -299,13 +387,13 @@ static const struct tegra210_xusbpad_lan
void (*enable)(struct tegra210_xusbpad_softc *, int);
} tegra210_xusbpad_lanes[] = {
XUSBPAD_LANE("usb2-0", 0, 0x04, __BITS(1,0), tegra210_xusbpad_usb2_func,
- NULL),
+ tegra210_xusbpad_lane_enable_usb2),
XUSBPAD_LANE("usb2-1", 1, 0x04, __BITS(3,2), tegra210_xusbpad_usb2_func,
- NULL),
+ tegra210_xusbpad_lane_enable_usb2),
XUSBPAD_LANE("usb2-2", 2, 0x04, __BITS(5,4), tegra210_xusbpad_usb2_func,
- NULL),
+ tegra210_xusbpad_lane_enable_usb2),
XUSBPAD_LANE("usb2-3", 3, 0x04, __BITS(7,6), tegra210_xusbpad_usb2_func,
- NULL),
+ tegra210_xusbpad_lane_enable_usb2),
XUSBPAD_LANE("hsic-0", 0, 0x04, __BIT(14), tegra210_xusbpad_hsic_func,
NULL),
@@ -662,11 +750,6 @@ tegra210_xusbpad_xhci_enable(device_t de
{
struct tegra210_xusbpad_softc * const sc = device_private(dev);
- SETCLR4(sc, XUSB_PADCTL_USB2_PAD_MUX_REG,
- __SHIFTIN(XUSB_PADCTL_USB2_PAD_MUX_USB2_BIAS_PAD_XUSB,
- XUSB_PADCTL_USB2_PAD_MUX_USB2_BIAS_PAD),
- XUSB_PADCTL_USB2_PAD_MUX_USB2_BIAS_PAD);
-
tegra210_xusbpad_enable(sc);
}