Beispiel #1
0
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);
	}
}