@@ -60,6 +60,11 @@ struct OtI2CTransportState {
60
60
CharBackend chr ;
61
61
};
62
62
63
+ struct OtI2CTransportClass {
64
+ SysBusDeviceClass parent_class ;
65
+ ResettablePhases parent_phases ;
66
+ };
67
+
63
68
static void ot_i2c_transport_put_send_failure (OtI2CTransportState * s )
64
69
{
65
70
uint8_t fmt_byte [2 ] = { '!' , '!' };
@@ -207,15 +212,42 @@ static void ot_i2c_transport_receive(void *opaque, const uint8_t *buf, int size)
207
212
}
208
213
}
209
214
215
+ static int ot_i2c_transport_be_change (void * opaque )
216
+ {
217
+ OtI2CTransportState * s = OT_I2C_TRANSPORT (opaque );
218
+
219
+ qemu_chr_fe_set_handlers (& s -> chr , ot_i2c_transport_can_receive ,
220
+ ot_i2c_transport_receive , NULL ,
221
+ ot_i2c_transport_be_change , s , NULL , true);
222
+
223
+ return 0 ;
224
+ }
225
+
226
+ static void ot_i2c_transport_reset_enter (Object * obj , ResetType type )
227
+ {
228
+ OtI2CTransportClass * c = OT_I2C_TRANSPORT_GET_CLASS (obj );
229
+ OtI2CTransportState * s = OT_I2C_TRANSPORT (obj );
230
+
231
+ if (c -> parent_phases .enter ) {
232
+ c -> parent_phases .enter (obj , type );
233
+ }
234
+
235
+ i2c_end_transfer (s -> bus );
236
+ fifo8_reset (& s -> cmd_bytes_fifo );
237
+ s -> parser_state = OT_I2C_CMD_INIT ;
238
+ s -> is_read_command = false;
239
+ s -> byte = 0u ;
240
+ }
241
+
210
242
static void ot_i2c_transport_realize (DeviceState * dev , Error * * errp )
211
243
{
212
244
(void )errp ;
213
245
OtI2CTransportState * state = OT_I2C_TRANSPORT (dev );
214
246
BusState * bus = qdev_get_parent_bus (dev );
215
247
state -> bus = I2C_BUS (bus );
216
248
qemu_chr_fe_set_handlers (& state -> chr , ot_i2c_transport_can_receive ,
217
- ot_i2c_transport_receive , NULL , NULL , state , NULL ,
218
- true);
249
+ ot_i2c_transport_receive , NULL ,
250
+ ot_i2c_transport_be_change , state , NULL , true);
219
251
}
220
252
221
253
static void ot_i2c_transport_init (Object * obj )
@@ -241,6 +273,11 @@ static void ot_i2c_transport_class_init(ObjectClass *klass, void *data)
241
273
device_class_set_props (dc , ot_i2c_transport_properties );
242
274
dc -> realize = ot_i2c_transport_realize ;
243
275
set_bit (DEVICE_CATEGORY_MISC , dc -> categories );
276
+
277
+ ResettableClass * rc = RESETTABLE_CLASS (klass );
278
+ OtI2CTransportClass * ic = OT_I2C_TRANSPORT_CLASS (klass );
279
+ resettable_class_set_parent_phases (rc , & ot_i2c_transport_reset_enter , NULL ,
280
+ NULL , & ic -> parent_phases );
244
281
}
245
282
246
283
static const TypeInfo ot_i2c_transport = {
0 commit comments