@@ -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);
}
Signed-off-by: Benoit Canet <benoit.canet@gmail.com> --- hw/integratorcp.c | 19 +++++++++++++------ 1 files changed, 13 insertions(+), 6 deletions(-)