|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 20/41] arm : create generic uart initialization function
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@xxxxxxxxxx>
---
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();
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@xxxxxxxxxx>
- * 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 *);
--
1.9.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |