Skip to content

Commit e77239d

Browse files
authored
Merge pull request #476 from FrameworkComputer/hx30.fix_pd_init_on_fw_update_v2
Fix pd update not reconfiguring controller
2 parents 371d539 + 555322f commit e77239d

4 files changed

Lines changed: 70 additions & 70 deletions

File tree

board/hx30/battery.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,15 @@ static int battery_check_disconnect(void)
9999
return BATTERY_NOT_DISCONNECTED;
100100
}
101101

102+
enum battery_present board_batt_is_present(void)
103+
{
104+
/*
105+
* Due to adc_read_channel() will clear the task event,
106+
* we should get the battery status without read adc channel again.
107+
*/
108+
return batt_pres_prev;
109+
}
110+
102111
enum battery_present battery_is_present(void)
103112
{
104113
enum battery_present batt_pres;

board/hx30/board.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -778,6 +778,8 @@ void update_me_change(int change);
778778
int poweron_reason_powerbtn(void);
779779
int poweron_reason_acin(void);
780780

781+
enum battery_present board_batt_is_present(void);
782+
781783
#ifdef CONFIG_EMI_REGION1
782784
void power_state_clear(int state);
783785
#endif

board/hx30/cypress5525.c

Lines changed: 59 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
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

412410
void cypd_set_power_active(enum power_state power)
413411
{
@@ -442,7 +440,7 @@ static void reconnect_port_deferred(void)
442440
}
443441
DECLARE_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+
10491061
void 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

11641164
void 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

16411632
static void update_power_limit_deferred(void)
16421633
{
1634+
cypd_enque_evt(CYPD_EVT_UPDATE_PWRSTAT, 0);
16431635
update_soc_power_limit(false, false);
16441636
}
16451637
DECLARE_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;

board/hx30/power_sequence.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,6 @@ int board_chipset_power_on(void)
202202
gpio_set_level(GPIO_PCH_PWR_EN, 1);
203203

204204
msleep(10);
205-
/* Need to configure the retimer recovery path before RSMRST is released but after PCH_PWR_EN is up */
206-
cypd_set_retimer_power(POWER_G3S5);
207205

208206
gpio_set_level(GPIO_PCH_PWRBTN_L, 1);
209207

0 commit comments

Comments
 (0)