@@ -23,23 +23,6 @@
extern const struct device_desc _sdevice[], _edevice[];
-static bool_t __init device_is_compatible(const struct device_desc *desc,
- const struct dt_device_node *dev)
-{
- const char *const *compat;
-
- if ( !desc->compatible )
- return 0;
-
- for ( compat = desc->compatible; *compat; compat++ )
- {
- if ( dt_device_is_compatible(dev, *compat) )
- return 1;
- }
-
- return 0;
-}
-
int __init device_init(struct dt_device_node *dev, enum device_match type,
const void *data)
{
@@ -55,7 +38,7 @@ int __init device_init(struct dt_device_node *dev, enum device_match type,
if ( desc->type != type )
continue;
- if ( device_is_compatible(desc, dev) )
+ if ( dt_match_node(desc->dt_match, dev) )
{
ASSERT(desc->init != NULL);
@@ -75,7 +58,7 @@ enum device_match device_get_type(const struct dt_device_node *dev)
for ( desc = _sdevice; desc != _edevice; desc++ )
{
- if ( device_is_compatible(desc, dev) )
+ if ( dt_match_node(desc->dt_match, dev) )
return desc->type;
}
@@ -764,16 +764,14 @@ static int __init gicv2_init(struct dt_device_node *node, const void *data)
return 0;
}
-static const char * const gicv2_dt_compat[] __initconst =
+static const struct dt_device_match gicv2_dt_match[] __initconst =
{
- DT_COMPAT_GIC_CORTEX_A15,
- DT_COMPAT_GIC_CORTEX_A7,
- DT_COMPAT_GIC_400,
- NULL
+ DT_MATCH_GIC_V2,
+ { /* sentinel */ },
};
DT_DEVICE_START(gicv2, "GICv2", DEVICE_GIC)
- .compatible = gicv2_dt_compat,
+ .dt_match = gicv2_dt_match,
.init = gicv2_init,
DT_DEVICE_END
@@ -1278,14 +1278,14 @@ static int __init gicv3_init(struct dt_device_node *node, const void *data)
return res;
}
-static const char * const gicv3_dt_compat[] __initconst =
+static const struct dt_device_match gicv3_dt_match[] __initconst =
{
- DT_COMPAT_GIC_V3,
- NULL
+ DT_MATCH_GIC_V3,
+ { /* sentinel */ },
};
DT_DEVICE_START(gicv3, "GICv3", DEVICE_GIC)
- .compatible = gicv3_dt_compat,
+ .dt_match = gicv3_dt_match,
.init = gicv3_init,
DT_DEVICE_END
@@ -352,14 +352,14 @@ static int __init exynos4210_uart_init(struct dt_device_node *dev,
return 0;
}
-static const char * const exynos4210_dt_compat[] __initconst =
+static const struct dt_device_match exynos4210_dt_match[] __initconst =
{
- "samsung,exynos4210-uart",
- NULL
+ DT_MATCH_COMPATIBLE("samsung,exynos4210-uart"),
+ { /* sentinel */ },
};
DT_DEVICE_START(exynos4210, "Exynos 4210 UART", DEVICE_SERIAL)
- .compatible = exynos4210_dt_compat,
+ .dt_match = exynos4210_dt_match,
.init = exynos4210_uart_init,
DT_DEVICE_END
@@ -1185,16 +1185,16 @@ static int __init ns16550_uart_dt_init(struct dt_device_node *dev,
return 0;
}
-static const char * const ns16550_dt_compat[] __initconst =
+static const struct dt_device_match ns16550_dt_match[] __initconst =
{
- "ns16550",
- "ns16550a",
- "snps,dw-apb-uart",
- NULL
+ DT_MATCH_COMPATIBLE("ns16550"),
+ DT_MATCH_COMPATIBLE("ns16550a"),
+ DT_MATCH_COMPATIBLE("snps,dw-apb-uart"),
+ { /* sentinel */ },
};
DT_DEVICE_START(ns16550, "NS16550 UART", DEVICE_SERIAL)
- .compatible = ns16550_dt_compat,
+ .dt_match = ns16550_dt_match,
.init = ns16550_uart_dt_init,
DT_DEVICE_END
@@ -350,14 +350,14 @@ static int __init omap_uart_init(struct dt_device_node *dev,
return 0;
}
-static const char * const omap_uart_dt_compat[] __initconst =
+static const struct dt_device_match omap_uart_dt_match[] __initconst =
{
- "ti,omap4-uart",
- NULL
+ DT_MATCH_COMPATIBLE("ti,omap4-uart"),
+ { /* sentinel */ },
};
DT_DEVICE_START(omap_uart, "OMAP UART", DEVICE_SERIAL)
- .compatible = omap_uart_dt_compat,
+ .dt_match = omap_uart_dt_match,
.init = omap_uart_init,
DT_DEVICE_END
@@ -285,14 +285,14 @@ static int __init pl011_uart_init(struct dt_device_node *dev,
return 0;
}
-static const char * const pl011_dt_compat[] __initconst =
+static const struct dt_device_match pl011_dt_match[] __initconst =
{
- "arm,pl011",
- NULL
+ DT_MATCH_COMPATIBLE("arm,pl011"),
+ { /* sentinel */ },
};
DT_DEVICE_START(pl011, "PL011 UART", DEVICE_SERIAL)
- .compatible = pl011_dt_compat,
+ .dt_match = pl011_dt_match,
.init = pl011_uart_init,
DT_DEVICE_END
@@ -44,8 +44,8 @@ struct device_desc {
const char *name;
/* Device type */
enum device_match type;
- /* Array of device tree 'compatible' strings */
- const char *const *compatible;
+ /* List of devices supported by this driver */
+ const struct dt_device_match *dt_match;
/* Device initialization */
int (*init)(struct dt_device_node *dev, const void *data);
};
@@ -152,17 +152,12 @@
#include <xen/irq.h>
#include <asm-arm/vgic.h>
-#define DT_COMPAT_GIC_400 "arm,gic-400"
-#define DT_COMPAT_GIC_CORTEX_A15 "arm,cortex-a15-gic"
-#define DT_COMPAT_GIC_CORTEX_A7 "arm,cortex-a7-gic"
+#define DT_MATCH_GIC_V2 \
+ DT_MATCH_COMPATIBLE("arm,cortex-a15-gic"), \
+ DT_MATCH_COMPATIBLE("arm,cortex-a7-gic"), \
+ DT_MATCH_COMPATIBLE("arm,gic-400")
-#define DT_MATCH_GIC_V2 DT_MATCH_COMPATIBLE(DT_COMPAT_GIC_CORTEX_A15), \
- DT_MATCH_COMPATIBLE(DT_COMPAT_GIC_CORTEX_A7), \
- DT_MATCH_COMPATIBLE(DT_COMPAT_GIC_400)
-
-#define DT_COMPAT_GIC_V3 "arm,gic-v3"
-
-#define DT_MATCH_GIC_V3 DT_MATCH_COMPATIBLE(DT_COMPAT_GIC_V3)
+#define DT_MATCH_GIC_V3 DT_MATCH_COMPATIBLE("arm,gic-v3")
/*
* GICv3 registers that needs to be saved/restored
Xen is currently using list a compatible string to know if the driver can use device node. This leads to have double definition in the GIC code. Futhermore Linux drivers is using dt_match_node (actually called of_device_id in Linux) to list device supported by the drivers. Signed-off-by: Julien Grall <julien.grall@linaro.org> --- xen/arch/arm/device.c | 21 ++------------------- xen/arch/arm/gic-v2.c | 10 ++++------ xen/arch/arm/gic-v3.c | 8 ++++---- xen/drivers/char/exynos4210-uart.c | 8 ++++---- xen/drivers/char/ns16550.c | 12 ++++++------ xen/drivers/char/omap-uart.c | 8 ++++---- xen/drivers/char/pl011.c | 8 ++++---- xen/include/asm-arm/device.h | 4 ++-- xen/include/asm-arm/gic.h | 15 +++++---------- 9 files changed, 35 insertions(+), 59 deletions(-)