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;

Reply via email to