diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2009-07-15 13:43:31 +0200 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2009-07-16 17:28:51 -0500 |
commit | ee6847d19be16c789b8bd4e553b7cd6701ba1245 (patch) | |
tree | 41845b3b1e8740ce97daf0582e124c6b6e0a6873 /hw/integratorcp.c | |
parent | f114784f69ec3b9af342148025de14dbd1b429a5 (diff) |
qdev: rework device properties.
This patch is a major overhaul of the device properties. The properties
are saved directly in the device state struct now, the linked list of
property values is gone.
Advantages:
* We don't have to maintain the list with the property values.
* The value in the property list and the value actually used by
the device can't go out of sync any more (used to happen for
the pci.devfn == -1 case) because there is only one place where
the value is stored.
* A record describing the property is required now, you can't set
random properties any more.
There are bus-specific and device-specific properties. The former
should be used for properties common to all bus drivers. Typical
use case is bus addressing, i.e. pci.devfn and i2c.address.
Properties have a PropertyInfo struct attached with name, size and
function pointers to parse and print properties. A few common property
types have PropertyInfos defined in qdev-properties.c. Drivers are free
to implement their own very special property parsers if needed.
Properties can have default values. If unset they are zero-filled.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'hw/integratorcp.c')
-rw-r--r-- | hw/integratorcp.c | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/hw/integratorcp.c b/hw/integratorcp.c index 50eae0c340..ddc8d8556f 100644 --- a/hw/integratorcp.c +++ b/hw/integratorcp.c @@ -17,6 +17,7 @@ typedef struct { SysBusDevice busdev; + uint32_t memsz; uint32_t flash_offset; uint32_t cm_osc; uint32_t cm_ctrl; @@ -230,23 +231,21 @@ static void integratorcm_init(SysBusDevice *dev) { int iomemtype; integratorcm_state *s = FROM_SYSBUS(integratorcm_state, dev); - int memsz; - memsz = qdev_get_prop_int(&dev->qdev, "memsz", 0); s->cm_osc = 0x01000048; /* ??? What should the high bits of this value be? */ s->cm_auxosc = 0x0007feff; s->cm_sdram = 0x00011122; - if (memsz >= 256) { + if (s->memsz >= 256) { integrator_spd[31] = 64; s->cm_sdram |= 0x10; - } else if (memsz >= 128) { + } else if (s->memsz >= 128) { integrator_spd[31] = 32; s->cm_sdram |= 0x0c; - } else if (memsz >= 64) { + } else if (s->memsz >= 64) { integrator_spd[31] = 16; s->cm_sdram |= 0x08; - } else if (memsz >= 32) { + } else if (s->memsz >= 32) { integrator_spd[31] = 4; s->cm_sdram |= 0x04; } else { @@ -475,7 +474,7 @@ static void integratorcp_init(ram_addr_t ram_size, cpu_register_physical_memory(0x80000000, ram_size, ram_offset | IO_MEM_RAM); dev = qdev_create(NULL, "integrator_core"); - qdev_set_prop_int(dev, "memsz", ram_size >> 20); + qdev_prop_set_uint32(dev, "memsz", ram_size >> 20); qdev_init(dev); sysbus_mmio_map((SysBusDevice *)dev, 0, 0x10000000); @@ -522,11 +521,24 @@ static void integratorcp_machine_init(void) machine_init(integratorcp_machine_init); +static SysBusDeviceInfo core_info = { + .init = integratorcm_init, + .qdev.name = "integrator_core", + .qdev.size = sizeof(integratorcm_state), + .qdev.props = (Property[]) { + { + .name = "memsz", + .info = &qdev_prop_uint32, + .offset = offsetof(integratorcm_state, memsz), + }, + {/* end of list */} + } +}; + static void integratorcp_register_devices(void) { sysbus_register_dev("integrator_pic", sizeof(icp_pic_state), icp_pic_init); - sysbus_register_dev("integrator_core", sizeof(integratorcm_state), - integratorcm_init); + sysbus_register_withprop(&core_info); } device_init(integratorcp_register_devices) |