arm: mmp: Remove pointless fiddling with irq internals
authorThomas Gleixner <tglx@linutronix.de>
Sun, 23 Feb 2014 21:40:13 +0000 (21:40 +0000)
committerThomas Gleixner <tglx@linutronix.de>
Tue, 4 Mar 2014 16:37:52 +0000 (17:37 +0100)
The pm-mmp2 and pm-pxa910 power management related irq_set_wake
callbacks fiddle pointlessly with the irq actions for no reason except
for lack of understanding how the wakeup mechanism works.

On supsend the core disables all interrupts lazily, i.e. it does not
mask them at the irq controller level. So any interrupt which is
firing during suspend will mark the corresponding interrupt line as
pending. Just before the core powers down it checks whether there are
interrupts pending from interrupt lines which are marked as wakeup
sources and if so it aborts the suspend and resends the interrupts.
If there was no interrupt at this point, the cpu goes into suspend
with these interrupts unmasked.

The IRQF_NO_SUSPEND flag for interrupt actions is a totally different
mechanism. That allows the device driver to prevent the core from
disabling the interrupt despite the fact that it is not marked as a
wakeup source. This has nothing to do with the case at hand. It was
introduced for special cases where lazy disable is not possible.

Remove the nonsense along with the braindamaged boundary check. The
core code does NOT call these functions out of boundary.

Add a FIXME comment to an unhandled error path which merily printks
some useless blurb instead of returning a proper error code.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: arm <linux-arm-kernel@lists.infradead.org>
Cc: Eric Miao <eric.y.miao@gmail.com>
Cc: Haojian Zhuang <haojian.zhuang@gmail.com>
Cc: Russell King <linux@arm.linux.org.uk>
Link: http://lkml.kernel.org/r/20140223212737.214342433@linutronix.de
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
arch/arm/mach-mmp/pm-mmp2.c
arch/arm/mach-mmp/pm-pxa910.c

index 461a191a32d248ba3e2715aa9f3cfb607d6df7d8..43b1a516957fdfc2cc32b75a0e284289ad6d73ec 100644 (file)
 
 int mmp2_set_wake(struct irq_data *d, unsigned int on)
 {
-       int irq = d->irq;
-       struct irq_desc *desc = irq_to_desc(irq);
        unsigned long data = 0;
-
-       if (unlikely(irq >= nr_irqs)) {
-               pr_err("IRQ nubmers are out of boundary!\n");
-               return -EINVAL;
-       }
-
-       if (on) {
-               if (desc->action)
-                       desc->action->flags |= IRQF_NO_SUSPEND;
-       } else {
-               if (desc->action)
-                       desc->action->flags &= ~IRQF_NO_SUSPEND;
-       }
+       int irq = d->irq;
 
        /* enable wakeup sources */
        switch (irq) {
index 48981ca801a5527b8b2df375237d595ec98dc388..04c9daf9f8d767a7225631a7f36e443fae260d88 100644 (file)
 
 int pxa910_set_wake(struct irq_data *data, unsigned int on)
 {
-       int irq = data->irq;
-       struct irq_desc *desc = irq_to_desc(data->irq);
        uint32_t awucrm = 0, apcr = 0;
-
-       if (unlikely(irq >= nr_irqs)) {
-               pr_err("IRQ nubmers are out of boundary!\n");
-               return -EINVAL;
-       }
-
-       if (on) {
-               if (desc->action)
-                       desc->action->flags |= IRQF_NO_SUSPEND;
-       } else {
-               if (desc->action)
-                       desc->action->flags &= ~IRQF_NO_SUSPEND;
-       }
+       int irq = data->irq;
 
        /* setting wakeup sources */
        switch (irq) {
@@ -115,9 +101,11 @@ int pxa910_set_wake(struct irq_data *data, unsigned int on)
                if (irq >= IRQ_GPIO_START && irq < IRQ_BOARD_START) {
                        awucrm = MPMU_AWUCRM_WAKEUP(2);
                        apcr |= MPMU_APCR_SLPWP2;
-               } else
+               } else {
+                       /* FIXME: This should return a proper error code ! */
                        printk(KERN_ERR "Error: no defined wake up source irq: %d\n",
                                irq);
+               }
        }
 
        if (on) {