static int sysbus_device_init(DeviceState *dev, DeviceInfo *base)
{
- SysBusDeviceInfo *info = container_of(base, SysBusDeviceInfo, qdev);
+ SysBusDevice *sd = SYS_BUS_DEVICE(dev);
+ SysBusDeviceClass *sbc = SYS_BUS_DEVICE_GET_CLASS(sd);
- return info->init(sysbus_from_qdev(dev));
+ return sbc->init(sd);
}
-void sysbus_register_withprop(SysBusDeviceInfo *info)
+void sysbus_qdev_register_subclass(DeviceInfo *info, const char *parent)
{
- info->qdev.init = sysbus_device_init;
- info->qdev.bus_info = &system_bus_info;
+ info->init = sysbus_device_init;
+ info->bus_info = &system_bus_info;
- assert(info->qdev.size >= sizeof(SysBusDevice));
- qdev_register(&info->qdev);
+ assert(info->size >= sizeof(SysBusDevice));
+ qdev_register_subclass(info, parent);
}
-void sysbus_register_dev(const char *name, size_t size, sysbus_initfn init)
+void sysbus_qdev_register(DeviceInfo *info)
{
- SysBusDeviceInfo *info;
-
- info = g_malloc0(sizeof(*info));
- info->qdev.name = g_strdup(name);
- info->qdev.size = size;
- info->init = init;
- sysbus_register_withprop(info);
+ sysbus_qdev_register_subclass(info, TYPE_SYS_BUS_DEVICE);
}
DeviceState *sysbus_create_varargs(const char *name,
{
return get_system_memory();
}
+
+static TypeInfo sysbus_device_type_info = {
+ .name = TYPE_SYS_BUS_DEVICE,
+ .parent = TYPE_DEVICE,
+ .instance_size = sizeof(SysBusDevice),
+ .abstract = true,
+ .class_size = sizeof(SysBusDeviceClass),
+};
+
+static void sysbus_register(void)
+{
+ type_register_static(&sysbus_device_type_info);
+}
+
+device_init(sysbus_register);