summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJavier Jalle <javier.jalle@gaisler.com>2017-02-15 11:05:27 +0100
committerDaniel Hellstrom <daniel@gaisler.com>2017-03-06 07:54:55 +0100
commit0c23dd504632e2ea672a18328ef6c67320d8c51f (patch)
tree7e0279de629b62904ca490e1aa739bab452e1496
parentleon, gr-cpci-leon4-n2x: small comment fix (diff)
downloadrtems-0c23dd504632e2ea672a18328ef6c67320d8c51f.tar.bz2
leon, gr740: fix device registration for GRPCI2 core
-rw-r--r--c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus.c b/c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus.c
index 02aeda0dc9..c48d12d247 100644
--- a/c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus.c
+++ b/c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus.c
@@ -597,6 +597,27 @@ static void ambapp_core_register(
drvmgr_dev_register(newdev); /* Register New Device */
}
+/* Fix device registration.
+ * Function returns:
+ * 0 Register device as normal
+ * 1 Fixup function handles registration
+ */
+static int ambapp_dev_register_fixup(struct ambapp_dev *dev, struct ambapp_dev_reg_struct *p)
+{
+ /* GR740 GRPCI2 speciality:
+ * - In the GR740 the APB_SLV is detected before the AHB_SLV
+ * which makes the registration incorrect. We deal with it in
+ * this function. */
+ if ( (dev->dev_type == DEV_APB_SLV) &&
+ (dev->device == GAISLER_GRPCI2) &&
+ (dev->vendor == VENDOR_GAISLER) &&
+ (p->ahb_slv == NULL) ) {
+ DBG("GRPCI2 APB_SLV detected before AHB_SLV. Skipping APB_SLV registration.\n");
+ return 1;
+ }
+ return 0;
+}
+
/* Register one AMBA device */
static int ambapp_dev_register(struct ambapp_dev *dev, int index, void *arg)
{
@@ -615,6 +636,11 @@ static int ambapp_dev_register(struct ambapp_dev *dev, int index, void *arg)
DBG("Found [%d:%x:%x], %s\n", index, dev->vendor, dev->device, type);
#endif
+ /* Fixup for device registration */
+ if (ambapp_dev_register_fixup(dev, p)){
+ return 0;
+ }
+
if ( dev->dev_type == DEV_AHB_MST ) {
if ( p->ahb_mst ) {
/* This should not happen */