static void mdm_power_on_common(struct mdm_modem_drv *mdm_drv) { mdm_drv->power_on_count++; /* this gpio will be used to indicate apq readiness, * de-assert it now so that it can be asserted later. * May not be used. */ if (GPIO_IS_VALID(MDM_GPIO(AP2MDM_WAKEUP))) gpio_direction_output(MDM_GPIO(AP2MDM_WAKEUP), 0); /* * If we did an "early power on" then ignore the very next * power-on request because it would the be first request from * user space but we're already powered on. Ignore it. */ if (mdm_drv->pdata->early_power_on && (mdm_drv->power_on_count == 2)) return; if (mdm_drv->power_on_count == 1) mdm_do_first_power_on(mdm_drv); else mdm_do_soft_power_on(mdm_drv); }
static void mdm_power_on_common(struct mdm_modem_drv *mdm_drv) { power_on_count++; /* this gpio will be used to indicate apq readiness, * de-assert it now so that it can be asserted later. * May not be used. */ if (GPIO_IS_VALID(mdm_drv->ap2mdm_wakeup_gpio)) gpio_direction_output(mdm_drv->ap2mdm_wakeup_gpio, 0); /* * If we did an "early power on" then ignore the very next * power-on request because it would the be first request from * user space but we're already powered on. Ignore it. */ if (mdm_drv->pdata->early_power_on && (power_on_count == 2)) return; #ifdef CONFIG_SONY_QSCFLASHING_UART4 /* * If we want to enter into edl mode, we should hard reboot the QSC, * so we use the mdm_do_first_power_on */ if (mdm_drv->mdm_edload_status == 1) { mdm_do_first_power_on(mdm_drv); power_on_count--; return; } #endif if (power_on_count == 1) mdm_do_first_power_on(mdm_drv); else mdm_do_soft_power_on(mdm_drv); }
static int mdm_cmd_exe(enum esoc_cmd cmd, struct esoc_clink *esoc) { int ret; unsigned long end_time; bool status_down = false; struct mdm_ctrl *mdm = get_esoc_clink_data(esoc); struct device *dev = mdm->dev; switch (cmd) { case ESOC_PWR_ON: gpio_set_value(MDM_GPIO(mdm, AP2MDM_ERRFATAL), 0); mdm_enable_irqs(mdm); mdm->init = 1; mdm_do_first_power_on(mdm); break; case ESOC_PWR_OFF: mdm_disable_irqs(mdm); mdm->debug = 0; mdm->ready = false; ret = sysmon_send_shutdown(mdm->sysmon_subsys_id); device_lock(dev); if (ret) dev_err(mdm->dev, "Graceful shutdown fail, ret = %d\n", ret); else { dev_info(mdm->dev, "Waiting for status gpio go low\n"); status_down = false; end_time = jiffies + msecs_to_jiffies(10000); while (time_before(jiffies, end_time)) { if (gpio_get_value(MDM_GPIO(mdm, MDM2AP_STATUS)) == 0) { dev_dbg(dev, "Status went low\n"); status_down = true; break; } msleep(100); } if (status_down) dev_info(dev, "shutdown successful\n"); else dev_err(mdm->dev, "graceful poff ipc fail\n"); } /* * Force a shutdown of the mdm. This is required in order * to prevent the mdm from immediately powering back on * after the shutdown */ gpio_set_value(MDM_GPIO(mdm, AP2MDM_STATUS), 0); esoc_clink_queue_request(ESOC_REQ_SHUTDOWN, esoc); mdm_power_down(mdm); mdm_update_gpio_configs(mdm, GPIO_UPDATE_BOOTING_CONFIG); device_unlock(dev); break; case ESOC_RESET: mdm_toggle_soft_reset(mdm); break; case ESOC_PREPARE_DEBUG: /* * disable all irqs except request irq (pblrdy) * force a reset of the mdm by signaling * an APQ crash, wait till mdm is ready for ramdumps. */ mdm->ready = false; cancel_delayed_work(&mdm->mdm2ap_status_check_work); gpio_set_value(MDM_GPIO(mdm, AP2MDM_ERRFATAL), 1); dev_info(mdm->dev, "set ap2mdm errfatal to force reset\n"); msleep(mdm->ramdump_delay_ms); break; case ESOC_EXE_DEBUG: mdm->debug = 1; mdm_toggle_soft_reset(mdm); /* * wait for ramdumps to be collected * then power down the mdm and switch gpios to booting * config */ if (!wait_for_completion_timeout(&mdm->debug_done, msecs_to_jiffies(mdm->dump_timeout_ms))) { dev_err(mdm->dev, "ramdump collection timedout\n"); mdm->debug = 0; return -ETIMEDOUT; } if (mdm->debug_fail) { dev_err(mdm->dev, "unable to collect ramdumps\n"); mdm->debug = 0; return -EIO; } dev_dbg(mdm->dev, "ramdump collection done\n"); mdm->debug = 0; init_completion(&mdm->debug_done); break; case ESOC_EXIT_DEBUG: /* * Deassert APQ to mdm err fatal * Power on the mdm */ gpio_set_value(MDM_GPIO(mdm, AP2MDM_ERRFATAL), 0); dev_dbg(mdm->dev, "exiting debug state after power on\n"); mdm->get_restart_reason = true; break; default: return -EINVAL; }; return 0; }