static int modem_shutdown(const struct subsys_desc *subsys) { void __iomem *q6_fw_wdog_addr; void __iomem *q6_sw_wdog_addr; /* * Disable the modem watchdog since it keeps running even after the * modem is shutdown. */ q6_fw_wdog_addr = ioremap_nocache(Q6_FW_WDOG_ENABLE, 4); if (!q6_fw_wdog_addr) return -ENOMEM; q6_sw_wdog_addr = ioremap_nocache(Q6_SW_WDOG_ENABLE, 4); if (!q6_sw_wdog_addr) { iounmap(q6_fw_wdog_addr); return -ENOMEM; } writel_relaxed(0x0, q6_fw_wdog_addr); writel_relaxed(0x0, q6_sw_wdog_addr); mb(); iounmap(q6_sw_wdog_addr); iounmap(q6_fw_wdog_addr); pil_force_shutdown("modem"); pil_force_shutdown("modem_fw"); disable_irq_nosync(Q6FW_WDOG_EXPIRED_IRQ); disable_irq_nosync(Q6SW_WDOG_EXPIRED_IRQ); return 0; }
static int modem_shutdown(const struct subsys_data *subsys) { void __iomem *q6_fw_wdog_addr; void __iomem *q6_sw_wdog_addr; int smsm_notif_unregistered = 0; if (!(smsm_get_state(SMSM_MODEM_STATE) & SMSM_RESET)) { smsm_state_cb_deregister(SMSM_MODEM_STATE, SMSM_RESET, smsm_state_cb, 0); smsm_notif_unregistered = 1; smsm_reset_modem(SMSM_RESET); } /* * Cancel any pending wdog_check work items, since we're shutting * down anyway. */ cancel_delayed_work(&modem_wdog_check_work); /* * Disable the modem watchdog since it keeps running even after the * modem is shutdown. */ q6_fw_wdog_addr = ioremap_nocache(Q6_FW_WDOG_ENABLE, 4); if (!q6_fw_wdog_addr) return -ENOMEM; q6_sw_wdog_addr = ioremap_nocache(Q6_SW_WDOG_ENABLE, 4); if (!q6_sw_wdog_addr) { iounmap(q6_fw_wdog_addr); return -ENOMEM; } writel_relaxed(0x0, q6_fw_wdog_addr); writel_relaxed(0x0, q6_sw_wdog_addr); mb(); iounmap(q6_sw_wdog_addr); iounmap(q6_fw_wdog_addr); pil_force_shutdown("modem"); pil_force_shutdown("modem_fw"); disable_irq_nosync(Q6FW_WDOG_EXPIRED_IRQ); disable_irq_nosync(Q6SW_WDOG_EXPIRED_IRQ); if (smsm_notif_unregistered) smsm_state_cb_register(SMSM_MODEM_STATE, SMSM_RESET, smsm_state_cb, 0); return 0; }
static int gss_shutdown(const struct subsys_data *subsys) { pil_force_shutdown("gss"); disable_irq_nosync(GSS_A5_WDOG_EXPIRED); return 0; }
/* Subsystem handlers */ static int riva_shutdown(const struct subsys_data *subsys) { pil_force_shutdown("wcnss"); flush_delayed_work(&cancel_vote_work); return 0; }
static int dsps_shutdown(const struct subsys_data *subsys) { pr_debug("%s\n", __func__); disable_irq_nosync(drv->wdog_irq); pil_force_shutdown(drv->pdata->pil_name); dsps_power_off_handler(); return 0; }
/** * Shutdown function * called by the restart notifier * */ static int dsps_shutdown(const struct subsys_data *subsys) { pr_debug("%s\n", __func__); dsps_suspend(); pil_force_shutdown(drv->pdata->pil_name); dsps_power_off_handler(); return 0; }
static int riva_shutdown(const struct subsys_data *subsys) { pil_force_shutdown("wcnss"); flush_delayed_work(&cancel_vote_work); disable_irq_nosync(RIVA_APSS_WDOG_BITE_RESET_RDY_IRQ); return 0; }
/* Subsystem handlers */ static int riva_shutdown(const struct subsys_data *subsys) { pil_force_shutdown("wcnss"); pr_info("[SSR] pil_force_shutdown is finished\n"); flush_delayed_work(&cancel_vote_work); pr_info("[SSR] flush_delayed_work(vote) for shutdown is finished\n"); return 0; }
static int modem_shutdown(const struct subsys_desc *subsys) { struct q6v4_modem *drv = desc_to_modem(subsys); /* The watchdogs keep running even after the modem is shutdown */ writel_relaxed(0x0, drv->q6_fw.wdog_base + 0x24); writel_relaxed(0x0, drv->q6_sw.wdog_base + 0x24); mb(); if (drv->loadable) { pil_force_shutdown("modem"); pil_force_shutdown("modem_fw"); } disable_irq_nosync(drv->q6_fw.wdog_irq); disable_irq_nosync(drv->q6_sw.wdog_irq); return 0; }
/* Subsystem handlers */ static int riva_shutdown(const struct subsys_desc *subsys) { pr_info(MODULE_NAME "%s + \n", __FUNCTION__); pil_force_shutdown("wcnss"); pr_info(MODULE_NAME "%s pil_force_shutdown done \n", __FUNCTION__); flush_delayed_work(&cancel_vote_work); wcnss_flush_delayed_boot_votes(); disable_irq_nosync(RIVA_APSS_WDOG_BITE_RESET_RDY_IRQ); pr_info(MODULE_NAME "%s - \n", __FUNCTION__); return 0; }
static int modem_shutdown(const struct subsys_data *subsys) { void __iomem *q6_fw_wdog_addr; void __iomem *q6_sw_wdog_addr; /* * Cancel any pending wdog_check work items, since we're shutting * down anyway. */ cancel_delayed_work(&modem_wdog_check_work); /* * Disable the modem watchdog since it keeps running even after the * modem is shutdown. */ q6_fw_wdog_addr = ioremap_nocache(Q6_FW_WDOG_ENABLE, 4); if (!q6_fw_wdog_addr) return -ENOMEM; q6_sw_wdog_addr = ioremap_nocache(Q6_SW_WDOG_ENABLE, 4); if (!q6_sw_wdog_addr) { iounmap(q6_fw_wdog_addr); return -ENOMEM; } msm_xo_mode_vote(xo1, MSM_XO_MODE_ON); msm_xo_mode_vote(xo2, MSM_XO_MODE_ON); writel_relaxed(0x0, q6_fw_wdog_addr); writel_relaxed(0x0, q6_sw_wdog_addr); mb(); iounmap(q6_sw_wdog_addr); iounmap(q6_fw_wdog_addr); pil_force_shutdown("modem"); pil_force_shutdown("modem_fw"); disable_irq_nosync(Q6FW_WDOG_EXPIRED_IRQ); disable_irq_nosync(Q6SW_WDOG_EXPIRED_IRQ); return 0; }
/** * Shutdown function * called by the restart notifier * */ static int dsps_shutdown(const struct subsys_desc *subsys) { pr_debug("%s\n", __func__); disable_irq_nosync(drv->wdog_irq); if (drv->pdata->ppss_wdog_unmasked_int_en_reg) { writel_relaxed(0, (drv->ppss_base+ drv->pdata->ppss_wdog_unmasked_int_en_reg)); mb(); /* Make sure wdog is disabled before shutting down */ } pil_force_shutdown(drv->pdata->pil_name); dsps_power_off_handler(); return 0; }
/* Subsystem handlers */ static int riva_shutdown(const struct subsys_data *subsys) { struct platform_device *pdev = wcnss_get_platform_device(); struct wcnss_wlan_config *pwlanconfig = wcnss_get_wlan_config(); int ret = -1; pil_force_shutdown("wcnss"); /* proxy vote on behalf of Riva */ if (pdev && pwlanconfig) ret = wcnss_wlan_power(&pdev->dev, pwlanconfig, WCNSS_WLAN_SWITCH_OFF); return ret; }
/* Subsystem handlers */ static int riva_shutdown(const struct subsys_data *subsys) { pr_info(MODULE_NAME ": riva_shutdown.\n"); //ASUS_BSP+++ "for /data/log/ASUSEvtlog" ASUSEvtlog("[wcnss]: riva_shutdown.\n"); //ASUS_BSP--- "for /data/log/ASUSEvtlog" pil_force_shutdown("wcnss"); flush_delayed_work(&cancel_vote_work); wcnss_flush_delayed_boot_votes(); disable_irq_nosync(RIVA_APSS_WDOG_BITE_RESET_RDY_IRQ); return 0; }
int subsys_q6_shutdown(const struct subsys_data *crashed_subsys) { void __iomem *q6_wdog_addr = ioremap_nocache(Q6SS_WDOG_ENABLE, 8); send_q6_nmi(); writel_relaxed(0x0, q6_wdog_addr); mb(); iounmap(q6_wdog_addr); pil_force_shutdown("q6"); disable_irq_nosync(LPASS_Q6SS_WDOG_EXPIRED); return 0; }
int subsys_q6_shutdown(const char * const crashed_subsys) { void __iomem *q6_wdog_addr = ioremap_nocache(Q6SS_WDOG_ENABLE, 8); send_q6_nmi(); writel_relaxed(0x0, q6_wdog_addr); /* The write needs to go through before the q6 is shutdown. */ mb(); iounmap(q6_wdog_addr); pil_force_shutdown("q6"); disable_irq_nosync(LPASS_Q6SS_WDOG_EXPIRED); if (get_restart_level() == RESET_SUBSYS_MIXED) smsm_reset_modem(SMSM_RESET); return 0; }