diff options
author | merge <null@invalid> | 2008-12-10 09:36:00 +0000 |
---|---|---|
committer | Andy Green <agreen@pads.home.warmcat.com> | 2008-12-10 09:36:00 +0000 |
commit | c4c7b829f877a992e5bb5fefe94b440ba7ca7a5e (patch) | |
tree | 8eb1e3a560563f2bbb86c4509148c9468d38e43a | |
parent | 4cb6aa6461979dc4bdc468ab6bf948e9a7055368 (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
-rw-r--r-- | arch/arm/plat-s3c24xx/irq-pm.c | 25 | ||||
-rw-r--r-- | arch/arm/plat-s3c24xx/irq.c | 14 |
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 |