Module Name:    src
Committed By:   matt
Date:           Wed Apr 30 01:02:40 UTC 2014

Modified Files:
        src/sys/arch/evbmips/rasoc: autoconf.c

Log Message:
Add common support for bringing devices out of reset or enabling their clocks
to device_register.  Add code to switch USB to host mode.


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/evbmips/rasoc/autoconf.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/evbmips/rasoc/autoconf.c
diff -u src/sys/arch/evbmips/rasoc/autoconf.c:1.4 src/sys/arch/evbmips/rasoc/autoconf.c:1.5
--- src/sys/arch/evbmips/rasoc/autoconf.c:1.4	Sat Oct 27 17:17:51 2012
+++ src/sys/arch/evbmips/rasoc/autoconf.c	Wed Apr 30 01:02:40 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: autoconf.c,v 1.4 2012/10/27 17:17:51 chs Exp $	*/
+/*	$NetBSD: autoconf.c,v 1.5 2014/04/30 01:02:40 matt Exp $	*/
 /*-
  * Copyright (c) 2011 CradlePoint Technology, Inc.
  * All rights reserved.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.4 2012/10/27 17:17:51 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.5 2014/04/30 01:02:40 matt Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -35,6 +35,9 @@ __KERNEL_RCSID(0, "$NetBSD: autoconf.c,v
 #include <sys/device.h>
 #include <sys/systm.h>
 
+#include <mips/ralink/ralink_reg.h>
+#include <mips/ralink/ralink_var.h>
+
 /*
  * Configure all devices on system
  */     
@@ -61,8 +64,76 @@ cpu_rootconf(void)
 	rootconf();
 }
 
+static const struct cfg_info {
+	const char *map_name;
+	uint32_t map_rst;
+	uint32_t map_clkcfg1;
+} map_info[] = {
+#if defined(MT7620)
+	{ "rpci", RST_PCIE0_7620, SYSCTL_CLKCFG1_PCIE_CLK_EN_7620 },
+	{ "ohci", RST_UHST0_7620|RST_UHST, SYSCTL_CLKCFG1_UPHY0_CLK_EN_7620 },
+	{ "ehci", RST_UHST0_7620|RST_UHST, SYSCTL_CLKCFG1_UPHY0_CLK_EN_7620 },
+	{ "sdhc", RST_SDHC_7620, SYSCTL_CLKCFG1_SDHC_CLK_EN },
+	{ "rsw", RST_ESW_7620, SYSCTL_CLKCFG1_ESW_CLK_EN },
+#endif
+#if defined(RT3883)
+	{ "rpci", RST_PCI_3883 | RST_PCIPCIE_3883,
+	    SYSCTL_CLKCFG1_PCI_CLK_EN|SYSCTL_CLKCFG1_PCIE_CLK_EN_3883 },
+	{ "ohci", RST_UHST, SYSCTL_CLKCFG1_UPHY0_CLK_EN_3883 },
+	{ "ehci", RST_UHST, SYSCTL_CLKCFG1_UPHY0_CLK_EN_3883 },
+#endif
+};
+
+static void
+ra_device_fixup(bus_space_tag_t bst, const struct cfg_info *map)
+{
+	const uint32_t clkcfg1 = bus_space_read_4(bst, ra_sysctl_bsh,
+	    RA_SYSCTL_CLKCFG1);
+	if ((clkcfg1 & map->map_clkcfg1) != map->map_clkcfg1) {
+		bus_space_write_4(bst, ra_sysctl_bsh, RA_SYSCTL_CLKCFG1,
+		    clkcfg1 | map->map_clkcfg1);
+		delay(10000);
+	}
+
+	const uint32_t rst = bus_space_read_4(bst, ra_sysctl_bsh,
+	    RA_SYSCTL_RST);
+	if ((rst & map->map_rst) != 0) {
+		bus_space_write_4(bst, ra_sysctl_bsh, RA_SYSCTL_RST,
+		    rst & ~map->map_rst);
+		delay(10000);
+	}
+}
+
 void
-device_register(device_t dev, void *aux)
+device_register(device_t self, void *aux)
 {
-	/* TBD */
+	device_t parent = device_parent(self);
+
+	if (parent != NULL && device_is_a(parent, "mainbus")) {
+		// If we are attaching a mainbus device, see if we know how
+		// to bring it out of reset.
+		struct mainbus_attach_args * const ma = aux;
+		for (const struct cfg_info *map = map_info;
+		     map < map_info + __arraycount(map_info);
+		     map++) {
+			if (device_is_a(self, map->map_name)) {
+				ra_device_fixup(ma->ma_memt, map);
+				delay(1000);
+				break;
+			}
+		}
+
+#if defined(RT3883) || defined(MT7620)
+		if (device_is_a(self, "ohci") || device_is_a(self, "ehci")) {
+			const uint32_t cfg1 = bus_space_read_4(ma->ma_memt,
+			    ra_sysctl_bsh, RA_SYSCTL_CFG1);
+			if ((cfg1 & SYSCTL_CFG1_USB0_HOST_MODE) == 0) {
+				bus_space_write_4(ma->ma_memt, ra_sysctl_bsh,
+				    RA_SYSCTL_CFG1,
+				    cfg1 | SYSCTL_CFG1_USB0_HOST_MODE);
+				delay(10);
+			}
+		}
+#endif
+	}
 }

Reply via email to