コード例 #1
0
static irqreturn_t ipc_ap_wake_irq(int irq, void *dev_id)
{
	struct baseband_power_platform_data *data = xmm_power_drv_data.pdata;
	int value;

	value = gpio_get_value(data->modem.xmm.ipc_ap_wake);
	pr_debug("%s g(%d), wake_st(%d)\n", __func__, value, ipc_ap_wake_state);

	/* modem wakeup part */
	if (likely(ipc_ap_wake_state >= IPC_AP_WAKE_INIT2))
		return xmm_power_ipc_ap_wake_irq(value);

	/* modem initialization/bootup part*/
	if (unlikely(ipc_ap_wake_state < IPC_AP_WAKE_IRQ_READY)) {
		pr_err("%s - spurious irq\n", __func__);
	} else if (ipc_ap_wake_state == IPC_AP_WAKE_IRQ_READY) {
		if (value) {
			/* make state ready for falling edge */
			ipc_ap_wake_state = IPC_AP_WAKE_INIT1;
			pr_debug("%s - got rising edge\n", __func__);
		}
	} else if (ipc_ap_wake_state == IPC_AP_WAKE_INIT1) {
		if (!value) {
			pr_debug("%s - got falling edge at INIT1\n", __func__);
			/* go to IPC_AP_WAKE_INIT2 state */
			ipc_ap_wake_state = IPC_AP_WAKE_INIT2;
			queue_work(workqueue, &init2_work);
		} else
			pr_debug("%s - unexpected rising edge\n", __func__);
	}
	return IRQ_HANDLED;
}
コード例 #2
0
static irqreturn_t xmm_power2_ipc_ap_wake_irq(int irq, void *dev_id)
{
	int value;
	struct xmm_power_data *data = dev_id;
	struct baseband_power_platform_data *pdata = data->pdata;

	pr_debug("%s\n", __func__);

	/* check for platform data */
	if (!pdata)
		return IRQ_HANDLED;

	value = gpio_get_value(pdata->modem.xmm.ipc_ap_wake);

	/* IPC_AP_WAKE state machine */
	if (unlikely(ipc_ap_wake_state < IPC_AP_WAKE_IRQ_READY))
		pr_err("%s - spurious irq\n", __func__);
	else if (ipc_ap_wake_state == IPC_AP_WAKE_IRQ_READY) {
		if (!value) {
			pr_debug("%s: IPC_AP_WAKE_INIT1 got falling edge\n",
				__func__);
			/* go to IPC_AP_WAKE_INIT2 state */
			ipc_ap_wake_state = IPC_AP_WAKE_INIT2;
			/* queue work */
			data->state =
				BBXMM_WORK_INIT_FLASHLESS_PM_STEP2;
			queue_work(workqueue, &data->work);
		} else
			pr_debug("%s: IPC_AP_WAKE_INIT1"
				" wait for falling edge\n", __func__);
	} else {
		if (!value) {
			pr_debug("%s - falling\n", __func__);
			ipc_ap_wake_state = IPC_AP_WAKE_L;
		} else {
			pr_debug("%s - rising\n", __func__);
			ipc_ap_wake_state = IPC_AP_WAKE_H;
		}
		return xmm_power_ipc_ap_wake_irq(irq, dev_id);
	}

	return IRQ_HANDLED;
}