[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