pl110: QOM'ify pl110, pl110_versatile and pl111
Let pl110_versatile and pl111 inherit from pl110 and use PL110() cast; set their version index in an instance_init. Reviewed-by: Hu Tao <hutao@cn.fujitsu.com> [AF: Set version PL110 explicitly, suggested by Hu Tao; fixed inheritence] Signed-off-by: Andreas Färber <afaerber@suse.de>
This commit is contained in:
parent
513960eaae
commit
5d7a11e438
@ -39,8 +39,12 @@ enum pl110_version
|
|||||||
PL111
|
PL111
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define TYPE_PL110 "pl110"
|
||||||
|
#define PL110(obj) OBJECT_CHECK(PL110State, (obj), TYPE_PL110)
|
||||||
|
|
||||||
typedef struct PL110State {
|
typedef struct PL110State {
|
||||||
SysBusDevice busdev;
|
SysBusDevice parent_obj;
|
||||||
|
|
||||||
MemoryRegion iomem;
|
MemoryRegion iomem;
|
||||||
QemuConsole *con;
|
QemuConsole *con;
|
||||||
|
|
||||||
@ -129,6 +133,7 @@ static int pl110_enabled(PL110State *s)
|
|||||||
static void pl110_update_display(void *opaque)
|
static void pl110_update_display(void *opaque)
|
||||||
{
|
{
|
||||||
PL110State *s = (PL110State *)opaque;
|
PL110State *s = (PL110State *)opaque;
|
||||||
|
SysBusDevice *sbd;
|
||||||
DisplaySurface *surface = qemu_console_surface(s->con);
|
DisplaySurface *surface = qemu_console_surface(s->con);
|
||||||
drawfn* fntable;
|
drawfn* fntable;
|
||||||
drawfn fn;
|
drawfn fn;
|
||||||
@ -138,8 +143,11 @@ static void pl110_update_display(void *opaque)
|
|||||||
int first;
|
int first;
|
||||||
int last;
|
int last;
|
||||||
|
|
||||||
if (!pl110_enabled(s))
|
if (!pl110_enabled(s)) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sbd = SYS_BUS_DEVICE(s);
|
||||||
|
|
||||||
switch (surface_bits_per_pixel(surface)) {
|
switch (surface_bits_per_pixel(surface)) {
|
||||||
case 0:
|
case 0:
|
||||||
@ -232,7 +240,7 @@ static void pl110_update_display(void *opaque)
|
|||||||
}
|
}
|
||||||
dest_width *= s->cols;
|
dest_width *= s->cols;
|
||||||
first = 0;
|
first = 0;
|
||||||
framebuffer_update_display(surface, sysbus_address_space(&s->busdev),
|
framebuffer_update_display(surface, sysbus_address_space(sbd),
|
||||||
s->upbase, s->cols, s->rows,
|
s->upbase, s->cols, s->rows,
|
||||||
src_width, dest_width, 0,
|
src_width, dest_width, 0,
|
||||||
s->invalidate,
|
s->invalidate,
|
||||||
@ -449,30 +457,38 @@ static const GraphicHwOps pl110_gfx_ops = {
|
|||||||
.gfx_update = pl110_update_display,
|
.gfx_update = pl110_update_display,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int pl110_init(SysBusDevice *dev)
|
static int pl110_initfn(SysBusDevice *sbd)
|
||||||
{
|
{
|
||||||
PL110State *s = FROM_SYSBUS(PL110State, dev);
|
DeviceState *dev = DEVICE(sbd);
|
||||||
|
PL110State *s = PL110(dev);
|
||||||
|
|
||||||
memory_region_init_io(&s->iomem, OBJECT(s), &pl110_ops, s, "pl110", 0x1000);
|
memory_region_init_io(&s->iomem, OBJECT(s), &pl110_ops, s, "pl110", 0x1000);
|
||||||
sysbus_init_mmio(dev, &s->iomem);
|
sysbus_init_mmio(sbd, &s->iomem);
|
||||||
sysbus_init_irq(dev, &s->irq);
|
sysbus_init_irq(sbd, &s->irq);
|
||||||
qdev_init_gpio_in(&s->busdev.qdev, pl110_mux_ctrl_set, 1);
|
qdev_init_gpio_in(dev, pl110_mux_ctrl_set, 1);
|
||||||
s->con = graphic_console_init(DEVICE(dev), &pl110_gfx_ops, s);
|
s->con = graphic_console_init(dev, &pl110_gfx_ops, s);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pl110_versatile_init(SysBusDevice *dev)
|
static void pl110_init(Object *obj)
|
||||||
{
|
{
|
||||||
PL110State *s = FROM_SYSBUS(PL110State, dev);
|
PL110State *s = PL110(obj);
|
||||||
s->version = PL110_VERSATILE;
|
|
||||||
return pl110_init(dev);
|
s->version = PL110;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pl111_init(SysBusDevice *dev)
|
static void pl110_versatile_init(Object *obj)
|
||||||
{
|
{
|
||||||
PL110State *s = FROM_SYSBUS(PL110State, dev);
|
PL110State *s = PL110(obj);
|
||||||
|
|
||||||
|
s->version = PL110_VERSATILE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pl111_init(Object *obj)
|
||||||
|
{
|
||||||
|
PL110State *s = PL110(obj);
|
||||||
|
|
||||||
s->version = PL111;
|
s->version = PL111;
|
||||||
return pl110_init(dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pl110_class_init(ObjectClass *klass, void *data)
|
static void pl110_class_init(ObjectClass *klass, void *data)
|
||||||
@ -480,53 +496,30 @@ static void pl110_class_init(ObjectClass *klass, void *data)
|
|||||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||||
SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
|
SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
|
||||||
|
|
||||||
k->init = pl110_init;
|
k->init = pl110_initfn;
|
||||||
set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
|
set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
|
||||||
dc->no_user = 1;
|
dc->no_user = 1;
|
||||||
dc->vmsd = &vmstate_pl110;
|
dc->vmsd = &vmstate_pl110;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const TypeInfo pl110_info = {
|
static const TypeInfo pl110_info = {
|
||||||
.name = "pl110",
|
.name = TYPE_PL110,
|
||||||
.parent = TYPE_SYS_BUS_DEVICE,
|
.parent = TYPE_SYS_BUS_DEVICE,
|
||||||
.instance_size = sizeof(PL110State),
|
.instance_size = sizeof(PL110State),
|
||||||
|
.instance_init = pl110_init,
|
||||||
.class_init = pl110_class_init,
|
.class_init = pl110_class_init,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void pl110_versatile_class_init(ObjectClass *klass, void *data)
|
|
||||||
{
|
|
||||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
|
||||||
SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
|
|
||||||
|
|
||||||
k->init = pl110_versatile_init;
|
|
||||||
set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
|
|
||||||
dc->no_user = 1;
|
|
||||||
dc->vmsd = &vmstate_pl110;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const TypeInfo pl110_versatile_info = {
|
static const TypeInfo pl110_versatile_info = {
|
||||||
.name = "pl110_versatile",
|
.name = "pl110_versatile",
|
||||||
.parent = TYPE_SYS_BUS_DEVICE,
|
.parent = TYPE_PL110,
|
||||||
.instance_size = sizeof(PL110State),
|
.instance_init = pl110_versatile_init,
|
||||||
.class_init = pl110_versatile_class_init,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void pl111_class_init(ObjectClass *klass, void *data)
|
|
||||||
{
|
|
||||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
|
||||||
SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
|
|
||||||
|
|
||||||
k->init = pl111_init;
|
|
||||||
set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
|
|
||||||
dc->no_user = 1;
|
|
||||||
dc->vmsd = &vmstate_pl110;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const TypeInfo pl111_info = {
|
static const TypeInfo pl111_info = {
|
||||||
.name = "pl111",
|
.name = "pl111",
|
||||||
.parent = TYPE_SYS_BUS_DEVICE,
|
.parent = TYPE_PL110,
|
||||||
.instance_size = sizeof(PL110State),
|
.instance_init = pl111_init,
|
||||||
.class_init = pl111_class_init,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void pl110_register_types(void)
|
static void pl110_register_types(void)
|
||||||
|
Loading…
Reference in New Issue
Block a user