Author: adrian
Date: Thu Jun 23 01:14:33 2016
New Revision: 302105
URL: https://svnweb.freebsd.org/changeset/base/302105

Log:
  [BHND/bcma] Add implementation of BHND_BUS_RESET_CORE function for BCMA
  
  This patch addes missing implementation of BHND_BUS_RESET_CORE function for 
BCMA.
  The reset procedure is very simple: enable reset mode, stop clocking,
  enable clocking & force clock gating, disable reset mode, stop clock gating.
  
  Tested:
  
  * (michael) Tested on ASUS RT-N53 for enabling/reset USB core
  
  Submitted by: Michael Zhilin <miz...@gmail.com>
  Approved by:  re (gjb)

Modified:
  head/sys/dev/bhnd/bcma/bcma.c
  head/sys/dev/bhnd/bhnd_core.h
  head/sys/dev/bhnd/bhndb/bhndb.c

Modified: head/sys/dev/bhnd/bcma/bcma.c
==============================================================================
--- head/sys/dev/bhnd/bcma/bcma.c       Thu Jun 23 01:13:30 2016        
(r302104)
+++ head/sys/dev/bhnd/bcma/bcma.c       Thu Jun 23 01:14:33 2016        
(r302105)
@@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$");
 
 #include "bcma_eromreg.h"
 #include "bcma_eromvar.h"
+#include <dev/bhnd/bhnd_core.h>
 
 int
 bcma_probe(device_t dev)
@@ -218,9 +219,33 @@ bcma_reset_core(device_t dev, device_t c
        if (dinfo->res_agent == NULL)
                return (ENODEV);
 
-       // TODO - perform reset
+       /* Start reset */
+       bhnd_bus_write_4(dinfo->res_agent, BHND_RESET_CF, BHND_RESET_CF_ENABLE);
+       bhnd_bus_read_4(dinfo->res_agent, BHND_RESET_CF);
+       DELAY(10);
+
+       /* Disable clock */
+       bhnd_bus_write_4(dinfo->res_agent, BHND_CF, flags);
+       bhnd_bus_read_4(dinfo->res_agent, BHND_CF);
+       DELAY(10);
+
+       /* Enable clocks & force clock gating */
+       bhnd_bus_write_4(dinfo->res_agent, BHND_CF, BHND_CF_CLOCK_EN |
+           BHND_CF_FGC | flags);
+       bhnd_bus_read_4(dinfo->res_agent, BHND_CF);
+       DELAY(10);
+
+       /* Complete reset */
+       bhnd_bus_write_4(dinfo->res_agent, BHND_RESET_CF, 0);
+       bhnd_bus_read_4(dinfo->res_agent, BHND_RESET_CF);
+       DELAY(10);
+
+       /* Release force clock gating */
+       bhnd_bus_write_4(dinfo->res_agent, BHND_CF, BHND_CF_CLOCK_EN | flags);
+       bhnd_bus_read_4(dinfo->res_agent, BHND_CF);
+       DELAY(10);
 
-       return (ENXIO);
+       return (0);
 }
 
 static int

Modified: head/sys/dev/bhnd/bhnd_core.h
==============================================================================
--- head/sys/dev/bhnd/bhnd_core.h       Thu Jun 23 01:13:30 2016        
(r302104)
+++ head/sys/dev/bhnd/bhnd_core.h       Thu Jun 23 01:14:33 2016        
(r302105)
@@ -25,19 +25,27 @@
 #define _BHND_BHND_CORE_H_
 
 /* Common core control flags */
-#define        BHND_CF_BIST_EN         0x8000          /**< ??? */
+#define        BHND_CF                 0x0408
+#define        BHND_CF_BIST_EN         0x8000          /**< built-in self test 
*/
 #define        BHND_CF_PME_EN          0x4000          /**< ??? */
 #define        BHND_CF_CORE_BITS       0x3ffc          /**< core specific flag 
mask */
 #define        BHND_CF_FGC             0x0002          /**< force clock gating 
*/
 #define        BHND_CF_CLOCK_EN        0x0001          /**< enable clock */
 
 /* Common core status flags */
+#define        BHND_SF                 0x0500
 #define        BHND_SF_BIST_DONE       0x8000          /**< ??? */
 #define        BHND_SF_BIST_ERROR      0x4000          /**< ??? */
 #define        BHND_SF_GATED_CLK       0x2000          /**< clock gated */
 #define        BHND_SF_DMA64           0x1000          /**< supports 64-bit 
DMA */
 #define        BHND_SF_CORE_BITS       0x0fff          /**< core-specific 
status mask */
 
+/*Reset core control flags */
+#define        BHND_RESET_CF           0x0800
+#define        BHND_RESET_CF_ENABLE    0x0001
+
+#define        BHND_RESET_SF           0x0804
+
 /* 
  * A register that is common to all cores to
  * communicate w/PMU regarding clock control.

Modified: head/sys/dev/bhnd/bhndb/bhndb.c
==============================================================================
--- head/sys/dev/bhnd/bhndb/bhndb.c     Thu Jun 23 01:13:30 2016        
(r302104)
+++ head/sys/dev/bhnd/bhndb/bhndb.c     Thu Jun 23 01:14:33 2016        
(r302105)
@@ -62,7 +62,7 @@ __FBSDID("$FreeBSD$");
 #include "bhndb_private.h"
 
 /* Debugging flags */
-static u_long bhndb_debug = 0;
+static u_long bhndb_debug = -1;
 TUNABLE_ULONG("hw.bhndb.debug", &bhndb_debug);
 
 enum {
@@ -596,8 +596,10 @@ bhndb_generic_init_full_config(device_t 
        hostb = NULL;
 
        /* Fetch the full set of bhnd-attached cores */
-       if ((error = device_get_children(sc->bus_dev, &devs, &ndevs)))
+       if ((error = device_get_children(sc->bus_dev, &devs, &ndevs))) {
+               device_printf(sc->dev, "unable to get children\n");
                return (error);
+       }
 
        /* Find our host bridge device */
        hostb = BHNDB_FIND_HOSTB_DEVICE(dev, child);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to