From: Geert Uytterhoeven <geert@linux-m68k.org>
To: linux-m68k@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, Greg Ungerer <gerg@uclinux.org>,
Geert Uytterhoeven <geert@linux-m68k.org>
Subject: [PATCH 16/27] m68k/amiga: Optimize interrupts using chain handlers
Date: Sun, 30 Oct 2011 13:48:24 +0100 [thread overview]
Message-ID: <1319978915-10933-17-git-send-email-geert@linux-m68k.org> (raw)
In-Reply-To: <1319978915-10933-1-git-send-email-geert@linux-m68k.org>
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
---
arch/m68k/amiga/amiints.c | 104 +++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 104 insertions(+), 0 deletions(-)
diff --git a/arch/m68k/amiga/amiints.c b/arch/m68k/amiga/amiints.c
index c3da534..a8da471 100644
--- a/arch/m68k/amiga/amiints.c
+++ b/arch/m68k/amiga/amiints.c
@@ -48,6 +48,99 @@ static struct irq_chip amiga_irq_chip = {
* The builtin Amiga hardware interrupt handlers.
*/
+#ifdef CONFIG_GENERIC_HARDIRQS
+static void ami_int1(unsigned int irq, struct irq_desc *desc)
+{
+ unsigned short ints = amiga_custom.intreqr & amiga_custom.intenar;
+
+ /* if serial transmit buffer empty, interrupt */
+ if (ints & IF_TBE) {
+ amiga_custom.intreq = IF_TBE;
+ generic_handle_irq(IRQ_AMIGA_TBE);
+ }
+
+ /* if floppy disk transfer complete, interrupt */
+ if (ints & IF_DSKBLK) {
+ amiga_custom.intreq = IF_DSKBLK;
+ generic_handle_irq(IRQ_AMIGA_DSKBLK);
+ }
+
+ /* if software interrupt set, interrupt */
+ if (ints & IF_SOFT) {
+ amiga_custom.intreq = IF_SOFT;
+ generic_handle_irq(IRQ_AMIGA_SOFT);
+ }
+}
+
+static void ami_int3(unsigned int irq, struct irq_desc *desc)
+{
+ unsigned short ints = amiga_custom.intreqr & amiga_custom.intenar;
+
+ /* if a blitter interrupt */
+ if (ints & IF_BLIT) {
+ amiga_custom.intreq = IF_BLIT;
+ generic_handle_irq(IRQ_AMIGA_BLIT);
+ }
+
+ /* if a copper interrupt */
+ if (ints & IF_COPER) {
+ amiga_custom.intreq = IF_COPER;
+ generic_handle_irq(IRQ_AMIGA_COPPER);
+ }
+
+ /* if a vertical blank interrupt */
+ if (ints & IF_VERTB) {
+ amiga_custom.intreq = IF_VERTB;
+ generic_handle_irq(IRQ_AMIGA_VERTB);
+ }
+}
+
+static void ami_int4(unsigned int irq, struct irq_desc *desc)
+{
+ unsigned short ints = amiga_custom.intreqr & amiga_custom.intenar;
+
+ /* if audio 0 interrupt */
+ if (ints & IF_AUD0) {
+ amiga_custom.intreq = IF_AUD0;
+ generic_handle_irq(IRQ_AMIGA_AUD0);
+ }
+
+ /* if audio 1 interrupt */
+ if (ints & IF_AUD1) {
+ amiga_custom.intreq = IF_AUD1;
+ generic_handle_irq(IRQ_AMIGA_AUD1);
+ }
+
+ /* if audio 2 interrupt */
+ if (ints & IF_AUD2) {
+ amiga_custom.intreq = IF_AUD2;
+ generic_handle_irq(IRQ_AMIGA_AUD2);
+ }
+
+ /* if audio 3 interrupt */
+ if (ints & IF_AUD3) {
+ amiga_custom.intreq = IF_AUD3;
+ generic_handle_irq(IRQ_AMIGA_AUD3);
+ }
+}
+
+static void ami_int5(unsigned int irq, struct irq_desc *desc)
+{
+ unsigned short ints = amiga_custom.intreqr & amiga_custom.intenar;
+
+ /* if serial receive buffer full interrupt */
+ if (ints & IF_RBF) {
+ /* acknowledge of IF_RBF must be done by the serial interrupt */
+ generic_handle_irq(IRQ_AMIGA_RBF);
+ }
+
+ /* if a disk sync interrupt */
+ if (ints & IF_DSKSYN) {
+ amiga_custom.intreq = IF_DSKSYN;
+ generic_handle_irq(IRQ_AMIGA_DSKSYN);
+ }
+}
+#else /* !CONFIG_GENERIC_HARDIRQS */
static irqreturn_t ami_int1(int irq, void *dev_id)
{
unsigned short ints = amiga_custom.intreqr & amiga_custom.intenar;
@@ -143,6 +236,7 @@ static irqreturn_t ami_int5(int irq, void *dev_id)
}
return IRQ_HANDLED;
}
+#endif /* !CONFIG_GENERIC_HARDIRQS */
/*
@@ -158,6 +252,15 @@ static irqreturn_t ami_int5(int irq, void *dev_id)
void __init amiga_init_IRQ(void)
{
+#ifdef CONFIG_GENERIC_HARDIRQS
+ m68k_setup_irq_controller(&amiga_irq_chip, handle_simple_irq, IRQ_USER,
+ AMI_STD_IRQS);
+
+ irq_set_chained_handler(IRQ_AUTO_1, ami_int1);
+ irq_set_chained_handler(IRQ_AUTO_3, ami_int3);
+ irq_set_chained_handler(IRQ_AUTO_4, ami_int4);
+ irq_set_chained_handler(IRQ_AUTO_5, ami_int5);
+#else /* !CONFIG_GENERIC_HARDIRQS */
if (request_irq(IRQ_AUTO_1, ami_int1, 0, "int1", NULL))
pr_err("Couldn't register int%d\n", 1);
if (request_irq(IRQ_AUTO_3, ami_int3, 0, "int3", NULL))
@@ -169,6 +272,7 @@ void __init amiga_init_IRQ(void)
m68k_setup_irq_controller(&amiga_irq_chip, handle_simple_irq, IRQ_USER,
AMI_STD_IRQS);
+#endif /* !CONFIG_GENERIC_HARDIRQS */
/* turn off PCMCIA interrupts */
if (AMIGAHW_PRESENT(PCMCIA))
--
1.7.0.4
next prev parent reply other threads:[~2011-10-30 12:48 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 01/27] ide-{cd,floppy,tape}: Do not include <linux/irq.h> Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 02/27] m68k/irq: Rename irq_controller to irq_chip Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 03/27] m68k/irq: Kill irq_node_t typedef, always use struct irq_node Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 04/27] m68k/irq: Rename irq_node to irq_data Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 05/27] m68k/irq: Switch irq_chip methods to "struct irq_data *data" Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 06/27] m68k/irq: Rename setup_irq() to m68k_setup_irq() and make it static Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 07/27] m68k/irq: Extract irq_set_chip() Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 08/27] m68k/irq: Add m68k_setup_irq_controller() Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 09/27] m68k/irq: Rename {,__}m68k_handle_int() Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 10/27] m68k/irq: Remove obsolete IRQ_FLG_* users Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 11/27] m68k/irq: Add genirq support Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 12/27] m68k/atari: Convert Atari to genirq Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 13/27] m68k/atari: Remove code and comments about different irq types Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 14/27] m68k/amiga: Refactor amiints.c Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 15/27] m68k/amiga: Convert Amiga to genirq Geert Uytterhoeven
2011-10-30 12:48 ` Geert Uytterhoeven [this message]
2011-10-30 12:48 ` [PATCH 17/27] m68k/mac: Convert Mac " Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 18/27] m68k/mac: Optimize interrupts using chain handlers Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 19/27] m68k/hp300: Convert HP9000/300 and HP9000/400 to genirq Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 20/27] m68k/vme: Convert VME " Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 21/27] m68k/apollo: Convert Apollo " Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 22/27] m68k/sun3: Use the kstat_irqs_cpu() wrapper Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 23/27] m68k/sun3: Convert Sun3/3x to genirq Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 24/27] m68k/q40: Convert Q40/Q60 " Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 25/27] m68k/irq: Remove obsolete m68k irq framework Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 26/27] m68k/irq: Remove obsolete support for user vector interrupt fixups Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 27/27] m68k/mac: Remove mac_irq_{en,dis}able() wrappers Geert Uytterhoeven
2011-10-31 1:29 ` [PATCH 00/27 v7] m68k: Convert to genirq Greg Ungerer
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=1319978915-10933-17-git-send-email-geert@linux-m68k.org \
--to=geert@linux-m68k.org \
--cc=gerg@uclinux.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-m68k@vger.kernel.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