static struct pil_reset_ops pil_lpass_ops_trusted = { .init_image = pil_lpass_init_image_trusted, .mem_setup = pil_lpass_mem_setup_trusted, .proxy_vote = pil_q6v5_make_proxy_votes, .proxy_unvote = pil_q6v5_remove_proxy_votes, .auth_and_reset = pil_lpass_reset_trusted, .shutdown = pil_lpass_shutdown_trusted, }; static int wcnss_notifier_cb(struct notifier_block *this, unsigned long code, void *ss_handle) { int ret; pr_info("%s: W-Notify: event %lu\n", __func__, code); ret = sysmon_send_event(SYSMON_SS_LPASS, "wcnss", code); if (ret < 0) pr_err("%s: sysmon_send_event error %d", __func__, ret); return NOTIFY_DONE; } static struct notifier_block wnb = { .notifier_call = wcnss_notifier_cb, }; static int modem_notifier_cb(struct notifier_block *this, unsigned long code, void *ss_handle) { int ret; pr_info("%s: M-Notify: event %lu\n", __func__, code); ret = sysmon_send_event(SYSMON_SS_LPASS, "modem", code);
if (ret) return ret; ret = pil_do_ramdump(&drv->mba->desc, drv->ramdump_dev); if (ret < 0) pr_err("Unable to dump modem fw memory (rc = %d).\n", ret); pil_shutdown(&drv->q6->desc); return ret; } static int adsp_state_notifier_fn(struct notifier_block *this, unsigned long code, void *ss_handle) { int ret; ret = sysmon_send_event(SYSMON_SS_MODEM, "adsp", code); if (ret < 0) pr_err("%s: sysmon_send_event failed (%d).", __func__, ret); return NOTIFY_DONE; } static struct notifier_block adsp_state_notifier_block = { .notifier_call = adsp_state_notifier_fn, }; static irqreturn_t modem_wdog_bite_intr_handler(int irq, void *dev_id) { struct modem_data *drv = subsys_to_drv(dev_id); if (drv->ignore_errors) return IRQ_HANDLED; pr_err("Watchdog bite received from modem software!\n");
static void modem_crash_shutdown(const struct subsys_desc *subsys) { struct modem_data *drv = subsys_to_drv(subsys); drv->crash_shutdown = true; #ifdef CONFIG_LGE_HANDLE_PANIC if (!subsys_get_crash_status(drv->subsys) && (lge_get_modem_panic() != 3)) { #else if (!subsys_get_crash_status(drv->subsys)) { #endif gpio_set_value(subsys->force_stop_gpio, 1); mdelay(STOP_ACK_TIMEOUT_MS); } } static int modem_ramdump(int enable, const struct subsys_desc *subsys) { struct modem_data *drv = subsys_to_drv(subsys); int ret; if (!enable) return 0; ret = pil_boot(&drv->q6->desc); if (ret) return ret; ret = pil_do_ramdump(&drv->mba->desc, drv->ramdump_dev); if (ret < 0) pr_err("Unable to dump modem fw memory (rc = %d).\n", ret); pil_shutdown(&drv->q6->desc); return ret; } static int adsp_state_notifier_fn(struct notifier_block *this, unsigned long code, void *ss_handle) { int ret; ret = sysmon_send_event(SYSMON_SS_MODEM, "adsp", code); if (ret < 0) pr_err("%s: sysmon_send_event failed (%d).", __func__, ret); return NOTIFY_DONE; } static struct notifier_block adsp_state_notifier_block = { .notifier_call = adsp_state_notifier_fn, }; static irqreturn_t modem_wdog_bite_intr_handler(int irq, void *dev_id) { struct modem_data *drv = subsys_to_drv(dev_id); if (drv->ignore_errors) return IRQ_HANDLED; /* START : subsys_modem_restart : testmode */ if (ignore_errors_by_subsys_modem_restart) { pr_err("IGNORE watchdog bite received from modem software!\n"); return IRQ_HANDLED; } /* END : subsys_modem_restart : testmode */ if (check_modem_reset(drv) == 0) { pr_err("IGNORE watchdog bite received from modem software during check_modem_reset!\n"); return IRQ_HANDLED; } pr_err("Watchdog bite received from modem software!\n"); #if defined(CONFIG_PRE_SELF_DIAGNOSIS) lge_pre_self_diagnosis((char *) "modem", 2, (char *) "Watchdog bite Intr", (char *) "_", 20000); #endif subsys_set_crash_status(drv->subsys, true); restart_modem(drv); return IRQ_HANDLED; } static int mss_start(const struct subsys_desc *desc) { int ret; struct modem_data *drv = subsys_to_drv(desc); if (desc->is_not_loadable) return 0; INIT_COMPLETION(drv->stop_ack); ret = pil_boot(&drv->q6->desc); if (ret) return ret; ret = pil_boot(&drv->mba->desc); if (ret) pil_shutdown(&drv->q6->desc); return ret; }