[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v2 08/12] xen/arm: Describe device supported by a driver with dt_match_node



On Fri, 16 Jan 2015, Julien Grall wrote:
> 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@xxxxxxxxxx>

Acked-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>


>  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(-)
> 
> diff --git a/xen/arch/arm/device.c b/xen/arch/arm/device.c
> index 693b9af..e4f4603 100644
> --- a/xen/arch/arm/device.c
> +++ b/xen/arch/arm/device.c
> @@ -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;
>      }
>  
> diff --git a/xen/arch/arm/gic-v2.c b/xen/arch/arm/gic-v2.c
> index f149e09..34d622f 100644
> --- a/xen/arch/arm/gic-v2.c
> +++ b/xen/arch/arm/gic-v2.c
> @@ -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
>  
> diff --git a/xen/arch/arm/gic-v3.c b/xen/arch/arm/gic-v3.c
> index 076aa62..35f80b3 100644
> --- a/xen/arch/arm/gic-v3.c
> +++ b/xen/arch/arm/gic-v3.c
> @@ -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
>  
> diff --git a/xen/drivers/char/exynos4210-uart.c 
> b/xen/drivers/char/exynos4210-uart.c
> index cba8729..bac1c2b 100644
> --- a/xen/drivers/char/exynos4210-uart.c
> +++ b/xen/drivers/char/exynos4210-uart.c
> @@ -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
>  
> diff --git a/xen/drivers/char/ns16550.c b/xen/drivers/char/ns16550.c
> index 161b251..d443880 100644
> --- a/xen/drivers/char/ns16550.c
> +++ b/xen/drivers/char/ns16550.c
> @@ -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
>  
> diff --git a/xen/drivers/char/omap-uart.c b/xen/drivers/char/omap-uart.c
> index 16d1454..d8f64ea 100644
> --- a/xen/drivers/char/omap-uart.c
> +++ b/xen/drivers/char/omap-uart.c
> @@ -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
>  
> diff --git a/xen/drivers/char/pl011.c b/xen/drivers/char/pl011.c
> index 57274d9..67e6df5 100644
> --- a/xen/drivers/char/pl011.c
> +++ b/xen/drivers/char/pl011.c
> @@ -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
>  
> diff --git a/xen/include/asm-arm/device.h b/xen/include/asm-arm/device.h
> index 2fe4280..e4666b4 100644
> --- a/xen/include/asm-arm/device.h
> +++ b/xen/include/asm-arm/device.h
> @@ -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);
>  };
> diff --git a/xen/include/asm-arm/gic.h b/xen/include/asm-arm/gic.h
> index 187dc46..73ca3cf 100644
> --- a/xen/include/asm-arm/gic.h
> +++ b/xen/include/asm-arm/gic.h
> @@ -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
> -- 
> 2.1.4
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.