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