static irqreturn_t modemctl_resume_thread(int irq, void *dev_id) { struct modemctl *mc = (struct modemctl *)dev_id; int val = gpio_get_value(mc->gpio_ipc_host_wakeup); int err; dev_dbg(mc->dev, "svn <HOST_WUP:%d\n", val); if (val != HOST_WUP_LEVEL) { if (mc->l2_done) { complete(mc->l2_done); mc->l2_done = NULL; } gpio_set_value(mc->gpio_ipc_slave_wakeup, 0); dev_dbg(mc->dev, "svn >SLAV_WUP:0,%d\n", gpio_get_value(mc->gpio_ipc_slave_wakeup)); mc->debug_cnt = 0; return IRQ_HANDLED; } if (val == HOST_WUP_LEVEL) { err = usbsvn_request_resume(); if (err < 0) dev_err(mc->dev, "request resume failed: %d\n", err); mc->debug_cnt++; } if (mc->debug_cnt > 30) { dev_err(mc->dev, "Abnormal Host wakeup -- over 30times"); disable_irq(irq); mc->debug_cnt = 0; crash_event(SVNET_ERROR_RESET); /*crash_event(SVNET_ERROR_CRASH);*/ /*panic("HSIC Disconnected");*/ msleep(1000); enable_irq(irq); } if (!val && mc->wakeup_flag == HOST_WAKEUP_WAIT_RESET) { mc->wakeup_flag = HOST_WAKEUP_LOW; dev_dbg(mc->dev, "%s: wakeup flag (%d)\n", __func__, mc->wakeup_flag); #ifdef CONFIG_SUPPORT_SIMDETECT /* SIM DETECT - default SIM status */ if (mc->gpio_sim_detect) { mc->sim_prev_states = (gpio_get_value(mc->gpio_sim_detect))? SIM_DETACH : SIM_ATTACH ; dev_dbg(mc->dev, "%s: default SIM Status (%d)\n", __func__, mc->sim_prev_states); } #endif } return IRQ_HANDLED; }
static void mc_resume_worker(struct work_struct *work) { struct modemctl *mc = container_of(work, struct modemctl, resume_work); int val = gpio_get_value(mc->gpio_host_wakeup); int err; dev_dbg(mc->dev, "svn qHOST_WUP:%d\n", val); if ((share_svn !=NULL) && (val == HOST_WUP_LEVEL)) { err = usbsvn_request_resume(); if (err < 0) dev_err(mc->dev, "request resume failed: %d\n", err); } }