From 4894249623ada6a6435f20b14fd3751cb840e2b0 Mon Sep 17 00:00:00 2001 From: Shengming Yuan Date: Sat, 28 Mar 2026 13:53:34 -0700 Subject: [PATCH 1/5] kernel: qcom native power --- kernel/configs/vamos.config | 1 + kernel/dts/sdm845-comma-common.dtsi | 12 ++ ...make-SDM845-restart-follow-Qualcomm-.patch | 148 ++++++++++++++++++ ...-scm-preserve-dload-for-edl-restarts.patch | 91 +++++++++++ userspace/root/usr/local/sbin/reboot_edl | 41 +++++ 5 files changed, 293 insertions(+) create mode 100644 kernel/patches/0010-power-reset-msm-make-SDM845-restart-follow-Qualcomm-.patch create mode 100644 kernel/patches/0011-firmware-qcom-scm-preserve-dload-for-edl-restarts.patch create mode 100755 userspace/root/usr/local/sbin/reboot_edl diff --git a/kernel/configs/vamos.config b/kernel/configs/vamos.config index 8b47cf9..a5a1f74 100644 --- a/kernel/configs/vamos.config +++ b/kernel/configs/vamos.config @@ -61,6 +61,7 @@ CONFIG_I2C_QCOM_GENI=y # Power monitoring (INA231) CONFIG_SENSORS_INA2XX=y +CONFIG_POWER_RESET_QCOM_PON=y # Touchscreen CONFIG_TOUCHSCREEN_EDT_FT5X06=y diff --git a/kernel/dts/sdm845-comma-common.dtsi b/kernel/dts/sdm845-comma-common.dtsi index 722bb32..25950cd 100644 --- a/kernel/dts/sdm845-comma-common.dtsi +++ b/kernel/dts/sdm845-comma-common.dtsi @@ -458,3 +458,15 @@ qcom,snoc-host-cap-skip-quirk; }; + +&{/firmware/scm} { + qcom,dload-mode = <&tcsr_regs_1 0x73000>; +}; + +&soc { + restart@c264000 { + compatible = "qcom,pshold"; + reg = <0 0x0c264000 0 0x4>; + qcom,force-warm-reboot; + }; +}; diff --git a/kernel/patches/0010-power-reset-msm-make-SDM845-restart-follow-Qualcomm-.patch b/kernel/patches/0010-power-reset-msm-make-SDM845-restart-follow-Qualcomm-.patch new file mode 100644 index 0000000..06672bd --- /dev/null +++ b/kernel/patches/0010-power-reset-msm-make-SDM845-restart-follow-Qualcomm-.patch @@ -0,0 +1,148 @@ +diff --git a/drivers/power/reset/msm-poweroff.c b/drivers/power/reset/msm-poweroff.c +index c7eb6dc8e90a..42d2cfc8d35e 100644 +--- a/drivers/power/reset/msm-poweroff.c ++++ b/drivers/power/reset/msm-poweroff.c +@@ -4,19 +4,99 @@ + + #include + #include ++#include + #include + #include + #include ++#include + #include ++#include + #include +-#include +-#include + #include ++#include ++ ++#define QCOM_SCM_EDLOAD_MODE 0x01 + + static void __iomem *msm_ps_hold; ++static u64 msm_dload_mode_addr; ++static bool msm_force_warm_reboot; ++static bool msm_has_dload_mode_addr; ++ ++static int msm_restart_find_dload_address(u64 *addr) ++{ ++ struct device_node *scm; ++ struct device_node *tcsr; ++ struct resource res; ++ u32 offset; ++ int ret; ++ ++ scm = of_find_compatible_node(NULL, NULL, "qcom,scm"); ++ if (!scm) ++ return -ENODEV; ++ ++ tcsr = of_parse_phandle(scm, "qcom,dload-mode", 0); ++ if (!tcsr) { ++ of_node_put(scm); ++ return -ENODEV; ++ } ++ ++ ret = of_address_to_resource(tcsr, 0, &res); ++ of_node_put(tcsr); ++ if (ret) { ++ of_node_put(scm); ++ return ret; ++ } ++ ++ ret = of_property_read_u32_index(scm, "qcom,dload-mode", 1, &offset); ++ of_node_put(scm); ++ if (ret) ++ return ret; ++ ++ *addr = res.start + offset; ++ ++ return 0; ++} ++ ++static int msm_restart_write_dload_mode(u32 dload_mode) ++{ ++ if (!msm_has_dload_mode_addr || !qcom_scm_is_available()) ++ return -ENODEV; ++ ++ /* ++ * SDM845 EDL uses the older Qualcomm boot-misc encoding where ++ * literal 0x01 requests emergency download mode. The generic SCM ++ * helper only manipulates the dump bits, which is not enough for ++ * reboot-to-EDL on this platform. ++ */ ++ return qcom_scm_io_writel(msm_dload_mode_addr, dload_mode); ++} ++ ++static int msm_restart_prepare(struct notifier_block *nb, ++ unsigned long action, void *data) ++{ ++ const char *cmd = data; ++ ++ if (action == SYS_RESTART && (msm_force_warm_reboot || (cmd && *cmd))) ++ reboot_mode = REBOOT_WARM; ++ ++ return NOTIFY_DONE; ++} ++ ++static struct notifier_block msm_restart_nb = { ++ .notifier_call = msm_restart_prepare, ++ .priority = 255, ++}; + + static int do_msm_poweroff(struct sys_off_data *data) + { ++ if (data->cmd && !strcmp(data->cmd, "edl")) { ++ int ret; ++ ++ ret = msm_restart_write_dload_mode(QCOM_SCM_EDLOAD_MODE); ++ if (ret && ret != -ENODEV) ++ pr_warn("failed to enable download mode: %d\n", ret); ++ } ++ + writel(0, msm_ps_hold); + mdelay(10000); + +@@ -25,16 +105,36 @@ static int do_msm_poweroff(struct sys_off_data *data) + + static int msm_restart_probe(struct platform_device *pdev) + { ++ int ret; ++ + msm_ps_hold = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(msm_ps_hold)) + return PTR_ERR(msm_ps_hold); + +- devm_register_sys_off_handler(&pdev->dev, SYS_OFF_MODE_RESTART, +- 128, do_msm_poweroff, NULL); ++ msm_force_warm_reboot = of_property_read_bool(pdev->dev.of_node, ++ "qcom,force-warm-reboot"); ++ ++ ret = msm_restart_find_dload_address(&msm_dload_mode_addr); ++ if (!ret) ++ msm_has_dload_mode_addr = true; ++ else if (ret != -ENODEV) ++ dev_warn(&pdev->dev, "failed to resolve dload register: %d\n", ++ ret); ++ ++ ret = devm_register_reboot_notifier(&pdev->dev, &msm_restart_nb); ++ if (ret) ++ return ret; ++ ++ ret = devm_register_sys_off_handler(&pdev->dev, SYS_OFF_MODE_RESTART, ++ 128, do_msm_poweroff, NULL); ++ if (ret) ++ return ret; + +- devm_register_sys_off_handler(&pdev->dev, SYS_OFF_MODE_POWER_OFF, +- SYS_OFF_PRIO_DEFAULT, do_msm_poweroff, +- NULL); ++ ret = devm_register_sys_off_handler(&pdev->dev, SYS_OFF_MODE_POWER_OFF, ++ SYS_OFF_PRIO_DEFAULT, ++ do_msm_poweroff, NULL); ++ if (ret) ++ return ret; + + return 0; + } diff --git a/kernel/patches/0011-firmware-qcom-scm-preserve-dload-for-edl-restarts.patch b/kernel/patches/0011-firmware-qcom-scm-preserve-dload-for-edl-restarts.patch new file mode 100644 index 0000000..cf3dc78 --- /dev/null +++ b/kernel/patches/0011-firmware-qcom-scm-preserve-dload-for-edl-restarts.patch @@ -0,0 +1,91 @@ +From 7f68f0d4d1df43233f516d3087be29b80cf3cff2 Mon Sep 17 00:00:00 2001 +From: Codex +Date: Sat, 28 Mar 2026 20:35:00 -0700 +Subject: [PATCH] firmware: qcom: scm: preserve dload for edl restarts + +The generic SCM shutdown hook clears download mode on every clean reboot. +That is usually correct, but it breaks intentional EDL transitions because +the reboot code asks for "edl" before device shutdown and SCM clears the +download-mode bit again on the way down. + +Record explicit "edl" restarts in a reboot notifier, set download mode while +the SCM driver is still fully operational, and skip clearing it during the +matching shutdown sequence. +--- + drivers/firmware/qcom/qcom_scm.c | 32 ++++++++++++++++++++++++++++++++ + 1 file changed, 32 insertions(+) + +diff --git a/drivers/firmware/qcom/qcom_scm.c b/drivers/firmware/qcom/qcom_scm.c +--- a/drivers/firmware/qcom/qcom_scm.c ++++ b/drivers/firmware/qcom/qcom_scm.c +@@ -25,6 +25,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -34,6 +35,7 @@ + #include "qcom_tzmem.h" + + static u32 download_mode; ++static bool qcom_scm_restart_to_edl; + + struct qcom_scm { + struct device *dev; +@@ -558,6 +560,24 @@ + dev_err(__scm->dev, "failed to set download mode: %d\n", ret); + } + ++static int qcom_scm_reboot(struct notifier_block *nb, ++ unsigned long action, void *data) ++{ ++ const char *cmd = data; ++ ++ qcom_scm_restart_to_edl = false; ++ if (action == SYS_RESTART && cmd && !strcmp(cmd, "edl")) { ++ qcom_scm_restart_to_edl = true; ++ qcom_scm_set_download_mode(QCOM_DLOAD_FULLDUMP); ++ } ++ ++ return NOTIFY_DONE; ++} ++ ++static struct notifier_block qcom_scm_reboot_nb = { ++ .notifier_call = qcom_scm_reboot, ++}; ++ + /** + * qcom_scm_pas_init_image() - Initialize peripheral authentication service + * state machine for a given peripheral, using the +@@ -2426,6 +2446,11 @@ + */ + qcom_scm_set_download_mode(download_mode); + ++ ret = devm_register_reboot_notifier(scm->dev, &qcom_scm_reboot_nb); ++ if (ret) ++ return dev_err_probe(scm->dev, ret, ++ "Failed to register reboot notifier\n"); ++ + /* + * Disable SDI if indicated by DT that it is enabled by default. + */ +@@ -2453,6 +2478,15 @@ + + static void qcom_scm_shutdown(struct platform_device *pdev) + { ++ if (qcom_scm_restart_to_edl) { ++ /* ++ * "edl" is an intentional clean reboot into download mode, ++ * so preserve the bit set by the reboot notifier. ++ */ ++ qcom_scm_restart_to_edl = false; ++ return; ++ } ++ + /* Clean shutdown, disable download mode to allow normal restart */ + qcom_scm_set_download_mode(QCOM_DLOAD_NODUMP); + } +-- +2.53.0 diff --git a/userspace/root/usr/local/sbin/reboot_edl b/userspace/root/usr/local/sbin/reboot_edl new file mode 100755 index 0000000..94cc7b8 --- /dev/null +++ b/userspace/root/usr/local/sbin/reboot_edl @@ -0,0 +1,41 @@ +#!/bin/sh +set -eu + +if [ "$(id -u)" -ne 0 ]; then + printf '\033[1;31mCall to RebootEDL failed: Interactive authentication required.\033[0m\n' >&2 + exit 1 +fi + +own_tty=$(tty 2>/dev/null || true) +broadcast=$(printf '\r\nBroadcast message from root@%s on %s (%s):\r\n\r\n%s\r\n\r\n' \ + "$(hostname)" "${own_tty#/dev/}" "$(date '+%a %Y-%m-%d %H:%M:%S %Z')" \ + "The system will reboot into EDL now!") +for t in /dev/pts/[0-9]* /dev/ttyMSM* /dev/ttyAMA*; do + [ -c "$t" ] && [ -w "$t" ] && [ "$t" != "$own_tty" ] && \ + printf '%s' "$broadcast" > "$t" 2>/dev/null & +done +wait + +exec python3 - <<'PY' +import ctypes +import os +import sys + +LINUX_REBOOT_MAGIC1 = 0xfee1dead +LINUX_REBOOT_MAGIC2 = 672274793 +LINUX_REBOOT_CMD_RESTART2 = 0xA1B2C3D4 +__NR_reboot = 142 + +libc = ctypes.CDLL(None, use_errno=True) +arg = ctypes.c_char_p(b"edl") +ret = libc.syscall(__NR_reboot, + LINUX_REBOOT_MAGIC1, + LINUX_REBOOT_MAGIC2, + LINUX_REBOOT_CMD_RESTART2, + arg) +err = ctypes.get_errno() +if ret != 0: + raise OSError(err, os.strerror(err)) + +sys.exit(1) +PY From f6d5b585222dcbc096a716fb8e4b493134fc03eb Mon Sep 17 00:00:00 2001 From: Shengming Yuan Date: Sun, 29 Mar 2026 13:35:05 -0700 Subject: [PATCH 2/5] remove broken edl --- ...-scm-preserve-dload-for-edl-restarts.patch | 91 ------------------- userspace/root/usr/local/sbin/reboot_edl | 41 --------- 2 files changed, 132 deletions(-) delete mode 100644 kernel/patches/0011-firmware-qcom-scm-preserve-dload-for-edl-restarts.patch delete mode 100755 userspace/root/usr/local/sbin/reboot_edl diff --git a/kernel/patches/0011-firmware-qcom-scm-preserve-dload-for-edl-restarts.patch b/kernel/patches/0011-firmware-qcom-scm-preserve-dload-for-edl-restarts.patch deleted file mode 100644 index cf3dc78..0000000 --- a/kernel/patches/0011-firmware-qcom-scm-preserve-dload-for-edl-restarts.patch +++ /dev/null @@ -1,91 +0,0 @@ -From 7f68f0d4d1df43233f516d3087be29b80cf3cff2 Mon Sep 17 00:00:00 2001 -From: Codex -Date: Sat, 28 Mar 2026 20:35:00 -0700 -Subject: [PATCH] firmware: qcom: scm: preserve dload for edl restarts - -The generic SCM shutdown hook clears download mode on every clean reboot. -That is usually correct, but it breaks intentional EDL transitions because -the reboot code asks for "edl" before device shutdown and SCM clears the -download-mode bit again on the way down. - -Record explicit "edl" restarts in a reboot notifier, set download mode while -the SCM driver is still fully operational, and skip clearing it during the -matching shutdown sequence. ---- - drivers/firmware/qcom/qcom_scm.c | 32 ++++++++++++++++++++++++++++++++ - 1 file changed, 32 insertions(+) - -diff --git a/drivers/firmware/qcom/qcom_scm.c b/drivers/firmware/qcom/qcom_scm.c ---- a/drivers/firmware/qcom/qcom_scm.c -+++ b/drivers/firmware/qcom/qcom_scm.c -@@ -25,6 +25,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -34,6 +35,7 @@ - #include "qcom_tzmem.h" - - static u32 download_mode; -+static bool qcom_scm_restart_to_edl; - - struct qcom_scm { - struct device *dev; -@@ -558,6 +560,24 @@ - dev_err(__scm->dev, "failed to set download mode: %d\n", ret); - } - -+static int qcom_scm_reboot(struct notifier_block *nb, -+ unsigned long action, void *data) -+{ -+ const char *cmd = data; -+ -+ qcom_scm_restart_to_edl = false; -+ if (action == SYS_RESTART && cmd && !strcmp(cmd, "edl")) { -+ qcom_scm_restart_to_edl = true; -+ qcom_scm_set_download_mode(QCOM_DLOAD_FULLDUMP); -+ } -+ -+ return NOTIFY_DONE; -+} -+ -+static struct notifier_block qcom_scm_reboot_nb = { -+ .notifier_call = qcom_scm_reboot, -+}; -+ - /** - * qcom_scm_pas_init_image() - Initialize peripheral authentication service - * state machine for a given peripheral, using the -@@ -2426,6 +2446,11 @@ - */ - qcom_scm_set_download_mode(download_mode); - -+ ret = devm_register_reboot_notifier(scm->dev, &qcom_scm_reboot_nb); -+ if (ret) -+ return dev_err_probe(scm->dev, ret, -+ "Failed to register reboot notifier\n"); -+ - /* - * Disable SDI if indicated by DT that it is enabled by default. - */ -@@ -2453,6 +2478,15 @@ - - static void qcom_scm_shutdown(struct platform_device *pdev) - { -+ if (qcom_scm_restart_to_edl) { -+ /* -+ * "edl" is an intentional clean reboot into download mode, -+ * so preserve the bit set by the reboot notifier. -+ */ -+ qcom_scm_restart_to_edl = false; -+ return; -+ } -+ - /* Clean shutdown, disable download mode to allow normal restart */ - qcom_scm_set_download_mode(QCOM_DLOAD_NODUMP); - } --- -2.53.0 diff --git a/userspace/root/usr/local/sbin/reboot_edl b/userspace/root/usr/local/sbin/reboot_edl deleted file mode 100755 index 94cc7b8..0000000 --- a/userspace/root/usr/local/sbin/reboot_edl +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/sh -set -eu - -if [ "$(id -u)" -ne 0 ]; then - printf '\033[1;31mCall to RebootEDL failed: Interactive authentication required.\033[0m\n' >&2 - exit 1 -fi - -own_tty=$(tty 2>/dev/null || true) -broadcast=$(printf '\r\nBroadcast message from root@%s on %s (%s):\r\n\r\n%s\r\n\r\n' \ - "$(hostname)" "${own_tty#/dev/}" "$(date '+%a %Y-%m-%d %H:%M:%S %Z')" \ - "The system will reboot into EDL now!") -for t in /dev/pts/[0-9]* /dev/ttyMSM* /dev/ttyAMA*; do - [ -c "$t" ] && [ -w "$t" ] && [ "$t" != "$own_tty" ] && \ - printf '%s' "$broadcast" > "$t" 2>/dev/null & -done -wait - -exec python3 - <<'PY' -import ctypes -import os -import sys - -LINUX_REBOOT_MAGIC1 = 0xfee1dead -LINUX_REBOOT_MAGIC2 = 672274793 -LINUX_REBOOT_CMD_RESTART2 = 0xA1B2C3D4 -__NR_reboot = 142 - -libc = ctypes.CDLL(None, use_errno=True) -arg = ctypes.c_char_p(b"edl") -ret = libc.syscall(__NR_reboot, - LINUX_REBOOT_MAGIC1, - LINUX_REBOOT_MAGIC2, - LINUX_REBOOT_CMD_RESTART2, - arg) -err = ctypes.get_errno() -if ret != 0: - raise OSError(err, os.strerror(err)) - -sys.exit(1) -PY From 4fe665d2c065d0cdf868482b2be451d1444c5d94 Mon Sep 17 00:00:00 2001 From: Shengming Yuan Date: Sun, 29 Mar 2026 13:36:34 -0700 Subject: [PATCH 3/5] rename patch seq --- ...e.patch => 0014-spi-spidev-add-commaai-panda-compatible.patch} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename kernel/patches/{0010-spi-spidev-add-commaai-panda-compatible.patch => 0014-spi-spidev-add-commaai-panda-compatible.patch} (100%) diff --git a/kernel/patches/0010-spi-spidev-add-commaai-panda-compatible.patch b/kernel/patches/0014-spi-spidev-add-commaai-panda-compatible.patch similarity index 100% rename from kernel/patches/0010-spi-spidev-add-commaai-panda-compatible.patch rename to kernel/patches/0014-spi-spidev-add-commaai-panda-compatible.patch From 9d8f3b554e27ba20707782ce25978c2f0e00f21d Mon Sep 17 00:00:00 2001 From: Shengming Yuan Date: Sun, 29 Mar 2026 13:37:52 -0700 Subject: [PATCH 4/5] rename fix --- ...e.patch => 0010-spi-spidev-add-commaai-panda-compatible.patch} | 0 ...14-power-reset-msm-make-SDM845-restart-follow-Qualcomm-.patch} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename kernel/patches/{0014-spi-spidev-add-commaai-panda-compatible.patch => 0010-spi-spidev-add-commaai-panda-compatible.patch} (100%) rename kernel/patches/{0010-power-reset-msm-make-SDM845-restart-follow-Qualcomm-.patch => 0014-power-reset-msm-make-SDM845-restart-follow-Qualcomm-.patch} (100%) diff --git a/kernel/patches/0014-spi-spidev-add-commaai-panda-compatible.patch b/kernel/patches/0010-spi-spidev-add-commaai-panda-compatible.patch similarity index 100% rename from kernel/patches/0014-spi-spidev-add-commaai-panda-compatible.patch rename to kernel/patches/0010-spi-spidev-add-commaai-panda-compatible.patch diff --git a/kernel/patches/0010-power-reset-msm-make-SDM845-restart-follow-Qualcomm-.patch b/kernel/patches/0014-power-reset-msm-make-SDM845-restart-follow-Qualcomm-.patch similarity index 100% rename from kernel/patches/0010-power-reset-msm-make-SDM845-restart-follow-Qualcomm-.patch rename to kernel/patches/0014-power-reset-msm-make-SDM845-restart-follow-Qualcomm-.patch From 3dd471bf2cbb3bdd96cb882876486c87631cd6e6 Mon Sep 17 00:00:00 2001 From: Shengming Yuan Date: Sun, 29 Mar 2026 13:47:11 -0700 Subject: [PATCH 5/5] strip dl --- ...make-SDM845-restart-follow-Qualcomm-.patch | 76 +------------------ 1 file changed, 3 insertions(+), 73 deletions(-) diff --git a/kernel/patches/0014-power-reset-msm-make-SDM845-restart-follow-Qualcomm-.patch b/kernel/patches/0014-power-reset-msm-make-SDM845-restart-follow-Qualcomm-.patch index 06672bd..b82c4f7 100644 --- a/kernel/patches/0014-power-reset-msm-make-SDM845-restart-follow-Qualcomm-.patch +++ b/kernel/patches/0014-power-reset-msm-make-SDM845-restart-follow-Qualcomm-.patch @@ -2,78 +2,23 @@ diff --git a/drivers/power/reset/msm-poweroff.c b/drivers/power/reset/msm-powero index c7eb6dc8e90a..42d2cfc8d35e 100644 --- a/drivers/power/reset/msm-poweroff.c +++ b/drivers/power/reset/msm-poweroff.c -@@ -4,19 +4,99 @@ +@@ -4,19 +4,36 @@ #include #include -+#include #include #include #include +#include #include -+#include #include -#include -#include #include +#include -+ -+#define QCOM_SCM_EDLOAD_MODE 0x01 - + static void __iomem *msm_ps_hold; -+static u64 msm_dload_mode_addr; +static bool msm_force_warm_reboot; -+static bool msm_has_dload_mode_addr; -+ -+static int msm_restart_find_dload_address(u64 *addr) -+{ -+ struct device_node *scm; -+ struct device_node *tcsr; -+ struct resource res; -+ u32 offset; -+ int ret; -+ -+ scm = of_find_compatible_node(NULL, NULL, "qcom,scm"); -+ if (!scm) -+ return -ENODEV; -+ -+ tcsr = of_parse_phandle(scm, "qcom,dload-mode", 0); -+ if (!tcsr) { -+ of_node_put(scm); -+ return -ENODEV; -+ } -+ -+ ret = of_address_to_resource(tcsr, 0, &res); -+ of_node_put(tcsr); -+ if (ret) { -+ of_node_put(scm); -+ return ret; -+ } -+ -+ ret = of_property_read_u32_index(scm, "qcom,dload-mode", 1, &offset); -+ of_node_put(scm); -+ if (ret) -+ return ret; -+ -+ *addr = res.start + offset; -+ -+ return 0; -+} -+ -+static int msm_restart_write_dload_mode(u32 dload_mode) -+{ -+ if (!msm_has_dload_mode_addr || !qcom_scm_is_available()) -+ return -ENODEV; -+ -+ /* -+ * SDM845 EDL uses the older Qualcomm boot-misc encoding where -+ * literal 0x01 requests emergency download mode. The generic SCM -+ * helper only manipulates the dump bits, which is not enough for -+ * reboot-to-EDL on this platform. -+ */ -+ return qcom_scm_io_writel(msm_dload_mode_addr, dload_mode); -+} + +static int msm_restart_prepare(struct notifier_block *nb, + unsigned long action, void *data) @@ -93,18 +38,10 @@ index c7eb6dc8e90a..42d2cfc8d35e 100644 static int do_msm_poweroff(struct sys_off_data *data) { -+ if (data->cmd && !strcmp(data->cmd, "edl")) { -+ int ret; -+ -+ ret = msm_restart_write_dload_mode(QCOM_SCM_EDLOAD_MODE); -+ if (ret && ret != -ENODEV) -+ pr_warn("failed to enable download mode: %d\n", ret); -+ } -+ writel(0, msm_ps_hold); mdelay(10000); -@@ -25,16 +105,36 @@ static int do_msm_poweroff(struct sys_off_data *data) +@@ -25,16 +42,29 @@ static int do_msm_poweroff(struct sys_off_data *data) static int msm_restart_probe(struct platform_device *pdev) { @@ -119,13 +56,6 @@ index c7eb6dc8e90a..42d2cfc8d35e 100644 + msm_force_warm_reboot = of_property_read_bool(pdev->dev.of_node, + "qcom,force-warm-reboot"); + -+ ret = msm_restart_find_dload_address(&msm_dload_mode_addr); -+ if (!ret) -+ msm_has_dload_mode_addr = true; -+ else if (ret != -ENODEV) -+ dev_warn(&pdev->dev, "failed to resolve dload register: %d\n", -+ ret); -+ + ret = devm_register_reboot_notifier(&pdev->dev, &msm_restart_nb); + if (ret) + return ret;