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; }
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; }