Module Name: src Committed By: skrll Date: Fri Dec 14 18:17:36 UTC 2018
Modified Files: src/sys/arch/arm/nvidia: tegra_xusb.c Log Message: Provide TEGRA210 supplies. To generate a diff of this commit: cvs rdiff -u -r1.15 -r1.16 src/sys/arch/arm/nvidia/tegra_xusb.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/tegra_xusb.c diff -u src/sys/arch/arm/nvidia/tegra_xusb.c:1.15 src/sys/arch/arm/nvidia/tegra_xusb.c:1.16 --- src/sys/arch/arm/nvidia/tegra_xusb.c:1.15 Mon Jul 16 23:11:47 2018 +++ src/sys/arch/arm/nvidia/tegra_xusb.c Fri Dec 14 18:17:36 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: tegra_xusb.c,v 1.15 2018/07/16 23:11:47 christos Exp $ */ +/* $NetBSD: tegra_xusb.c,v 1.16 2018/12/14 18:17:36 skrll 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.15 2018/07/16 23:11:47 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tegra_xusb.c,v 1.16 2018/12/14 18:17:36 skrll Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -88,9 +88,50 @@ enum xusb_type { XUSB_T210 }; +struct tegra_xhci_data { + enum xusb_type txd_type; + const char * const * txd_supplies; + size_t txd_nsupplies; + bool txd_scale_ss_clock; +}; + +const char *tegra124_xhci_supplies[] = { + "dvddio-pex-supply", + "hvddio-pex-supply", + "avdd-usb-supply", + "avdd-pll-utmip-supply", + "avdd-pll-uerefe-supply", + "dvdd-usb-ss-pll-supply", + "hvdd-usb-ss-pll-e-supply" +}; + +struct tegra_xhci_data tegra124_xhci_data = { + .txd_type = XUSB_T124, + .txd_supplies = tegra124_xhci_supplies, + .txd_nsupplies = __arraycount(tegra124_xhci_supplies), + .txd_scale_ss_clock = true, +}; + +const char *tegra210_xhci_supplies[] = { + "dvddio-pex", + "hvddio-pex", + "avdd-usb", + "avdd-pll-utmip", + "avdd-pll-uerefe", + "dvdd-pex-pll", + "hvdd-pex-pll-e", +}; + +struct tegra_xhci_data tegra210_xhci_data = { + .txd_type = XUSB_T210, + .txd_supplies = tegra210_xhci_supplies, + .txd_nsupplies = __arraycount(tegra210_xhci_supplies), + .txd_scale_ss_clock = false, +}; + static const struct of_compat_data compat_data[] = { - { "nvidia,tegra124-xusb", XUSB_T124 }, - { "nvidia,tegra210-xusb", XUSB_T210 }, + { "nvidia,tegra124-xusb", (uintptr_t)&tegra124_xhci_data }, + { "nvidia,tegra210-xusb", (uintptr_t)&tegra210_xhci_data }, { NULL } }; @@ -112,15 +153,14 @@ struct tegra_xusb_softc { void *sc_ih_mbox; struct fw_dma sc_fw_dma; struct clk *sc_clk_ss_src; - enum xusb_type sc_type; - bool sc_scale_ss_clock; + struct tegra_xhci_data *sc_txd; }; static uint32_t csb_read_4(struct tegra_xusb_softc * const, bus_size_t); static void csb_write_4(struct tegra_xusb_softc * const, bus_size_t, uint32_t); - + static void tegra_xusb_init(struct tegra_xusb_softc * const); static int tegra_xusb_open_fw(struct tegra_xusb_softc * const); static int tegra_xusb_load_fw(struct tegra_xusb_softc * const, void *, @@ -173,16 +213,9 @@ tegra_xusb_attach(device_t parent, devic 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; - switch (psc->sc_type) { - case XUSB_T124: - psc->sc_scale_ss_clock = true; - break; - default: - psc->sc_scale_ss_clock = false; - break; - } + uintptr_t data = of_search_compatible(faa->faa_phandle, compat_data)->data; + psc->sc_txd = (struct tegra_xhci_data *)data; if (fdtbus_get_reg_byname(faa->faa_phandle, "hcd", &addr, &size) != 0) { aprint_error(": couldn't get registers\n"); @@ -305,7 +338,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_scale_ss_clock) { + if (psc->sc_txd->txd_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); @@ -357,11 +390,11 @@ tegra_xusb_attach(device_t parent, devic tegra_xusb_init(psc); #if defined(TEGRA124_XUSB_BIN_STATIC) - if (psc->sc_type == XUSB_T124) + if (psc->sc_txd->txd_type == XUSB_T124) wait_for_root = false; #endif #if defined(TEGRA210_XUSB_BIN_STATIC) - if (psc->sc_type == XUSB_T210) + if (psc->sc_txd->txd_type == XUSB_T210) wait_for_root = false; #endif @@ -502,7 +535,7 @@ tegra_xusb_intr_mbox(void *v) break; case 4: case 5: - if (psc->sc_scale_ss_clock) { + if (psc->sc_txd->txd_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", @@ -517,7 +550,7 @@ tegra_xusb_intr_mbox(void *v) msg = __SHIFTIN(128, MAILBOX_DATA_TYPE) | __SHIFTIN(rate / 1000, MAILBOX_DATA_DATA); } else -clk_fail: +clk_fail: msg = __SHIFTIN(129, MAILBOX_DATA_TYPE) | __SHIFTIN(rate / 1000, MAILBOX_DATA_DATA); } else { @@ -551,33 +584,25 @@ clk_fail: static void tegra_xusb_init_regulators(struct tegra_xusb_softc * const psc) { - const char * supply_names[] = { - "dvddio-pex-supply", - "hvddio-pex-supply", - "avdd-usb-supply", - "avdd-pll-utmip-supply", - "avdd-pll-uerefe-supply", - "dvdd-usb-ss-pll-supply", - "hvdd-usb-ss-pll-e-supply" - }; + device_t dev = psc->sc_xhci.sc_dev; const int phandle = psc->sc_phandle; struct fdtbus_regulator *reg; int n, error; - for (n = 0; n < __arraycount(supply_names); n++) { - if (!of_hasprop(phandle, supply_names[n])) + for (n = 0; n < psc->sc_txd->txd_nsupplies; n++) { + if (!of_hasprop(phandle, psc->sc_txd->txd_supplies[n])) continue; - reg = fdtbus_regulator_acquire(phandle, supply_names[n]); + reg = fdtbus_regulator_acquire(phandle, psc->sc_txd->txd_supplies[n]); if (reg == NULL) { aprint_error_dev(dev, "couldn't acquire supply '%s'\n", - supply_names[n]); + psc->sc_txd->txd_supplies[n]); continue; } error = fdtbus_regulator_enable(reg); if (error != 0) aprint_error_dev(dev, "couldn't enable supply '%s': %d\n", - supply_names[n], error); + psc->sc_txd->txd_supplies[n], error); } } @@ -624,7 +649,7 @@ tegra_xusb_init(struct tegra_xusb_softc bus_space_write_4(bst, fpcih, PCI_BAR0, 0x10000000); DPRINTF(sc->sc_dev, "%s fpci PCI_BAR0 = 0x%x\n", __func__, bus_space_read_4(bst, fpcih, PCI_BAR0)); - + DPRINTF(sc->sc_dev, "%s ipfs 0x188 = 0x%x\n", __func__, bus_space_read_4(bst, ipfsh, 0x188)); tegra_reg_set_clear(bst, ipfsh, 0x188, __BIT(16), 0); @@ -706,7 +731,7 @@ tegra_xusb_open_fw(struct tegra_xusb_sof void *fw_static = NULL; int error; - switch (psc->sc_type) { + switch (psc->sc_txd->txd_type) { case XUSB_T124: #if defined(TEGRA124_XUSB_BIN_STATIC) firmware_size = (uintptr_t)&_binary_tegra124_xusb_bin_size;