Skip to content

Commit

Permalink
pl110: QOM'ify pl110, pl110_versatile and pl111
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
afaerber committed Jul 29, 2013
1 parent 513960e commit 5d7a11e
Showing 1 changed file with 38 additions and 45 deletions.
83 changes: 38 additions & 45 deletions hw/display/pl110.c
Expand Up @@ -39,8 +39,12 @@ enum pl110_version
PL111
};

#define TYPE_PL110 "pl110"
#define PL110(obj) OBJECT_CHECK(PL110State, (obj), TYPE_PL110)

typedef struct PL110State {
SysBusDevice busdev;
SysBusDevice parent_obj;

MemoryRegion iomem;
QemuConsole *con;

Expand Down Expand Up @@ -129,6 +133,7 @@ static int pl110_enabled(PL110State *s)
static void pl110_update_display(void *opaque)
{
PL110State *s = (PL110State *)opaque;
SysBusDevice *sbd;
DisplaySurface *surface = qemu_console_surface(s->con);
drawfn* fntable;
drawfn fn;
Expand All @@ -138,8 +143,11 @@ static void pl110_update_display(void *opaque)
int first;
int last;

if (!pl110_enabled(s))
if (!pl110_enabled(s)) {
return;
}

sbd = SYS_BUS_DEVICE(s);

switch (surface_bits_per_pixel(surface)) {
case 0:
Expand Down Expand Up @@ -232,7 +240,7 @@ static void pl110_update_display(void *opaque)
}
dest_width *= s->cols;
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,
src_width, dest_width, 0,
s->invalidate,
Expand Down Expand Up @@ -449,84 +457,69 @@ static const GraphicHwOps pl110_gfx_ops = {
.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);
sysbus_init_mmio(dev, &s->iomem);
sysbus_init_irq(dev, &s->irq);
qdev_init_gpio_in(&s->busdev.qdev, pl110_mux_ctrl_set, 1);
s->con = graphic_console_init(DEVICE(dev), &pl110_gfx_ops, s);
sysbus_init_mmio(sbd, &s->iomem);
sysbus_init_irq(sbd, &s->irq);
qdev_init_gpio_in(dev, pl110_mux_ctrl_set, 1);
s->con = graphic_console_init(dev, &pl110_gfx_ops, s);
return 0;
}

static int pl110_versatile_init(SysBusDevice *dev)
static void pl110_init(Object *obj)
{
PL110State *s = PL110(obj);

s->version = PL110;
}

static void pl110_versatile_init(Object *obj)
{
PL110State *s = FROM_SYSBUS(PL110State, dev);
PL110State *s = PL110(obj);

s->version = PL110_VERSATILE;
return pl110_init(dev);
}

static int pl111_init(SysBusDevice *dev)
static void pl111_init(Object *obj)
{
PL110State *s = FROM_SYSBUS(PL110State, dev);
PL110State *s = PL110(obj);

s->version = PL111;
return pl110_init(dev);
}

static void pl110_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = 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);
dc->no_user = 1;
dc->vmsd = &vmstate_pl110;
}

static const TypeInfo pl110_info = {
.name = "pl110",
.name = TYPE_PL110,
.parent = TYPE_SYS_BUS_DEVICE,
.instance_size = sizeof(PL110State),
.instance_init = pl110_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 = {
.name = "pl110_versatile",
.parent = TYPE_SYS_BUS_DEVICE,
.instance_size = sizeof(PL110State),
.class_init = pl110_versatile_class_init,
.parent = TYPE_PL110,
.instance_init = pl110_versatile_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 = {
.name = "pl111",
.parent = TYPE_SYS_BUS_DEVICE,
.instance_size = sizeof(PL110State),
.class_init = pl111_class_init,
.parent = TYPE_PL110,
.instance_init = pl111_init,
};

static void pl110_register_types(void)
Expand Down

0 comments on commit 5d7a11e

Please sign in to comment.