@@ -259,6 +259,24 @@ int cypd_write_reg8_wait_ack(int controller, int reg, int data, int delay_ms)
259259 default :
260260 CPRINTS ("Check AC get unknown event 0x%04x" , event );
261261 }
262+ } else if (data == CYP5525_ICL_CTRL_REG ||
263+ data == CYP5525_ICL_BB_RETIMER_CMD_REG ||
264+ data == CYP5525_ICL_BB_RETIMER_DAT_REG ) {
265+ rv = cypd_read_reg8 (controller , CYP5525_RESPONSE_REG , & event );
266+ if (rv != EC_SUCCESS )
267+ CPRINTS ("fail to read response" );
268+ switch (event ) {
269+ case CYPD_RESPONSE_SUCCESS :
270+ rv = EC_SUCCESS ;
271+ break ;
272+ case CYPD_RESPONSE_INVALID_ARGUMENTS :
273+ CPRINTS ("CYPD_RESPONSE_INVALID_ARGUMENTS cmd:%x" , data );
274+ rv = EC_ERROR_INVAL ;
275+ break ;
276+ default :
277+ rv = EC_ERROR_INVAL ;
278+ CPRINTS ("Check AC get unknown event 0x%04x" , event );
279+ }
262280 }
263281 cypd_clear_int (controller , CYP5525_DEV_INTR );
264282 }
@@ -390,24 +408,46 @@ void disable_compliance_mode(int controller)
390408 CPRINTS ("Write CYP5525_ICL_BB_RETIMER_CMD_REG fail" );
391409}
392410
393- void entry_tbt_mode (int controller )
411+ int entry_tbt_mode (int controller )
394412{
395413 int rv ;
396414 uint8_t force_tbt_mode = 0x01 ;
415+ int force_retimer_power = 0x0100 ;
397416
398- rv = cypd_write_reg8 (controller , CYP5525_ICL_CTRL_REG , force_tbt_mode );
417+ /* Write 0x0100 to address 0x0046 */
418+ rv = cypd_write_reg16 (controller , CYP5525_ICL_BB_RETIMER_CMD_REG , force_retimer_power );
419+ if (rv != EC_SUCCESS ) {
420+ CPRINTS ("Write CYP5525_ICL_BB_RETIMER_CMD_REG fail" );
421+ return rv ;
422+ }
423+
424+ /* according to HPI spec after write 0x40 need wait 100~125ms */
425+ rv = cypd_write_reg8_wait_ack (controller , CYP5525_ICL_CTRL_REG , force_tbt_mode , 110 );
399426 if (rv != EC_SUCCESS )
400427 CPRINTS ("Write CYP5525_ICL_CTRL_REG fail" );
428+
429+ return rv ;
401430}
402431
403- void exit_tbt_mode (int controller )
432+ int exit_tbt_mode (int controller )
404433{
405434 int rv ;
406435 uint8_t force_tbt_mode = 0x00 ;
436+ int force_retimer_power = 0x0000 ;
407437
408- rv = cypd_write_reg8 (controller , CYP5525_ICL_CTRL_REG , force_tbt_mode );
409- if (rv != EC_SUCCESS )
438+ /* according to HPI spec after write 0x40 need wait 100~125ms */
439+ rv = cypd_write_reg8_wait_ack (controller , CYP5525_ICL_CTRL_REG , force_tbt_mode , 110 );
440+ if (rv != EC_SUCCESS ) {
410441 CPRINTS ("Write CYP5525_ICL_CTRL_REG fail" );
442+ return rv ;
443+ }
444+
445+ /* Write 0x0000 to address 0x0046 */
446+ rv = cypd_write_reg16 (controller , CYP5525_ICL_BB_RETIMER_CMD_REG , force_retimer_power );
447+ if (rv != EC_SUCCESS )
448+ CPRINTS ("Write CYP5525_ICL_BB_RETIMER_CMD_REG fail" );
449+
450+ return rv ;
411451}
412452
413453int check_tbt_mode (int controller )
0 commit comments