qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [RFC v0 10/10] serial: added fdt generic platform support


From: Peter A. G. Crosthwaite
Subject: [Qemu-devel] [RFC v0 10/10] serial: added fdt generic platform support
Date: Mon, 17 Sep 2012 19:03:02 +1000

fdt generic platform support for 16550 uarts.

Signed-off-by: Peter A. G. Crosthwaite <address@hidden>
---
 hw/fdt_generic_devices.c |   39 +++++++++++++++++++++++++++++++++++++--
 1 files changed, 37 insertions(+), 2 deletions(-)

diff --git a/hw/fdt_generic_devices.c b/hw/fdt_generic_devices.c
index 91b3c5b..69017e8 100644
--- a/hw/fdt_generic_devices.c
+++ b/hw/fdt_generic_devices.c
@@ -1,4 +1,3 @@
-
 #include "blockdev.h"
 
 #include "fdt_generic_util.h"
@@ -42,4 +41,40 @@ int pflash_cfi01_fdt_init(char *node_path, FDTMachineInfo 
*fdti, void *opaque)
     return 0;
 }
 
-#endif /* CONFIG_FDT */
+static int uart16550_fdt_init(char *node_path, FDTMachineInfo *fdti,
+    void *priv)
+{
+    /* FIXME: Pass in dynamically */
+    MemoryRegion *address_space_mem = get_system_memory();
+    target_phys_addr_t base;
+    int baudrate;
+    qemu_irq irqline;
+    char irq_info[1024];
+    void *serial = NULL;
+    Error *errp = NULL;
+
+    base = qemu_devtree_getprop_cell(fdti->fdt, node_path, "reg", 0,
+                                        false, &errp);
+    base += qemu_devtree_getprop_cell(fdti->fdt, node_path, "reg-offset", 0,
+                                        false, &errp);
+    assert_no_error(errp);
+    base &= ~3ULL; /* qemu uart16550 model starts with 3* 8bit offset */
+
+    baudrate = qemu_devtree_getprop_cell(fdti->fdt, node_path, "current-speed",
+                                            0, false, &errp);
+    if (errp) {
+        baudrate = 115200;
+    }
+
+    irqline = fdt_get_irq_info(fdti, node_path, 0 , NULL, irq_info);
+    printf("FDT: UART16550a: baseaddr: 0x"
+           TARGET_FMT_plx ", irq: %s, baud %d\n", base, irq_info, baudrate);
+
+    /* it_shift = 2, reg-shift in DTS - for Xilnx IP is hardcoded */
+    serial = serial_mm_init(address_space_mem, base, 2, irqline, baudrate,
+                            qemu_char_get_next_serial(), DEVICE_LITTLE_ENDIAN);
+    return 0;
+}
+
+fdt_register_compatibility_n(uart16550_fdt_init, "ns16550", 0);
+fdt_register_compatibility_n(uart16550_fdt_init, "ns16550a", 1);
-- 
1.7.0.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]