Module Name:    src
Committed By:   jakllsch
Date:           Thu Sep  8 00:38:23 UTC 2016

Modified Files:
        src/sys/arch/arm/nvidia: tegra124_car.c tegra124_carreg.h

Log Message:
Add Tegra124 CAR bits to support the XUSB xHCI core.


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/nvidia/tegra124_car.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/nvidia/tegra124_carreg.h

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/tegra124_car.c
diff -u src/sys/arch/arm/nvidia/tegra124_car.c:1.5 src/sys/arch/arm/nvidia/tegra124_car.c:1.6
--- src/sys/arch/arm/nvidia/tegra124_car.c:1.5	Fri Sep  2 19:06:58 2016
+++ src/sys/arch/arm/nvidia/tegra124_car.c	Thu Sep  8 00:38:23 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra124_car.c,v 1.5 2016/09/02 19:06:58 jakllsch Exp $ */
+/* $NetBSD: tegra124_car.c,v 1.6 2016/09/08 00:38:23 jakllsch Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <[email protected]>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tegra124_car.c,v 1.5 2016/09/02 19:06:58 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra124_car.c,v 1.6 2016/09/08 00:38:23 jakllsch Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -417,6 +417,14 @@ static const char *mux_disp_p[] =
 static const char *mux_hdmi_p[] =
 	{ "pll_p_out0", "pll_m_out0", "pll_d_out0", "pll_a_out0", "pll_c_out0",
 	  "pll_d2_out0", "clk_m" };
+static const char *mux_xusb_host_p[] =
+	{ "clk_m", "pll_p_out0", "pll_c2_out0", "pll_c_out0", "pll_c3_out0",
+	  "pll_re_out" };
+static const char *mux_xusb_ss_p[] =
+	{ "clk_m", "pll_re_out", "clk_s", "pll_u_480",
+	  "pll_c_out0", "pll_c2_out0", "pll_c3_out0", NULL };
+static const char *mux_xusb_fs_p[] =
+	{ "clk_m", NULL, "pll_u_48", NULL, "pll_p_out0", NULL, "pll_u_480" };
 
 static struct tegra_clk tegra124_car_clocks[] = {
 	CLK_FIXED("clk_m", TEGRA_REF_FREQ),
@@ -435,6 +443,8 @@ static struct tegra_clk tegra124_car_clo
 		CAR_PLLD_BASE_DIVM, CAR_PLLD_BASE_DIVN, CAR_PLLD_BASE_DIVP),
 	CLK_PLL("pll_d2", "clk_m", CAR_PLLD2_BASE_REG,
 		CAR_PLLD2_BASE_DIVM, CAR_PLLD2_BASE_DIVN, CAR_PLLD2_BASE_DIVP),
+	CLK_PLL("pll_re", "clk_m", CAR_PLLREFE_BASE_REG,
+		CAR_PLLREFE_BASE_DIVM, CAR_PLLREFE_BASE_DIVN, CAR_PLLREFE_BASE_DIVP),
 
 	CLK_FIXED_DIV("pll_p_out0", "pll_p", 1),
 	CLK_FIXED_DIV("pll_u_480", "pll_u", 1),
@@ -444,6 +454,7 @@ static struct tegra_clk tegra124_car_clo
 	CLK_FIXED_DIV("pll_d_out", "pll_d", 1),
 	CLK_FIXED_DIV("pll_d_out0", "pll_d", 2),
 	CLK_FIXED_DIV("pll_d2_out0", "pll_d2", 1),
+	CLK_FIXED_DIV("pll_re_out", "pll_re", 1),
 
 	CLK_MUX("mux_uarta", CAR_CLKSRC_UARTA_REG, CAR_CLKSRC_UART_SRC,
 		mux_uart_p),
@@ -500,6 +511,18 @@ static struct tegra_clk tegra124_car_clo
 	CLK_MUX("mux_hdmi",
 		CAR_CLKSRC_HDMI_REG, CAR_CLKSRC_HDMI_SRC,
 		mux_hdmi_p),
+	CLK_MUX("mux_xusb_host",
+		CAR_CLKSRC_XUSB_HOST_REG, CAR_CLKSRC_XUSB_HOST_SRC,
+		mux_xusb_host_p),
+	CLK_MUX("mux_xusb_falcon",
+		CAR_CLKSRC_XUSB_FALCON_REG, CAR_CLKSRC_XUSB_FALCON_SRC,
+		mux_xusb_host_p),
+	CLK_MUX("mux_xusb_ss",
+		CAR_CLKSRC_XUSB_SS_REG, CAR_CLKSRC_XUSB_SS_SRC,
+		mux_xusb_ss_p),
+	CLK_MUX("mux_xusb_fs",
+		CAR_CLKSRC_XUSB_FS_REG, CAR_CLKSRC_XUSB_FS_SRC,
+		mux_xusb_fs_p),
 
 	CLK_DIV("div_uarta", "mux_uarta",
 		CAR_CLKSRC_UARTA_REG, CAR_CLKSRC_UART_DIV),
@@ -559,6 +582,14 @@ static struct tegra_clk tegra124_car_clo
 		CAR_CLKSRC_HDMI_REG, CAR_CLKSRC_HDMI_DIV),
 	CLK_DIV("div_pll_p_out5", "pll_p",
 		CAR_PLLP_OUTC_REG, CAR_PLLP_OUTC_OUT5_RATIO),
+	CLK_DIV("xusb_host_src", "mux_xusb_host",
+		CAR_CLKSRC_XUSB_HOST_REG, CAR_CLKSRC_XUSB_HOST_DIV),
+	CLK_DIV("xusb_ss_src", "mux_xusb_ss",
+		CAR_CLKSRC_XUSB_SS_REG, CAR_CLKSRC_XUSB_SS_DIV),
+	CLK_DIV("xusb_fs_src", "mux_xusb_fs",
+		CAR_CLKSRC_XUSB_FS_REG, CAR_CLKSRC_XUSB_FS_DIV),
+	CLK_DIV("xusb_falcon_src", "mux_xusb_falcon",
+		CAR_CLKSRC_XUSB_FALCON_REG, CAR_CLKSRC_XUSB_FALCON_DIV),
 
 	CLK_GATE_L("uarta", "div_uarta", CAR_DEV_L_UARTA),
 	CLK_GATE_L("uartb", "div_uartb", CAR_DEV_L_UARTB),
@@ -603,6 +634,8 @@ static struct tegra_clk tegra124_car_clo
 	CLK_GATE_H("hdmi", "div_hdmi", CAR_DEV_H_HDMI),
 	CLK_GATE_SIMPLE("pll_p_out5", "div_pll_p_out5",
 		CAR_PLLP_OUTC_REG, CAR_PLLP_OUTC_OUT5_CLKEN),
+	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),
 };
 
 struct tegra124_car_rst {
@@ -652,6 +685,7 @@ struct tegra124_car_softc {
 
 static void	tegra124_car_init(struct tegra124_car_softc *);
 static void	tegra124_car_utmip_init(struct tegra124_car_softc *);
+static void	tegra124_car_xusb_init(struct tegra124_car_softc *);
 
 static void	tegra124_car_rnd_attach(device_t);
 static void	tegra124_car_rnd_intr(void *);
@@ -722,6 +756,7 @@ static void
 tegra124_car_init(struct tegra124_car_softc *sc)
 {
 	tegra124_car_utmip_init(sc);
+	tegra124_car_xusb_init(sc);
 }
 
 static void
@@ -758,6 +793,51 @@ tegra124_car_utmip_init(struct tegra124_
 }
 
 static void
+tegra124_car_xusb_init(struct tegra124_car_softc *sc)
+{
+	const bus_space_tag_t bst = sc->sc_bst;
+	const bus_space_handle_t bsh = sc->sc_bsh;
+	uint32_t val;
+
+	/* XXX do this all better */
+
+	bus_space_write_4(bst, bsh, CAR_CLK_ENB_W_SET_REG, CAR_DEV_W_XUSB);
+
+	tegra_reg_set_clear(bst, bsh, CAR_PLLREFE_MISC_REG,
+	    0, CAR_PLLREFE_MISC_IDDQ);
+	val = __SHIFTIN(25, CAR_PLLREFE_BASE_DIVN) |
+	    __SHIFTIN(1, CAR_PLLREFE_BASE_DIVM);
+	bus_space_write_4(bst, bsh, CAR_PLLREFE_BASE_REG, val);
+
+	tegra_reg_set_clear(bst, bsh, CAR_PLLREFE_MISC_REG,
+	    0, CAR_PLLREFE_MISC_LOCK_OVERRIDE);
+	tegra_reg_set_clear(bst, bsh, CAR_PLLREFE_BASE_REG,
+	    CAR_PLLREFE_BASE_ENABLE, 0);
+	tegra_reg_set_clear(bst, bsh, CAR_PLLREFE_MISC_REG,
+	    CAR_PLLREFE_MISC_LOCK_ENABLE, 0);
+
+	do {
+		delay(2);
+		val = bus_space_read_4(bst, bsh, CAR_PLLREFE_MISC_REG);
+	} while ((val & CAR_PLLREFE_MISC_LOCK) == 0);
+
+	tegra_reg_set_clear(bst, bsh, CAR_PLLE_MISC_REG,
+	    CAR_PLLE_MISC_IDDQ_SWCTL, CAR_PLLE_MISC_IDDQ_OVERRIDE);
+	tegra_reg_set_clear(bst, bsh, CAR_PLLE_BASE_REG,
+	    CAR_PLLE_BASE_ENABLE, 0);
+	tegra_reg_set_clear(bst, bsh, CAR_PLLE_MISC_REG,
+	    CAR_PLLE_MISC_LOCK_ENABLE, 0);
+
+	do {
+		delay(2);
+		val = bus_space_read_4(bst, bsh, CAR_PLLE_MISC_REG);
+	} while ((val & CAR_PLLE_MISC_LOCK) == 0);
+
+	tegra_reg_set_clear(bst, bsh, CAR_CLKSRC_XUSB_SS_REG,
+	    CAR_CLKSRC_XUSB_SS_HS_CLK_BYPASS, 0);
+}
+
+static void
 tegra124_car_rnd_attach(device_t self)
 {
 	struct tegra124_car_softc * const sc = device_private(self);

Index: src/sys/arch/arm/nvidia/tegra124_carreg.h
diff -u src/sys/arch/arm/nvidia/tegra124_carreg.h:1.2 src/sys/arch/arm/nvidia/tegra124_carreg.h:1.3
--- src/sys/arch/arm/nvidia/tegra124_carreg.h:1.2	Wed Aug 17 19:08:18 2016
+++ src/sys/arch/arm/nvidia/tegra124_carreg.h	Thu Sep  8 00:38:23 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra124_carreg.h,v 1.2 2016/08/17 19:08:18 jakllsch Exp $ */
+/* $NetBSD: tegra124_carreg.h,v 1.3 2016/09/08 00:38:23 jakllsch Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <[email protected]>
@@ -132,6 +132,10 @@
 #define CAR_PLLE_BASE_DIVM		__BITS(7,0)
 
 #define CAR_PLLE_MISC_REG	0xec
+#define CAR_PLLE_MISC_IDDQ_SWCTL	__BIT(14)
+#define CAR_PLLE_MISC_IDDQ_OVERRIDE	__BIT(13)
+#define CAR_PLLE_MISC_LOCK		__BIT(11)
+#define CAR_PLLE_MISC_LOCK_ENABLE	__BIT(9)
 
 #define CAR_PLLD2_BASE_REG	0x4b8
 #define CAR_PLLD2_BASE_BYPASS		__BIT(31)
@@ -384,6 +388,7 @@
 #define CAR_DEV_W_ADX0			__BIT(26)
 #define CAR_DEV_W_AMX0			__BIT(25)
 #define CAR_DEV_W_ENTROPY		__BIT(21)
+#define CAR_DEV_W_XUSB			__BIT(15)
 #define CAR_DEV_W_XUSB_PADCTL		__BIT(14)
 #define CAR_DEV_W_CEC			__BIT(8)
 #define CAR_DEV_W_SATACOLD		__BIT(1)
@@ -509,6 +514,52 @@
 #define CAR_SATA_PLL_CFG1_PADPLL_PU_POST_DLY	__BITS(15,8)
 #define CAR_SATA_PLL_CFG1_LANE_IDDQ2_PADPLL_IDDQ_DLY __BITS(7,0)
 
+#define CAR_PLLREFE_BASE_REG		0x4c4
+#define CAR_PLLREFE_BASE_BYPASS			__BIT(31)
+#define CAR_PLLREFE_BASE_ENABLE			__BIT(30)
+#define CAR_PLLREFE_BASE_REF_DIS		__BIT(29)
+#define CAR_PLLREFE_BASE_KCP			__BITS(28,27)
+#define CAR_PLLREFE_BASE_KVCO			__BIT(26)
+#define CAR_PLLREFE_BASE_DIVP			__BITS(19,16)
+#define CAR_PLLREFE_BASE_DIVN			__BITS(15,8)
+#define CAR_PLLREFE_BASE_DIVM			__BITS(7,0)
+
+#define CAR_PLLREFE_MISC_REG		0x4c8
+#define CAR_PLLREFE_MISC_LOCK_ENABLE		__BIT(30)
+#define CAR_PLLREFE_MISC_LOCK_OVERRIDE		__BIT(29)
+#define CAR_PLLREFE_MISC_LOCK			__BIT(24)
+#define CAR_PLLREFE_MISC_IDDQ			__BIT(16)
+
+#define CAR_XUSBIO_PLL_CFG0_REG		0x51c
+#define CAR_XUSBIO_PLL_CFG0_SEQ_STATE		__BITS(27,26)
+#define CAR_XUSBIO_PLL_CFG0_SEQ_START_STATE	__BIT(25)
+#define CAR_XUSBIO_PLL_CFG0_SEQ_ENABLE		__BIT(24)
+#define CAR_XUSBIO_PLL_CFG0_PADPLL_USE_LOCKDET	__BIT(6)
+#define CAR_XUSBIO_PLL_CFG0_SEQ_RESET_INPUT_VALUE	__BIT(5)
+#define CAR_XUSBIO_PLL_CFG0_SEQ_IN_SWCTL	__BIT(4)
+#define CAR_XUSBIO_PLL_CFG0_CLK_ENABLE_OVERRIDE	__BIT(3)
+#define CAR_XUSBIO_PLL_CFG0_CLK_ENABLE_SWCTL	__BIT(2)
+#define CAR_XUSBIO_PLL_CFG0_PADPLL_RESET_OVERRIDE_VALUE __BIT(1)
+#define CAR_XUSBIO_PLL_CFG0_PADPLL_RESET_SWCTL	__BIT(0)
+
+#define CAR_CLKSRC_XUSB_HOST_REG	0x600
+#define CAR_CLKSRC_XUSB_HOST_SRC		__BITS(31,29)
+#define CAR_CLKSRC_XUSB_HOST_DIV		__BITS(7,0)
+
+#define CAR_CLKSRC_XUSB_FALCON_REG	0x604
+#define CAR_CLKSRC_XUSB_FALCON_SRC		__BITS(31,29)
+#define CAR_CLKSRC_XUSB_FALCON_DIV		__BITS(7,0)
+
+#define CAR_CLKSRC_XUSB_FS_REG		0x608
+#define CAR_CLKSRC_XUSB_FS_SRC			__BITS(31,29)
+#define CAR_CLKSRC_XUSB_FS_DIV			__BITS(7,0)
+
+#define CAR_CLKSRC_XUSB_SS_REG		0x610
+#define CAR_CLKSRC_XUSB_SS_SRC			__BITS(31,29)
+#define CAR_CLKSRC_XUSB_SS_HS_CLK_BYPASS	__BIT(25)
+#define CAR_CLKSRC_XUSB_SS_SS_CLK_BYPASS	__BIT(24)
+#define CAR_CLKSRC_XUSB_SS_DIV			__BITS(7,0)
+
 #define CAR_CLKSRC_SOC_THERM_REG	0x644
 #define CAR_CLKSRC_SOC_THERM_SRC	__BITS(31,29)
 #define CAR_CLKSRC_SOC_THERM_SRC_PLLP_OUT0	2

Reply via email to