diff mbox

[Xen-devel,v2,20/41] arm : create generic uart initialization function

Message ID 1431893048-5214-21-git-send-email-parth.dixit@linaro.org
State New
Headers show

Commit Message

Parth Dixit May 17, 2015, 8:03 p.m. UTC
Rename dt-uart.c to arm-uart.c and create new generic uart init function.
move dt_uart_init to uart_init. 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@linaro.org>
---
 xen/arch/arm/setup.c       |   2 +-
 xen/drivers/char/Makefile  |   2 +-
 xen/drivers/char/dt-uart.c | 107 ---------------------------------------------
 xen/drivers/char/pl011.c   |  47 ++++++++++++--------
 xen/include/xen/serial.h   |   3 +-
 5 files changed, 33 insertions(+), 128 deletions(-)
 delete mode 100644 xen/drivers/char/dt-uart.c

Comments

Parth Dixit May 24, 2015, 7:07 a.m. UTC | #1
On 21 May 2015 at 16:58, Julien Grall <julien.grall@citrix.com> wrote:

> Hi Parth,
>
> On 17/05/15 21:03, Parth Dixit wrote:
> > Rename dt-uart.c to arm-uart.c and create new generic uart init function.
> > move dt_uart_init to uart_init.Refactor pl011 driver to dt and common
> > initialization parts. This will be useful later when acpi specific
> > uart initialization function is introduced.
>
> There is 2 distinct changes in this patch:
>         - Introduction of the generic UART
>         - Refactoring of PL011
>
> Each changes should be in a separate patch for helping the review.
>
> ok, will move into seperate patches.

> > Signed-off-by: Parth Dixit <parth.dixit@linaro.org>
> > ---
> >  xen/arch/arm/setup.c       |   2 +-
> >  xen/drivers/char/Makefile  |   2 +-
> >  xen/drivers/char/dt-uart.c | 107
> ---------------------------------------------
> >  xen/drivers/char/pl011.c   |  47 ++++++++++++--------
> >  xen/include/xen/serial.h   |   3 +-
> >  5 files changed, 33 insertions(+), 128 deletions(-)
> >  delete mode 100644 xen/drivers/char/dt-uart.c
> >
> > diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
> > index 5711077..1b2d74c 100644
> > --- a/xen/arch/arm/setup.c
> > +++ b/xen/arch/arm/setup.c
> > @@ -771,7 +771,7 @@ void __init start_xen(unsigned long boot_phys_offset,
> >
> >      gic_preinit();
> >
> > -    dt_uart_init();
> > +    uart_init();
>
> As said by Jan, this is arm specific. I would rename into arm_uart_init.
>
> >      console_init_preirq();
> >      console_init_ring();
> >
> > diff --git a/xen/drivers/char/Makefile b/xen/drivers/char/Makefile
> > index 47fc3f9..a8f65c1 100644
> > --- a/xen/drivers/char/Makefile
> > +++ b/xen/drivers/char/Makefile
> > @@ -6,5 +6,5 @@ obj-$(HAS_EXYNOS4210) += exynos4210-uart.o
> >  obj-$(HAS_OMAP) += omap-uart.o
> >  obj-$(HAS_SCIF) += scif-uart.o
> >  obj-$(HAS_EHCI) += ehci-dbgp.o
> > -obj-$(CONFIG_ARM) += dt-uart.o
> > +obj-$(CONFIG_ARM) += arm-uart.o
> >  obj-y += serial.o
>
> > diff --git a/xen/drivers/char/pl011.c b/xen/drivers/char/pl011.c
> > index 67e6df5..f0c3daf 100644
> > --- a/xen/drivers/char/pl011.c
> > +++ b/xen/drivers/char/pl011.c
> > @@ -225,9 +225,32 @@ static struct uart_driver __read_mostly
> pl011_driver = {
> >      .stop_tx      = pl011_tx_stop,
> >      .vuart_info   = pl011_vuart,
> >  };
> > +static int __init pl011_uart_init(struct pl011 *uart, u64 addr, u64
> size)
> > +{
> > +    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;
> > +
> > +    return 0;
> > +}
> >
> >  /* TODO: Parse UART config from the command line */
> > -static int __init pl011_uart_init(struct dt_device_node *dev,
> > +static int __init dt_pl011_uart_init(struct dt_device_node *dev,
> >                                    const void *data)
> >  {
> >      const char *config = data;
> > @@ -242,12 +265,6 @@ static int __init pl011_uart_init(struct
> dt_device_node *dev,
> >
> >      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 )
> >      {
> > @@ -264,19 +281,13 @@ static int __init pl011_uart_init(struct
> dt_device_node *dev,
> >      }
> >      uart->irq = res;
>
> IRQ can be passed as parameters of pl011_uart_init.
>
> >
> > -    uart->regs = ioremap_nocache(addr, size);
> > -    if ( !uart->regs )
> > +    res = pl011_uart_init(uart, 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);
>
> This could be moved in pl011_uart_init. With the other changes suggested
> above, you don't need anymore the variable uart here and the code would
> be more compact.
>
> >
> > @@ -293,7 +304,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
> >
> >  /*
> > diff --git a/xen/include/xen/serial.h b/xen/include/xen/serial.h
> > index 71e6ade..484a6a8 100644
> > --- a/xen/include/xen/serial.h
> > +++ b/xen/include/xen/serial.h
> > @@ -98,6 +98,7 @@ struct uart_driver {
> >  #define SERHND_HI       (1<<2) /* Mux/demux each transferred char by
> MSB. */
> >  #define SERHND_LO       (1<<3) /* Ditto, except that the MSB is
> cleared.  */
> >  #define SERHND_COOKED   (1<<4) /* Newline/carriage-return translation?
>   */
> > +#define SERHND_UART     (0<<0) /* handler configured from ACPI */
>
> Why did you introduce a new SERHND rather than renaming SERHND_DTUART?
>
> Regards,
>
> --
> Julien Grall
>
Parth Dixit July 5, 2015, 1:14 p.m. UTC | #2
+shannon

On 24 May 2015 at 13:18, Julien Grall <julien.grall@citrix.com> wrote:
>
> On 24/05/2015 08:07, Parth Dixit wrote:
>>
>>
>>
>> On 21 May 2015 at 16:58, Julien Grall <julien.grall@citrix.com
>> <mailto:julien.grall@citrix.com>> wrote:
>>
>>     Hi Parth,
>>
>>     On 17/05/15 21:03, Parth Dixit wrote:
>>     > Rename dt-uart.c to arm-uart.c and create new generic uart init
>> function.
>>      > move dt_uart_init to uart_init.Refactor pl011 driver to dt and
>> common
>>     > initialization parts. This will be useful later when acpi specific
>>     > uart initialization function is introduced.
>>
>>     There is 2 distinct changes in this patch:
>>              - Introduction of the generic UART
>>              - Refactoring of PL011
>>
>>     Each changes should be in a separate patch for helping the review.
>>
>> ok, will move into seperate patches.
>
>
> Thank you. It would make sense to gather all the re-factoring patches in the
> beginning of the series. So we could push them without waiting the rest of
> the series.
>
> BTW, it seems that your mail client is using tabulation for quoting which is
> difficult to read after a couple of back and forth. Can you try to configure
> it correctly to use ">"? Maybe it's because of HTML mail?
>
> Regards,
>
> --
> Julien Grall
diff mbox

Patch

diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
index 5711077..1b2d74c 100644
--- a/xen/arch/arm/setup.c
+++ b/xen/arch/arm/setup.c
@@ -771,7 +771,7 @@  void __init start_xen(unsigned long boot_phys_offset,
 
     gic_preinit();
 
-    dt_uart_init();
+    uart_init();
     console_init_preirq();
     console_init_ring();
 
diff --git a/xen/drivers/char/Makefile b/xen/drivers/char/Makefile
index 47fc3f9..a8f65c1 100644
--- a/xen/drivers/char/Makefile
+++ b/xen/drivers/char/Makefile
@@ -6,5 +6,5 @@  obj-$(HAS_EXYNOS4210) += exynos4210-uart.o
 obj-$(HAS_OMAP) += omap-uart.o
 obj-$(HAS_SCIF) += scif-uart.o
 obj-$(HAS_EHCI) += ehci-dbgp.o
-obj-$(CONFIG_ARM) += dt-uart.o
+obj-$(CONFIG_ARM) += arm-uart.o
 obj-y += serial.o
diff --git a/xen/drivers/char/dt-uart.c b/xen/drivers/char/dt-uart.c
deleted file mode 100644
index d599322..0000000
--- a/xen/drivers/char/dt-uart.c
+++ /dev/null
@@ -1,107 +0,0 @@ 
-/*
- * xen/drivers/char/dt-uart.c
- *
- * Generic uart retrieved via the device tree
- *
- * Julien Grall <julien.grall@linaro.org>
- * Copyright (c) 2013 Linaro Limited.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- */
-
-#include <asm/device.h>
-#include <asm/types.h>
-#include <xen/console.h>
-#include <xen/device_tree.h>
-#include <xen/serial.h>
-#include <xen/errno.h>
-
-/*
- * Configure UART port with a string:
- * path:options
- *
- * @path: full path used in the device tree for the UART. If the path
- * doesn't start with '/', we assuming that it's an alias.
- * @options: UART speficic options (see in each UART driver)
- */
-static char __initdata opt_dtuart[256] = "";
-string_param("dtuart", opt_dtuart);
-
-void __init dt_uart_init(void)
-{
-    struct dt_device_node *dev;
-    int ret;
-    const char *devpath = opt_dtuart;
-    char *options;
-
-    if ( !console_has("dtuart") )
-        return; /* Not for us */
-
-    if ( !strcmp(opt_dtuart, "") )
-    {
-        const struct dt_device_node *chosen = dt_find_node_by_path("/chosen");
-
-        if ( chosen )
-        {
-            const char *stdout;
-
-            ret = dt_property_read_string(chosen, "stdout-path", &stdout);
-            if ( ret >= 0 )
-            {
-                printk("Taking dtuart configuration from /chosen/stdout-path\n");
-                if ( strlcpy(opt_dtuart, stdout, sizeof(opt_dtuart))
-                     >= sizeof(opt_dtuart) )
-                    printk("WARNING: /chosen/stdout-path too long, truncated\n");
-            }
-            else if ( ret != -EINVAL /* Not present */ )
-                printk("Failed to read /chosen/stdout-path (%d)\n", ret);
-        }
-    }
-
-    if ( !strcmp(opt_dtuart, "") )
-    {
-        printk("No dtuart path configured\n");
-        return;
-    }
-
-    options = strchr(opt_dtuart, ':');
-    if ( options != NULL )
-        *(options++) = '\0';
-    else
-        options = "";
-
-    printk("Looking for dtuart at \"%s\", options \"%s\"\n", devpath, options);
-    if ( *devpath == '/' )
-        dev = dt_find_node_by_path(devpath);
-    else
-        dev = dt_find_node_by_alias(devpath);
-
-    if ( !dev )
-    {
-        printk("Unable to find device \"%s\"\n", devpath);
-        return;
-    }
-
-    ret = device_init(dev, DEVICE_SERIAL, options);
-
-    if ( ret )
-        printk("Unable to initialize dtuart: %d\n", ret);
-}
-
-/*
- * Local variables:
- * mode: C
- * c-file-style: "BSD"
- * c-basic-offset: 4
- * tab-width: 4
- * indent-tabs-mode: nil
- * End:
- */
diff --git a/xen/drivers/char/pl011.c b/xen/drivers/char/pl011.c
index 67e6df5..f0c3daf 100644
--- a/xen/drivers/char/pl011.c
+++ b/xen/drivers/char/pl011.c
@@ -225,9 +225,32 @@  static struct uart_driver __read_mostly pl011_driver = {
     .stop_tx      = pl011_tx_stop,
     .vuart_info   = pl011_vuart,
 };
+static int __init pl011_uart_init(struct pl011 *uart, u64 addr, u64 size)
+{
+    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;
+
+    return 0;
+}
 
 /* TODO: Parse UART config from the command line */
-static int __init pl011_uart_init(struct dt_device_node *dev,
+static int __init dt_pl011_uart_init(struct dt_device_node *dev,
                                   const void *data)
 {
     const char *config = data;
@@ -242,12 +265,6 @@  static int __init pl011_uart_init(struct dt_device_node *dev,
 
     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 )
     {
@@ -264,19 +281,13 @@  static int __init pl011_uart_init(struct dt_device_node *dev,
     }
     uart->irq = res;
 
-    uart->regs = ioremap_nocache(addr, size);
-    if ( !uart->regs )
+    res = pl011_uart_init(uart, 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);
 
@@ -293,7 +304,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
 
 /*
diff --git a/xen/include/xen/serial.h b/xen/include/xen/serial.h
index 71e6ade..484a6a8 100644
--- a/xen/include/xen/serial.h
+++ b/xen/include/xen/serial.h
@@ -98,6 +98,7 @@  struct uart_driver {
 #define SERHND_HI       (1<<2) /* Mux/demux each transferred char by MSB. */
 #define SERHND_LO       (1<<3) /* Ditto, except that the MSB is cleared.  */
 #define SERHND_COOKED   (1<<4) /* Newline/carriage-return translation?    */
+#define SERHND_UART     (0<<0) /* handler configured from ACPI */
 
 /* Two-stage initialisation (before/after IRQ-subsystem initialisation). */
 void serial_init_preirq(void);
@@ -170,7 +171,7 @@  struct ns16550_defaults {
 void ns16550_init(int index, struct ns16550_defaults *defaults);
 void ehci_dbgp_init(void);
 
-void __init dt_uart_init(void);
+void __init uart_init(void);
 
 struct physdev_dbgp_op;
 int dbgp_op(const struct physdev_dbgp_op *);