Module Name: src Committed By: jmcneill Date: Tue Sep 26 16:12:45 UTC 2017
Modified Files: src/sys/arch/arm/nvidia: files.tegra tegra210_car.c tegra210_xusbpad.c tegra_pcie.c tegra_pciereg.h tegra_xusb.c src/sys/arch/evbarm/conf: TEGRA Log Message: More PCIe / XUSBPAD initialization goo for Tegra210. To generate a diff of this commit: cvs rdiff -u -r1.44 -r1.45 src/sys/arch/arm/nvidia/files.tegra cvs rdiff -u -r1.13 -r1.14 src/sys/arch/arm/nvidia/tegra210_car.c cvs rdiff -u -r1.7 -r1.8 src/sys/arch/arm/nvidia/tegra210_xusbpad.c cvs rdiff -u -r1.20 -r1.21 src/sys/arch/arm/nvidia/tegra_pcie.c cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/nvidia/tegra_pciereg.h cvs rdiff -u -r1.11 -r1.12 src/sys/arch/arm/nvidia/tegra_xusb.c cvs rdiff -u -r1.32 -r1.33 src/sys/arch/evbarm/conf/TEGRA 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/files.tegra diff -u src/sys/arch/arm/nvidia/files.tegra:1.44 src/sys/arch/arm/nvidia/files.tegra:1.45 --- src/sys/arch/arm/nvidia/files.tegra:1.44 Fri Sep 22 14:36:22 2017 +++ src/sys/arch/arm/nvidia/files.tegra Tue Sep 26 16:12:45 2017 @@ -1,4 +1,4 @@ -# $NetBSD: files.tegra,v 1.44 2017/09/22 14:36:22 jmcneill Exp $ +# $NetBSD: files.tegra,v 1.45 2017/09/26 16:12:45 jmcneill Exp $ # # Configuration info for NVIDIA Tegra ARM Peripherals # @@ -88,10 +88,13 @@ attach tegra124xpad at fdt with tegra124 file arch/arm/nvidia/tegra124_xusbpad.c tegra124_xusbpad # XUSB PADCTL (Tegra210) -device tegra210xpad: tegra_xusbpad +device tegra210xpad { }: tegra_xusbpad +device tegra210xphy: tegra210xpad attach tegra210xpad at fdt with tegra210_xusbpad +attach tegra210xphy at tegra210xpad file arch/arm/nvidia/tegra210_xusbpad.c tegra210_xusbpad + # UART attach com at fdt with tegra_com file arch/arm/nvidia/tegra_com.c tegra_com needs-flag Index: src/sys/arch/arm/nvidia/tegra210_car.c diff -u src/sys/arch/arm/nvidia/tegra210_car.c:1.13 src/sys/arch/arm/nvidia/tegra210_car.c:1.14 --- src/sys/arch/arm/nvidia/tegra210_car.c:1.13 Mon Sep 25 08:55:07 2017 +++ src/sys/arch/arm/nvidia/tegra210_car.c Tue Sep 26 16:12:45 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: tegra210_car.c,v 1.13 2017/09/25 08:55:07 jmcneill Exp $ */ +/* $NetBSD: tegra210_car.c,v 1.14 2017/09/26 16:12:45 jmcneill Exp $ */ /*- * Copyright (c) 2015-2017 Jared McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tegra210_car.c,v 1.13 2017/09/25 08:55:07 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tegra210_car.c,v 1.14 2017/09/26 16:12:45 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -609,6 +609,9 @@ struct tegra210_init_parent { { "XUSB_FS_SRC", "PLL_U_48M", 48000000, 0 }, { "PLL_U_OUT1", NULL, 48000000, 1 }, { "PLL_U_OUT2", NULL, 60000000, 1 }, + { "CML0", NULL, 0, 1 }, + { "AFI", NULL, 0, 1 }, + { "PCIE", NULL, 0, 1 }, }; struct tegra210_car_rst { @@ -817,9 +820,15 @@ tegra210_car_utmip_init(struct tegra210_ tegra_reg_set_clear(bst, bsh, CAR_UTMIP_PLL_CFG1_REG, 0x3, CAR_UTMIP_PLL_CFG1_XTAL_FREQ_COUNT); + bus_space_write_4(bst, bsh, CAR_CLK_ENB_U_SET_REG, CAR_DEV_U_AFI); + bus_space_write_4(bst, bsh, CAR_CLK_ENB_U_SET_REG, CAR_DEV_U_PCIE); + bus_space_write_4(bst, bsh, CAR_RST_DEV_L_CLR_REG, CAR_DEV_L_USBD); bus_space_write_4(bst, bsh, CAR_RST_DEV_H_CLR_REG, CAR_DEV_H_USB2); bus_space_write_4(bst, bsh, CAR_RST_DEV_W_CLR_REG, CAR_DEV_W_XUSB); + bus_space_write_4(bst, bsh, CAR_RST_DEV_U_CLR_REG, CAR_DEV_U_AFI); + bus_space_write_4(bst, bsh, CAR_RST_DEV_U_CLR_REG, CAR_DEV_U_PCIE); + bus_space_write_4(bst, bsh, CAR_RST_DEV_U_CLR_REG, CAR_DEV_U_PCIEXCLK); bus_space_write_4(bst, bsh, CAR_RST_DEV_Y_CLR_REG, CAR_DEV_Y_PEX_USB_UPHY); bus_space_write_4(bst, bsh, CAR_RST_DEV_Y_CLR_REG, CAR_DEV_Y_SATA_USB_UPHY); Index: src/sys/arch/arm/nvidia/tegra210_xusbpad.c diff -u src/sys/arch/arm/nvidia/tegra210_xusbpad.c:1.7 src/sys/arch/arm/nvidia/tegra210_xusbpad.c:1.8 --- src/sys/arch/arm/nvidia/tegra210_xusbpad.c:1.7 Mon Sep 25 00:03:34 2017 +++ src/sys/arch/arm/nvidia/tegra210_xusbpad.c Tue Sep 26 16:12:45 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: tegra210_xusbpad.c,v 1.7 2017/09/25 00:03:34 jmcneill Exp $ */ +/* $NetBSD: tegra210_xusbpad.c,v 1.8 2017/09/26 16:12:45 jmcneill Exp $ */ /*- * Copyright (c) 2017 Jared McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tegra210_xusbpad.c,v 1.7 2017/09/25 00:03:34 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tegra210_xusbpad.c,v 1.8 2017/09/26 16:12:45 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -158,6 +158,17 @@ struct tegra210_xusbpad_softc { bool sc_enabled; }; +struct tegra210_xusbpad_phy_softc { + device_t sc_dev; + int sc_phandle; + struct tegra210_xusbpad_softc *sc_xusbpad; +}; + +struct tegra210_xusbpad_phy_attach_args { + struct tegra210_xusbpad_softc *paa_xusbpad; + int paa_phandle; +}; + #define RD4(sc, reg) \ bus_space_read_4((sc)->sc_bst, (sc)->sc_bsh, (reg)) #define WR4(sc, reg, val) \ @@ -550,16 +561,18 @@ tegra210_xusbpad_configure_pads(struct t } } - /* Configure lanes */ + /* Attach PHYs */ phandle = of_find_firstchild_byname(phandle, "lanes"); if (phandle == -1) { aprint_error_dev(sc->sc_dev, "no 'pads/%s/lanes' node\n", name); return; } for (child = OF_child(phandle); child; child = OF_peer(child)) { - if (!fdtbus_status_okay(child)) - continue; - tegra210_xusbpad_configure_lane(sc, child); + struct tegra210_xusbpad_phy_attach_args paa = { + .paa_xusbpad = sc, + .paa_phandle = child + }; + config_found(sc->sc_dev, &paa, NULL); } } @@ -813,5 +826,70 @@ tegra210_xusbpad_attach(device_t parent, tegra210_xusbpad_configure_ports(sc); } +static void * +tegra210_xusbpad_phy_acquire(device_t dev, const void *data, size_t len) +{ + struct tegra210_xusbpad_phy_softc * const sc = device_private(dev); + + if (len != 0) + return NULL; + + return sc; +} + +static void +tegra210_xusbpad_phy_release(device_t dev, void *priv) +{ +}; + +static int +tegra210_xusbpad_phy_enable(device_t dev, void *priv, bool enable) +{ + struct tegra210_xusbpad_phy_softc * const sc = device_private(dev); + + if (enable == false) + return ENXIO; /* not implemented */ + + tegra210_xusbpad_configure_lane(sc->sc_xusbpad, sc->sc_phandle); + + return 0; +} + +static const struct fdtbus_phy_controller_func tegra210_xusbpad_phy_funcs = { + .acquire = tegra210_xusbpad_phy_acquire, + .release = tegra210_xusbpad_phy_release, + .enable = tegra210_xusbpad_phy_enable, +}; + CFATTACH_DECL_NEW(tegra210_xusbpad, sizeof(struct tegra210_xusbpad_softc), tegra210_xusbpad_match, tegra210_xusbpad_attach, NULL, NULL); + +static int +tegra210_xusbpad_phy_match(device_t parent, cfdata_t cf, void *aux) +{ + struct tegra210_xusbpad_phy_attach_args * const paa = aux; + + if (!fdtbus_status_okay(paa->paa_phandle)) + return 0; + + return 1; +} + +static void +tegra210_xusbpad_phy_attach(device_t parent, device_t self, void *aux) +{ + struct tegra210_xusbpad_phy_softc * const sc = device_private(self); + struct tegra210_xusbpad_phy_attach_args * const paa = aux; + + sc->sc_dev = self; + sc->sc_phandle = paa->paa_phandle; + sc->sc_xusbpad = paa->paa_xusbpad; + + aprint_naive("\n"); + aprint_normal(": %s\n", fdtbus_get_string(sc->sc_phandle, "name")); + + fdtbus_register_phy_controller(self, sc->sc_phandle, &tegra210_xusbpad_phy_funcs); +} + +CFATTACH_DECL_NEW(tegra210xphy, sizeof(struct tegra210_xusbpad_phy_softc), + tegra210_xusbpad_phy_match, tegra210_xusbpad_phy_attach, NULL, NULL); Index: src/sys/arch/arm/nvidia/tegra_pcie.c diff -u src/sys/arch/arm/nvidia/tegra_pcie.c:1.20 src/sys/arch/arm/nvidia/tegra_pcie.c:1.21 --- src/sys/arch/arm/nvidia/tegra_pcie.c:1.20 Mon Sep 25 08:55:27 2017 +++ src/sys/arch/arm/nvidia/tegra_pcie.c Tue Sep 26 16:12:45 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: tegra_pcie.c,v 1.20 2017/09/25 08:55:27 jmcneill Exp $ */ +/* $NetBSD: tegra_pcie.c,v 1.21 2017/09/26 16:12:45 jmcneill Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tegra_pcie.c,v 1.20 2017/09/25 08:55:27 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tegra_pcie.c,v 1.21 2017/09/26 16:12:45 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -48,6 +48,7 @@ __KERNEL_RCSID(0, "$NetBSD: tegra_pcie.c #include <arm/nvidia/tegra_reg.h> #include <arm/nvidia/tegra_pciereg.h> +#include <arm/nvidia/tegra_pmcreg.h> #include <arm/nvidia/tegra_var.h> #include <dev/fdt/fdtvar.h> @@ -74,6 +75,7 @@ struct tegra_pcie_softc { bus_dma_tag_t sc_dmat; bus_space_tag_t sc_bst; bus_space_handle_t sc_bsh_afi; + bus_space_handle_t sc_bsh_pads; bus_space_handle_t sc_bsh_rpconf; int sc_phandle; @@ -92,6 +94,7 @@ struct tegra_pcie_softc { static int tegra_pcie_intr(void *); static void tegra_pcie_init(pci_chipset_tag_t, void *); static void tegra_pcie_enable(struct tegra_pcie_softc *); +static void tegra_pcie_enable_ports(struct tegra_pcie_softc *); static void tegra_pcie_enable_clocks(struct tegra_pcie_softc *); static void tegra_pcie_setup(struct tegra_pcie_softc * const); static void tegra_pcie_conf_frag_map(struct tegra_pcie_softc * const, @@ -143,15 +146,19 @@ tegra_pcie_attach(device_t parent, devic struct fdt_attach_args * const faa = aux; struct extent *ioext, *memext, *pmemext; struct pcibus_attach_args pba; - bus_addr_t afi_addr, cs_addr; - bus_size_t afi_size, cs_size; + bus_addr_t afi_addr, cs_addr, pads_addr; + bus_size_t afi_size, cs_size, pads_size; char intrstr[128]; int error; - if (fdtbus_get_reg(faa->faa_phandle, 1, &afi_addr, &afi_size) != 0) { + if (fdtbus_get_reg_byname(faa->faa_phandle, "afi", &afi_addr, &afi_size) != 0) { aprint_error(": couldn't get afi registers\n"); return; } + if (fdtbus_get_reg_byname(faa->faa_phandle, "pads", &pads_addr, &pads_size) != 0) { + aprint_error(": couldn't get pads registers\n"); + return; + } #if notyet if (fdtbus_get_reg(faa->faa_phandle, 2, &cs_addr, &cs_size) != 0) { aprint_error(": couldn't get cs registers\n"); @@ -172,6 +179,12 @@ tegra_pcie_attach(device_t parent, devic aprint_error(": couldn't map afi registers: %d\n", error); return; } + error = bus_space_map(sc->sc_bst, pads_addr, pads_size, 0, + &sc->sc_bsh_pads); + if (error) { + aprint_error(": couldn't map afi registers: %d\n", error); + return; + } error = bus_space_map(sc->sc_bst, cs_addr, cs_size, 0, &sc->sc_bsh_rpconf); if (error) { @@ -187,6 +200,9 @@ tegra_pcie_attach(device_t parent, devic aprint_naive("\n"); aprint_normal(": PCIE\n"); + tegra_pmc_power(PMC_PARTID_PCX, true); + tegra_pmc_remove_clamping(PMC_PARTID_PCX); + tegra_pcie_enable_clocks(sc); if (!fdtbus_intr_str(faa->faa_phandle, 0, intrstr, sizeof(intrstr))) { @@ -232,6 +248,8 @@ tegra_pcie_attach(device_t parent, devic tegra_pcie_enable(sc); + tegra_pcie_enable_ports(sc); + memset(&pba, 0, sizeof(pba)); pba.pba_flags = PCI_FLAGS_MRL_OKAY | PCI_FLAGS_MRM_OKAY | @@ -338,10 +356,108 @@ tegra_pcie_enable_clocks(struct tegra_pc } static void +tegra_pcie_reset_port(struct tegra_pcie_softc * const sc, int index) +{ + uint32_t val; + + val = bus_space_read_4(sc->sc_bst, sc->sc_bsh_afi, AFI_PEXn_CTRL_REG(index)); + val &= ~AFI_PEXn_CTRL_RST_L; + bus_space_write_4(sc->sc_bst, sc->sc_bsh_afi, AFI_PEXn_CTRL_REG(index), val); + + delay(2000); + + val = bus_space_read_4(sc->sc_bst, sc->sc_bsh_afi, AFI_PEXn_CTRL_REG(index)); + val |= AFI_PEXn_CTRL_RST_L; + bus_space_write_4(sc->sc_bst, sc->sc_bsh_afi, AFI_PEXn_CTRL_REG(index), val); +} + +static void +tegra_pcie_enable_ports(struct tegra_pcie_softc * const sc) +{ + const u_int *data; + int child, len; + uint32_t val; + + for (child = OF_child(sc->sc_phandle); child; child = OF_peer(child)) { + if (!fdtbus_status_okay(child)) + continue; + data = fdtbus_get_prop(child, "reg", &len); + if (data == NULL || len < 4) + continue; + const u_int index = ((be32toh(data[0]) >> 11) & 0x1f) - 1; + + val = bus_space_read_4(sc->sc_bst, sc->sc_bsh_afi, AFI_PEXn_CTRL_REG(index)); + val |= AFI_PEXn_CTRL_CLKREQ_EN; + val |= AFI_PEXn_CTRL_REFCLK_EN; + val |= AFI_PEXn_CTRL_REFCLK_OVERRIDE_EN; + bus_space_write_4(sc->sc_bst, sc->sc_bsh_afi, AFI_PEXn_CTRL_REG(index), val); + + tegra_pcie_reset_port(sc, index); + } +} + +static void tegra_pcie_setup(struct tegra_pcie_softc * const sc) { + uint32_t val, cfg, lanes; + int child, len; + const u_int *data; size_t i; + /* Enable PLLE control */ + val = bus_space_read_4(sc->sc_bst, sc->sc_bsh_afi, AFI_PLLE_CONTROL_REG); + val &= ~AFI_PLLE_CONTROL_BYPASS_PADS2PLLE_CONTROL; + val |= AFI_PLLE_CONTROL_PADS2PLLE_CONTROL_EN; + bus_space_write_4(sc->sc_bst, sc->sc_bsh_afi, AFI_PLLE_CONTROL_REG, val); + + /* Disable PEX clock bias pad power down */ + bus_space_write_4(sc->sc_bst, sc->sc_bsh_afi, AFI_PEXBIAS_CTRL_REG, 0); + + /* Configure PCIE mode and enable ports */ + cfg = bus_space_read_4(sc->sc_bst, sc->sc_bsh_afi, AFI_PCIE_CONFIG_REG); + cfg |= AFI_PCIE_CONFIG_PCIECn_DISABLE_DEVICE(0); + cfg |= AFI_PCIE_CONFIG_PCIECn_DISABLE_DEVICE(1); + cfg &= ~AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG; + + lanes = 0; + for (child = OF_child(sc->sc_phandle); child; child = OF_peer(child)) { + if (!fdtbus_status_okay(child)) + continue; + data = fdtbus_get_prop(child, "reg", &len); + if (data == NULL || len < 4) + continue; + const u_int index = ((be32toh(data[0]) >> 11) & 0x1f) - 1; + if (of_getprop_uint32(child, "nvidia,num-lanes", &val) != 0) + continue; + lanes |= (val << (index << 3)); + cfg &= ~AFI_PCIE_CONFIG_PCIECn_DISABLE_DEVICE(index); + } + + switch (lanes) { + case 0x0104: + aprint_normal_dev(sc->sc_dev, "lane config: x4 x1\n"); + cfg |= __SHIFTIN(AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_4_1, + AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG); + break; + case 0x0102: + aprint_normal_dev(sc->sc_dev, "lane config: x2 x1\n"); + cfg |= __SHIFTIN(AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_2_1, + AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG); + break; + } + + bus_space_write_4(sc->sc_bst, sc->sc_bsh_afi, AFI_PCIE_CONFIG_REG, cfg); + + /* Configure refclk pad */ + const char * const tegra124_compat[] = { "nvidia,tegra124-pcie", NULL }; + if (of_match_compatible(sc->sc_phandle, tegra124_compat)) + bus_space_write_4(sc->sc_bst, sc->sc_bsh_pads, PADS_REFCLK_CFG0_REG, + 0x44ac44ac); + const char * const tegra210_compat[] = { "nvidia,tegra210-pcie", NULL }; + if (of_match_compatible(sc->sc_phandle, tegra210_compat)) + bus_space_write_4(sc->sc_bst, sc->sc_bsh_pads, PADS_REFCLK_CFG0_REG, + 0x90b890b8); + /* * Map PCI address spaces into ARM address space via * HyperTransport-like "FPCI". Index: src/sys/arch/arm/nvidia/tegra_pciereg.h diff -u src/sys/arch/arm/nvidia/tegra_pciereg.h:1.3 src/sys/arch/arm/nvidia/tegra_pciereg.h:1.4 --- src/sys/arch/arm/nvidia/tegra_pciereg.h:1.3 Sat Nov 14 01:38:58 2015 +++ src/sys/arch/arm/nvidia/tegra_pciereg.h Tue Sep 26 16:12:45 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: tegra_pciereg.h,v 1.3 2015/11/14 01:38:58 jakllsch Exp $ */ +/* $NetBSD: tegra_pciereg.h,v 1.4 2017/09/26 16:12:45 jmcneill Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -29,6 +29,9 @@ #ifndef _ARM_TEGRA_PCIEREG_H #define _ARM_TEGRA_PCIEREG_H +/* PADS */ +#define PADS_REFCLK_CFG0_REG 0xc8 + /* AFI */ #define AFI_AXI_NBAR 9 @@ -52,6 +55,11 @@ #define AFI_INTR_SIGNATURE_REG 0xbc #define AFI_SM_INTR_ENABLE_REG 0xc4 #define AFI_AFI_INTR_ENABLE_REG 0xc8 +#define AFI_PCIE_CONFIG_REG 0xf8 +#define AFI_PEXn_CTRL_REG(n) (0x110 + (n) * 8) +#define AFI_PEXn_STATUS_REG(n) (0x114 + (n) * 8) +#define AFI_PLLE_CONTROL_REG 0x160 +#define AFI_PEXBIAS_CTRL_REG 0x168 #define AFI_MSG_REG 0x190 #define AFI_INTR_MASK_MSI __BIT(8) @@ -60,6 +68,21 @@ #define AFI_INTR_CODE_INT_CODE __BITS(4,0) #define AFI_INTR_CODE_SM_MSG 6 +#define AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG __BITS(23,20) +#define AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_2_1 0 +#define AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_4_1 1 +#define AFI_PCIE_CONFIG_PCIECn_DISABLE_DEVICE(n) __BIT(1 + (n)) + +#define AFI_PEXn_CTRL_REFCLK_OVERRIDE_EN __BIT(4) +#define AFI_PEXn_CTRL_REFCLK_EN __BIT(3) +#define AFI_PEXn_CTRL_CLKREQ_EN __BIT(1) +#define AFI_PEXn_CTRL_RST_L __BIT(0) + +#define AFI_PLLE_CONTROL_BYPASS_PADS2PLLE_CONTROL __BIT(9) +#define AFI_PLLE_CONTROL_PADS2PLLE_CONTROL_EN __BIT(1) + +#define AFI_PEXBIAS_CTRL_PWRD __BIT(0) + #define AFI_MSG_INT1 __BITS(27,24) #define AFI_MSG_PM_PME1 __BIT(20) #define AFI_MSG_INT0 __BITS(11,8) Index: src/sys/arch/arm/nvidia/tegra_xusb.c diff -u src/sys/arch/arm/nvidia/tegra_xusb.c:1.11 src/sys/arch/arm/nvidia/tegra_xusb.c:1.12 --- src/sys/arch/arm/nvidia/tegra_xusb.c:1.11 Mon Sep 25 00:03:34 2017 +++ src/sys/arch/arm/nvidia/tegra_xusb.c Tue Sep 26 16:12:45 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: tegra_xusb.c,v 1.11 2017/09/25 00:03:34 jmcneill Exp $ */ +/* $NetBSD: tegra_xusb.c,v 1.12 2017/09/26 16:12:45 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.11 2017/09/25 00:03:34 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tegra_xusb.c,v 1.12 2017/09/26 16:12:45 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -159,9 +159,10 @@ tegra_xusb_attach(device_t parent, devic bus_addr_t addr; bus_size_t size; struct fdtbus_reset *rst; + struct fdtbus_phy *phy; struct clk *clk; uint32_t rate; - int error; + int error, n; aprint_naive("\n"); aprint_normal(": XUSB\n"); @@ -244,10 +245,17 @@ tegra_xusb_attach(device_t parent, devic } aprint_normal_dev(self, "interrupting on %s\n", intrstr); + /* Enable PHYs */ + for (n = 0; (phy = fdtbus_phy_get_index(faa->faa_phandle, n)) != NULL; n++) + if (fdtbus_phy_enable(phy, true) != 0) + aprint_error_dev(self, "failed to enable PHY #%d\n", n); + /* Enable XUSB power rails */ tegra_pmc_power(PMC_PARTID_XUSBC, true); /* Host/USB2.0 */ + tegra_pmc_remove_clamping(PMC_PARTID_XUSBC); tegra_pmc_power(PMC_PARTID_XUSBA, true); /* SuperSpeed */ + tegra_pmc_remove_clamping(PMC_PARTID_XUSBA); /* Enable XUSB clocks */ Index: src/sys/arch/evbarm/conf/TEGRA diff -u src/sys/arch/evbarm/conf/TEGRA:1.32 src/sys/arch/evbarm/conf/TEGRA:1.33 --- src/sys/arch/evbarm/conf/TEGRA:1.32 Sat Sep 23 23:54:54 2017 +++ src/sys/arch/evbarm/conf/TEGRA Tue Sep 26 16:12:45 2017 @@ -1,5 +1,5 @@ # -# $NetBSD: TEGRA,v 1.32 2017/09/23 23:54:54 jmcneill Exp $ +# $NetBSD: TEGRA,v 1.33 2017/09/26 16:12:45 jmcneill Exp $ # # NVIDIA Tegra family SoCs # @@ -96,6 +96,7 @@ tegrapinmux* at fdt? # MPIO # XUSB PADCTL tegra124xpad* at fdt? # XUSB PADCTL (T124) tegra210xpad* at fdt? # XUSB PADCTL (T210) +tegra210xphy* at tegra210xpad? # PCIE tegrapcie0 at fdt? # PCIE