integratorcp: convert control to sysbus

Submitted by Benoit Canet on Oct. 19, 2011, 12:56 p.m.

Details

Message ID 1319028990-5076-2-git-send-email-benoit.canet@gmail.com
State New
Headers show

Commit Message

Benoit Canet Oct. 19, 2011, 12:56 p.m.
Signed-off-by: Benoit Canet <benoit.canet@gmail.com>
---
 hw/integratorcp.c |   20 +++++++++++++-------
 1 files changed, 13 insertions(+), 7 deletions(-)

Comments

Peter Maydell Oct. 19, 2011, 1:12 p.m.
2011/10/19 BenoƮt Canet <benoit.canet@gmail.com>:
> Signed-off-by: Benoit Canet <benoit.canet@gmail.com>

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

Avi -- since this applies on top of the memory region
conversions in your queue, do you want to take this
patch too? Otherwise I'll just have to hold onto it
until you land those...

thanks
-- PMM

Patch hide | download patch | download mbox

diff --git a/hw/integratorcp.c b/hw/integratorcp.c
index 7f79560..7ad68b7 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,14 @@  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);
-    /* ??? Save/restore.  */
+    sysbus_init_mmio_region(dev, &s->iomem);
+    return 0;
 }
 
 
@@ -498,7 +502,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 +545,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);
 }