mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
i8254: Convert PITCommonState to QOM realizefn
Instead of having the parent provide PITCommonClass::init, let the children override DeviceClass::realize themselves. This pushes the responsibility for saving and calling the parent's realizefn to the children. Signed-off-by: Andreas Färber <afaerber@suse.de>
This commit is contained in:
parent
58cd986422
commit
a15d09127b
4 changed files with 47 additions and 26 deletions
|
@ -35,6 +35,15 @@
|
|||
#define RW_STATE_WORD0 3
|
||||
#define RW_STATE_WORD1 4
|
||||
|
||||
#define PIT_CLASS(class) OBJECT_CLASS_CHECK(PITClass, (class), TYPE_I8254)
|
||||
#define PIT_GET_CLASS(obj) OBJECT_GET_CLASS(PITClass, (obj), TYPE_I8254)
|
||||
|
||||
typedef struct PITClass {
|
||||
PITCommonClass parent_class;
|
||||
|
||||
DeviceRealize parent_realize;
|
||||
} PITClass;
|
||||
|
||||
static void pit_irq_timer_update(PITChannelState *s, int64_t current_time);
|
||||
|
||||
static int pit_get_count(PITChannelState *s)
|
||||
|
@ -313,20 +322,22 @@ static void pit_post_load(PITCommonState *s)
|
|||
}
|
||||
}
|
||||
|
||||
static int pit_initfn(PITCommonState *pit)
|
||||
static void pit_realizefn(DeviceState *dev, Error **err)
|
||||
{
|
||||
PITCommonState *pit = PIT_COMMON(dev);
|
||||
PITClass *pc = PIT_GET_CLASS(dev);
|
||||
PITChannelState *s;
|
||||
|
||||
s = &pit->channels[0];
|
||||
/* the timer 0 is connected to an IRQ */
|
||||
s->irq_timer = qemu_new_timer_ns(vm_clock, pit_irq_timer, s);
|
||||
qdev_init_gpio_out(&pit->dev.qdev, &s->irq, 1);
|
||||
qdev_init_gpio_out(dev, &s->irq, 1);
|
||||
|
||||
memory_region_init_io(&pit->ioports, &pit_ioport_ops, pit, "pit", 4);
|
||||
|
||||
qdev_init_gpio_in(&pit->dev.qdev, pit_irq_control, 1);
|
||||
qdev_init_gpio_in(dev, pit_irq_control, 1);
|
||||
|
||||
return 0;
|
||||
pc->parent_realize(dev, err);
|
||||
}
|
||||
|
||||
static Property pit_properties[] = {
|
||||
|
@ -336,10 +347,12 @@ static Property pit_properties[] = {
|
|||
|
||||
static void pit_class_initfn(ObjectClass *klass, void *data)
|
||||
{
|
||||
PITClass *pc = PIT_CLASS(klass);
|
||||
PITCommonClass *k = PIT_COMMON_CLASS(klass);
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
|
||||
k->init = pit_initfn;
|
||||
pc->parent_realize = dc->realize;
|
||||
dc->realize = pit_realizefn;
|
||||
k->set_channel_gate = pit_set_channel_gate;
|
||||
k->get_channel_info = pit_get_channel_info_common;
|
||||
k->post_load = pit_post_load;
|
||||
|
@ -352,6 +365,7 @@ static const TypeInfo pit_info = {
|
|||
.parent = TYPE_PIT_COMMON,
|
||||
.instance_size = sizeof(PITCommonState),
|
||||
.class_init = pit_class_initfn,
|
||||
.class_size = sizeof(PITClass),
|
||||
};
|
||||
|
||||
static void pit_register_types(void)
|
||||
|
|
|
@ -170,14 +170,6 @@ static void pit_common_realize(DeviceState *dev, Error **errp)
|
|||
{
|
||||
ISADevice *isadev = ISA_DEVICE(dev);
|
||||
PITCommonState *pit = PIT_COMMON(dev);
|
||||
PITCommonClass *c = PIT_COMMON_GET_CLASS(pit);
|
||||
int ret;
|
||||
|
||||
ret = c->init(pit);
|
||||
if (ret < 0) {
|
||||
error_setg(errp, "PIT init failed.");
|
||||
return;
|
||||
}
|
||||
|
||||
isa_register_ioport(isadev, &pit->ioports, pit->iobase);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue