[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