Patchwork integratorcp: convert control to sysbus

login
register
mail settings
Submitter Benoit Canet
Date Oct. 19, 2011, 11:14 a.m.
Message ID <1319022842-4309-2-git-send-email-benoit.canet@gmail.com>
Download mbox | patch
Permalink /patch/120594/
State New
Headers show

Comments

Benoit Canet - Oct. 19, 2011, 11:14 a.m.
Signed-off-by: Benoit Canet <benoit.canet@gmail.com>
---
 hw/integratorcp.c |   19 +++++++++++++------
 1 files changed, 13 insertions(+), 6 deletions(-)
Peter Maydell - Oct. 19, 2011, 12:42 p.m.
2011/10/19 Benoît Canet <benoit.canet@gmail.com>:
> +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;
>  }

You should delete the "??? Save/restore" comment -- the
device currently has no state it needs to save/restore, and
now it's a sysbus device we have an easy path to add save/restore
if we do add state (ie we can at that point give it a vmstate).

Otherwise looks good.

-- PMM

Patch

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);
 }