@@ -203,8 +203,7 @@ int cypd_wait_for_ack(int controller, int timeout_ms)
203203 timestamp_t start = get_time ();
204204
205205 /* wait for interrupt ack to be asserted */
206- do
207- {
206+ do {
208207 if (gpio_pin_get_dt (intr ) == 0 )
209208 break ;
210209 usleep (100 );
@@ -226,6 +225,7 @@ static int cypd_write_reg8_wait_ack(int controller, int reg, int data)
226225 int cmd_port = -1 ;
227226 int ack_mask = 0 ;
228227 int expected_ack_mask = 0 ;
228+ const struct gpio_dt_spec * intr = gpio_get_dt_spec (pd_chip_config [controller ].gpio );
229229
230230 if (reg < 0x1000 ) {
231231 expected_ack_mask = CCG_DEV_INTR ;
@@ -238,6 +238,20 @@ static int cypd_write_reg8_wait_ack(int controller, int reg, int data)
238238 cmd_port = 1 ;
239239 }
240240
241+ if (gpio_pin_get_dt (intr ) == 0 ) {
242+ /* we may have a pending interrupt */
243+ rv = cypd_get_int (controller , & intr_status );
244+ CPRINTS ("%s pre 0x%x " , __func__ , intr_status );
245+ if (intr_status & CCG_DEV_INTR ) {
246+ rv = cypd_read_reg16 (controller , CCG_RESPONSE_REG , & event );
247+ if (event < 0x80 ) {
248+ cypd_clear_int (controller , CCG_DEV_INTR );
249+ }
250+ usleep (50 );
251+ }
252+ }
253+
254+
241255 rv = cypd_write_reg8 (controller , reg , data );
242256 if (rv != EC_SUCCESS )
243257 CPRINTS ("Write Reg8 0x%x fail!" , reg );
@@ -268,6 +282,12 @@ static int cypd_write_reg8_wait_ack(int controller, int reg, int data)
268282 } else {
269283 CPRINTS ("%s C:%d Unexpected response 0x%x to reg 0x%x" ,
270284 __func__ , controller , intr_status , reg );
285+ rv = cypd_read_reg16 (controller , CCG_RESPONSE_REG , & event );
286+ CPRINTS ("Dev 0x%x" , event );
287+ rv = cypd_read_reg16 (controller , CCG_PORT_PD_RESPONSE_REG (0 ), & event );
288+ CPRINTS ("P0 0x%x" , event );
289+ rv = cypd_read_reg16 (controller , CCG_PORT_PD_RESPONSE_REG (1 ), & event );
290+ CPRINTS ("P1 0x%x" , event );
271291 }
272292
273293 /* only clear response code let main task handle event code */
@@ -1246,11 +1266,12 @@ static void perform_error_recovery(int controller)
12461266 for (i = 0 ; i < 2 ; i ++ ) {
12471267 if (!((controller * 2 + i ) == prev_charge_port &&
12481268 battery_get_disconnect_state () != BATTERY_NOT_DISCONNECTED )) {
1249- data [0 ] = PORT_TO_CONTROLLER_PORT (i );
1250- cypd_write_reg_block (PORT_TO_CONTROLLER (i ),
1251- CCG_DPM_CMD_REG ,
1252- data , 2 );
1253- }
1269+
1270+ data [0 ] = PORT_TO_CONTROLLER_PORT (i );
1271+ cypd_write_reg_block (PORT_TO_CONTROLLER (i ),
1272+ CCG_DPM_CMD_REG ,
1273+ data , 2 );
1274+ }
12541275 }
12551276 else {
12561277 /* Hard reset all ports that are not supplying power in dead battery mode */
@@ -1657,9 +1678,9 @@ void cypd_port_int(int controller, int port)
16571678 case CCG_RESPONSE_HARD_RESET_RX :
16581679 case CCG_RESPONSE_TYPE_C_ERROR_RECOVERY :
16591680 if (data2 [0 ] == CCG_RESPONSE_HARD_RESET_RX )
1660- CPRINTS ("HARD_RESET_RX" );
1681+ CPRINTS ("HARD_RESET_RX" );
16611682 if (data2 [0 ] == CCG_RESPONSE_TYPE_C_ERROR_RECOVERY )
1662- CPRINTS ("TYPE_C_ERROR_RECOVERY" );
1683+ CPRINTS ("TYPE_C_ERROR_RECOVERY" );
16631684
16641685 cypd_update_port_state (controller , port );
16651686 cypd_release_port (controller , port );
@@ -2095,8 +2116,8 @@ static int cmd_cypd_get_status(int argc, const char **argv)
20952116 current_level [(data >> 6 ) & 0x03 ]);
20962117 cypd_read_reg8 (i , CCG_PORT_VBUS_FET_CONTROL (p ), & data );
20972118 CPRINTS (" VBUS_FET : %s %s" ,
2098- data & 0x1 ? "EC" : "Auto" ,
2099- data & 0x2 ? "On" : "Off" );
2119+ data & 0x1 ? "EC" : "Auto" ,
2120+ data & 0x2 ? "On" : "Off" );
21002121 cypd_read_reg_block (i , CCG_CURRENT_RDO_REG (p ), data16 , 4 );
21012122 CPRINTS (" RDO : Current:%dmA MaxCurrent%dmA 0x%08x" ,
21022123 ((data16 [0 ] + (data16 [1 ]<<8 )) & 0x3FF )* 10 ,
0 commit comments