Unify Power menu bootloader entry as 'Reboot to loader' into lk2nd Fastboot menu

This commit is contained in:
Luxferre
2026-10-25 08:36:27 +02:00
parent a117e74452
commit fb5b9c9982
12 changed files with 40 additions and 33 deletions
+21 -8
View File
@@ -62,7 +62,7 @@
static char next_reboot_mode[32];
module_param_string(next_reboot_mode, next_reboot_mode, sizeof(next_reboot_mode), 0644);
MODULE_PARM_DESC(next_reboot_mode, "Next reboot target mode (bootloader, fastboot, edl)");
MODULE_PARM_DESC(next_reboot_mode, "Next reboot target mode (loader, bootloader, fastboot, edl)");
static void __iomem *tlmm_gpio32_base;
static void __iomem *gcc_camss_base;
@@ -192,8 +192,11 @@ static unsigned int msm8905_pon_prepare_restart_mode(const char *cmd)
if ((!mode || !mode[0]) && cmd && cmd[0])
mode = cmd;
if (!mode || !mode[0])
if (!mode || !mode[0]) {
if (pon_regmap)
regmap_write(pon_regmap, QPNP_PON_SOFT_RB_SPARE, 0x00U);
return PON_POWER_OFF_HARD_RESET;
}
strscpy(trimmed, mode, sizeof(trimmed));
len = strlen(trimmed);
@@ -202,21 +205,26 @@ static unsigned int msm8905_pon_prepare_restart_mode(const char *cmd)
trimmed[--len] = '\0';
}
if (strcmp(trimmed, "bootloader") == 0 || strcmp(trimmed, "fastboot") == 0) {
if (strcmp(trimmed, "loader") == 0 ||
strcmp(trimmed, "bootloader") == 0 ||
strcmp(trimmed, "fastboot") == 0) {
if (pon_regmap) {
/*
* Write 0x04 (1 << 2) into PON_SOFT_RB_SPARE (0x088f) matching
* mode-bootloader = <0x02> so lk2nd enters Fastboot mode on reboot.
* Stock Nokia aboot (0x2327c) reads PON_SOFT_RB_SPARE (0x088f), clears
* bits [7:2] via `and r1, r4, #3`, and writes bits [1:0] back to 0x088f
* before chainloading lk2nd from the boot partition.
* Write 0x02 (FASTBOOT_MODE = 2 in bits [1:0], 0 in bits [7:2]) so
* stock aboot boots lk2nd normally and lk2nd enters its Fastboot menu.
*/
regmap_update_bits(pon_regmap, QPNP_PON_SOFT_RB_SPARE, 0xfcU, 0x04U);
regmap_write(pon_regmap, QPNP_PON_SOFT_RB_SPARE, 0x02U);
}
pr_info("leds-msm8905-torch: armed PM8909 PON_SOFT_RB_SPARE for lk2nd Fastboot\n");
pr_info("leds-msm8905-torch: armed PM8909 PON_SOFT_RB_SPARE (0x02) for lk2nd Fastboot menu\n");
return PON_POWER_OFF_HARD_RESET;
}
if (strcmp(trimmed, "edl") == 0) {
if (pon_regmap)
regmap_update_bits(pon_regmap, QPNP_PON_SOFT_RB_SPARE, 0xfcU, 0x00U);
regmap_write(pon_regmap, QPNP_PON_SOFT_RB_SPARE, 0x00U);
ret = qcom_scm_io_writel(MSM8905_TCSR_BOOT_MISC_DETECT, MSM8905_DLOAD_EDL);
if (ret) {
@@ -232,12 +240,17 @@ static unsigned int msm8905_pon_prepare_restart_mode(const char *cmd)
return PON_POWER_OFF_WARM_RESET;
}
if (pon_regmap)
regmap_write(pon_regmap, QPNP_PON_SOFT_RB_SPARE, 0x00U);
return PON_POWER_OFF_HARD_RESET;
}
static int msm8905_pon_sys_poweroff(struct sys_off_data *data)
{
msm8905_torch_hw_disable();
if (pon_regmap)
regmap_write(pon_regmap, QPNP_PON_SOFT_RB_SPARE, 0x00U);
msm8905_pon_config_reset(PON_POWER_OFF_SHUTDOWN);
return NOTIFY_DONE;
}
+5 -11
View File
@@ -2190,10 +2190,8 @@ open_builtin_menu(const char *menu_name, int keep_idx)
add_menu_item(label, "@menu:confirm_logout", 1);
snprintf(label, sizeof(label), "%s Reboot", ICON_RLD);
add_menu_item(label, "@menu:confirm_reboot", 1);
snprintf(label, sizeof(label), "%s Reboot to Fastboot", ICON_RLD);
add_menu_item(label, "@menu:confirm_fastboot", 1);
snprintf(label, sizeof(label), "%s Reboot to EDL", ICON_RLD);
add_menu_item(label, "@menu:confirm_edl", 1);
snprintf(label, sizeof(label), "%s Reboot to loader", ICON_RLD);
add_menu_item(label, "@menu:confirm_loader", 1);
snprintf(label, sizeof(label), "%s Poweroff", ICON_PWR);
add_menu_item(label, "@menu:confirm_poweroff", 1);
snprintf(label, sizeof(label), "%s System Menu", ICON_MNU);
@@ -2208,13 +2206,9 @@ open_builtin_menu(const char *menu_name, int keep_idx)
reset_session_defaults(1, "Confirm Reboot");
add_menu_item("Yes", "sxmo_power.sh reboot", 0);
add_menu_item("No", "@menu:power", 1);
} else if (strcmp(menu_name, "confirm_fastboot") == 0) {
reset_session_defaults(1, "Confirm Fastboot");
add_menu_item("Yes", "sxmo_power.sh fastboot", 0);
add_menu_item("No", "@menu:power", 1);
} else if (strcmp(menu_name, "confirm_edl") == 0) {
reset_session_defaults(1, "Confirm EDL Mode");
add_menu_item("Yes", "sxmo_power.sh edl", 0);
} else if (strcmp(menu_name, "confirm_loader") == 0) {
reset_session_defaults(1, "Confirm Loader");
add_menu_item("Yes", "sxmo_power.sh loader", 0);
add_menu_item("No", "@menu:power", 1);
} else if (strcmp(menu_name, "confirm_poweroff") == 0) {
reset_session_defaults(1, "Confirm Poweroff");