@@ -718,10 +718,8 @@ static void ot_gpio_eg_reset_enter(Object *obj, ResetType type)
718
718
719
719
/* reset_* fields are properties, never get reset */
720
720
s -> data_ii = s -> reset_in ;
721
- s -> data_ib = 0 ;
722
721
s -> data_out = s -> reset_out ;
723
722
s -> data_oe = s -> reset_oe ;
724
- s -> data_bi = UINT32_MAX ;
725
723
/* all input disable until signal is received, or output is forced */
726
724
s -> data_gi = ~s -> reset_oe ;
727
725
s -> pull_en = 0 ;
@@ -733,7 +731,13 @@ static void ot_gpio_eg_reset_enter(Object *obj, ResetType type)
733
731
s -> regs [R_DIRECT_OUT ] = s -> reset_out ;
734
732
s -> regs [R_DIRECT_OE ] = s -> reset_oe ;
735
733
736
- ot_gpio_eg_update_irqs (s );
734
+ /*
735
+ * Sample the input lines (e.g. the chardev) which persist their state
736
+ * across reset. This is important for cases like straps which are held
737
+ * asserted across a reset.
738
+ */
739
+ ot_gpio_eg_update_data_in (s );
740
+
737
741
ibex_irq_set (& s -> alert , 0 );
738
742
739
743
trace_ot_gpio_reset (s -> ot_id , "< enter" );
@@ -798,6 +802,10 @@ static void ot_gpio_eg_init(Object *obj)
798
802
PARAM_NUM_IO );
799
803
qdev_init_gpio_in_named (DEVICE (obj ), & ot_gpio_eg_pad_attr_change ,
800
804
OT_PINMUX_PAD , PARAM_NUM_IO );
805
+
806
+ /* Backend state persists across reset so initialise it once now */
807
+ s -> data_ib = 0u ;
808
+ s -> data_bi = UINT32_MAX ;
801
809
}
802
810
803
811
static void ot_gpio_eg_class_init (ObjectClass * klass , void * data )
0 commit comments