mirror of https://github.com/xemu-project/xemu.git
qdev: use a wrapper to access reset and promote reset to a class method
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
f79f2bfc6a
commit
94afdadcb3
|
@ -1116,9 +1116,7 @@ static void intel_hda_reset(DeviceState *dev)
|
||||||
/* reset codecs */
|
/* reset codecs */
|
||||||
QTAILQ_FOREACH(qdev, &d->codecs.qbus.children, sibling) {
|
QTAILQ_FOREACH(qdev, &d->codecs.qbus.children, sibling) {
|
||||||
cdev = DO_UPCAST(HDACodecDevice, qdev, qdev);
|
cdev = DO_UPCAST(HDACodecDevice, qdev, qdev);
|
||||||
if (qdev_get_info(qdev)->reset) {
|
device_reset(DEVICE(cdev));
|
||||||
qdev_get_info(qdev)->reset(qdev);
|
|
||||||
}
|
|
||||||
d->state_sts |= (1 << cdev->cad);
|
d->state_sts |= (1 << cdev->cad);
|
||||||
}
|
}
|
||||||
intel_hda_update_irq(d);
|
intel_hda_update_irq(d);
|
||||||
|
|
|
@ -1681,7 +1681,7 @@ static void lsi_reg_writeb(LSIState *s, int offset, uint8_t val)
|
||||||
DeviceState *dev;
|
DeviceState *dev;
|
||||||
|
|
||||||
QTAILQ_FOREACH(dev, &s->bus.qbus.children, sibling) {
|
QTAILQ_FOREACH(dev, &s->bus.qbus.children, sibling) {
|
||||||
qdev_get_info(dev)->reset(dev);
|
device_reset(dev);
|
||||||
}
|
}
|
||||||
s->sstat0 |= LSI_SSTAT0_RST;
|
s->sstat0 |= LSI_SSTAT0_RST;
|
||||||
lsi_script_scsi_interrupt(s, LSI_SIST0_RST, 0);
|
lsi_script_scsi_interrupt(s, LSI_SIST0_RST, 0);
|
||||||
|
|
22
hw/qdev.c
22
hw/qdev.c
|
@ -48,7 +48,12 @@ static BusState *qbus_find(const char *path);
|
||||||
static void qdev_subclass_init(ObjectClass *klass, void *data)
|
static void qdev_subclass_init(ObjectClass *klass, void *data)
|
||||||
{
|
{
|
||||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||||
|
|
||||||
dc->info = data;
|
dc->info = data;
|
||||||
|
dc->reset = dc->info->reset;
|
||||||
|
|
||||||
|
/* Poison to try to detect future uses */
|
||||||
|
dc->info->reset = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
DeviceInfo *qdev_get_info(DeviceState *dev)
|
DeviceInfo *qdev_get_info(DeviceState *dev)
|
||||||
|
@ -378,8 +383,8 @@ int qdev_init(DeviceState *dev)
|
||||||
dev->alias_required_for_version);
|
dev->alias_required_for_version);
|
||||||
}
|
}
|
||||||
dev->state = DEV_STATE_INITIALIZED;
|
dev->state = DEV_STATE_INITIALIZED;
|
||||||
if (dev->hotplugged && qdev_get_info(dev)->reset) {
|
if (dev->hotplugged) {
|
||||||
qdev_get_info(dev)->reset(dev);
|
device_reset(dev);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -407,9 +412,7 @@ int qdev_unplug(DeviceState *dev)
|
||||||
|
|
||||||
static int qdev_reset_one(DeviceState *dev, void *opaque)
|
static int qdev_reset_one(DeviceState *dev, void *opaque)
|
||||||
{
|
{
|
||||||
if (qdev_get_info(dev)->reset) {
|
device_reset(dev);
|
||||||
qdev_get_info(dev)->reset(dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1593,6 +1596,15 @@ void qdev_machine_init(void)
|
||||||
qdev_get_peripheral();
|
qdev_get_peripheral();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void device_reset(DeviceState *dev)
|
||||||
|
{
|
||||||
|
DeviceClass *klass = DEVICE_GET_CLASS(dev);
|
||||||
|
|
||||||
|
if (klass->reset) {
|
||||||
|
klass->reset(dev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static TypeInfo device_type_info = {
|
static TypeInfo device_type_info = {
|
||||||
.name = TYPE_DEVICE,
|
.name = TYPE_DEVICE,
|
||||||
.parent = TYPE_OBJECT,
|
.parent = TYPE_OBJECT,
|
||||||
|
|
|
@ -75,6 +75,7 @@ typedef struct DeviceProperty
|
||||||
typedef struct DeviceClass {
|
typedef struct DeviceClass {
|
||||||
ObjectClass parent_class;
|
ObjectClass parent_class;
|
||||||
DeviceInfo *info;
|
DeviceInfo *info;
|
||||||
|
void (*reset)(DeviceState *dev);
|
||||||
} DeviceClass;
|
} DeviceClass;
|
||||||
|
|
||||||
/* This structure should not be accessed directly. We declare it here
|
/* This structure should not be accessed directly. We declare it here
|
||||||
|
@ -647,4 +648,11 @@ char *qdev_get_type(DeviceState *dev, Error **errp);
|
||||||
*/
|
*/
|
||||||
void qdev_machine_init(void);
|
void qdev_machine_init(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @device_reset
|
||||||
|
*
|
||||||
|
* Reset a single device (by calling the reset method).
|
||||||
|
*/
|
||||||
|
void device_reset(DeviceState *dev);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue