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);
 }
 

Reply via email to