@@ -220,11 +220,17 @@ static int applesmc_isa_init(ISADevice *dev)
return 0;
}
+static void qdev_applesmc_class_init(ObjectClass *klass, void *data)
+{
+ ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
+ ic->init = applesmc_isa_init;
+}
+
static ISADeviceInfo applesmc_isa_info = {
.qdev.name = "isa-applesmc",
.qdev.size = sizeof(struct AppleSMCStatus),
.qdev.reset = qdev_applesmc_isa_reset,
- .init = applesmc_isa_init,
+ .qdev.class_init = qdev_applesmc_class_init,
.qdev.props = (Property[]) {
DEFINE_PROP_HEX32("iobase", struct AppleSMCStatus, iobase,
APPLESMC_DEFAULT_IOBASE),
@@ -665,12 +665,18 @@ int cs4231a_init (qemu_irq *pic)
return 0;
}
+static void cs4231a_class_initfn(ObjectClass *klass, void *data)
+{
+ ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
+ ic->init = cs4231a_initfn;
+}
+
static ISADeviceInfo cs4231a_info = {
.qdev.name = "cs4231a",
.qdev.desc = "Crystal Semiconductor CS4231A",
.qdev.size = sizeof (CSState),
.qdev.vmsd = &vmstate_cs4231a,
- .init = cs4231a_initfn,
+ .qdev.class_init = cs4231a_class_initfn,
.qdev.props = (Property[]) {
DEFINE_PROP_HEX32 ("iobase", CSState, port, 0x534),
DEFINE_PROP_UINT32 ("irq", CSState, irq, 9),
@@ -87,10 +87,16 @@ static int debugcon_isa_initfn(ISADevice *dev)
return 0;
}
+static void debugcon_isa_class_initfn(ObjectClass *klass, void *data)
+{
+ ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
+ ic->init = debugcon_isa_initfn;
+}
+
static ISADeviceInfo debugcon_isa_info = {
.qdev.name = "isa-debugcon",
.qdev.size = sizeof(ISADebugconState),
- .init = debugcon_isa_initfn,
+ .qdev.class_init = debugcon_isa_class_initfn,
.qdev.props = (Property[]) {
DEFINE_PROP_HEX32("iobase", ISADebugconState, iobase, 0xe9),
DEFINE_PROP_CHR("chardev", ISADebugconState, state.chr),
@@ -1969,8 +1969,14 @@ static const VMStateDescription vmstate_isa_fdc ={
}
};
+static void isabus_fdc_class_init1(ObjectClass *klass, void *data)
+{
+ ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
+ ic->init = isabus_fdc_init1;
+}
+
static ISADeviceInfo isa_fdc_info = {
- .init = isabus_fdc_init1,
+ .qdev.class_init = isabus_fdc_class_init1,
.qdev.name = "isa-fdc",
.qdev.fw_name = "fdc",
.qdev.size = sizeof(FDCtrlISABus),
@@ -299,12 +299,18 @@ int GUS_init (qemu_irq *pic)
return 0;
}
+static void gus_class_initfn(ObjectClass *klass, void *data)
+{
+ ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
+ ic->init = gus_initfn;
+}
+
static ISADeviceInfo gus_info = {
.qdev.name = "gus",
.qdev.desc = "Gravis Ultrasound GF1",
.qdev.size = sizeof (GUSState),
.qdev.vmsd = &vmstate_gus,
- .init = gus_initfn,
+ .qdev.class_init = gus_class_initfn,
.qdev.props = (Property[]) {
DEFINE_PROP_UINT32 ("freq", GUSState, freq, 44100),
DEFINE_PROP_HEX32 ("iobase", GUSState, port, 0x240),
@@ -535,13 +535,19 @@ static int pit_initfn(ISADevice *dev)
return 0;
}
+static void pit_class_initfn(ObjectClass *klass, void *data)
+{
+ ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
+ ic->init = pit_initfn;
+}
+
static ISADeviceInfo pit_info = {
.qdev.name = "isa-pit",
.qdev.size = sizeof(PITState),
.qdev.vmsd = &vmstate_pit,
.qdev.reset = pit_reset,
.qdev.no_user = 1,
- .init = pit_initfn,
+ .qdev.class_init = pit_class_initfn,
.qdev.props = (Property[]) {
DEFINE_PROP_UINT32("irq", PITState, irq, -1),
DEFINE_PROP_HEX32("iobase", PITState, iobase, -1),
@@ -556,13 +556,19 @@ qemu_irq *i8259_init(qemu_irq parent_irq)
return irq_set;
}
+static void pic_class_initfn(ObjectClass *klass, void *data)
+{
+ ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
+ ic->init = pic_initfn;
+}
+
static ISADeviceInfo i8259_info = {
.qdev.name = "isa-i8259",
.qdev.size = sizeof(PicState),
.qdev.vmsd = &vmstate_pic,
.qdev.reset = pic_reset,
.qdev.no_user = 1,
- .init = pic_initfn,
+ .qdev.class_init = pic_class_initfn,
.qdev.props = (Property[]) {
DEFINE_PROP_HEX32("iobase", PicState, iobase, -1),
DEFINE_PROP_HEX32("elcr_addr", PicState, elcr_addr, -1),
@@ -94,11 +94,17 @@ ISADevice *isa_ide_init(int iobase, int iobase2, int isairq,
return dev;
}
+static void isa_ide_class_initfn(ObjectClass *klass, void *data)
+{
+ ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
+ ic->init = isa_ide_initfn;
+}
+
static ISADeviceInfo isa_ide_info = {
.qdev.name = "isa-ide",
.qdev.fw_name = "ide",
.qdev.size = sizeof(ISAIDEState),
- .init = isa_ide_initfn,
+ .qdev.class_init = isa_ide_class_initfn,
.qdev.reset = isa_ide_reset,
.qdev.props = (Property[]) {
DEFINE_PROP_HEX32("iobase", ISAIDEState, iobase, 0x1f0),
@@ -114,12 +114,16 @@ void isa_register_portio_list(ISADevice *dev, uint16_t start,
static int isa_qdev_init(DeviceState *qdev, DeviceInfo *base)
{
ISADevice *dev = ISA_DEVICE(qdev);
- ISADeviceInfo *info = DO_UPCAST(ISADeviceInfo, qdev, base);
+ ISADeviceClass *klass = ISA_DEVICE_GET_CLASS(dev);
dev->isairq[0] = -1;
dev->isairq[1] = -1;
- return info->init(dev);
+ if (klass->init) {
+ return klass->init(dev);
+ }
+
+ return 0;
}
void isa_qdev_register(ISADeviceInfo *info)
@@ -23,6 +23,7 @@ typedef struct ISADeviceInfo ISADeviceInfo;
typedef struct ISADeviceClass {
DeviceClass parent_class;
+ int (*init)(ISADevice *dev);
} ISADeviceClass;
struct ISADevice {
@@ -32,10 +33,8 @@ struct ISADevice {
int ioport_id;
};
-typedef int (*isa_qdev_initfn)(ISADevice *dev);
struct ISADeviceInfo {
DeviceInfo qdev;
- isa_qdev_initfn init;
};
ISABus *isa_bus_new(DeviceState *dev, MemoryRegion *address_space_io);
@@ -724,8 +724,14 @@ static int m48t59_init1(SysBusDevice *dev)
return 0;
}
+static void m48t59_init_class_isa1(ObjectClass *klass, void *data)
+{
+ ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
+ ic->init = m48t59_init_isa1;
+}
+
static ISADeviceInfo m48t59_isa_info = {
- .init = m48t59_init_isa1,
+ .qdev.class_init = m48t59_init_class_isa1,
.qdev.name = "m48t59_isa",
.qdev.size = sizeof(M48t59ISAState),
.qdev.reset = m48t59_reset_isa,
@@ -694,12 +694,18 @@ ISADevice *rtc_init(int base_year, qemu_irq intercept_irq)
return dev;
}
+static void rtc_class_initfn(ObjectClass *klass, void *data)
+{
+ ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
+ ic->init = rtc_initfn;
+}
+
static ISADeviceInfo mc146818rtc_info = {
.qdev.name = "mc146818rtc",
.qdev.size = sizeof(RTCState),
.qdev.no_user = 1,
.qdev.vmsd = &vmstate_rtc,
- .init = rtc_initfn,
+ .qdev.class_init = rtc_class_initfn,
.qdev.props = (Property[]) {
DEFINE_PROP_INT32("base_year", RTCState, base_year, 1980),
DEFINE_PROP_END_OF_LIST(),
@@ -82,10 +82,16 @@ static int isa_ne2000_initfn(ISADevice *dev)
return 0;
}
+static void isa_ne2000_class_initfn(ObjectClass *klass, void *data)
+{
+ ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
+ ic->init = isa_ne2000_initfn;
+}
+
static ISADeviceInfo ne2000_isa_info = {
.qdev.name = "ne2k_isa",
.qdev.size = sizeof(ISANE2000State),
- .init = isa_ne2000_initfn,
+ .qdev.class_init = isa_ne2000_class_initfn,
.qdev.props = (Property[]) {
DEFINE_PROP_HEX32("iobase", ISANE2000State, iobase, 0x300),
DEFINE_PROP_UINT32("irq", ISANE2000State, isairq, 9),
@@ -586,10 +586,16 @@ bool parallel_mm_init(target_phys_addr_t base, int it_shift, qemu_irq irq,
return true;
}
+static void parallel_isa_class_initfn(ObjectClass *klass, void *data)
+{
+ ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
+ ic->init = parallel_isa_initfn;
+}
+
static ISADeviceInfo parallel_isa_info = {
.qdev.name = "isa-parallel",
.qdev.size = sizeof(ISAParallelState),
- .init = parallel_isa_initfn,
+ .qdev.class_init = parallel_isa_class_initfn,
.qdev.props = (Property[]) {
DEFINE_PROP_UINT32("index", ISAParallelState, index, -1),
DEFINE_PROP_HEX32("iobase", ISAParallelState, iobase, -1),
@@ -496,13 +496,19 @@ static int port92_initfn(ISADevice *dev)
return 0;
}
+static void port92_class_initfn(ObjectClass *klass, void *data)
+{
+ ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
+ ic->init = port92_initfn;
+}
+
static ISADeviceInfo port92_info = {
.qdev.name = "port92",
.qdev.size = sizeof(Port92State),
.qdev.vmsd = &vmstate_port92_isa,
.qdev.no_user = 1,
.qdev.reset = port92_reset,
- .init = port92_initfn,
+ .qdev.class_init = port92_class_initfn,
};
static void port92_register(void)
@@ -497,12 +497,18 @@ static int i8042_initfn(ISADevice *dev)
return 0;
}
+static void i8042_class_initfn(ObjectClass *klass, void *data)
+{
+ ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
+ ic->init = i8042_initfn;
+}
+
static ISADeviceInfo i8042_info = {
.qdev.name = "i8042",
.qdev.size = sizeof(ISAKBDState),
.qdev.vmsd = &vmstate_kbd_isa,
.qdev.no_user = 1,
- .init = i8042_initfn,
+ .qdev.class_init = i8042_class_initfn,
};
static void i8042_register(void)
@@ -1391,12 +1391,18 @@ int SB16_init (qemu_irq *pic)
return 0;
}
+static void sb16_class_initfn(ObjectClass *klass, void *data)
+{
+ ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
+ ic->init = sb16_initfn;
+}
+
static ISADeviceInfo sb16_info = {
.qdev.name = "sb16",
.qdev.desc = "Creative Sound Blaster 16",
.qdev.size = sizeof (SB16State),
.qdev.vmsd = &vmstate_sb16,
- .init = sb16_initfn,
+ .qdev.class_init = sb16_class_initfn,
.qdev.props = (Property[]) {
DEFINE_PROP_HEX32 ("version", SB16State, ver, 0x0405), /* 4.5 */
DEFINE_PROP_HEX32 ("iobase", SB16State, port, 0x220),
@@ -879,11 +879,17 @@ SerialState *serial_mm_init(MemoryRegion *address_space,
return s;
}
+static void serial_isa_class_initfn(ObjectClass *klass, void *data)
+{
+ ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
+ ic->init = serial_isa_initfn;
+}
+
static ISADeviceInfo serial_isa_info = {
.qdev.name = "isa-serial",
.qdev.size = sizeof(ISASerialState),
.qdev.vmsd = &vmstate_isa_serial,
- .init = serial_isa_initfn,
+ .qdev.class_init = serial_isa_class_initfn,
.qdev.props = (Property[]) {
DEFINE_PROP_UINT32("index", ISASerialState, index, -1),
DEFINE_PROP_HEX32("iobase", ISASerialState, iobase, -1),
@@ -41,11 +41,17 @@ static int isa_cirrus_vga_initfn(ISADevice *dev)
return 0;
}
+static void isa_cirrus_vga_class_initfn(ObjectClass *klass, void *data)
+{
+ ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
+ ic->init = isa_cirrus_vga_initfn;
+}
+
static ISADeviceInfo sga_info = {
.qdev.name = "sga",
.qdev.desc = "Serial Graphics Adapter",
.qdev.size = sizeof(ISASGAState),
- .init = isa_cirrus_vga_initfn,
+ .qdev.class_init = isa_cirrus_vga_class_initfn,
};
static void sga_register(void)
@@ -69,12 +69,18 @@ static int vga_initfn(ISADevice *dev)
return 0;
}
+static void vga_class_initfn(ObjectClass *klass, void *data)
+{
+ ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
+ ic->init = vga_initfn;
+}
+
static ISADeviceInfo vga_info = {
.qdev.name = "isa-vga",
.qdev.size = sizeof(ISAVGAState),
.qdev.vmsd = &vmstate_vga_common,
.qdev.reset = vga_reset_isa,
- .init = vga_initfn,
+ .qdev.class_init = vga_class_initfn,
};
static void vga_register(void)
@@ -269,8 +269,14 @@ static int vmmouse_initfn(ISADevice *dev)
return 0;
}
+static void vmmouse_class_initfn(ObjectClass *klass, void *data)
+{
+ ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
+ ic->init = vmmouse_initfn;
+}
+
static ISADeviceInfo vmmouse_info = {
- .init = vmmouse_initfn,
+ .qdev.class_init = vmmouse_class_initfn,
.qdev.name = "vmmouse",
.qdev.size = sizeof(VMMouseState),
.qdev.vmsd = &vmstate_vmmouse,
@@ -144,11 +144,17 @@ static int vmport_initfn(ISADevice *dev)
return 0;
}
+static void vmport_class_initfn(ObjectClass *klass, void *data)
+{
+ ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
+ ic->init = vmport_initfn;
+}
+
static ISADeviceInfo vmport_info = {
.qdev.name = "vmport",
.qdev.size = sizeof(VMPortState),
.qdev.no_user = 1,
- .init = vmport_initfn,
+ .qdev.class_init = vmport_class_initfn,
};
static void vmport_dev_register(void)
@@ -120,12 +120,18 @@ static WatchdogTimerModel model = {
.wdt_description = "iBASE 700",
};
+static void wdt_ib700_class_init(ObjectClass *klass, void *data)
+{
+ ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
+ ic->init = wdt_ib700_init;
+}
+
static ISADeviceInfo wdt_ib700_info = {
.qdev.name = "ib700",
.qdev.size = sizeof(IB700State),
.qdev.vmsd = &vmstate_ib700,
.qdev.reset = wdt_ib700_reset,
- .init = wdt_ib700_init,
+ .qdev.class_init = wdt_ib700_class_init,
};
static void wdt_ib700_register_devices(void)