@@ -50,15 +50,28 @@ enum battery_present battery_is_present(void)
5050 return batt_pres ;
5151}
5252
53- static void battery_percentage_control (void )
53+ uint32_t get_system_percentage (void )
5454{
55- enum ec_charge_control_mode new_mode ;
5655 uint32_t memmap_cap = * (uint32_t * )host_get_memmap (EC_MEMMAP_BATT_CAP );
5756 uint32_t memmap_lfcc = * (uint32_t * )host_get_memmap (EC_MEMMAP_BATT_LFCC );
58- uint32_t batt_os_percentage ;
57+
58+ return 1000 * memmap_cap / (memmap_lfcc + 1 );
59+ }
60+
61+ static void battery_percentage_control (void )
62+ {
63+ enum ec_charge_control_mode new_mode ;
64+ static int in_percentage_control ;
65+ uint32_t batt_os_percentage = get_system_percentage ();
5966 int rv ;
6067
61- batt_os_percentage = 1000 * memmap_cap / (memmap_lfcc + 1 );
68+ /**
69+ * If the host command EC_CMD_CHARGE_CONTROL set control mode to CHARGE_CONTROL_DISCHARGE
70+ * or CHARGE_CONTROL_IDLE, ignore the battery_percentage_control();
71+ */
72+ if (!in_percentage_control && get_chg_ctrl_mode () != CHARGE_CONTROL_NORMAL )
73+ return ;
74+
6275 if (charging_maximum_level == EC_CHARGE_LIMIT_RESTORE )
6376 system_get_bbram (SYSTEM_BBRAM_IDX_CHARGE_LIMIT_MAX , & charging_maximum_level );
6477
@@ -68,12 +81,16 @@ static void battery_percentage_control(void)
6881 charging_maximum_level = charging_maximum_level | 0x64 ;
6982 } else if (charging_maximum_level < 20 )
7083 new_mode = CHARGE_CONTROL_NORMAL ;
71- else if (batt_os_percentage > charging_maximum_level * 10 )
84+ else if (batt_os_percentage > charging_maximum_level * 10 ) {
7285 new_mode = CHARGE_CONTROL_DISCHARGE ;
73- else if (batt_os_percentage == charging_maximum_level * 10 )
86+ in_percentage_control = 1 ;
87+ } else if (batt_os_percentage == charging_maximum_level * 10 ) {
7488 new_mode = CHARGE_CONTROL_IDLE ;
75- else
89+ in_percentage_control = 1 ;
90+ } else {
7691 new_mode = CHARGE_CONTROL_NORMAL ;
92+ in_percentage_control = 0 ;
93+ }
7794
7895 set_chg_ctrl_mode (new_mode );
7996#ifdef CONFIG_PLATFORM_EC_CHARGER_DISCHARGE_ON_AC
0 commit comments