@@ -95,6 +95,7 @@ static int pd_port0_1_5A;
9595static int pd_port1_1_5A ;
9696static int pd_port2_1_5A ;
9797static int pd_port3_1_5A ;
98+ static int ac_port = -1 ;
9899
99100void set_pd_fw_update (bool update )
100101{
@@ -228,6 +229,7 @@ int cypd_write_reg8_wait_ack(int controller, int reg, int data)
228229{
229230 int rv = EC_SUCCESS ;
230231 int intr_status ;
232+ int event ;
231233 rv = cypd_write_reg8 (controller , reg , data );
232234 if (rv != EC_SUCCESS )
233235 CPRINTS ("Write Reg8 0x%x fail!" , reg );
@@ -237,7 +239,30 @@ int cypd_write_reg8_wait_ack(int controller, int reg, int data)
237239 return EC_ERROR_INVAL ;
238240 }
239241 rv = cypd_get_int (controller , & intr_status );
242+ if (rv != EC_SUCCESS )
243+ return rv ;
240244 if (intr_status & CYP5525_DEV_INTR ) {
245+ CPRINTS ("data = %d" , data );
246+ if (data == CYP5525_AC_AT_PORT ) {
247+ rv = cypd_read_reg8 (controller , CYP5525_RESPONSE_REG , & event );
248+ CPRINTS ("event = %d" , event );
249+ if (rv != EC_SUCCESS )
250+ CPRINTS ("fail to read response" );
251+ switch (event ) {
252+ case CYPD_RESPONSE_AC_AT_P0 :
253+ ac_port = (controller * 2 ) + 0 ;
254+ break ;
255+ case CYPD_RESPONSE_AC_AT_P1 :
256+ ac_port = (controller * 2 ) + 1 ;
257+ break ;
258+ case CYPD_RESPONSE_NO_AC :
259+ case CYPD_RESPONSE_EC_MODE :
260+ ac_port = -1 ;
261+ break ;
262+ }
263+ CPRINTS ("ac_port = %d" , ac_port );
264+ } else
265+ CPRINTS ("unknown event" );
241266 cypd_clear_int (controller , CYP5525_DEV_INTR );
242267 }
243268 usleep (50 );
@@ -1745,6 +1770,27 @@ static void update_power_limit_deferred(void)
17451770}
17461771DECLARE_DEFERRED (update_power_limit_deferred );
17471772
1773+ int check_power_on_port (void )
1774+ {
1775+ int rv ;
1776+
1777+ /* only read CYPD when it ready */
1778+ if (pd_chip_config [0 ].state != CYP5525_STATE_READY )
1779+ return -1 ;
1780+
1781+ CPRINTS ("READ C0" );
1782+ rv = cypd_write_reg8_wait_ack (0 , CYP5525_CUST_C_CTRL_CONTROL_REG , CYP5525_AC_AT_PORT );
1783+ if (rv != EC_SUCCESS )
1784+ return -1 ;
1785+ if (ac_port >= 0 )
1786+ return ac_port ;
1787+ CPRINTS ("READ C1" );
1788+ rv = cypd_write_reg8_wait_ack (1 , CYP5525_CUST_C_CTRL_CONTROL_REG , CYP5525_AC_AT_PORT );
1789+ if (rv != EC_SUCCESS )
1790+ return -1 ;
1791+ return ac_port ;
1792+ }
1793+
17481794/**
17491795 * Set active charge port -- only one port can be active at a time.
17501796 *
@@ -1758,6 +1804,20 @@ int board_set_active_charge_port(int charge_port)
17581804{
17591805 CPRINTS ("start change port = %d, prev_charge_port = %d" , charge_port , prev_charge_port );
17601806
1807+ /* if no battery, EC should not control C_CTRL */
1808+ if (board_batt_is_present () != BP_YES ) {
1809+ /* check if CYPD ready */
1810+ if (charge_port == -1 )
1811+ return EC_ERROR_TRY_AGAIN ;
1812+
1813+ /* store current port and update power limit */
1814+ CPRINTS ("No batt, no change" );
1815+ prev_charge_port = charge_port ;
1816+ hook_call_deferred (& update_power_limit_deferred_data , 100 * MSEC );
1817+ CPRINTS ("Updating %s port %d" , __func__ , charge_port );
1818+ return EC_SUCCESS ;
1819+ }
1820+
17611821 /* port need change, stop all power and ready to switch. */
17621822 if (prev_charge_port != -1 && prev_charge_port != charge_port ) {
17631823 update_soc_power_limit (false, true);
0 commit comments