Hi,

currently the armv7 platform busses always match if the board id is set
to something they know.  This means that even with a device tree the
platforms will always try to match, even though they should not.

By properly checking for the ma_name member, we can find out if we're
being asked to run because we're in legacy mode and attach only in that
case.

ok?

Patrick

diff --git sys/arch/armv7/exynos/exynos.c sys/arch/armv7/exynos/exynos.c
index 16b7a1e..8e8c7dd 100644
--- sys/arch/armv7/exynos/exynos.c
+++ sys/arch/armv7/exynos/exynos.c
@@ -20,10 +20,8 @@
 #include <sys/systm.h>
 
 #include <machine/bus.h>
-#if NFDT > 0
-#include <machine/fdt.h>
-#endif
 
+#include <arm/mainbus/mainbus.h>
 #include <armv7/armv7/armv7var.h>
 
 int    exynos_match(struct device *, void *, void *);
@@ -171,12 +169,14 @@ exynos_board_name(void)
 int
 exynos_match(struct device *parent, void *cfdata, void *aux)
 {
-#if NFDT > 0
-       /* If we're running with fdt, do not attach. */
-       /* XXX: Find a better way. */
-       if (fdt_next_node(0))
+       union mainbus_attach_args *ma = (union mainbus_attach_args *)aux;
+       struct cfdata *cf = (struct cfdata *)cfdata;
+
+       if (ma->ma_name == NULL)
+               return (0);
+
+       if (strcmp(cf->cf_driver->cd_name, ma->ma_name) != 0)
                return (0);
-#endif
 
        return (exynos_board_devs() != NULL);
 }
diff --git sys/arch/armv7/imx/imx.c sys/arch/armv7/imx/imx.c
index 0471a21..f6102e0 100644
--- sys/arch/armv7/imx/imx.c
+++ sys/arch/armv7/imx/imx.c
@@ -21,6 +21,7 @@
 
 #include <machine/bus.h>
 
+#include <arm/mainbus/mainbus.h>
 #include <armv7/armv7/armv7var.h>
 
 int    imx_match(struct device *, void *, void *);
@@ -301,5 +302,14 @@ imx_board_name(void)
 int
 imx_match(struct device *parent, void *cfdata, void *aux)
 {
+       union mainbus_attach_args *ma = (union mainbus_attach_args *)aux;
+       struct cfdata *cf = (struct cfdata *)cfdata;
+
+       if (ma->ma_name == NULL)
+               return (0);
+
+       if (strcmp(cf->cf_driver->cd_name, ma->ma_name) != 0)
+               return (0);
+
        return (imx_board_devs() != NULL);
 }
diff --git sys/arch/armv7/omap/omap.c sys/arch/armv7/omap/omap.c
index 837ebef..c195360 100644
--- sys/arch/armv7/omap/omap.c
+++ sys/arch/armv7/omap/omap.c
@@ -20,6 +20,7 @@
 
 #include <machine/bus.h>
 
+#include <arm/mainbus/mainbus.h>
 #include <armv7/armv7/armv7var.h>
 
 int    omap_match(struct device *, void *, void *);
@@ -175,5 +176,14 @@ omap_board_name(void)
 int
 omap_match(struct device *parent, void *cfdata, void *aux)
 {
+       union mainbus_attach_args *ma = (union mainbus_attach_args *)aux;
+       struct cfdata *cf = (struct cfdata *)cfdata;
+
+       if (ma->ma_name == NULL)
+               return (0);
+
+       if (strcmp(cf->cf_driver->cd_name, ma->ma_name) != 0)
+               return (0);
+
        return (omap_board_devs() != NULL);
 }
diff --git sys/arch/armv7/sunxi/sunxi.c sys/arch/armv7/sunxi/sunxi.c
index dac0348..380f9be 100644
--- sys/arch/armv7/sunxi/sunxi.c
+++ sys/arch/armv7/sunxi/sunxi.c
@@ -21,6 +21,7 @@
 #include <machine/bus.h>
 
 #include <arm/armv7/armv7var.h>
+#include <arm/mainbus/mainbus.h>
 #include <armv7/armv7/armv7var.h>
 #include <armv7/sunxi/sunxireg.h>
 
@@ -155,5 +156,14 @@ sunxi_board_name(void)
 int
 sunxi_match(struct device *parent, void *cfdata, void *aux)
 {
+       union mainbus_attach_args *ma = (union mainbus_attach_args *)aux;
+       struct cfdata *cf = (struct cfdata *)cfdata;
+
+       if (ma->ma_name == NULL)
+               return (0);
+
+       if (strcmp(cf->cf_driver->cd_name, ma->ma_name) != 0)
+               return (0);
+
        return (sunxi_board_devs() != NULL);
 }
diff --git sys/arch/armv7/vexpress/vexpress.c sys/arch/armv7/vexpress/vexpress.c
index fcf33f8..1724ddc 100644
--- sys/arch/armv7/vexpress/vexpress.c
+++ sys/arch/armv7/vexpress/vexpress.c
@@ -22,6 +22,7 @@
 #include <machine/bus.h>
 
 #include <arm/cpufunc.h>
+#include <arm/mainbus/mainbus.h>
 #include <armv7/armv7/armv7var.h>
 
 int    vexpress_match(struct device *, void *, void *);
@@ -105,5 +106,14 @@ vexpress_board_name(void)
 int
 vexpress_match(struct device *parent, void *cfdata, void *aux)
 {
+       union mainbus_attach_args *ma = (union mainbus_attach_args *)aux;
+       struct cfdata *cf = (struct cfdata *)cfdata;
+
+       if (ma->ma_name == NULL)
+               return (0);
+
+       if (strcmp(cf->cf_driver->cd_name, ma->ma_name) != 0)
+               return (0);
+
        return (vexpress_board_devs() != NULL);
 }

Reply via email to