@@ -140,7 +140,7 @@ struct OtGpioDjState {
140
140
uint32_t opendrain ; /* open drain (1 -> hi-z) */
141
141
uint32_t pull_en ; /* pull up/down enable */
142
142
uint32_t pull_sel ; /* pull up or pull down */
143
- uint32_t connected ; /* connected to an external device */
143
+ uint32_t connected ; /* connected to an external device or preset */
144
144
145
145
char ibuf [PARAM_NUM_IO ]; /* backed input buffer */
146
146
unsigned ipos ;
@@ -153,6 +153,7 @@ struct OtGpioDjState {
153
153
uint32_t reset_in ; /* initial input levels */
154
154
uint32_t reset_out ; /* initial output levels */
155
155
uint32_t reset_oe ; /* initial output enable vs. hi-z levels */
156
+ uint32_t reset_ie ; /* initial input enable (reset_in active GPIOs) */
156
157
uint32_t ibex_out ; /* output w/ ibex_gpio (vs. tri-state) signalization */
157
158
CharBackend chr ; /* communication device */
158
159
guint watch_tag ; /* tracker for comm device change */
@@ -208,7 +209,7 @@ static void ot_gpio_dj_update_data_in(OtGpioDjState *s)
208
209
209
210
uint32_t ii_mask = s -> connected & ~s -> data_gi & ~s -> data_oe ;
210
211
uint32_t bi_mask = ~s -> connected & ~s -> data_bi & ~s -> data_oe ;
211
- uint32_t pi_mask = s -> connected & s -> data_gi & s -> data_bi & ~s -> data_oe ;
212
+ uint32_t pi_mask = s -> data_gi & s -> data_bi & ~s -> data_oe ;
212
213
213
214
uint32_t data_ii = s -> data_ii & ii_mask ;
214
215
uint32_t data_ib = s -> data_ib & bi_mask ;
@@ -801,6 +802,7 @@ static Property ot_gpio_dj_properties[] = {
801
802
DEFINE_PROP_STRING ("log_id" , OtGpioDjState , log_id ),
802
803
DEFINE_PROP_UINT32 ("in" , OtGpioDjState , reset_in , 0u ),
803
804
DEFINE_PROP_UINT32 ("out" , OtGpioDjState , reset_out , 0u ),
805
+ DEFINE_PROP_UINT32 ("ie" , OtGpioDjState , reset_ie , 0u ),
804
806
DEFINE_PROP_UINT32 ("oe" , OtGpioDjState , reset_oe , 0u ),
805
807
DEFINE_PROP_UINT32 ("ibex_out" , OtGpioDjState , ibex_out , 0u ),
806
808
DEFINE_PROP_BOOL ("wipe" , OtGpioDjState , wipe , false),
@@ -834,17 +836,16 @@ static void ot_gpio_dj_reset_enter(Object *obj, ResetType type)
834
836
memset (& s -> backend_state , 0 , sizeof (s -> backend_state ));
835
837
836
838
/* reset_* fields are properties, never get reset */
839
+ s -> connected = s -> reset_oe | s -> reset_ie ;
837
840
s -> data_ii = s -> reset_in ;
838
841
s -> data_ib = 0 ;
839
842
s -> data_out = s -> reset_out ;
840
843
s -> data_oe = s -> reset_oe ;
841
844
s -> data_bi = UINT32_MAX ;
842
- /* all input disable until signal is received, or output is forced */
843
- s -> data_gi = ~s -> reset_oe ;
845
+ s -> data_gi = ~s -> connected ;
844
846
s -> pull_en = 0 ;
845
847
s -> pull_sel = 0 ;
846
848
s -> invert = 0 ;
847
- s -> connected = 0 ;
848
849
849
850
s -> regs [R_DATA_IN ] = s -> reset_in ;
850
851
s -> regs [R_DIRECT_OUT ] = s -> reset_out ;
0 commit comments