power: charge animation: energy enough auto exit uboot charge

Change-Id: Ifa94783869c7cb35f819f3700c82bac7d00a7b05
Signed-off-by: Shunqing Chen <csq@rock-chips.com>
This commit is contained in:
Shunqing Chen 2020-03-21 09:35:31 +08:00 committed by Jianhong Chen
parent 14aa40ff18
commit 038c1ecaa2
2 changed files with 46 additions and 1 deletions

View File

@ -90,6 +90,8 @@ static int charge_animation_ofdata_to_platdata(struct udevice *dev)
pdata->android_charge = pdata->android_charge =
dev_read_u32_default(dev, "rockchip,android-charge-on", 0); dev_read_u32_default(dev, "rockchip,android-charge-on", 0);
pdata->auto_exit_charge =
dev_read_u32_default(dev, "rockchip,uboot-exit-charge-auto", 0);
pdata->exit_charge_level = pdata->exit_charge_level =
dev_read_u32_default(dev, "rockchip,uboot-exit-charge-level", 0); dev_read_u32_default(dev, "rockchip,uboot-exit-charge-level", 0);
pdata->exit_charge_voltage = pdata->exit_charge_voltage =
@ -114,6 +116,9 @@ static int charge_animation_ofdata_to_platdata(struct udevice *dev)
if (pdata->screen_on_voltage > pdata->exit_charge_voltage) if (pdata->screen_on_voltage > pdata->exit_charge_voltage)
pdata->screen_on_voltage = pdata->exit_charge_voltage; pdata->screen_on_voltage = pdata->exit_charge_voltage;
if (pdata->auto_exit_charge && !pdata->auto_wakeup_interval)
pdata->auto_wakeup_interval = 10;
debug("mode: uboot=%d, android=%d; exit: soc=%d%%, voltage=%dmv;\n" debug("mode: uboot=%d, android=%d; exit: soc=%d%%, voltage=%dmv;\n"
"lp_voltage=%d%%, screen_on=%dmv\n", "lp_voltage=%d%%, screen_on=%dmv\n",
pdata->uboot_charge, pdata->android_charge, pdata->uboot_charge, pdata->android_charge,
@ -435,6 +440,7 @@ static int charge_animation_show(struct udevice *dev)
int i, charging = 1, ret; int i, charging = 1, ret;
int boot_mode; int boot_mode;
int first_poll_fg = 1; int first_poll_fg = 1;
bool exit_charge = false;
/* /*
* Check sequence: * Check sequence:
@ -474,9 +480,31 @@ static int charge_animation_show(struct udevice *dev)
return 0; return 0;
} }
#endif #endif
charging = fg_charger_get_chrg_online(dev);
/* Not charger online and low power, shutdown */
if (charging <= 0 && pdata->auto_exit_charge) {
soc = fuel_gauge_update_get_soc(fg);
voltage = fuel_gauge_get_voltage(fg);
if (soc < pdata->exit_charge_level) {
printf("soc(%d%%) < exit_charge_level(%d%%)\n",
soc, pdata->exit_charge_level);
exit_charge = true;
}
if (voltage < pdata->exit_charge_voltage) {
printf("voltage(%d) < exit_charge_voltage(%d)\n",
voltage, pdata->exit_charge_voltage);
exit_charge = true;
}
if (exit_charge) {
printf("Not charging and low power, Shutdown...\n");
show_idx = IMAGE_LOWPOWER_IDX(image_num);
charge_show_bmp(image[show_idx].name);
mdelay(1000);
pmic_shutdown(pmic);
}
}
/* Not charger online, exit */ /* Not charger online, exit */
charging = fg_charger_get_chrg_online(dev);
if (charging <= 0) { if (charging <= 0) {
printf("Exit charge: due to charger offline\n"); printf("Exit charge: due to charger offline\n");
return 0; return 0;
@ -584,6 +612,22 @@ static int charge_animation_show(struct udevice *dev)
first_poll_fg = 0; first_poll_fg = 0;
local_irq_enable(); local_irq_enable();
if (pdata->auto_exit_charge) {
/* Is able to boot now ? */
if (pdata->exit_charge_level &&
soc >= pdata->exit_charge_level) {
printf("soc(%d%%) exit charge animation...\n",
soc);
break;
}
if (pdata->exit_charge_voltage &&
voltage >= pdata->exit_charge_voltage) {
printf("vol(%d) exit charge animation...\n",
voltage);
break;
}
}
show_images: show_images:
/* /*
* Just for debug, otherwise there will be nothing output which * Just for debug, otherwise there will be nothing output which

View File

@ -11,6 +11,7 @@ struct charge_animation_pdata {
int android_charge; /* android charge, 1: enable, 0: disable */ int android_charge; /* android charge, 1: enable, 0: disable */
int uboot_charge; /* u-boot charge, 1: enable, 0: disable */ int uboot_charge; /* u-boot charge, 1: enable, 0: disable */
int auto_exit_charge; /* energy enough auto exit uboot charging*/
int exit_charge_voltage;/* lowest voltage allowed to exit charging */ int exit_charge_voltage;/* lowest voltage allowed to exit charging */
int exit_charge_level; /* lowest soc level allowed to exit charging */ int exit_charge_level; /* lowest soc level allowed to exit charging */
int low_power_voltage; /* below this voltage, force system into charge mode anyway */ int low_power_voltage; /* below this voltage, force system into charge mode anyway */