@@ -547,6 +547,63 @@ impl CrosEc {
547547 } )
548548 }
549549
550+ /// Check if the retimer is in firmware update mode
551+ ///
552+ /// This is normally false. Update mode is used to enable the retimer power even when no device
553+ /// is attached.
554+ pub fn retimer_in_fwupd_mode ( & self , retimer : u8 ) -> EcResult < bool > {
555+ let status = EcRequestRetimerControl {
556+ controller : retimer,
557+ mode : RetimerControlMode :: CheckStatus as u8 ,
558+ }
559+ . send_command ( self ) ?;
560+
561+ Ok ( status. status == 0x01 )
562+ }
563+
564+ /// Enable or disable retimer update mode
565+ ///
566+ /// Check for success and returns Err if not successful
567+ pub fn retimer_enable_fwupd ( & self , retimer : u8 , enable : bool ) -> EcResult < ( ) > {
568+ if self . retimer_in_fwupd_mode ( retimer) ? == enable {
569+ info ! ( "Retimer update mode already: {:?}" , enable) ;
570+ return Ok ( ( ) ) ;
571+ }
572+ EcRequestRetimerControl {
573+ controller : retimer,
574+ mode : if enable {
575+ RetimerControlMode :: EntryFwUpdateMode as u8
576+ } else {
577+ RetimerControlMode :: ExitFwUpdateMode as u8
578+ } ,
579+ }
580+ . send_command ( self ) ?;
581+
582+ if self . retimer_in_fwupd_mode ( retimer) ? != enable {
583+ return Err ( EcError :: DeviceError ( format ! (
584+ "Failed to set retimer update mode to: {}" ,
585+ enable
586+ ) ) ) ;
587+ }
588+ Ok ( ( ) )
589+ }
590+
591+ /// Enable or disable retimer Thunderbolt compliance mode (Intel only)
592+ ///
593+ /// Cannot check for success
594+ pub fn retimer_enable_compliance ( & self , retimer : u8 , enable : bool ) -> EcResult < ( ) > {
595+ EcRequestRetimerControl {
596+ controller : retimer,
597+ mode : if enable {
598+ RetimerControlMode :: EnableComplianceMode as u8
599+ } else {
600+ RetimerControlMode :: DisableComplianceMode as u8
601+ } ,
602+ }
603+ . send_command ( self ) ?;
604+ Ok ( ( ) )
605+ }
606+
550607 pub fn get_input_deck_status ( & self ) -> EcResult < InputDeckStatus > {
551608 let status = EcRequestDeckState {
552609 mode : DeckStateMode :: ReadOnly ,
0 commit comments