diff --git a/drivers/irqchip/qcom-mpm.c b/drivers/irqchip/qcom-mpm.c index 76c5d332e527..53afae539ee2 100644 --- a/drivers/irqchip/qcom-mpm.c +++ b/drivers/irqchip/qcom-mpm.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -472,6 +473,9 @@ static irqreturn_t msm_mpm_irq(int irq, void *dev_id) pending = msm_mpm_read(MPM_REG_STATUS, i); pending &= (unsigned long)value[i]; + if (pending) + pm_system_wakeup(); + trace_mpm_wakeup_pending_irqs(i, pending); for_each_set_bit(k, &pending, 32) { mpm_irq = 32 * i + k; @@ -529,22 +533,15 @@ static int msm_mpm_init(struct device_node *node) } dev->ipc_irq = irq; - ret = request_irq(dev->ipc_irq, msm_mpm_irq, IRQF_TRIGGER_RISING, "mpm", msm_mpm_irq); + ret = request_irq(dev->ipc_irq, msm_mpm_irq, + IRQF_TRIGGER_RISING | IRQF_NO_SUSPEND, "mpm", + msm_mpm_irq); if (ret) { pr_err("request_irq failed errno: %d\n", ret); goto ipc_irq_err; } - ret = irq_set_irq_wake(dev->ipc_irq, 1); - if (ret) { - pr_err("failed to set wakeup irq %lu: %d\n", - dev->ipc_irq, ret); - goto set_wake_irq_err; - } - return 0; -set_wake_irq_err: - free_irq(dev->ipc_irq, msm_mpm_irq); ipc_irq_err: iounmap(dev->mpm_ipc_reg); ipc_reg_err: