[PATCH v3 34/62] pl011: Refactor pl011 driver to dt and common initialization parts

Stefano Stabellini stefano.stabellini at eu.citrix.com
Thu Nov 26 07:22:32 PST 2015


On Tue, 17 Nov 2015, shannon.zhao at linaro.org wrote:
> From: Shannon Zhao <shannon.zhao at linaro.org>
> 
> Refactor pl011 driver to dt and common initialization parts. This will
> be useful later when acpi specific uart initialization function is
> introduced.
> 
> Signed-off-by: Parth Dixit <parth.dixit at linaro.org>
> Signed-off-by: Shannon Zhao <shannon.zhao at linaro.org>

Acked-by: Stefano Stabellini <stefano.stabellini at eu.citrix.com>


>  xen/drivers/char/pl011.c | 64 ++++++++++++++++++++++++++++--------------------
>  1 file changed, 38 insertions(+), 26 deletions(-)
> 
> diff --git a/xen/drivers/char/pl011.c b/xen/drivers/char/pl011.c
> index 67e6df5..16abaa5 100644
> --- a/xen/drivers/char/pl011.c
> +++ b/xen/drivers/char/pl011.c
> @@ -226,12 +226,42 @@ static struct uart_driver __read_mostly pl011_driver = {
>      .vuart_info   = pl011_vuart,
>  };
>  
> +static int __init pl011_uart_init(int irq, u64 addr, u64 size)
> +{
> +    struct pl011 *uart;
> +
> +    uart = &pl011_com;
> +    uart->irq       = irq;
> +    uart->clock_hz  = 0x16e3600;
> +    uart->baud      = BAUD_AUTO;
> +    uart->data_bits = 8;
> +    uart->parity    = PARITY_NONE;
> +    uart->stop_bits = 1;
> +
> +    uart->regs = ioremap_nocache(addr, size);
> +    if ( !uart->regs )
> +    {
> +        printk("pl011: Unable to map the UART memory\n");
> +        return -ENOMEM;
> +    }
> +
> +    uart->vuart.base_addr = addr;
> +    uart->vuart.size = size;
> +    uart->vuart.data_off = DR;
> +    uart->vuart.status_off = FR;
> +    uart->vuart.status = 0;
> +
> +    /* Register with generic serial driver. */
> +    serial_register_uart(SERHND_DTUART, &pl011_driver, uart);
> +
> +    return 0;
> +}
> +
>  /* TODO: Parse UART config from the command line */
> -static int __init pl011_uart_init(struct dt_device_node *dev,
> -                                  const void *data)
> +static int __init dt_pl011_uart_init(struct dt_device_node *dev,
> +                                     const void *data)
>  {
>      const char *config = data;
> -    struct pl011 *uart;
>      int res;
>      u64 addr, size;
>  
> @@ -240,14 +270,6 @@ static int __init pl011_uart_init(struct dt_device_node *dev,
>          printk("WARNING: UART configuration is not supported\n");
>      }
>  
> -    uart = &pl011_com;
> -
> -    uart->clock_hz  = 0x16e3600;
> -    uart->baud      = BAUD_AUTO;
> -    uart->data_bits = 8;
> -    uart->parity    = PARITY_NONE;
> -    uart->stop_bits = 1;
> -
>      res = dt_device_get_address(dev, 0, &addr, &size);
>      if ( res )
>      {
> @@ -262,24 +284,14 @@ static int __init pl011_uart_init(struct dt_device_node *dev,
>          printk("pl011: Unable to retrieve the IRQ\n");
>          return -EINVAL;
>      }
> -    uart->irq = res;
>  
> -    uart->regs = ioremap_nocache(addr, size);
> -    if ( !uart->regs )
> +    res = pl011_uart_init(res, addr, size);
> +    if ( res < 0 )
>      {
> -        printk("pl011: Unable to map the UART memory\n");
> -        return -ENOMEM;
> +        printk("pl011: Unable to initialize\n");
> +        return res;
>      }
>  
> -    uart->vuart.base_addr = addr;
> -    uart->vuart.size = size;
> -    uart->vuart.data_off = DR;
> -    uart->vuart.status_off = FR;
> -    uart->vuart.status = 0;
> -
> -    /* Register with generic serial driver. */
> -    serial_register_uart(SERHND_DTUART, &pl011_driver, uart);
> -
>      dt_device_set_used_by(dev, DOMID_XEN);
>  
>      return 0;
> @@ -293,7 +305,7 @@ static const struct dt_device_match pl011_dt_match[] __initconst =
>  
>  DT_DEVICE_START(pl011, "PL011 UART", DEVICE_SERIAL)
>          .dt_match = pl011_dt_match,
> -        .init = pl011_uart_init,
> +        .init = dt_pl011_uart_init,
>  DT_DEVICE_END
>  
>  /*
> -- 
> 2.1.0
> 



More information about the linux-arm-kernel mailing list