Signed-off-by: Benoit Canet <benoit.ca...@gmail.com> --- hw/integratorcp.c | 19 +++++++++++++------ 1 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/hw/integratorcp.c b/hw/integratorcp.c index 7f79560..70fedbe 100644 --- a/hw/integratorcp.c +++ b/hw/integratorcp.c @@ -393,6 +393,11 @@ static int icp_pic_init(SysBusDevice *dev) /* CP control registers. */ +typedef struct icp_control_state { + SysBusDevice busdev; + MemoryRegion iomem; +} icp_control_state; + static uint64_t icp_control_read(void *opaque, target_phys_addr_t offset, unsigned size) { @@ -431,15 +436,15 @@ static const MemoryRegionOps icp_control_ops = { .endianness = DEVICE_NATIVE_ENDIAN, }; -static void icp_control_init(target_phys_addr_t base) +static int icp_control_init(SysBusDevice *dev) { - MemoryRegion *io; + icp_control_state *s = FROM_SYSBUS(icp_control_state, dev); - io = (MemoryRegion *)g_malloc0(sizeof(MemoryRegion)); - memory_region_init_io(io, &icp_control_ops, NULL, + memory_region_init_io(&s->iomem, &icp_control_ops, s, "control", 0x00800000); - memory_region_add_subregion(get_system_memory(), base, io); + sysbus_init_mmio_region(dev, &s->iomem); /* ??? Save/restore. */ + return 0; } @@ -498,7 +503,7 @@ static void integratorcp_init(ram_addr_t ram_size, sysbus_create_simple("pl031", 0x15000000, pic[8]); sysbus_create_simple("pl011", 0x16000000, pic[1]); sysbus_create_simple("pl011", 0x17000000, pic[2]); - icp_control_init(0xcb000000); + sysbus_create_simple("integrator_control", 0xcb000000, NULL); sysbus_create_simple("pl050_keyboard", 0x18000000, pic[3]); sysbus_create_simple("pl050_mouse", 0x19000000, pic[4]); sysbus_create_varargs("pl181", 0x1c000000, pic[23], pic[24], NULL); @@ -541,6 +546,8 @@ static SysBusDeviceInfo core_info = { static void integratorcp_register_devices(void) { sysbus_register_dev("integrator_pic", sizeof(icp_pic_state), icp_pic_init); + sysbus_register_dev("integrator_control", sizeof(icp_control_state), + icp_control_init); sysbus_register_withprop(&core_info); } -- 1.7.5.4