From: Michael Schmitz <schmitzmic@gmail.com>
To: geert@linux-m68k.org
Cc: linux-m68k@vger.kernel.org, debian-68k@lists.debian.org,
Michael Schmitz <schmitz@debian.org>
Subject: [PATCH 05/14] m68k/irq: add handle_polled_irq() for timer based soft interrupts
Date: Mon, 25 Mar 2013 14:16:23 +1300 [thread overview]
Message-ID: <1364174192-25406-6-git-send-email-schmitz@debian.org> (raw)
In-Reply-To: <1364174192-25406-1-git-send-email-schmitz@debian.org>
This patch adds a special 'polled interrupt' handler for timer based software interrupts.
handle_simple_irq() will respond to excessive unhandled interrupts (as are expected for a
polling timer interrupt) by disabling the apparently unhandled interrupt source.
handle_polled_irq() prevents this by setting the IRQS_POLL_INPROGRESS flag which will cause
the unhandled interrupt events to be ignored.
This is a temporary hack to allow timer based polling of the Atari ROM port network and USB
cards only. Suggestions on how to properly handle this in the normal interrupt framework are
most welcome.
Signed-off-by: Michael Schmitz <schmitz@debian.org>
---
include/linux/irq.h | 1 +
kernel/irq/chip.c | 36 ++++++++++++++++++++++++++++++++++++
2 files changed, 37 insertions(+), 0 deletions(-)
diff --git a/include/linux/irq.h b/include/linux/irq.h
index bc4e066..5064385 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -407,6 +407,7 @@ extern void handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc);
extern void handle_edge_irq(unsigned int irq, struct irq_desc *desc);
extern void handle_edge_eoi_irq(unsigned int irq, struct irq_desc *desc);
extern void handle_simple_irq(unsigned int irq, struct irq_desc *desc);
+extern void handle_polled_irq(unsigned int irq, struct irq_desc *desc);
extern void handle_percpu_irq(unsigned int irq, struct irq_desc *desc);
extern void handle_percpu_devid_irq(unsigned int irq, struct irq_desc *desc);
extern void handle_bad_irq(unsigned int irq, struct irq_desc *desc);
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index cbd97ce..667e4c1 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -353,6 +353,42 @@ out_unlock:
}
EXPORT_SYMBOL_GPL(handle_simple_irq);
+/**
+ * handle_polled_irq - Simple and software-decoded IRQs.
+ * @irq: the interrupt number
+ * @desc: the interrupt description structure for this irq
+ *
+ * Polled interrupts are sent from a demultiplexing software interrupt
+ * handler, where no interrupt hardware control is necessary.
+ */
+void
+handle_polled_irq(unsigned int irq, struct irq_desc *desc)
+{
+ raw_spin_lock(&desc->lock);
+
+ if (unlikely(irqd_irq_inprogress(&desc->irq_data)))
+ if (!irq_check_poll(desc))
+ goto out_unlock;
+
+ desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING);
+ kstat_incr_irqs_this_cpu(irq, desc);
+
+ if (unlikely(!desc->action || irqd_irq_disabled(&desc->irq_data))) {
+ desc->istate |= IRQS_PENDING;
+ goto out_unlock;
+ }
+
+ desc->istate |= IRQS_POLL_INPROGRESS;
+
+ handle_irq_event(desc);
+
+ desc->istate &= ~(IRQS_POLL_INPROGRESS);
+
+out_unlock:
+ raw_spin_unlock(&desc->lock);
+}
+EXPORT_SYMBOL_GPL(handle_polled_irq);
+
/*
* Called unconditionally from handle_level_irq() and only for oneshot
* interrupts from handle_fasteoi_irq()
--
1.7.0.4
next prev parent reply other threads:[~2013-03-25 1:16 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-25 1:16 (unknown), Michael Schmitz
2013-03-25 1:16 ` [PATCH 01/14] m68k/atari EtherNEC: remove original EtherNEC driver Michael Schmitz
2013-03-25 1:16 ` [PATCH 02/14] m68k/atari EtherNAT: remove original EtherNAT driver Michael Schmitz
2013-03-25 1:16 ` [PATCH 03/14] m68k/atari: use CONFIG_ATARI in smc91x.h Michael Schmitz
2013-03-25 1:16 ` [PATCH 04/14] m68k/atari: EtherNAT - change number of Atari interrupt sources Michael Schmitz
2013-03-25 1:16 ` Michael Schmitz [this message]
2013-03-25 1:16 ` [PATCH 06/14] m68k/atari: use dedicated irq_chip for timer D interrupts Michael Schmitz
2013-03-25 1:16 ` [PATCH 07/14] m68k/atari: EtherNEC - add platform device support Michael Schmitz
2013-03-25 1:16 ` [PATCH 08/14] m68k/atari: EtherNAT - ethernet support - new driver (smc91x) Michael Schmitz
2013-03-25 1:16 ` [PATCH 09/14] m68k/atari: EtherNEC - ethernet support - new driver (ne.c) Michael Schmitz
2013-03-25 1:16 ` [PATCH 10/14] m68k/atari: EtherNAT - add interrupt chip for Ethernet and USB interrupts Michael Schmitz
2013-03-25 1:16 ` [PATCH 11/14] m68k/atari: Implement 16 bit access macros for ROM port Michael Schmitz
2013-03-25 1:16 ` [PATCH 12/14] m68k: Implement ndelay() based on the existing udelay() logic Michael Schmitz
2013-03-25 1:16 ` [PATCH 13/14] m68k/atari: USB - add platform device definitions for ISP1160 HCD Michael Schmitz
2013-03-25 1:16 ` [PATCH 14/14] m68k/atari: USB - Add ISP1160 USB host controller support Michael Schmitz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1364174192-25406-6-git-send-email-schmitz@debian.org \
--to=schmitzmic@gmail.com \
--cc=debian-68k@lists.debian.org \
--cc=geert@linux-m68k.org \
--cc=linux-m68k@vger.kernel.org \
--cc=schmitz@debian.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox