From 0c23dd504632e2ea672a18328ef6c67320d8c51f Mon Sep 17 00:00:00 2001 From: Javier Jalle Date: Wed, 15 Feb 2017 11:05:27 +0100 Subject: leon, gr740: fix device registration for GRPCI2 core --- c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus.c | 26 +++++++++++++++++++++++ 1 file changed, 26 insertions(+) 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 */ -- cgit v1.2.3