aboutsummaryrefslogtreecommitdiff
path: root/arch/arm/plat-s3c24xx
diff options
context:
space:
mode:
authormerge <null@invalid>2008-12-10 09:36:00 +0000
committerAndy Green <agreen@pads.home.warmcat.com>2008-12-10 09:36:00 +0000
commitc4c7b829f877a992e5bb5fefe94b440ba7ca7a5e (patch)
tree8eb1e3a560563f2bbb86c4509148c9468d38e43a /arch/arm/plat-s3c24xx
parent4cb6aa6461979dc4bdc468ab6bf948e9a7055368 (diff)
MERGE-via-pending-tracking-hist-MERGE-via-pending-tracking-hist-1228898320
pending-tracking-hist top was MERGE-via-pending-tracking-hist-1228898320 / 75e06011b6a2ab443295941791f0e71913d837d5 ... parent commitmessage: From: merge <null@invalid> MERGE-pending-tracking-patchset-edits
Diffstat (limited to 'arch/arm/plat-s3c24xx')
-rw-r--r--arch/arm/plat-s3c24xx/irq-pm.c25
-rw-r--r--arch/arm/plat-s3c24xx/irq.c14
2 files changed, 24 insertions, 15 deletions
diff --git a/arch/arm/plat-s3c24xx/irq-pm.c b/arch/arm/plat-s3c24xx/irq-pm.c
index 87bda522c1a..04352bf397c 100644
--- a/arch/arm/plat-s3c24xx/irq-pm.c
+++ b/arch/arm/plat-s3c24xx/irq-pm.c
@@ -15,6 +15,7 @@
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/sysdev.h>
+#include <linux/irq.h>
#include <plat/cpu.h>
#include <plat/pm.h>
@@ -83,7 +84,9 @@ int s3c24xx_irq_suspend(struct sys_device *dev, pm_message_t state)
int s3c24xx_irq_resume(struct sys_device *dev)
{
- unsigned int i;
+ unsigned int i, irq;
+ unsigned long eintpnd;
+ struct irq_desc *desc;
for (i = 0; i < ARRAY_SIZE(save_extint); i++)
__raw_writel(save_extint[i], S3C24XX_EXTINT0 + (i*4));
@@ -94,5 +97,25 @@ int s3c24xx_irq_resume(struct sys_device *dev)
s3c_pm_do_restore(irq_save, ARRAY_SIZE(irq_save));
__raw_writel(save_eintmask, S3C24XX_EINTMASK);
+ /*
+ * ACK those interrupts which are now masked and pending.
+ * Level interrupts if not ACKed here, create an interrupt storm
+ * because they are not handled at all.
+ */
+
+ eintpnd = __raw_readl(S3C24XX_EINTPEND);
+
+ eintpnd &= save_eintmask;
+ eintpnd &= ~0xff; /* ignore lower irqs */
+
+ while (eintpnd) {
+ irq = __ffs(eintpnd);
+ eintpnd &= ~(1 << irq);
+
+ irq += (IRQ_EINT4 - 4);
+ desc = irq_to_desc(irq);
+ desc->chip->ack(irq);
+ }
+
return 0;
}
diff --git a/arch/arm/plat-s3c24xx/irq.c b/arch/arm/plat-s3c24xx/irq.c
index e236ec70fa0..d696bbd1c9e 100644
--- a/arch/arm/plat-s3c24xx/irq.c
+++ b/arch/arm/plat-s3c24xx/irq.c
@@ -497,20 +497,6 @@ s3c_irq_demux_extint8(unsigned int irq,
generic_handle_irq(irq);
}
- /* ACK those interrupts which are masked, but pending */
- eintpnd = __raw_readl(S3C24XX_EINTPEND);
- eintmsk = __raw_readl(S3C24XX_EINTMASK);
-
- eintpnd &= eintmsk;
- eintpnd &= ~0xff; /* ignore lower irqs */
-
- while (eintpnd) {
- irq = __ffs(eintpnd);
- eintpnd &= ~(1 << irq);
-
- irq += (IRQ_EINT4 - 4);
- s3c_irqext_ack(irq);
- }
}
static void