@@ -912,36 +912,72 @@ static int cypd_update_power_status(int controller)
912912 return rv ;
913913}
914914
915+ static void perform_error_recovery (int controller )
916+ {
917+ int i ;
918+ if (controller < 2 )
919+ for (i = 0 ; i < 2 ; i ++ ) {
920+ if (!((controller * 2 + i ) == prev_charge_port && battery_is_present () != BP_YES ) )
921+ cypd_write_reg8 (controller , CCG_ERR_RECOVERY_REG , i );
922+ }
923+ else {
924+ /* Hard reset all ports that are not supplying power in dead battery mode */
925+ for (i = 0 ; i < 4 ; i ++ ) {
926+ if (!(i == prev_charge_port && battery_is_present () != BP_YES ) ) {
927+ CPRINTS ("Hard reset %d" , i );
928+ cypd_write_reg8 (i >> 1 , CCG_ERR_RECOVERY_REG , i & 1 );
929+ }
930+ }
931+ }
932+ return ;
933+ }
934+ enum power_state pd_prev_power_state = POWER_G3 ;
915935void update_system_power_state (int controller )
916936{
917937 enum power_state ps = power_get_state ();
918938
939+ if (battery_is_present () != BP_YES && ps == POWER_G3 ) {
940+ return ;
941+ }
919942 switch (ps ) {
920943 case POWER_G3 :
921- case POWER_S5 :
922944 case POWER_S5G3 :
945+ pd_prev_power_state = POWER_G3 ;
923946 cypd_set_power_state (CCG_POWERSTATE_G3 , controller );
924947 break ;
948+ case POWER_S5 :
925949 case POWER_S3S5 :
950+ case POWER_S4S5 :
951+ pd_prev_power_state = POWER_S5 ;
926952 cypd_set_power_state (CCG_POWERSTATE_S5 , controller );
927953 break ;
928954 case POWER_S3 :
955+ case POWER_S4S3 :
956+ case POWER_S5S3 :
957+ case POWER_S0S3 :
958+ case POWER_S0ixS3 : /* S0ix -> S3 */
959+ if (pd_prev_power_state < POWER_S3 ) {
960+ perform_error_recovery (controller );
961+ pd_prev_power_state = ps ;
962+ }
929963 cypd_set_power_state (CCG_POWERSTATE_S3 , controller );
930964 break ;
965+ case POWER_S0 :
966+ case POWER_S3S0 :
931967 case POWER_S0ixS0 : /* S0ix -> S0 */
968+ if (pd_prev_power_state < POWER_S3 ) {
969+ perform_error_recovery (controller );
970+ pd_prev_power_state = ps ;
971+ }
932972 cypd_set_power_state (CCG_POWERSTATE_S0 , controller );
933973 break ;
934- case POWER_S0S0ix : /* S0 -> S0ix */
935- cypd_set_power_state (CCG_POWERSTATE_S0ix , controller );
936- break ;
937- case POWER_S0ixS3 : /* S0ix -> S3 */
938- cypd_set_power_state (CCG_POWERSTATE_S3 , controller );
939- break ;
974+ case POWER_S0ix :
940975 case POWER_S3S0ix : /* S3 -> S0ix */
976+ case POWER_S0S0ix : /* S0 -> S0ix */
941977 cypd_set_power_state (CCG_POWERSTATE_S0ix , controller );
942978 break ;
979+
943980 default :
944- cypd_set_power_state (CCG_POWERSTATE_S0 , controller );
945981 break ;
946982 }
947983
@@ -1044,7 +1080,7 @@ static void cypd_handle_state(int controller)
10441080 cypd_get_version (controller );
10451081 cypd_update_power_status (controller );
10461082
1047- cypd_set_power_state ( CCG_POWERSTATE_S5 , controller );
1083+ //update_system_power_state( controller);
10481084 cypd_setup (controller );
10491085
10501086 /* After initial complete, update the type-c port state */
0 commit comments