diff mbox series

[3/3] hw/gpio/bcm2835_gpio: Update to resettable

Message ID 20191220144616.911466-4-damien.hedde@greensocs.com
State New
Headers show
Series Raspi sd-bus cleanup and multiphase reset | expand

Commit Message

Damien Hedde Dec. 20, 2019, 2:46 p.m. UTC
Transition the bcm2835_gpio device class to Resettable.
The sdbus reparenting is delayed in hold phase to respect
resettable side-effect rules.

Signed-off-by: Damien Hedde <damien.hedde@greensocs.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
---
 hw/gpio/bcm2835_gpio.c | 21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)
diff mbox series

Patch

diff --git a/hw/gpio/bcm2835_gpio.c b/hw/gpio/bcm2835_gpio.c
index 88dc652018..4d393c6a47 100644
--- a/hw/gpio/bcm2835_gpio.c
+++ b/hw/gpio/bcm2835_gpio.c
@@ -260,9 +260,9 @@  err_out:
             __func__, offset);
 }
 
-static void bcm2835_gpio_reset(DeviceState *dev)
+static void bcm2835_gpio_reset_enter(Object *obj, ResetType type)
 {
-    BCM2835GpioState *s = BCM2835_GPIO(dev);
+    BCM2835GpioState *s = BCM2835_GPIO(obj);
 
     int i;
     /*
@@ -272,13 +272,22 @@  static void bcm2835_gpio_reset(DeviceState *dev)
     for (i = 0; i < 6; i++) {
         gpfsel_set(s, i, 0);
     }
-    /* Update s->sd_fsel and move the sd card */
-    gpfsel_update_sdbus(s);
 
     s->lev0 = 0;
     s->lev1 = 0;
 }
 
+static void bcm2835_gpio_reset_hold(Object *obj)
+{
+    BCM2835GpioState *s = BCM2835_GPIO(obj);
+
+    /*
+     * Update s->sd_fsel and move the sd card according to the config set in
+     * bcm2835_gpio_reset_enter().
+     */
+    gpfsel_update_sdbus(s);
+}
+
 static const MemoryRegionOps bcm2835_gpio_ops = {
     .read = bcm2835_gpio_read,
     .write = bcm2835_gpio_write,
@@ -336,10 +345,12 @@  static void bcm2835_gpio_realize(DeviceState *dev, Error **errp)
 static void bcm2835_gpio_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
+    ResettableClass *rc = RESETTABLE_CLASS(klass);
 
     dc->vmsd = &vmstate_bcm2835_gpio;
     dc->realize = &bcm2835_gpio_realize;
-    dc->reset = &bcm2835_gpio_reset;
+    rc->phases.enter = &bcm2835_gpio_reset_enter;
+    rc->phases.hold  = &bcm2835_gpio_reset_hold;
 }
 
 static const TypeInfo bcm2835_gpio_info = {