void modem_crash_shutdown(const struct subsys_desc *subsys) { struct q6v4_modem *drv = desc_to_modem(subsys); drv->crash_shutdown = 1; smsm_reset_modem(SMSM_RESET); }
static int modem_ramdump(int enable, const struct subsys_desc *subsys) { struct q6v4_modem *drv = desc_to_modem(subsys); int ret; if (!enable) return 0; ret = do_ramdump(drv->sw_ramdump_dev, sw_segments, ARRAY_SIZE(sw_segments)); if (ret < 0) return ret; ret = do_ramdump(drv->fw_ramdump_dev, fw_segments, ARRAY_SIZE(fw_segments)); if (ret < 0) return ret; ret = do_ramdump(drv->smem_ramdump_dev, smem_segments, ARRAY_SIZE(smem_segments)); if (ret < 0) return ret; return 0; }
static void modem_stop(const struct subsys_desc *desc) { struct q6v4_modem *drv = desc_to_modem(desc); if (drv->loadable) { pil_shutdown(&drv->q6_sw.desc); pil_shutdown(&drv->q6_fw.desc); } }
static int modem_powerup(const struct subsys_desc *subsys) { struct q6v4_modem *drv = desc_to_modem(subsys); if (drv->loadable) { pil_force_boot("modem_fw"); pil_force_boot("modem"); } enable_irq(drv->q6_fw.wdog_irq); enable_irq(drv->q6_sw.wdog_irq); return 0; }
static int modem_start(const struct subsys_desc *desc) { struct q6v4_modem *drv = desc_to_modem(desc); int ret = 0; if (drv->loadable) { ret = pil_boot(&drv->q6_fw.desc); if (ret) return ret; ret = pil_boot(&drv->q6_sw.desc); if (ret) pil_shutdown(&drv->q6_fw.desc); } return ret; }
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; }
static int modem_powerup(const struct subsys_desc *subsys) { struct q6v4_modem *drv = desc_to_modem(subsys); int ret; if (drv->loadable) { ret = pil_boot(&drv->q6_fw.desc); if (ret) return ret; ret = pil_boot(&drv->q6_sw.desc); if (ret) { pil_shutdown(&drv->q6_fw.desc); return ret; } } enable_irq(drv->q6_fw.wdog_irq); enable_irq(drv->q6_sw.wdog_irq); return 0; }