From patchwork Fri Jan 11 14:17:15 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [1/2] qdev: make reset propagation overrideable by subclasses Date: Fri, 11 Jan 2013 04:17:15 -0000 From: Anthony Liguori X-Patchwork-Id: 211357 Message-Id: <1357913836-4560-2-git-send-email-aliguori@us.ibm.com> To: qemu-devel@nongnu.org Cc: Peter Maydell , Paolo Bonzini , Anthony Liguori , Michael Tsirkin Signed-off-by: Anthony Liguori --- hw/qdev-core.h | 16 +++++++++++++++- hw/qdev.c | 11 ++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/hw/qdev-core.h b/hw/qdev-core.h index 853bd08..f40fd15 100644 --- a/hw/qdev-core.h +++ b/hw/qdev-core.h @@ -36,9 +36,23 @@ typedef struct DeviceClass { Property *props; int no_user; - /* callbacks */ + /** + * reset: + * + * Cold reset of a device. This function must be implemented by a device's + * that never have children busses. + */ void (*reset)(DeviceState *dev); + /** + * reset_all: + * + * Cold reset of a device with children. The default implementation of this + * method will invoke DeviceClass::reset and then recursively call + * qbus_reset_all() on each child in an arbitrary order. + */ + void (*reset_all)(DeviceState *dev); + /* device state */ const struct VMStateDescription *vmsd; diff --git a/hw/qdev.c b/hw/qdev.c index 1b68d02..e02b5be 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -223,11 +223,17 @@ static int qbus_reset_one(BusState *bus, void *opaque) return 0; } -void qdev_reset_all(DeviceState *dev) +static void qdev_reset_children(DeviceState *dev) { qdev_walk_children(dev, qdev_reset_one, qbus_reset_one, NULL); } +void qdev_reset_all(DeviceState *dev) +{ + DeviceClass *dc = DEVICE_GET_CLASS(dev); + dc->reset_all(dev); +} + void qbus_reset_all(BusState *bus) { qbus_walk_children(bus, qdev_reset_one, qbus_reset_one, NULL); @@ -714,7 +720,10 @@ static void device_unparent(Object *obj) static void device_class_init(ObjectClass *class, void *data) { + DeviceClass *dc = DEVICE_CLASS(class); + class->unparent = device_unparent; + dc->reset_all = qdev_reset_children; } void device_reset(DeviceState *dev)