@@ -46,8 +46,8 @@ impl<'a, const N: usize, M: RawMutex, B: I2c> Tps6699x<'a, N, M, B> {
4646 tps6699x : & mut tps6699x:: Tps6699x < ' a , M , B > ,
4747 port : LocalPortId ,
4848 ) -> Result < PortEventKind , Error < B :: Error > > {
49- #[ allow( unused_mut) ]
5049 let mut events = PortEventKind :: none ( ) ;
50+ let previous_status = self . port_status [ port. 0 as usize ] . get ( ) ;
5151
5252 let status = tps6699x. get_port_status ( port) . await ?;
5353 trace ! ( "Port{} status: {:#?}" , port. 0 , status) ;
@@ -95,13 +95,6 @@ impl<'a, const N: usize, M: RawMutex, B: I2c> Tps6699x<'a, N, M, B> {
9595 let current = TypecCurrent :: try_from ( port_control. typec_current ( ) ) . map_err ( Error :: Pd ) ?;
9696 debug ! ( "Port{} type-C source current: {:#?}" , port. 0 , current) ;
9797 let new_contract = Some ( PowerCapability :: from ( current) ) ;
98-
99- if new_contract != port_status. available_source_contract {
100- debug ! ( "New implicit contract as provider" ) ;
101- // We don't get interrupts for implicit contracts so generate event manually
102- events. set_new_power_contract_as_provider ( true ) ;
103- }
104-
10598 port_status. available_source_contract = new_contract;
10699 } else {
107100 // Implicit sink contract
@@ -115,13 +108,6 @@ impl<'a, const N: usize, M: RawMutex, B: I2c> Tps6699x<'a, N, M, B> {
115108 debug ! ( "Port{} type-C sink current: {:#?}" , port. 0 , current) ;
116109 Some ( PowerCapability :: from ( current) )
117110 } ;
118-
119- if new_contract. is_some ( ) && new_contract != port_status. available_sink_contract {
120- debug ! ( "New implicit contract as consumer" ) ;
121- // We don't get interrupts for implicit contracts so generate event manually
122- events. set_new_power_contract_as_consumer ( true ) ;
123- }
124-
125111 port_status. available_sink_contract = new_contract;
126112 }
127113
@@ -146,6 +132,20 @@ impl<'a, const N: usize, M: RawMutex, B: I2c> Tps6699x<'a, N, M, B> {
146132 debug ! ( "Port{} power path: {:#?}" , port. 0 , port_status. power_path) ;
147133 }
148134
135+ if port_status. available_sink_contract . is_some ( )
136+ && port_status. available_sink_contract != previous_status. available_sink_contract
137+ {
138+ debug ! ( "Port{}: new sink contract" , port. 0 ) ;
139+ events. set_new_power_contract_as_consumer ( true ) ;
140+ }
141+
142+ if port_status. available_source_contract . is_some ( )
143+ && port_status. available_source_contract != previous_status. available_source_contract
144+ {
145+ debug ! ( "Port{}: new source contract" , port. 0 ) ;
146+ events. set_new_power_contract_as_provider ( true ) ;
147+ }
148+
149149 self . port_status [ port. 0 as usize ] . set ( port_status) ;
150150 Ok ( events)
151151 }
@@ -186,7 +186,6 @@ impl<'a, const N: usize, M: RawMutex, B: I2c> Tps6699x<'a, N, M, B> {
186186 }
187187
188188 /// Signal an event on the given port
189- #[ allow( dead_code) ]
190189 fn signal_event ( & self , port : LocalPortId , event : PortEventKind ) {
191190 if port. 0 >= self . port_events . len ( ) as u8 {
192191 return ;
@@ -202,6 +201,19 @@ impl<'a, const N: usize, M: RawMutex, B: I2c> Tps6699x<'a, N, M, B> {
202201impl < const N : usize , M : RawMutex , B : I2c > Controller for Tps6699x < ' _ , N , M , B > {
203202 type BusError = B :: Error ;
204203
204+ /// Controller specific initialization
205+ #[ allow( clippy:: await_holding_refcell_ref) ]
206+ async fn sync_state ( & mut self ) -> Result < ( ) , Error < Self :: BusError > > {
207+ for i in 0 ..N {
208+ let port = LocalPortId ( i as u8 ) ;
209+ let mut tps6699x = self . tps6699x . borrow_mut ( ) ;
210+ let event = self . update_port_status ( & mut tps6699x, port) . await ?;
211+ self . signal_event ( port, event) ;
212+ }
213+
214+ Ok ( ( ) )
215+ }
216+
205217 /// Wait for an event on any port
206218 #[ allow( clippy:: await_holding_refcell_ref) ]
207219 async fn wait_port_event ( & mut self ) -> Result < ( ) , Error < Self :: BusError > > {
0 commit comments