Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/evbmips/rasoc Add common support for bringing devic...
details: https://anonhg.NetBSD.org/src/rev/b0a61928206f
branches: trunk
changeset: 329034:b0a61928206f
user: matt <matt%NetBSD.org@localhost>
date: Wed Apr 30 01:02:40 2014 +0000
description:
Add common support for bringing devices out of reset or enabling their clocks
to device_register. Add code to switch USB to host mode.
diffstat:
sys/arch/evbmips/rasoc/autoconf.c | 81 ++++++++++++++++++++++++++++++++++++--
1 files changed, 76 insertions(+), 5 deletions(-)
diffs (108 lines):
diff -r c12e48a3d6bb -r b0a61928206f sys/arch/evbmips/rasoc/autoconf.c
--- a/sys/arch/evbmips/rasoc/autoconf.c Wed Apr 30 01:01:47 2014 +0000
+++ b/sys/arch/evbmips/rasoc/autoconf.c Wed Apr 30 01:02:40 2014 +0000
@@ -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 @@
#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 @@
rootconf();
}
-void
-device_register(device_t dev, void *aux)
+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)
{
- /* TBD */
+ 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 self, void *aux)
+{
+ 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
+ }
+}
Home |
Main Index |
Thread Index |
Old Index