@@ -430,6 +430,14 @@ void cypd_set_error_recovery(void)
430430 }
431431}
432432
433+ static bool reconnect_flag ;
434+
435+ static void reconnect_port_deferred (void )
436+ {
437+ cypd_aconly_reconnect ();
438+ }
439+ DECLARE_DEFERRED (reconnect_port_deferred );
440+
433441void update_system_power_state (void )
434442{
435443
@@ -440,6 +448,7 @@ void update_system_power_state(void)
440448 case POWER_S5G3 :
441449 case POWER_S3S5 :
442450 cypd_set_power_state (CYP5525_POWERSTATE_S5 );
451+ reconnect_flag = true;
443452 break ;
444453 /* wait PD FW stable */
445454 /*case POWER_S0S0ix:
@@ -449,9 +458,12 @@ void update_system_power_state(void)
449458 default :
450459 cypd_set_error_recovery ();
451460 cypd_set_power_state (CYP5525_POWERSTATE_S0 );
461+ if (reconnect_flag ) {
462+ reconnect_flag = false;
463+ CPRINTS ("CYPD reconnect" );
464+ cypd_aconly_reconnect ();
465+ }
452466 break ;
453-
454-
455467 }
456468
457469}
@@ -1232,7 +1244,7 @@ void cypd_reinitialize(void)
12321244
12331245void cypd_interrupt_handler_task (void * p )
12341246{
1235- int i , j , evt ;
1247+ int i , j , evt , events ;
12361248 cypd_int_task_id = task_get_current ();
12371249
12381250 /* Initialize all charge suppliers to 0 */
@@ -1270,6 +1282,25 @@ void cypd_interrupt_handler_task(void *p)
12701282 }
12711283 }
12721284
1285+ if (evt & CYPD_EVT_PORT_DISABLE ) {
1286+ CPRINTS ("CYPD_EVT_PORT_DISABLE" );
1287+ cypd_reconnect_port_disable (0 , 0 );
1288+ cypd_reconnect_port_disable (1 , 0 );
1289+ cypd_reconnect_port_disable (0 , 1 );
1290+ cypd_reconnect_port_disable (1 , 1 );
1291+ events = task_wait_event_mask (TASK_EVENT_TIMER , 300 * MSEC );
1292+ if (events & TASK_EVENT_TIMER )
1293+ cypd_enque_evt (CYPD_EVT_PORT_ENABLE , 0 );
1294+ }
1295+
1296+ if (evt & CYPD_EVT_PORT_ENABLE ) {
1297+ CPRINTS ("CYPD_EVT_PORT_ENABLE" );
1298+ cypd_reconnect_port_enable (0 , 0 );
1299+ cypd_reconnect_port_enable (1 , 0 );
1300+ cypd_reconnect_port_enable (0 , 1 );
1301+ cypd_reconnect_port_enable (1 , 1 );
1302+ }
1303+
12731304 if (evt & CYPD_EVT_S_CHANGE ) {
12741305 update_system_power_state ();
12751306 }
@@ -1311,6 +1342,81 @@ void cypd_interrupt_handler_task(void *p)
13111342 }
13121343}
13131344
1345+ int cypd_reconnect_port_disable (int controller , int port )
1346+ {
1347+ int rv ;
1348+ uint8_t pd_status_reg [4 ];
1349+ int port_pd_state , port_power_role , data ;
1350+
1351+ rv = cypd_read_reg_block (controller , CYP5525_PD_STATUS_REG (port ), pd_status_reg , 4 );
1352+ if (rv != EC_SUCCESS )
1353+ CPRINTS ("CYP5525_PD_STATUS_REG failed" );
1354+
1355+ port_pd_state = pd_status_reg [1 ] & BIT (2 );
1356+ port_power_role = pd_status_reg [1 ] & BIT (0 );
1357+
1358+ if (port_power_role == PD_ROLE_SINK && port_pd_state )
1359+ return EC_SUCCESS ;
1360+
1361+ rv = cypd_read_reg8 (controller , CYP5525_PDPORT_ENABLE_REG , & data );
1362+ if (rv != EC_SUCCESS )
1363+ return rv ;
1364+
1365+ data &= ~BIT (port );
1366+
1367+ rv = cypd_write_reg8 (controller , CYP5525_PDPORT_ENABLE_REG , data );
1368+ if (rv != EC_SUCCESS )
1369+ return rv ;
1370+
1371+ CPRINTS ("disable controller: %d, Port: %d" , controller , port );
1372+
1373+ return rv ;
1374+ }
1375+
1376+ int cypd_reconnect_port_enable (int controller , int port )
1377+ {
1378+ int rv ;
1379+ uint8_t pd_status_reg [4 ];
1380+ int port_pd_state , port_power_role , data ;
1381+
1382+ rv = cypd_read_reg_block (controller , CYP5525_PD_STATUS_REG (port ), pd_status_reg , 4 );
1383+ if (rv != EC_SUCCESS )
1384+ CPRINTS ("CYP5525_PD_STATUS_REG failed" );
1385+
1386+ port_pd_state = pd_status_reg [1 ] & BIT (2 );
1387+ port_power_role = pd_status_reg [1 ] & BIT (0 );
1388+
1389+ if (port_power_role == PD_ROLE_SINK && port_pd_state )
1390+ return EC_SUCCESS ;
1391+
1392+ rv = cypd_read_reg8 (controller , CYP5525_PDPORT_ENABLE_REG , & data );
1393+ if (rv != EC_SUCCESS )
1394+ return rv ;
1395+
1396+ data |= BIT (port );
1397+
1398+ rv = cypd_write_reg8 (controller , CYP5525_PDPORT_ENABLE_REG , data );
1399+ if (rv != EC_SUCCESS )
1400+ return rv ;
1401+
1402+ CPRINTS ("enable controller: %d, Port: %d" , controller , port );
1403+
1404+ return rv ;
1405+ }
1406+
1407+ void cypd_aconly_reconnect (void )
1408+ {
1409+ int batt_status , events ;
1410+
1411+ battery_status (& batt_status );
1412+
1413+ if (extpower_is_present () && battery_is_present () != BP_YES ) {
1414+ events = task_wait_event_mask (TASK_EVENT_TIMER , 100 * MSEC );
1415+ if (events & TASK_EVENT_TIMER )
1416+ cypd_enque_evt (CYPD_EVT_PORT_DISABLE , 0 );
1417+ }
1418+ }
1419+
13141420int cypd_get_pps_power_budget (void )
13151421{
13161422 /* TODO:
0 commit comments