2727#include "cpu_power.h"
2828#include "power_sequence.h"
2929#include "extpower.h"
30+ #include "board.h"
3031#define CPRINTS (format , args ...) cprints(CC_USBCHARGE, format, ## args)
3132#define CPRINTF (format , args ...) cprintf(CC_USBCHARGE, format, ## args)
3233
@@ -258,18 +259,22 @@ int cypd_write_reg16_wait_ack(int controller, int reg, int data)
258259 return rv ;
259260}
260261
261- int cypd_set_power_state (int power_state )
262+ int cypd_set_power_state (int power_state , int controller )
262263{
263264 int i ;
264265 int rv = EC_SUCCESS ;
265266
266- CPRINTS ("% s pwr state %d" , __func__ , power_state );
267+ CPRINTS ("C%d, % s pwr state %d" , controller , __func__ , power_state );
267268
268- for (i = 0 ; i < PD_CHIP_COUNT ; i ++ ) {
269+ if (controller < 2 )
270+ rv = cypd_write_reg8_wait_ack (controller , CYP5525_SYS_PWR_STATE , power_state );
271+ else {
272+ for (i = 0 ; i < PD_CHIP_COUNT ; i ++ ) {
269273
270- rv = cypd_write_reg8_wait_ack (i , CYP5525_SYS_PWR_STATE , power_state );
271- if (rv != EC_SUCCESS )
272- break ;
274+ rv = cypd_write_reg8_wait_ack (i , CYP5525_SYS_PWR_STATE , power_state );
275+ if (rv != EC_SUCCESS )
276+ break ;
277+ }
273278 }
274279 return rv ;
275280}
@@ -281,24 +286,27 @@ void cypd_charger_init_complete(void)
281286}
282287
283288
284- int cypd_update_power_status (void )
289+ int cypd_update_power_status (int controller )
285290{
286291 int i ;
287292 int rv = EC_SUCCESS ;
288293 int power_stat = 0 ;
289- if (battery_is_present () == BP_YES ) {
294+ if (board_batt_is_present () == BP_YES )
290295 power_stat |= BIT (3 );
291- }
292296 if (extpower_is_present ()) {
293297 power_stat |= BIT (1 ) + BIT (2 );
294298 }
295299
296- CPRINTS ("%s power_stat 0x%x" , __func__ , power_stat );
297300
298- for (i = 0 ; i < PD_CHIP_COUNT ; i ++ ) {
299- rv = cypd_write_reg8_wait_ack (i , CYP5525_POWER_STAT , power_stat );
300- if (rv != EC_SUCCESS )
301- break ;
301+ CPRINTS ("C%d, %s power_stat 0x%x" , controller , __func__ , power_stat );
302+ if (controller < 2 ) {
303+ rv = cypd_write_reg8_wait_ack (controller , CYP5525_POWER_STAT , power_stat );
304+ } else {
305+ for (i = 0 ; i < PD_CHIP_COUNT ; i ++ ) {
306+ rv = cypd_write_reg8_wait_ack (i , CYP5525_POWER_STAT , power_stat );
307+ if (rv != EC_SUCCESS )
308+ break ;
309+ }
302310 }
303311 return rv ;
304312}
@@ -398,16 +406,6 @@ void cypd_reset_source_ports(void)
398406 }
399407}
400408
401- enum power_state saved_bb_power_state = POWER_S0 ;
402-
403- void cypd_set_retimer_power (enum power_state power )
404- {
405- if (power != saved_bb_power_state ) {
406- saved_bb_power_state = power ;
407- cypd_enque_evt (CYPD_EVT_RETIMER_PWR , 0 );
408- }
409- }
410-
411409
412410void cypd_set_power_active (enum power_state power )
413411{
@@ -442,7 +440,7 @@ static void reconnect_port_deferred(void)
442440}
443441DECLARE_DEFERRED (reconnect_port_deferred );
444442
445- void update_system_power_state (void )
443+ void update_system_power_state (int controller )
446444{
447445
448446 enum power_state ps = power_get_state ();
@@ -451,15 +449,15 @@ void update_system_power_state(void)
451449 case POWER_S5 :
452450 case POWER_S5G3 :
453451 case POWER_S3S5 :
454- cypd_set_power_state (CYP5525_POWERSTATE_S5 );
452+ cypd_set_power_state (CYP5525_POWERSTATE_S5 , controller );
455453 reconnect_flag = true;
456454 break ;
457455 case POWER_S0S0ix :
458- cypd_set_power_state (CYP5525_POWERSTATE_S3 );
456+ cypd_set_power_state (CYP5525_POWERSTATE_S3 , controller );
459457 break ;
460458 default :
461459 cypd_set_error_recovery ();
462- cypd_set_power_state (CYP5525_POWERSTATE_S0 );
460+ cypd_set_power_state (CYP5525_POWERSTATE_S0 , controller );
463461 if (reconnect_flag ) {
464462 reconnect_flag = false;
465463 CPRINTS ("CYPD reconnect" );
@@ -640,7 +638,7 @@ void cypd_response_get_battery_capability(int controller, int port,
640638 /* Set PID */
641639 msg [1 ] = PRODUCT_ID ;
642640
643- if (battery_is_present () == BP_YES ) {
641+ if (board_batt_is_present () == BP_YES ) {
644642 /*
645643 * We only have one fixed battery,
646644 * so make sure batt cap ref is 0.
@@ -705,7 +703,7 @@ int cypd_response_get_battery_status(int controller, int port, uint32_t pd_heade
705703 uint32_t header = PD_DATA_BATTERY_STATUS + PD_HEADER_SOP (sop_type );
706704 int port_idx = (controller << 1 ) + port ;
707705
708- if (battery_is_present () == BP_YES ) {
706+ if (board_batt_is_present () == BP_YES ) {
709707 /*
710708 * We only have one fixed battery,
711709 * so make sure batt cap ref is 0.
@@ -1046,6 +1044,20 @@ int cyp5525_device_int(int controller)
10461044 return EC_SUCCESS ;
10471045}
10481046
1047+
1048+ void pd0_update_state_deferred (void )
1049+ {
1050+ task_set_event (TASK_ID_CYPD , CYPD_EVT_STATE_CTRL_0 , 0 );
1051+ }
1052+ DECLARE_DEFERRED (pd0_update_state_deferred );
1053+
1054+ void pd1_update_state_deferred (void )
1055+ {
1056+ task_set_event (TASK_ID_CYPD , CYPD_EVT_STATE_CTRL_1 , 0 );
1057+
1058+ }
1059+ DECLARE_DEFERRED (pd1_update_state_deferred );
1060+
10491061void cypd_handle_state (int controller )
10501062{
10511063 int data ;
@@ -1070,28 +1082,23 @@ void cypd_handle_state(int controller)
10701082 }
10711083 }
10721084 /*try again in a while*/
1073- cypd_enque_evt (4 <<controller , delay );
1085+ if (delay ) {
1086+ if (controller == 0 )
1087+ hook_call_deferred (& pd0_update_state_deferred_data , delay );
1088+ else
1089+ hook_call_deferred (& pd1_update_state_deferred_data , delay );
1090+ } else
1091+ cypd_enque_evt (CYPD_EVT_STATE_CTRL_0 <<controller , 0 );
10741092 break ;
10751093
10761094 case CYP5525_STATE_APP_SETUP :
10771095 gpio_disable_interrupt (pd_chip_config [controller ].gpio );
10781096 cyp5525_get_version (controller );
10791097 cypd_write_reg8_wait_ack (controller , CYP5225_USER_MAINBOARD_VERSION , board_get_version ());
1098+ /* We should update the power status and system power state by pd chip at initial*/
1099+ cypd_update_power_status (controller );
10801100
1081- /*for(i=0; i < 50;i++) {
1082- if (gpio_get_level(GPIO_PWR_3V5V_PG) &&
1083- ((charger_current_battery_params()->is_present == BP_YES &&
1084- !(charger_current_battery_params()->flags & BATT_FLAG_BAD_ANY))
1085- )
1086- )
1087- break;
1088- usleep(MSEC);
1089-
1090- }*/
1091-
1092- cypd_update_power_status ();
1093-
1094- cypd_set_power_state (CYP5525_POWERSTATE_S5 );
1101+ cypd_set_power_state (CYP5525_POWERSTATE_S5 , controller );
10951102
10961103
10971104 cyp5525_setup (controller );
@@ -1100,14 +1107,7 @@ void cypd_handle_state(int controller)
11001107
11011108 cyp5525_ucsi_startup (controller );
11021109 gpio_enable_interrupt (pd_chip_config [controller ].gpio );
1103- cypd_write_reg16_wait_ack (controller , CYP5225_USER_BB_POWER_EVT , RT_EVT_VSYS_ADDED );
1104- update_system_power_state ();
1105-
1106- //if (power_get_state() == POWER_S0 ||
1107- // power_get_state() == POWER_S0ix) {
1108- /*Handle unexpected PD controller resets when we are powered on*/
1109- // cypd_enque_evt(CYPD_EVT_RETIMER_PWR, 0);
1110- //}
1110+ update_system_power_state (controller );
11111111
11121112 CPRINTS ("CYPD %d Ready!" , controller );
11131113 pd_chip_config [controller ].state = CYP5525_STATE_READY ;
@@ -1163,7 +1163,7 @@ static uint8_t cypd_int_task_id;
11631163
11641164void cypd_enque_evt (int evt , int delay )
11651165{
1166- task_set_event (TASK_ID_CYPD , evt , delay );
1166+ task_set_event (TASK_ID_CYPD , evt , 0 );
11671167}
11681168
11691169
@@ -1281,15 +1281,6 @@ void cypd_interrupt_handler_task(void *p)
12811281 CPRINTS ("PD Event Platform Reset!" );
12821282 }
12831283
1284- if (evt & CYPD_EVT_RETIMER_PWR ) {
1285- if (saved_bb_power_state == POWER_G3S5 ) {
1286- cypd_bb_retimer_cmd (RT_EVT_VSYS_ADDED );
1287- }
1288- if (saved_bb_power_state == POWER_G3 ) {
1289- cypd_bb_retimer_cmd (RT_EVT_VSYS_REMOVED );
1290- }
1291- }
1292-
12931284 if (evt & CYPD_EVT_PORT_DISABLE ) {
12941285 CPRINTS ("CYPD_EVT_PORT_DISABLE" );
12951286 cypd_reconnect_port_disable (0 );
@@ -1319,7 +1310,7 @@ void cypd_interrupt_handler_task(void *p)
13191310 }
13201311
13211312 if (evt & CYPD_EVT_S_CHANGE ) {
1322- update_system_power_state ();
1313+ update_system_power_state (2 );
13231314 }
13241315
13251316 if (evt & CYPD_EVT_INT_CTRL_0 ) {
@@ -1337,7 +1328,7 @@ void cypd_interrupt_handler_task(void *p)
13371328 task_wait_event_mask (TASK_EVENT_TIMER ,10 );
13381329 }
13391330 if (evt & CYPD_EVT_UPDATE_PWRSTAT ) {
1340- cypd_update_power_status ();
1331+ cypd_update_power_status (2 );
13411332 }
13421333
13431334 if (evt & (CYPD_EVT_INT_CTRL_0 | CYPD_EVT_INT_CTRL_1 |
@@ -1415,7 +1406,7 @@ void cypd_aconly_reconnect(void)
14151406
14161407 battery_status (& batt_status );
14171408
1418- if (extpower_is_present () && battery_is_present () != BP_YES ) {
1409+ if (extpower_is_present () && board_batt_is_present () != BP_YES ) {
14191410 events = task_wait_event_mask (TASK_EVENT_TIMER , 100 * MSEC );
14201411 if (events & TASK_EVENT_TIMER )
14211412 cypd_enque_evt (CYPD_EVT_PORT_DISABLE , 0 );
@@ -1640,6 +1631,7 @@ int pd_port_configuration_change(int port, enum pd_port_role port_role)
16401631
16411632static void update_power_limit_deferred (void )
16421633{
1634+ cypd_enque_evt (CYPD_EVT_UPDATE_PWRSTAT , 0 );
16431635 update_soc_power_limit (false, false);
16441636}
16451637DECLARE_DEFERRED (update_power_limit_deferred );
@@ -1685,7 +1677,6 @@ int board_set_active_charge_port(int charge_port)
16851677 cypd_write_reg8 (1 , CYP5525_CUST_C_CTRL_CONTROL_REG , CYP5525_P0P1_CONTROL_BY_CY );
16861678 }
16871679
1688- cypd_enque_evt (CYPD_EVT_UPDATE_PWRSTAT , 100 );
16891680 hook_call_deferred (& update_power_limit_deferred_data , 100 * MSEC );
16901681 CPRINTS ("Updating %s port %d" , __func__ , charge_port );
16911682
@@ -2021,7 +2012,7 @@ static int cmd_cypd_control(int argc, char **argv)
20212012 pwrstate = strtoul (argv [3 ], & e , 0 );
20222013 if (* e )
20232014 return EC_ERROR_PARAM3 ;
2024- cypd_set_power_state (pwrstate );
2015+ cypd_set_power_state (pwrstate , 2 );
20252016 } else if (!strncmp (argv [1 ], "reg" , 3 )) {
20262017 int r ;
20272018 int regval ;
0 commit comments