qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [RFC/RFT v1 1/2] arm: tosa: QOMify NAND/display/irq control


From: Peter Crosthwaite
Subject: [Qemu-devel] [RFC/RFT v1 1/2] arm: tosa: QOMify NAND/display/irq controller
Date: Tue, 11 Feb 2014 17:13:22 -0800

First step QOMficiation of the tosa IO controller (NAND display and
interrupts. Setup the memory regions and IRQ properly as per sysbus.

Signed-off-by: Peter Crosthwaite <address@hidden>
---

 hw/arm/tosa.c         | 12 ++++++++++--
 hw/display/tc6393xb.c | 36 +++++++++++++++++++++++++++++-------
 include/hw/devices.h  |  2 --
 3 files changed, 39 insertions(+), 11 deletions(-)

diff --git a/hw/arm/tosa.c b/hw/arm/tosa.c
index c00d8c2..941ab4d 100644
--- a/hw/arm/tosa.c
+++ b/hw/arm/tosa.c
@@ -227,8 +227,16 @@ static void tosa_init(QEMUMachineInitArgs *args)
     memory_region_set_readonly(rom, true);
     memory_region_add_subregion(address_space_mem, 0, rom);
 
-    tmio = tc6393xb_init(address_space_mem, 0x10000000,
-            qdev_get_gpio_in(mpu->gpio, TOSA_GPIO_TC6393XB_INT));
+    /*
+     * FIXME: remove this fishy cast when the board gets some
+     * more QOMification
+     */
+    tmio = (TC6393xbState *)object_new("TC6393xb");
+    sysbus_mmio_map(SYS_BUS_DEVICE(tmio), 0, 0x10000000);
+    sysbus_mmio_map(SYS_BUS_DEVICE(tmio), 1, 0x10100000);
+    sysbus_connect_irq(SYS_BUS_DEVICE(tmio), 0,
+                       qdev_get_gpio_in(mpu->gpio, TOSA_GPIO_TC6393XB_INT));
+    object_property_set_bool(OBJECT(tmio), true, "realized", NULL);
 
     scp0 = sysbus_create_simple("scoop", 0x08800000, NULL);
     scp1 = sysbus_create_simple("scoop", 0x14800040, NULL);
diff --git a/hw/display/tc6393xb.c b/hw/display/tc6393xb.c
index 3dd9b98..f78a9d0 100644
--- a/hw/display/tc6393xb.c
+++ b/hw/display/tc6393xb.c
@@ -12,6 +12,7 @@
  */
 #include "hw/hw.h"
 #include "hw/devices.h"
+#include "hw/sysbus.h"
 #include "hw/block/flash.h"
 #include "ui/console.h"
 #include "ui/pixel_ops.h"
@@ -82,6 +83,10 @@
 #define NAND_MODE_ECC_RST   0x60
 
 struct TC6393xbState {
+    /*< private >*/
+    SysBusDevice parent_obj;
+    /*< public >*/
+
     MemoryRegion iomem;
     qemu_irq irq;
     qemu_irq *sub_irqs;
@@ -134,6 +139,11 @@ struct TC6393xbState {
              blanked : 1;
 };
 
+#define TYPE_TC6393XB "TC6393xb"
+
+#define TC6393XB(obj) \
+    OBJECT_CHECK(TC6393xbState, (obj), TYPE_TC6393XB)
+
 qemu_irq *tc6393xb_gpio_in_get(TC6393xbState *s)
 {
     return s->gpio_in;
@@ -552,9 +562,9 @@ static const GraphicHwOps tc6393xb_gfx_ops = {
     .gfx_update  = tc6393xb_update_display,
 };
 
-TC6393xbState *tc6393xb_init(MemoryRegion *sysmem, uint32_t base, qemu_irq irq)
+static void tc6393xb_init(Object *obj)
 {
-    TC6393xbState *s;
+    TC6393xbState *s = TC6393XB(obj);
     DriveInfo *nand;
     static const MemoryRegionOps tc6393xb_ops = {
         .read = tc6393xb_readb,
@@ -566,8 +576,7 @@ TC6393xbState *tc6393xb_init(MemoryRegion *sysmem, uint32_t 
base, qemu_irq irq)
         },
     };
 
-    s = (TC6393xbState *) g_malloc0(sizeof(TC6393xbState));
-    s->irq = irq;
+    sysbus_init_irq(SYS_BUS_DEVICE(s), &s->irq);
     s->gpio_in = qemu_allocate_irqs(tc6393xb_gpio_set, s, TC6393XB_GPIOS);
 
     s->l3v = *qemu_allocate_irqs(tc6393xb_l3v, s, 1);
@@ -579,15 +588,28 @@ TC6393xbState *tc6393xb_init(MemoryRegion *sysmem, 
uint32_t base, qemu_irq irq)
     s->flash = nand_init(nand ? nand->bdrv : NULL, NAND_MFR_TOSHIBA, 0x76);
 
     memory_region_init_io(&s->iomem, NULL, &tc6393xb_ops, s, "tc6393xb", 
0x10000);
-    memory_region_add_subregion(sysmem, base, &s->iomem);
+    sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->iomem);
 
     memory_region_init_ram(&s->vram, NULL, "tc6393xb.vram", 0x100000);
     vmstate_register_ram_global(&s->vram);
     s->vram_ptr = memory_region_get_ram_ptr(&s->vram);
-    memory_region_add_subregion(sysmem, base + 0x100000, &s->vram);
+    sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->vram);
+
     s->scr_width = 480;
     s->scr_height = 640;
     s->con = graphic_console_init(NULL, &tc6393xb_gfx_ops, s);
+}
 
-    return s;
+static const TypeInfo tc6393xb_info = {
+    .name           = TYPE_TC6393XB,
+    .parent         = TYPE_SYS_BUS_DEVICE,
+    .instance_size  = sizeof(TC6393xbState),
+    .instance_init  = tc6393xb_init,
+};
+
+static void tc6393xb_register(void)
+{
+    type_register_static(&tc6393xb_info);
 }
+
+type_init(tc6393xb_register)
diff --git a/include/hw/devices.h b/include/hw/devices.h
index c60bcab..d3c1108 100644
--- a/include/hw/devices.h
+++ b/include/hw/devices.h
@@ -55,8 +55,6 @@ void retu_key_event(void *retu, int state);
 /* tc6393xb.c */
 typedef struct TC6393xbState TC6393xbState;
 #define TC6393XB_RAM   0x110000 /* amount of ram for Video and USB */
-TC6393xbState *tc6393xb_init(struct MemoryRegion *sysmem,
-                             uint32_t base, qemu_irq irq);
 void tc6393xb_gpio_out_set(TC6393xbState *s, int line,
                     qemu_irq handler);
 qemu_irq *tc6393xb_gpio_in_get(TC6393xbState *s);
-- 
1.8.5.4




reply via email to

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