pl061: QOM'ify pl061 and pl061_luminary

Let pl061_luminary inherit from pl061, with differing instance_init.
Introduce type constant and use QOM casts.

Signed-off-by: Andreas Färber <afaerber@suse.de>
This commit is contained in:
Andreas Färber 2013-07-26 17:31:46 +02:00
parent ee663e96e4
commit 692a76d1c4

View File

@ -28,8 +28,12 @@ static const uint8_t pl061_id[12] =
static const uint8_t pl061_id_luminary[12] =
{ 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x18, 0x01, 0x0d, 0xf0, 0x05, 0xb1 };
#define TYPE_PL061 "pl061"
#define PL061(obj) OBJECT_CHECK(PL061State, (obj), TYPE_PL061)
typedef struct PL061State {
SysBusDevice busdev;
SysBusDevice parent_obj;
MemoryRegion iomem;
uint32_t locked;
uint32_t data;
@ -272,27 +276,32 @@ static const MemoryRegionOps pl061_ops = {
.endianness = DEVICE_NATIVE_ENDIAN,
};
static int pl061_init(SysBusDevice *dev, const unsigned char *id)
static int pl061_initfn(SysBusDevice *sbd)
{
PL061State *s = FROM_SYSBUS(PL061State, dev);
s->id = id;
DeviceState *dev = DEVICE(sbd);
PL061State *s = PL061(dev);
memory_region_init_io(&s->iomem, OBJECT(s), &pl061_ops, s, "pl061", 0x1000);
sysbus_init_mmio(dev, &s->iomem);
sysbus_init_irq(dev, &s->irq);
qdev_init_gpio_in(&dev->qdev, pl061_set_irq, 8);
qdev_init_gpio_out(&dev->qdev, s->out, 8);
sysbus_init_mmio(sbd, &s->iomem);
sysbus_init_irq(sbd, &s->irq);
qdev_init_gpio_in(dev, pl061_set_irq, 8);
qdev_init_gpio_out(dev, s->out, 8);
pl061_reset(s);
return 0;
}
static int pl061_init_luminary(SysBusDevice *dev)
static void pl061_luminary_init(Object *obj)
{
return pl061_init(dev, pl061_id_luminary);
PL061State *s = PL061(obj);
s->id = pl061_id_luminary;
}
static int pl061_init_arm(SysBusDevice *dev)
static void pl061_init(Object *obj)
{
return pl061_init(dev, pl061_id);
PL061State *s = PL061(obj);
s->id = pl061_id;
}
static void pl061_class_init(ObjectClass *klass, void *data)
@ -300,31 +309,22 @@ static void pl061_class_init(ObjectClass *klass, void *data)
DeviceClass *dc = DEVICE_CLASS(klass);
SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
k->init = pl061_init_arm;
k->init = pl061_initfn;
dc->vmsd = &vmstate_pl061;
}
static const TypeInfo pl061_info = {
.name = "pl061",
.name = TYPE_PL061,
.parent = TYPE_SYS_BUS_DEVICE,
.instance_size = sizeof(PL061State),
.instance_init = pl061_init,
.class_init = pl061_class_init,
};
static void pl061_luminary_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
k->init = pl061_init_luminary;
dc->vmsd = &vmstate_pl061;
}
static const TypeInfo pl061_luminary_info = {
.name = "pl061_luminary",
.parent = TYPE_SYS_BUS_DEVICE,
.instance_size = sizeof(PL061State),
.class_init = pl061_luminary_class_init,
.parent = TYPE_PL061,
.instance_init = pl061_luminary_init,
};
static void pl061_register_types(void)