qcom-dload-mode: Convert reboot notifier to restart notifier
There could be chance of edl download mode written by qcom-dload-mode driver overwritten by Scm device shutdown call as the reboot notifiers gets called prior to device_shutdown in reboot path. To fix this convert the reboot notifiers to restart notifiers and keep its priority higher than scm restart handler so that warm reboot_mode set here should be seen by SCM restart handler (priority 130). Change-Id: I2daa41d04788e525f274323e9c815bf10cb79ed2 Signed-off-by: Mukesh Ojha <quic_mojha@quicinc.com> Signed-off-by: Rohit Agarwal <quic_rohiagar@quicinc.com>
This commit is contained in:
parent
e602774fc1
commit
52c3eb6f12
@ -1229,6 +1229,7 @@ static void qcom_scm_shutdown(struct platform_device *pdev)
|
||||
{
|
||||
qcom_scm_disable_sdi();
|
||||
qcom_scm_halt_spmi_pmic_arbiter();
|
||||
/* Clean shutdown, disable download mode to allow normal restart */
|
||||
qcom_scm_set_download_mode(QCOM_DOWNLOAD_NODUMP, 0);
|
||||
}
|
||||
|
||||
|
@ -24,7 +24,7 @@ enum qcom_download_dest {
|
||||
|
||||
struct qcom_dload {
|
||||
struct notifier_block panic_nb;
|
||||
struct notifier_block reboot_nb;
|
||||
struct notifier_block restart_nb;
|
||||
struct kobject kobj;
|
||||
|
||||
bool in_panic;
|
||||
@ -251,28 +251,15 @@ static int qcom_dload_panic(struct notifier_block *this, unsigned long event,
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static int qcom_dload_reboot(struct notifier_block *this, unsigned long event,
|
||||
static int qcom_dload_restart(struct notifier_block *this, unsigned long event,
|
||||
void *ptr)
|
||||
{
|
||||
char *cmd = ptr;
|
||||
struct qcom_dload *poweroff = container_of(this, struct qcom_dload,
|
||||
reboot_nb);
|
||||
|
||||
/* Clean shutdown, disable dump mode to allow normal restart */
|
||||
if (!poweroff->in_panic)
|
||||
set_download_mode(QCOM_DOWNLOAD_NODUMP);
|
||||
|
||||
if (cmd) {
|
||||
if (!strcmp(cmd, "edl")) {
|
||||
early_pcie_init_enable ? set_download_mode(QCOM_EDLOAD_PCI_MODE)
|
||||
: set_download_mode(QCOM_DOWNLOAD_EDL);
|
||||
}
|
||||
else if (!strcmp(cmd, "qcom_dload"))
|
||||
msm_enable_dump_mode(true);
|
||||
}
|
||||
|
||||
if (current_download_mode != QCOM_DOWNLOAD_NODUMP)
|
||||
if (cmd && !strcmp(cmd, "edl")) {
|
||||
set_download_mode(QCOM_DOWNLOAD_EDL);
|
||||
reboot_mode = REBOOT_WARM;
|
||||
}
|
||||
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
@ -381,9 +368,14 @@ static int qcom_dload_probe(struct platform_device *pdev)
|
||||
atomic_notifier_chain_register(&panic_notifier_list,
|
||||
&poweroff->panic_nb);
|
||||
|
||||
poweroff->reboot_nb.notifier_call = qcom_dload_reboot;
|
||||
poweroff->reboot_nb.priority = 255;
|
||||
register_reboot_notifier(&poweroff->reboot_nb);
|
||||
poweroff->restart_nb.notifier_call = qcom_dload_restart;
|
||||
/* Here, Restart handler priority should be higher than
|
||||
* of restart handler present in scm driver so that
|
||||
* reboot_mode set by this handler seen by SCM's one
|
||||
* for EDL mode.
|
||||
*/
|
||||
poweroff->restart_nb.priority = 131;
|
||||
register_restart_handler(&poweroff->restart_nb);
|
||||
|
||||
platform_set_drvdata(pdev, poweroff);
|
||||
|
||||
@ -396,7 +388,7 @@ static int qcom_dload_remove(struct platform_device *pdev)
|
||||
|
||||
atomic_notifier_chain_unregister(&panic_notifier_list,
|
||||
&poweroff->panic_nb);
|
||||
unregister_reboot_notifier(&poweroff->reboot_nb);
|
||||
unregister_restart_handler(&poweroff->restart_nb);
|
||||
|
||||
if (poweroff->dload_dest_addr)
|
||||
iounmap(poweroff->dload_dest_addr);
|
||||
|
Loading…
Reference in New Issue
Block a user