[PATCH 31/44] leon, gr740: fix device registration for GRPCI2 core
Daniel Hellstrom
daniel at gaisler.com
Fri Mar 3 14:57:04 UTC 2017
From: Javier Jalle <javier.jalle at gaisler.com>
---
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 02aeda0..c48d12d 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 */
--
2.7.4
More information about the devel
mailing list