qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 1/2] qdev: make reset propagation overrideable by su


From: Anthony Liguori
Subject: [Qemu-devel] [PATCH 1/2] qdev: make reset propagation overrideable by subclasses
Date: Fri, 11 Jan 2013 08:17:15 -0600

Signed-off-by: Anthony Liguori <address@hidden>
---
 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)
-- 
1.8.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]