* [PATCH 00/27 v7] m68k: Convert to genirq
@ 2011-10-30 12:48 Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 01/27] ide-{cd,floppy,tape}: Do not include <linux/irq.h> Geert Uytterhoeven
` (27 more replies)
0 siblings, 28 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Greg Ungerer
This patch series converts the m68k/mmu (nommu was converted before)
architecture to the generic hardirq framework.
- [01/27] ide-{cd,floppy,tape}: Do not include <linux/irq.h>
- [02/27] m68k/irq: Rename irq_controller to irq_chip
- [03/27] m68k/irq: Kill irq_node_t typedef, always use struct irq_node
- [04/27] m68k/irq: Rename irq_node to irq_data
- [05/27] m68k/irq: Switch irq_chip methods to "struct irq_data *data"
- [06/27] m68k/irq: Rename setup_irq() to m68k_setup_irq() and make it static
- [07/27] m68k/irq: Extract irq_set_chip()
- [08/27] m68k/irq: Add m68k_setup_irq_controller()
- [09/27] m68k/irq: Rename {,__}m68k_handle_int()
- [10/27] m68k/irq: Remove obsolete IRQ_FLG_* users
- [11/27] m68k/irq: Add genirq support
- [12/27] m68k/atari: Convert Atari to genirq
- [13/27] m68k/atari: Remove code and comments about different irq types
- [14/27] m68k/amiga: Refactor amiints.c
- [15/27] m68k/amiga: Convert Amiga to genirq
- [16/27] m68k/amiga: Optimize interrupts using chain handlers
- [17/27] m68k/mac: Convert Mac to genirq
- [18/27] m68k/mac: Optimize interrupts using chain handlers
- [19/27] m68k/hp300: Convert HP9000/300 and HP9000/400 to genirq
- [20/27] m68k/vme: Convert VME to genirq
- [21/27] m68k/apollo: Convert Apollo to genirq
- [22/27] m68k/sun3: Use the kstat_irqs_cpu() wrapper
- [23/27] m68k/sun3: Convert Sun3/3x to genirq
- [24/27] m68k/q40: Convert Q40/Q60 to genirq
- [25/27] m68k/irq: Remove obsolete m68k irq framework
- [26/27] m68k/irq: Remove obsolete support for user vector interrupt fixups
- [27/27] m68k/mac: Remove mac_irq_{en,dis}able() wrappers
Changes in v7:
- Rebased after arch/m68k/Kconfig restructuring:
- The temporary USE_GENERIC_HARDIRQS is now in arch/m68k/Kconfig,
depending on MMU,
- Rebased after arch/m68k/kernel/Makefile merge,
- Split off IRQ_FLG_* removal in separate commits:
- Postpone removals in drivers that should go through the respective
driver trees (net/scsi/staging/serial),
- Postpone final removal to v3.3,
- Dropped (went in via another tree):
- genirq: Add missing "else" in irq_shutdown(),
- keyboard: Do not include <linux/irq.>,
- Added Patch 27 ("m68k/mac: Remove mac_irq_{en,dis}able() wrappers")
I added this to the m68k for-next and for-3.2 branches.
I'll rebase it once more on top of v3.2-rc1 once that comes out (currently
it's based on a random base point).
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
^ permalink raw reply [flat|nested] 29+ messages in thread
* [PATCH 01/27] ide-{cd,floppy,tape}: Do not include <linux/irq.h>
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
@ 2011-10-30 12:48 ` Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 02/27] m68k/irq: Rename irq_controller to irq_chip Geert Uytterhoeven
` (26 subsequent siblings)
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven, linux-ide
The top of <linux/irq.h> has this comment:
* Please do not include this file in generic code. There is currently
* no requirement for any architecture to implement anything held
* within this file.
*
* Thanks. --rmk
Remove inclusion of <linux/irq.h>, to prevent the following compile error
from happening soon:
| include/linux/irq.h:132: error: redefinition of ‘struct irq_data’
| include/linux/irq.h:286: error: redefinition of ‘struct irq_chip’
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Borislav Petkov <bp@alien8.de>
Cc: linux-ide@vger.kernel.org
---
drivers/ide/ide-cd.c | 1 -
drivers/ide/ide-floppy.c | 1 -
drivers/ide/ide-tape.c | 1 -
3 files changed, 0 insertions(+), 3 deletions(-)
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c
index 04b0956..8126824 100644
--- a/drivers/ide/ide-cd.c
+++ b/drivers/ide/ide-cd.c
@@ -43,7 +43,6 @@
/* For SCSI -> ATAPI command conversion */
#include <scsi/scsi.h>
-#include <linux/irq.h>
#include <linux/io.h>
#include <asm/byteorder.h>
#include <linux/uaccess.h>
diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c
index 61fdf54..3d42043 100644
--- a/drivers/ide/ide-floppy.c
+++ b/drivers/ide/ide-floppy.c
@@ -35,7 +35,6 @@
#include <scsi/scsi_ioctl.h>
#include <asm/byteorder.h>
-#include <linux/irq.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#include <asm/unaligned.h>
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c
index 7ecb1ad..ce8237d 100644
--- a/drivers/ide/ide-tape.c
+++ b/drivers/ide/ide-tape.c
@@ -41,7 +41,6 @@
#include <scsi/scsi.h>
#include <asm/byteorder.h>
-#include <linux/irq.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#include <asm/unaligned.h>
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 02/27] m68k/irq: Rename irq_controller to irq_chip
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 ` Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 03/27] m68k/irq: Kill irq_node_t typedef, always use struct irq_node Geert Uytterhoeven
` (25 subsequent siblings)
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven
Make it more similar to the genirq version:
- Remove lock (unused as we don't do SMP anyway),
- Prepend methods with irq_,
- Make irq_startup() return unsigned int.
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
---
arch/m68k/amiga/amiints.c | 9 ++--
arch/m68k/amiga/cia.c | 18 ++++-----
arch/m68k/apollo/dn_ints.c | 11 ++---
arch/m68k/atari/ataints.c | 15 +++----
arch/m68k/include/asm/irq.h | 15 +++----
arch/m68k/kernel/ints.c | 86 +++++++++++++++++++++----------------------
arch/m68k/mac/macints.c | 9 ++--
arch/m68k/q40/q40ints.c | 17 ++++----
arch/m68k/sun3/sun3ints.c | 13 +++---
9 files changed, 91 insertions(+), 102 deletions(-)
diff --git a/arch/m68k/amiga/amiints.c b/arch/m68k/amiga/amiints.c
index c5b5212..320c5d0 100644
--- a/arch/m68k/amiga/amiints.c
+++ b/arch/m68k/amiga/amiints.c
@@ -52,11 +52,10 @@ static irqreturn_t ami_int3(int irq, void *dev_id);
static irqreturn_t ami_int4(int irq, void *dev_id);
static irqreturn_t ami_int5(int irq, void *dev_id);
-static struct irq_controller amiga_irq_controller = {
+static struct irq_chip amiga_irq_chip = {
.name = "amiga",
- .lock = __SPIN_LOCK_UNLOCKED(amiga_irq_controller.lock),
- .enable = amiga_enable_irq,
- .disable = amiga_disable_irq,
+ .irq_enable = amiga_enable_irq,
+ .irq_disable = amiga_disable_irq,
};
/*
@@ -81,7 +80,7 @@ void __init amiga_init_IRQ(void)
if (request_irq(IRQ_AUTO_5, ami_int5, 0, "int5", NULL))
pr_err("Couldn't register int%d\n", 5);
- m68k_setup_irq_controller(&amiga_irq_controller, IRQ_USER, AMI_STD_IRQS);
+ m68k_setup_irq_chip(&amiga_irq_chip, IRQ_USER, AMI_STD_IRQS);
/* turn off PCMCIA interrupts */
if (AMIGAHW_PRESENT(PCMCIA))
diff --git a/arch/m68k/amiga/cia.c b/arch/m68k/amiga/cia.c
index ecd0f7c..637ef53 100644
--- a/arch/m68k/amiga/cia.c
+++ b/arch/m68k/amiga/cia.c
@@ -121,11 +121,10 @@ static void cia_disable_irq(unsigned int irq)
cia_able_irq(&ciaa_base, 1 << (irq - IRQ_AMIGA_CIAA));
}
-static struct irq_controller cia_irq_controller = {
+static struct irq_chip cia_irq_chip = {
.name = "cia",
- .lock = __SPIN_LOCK_UNLOCKED(cia_irq_controller.lock),
- .enable = cia_enable_irq,
- .disable = cia_disable_irq,
+ .irq_enable = cia_enable_irq,
+ .irq_disable = cia_disable_irq,
};
/*
@@ -158,23 +157,22 @@ static void auto_disable_irq(unsigned int irq)
}
}
-static struct irq_controller auto_irq_controller = {
+static struct irq_chip auto_irq_chip = {
.name = "auto",
- .lock = __SPIN_LOCK_UNLOCKED(auto_irq_controller.lock),
- .enable = auto_enable_irq,
- .disable = auto_disable_irq,
+ .irq_enable = auto_enable_irq,
+ .irq_disable = auto_disable_irq,
};
void __init cia_init_IRQ(struct ciabase *base)
{
- m68k_setup_irq_controller(&cia_irq_controller, base->cia_irq, CIA_IRQS);
+ m68k_setup_irq_chip(&cia_irq_chip, base->cia_irq, CIA_IRQS);
/* clear any pending interrupt and turn off all interrupts */
cia_set_irq(base, CIA_ICR_ALL);
cia_able_irq(base, CIA_ICR_ALL);
/* override auto int and install CIA handler */
- m68k_setup_irq_controller(&auto_irq_controller, base->handler_irq, 1);
+ m68k_setup_irq_chip(&auto_irq_chip, base->handler_irq, 1);
m68k_irq_startup(base->handler_irq);
if (request_irq(base->handler_irq, cia_handler, IRQF_SHARED,
base->name, base))
diff --git a/arch/m68k/apollo/dn_ints.c b/arch/m68k/apollo/dn_ints.c
index 5d47f3a..d6e8f33 100644
--- a/arch/m68k/apollo/dn_ints.c
+++ b/arch/m68k/apollo/dn_ints.c
@@ -12,7 +12,7 @@ void dn_process_int(unsigned int irq, struct pt_regs *fp)
*(volatile unsigned char *)(picb)=0x20;
}
-int apollo_irq_startup(unsigned int irq)
+unsigned int apollo_irq_startup(unsigned int irq)
{
if (irq < 8)
*(volatile unsigned char *)(pica+1) &= ~(1 << irq);
@@ -29,16 +29,15 @@ void apollo_irq_shutdown(unsigned int irq)
*(volatile unsigned char *)(picb+1) |= (1 << (irq - 8));
}
-static struct irq_controller apollo_irq_controller = {
+static struct irq_chip apollo_irq_chip = {
.name = "apollo",
- .lock = __SPIN_LOCK_UNLOCKED(apollo_irq_controller.lock),
- .startup = apollo_irq_startup,
- .shutdown = apollo_irq_shutdown,
+ .irq_startup = apollo_irq_startup,
+ .irq_shutdown = apollo_irq_shutdown,
};
void __init dn_init_IRQ(void)
{
m68k_setup_user_interrupt(VEC_USER + 96, 16, dn_process_int);
- m68k_setup_irq_controller(&apollo_irq_controller, IRQ_APOLLO, 16);
+ m68k_setup_irq_chip(&apollo_irq_chip, IRQ_APOLLO, 16);
}
diff --git a/arch/m68k/atari/ataints.c b/arch/m68k/atari/ataints.c
index 26a804e..ac0ebdf 100644
--- a/arch/m68k/atari/ataints.c
+++ b/arch/m68k/atari/ataints.c
@@ -320,7 +320,7 @@ extern void atari_microwire_cmd(int cmd);
extern int atari_SCC_reset_done;
-static int atari_startup_irq(unsigned int irq)
+static unsigned int atari_startup_irq(unsigned int irq)
{
m68k_irq_startup(irq);
atari_turnon_irq(irq);
@@ -338,13 +338,12 @@ static void atari_shutdown_irq(unsigned int irq)
vectors[VEC_INT4] = falcon_hblhandler;
}
-static struct irq_controller atari_irq_controller = {
+static struct irq_chip atari_irq_chip = {
.name = "atari",
- .lock = __SPIN_LOCK_UNLOCKED(atari_irq_controller.lock),
- .startup = atari_startup_irq,
- .shutdown = atari_shutdown_irq,
- .enable = atari_enable_irq,
- .disable = atari_disable_irq,
+ .irq_startup = atari_startup_irq,
+ .irq_shutdown = atari_shutdown_irq,
+ .irq_enable = atari_enable_irq,
+ .irq_disable = atari_disable_irq,
};
/*
@@ -361,7 +360,7 @@ static struct irq_controller atari_irq_controller = {
void __init atari_init_IRQ(void)
{
m68k_setup_user_interrupt(VEC_USER, NUM_ATARI_SOURCES - IRQ_USER, NULL);
- m68k_setup_irq_controller(&atari_irq_controller, 1, NUM_ATARI_SOURCES - 1);
+ m68k_setup_irq_chip(&atari_irq_chip, 1, NUM_ATARI_SOURCES - 1);
/* Initialize the MFP(s) */
diff --git a/arch/m68k/include/asm/irq.h b/arch/m68k/include/asm/irq.h
index 69ed0d7..d8c6f68 100644
--- a/arch/m68k/include/asm/irq.h
+++ b/arch/m68k/include/asm/irq.h
@@ -93,16 +93,15 @@ struct irq_handler {
const char *devname;
};
-struct irq_controller {
+struct irq_chip {
const char *name;
- spinlock_t lock;
- int (*startup)(unsigned int irq);
- void (*shutdown)(unsigned int irq);
- void (*enable)(unsigned int irq);
- void (*disable)(unsigned int irq);
+ unsigned int (*irq_startup)(unsigned int irq);
+ void (*irq_shutdown)(unsigned int irq);
+ void (*irq_enable)(unsigned int irq);
+ void (*irq_disable)(unsigned int irq);
};
-extern int m68k_irq_startup(unsigned int);
+extern unsigned int m68k_irq_startup(unsigned int);
extern void m68k_irq_shutdown(unsigned int);
/*
@@ -113,7 +112,7 @@ extern irq_node_t *new_irq_node(void);
extern void m68k_setup_auto_interrupt(void (*handler)(unsigned int, struct pt_regs *));
extern void m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt,
void (*handler)(unsigned int, struct pt_regs *));
-extern void m68k_setup_irq_controller(struct irq_controller *, unsigned int, unsigned int);
+extern void m68k_setup_irq_chip(struct irq_chip *, unsigned int, unsigned int);
asmlinkage void m68k_handle_int(unsigned int);
asmlinkage void __m68k_handle_int(unsigned int, struct pt_regs *);
diff --git a/arch/m68k/kernel/ints.c b/arch/m68k/kernel/ints.c
index 761ee04..f43ad7b 100644
--- a/arch/m68k/kernel/ints.c
+++ b/arch/m68k/kernel/ints.c
@@ -52,23 +52,21 @@ extern u16 user_irqvec_fixup[];
/* table for system interrupt handlers */
static struct irq_node *irq_list[NR_IRQS];
-static struct irq_controller *irq_controller[NR_IRQS];
+static struct irq_chip *irq_chip[NR_IRQS];
static int irq_depth[NR_IRQS];
static int m68k_first_user_vec;
-static struct irq_controller auto_irq_controller = {
+static struct irq_chip auto_irq_chip = {
.name = "auto",
- .lock = __SPIN_LOCK_UNLOCKED(auto_irq_controller.lock),
- .startup = m68k_irq_startup,
- .shutdown = m68k_irq_shutdown,
+ .irq_startup = m68k_irq_startup,
+ .irq_shutdown = m68k_irq_shutdown,
};
-static struct irq_controller user_irq_controller = {
+static struct irq_chip user_irq_chip = {
.name = "user",
- .lock = __SPIN_LOCK_UNLOCKED(user_irq_controller.lock),
- .startup = m68k_irq_startup,
- .shutdown = m68k_irq_shutdown,
+ .irq_startup = m68k_irq_startup,
+ .irq_shutdown = m68k_irq_shutdown,
};
#define NUM_IRQ_NODES 100
@@ -96,7 +94,7 @@ void __init init_IRQ(void)
}
for (i = IRQ_AUTO_1; i <= IRQ_AUTO_7; i++)
- irq_controller[i] = &auto_irq_controller;
+ irq_chip[i] = &auto_irq_chip;
mach_init_IRQ();
}
@@ -136,7 +134,7 @@ void __init m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt,
BUG_ON(IRQ_USER + cnt > NR_IRQS);
m68k_first_user_vec = vec;
for (i = 0; i < cnt; i++)
- irq_controller[IRQ_USER + i] = &user_irq_controller;
+ irq_chip[IRQ_USER + i] = &user_irq_chip;
*user_irqvec_fixup = vec - IRQ_USER;
if (handler)
*user_irqhandler_fixup = (u32)handler;
@@ -144,7 +142,7 @@ void __init m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt,
}
/**
- * m68k_setup_irq_controller
+ * m68k_setup_irq_chip
* @contr: irq controller which controls specified irq
* @irq: first irq to be managed by the controller
*
@@ -153,13 +151,13 @@ void __init m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt,
* be changed as well, but the controller probably should use m68k_irq_startup/
* m68k_irq_shutdown.
*/
-void m68k_setup_irq_controller(struct irq_controller *contr, unsigned int irq,
+void m68k_setup_irq_chip(struct irq_chip *contr, unsigned int irq,
unsigned int cnt)
{
int i;
for (i = 0; i < cnt; i++)
- irq_controller[irq + i] = contr;
+ irq_chip[irq + i] = contr;
}
irq_node_t *new_irq_node(void)
@@ -180,23 +178,23 @@ irq_node_t *new_irq_node(void)
int setup_irq(unsigned int irq, struct irq_node *node)
{
- struct irq_controller *contr;
+ struct irq_chip *contr;
struct irq_node **prev;
unsigned long flags;
- if (irq >= NR_IRQS || !(contr = irq_controller[irq])) {
+ if (irq >= NR_IRQS || !(contr = irq_chip[irq])) {
printk("%s: Incorrect IRQ %d from %s\n",
__func__, irq, node->devname);
return -ENXIO;
}
- spin_lock_irqsave(&contr->lock, flags);
+ local_irq_save(flags);
prev = irq_list + irq;
if (*prev) {
/* Can't share interrupts unless both agree to */
if (!((*prev)->flags & node->flags & IRQF_SHARED)) {
- spin_unlock_irqrestore(&contr->lock, flags);
+ local_irq_restore(flags);
return -EBUSY;
}
while (*prev)
@@ -204,15 +202,15 @@ int setup_irq(unsigned int irq, struct irq_node *node)
}
if (!irq_list[irq]) {
- if (contr->startup)
- contr->startup(irq);
+ if (contr->irq_startup)
+ contr->irq_startup(irq);
else
- contr->enable(irq);
+ contr->irq_enable(irq);
}
node->next = NULL;
*prev = node;
- spin_unlock_irqrestore(&contr->lock, flags);
+ local_irq_restore(flags);
return 0;
}
@@ -244,16 +242,16 @@ EXPORT_SYMBOL(request_irq);
void free_irq(unsigned int irq, void *dev_id)
{
- struct irq_controller *contr;
+ struct irq_chip *contr;
struct irq_node **p, *node;
unsigned long flags;
- if (irq >= NR_IRQS || !(contr = irq_controller[irq])) {
+ if (irq >= NR_IRQS || !(contr = irq_chip[irq])) {
printk("%s: Incorrect IRQ %d\n", __func__, irq);
return;
}
- spin_lock_irqsave(&contr->lock, flags);
+ local_irq_save(flags);
p = irq_list + irq;
while ((node = *p)) {
@@ -270,58 +268,58 @@ void free_irq(unsigned int irq, void *dev_id)
__func__, irq);
if (!irq_list[irq]) {
- if (contr->shutdown)
- contr->shutdown(irq);
+ if (contr->irq_shutdown)
+ contr->irq_shutdown(irq);
else
- contr->disable(irq);
+ contr->irq_disable(irq);
}
- spin_unlock_irqrestore(&contr->lock, flags);
+ local_irq_restore(flags);
}
EXPORT_SYMBOL(free_irq);
void enable_irq(unsigned int irq)
{
- struct irq_controller *contr;
+ struct irq_chip *contr;
unsigned long flags;
- if (irq >= NR_IRQS || !(contr = irq_controller[irq])) {
+ if (irq >= NR_IRQS || !(contr = irq_chip[irq])) {
printk("%s: Incorrect IRQ %d\n",
__func__, irq);
return;
}
- spin_lock_irqsave(&contr->lock, flags);
+ local_irq_save(flags);
if (irq_depth[irq]) {
if (!--irq_depth[irq]) {
- if (contr->enable)
- contr->enable(irq);
+ if (contr->irq_enable)
+ contr->irq_enable(irq);
}
} else
WARN_ON(1);
- spin_unlock_irqrestore(&contr->lock, flags);
+ local_irq_restore(flags);
}
EXPORT_SYMBOL(enable_irq);
void disable_irq(unsigned int irq)
{
- struct irq_controller *contr;
+ struct irq_chip *contr;
unsigned long flags;
- if (irq >= NR_IRQS || !(contr = irq_controller[irq])) {
+ if (irq >= NR_IRQS || !(contr = irq_chip[irq])) {
printk("%s: Incorrect IRQ %d\n",
__func__, irq);
return;
}
- spin_lock_irqsave(&contr->lock, flags);
+ local_irq_save(flags);
if (!irq_depth[irq]++) {
- if (contr->disable)
- contr->disable(irq);
+ if (contr->irq_disable)
+ contr->irq_disable(irq);
}
- spin_unlock_irqrestore(&contr->lock, flags);
+ local_irq_restore(flags);
}
EXPORT_SYMBOL(disable_irq);
@@ -330,7 +328,7 @@ void disable_irq_nosync(unsigned int irq) __attribute__((alias("disable_irq")));
EXPORT_SYMBOL(disable_irq_nosync);
-int m68k_irq_startup(unsigned int irq)
+unsigned int m68k_irq_startup(unsigned int irq)
{
if (irq <= IRQ_AUTO_7)
vectors[VEC_SPUR + irq] = auto_inthandler;
@@ -413,13 +411,13 @@ asmlinkage void handle_badint(struct pt_regs *regs)
int show_interrupts(struct seq_file *p, void *v)
{
- struct irq_controller *contr;
+ struct irq_chip *contr;
struct irq_node *node;
int i = *(loff_t *) v;
/* autovector interrupts */
if (irq_list[i]) {
- contr = irq_controller[i];
+ contr = irq_chip[i];
node = irq_list[i];
seq_printf(p, "%-8s %3u: %10u %s", contr->name, i, kstat_cpu(0).irqs[i], node->devname);
while ((node = node->next))
diff --git a/arch/m68k/mac/macints.c b/arch/m68k/mac/macints.c
index f92190c..ffa1b3f 100644
--- a/arch/m68k/mac/macints.c
+++ b/arch/m68k/mac/macints.c
@@ -193,11 +193,10 @@ irqreturn_t mac_debug_handler(int, void *);
void mac_enable_irq(unsigned int irq);
void mac_disable_irq(unsigned int irq);
-static struct irq_controller mac_irq_controller = {
+static struct irq_chip mac_irq_chip = {
.name = "mac",
- .lock = __SPIN_LOCK_UNLOCKED(mac_irq_controller.lock),
- .enable = mac_enable_irq,
- .disable = mac_disable_irq,
+ .irq_enable = mac_enable_irq,
+ .irq_disable = mac_disable_irq,
};
void __init mac_init_IRQ(void)
@@ -205,7 +204,7 @@ void __init mac_init_IRQ(void)
#ifdef DEBUG_MACINTS
printk("mac_init_IRQ(): Setting things up...\n");
#endif
- m68k_setup_irq_controller(&mac_irq_controller, IRQ_USER,
+ m68k_setup_irq_chip(&mac_irq_chip, IRQ_USER,
NUM_MAC_SOURCES - IRQ_USER);
/* Make sure the SONIC interrupt is cleared or things get ugly */
#ifdef SHUTUP_SONIC
diff --git a/arch/m68k/q40/q40ints.c b/arch/m68k/q40/q40ints.c
index 9f0e3d5..fa05a03 100644
--- a/arch/m68k/q40/q40ints.c
+++ b/arch/m68k/q40/q40ints.c
@@ -41,14 +41,14 @@ static void q40_disable_irq(unsigned int);
unsigned short q40_ablecount[35];
unsigned short q40_state[35];
-static int q40_irq_startup(unsigned int irq)
+static unsigned int q40_irq_startup(unsigned int irq)
{
/* test for ISA ints not implemented by HW */
switch (irq) {
case 1: case 2: case 8: case 9:
case 11: case 12: case 13:
printk("%s: ISA IRQ %d not implemented by HW\n", __func__, irq);
- return -ENXIO;
+ /* FIXME return -ENXIO; */
}
return 0;
}
@@ -57,13 +57,12 @@ static void q40_irq_shutdown(unsigned int irq)
{
}
-static struct irq_controller q40_irq_controller = {
+static struct irq_chip q40_irq_chip = {
.name = "q40",
- .lock = __SPIN_LOCK_UNLOCKED(q40_irq_controller.lock),
- .startup = q40_irq_startup,
- .shutdown = q40_irq_shutdown,
- .enable = q40_enable_irq,
- .disable = q40_disable_irq,
+ .irq_startup = q40_irq_startup,
+ .irq_shutdown = q40_irq_shutdown,
+ .irq_enable = q40_enable_irq,
+ .irq_disable = q40_disable_irq,
};
/*
@@ -81,7 +80,7 @@ static int disabled;
void __init q40_init_IRQ(void)
{
- m68k_setup_irq_controller(&q40_irq_controller, 1, Q40_IRQ_MAX);
+ m68k_setup_irq_chip(&q40_irq_chip, 1, Q40_IRQ_MAX);
/* setup handler for ISA ints */
m68k_setup_auto_interrupt(q40_irq_handler);
diff --git a/arch/m68k/sun3/sun3ints.c b/arch/m68k/sun3/sun3ints.c
index 6464ad3..97fa9ed 100644
--- a/arch/m68k/sun3/sun3ints.c
+++ b/arch/m68k/sun3/sun3ints.c
@@ -86,13 +86,12 @@ static void sun3_inthandle(unsigned int irq, struct pt_regs *fp)
__m68k_handle_int(irq, fp);
}
-static struct irq_controller sun3_irq_controller = {
+static struct irq_chip sun3_irq_chip = {
.name = "sun3",
- .lock = __SPIN_LOCK_UNLOCKED(sun3_irq_controller.lock),
- .startup = m68k_irq_startup,
- .shutdown = m68k_irq_shutdown,
- .enable = sun3_enable_irq,
- .disable = sun3_disable_irq,
+ .irq_startup = m68k_irq_startup,
+ .irq_shutdown = m68k_irq_shutdown,
+ .irq_enable = sun3_enable_irq,
+ .irq_disable = sun3_disable_irq,
};
void __init sun3_init_IRQ(void)
@@ -100,7 +99,7 @@ void __init sun3_init_IRQ(void)
*sun3_intreg = 1;
m68k_setup_auto_interrupt(sun3_inthandle);
- m68k_setup_irq_controller(&sun3_irq_controller, IRQ_AUTO_1, 7);
+ m68k_setup_irq_chip(&sun3_irq_chip, IRQ_AUTO_1, 7);
m68k_setup_user_interrupt(VEC_USER, 128, NULL);
if (request_irq(IRQ_AUTO_5, sun3_int5, 0, "int5", NULL))
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 03/27] m68k/irq: Kill irq_node_t typedef, always use struct irq_node
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 ` Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 04/27] m68k/irq: Rename irq_node to irq_data Geert Uytterhoeven
` (24 subsequent siblings)
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
---
arch/m68k/include/asm/irq.h | 8 ++++----
arch/m68k/kernel/ints.c | 6 +++---
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/arch/m68k/include/asm/irq.h b/arch/m68k/include/asm/irq.h
index d8c6f68..bfc521f 100644
--- a/arch/m68k/include/asm/irq.h
+++ b/arch/m68k/include/asm/irq.h
@@ -75,13 +75,13 @@ struct pt_regs;
* This structure is used to chain together the ISRs for a particular
* interrupt source (if it supports chaining).
*/
-typedef struct irq_node {
+struct irq_node {
irqreturn_t (*handler)(int, void *);
void *dev_id;
struct irq_node *next;
unsigned long flags;
const char *devname;
-} irq_node_t;
+};
/*
* This structure has only 4 elements for speed reasons
@@ -105,9 +105,9 @@ extern unsigned int m68k_irq_startup(unsigned int);
extern void m68k_irq_shutdown(unsigned int);
/*
- * This function returns a new irq_node_t
+ * This function returns a new struct irq_node
*/
-extern irq_node_t *new_irq_node(void);
+extern struct irq_node *new_irq_node(void);
extern void m68k_setup_auto_interrupt(void (*handler)(unsigned int, struct pt_regs *));
extern void m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt,
diff --git a/arch/m68k/kernel/ints.c b/arch/m68k/kernel/ints.c
index f43ad7b..9de8eb4 100644
--- a/arch/m68k/kernel/ints.c
+++ b/arch/m68k/kernel/ints.c
@@ -70,7 +70,7 @@ static struct irq_chip user_irq_chip = {
};
#define NUM_IRQ_NODES 100
-static irq_node_t nodes[NUM_IRQ_NODES];
+static struct irq_node nodes[NUM_IRQ_NODES];
/*
* void init_IRQ(void)
@@ -160,9 +160,9 @@ void m68k_setup_irq_chip(struct irq_chip *contr, unsigned int irq,
irq_chip[irq + i] = contr;
}
-irq_node_t *new_irq_node(void)
+struct irq_node *new_irq_node(void)
{
- irq_node_t *node;
+ struct irq_node *node;
short i;
for (node = nodes, i = NUM_IRQ_NODES-1; i >= 0; node++, i--) {
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 04/27] m68k/irq: Rename irq_node to irq_data
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
` (2 preceding siblings ...)
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 ` Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 05/27] m68k/irq: Switch irq_chip methods to "struct irq_data *data" Geert Uytterhoeven
` (23 subsequent siblings)
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven
Make it more similar to the genirq version:
- Add an irq field
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
---
arch/m68k/include/asm/irq.h | 9 +++++----
arch/m68k/kernel/ints.c | 21 +++++++++++----------
2 files changed, 16 insertions(+), 14 deletions(-)
diff --git a/arch/m68k/include/asm/irq.h b/arch/m68k/include/asm/irq.h
index bfc521f..3cb037c 100644
--- a/arch/m68k/include/asm/irq.h
+++ b/arch/m68k/include/asm/irq.h
@@ -75,10 +75,11 @@ struct pt_regs;
* This structure is used to chain together the ISRs for a particular
* interrupt source (if it supports chaining).
*/
-struct irq_node {
+struct irq_data {
+ unsigned int irq;
irqreturn_t (*handler)(int, void *);
void *dev_id;
- struct irq_node *next;
+ struct irq_data *next;
unsigned long flags;
const char *devname;
};
@@ -105,9 +106,9 @@ extern unsigned int m68k_irq_startup(unsigned int);
extern void m68k_irq_shutdown(unsigned int);
/*
- * This function returns a new struct irq_node
+ * This function returns a new struct irq_data
*/
-extern struct irq_node *new_irq_node(void);
+extern struct irq_data *new_irq_node(void);
extern void m68k_setup_auto_interrupt(void (*handler)(unsigned int, struct pt_regs *));
extern void m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt,
diff --git a/arch/m68k/kernel/ints.c b/arch/m68k/kernel/ints.c
index 9de8eb4..8877932 100644
--- a/arch/m68k/kernel/ints.c
+++ b/arch/m68k/kernel/ints.c
@@ -51,7 +51,7 @@ extern u32 user_irqhandler_fixup[];
extern u16 user_irqvec_fixup[];
/* table for system interrupt handlers */
-static struct irq_node *irq_list[NR_IRQS];
+static struct irq_data *irq_list[NR_IRQS];
static struct irq_chip *irq_chip[NR_IRQS];
static int irq_depth[NR_IRQS];
@@ -70,7 +70,7 @@ static struct irq_chip user_irq_chip = {
};
#define NUM_IRQ_NODES 100
-static struct irq_node nodes[NUM_IRQ_NODES];
+static struct irq_data nodes[NUM_IRQ_NODES];
/*
* void init_IRQ(void)
@@ -160,9 +160,9 @@ void m68k_setup_irq_chip(struct irq_chip *contr, unsigned int irq,
irq_chip[irq + i] = contr;
}
-struct irq_node *new_irq_node(void)
+struct irq_data *new_irq_node(void)
{
- struct irq_node *node;
+ struct irq_data *node;
short i;
for (node = nodes, i = NUM_IRQ_NODES-1; i >= 0; node++, i--) {
@@ -176,10 +176,10 @@ struct irq_node *new_irq_node(void)
return NULL;
}
-int setup_irq(unsigned int irq, struct irq_node *node)
+int setup_irq(unsigned int irq, struct irq_data *node)
{
struct irq_chip *contr;
- struct irq_node **prev;
+ struct irq_data **prev;
unsigned long flags;
if (irq >= NR_IRQS || !(contr = irq_chip[irq])) {
@@ -219,13 +219,14 @@ int request_irq(unsigned int irq,
irq_handler_t handler,
unsigned long flags, const char *devname, void *dev_id)
{
- struct irq_node *node;
+ struct irq_data *node;
int res;
node = new_irq_node();
if (!node)
return -ENOMEM;
+ node->irq = irq;
node->handler = handler;
node->flags = flags;
node->dev_id = dev_id;
@@ -243,7 +244,7 @@ EXPORT_SYMBOL(request_irq);
void free_irq(unsigned int irq, void *dev_id)
{
struct irq_chip *contr;
- struct irq_node **p, *node;
+ struct irq_data **p, *node;
unsigned long flags;
if (irq >= NR_IRQS || !(contr = irq_chip[irq])) {
@@ -386,7 +387,7 @@ EXPORT_SYMBOL(irq_canonicalize);
asmlinkage void m68k_handle_int(unsigned int irq)
{
- struct irq_node *node;
+ struct irq_data *node;
kstat_cpu(0).irqs[irq]++;
node = irq_list[irq];
do {
@@ -412,7 +413,7 @@ asmlinkage void handle_badint(struct pt_regs *regs)
int show_interrupts(struct seq_file *p, void *v)
{
struct irq_chip *contr;
- struct irq_node *node;
+ struct irq_data *node;
int i = *(loff_t *) v;
/* autovector interrupts */
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 05/27] m68k/irq: Switch irq_chip methods to "struct irq_data *data"
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
` (3 preceding siblings ...)
2011-10-30 12:48 ` [PATCH 04/27] m68k/irq: Rename irq_node to irq_data Geert Uytterhoeven
@ 2011-10-30 12:48 ` 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
` (22 subsequent siblings)
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
---
arch/m68k/amiga/amiints.c | 16 ++++++++--------
arch/m68k/amiga/cia.c | 25 ++++++++++++++-----------
arch/m68k/apollo/dn_ints.c | 8 ++++++--
arch/m68k/atari/ataints.c | 30 ++++++++++++++++++++++--------
arch/m68k/include/asm/irq.h | 13 +++++++------
arch/m68k/kernel/ints.c | 23 +++++++++++++++--------
arch/m68k/mac/macints.c | 14 ++++++++++++--
arch/m68k/q40/q40ints.c | 28 +++++++++++++++++-----------
arch/m68k/sun3/sun3ints.c | 14 ++++++++++++--
9 files changed, 113 insertions(+), 58 deletions(-)
diff --git a/arch/m68k/amiga/amiints.c b/arch/m68k/amiga/amiints.c
index 320c5d0..09a695b 100644
--- a/arch/m68k/amiga/amiints.c
+++ b/arch/m68k/amiga/amiints.c
@@ -45,8 +45,8 @@
#include <asm/amigaints.h>
#include <asm/amipcmcia.h>
-static void amiga_enable_irq(unsigned int irq);
-static void amiga_disable_irq(unsigned int irq);
+static void amiga_irq_enable(struct irq_data *data);
+static void amiga_irq_disable(struct irq_data *data);
static irqreturn_t ami_int1(int irq, void *dev_id);
static irqreturn_t ami_int3(int irq, void *dev_id);
static irqreturn_t ami_int4(int irq, void *dev_id);
@@ -54,8 +54,8 @@ static irqreturn_t ami_int5(int irq, void *dev_id);
static struct irq_chip amiga_irq_chip = {
.name = "amiga",
- .irq_enable = amiga_enable_irq,
- .irq_disable = amiga_disable_irq,
+ .irq_enable = amiga_irq_enable,
+ .irq_disable = amiga_irq_disable,
};
/*
@@ -102,14 +102,14 @@ void __init amiga_init_IRQ(void)
* internal data, that may not be changed by the interrupt at the same time.
*/
-static void amiga_enable_irq(unsigned int irq)
+static void amiga_irq_enable(struct irq_data *data)
{
- amiga_custom.intena = IF_SETCLR | (1 << (irq - IRQ_USER));
+ amiga_custom.intena = IF_SETCLR | (1 << (data->irq - IRQ_USER));
}
-static void amiga_disable_irq(unsigned int irq)
+static void amiga_irq_disable(struct irq_data *data)
{
- amiga_custom.intena = 1 << (irq - IRQ_USER);
+ amiga_custom.intena = 1 << (data->irq - IRQ_USER);
}
/*
diff --git a/arch/m68k/amiga/cia.c b/arch/m68k/amiga/cia.c
index 637ef53..b04b453 100644
--- a/arch/m68k/amiga/cia.c
+++ b/arch/m68k/amiga/cia.c
@@ -98,8 +98,9 @@ static irqreturn_t cia_handler(int irq, void *dev_id)
return IRQ_HANDLED;
}
-static void cia_enable_irq(unsigned int irq)
+static void cia_irq_enable(struct irq_data *data)
{
+ unsigned int irq = data->irq;
unsigned char mask;
if (irq >= IRQ_AMIGA_CIAB) {
@@ -113,8 +114,10 @@ static void cia_enable_irq(unsigned int irq)
}
}
-static void cia_disable_irq(unsigned int irq)
+static void cia_irq_disable(struct irq_data *data)
{
+ unsigned int irq = data->irq;
+
if (irq >= IRQ_AMIGA_CIAB)
cia_able_irq(&ciab_base, 1 << (irq - IRQ_AMIGA_CIAB));
else
@@ -123,8 +126,8 @@ static void cia_disable_irq(unsigned int irq)
static struct irq_chip cia_irq_chip = {
.name = "cia",
- .irq_enable = cia_enable_irq,
- .irq_disable = cia_disable_irq,
+ .irq_enable = cia_irq_enable,
+ .irq_disable = cia_irq_disable,
};
/*
@@ -133,9 +136,9 @@ static struct irq_chip cia_irq_chip = {
* into this chain.
*/
-static void auto_enable_irq(unsigned int irq)
+static void auto_irq_enable(struct irq_data *data)
{
- switch (irq) {
+ switch (data->irq) {
case IRQ_AUTO_2:
amiga_custom.intena = IF_SETCLR | IF_PORTS;
break;
@@ -145,9 +148,9 @@ static void auto_enable_irq(unsigned int irq)
}
}
-static void auto_disable_irq(unsigned int irq)
+static void auto_irq_disable(struct irq_data *data)
{
- switch (irq) {
+ switch (data->irq) {
case IRQ_AUTO_2:
amiga_custom.intena = IF_PORTS;
break;
@@ -159,8 +162,8 @@ static void auto_disable_irq(unsigned int irq)
static struct irq_chip auto_irq_chip = {
.name = "auto",
- .irq_enable = auto_enable_irq,
- .irq_disable = auto_disable_irq,
+ .irq_enable = auto_irq_enable,
+ .irq_disable = auto_irq_disable,
};
void __init cia_init_IRQ(struct ciabase *base)
@@ -173,7 +176,7 @@ void __init cia_init_IRQ(struct ciabase *base)
/* override auto int and install CIA handler */
m68k_setup_irq_chip(&auto_irq_chip, base->handler_irq, 1);
- m68k_irq_startup(base->handler_irq);
+ m68k_irq_startup_irq(base->handler_irq);
if (request_irq(base->handler_irq, cia_handler, IRQF_SHARED,
base->name, base))
pr_err("Couldn't register %s interrupt\n", base->name);
diff --git a/arch/m68k/apollo/dn_ints.c b/arch/m68k/apollo/dn_ints.c
index d6e8f33..2bdab49 100644
--- a/arch/m68k/apollo/dn_ints.c
+++ b/arch/m68k/apollo/dn_ints.c
@@ -12,8 +12,10 @@ void dn_process_int(unsigned int irq, struct pt_regs *fp)
*(volatile unsigned char *)(picb)=0x20;
}
-unsigned int apollo_irq_startup(unsigned int irq)
+unsigned int apollo_irq_startup(struct irq_data *data)
{
+ unsigned int irq = data->irq;
+
if (irq < 8)
*(volatile unsigned char *)(pica+1) &= ~(1 << irq);
else
@@ -21,8 +23,10 @@ unsigned int apollo_irq_startup(unsigned int irq)
return 0;
}
-void apollo_irq_shutdown(unsigned int irq)
+void apollo_irq_shutdown(struct irq_data *data)
{
+ unsigned int irq = data->irq;
+
if (irq < 8)
*(volatile unsigned char *)(pica+1) |= (1 << irq);
else
diff --git a/arch/m68k/atari/ataints.c b/arch/m68k/atari/ataints.c
index ac0ebdf..7f4e5a9 100644
--- a/arch/m68k/atari/ataints.c
+++ b/arch/m68k/atari/ataints.c
@@ -320,30 +320,44 @@ extern void atari_microwire_cmd(int cmd);
extern int atari_SCC_reset_done;
-static unsigned int atari_startup_irq(unsigned int irq)
+static unsigned int atari_irq_startup(struct irq_data *data)
{
- m68k_irq_startup(irq);
+ unsigned int irq = data->irq;
+
+ m68k_irq_startup(data);
atari_turnon_irq(irq);
atari_enable_irq(irq);
return 0;
}
-static void atari_shutdown_irq(unsigned int irq)
+static void atari_irq_shutdown(struct irq_data *data)
{
+ unsigned int irq = data->irq;
+
atari_disable_irq(irq);
atari_turnoff_irq(irq);
- m68k_irq_shutdown(irq);
+ m68k_irq_shutdown(data);
if (irq == IRQ_AUTO_4)
vectors[VEC_INT4] = falcon_hblhandler;
}
+static void atari_irq_enable(struct irq_data *data)
+{
+ atari_enable_irq(data->irq);
+}
+
+static void atari_irq_disable(struct irq_data *data)
+{
+ atari_disable_irq(data->irq);
+}
+
static struct irq_chip atari_irq_chip = {
.name = "atari",
- .irq_startup = atari_startup_irq,
- .irq_shutdown = atari_shutdown_irq,
- .irq_enable = atari_enable_irq,
- .irq_disable = atari_disable_irq,
+ .irq_startup = atari_irq_startup,
+ .irq_shutdown = atari_irq_shutdown,
+ .irq_enable = atari_irq_enable,
+ .irq_disable = atari_irq_disable,
};
/*
diff --git a/arch/m68k/include/asm/irq.h b/arch/m68k/include/asm/irq.h
index 3cb037c..423f064 100644
--- a/arch/m68k/include/asm/irq.h
+++ b/arch/m68k/include/asm/irq.h
@@ -96,14 +96,15 @@ struct irq_handler {
struct irq_chip {
const char *name;
- unsigned int (*irq_startup)(unsigned int irq);
- void (*irq_shutdown)(unsigned int irq);
- void (*irq_enable)(unsigned int irq);
- void (*irq_disable)(unsigned int irq);
+ unsigned int (*irq_startup)(struct irq_data *data);
+ void (*irq_shutdown)(struct irq_data *data);
+ void (*irq_enable)(struct irq_data *data);
+ void (*irq_disable)(struct irq_data *data);
};
-extern unsigned int m68k_irq_startup(unsigned int);
-extern void m68k_irq_shutdown(unsigned int);
+extern unsigned int m68k_irq_startup(struct irq_data *data);
+extern unsigned int m68k_irq_startup_irq(unsigned int irq);
+extern void m68k_irq_shutdown(struct irq_data *data);
/*
* This function returns a new struct irq_data
diff --git a/arch/m68k/kernel/ints.c b/arch/m68k/kernel/ints.c
index 8877932..404d832 100644
--- a/arch/m68k/kernel/ints.c
+++ b/arch/m68k/kernel/ints.c
@@ -203,9 +203,9 @@ int setup_irq(unsigned int irq, struct irq_data *node)
if (!irq_list[irq]) {
if (contr->irq_startup)
- contr->irq_startup(irq);
+ contr->irq_startup(node);
else
- contr->irq_enable(irq);
+ contr->irq_enable(node);
}
node->next = NULL;
*prev = node;
@@ -270,9 +270,9 @@ void free_irq(unsigned int irq, void *dev_id)
if (!irq_list[irq]) {
if (contr->irq_shutdown)
- contr->irq_shutdown(irq);
+ contr->irq_shutdown(node);
else
- contr->irq_disable(irq);
+ contr->irq_disable(node);
}
local_irq_restore(flags);
@@ -295,7 +295,7 @@ void enable_irq(unsigned int irq)
if (irq_depth[irq]) {
if (!--irq_depth[irq]) {
if (contr->irq_enable)
- contr->irq_enable(irq);
+ contr->irq_enable(irq_list[irq]);
}
} else
WARN_ON(1);
@@ -318,7 +318,7 @@ void disable_irq(unsigned int irq)
local_irq_save(flags);
if (!irq_depth[irq]++) {
if (contr->irq_disable)
- contr->irq_disable(irq);
+ contr->irq_disable(irq_list[irq]);
}
local_irq_restore(flags);
}
@@ -329,7 +329,7 @@ void disable_irq_nosync(unsigned int irq) __attribute__((alias("disable_irq")));
EXPORT_SYMBOL(disable_irq_nosync);
-unsigned int m68k_irq_startup(unsigned int irq)
+unsigned int m68k_irq_startup_irq(unsigned int irq)
{
if (irq <= IRQ_AUTO_7)
vectors[VEC_SPUR + irq] = auto_inthandler;
@@ -338,8 +338,15 @@ unsigned int m68k_irq_startup(unsigned int irq)
return 0;
}
-void m68k_irq_shutdown(unsigned int irq)
+unsigned int m68k_irq_startup(struct irq_data *data)
{
+ return m68k_irq_startup_irq(data->irq);
+}
+
+void m68k_irq_shutdown(struct irq_data *data)
+{
+ unsigned int irq = data->irq;
+
if (irq <= IRQ_AUTO_7)
vectors[VEC_SPUR + irq] = bad_inthandler;
else
diff --git a/arch/m68k/mac/macints.c b/arch/m68k/mac/macints.c
index ffa1b3f..3cee6d2 100644
--- a/arch/m68k/mac/macints.c
+++ b/arch/m68k/mac/macints.c
@@ -193,10 +193,20 @@ irqreturn_t mac_debug_handler(int, void *);
void mac_enable_irq(unsigned int irq);
void mac_disable_irq(unsigned int irq);
+static void mac_irq_enable(struct irq_data *data)
+{
+ mac_enable_irq(data->irq);
+}
+
+static void mac_irq_disable(struct irq_data *data)
+{
+ mac_disable_irq(data->irq);
+}
+
static struct irq_chip mac_irq_chip = {
.name = "mac",
- .irq_enable = mac_enable_irq,
- .irq_disable = mac_disable_irq,
+ .irq_enable = mac_irq_enable,
+ .irq_disable = mac_irq_disable,
};
void __init mac_init_IRQ(void)
diff --git a/arch/m68k/q40/q40ints.c b/arch/m68k/q40/q40ints.c
index fa05a03..cb245f9 100644
--- a/arch/m68k/q40/q40ints.c
+++ b/arch/m68k/q40/q40ints.c
@@ -35,14 +35,16 @@
*/
static void q40_irq_handler(unsigned int, struct pt_regs *fp);
-static void q40_enable_irq(unsigned int);
-static void q40_disable_irq(unsigned int);
+static void q40_irq_enable(struct irq_data *data);
+static void q40_irq_disable(struct irq_data *data);
unsigned short q40_ablecount[35];
unsigned short q40_state[35];
-static unsigned int q40_irq_startup(unsigned int irq)
+static unsigned int q40_irq_startup(struct irq_data *data)
{
+ unsigned int irq = data->irq;
+
/* test for ISA ints not implemented by HW */
switch (irq) {
case 1: case 2: case 8: case 9:
@@ -53,7 +55,7 @@ static unsigned int q40_irq_startup(unsigned int irq)
return 0;
}
-static void q40_irq_shutdown(unsigned int irq)
+static void q40_irq_shutdown(struct irq_data *data)
{
}
@@ -61,8 +63,8 @@ static struct irq_chip q40_irq_chip = {
.name = "q40",
.irq_startup = q40_irq_startup,
.irq_shutdown = q40_irq_shutdown,
- .irq_enable = q40_enable_irq,
- .irq_disable = q40_disable_irq,
+ .irq_enable = q40_irq_enable,
+ .irq_disable = q40_irq_disable,
};
/*
@@ -85,8 +87,8 @@ void __init q40_init_IRQ(void)
/* setup handler for ISA ints */
m68k_setup_auto_interrupt(q40_irq_handler);
- m68k_irq_startup(IRQ_AUTO_2);
- m68k_irq_startup(IRQ_AUTO_4);
+ m68k_irq_startup_irq(IRQ_AUTO_2);
+ m68k_irq_startup_irq(IRQ_AUTO_4);
/* now enable some ints.. */
master_outb(1, EXT_ENABLE_REG); /* ISA IRQ 5-15 */
@@ -292,20 +294,24 @@ static void q40_irq_handler(unsigned int irq, struct pt_regs *fp)
return;
}
-void q40_enable_irq(unsigned int irq)
+void q40_irq_enable(struct irq_data *data)
{
+ unsigned int irq = data->irq;
+
if (irq >= 5 && irq <= 15) {
mext_disabled--;
if (mext_disabled > 0)
- printk("q40_enable_irq : nested disable/enable\n");
+ printk("q40_irq_enable : nested disable/enable\n");
if (mext_disabled == 0)
master_outb(1, EXT_ENABLE_REG);
}
}
-void q40_disable_irq(unsigned int irq)
+void q40_irq_disable(struct irq_data *data)
{
+ unsigned int irq = data->irq;
+
/* disable ISA iqs : only do something if the driver has been
* verified to be Q40 "compatible" - right now IDE, NE2K
* Any driver should not attempt to sleep across disable_irq !!
diff --git a/arch/m68k/sun3/sun3ints.c b/arch/m68k/sun3/sun3ints.c
index 97fa9ed..5d45e00 100644
--- a/arch/m68k/sun3/sun3ints.c
+++ b/arch/m68k/sun3/sun3ints.c
@@ -86,12 +86,22 @@ static void sun3_inthandle(unsigned int irq, struct pt_regs *fp)
__m68k_handle_int(irq, fp);
}
+static void sun3_irq_enable(struct irq_data *data)
+{
+ sun3_enable_irq(data->irq);
+};
+
+static void sun3_irq_disable(struct irq_data *data)
+{
+ sun3_disable_irq(data->irq);
+};
+
static struct irq_chip sun3_irq_chip = {
.name = "sun3",
.irq_startup = m68k_irq_startup,
.irq_shutdown = m68k_irq_shutdown,
- .irq_enable = sun3_enable_irq,
- .irq_disable = sun3_disable_irq,
+ .irq_enable = sun3_irq_enable,
+ .irq_disable = sun3_irq_disable,
};
void __init sun3_init_IRQ(void)
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 06/27] m68k/irq: Rename setup_irq() to m68k_setup_irq() and make it static
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
` (4 preceding siblings ...)
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 ` Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 07/27] m68k/irq: Extract irq_set_chip() Geert Uytterhoeven
` (21 subsequent siblings)
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven
It has nothing to do with the standard one in <linux/irq.h>
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
---
arch/m68k/kernel/ints.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/arch/m68k/kernel/ints.c b/arch/m68k/kernel/ints.c
index 404d832..e68a3bd 100644
--- a/arch/m68k/kernel/ints.c
+++ b/arch/m68k/kernel/ints.c
@@ -176,7 +176,7 @@ struct irq_data *new_irq_node(void)
return NULL;
}
-int setup_irq(unsigned int irq, struct irq_data *node)
+static int m68k_setup_irq(unsigned int irq, struct irq_data *node)
{
struct irq_chip *contr;
struct irq_data **prev;
@@ -232,7 +232,7 @@ int request_irq(unsigned int irq,
node->dev_id = dev_id;
node->devname = devname;
- res = setup_irq(irq, node);
+ res = m68k_setup_irq(irq, node);
if (res)
node->handler = NULL;
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 07/27] m68k/irq: Extract irq_set_chip()
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
` (5 preceding siblings ...)
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 ` Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 08/27] m68k/irq: Add m68k_setup_irq_controller() Geert Uytterhoeven
` (20 subsequent siblings)
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
---
arch/m68k/kernel/ints.c | 12 +++++++++---
1 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/arch/m68k/kernel/ints.c b/arch/m68k/kernel/ints.c
index e68a3bd..4f9868e 100644
--- a/arch/m68k/kernel/ints.c
+++ b/arch/m68k/kernel/ints.c
@@ -55,6 +55,12 @@ static struct irq_data *irq_list[NR_IRQS];
static struct irq_chip *irq_chip[NR_IRQS];
static int irq_depth[NR_IRQS];
+static inline int irq_set_chip(unsigned int irq, struct irq_chip *chip)
+{
+ irq_chip[irq] = chip;
+ return 0;
+}
+
static int m68k_first_user_vec;
static struct irq_chip auto_irq_chip = {
@@ -94,7 +100,7 @@ void __init init_IRQ(void)
}
for (i = IRQ_AUTO_1; i <= IRQ_AUTO_7; i++)
- irq_chip[i] = &auto_irq_chip;
+ irq_set_chip(i, &auto_irq_chip);
mach_init_IRQ();
}
@@ -134,7 +140,7 @@ void __init m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt,
BUG_ON(IRQ_USER + cnt > NR_IRQS);
m68k_first_user_vec = vec;
for (i = 0; i < cnt; i++)
- irq_chip[IRQ_USER + i] = &user_irq_chip;
+ irq_set_chip(IRQ_USER + i, &user_irq_chip);
*user_irqvec_fixup = vec - IRQ_USER;
if (handler)
*user_irqhandler_fixup = (u32)handler;
@@ -157,7 +163,7 @@ void m68k_setup_irq_chip(struct irq_chip *contr, unsigned int irq,
int i;
for (i = 0; i < cnt; i++)
- irq_chip[irq + i] = contr;
+ irq_set_chip(irq + i, contr);
}
struct irq_data *new_irq_node(void)
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 08/27] m68k/irq: Add m68k_setup_irq_controller()
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
` (6 preceding siblings ...)
2011-10-30 12:48 ` [PATCH 07/27] m68k/irq: Extract irq_set_chip() Geert Uytterhoeven
@ 2011-10-30 12:48 ` Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 09/27] m68k/irq: Rename {,__}m68k_handle_int() Geert Uytterhoeven
` (19 subsequent siblings)
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven
This is a wrapper around m68k_setup_irq_chip() that discards its dummy
second parameter, to ease the future transition to genirq.
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
---
arch/m68k/amiga/amiints.c | 3 ++-
arch/m68k/amiga/cia.c | 6 ++++--
arch/m68k/apollo/dn_ints.c | 3 ++-
arch/m68k/atari/ataints.c | 3 ++-
arch/m68k/include/asm/irq.h | 2 ++
arch/m68k/mac/macints.c | 2 +-
arch/m68k/q40/q40ints.c | 3 ++-
arch/m68k/sun3/sun3ints.c | 3 ++-
8 files changed, 17 insertions(+), 8 deletions(-)
diff --git a/arch/m68k/amiga/amiints.c b/arch/m68k/amiga/amiints.c
index 09a695b..8af5ea3 100644
--- a/arch/m68k/amiga/amiints.c
+++ b/arch/m68k/amiga/amiints.c
@@ -80,7 +80,8 @@ void __init amiga_init_IRQ(void)
if (request_irq(IRQ_AUTO_5, ami_int5, 0, "int5", NULL))
pr_err("Couldn't register int%d\n", 5);
- m68k_setup_irq_chip(&amiga_irq_chip, IRQ_USER, AMI_STD_IRQS);
+ m68k_setup_irq_controller(&amiga_irq_chip, handle_simple_irq, IRQ_USER,
+ AMI_STD_IRQS);
/* turn off PCMCIA interrupts */
if (AMIGAHW_PRESENT(PCMCIA))
diff --git a/arch/m68k/amiga/cia.c b/arch/m68k/amiga/cia.c
index b04b453..84663ae 100644
--- a/arch/m68k/amiga/cia.c
+++ b/arch/m68k/amiga/cia.c
@@ -168,14 +168,16 @@ static struct irq_chip auto_irq_chip = {
void __init cia_init_IRQ(struct ciabase *base)
{
- m68k_setup_irq_chip(&cia_irq_chip, base->cia_irq, CIA_IRQS);
+ m68k_setup_irq_controller(&cia_irq_chip, handle_simple_irq,
+ base->cia_irq, CIA_IRQS);
/* clear any pending interrupt and turn off all interrupts */
cia_set_irq(base, CIA_ICR_ALL);
cia_able_irq(base, CIA_ICR_ALL);
/* override auto int and install CIA handler */
- m68k_setup_irq_chip(&auto_irq_chip, base->handler_irq, 1);
+ m68k_setup_irq_controller(&auto_irq_chip, handle_simple_irq,
+ base->handler_irq, 1);
m68k_irq_startup_irq(base->handler_irq);
if (request_irq(base->handler_irq, cia_handler, IRQF_SHARED,
base->name, base))
diff --git a/arch/m68k/apollo/dn_ints.c b/arch/m68k/apollo/dn_ints.c
index 2bdab49..bdc4428 100644
--- a/arch/m68k/apollo/dn_ints.c
+++ b/arch/m68k/apollo/dn_ints.c
@@ -43,5 +43,6 @@ static struct irq_chip apollo_irq_chip = {
void __init dn_init_IRQ(void)
{
m68k_setup_user_interrupt(VEC_USER + 96, 16, dn_process_int);
- m68k_setup_irq_chip(&apollo_irq_chip, IRQ_APOLLO, 16);
+ m68k_setup_irq_controller(&apollo_irq_chip, handle_simple_irq,
+ IRQ_APOLLO, 16);
}
diff --git a/arch/m68k/atari/ataints.c b/arch/m68k/atari/ataints.c
index 7f4e5a9..6149ff9 100644
--- a/arch/m68k/atari/ataints.c
+++ b/arch/m68k/atari/ataints.c
@@ -374,7 +374,8 @@ static struct irq_chip atari_irq_chip = {
void __init atari_init_IRQ(void)
{
m68k_setup_user_interrupt(VEC_USER, NUM_ATARI_SOURCES - IRQ_USER, NULL);
- m68k_setup_irq_chip(&atari_irq_chip, 1, NUM_ATARI_SOURCES - 1);
+ m68k_setup_irq_controller(&atari_irq_chip, handle_simple_irq, 1,
+ NUM_ATARI_SOURCES - 1);
/* Initialize the MFP(s) */
diff --git a/arch/m68k/include/asm/irq.h b/arch/m68k/include/asm/irq.h
index 423f064..d0b7efd 100644
--- a/arch/m68k/include/asm/irq.h
+++ b/arch/m68k/include/asm/irq.h
@@ -115,6 +115,8 @@ extern void m68k_setup_auto_interrupt(void (*handler)(unsigned int, struct pt_re
extern void m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt,
void (*handler)(unsigned int, struct pt_regs *));
extern void m68k_setup_irq_chip(struct irq_chip *, unsigned int, unsigned int);
+#define m68k_setup_irq_controller(chip, dummy, irq, cnt) \
+ m68k_setup_irq_chip((chip), (irq), (cnt))
asmlinkage void m68k_handle_int(unsigned int);
asmlinkage void __m68k_handle_int(unsigned int, struct pt_regs *);
diff --git a/arch/m68k/mac/macints.c b/arch/m68k/mac/macints.c
index 3cee6d2..98497d2 100644
--- a/arch/m68k/mac/macints.c
+++ b/arch/m68k/mac/macints.c
@@ -214,7 +214,7 @@ void __init mac_init_IRQ(void)
#ifdef DEBUG_MACINTS
printk("mac_init_IRQ(): Setting things up...\n");
#endif
- m68k_setup_irq_chip(&mac_irq_chip, IRQ_USER,
+ m68k_setup_irq_controller(&mac_irq_chip, handle_simple_irq, IRQ_USER,
NUM_MAC_SOURCES - IRQ_USER);
/* Make sure the SONIC interrupt is cleared or things get ugly */
#ifdef SHUTUP_SONIC
diff --git a/arch/m68k/q40/q40ints.c b/arch/m68k/q40/q40ints.c
index cb245f9..a8a5ce8 100644
--- a/arch/m68k/q40/q40ints.c
+++ b/arch/m68k/q40/q40ints.c
@@ -82,7 +82,8 @@ static int disabled;
void __init q40_init_IRQ(void)
{
- m68k_setup_irq_chip(&q40_irq_chip, 1, Q40_IRQ_MAX);
+ m68k_setup_irq_controller(&q40_irq_chip, handle_simple_irq, 1,
+ Q40_IRQ_MAX);
/* setup handler for ISA ints */
m68k_setup_auto_interrupt(q40_irq_handler);
diff --git a/arch/m68k/sun3/sun3ints.c b/arch/m68k/sun3/sun3ints.c
index 5d45e00..2046127 100644
--- a/arch/m68k/sun3/sun3ints.c
+++ b/arch/m68k/sun3/sun3ints.c
@@ -109,7 +109,8 @@ void __init sun3_init_IRQ(void)
*sun3_intreg = 1;
m68k_setup_auto_interrupt(sun3_inthandle);
- m68k_setup_irq_chip(&sun3_irq_chip, IRQ_AUTO_1, 7);
+ m68k_setup_irq_controller(&sun3_irq_chip, handle_simple_irq,
+ IRQ_AUTO_1, 7);
m68k_setup_user_interrupt(VEC_USER, 128, NULL);
if (request_irq(IRQ_AUTO_5, sun3_int5, 0, "int5", NULL))
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 09/27] m68k/irq: Rename {,__}m68k_handle_int()
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
` (7 preceding siblings ...)
2011-10-30 12:48 ` [PATCH 08/27] m68k/irq: Add m68k_setup_irq_controller() Geert Uytterhoeven
@ 2011-10-30 12:48 ` Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 10/27] m68k/irq: Remove obsolete IRQ_FLG_* users Geert Uytterhoeven
` (18 subsequent siblings)
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven
- Rename m68k_handle_int() to generic_handle_irq(), and drop the unneeded
asmlinkage,
- Rename __m68k_handle_int() to do_IRQ().
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
---
arch/m68k/amiga/amiints.c | 24 ++++++++++++------------
arch/m68k/amiga/cia.c | 2 +-
arch/m68k/apollo/dn_ints.c | 2 +-
arch/m68k/include/asm/irq.h | 4 ++--
arch/m68k/kernel/entry_mm.S | 4 ++--
arch/m68k/kernel/ints.c | 10 +++++-----
arch/m68k/mac/baboon.c | 2 +-
arch/m68k/mac/oss.c | 4 ++--
arch/m68k/mac/psc.c | 2 +-
arch/m68k/mac/via.c | 6 +++---
arch/m68k/q40/q40ints.c | 8 ++++----
arch/m68k/sun3/sun3ints.c | 2 +-
12 files changed, 35 insertions(+), 35 deletions(-)
diff --git a/arch/m68k/amiga/amiints.c b/arch/m68k/amiga/amiints.c
index 8af5ea3..0daa7fc 100644
--- a/arch/m68k/amiga/amiints.c
+++ b/arch/m68k/amiga/amiints.c
@@ -124,19 +124,19 @@ static irqreturn_t ami_int1(int irq, void *dev_id)
/* if serial transmit buffer empty, interrupt */
if (ints & IF_TBE) {
amiga_custom.intreq = IF_TBE;
- m68k_handle_int(IRQ_AMIGA_TBE);
+ generic_handle_irq(IRQ_AMIGA_TBE);
}
/* if floppy disk transfer complete, interrupt */
if (ints & IF_DSKBLK) {
amiga_custom.intreq = IF_DSKBLK;
- m68k_handle_int(IRQ_AMIGA_DSKBLK);
+ generic_handle_irq(IRQ_AMIGA_DSKBLK);
}
/* if software interrupt set, interrupt */
if (ints & IF_SOFT) {
amiga_custom.intreq = IF_SOFT;
- m68k_handle_int(IRQ_AMIGA_SOFT);
+ generic_handle_irq(IRQ_AMIGA_SOFT);
}
return IRQ_HANDLED;
}
@@ -148,19 +148,19 @@ static irqreturn_t ami_int3(int irq, void *dev_id)
/* if a blitter interrupt */
if (ints & IF_BLIT) {
amiga_custom.intreq = IF_BLIT;
- m68k_handle_int(IRQ_AMIGA_BLIT);
+ generic_handle_irq(IRQ_AMIGA_BLIT);
}
/* if a copper interrupt */
if (ints & IF_COPER) {
amiga_custom.intreq = IF_COPER;
- m68k_handle_int(IRQ_AMIGA_COPPER);
+ generic_handle_irq(IRQ_AMIGA_COPPER);
}
/* if a vertical blank interrupt */
if (ints & IF_VERTB) {
amiga_custom.intreq = IF_VERTB;
- m68k_handle_int(IRQ_AMIGA_VERTB);
+ generic_handle_irq(IRQ_AMIGA_VERTB);
}
return IRQ_HANDLED;
}
@@ -172,25 +172,25 @@ static irqreturn_t ami_int4(int irq, void *dev_id)
/* if audio 0 interrupt */
if (ints & IF_AUD0) {
amiga_custom.intreq = IF_AUD0;
- m68k_handle_int(IRQ_AMIGA_AUD0);
+ generic_handle_irq(IRQ_AMIGA_AUD0);
}
/* if audio 1 interrupt */
if (ints & IF_AUD1) {
amiga_custom.intreq = IF_AUD1;
- m68k_handle_int(IRQ_AMIGA_AUD1);
+ generic_handle_irq(IRQ_AMIGA_AUD1);
}
/* if audio 2 interrupt */
if (ints & IF_AUD2) {
amiga_custom.intreq = IF_AUD2;
- m68k_handle_int(IRQ_AMIGA_AUD2);
+ generic_handle_irq(IRQ_AMIGA_AUD2);
}
/* if audio 3 interrupt */
if (ints & IF_AUD3) {
amiga_custom.intreq = IF_AUD3;
- m68k_handle_int(IRQ_AMIGA_AUD3);
+ generic_handle_irq(IRQ_AMIGA_AUD3);
}
return IRQ_HANDLED;
}
@@ -202,13 +202,13 @@ static irqreturn_t ami_int5(int irq, void *dev_id)
/* if serial receive buffer full interrupt */
if (ints & IF_RBF) {
/* acknowledge of IF_RBF must be done by the serial interrupt */
- m68k_handle_int(IRQ_AMIGA_RBF);
+ generic_handle_irq(IRQ_AMIGA_RBF);
}
/* if a disk sync interrupt */
if (ints & IF_DSKSYN) {
amiga_custom.intreq = IF_DSKSYN;
- m68k_handle_int(IRQ_AMIGA_DSKSYN);
+ generic_handle_irq(IRQ_AMIGA_DSKSYN);
}
return IRQ_HANDLED;
}
diff --git a/arch/m68k/amiga/cia.c b/arch/m68k/amiga/cia.c
index 84663ae..18c0e29 100644
--- a/arch/m68k/amiga/cia.c
+++ b/arch/m68k/amiga/cia.c
@@ -93,7 +93,7 @@ static irqreturn_t cia_handler(int irq, void *dev_id)
amiga_custom.intreq = base->int_mask;
for (; ints; mach_irq++, ints >>= 1) {
if (ints & 1)
- m68k_handle_int(mach_irq);
+ generic_handle_irq(mach_irq);
}
return IRQ_HANDLED;
}
diff --git a/arch/m68k/apollo/dn_ints.c b/arch/m68k/apollo/dn_ints.c
index bdc4428..4b76431 100644
--- a/arch/m68k/apollo/dn_ints.c
+++ b/arch/m68k/apollo/dn_ints.c
@@ -6,7 +6,7 @@
void dn_process_int(unsigned int irq, struct pt_regs *fp)
{
- __m68k_handle_int(irq, fp);
+ do_IRQ(irq, fp);
*(volatile unsigned char *)(pica)=0x20;
*(volatile unsigned char *)(picb)=0x20;
diff --git a/arch/m68k/include/asm/irq.h b/arch/m68k/include/asm/irq.h
index d0b7efd..9a2bae8 100644
--- a/arch/m68k/include/asm/irq.h
+++ b/arch/m68k/include/asm/irq.h
@@ -118,8 +118,8 @@ extern void m68k_setup_irq_chip(struct irq_chip *, unsigned int, unsigned int);
#define m68k_setup_irq_controller(chip, dummy, irq, cnt) \
m68k_setup_irq_chip((chip), (irq), (cnt))
-asmlinkage void m68k_handle_int(unsigned int);
-asmlinkage void __m68k_handle_int(unsigned int, struct pt_regs *);
+extern void generic_handle_irq(unsigned int);
+asmlinkage void do_IRQ(int irq, struct pt_regs *regs);
#else
#define irq_canonicalize(irq) (irq)
diff --git a/arch/m68k/kernel/entry_mm.S b/arch/m68k/kernel/entry_mm.S
index bd0ec05..f5927d0 100644
--- a/arch/m68k/kernel/entry_mm.S
+++ b/arch/m68k/kernel/entry_mm.S
@@ -207,7 +207,7 @@ ENTRY(auto_inthandler)
movel %sp,%sp@-
movel %d0,%sp@- | put vector # on stack
auto_irqhandler_fixup = . + 2
- jsr __m68k_handle_int | process the IRQ
+ jsr do_IRQ | process the IRQ
addql #8,%sp | pop parameters off stack
ret_from_interrupt:
@@ -241,7 +241,7 @@ user_irqvec_fixup = . + 2
movel %sp,%sp@-
movel %d0,%sp@- | put vector # on stack
user_irqhandler_fixup = . + 2
- jsr __m68k_handle_int | process the IRQ
+ jsr do_IRQ | process the IRQ
addql #8,%sp | pop parameters off stack
subqb #1,%curptr@(TASK_INFO+TINFO_PREEMPT+1)
diff --git a/arch/m68k/kernel/ints.c b/arch/m68k/kernel/ints.c
index 4f9868e..15dbbe2 100644
--- a/arch/m68k/kernel/ints.c
+++ b/arch/m68k/kernel/ints.c
@@ -110,7 +110,7 @@ void __init init_IRQ(void)
* @handler: called from auto vector interrupts
*
* setup the handler to be called from auto vector interrupts instead of the
- * standard __m68k_handle_int(), it will be called with irq numbers in the range
+ * standard do_IRQ(), it will be called with irq numbers in the range
* from IRQ_AUTO_1 - IRQ_AUTO_7.
*/
void __init m68k_setup_auto_interrupt(void (*handler)(unsigned int, struct pt_regs *))
@@ -129,7 +129,7 @@ void __init m68k_setup_auto_interrupt(void (*handler)(unsigned int, struct pt_re
* setup user vector interrupts, this includes activating the specified range
* of interrupts, only then these interrupts can be requested (note: this is
* different from auto vector interrupts). An optional handler can be installed
- * to be called instead of the default __m68k_handle_int(), it will be called
+ * to be called instead of the default do_IRQ(), it will be called
* with irq numbers starting from IRQ_USER.
*/
void __init m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt,
@@ -398,7 +398,7 @@ unsigned int irq_canonicalize(unsigned int irq)
EXPORT_SYMBOL(irq_canonicalize);
-asmlinkage void m68k_handle_int(unsigned int irq)
+void generic_handle_irq(unsigned int irq)
{
struct irq_data *node;
kstat_cpu(0).irqs[irq]++;
@@ -409,11 +409,11 @@ asmlinkage void m68k_handle_int(unsigned int irq)
} while (node);
}
-asmlinkage void __m68k_handle_int(unsigned int irq, struct pt_regs *regs)
+asmlinkage void do_IRQ(int irq, struct pt_regs *regs)
{
struct pt_regs *old_regs;
old_regs = set_irq_regs(regs);
- m68k_handle_int(irq);
+ generic_handle_irq(irq);
set_irq_regs(old_regs);
}
diff --git a/arch/m68k/mac/baboon.c b/arch/m68k/mac/baboon.c
index 2a96beb..f264791 100644
--- a/arch/m68k/mac/baboon.c
+++ b/arch/m68k/mac/baboon.c
@@ -72,7 +72,7 @@ static irqreturn_t baboon_irq(int irq, void *dev_id)
do {
if (events & irq_bit) {
baboon->mb_ifr &= ~irq_bit;
- m68k_handle_int(irq_num);
+ generic_handle_irq(irq_num);
}
irq_bit <<= 1;
irq_num++;
diff --git a/arch/m68k/mac/oss.c b/arch/m68k/mac/oss.c
index a9c0f5a..ad51241 100644
--- a/arch/m68k/mac/oss.c
+++ b/arch/m68k/mac/oss.c
@@ -113,7 +113,7 @@ static irqreturn_t oss_irq(int irq, void *dev_id)
/* FIXME: call sound handler */
} else if (events & OSS_IP_SCSI) {
oss->irq_pending &= ~OSS_IP_SCSI;
- m68k_handle_int(IRQ_MAC_SCSI);
+ generic_handle_irq(IRQ_MAC_SCSI);
} else {
/* FIXME: error check here? */
}
@@ -148,7 +148,7 @@ static irqreturn_t oss_nubus_irq(int irq, void *dev_id)
irq_bit >>= 1;
if (events & irq_bit) {
oss->irq_pending &= ~irq_bit;
- m68k_handle_int(NUBUS_SOURCE_BASE + i);
+ generic_handle_irq(NUBUS_SOURCE_BASE + i);
}
} while(events & (irq_bit - 1));
return IRQ_HANDLED;
diff --git a/arch/m68k/mac/psc.c b/arch/m68k/mac/psc.c
index a4c3eb6..26c2b65 100644
--- a/arch/m68k/mac/psc.c
+++ b/arch/m68k/mac/psc.c
@@ -152,7 +152,7 @@ irqreturn_t psc_irq(int irq, void *dev_id)
do {
if (events & irq_bit) {
psc_write_byte(pIFR, irq_bit);
- m68k_handle_int(irq_num);
+ generic_handle_irq(irq_num);
}
irq_num++;
irq_bit <<= 1;
diff --git a/arch/m68k/mac/via.c b/arch/m68k/mac/via.c
index e71166d..0678570 100644
--- a/arch/m68k/mac/via.c
+++ b/arch/m68k/mac/via.c
@@ -460,7 +460,7 @@ irqreturn_t via1_irq(int irq, void *dev_id)
do {
if (events & irq_bit) {
via1[vIFR] = irq_bit;
- m68k_handle_int(irq_num);
+ generic_handle_irq(irq_num);
}
++irq_num;
irq_bit <<= 1;
@@ -482,7 +482,7 @@ irqreturn_t via2_irq(int irq, void *dev_id)
do {
if (events & irq_bit) {
via2[gIFR] = irq_bit | rbv_clear;
- m68k_handle_int(irq_num);
+ generic_handle_irq(irq_num);
}
++irq_num;
irq_bit <<= 1;
@@ -514,7 +514,7 @@ irqreturn_t via_nubus_irq(int irq, void *dev_id)
do {
if (events & slot_bit) {
events &= ~slot_bit;
- m68k_handle_int(slot_irq);
+ generic_handle_irq(slot_irq);
}
--slot_irq;
slot_bit >>= 1;
diff --git a/arch/m68k/q40/q40ints.c b/arch/m68k/q40/q40ints.c
index a8a5ce8..afe600c 100644
--- a/arch/m68k/q40/q40ints.c
+++ b/arch/m68k/q40/q40ints.c
@@ -220,11 +220,11 @@ static void q40_irq_handler(unsigned int irq, struct pt_regs *fp)
switch (irq) {
case 4:
case 6:
- __m68k_handle_int(Q40_IRQ_SAMPLE, fp);
+ do_IRQ(Q40_IRQ_SAMPLE, fp);
return;
}
if (mir & Q40_IRQ_FRAME_MASK) {
- __m68k_handle_int(Q40_IRQ_FRAME, fp);
+ do_IRQ(Q40_IRQ_FRAME, fp);
master_outb(-1, FRAME_CLEAR_REG);
}
if ((mir & Q40_IRQ_SER_MASK) || (mir & Q40_IRQ_EXT_MASK)) {
@@ -259,7 +259,7 @@ static void q40_irq_handler(unsigned int irq, struct pt_regs *fp)
goto iirq;
}
q40_state[irq] |= IRQ_INPROGRESS;
- __m68k_handle_int(irq, fp);
+ do_IRQ(irq, fp);
q40_state[irq] &= ~IRQ_INPROGRESS;
/* naively enable everything, if that fails than */
@@ -290,7 +290,7 @@ static void q40_irq_handler(unsigned int irq, struct pt_regs *fp)
mir = master_inb(IIRQ_REG);
/* should test whether keyboard irq is really enabled, doing it in defhand */
if (mir & Q40_IRQ_KEYB_MASK)
- __m68k_handle_int(Q40_IRQ_KEYBOARD, fp);
+ do_IRQ(Q40_IRQ_KEYBOARD, fp);
return;
}
diff --git a/arch/m68k/sun3/sun3ints.c b/arch/m68k/sun3/sun3ints.c
index 2046127..20ffee7 100644
--- a/arch/m68k/sun3/sun3ints.c
+++ b/arch/m68k/sun3/sun3ints.c
@@ -83,7 +83,7 @@ static void sun3_inthandle(unsigned int irq, struct pt_regs *fp)
{
*sun3_intreg &= ~(1 << irq);
- __m68k_handle_int(irq, fp);
+ do_IRQ(irq, fp);
}
static void sun3_irq_enable(struct irq_data *data)
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 10/27] m68k/irq: Remove obsolete IRQ_FLG_* users
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
` (8 preceding siblings ...)
2011-10-30 12:48 ` [PATCH 09/27] m68k/irq: Rename {,__}m68k_handle_int() Geert Uytterhoeven
@ 2011-10-30 12:48 ` Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 11/27] m68k/irq: Add genirq support Geert Uytterhoeven
` (17 subsequent siblings)
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven
The m68k core irq code stopped honoring these flags during the irq
restructuring in 2006.
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
---
arch/m68k/amiga/amiints.c | 29 -----------------------------
arch/m68k/hp300/time.c | 2 +-
arch/m68k/kernel/ints.c | 19 -------------------
arch/m68k/mac/iop.c | 10 ++++------
arch/m68k/mac/oss.c | 13 +++++--------
arch/m68k/mac/via.c | 22 ++++++++--------------
arch/m68k/mvme147/config.c | 3 +--
drivers/macintosh/via-macii.c | 2 +-
drivers/macintosh/via-maciisi.c | 4 ++--
9 files changed, 22 insertions(+), 82 deletions(-)
diff --git a/arch/m68k/amiga/amiints.c b/arch/m68k/amiga/amiints.c
index 0daa7fc..e5f3033 100644
--- a/arch/m68k/amiga/amiints.c
+++ b/arch/m68k/amiga/amiints.c
@@ -4,35 +4,6 @@
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file COPYING in the main directory of this archive
* for more details.
- *
- * 11/07/96: rewritten interrupt handling, irq lists are exists now only for
- * this sources where it makes sense (VERTB/PORTS/EXTER) and you must
- * be careful that dev_id for this sources is unique since this the
- * only possibility to distinguish between different handlers for
- * free_irq. irq lists also have different irq flags:
- * - IRQ_FLG_FAST: handler is inserted at top of list (after other
- * fast handlers)
- * - IRQ_FLG_SLOW: handler is inserted at bottom of list and before
- * they're executed irq level is set to the previous
- * one, but handlers don't need to be reentrant, if
- * reentrance occurred, slow handlers will be just
- * called again.
- * The whole interrupt handling for CIAs is moved to cia.c
- * /Roman Zippel
- *
- * 07/08/99: rewamp of the interrupt handling - we now have two types of
- * interrupts, normal and fast handlers, fast handlers being
- * marked with IRQF_DISABLED and runs with all other interrupts
- * disabled. Normal interrupts disable their own source but
- * run with all other interrupt sources enabled.
- * PORTS and EXTER interrupts are always shared even if the
- * drivers do not explicitly mark this when calling
- * request_irq which they really should do.
- * This is similar to the way interrupts are handled on all
- * other architectures and makes a ton of sense besides
- * having the advantage of making it easier to share
- * drivers.
- * /Jes
*/
#include <linux/init.h>
diff --git a/arch/m68k/hp300/time.c b/arch/m68k/hp300/time.c
index f6312c7..c87fe69 100644
--- a/arch/m68k/hp300/time.c
+++ b/arch/m68k/hp300/time.c
@@ -70,7 +70,7 @@ void __init hp300_sched_init(irq_handler_t vector)
asm volatile(" movpw %0,%1@(5)" : : "d" (INTVAL), "a" (CLOCKBASE));
- if (request_irq(IRQ_AUTO_6, hp300_tick, IRQ_FLG_STD, "timer tick", vector))
+ if (request_irq(IRQ_AUTO_6, hp300_tick, 0, "timer tick", vector))
pr_err("Couldn't register timer interrupt\n");
out_8(CLOCKBASE + CLKCR2, 0x1); /* select CR1 */
diff --git a/arch/m68k/kernel/ints.c b/arch/m68k/kernel/ints.c
index 15dbbe2..f6a4698 100644
--- a/arch/m68k/kernel/ints.c
+++ b/arch/m68k/kernel/ints.c
@@ -4,25 +4,6 @@
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file COPYING in the main directory of this archive
* for more details.
- *
- * 07/03/96: Timer initialization, and thus mach_sched_init(),
- * removed from request_irq() and moved to init_time().
- * We should therefore consider renaming our add_isr() and
- * remove_isr() to request_irq() and free_irq()
- * respectively, so they are compliant with the other
- * architectures. /Jes
- * 11/07/96: Changed all add_/remove_isr() to request_/free_irq() calls.
- * Removed irq list support, if any machine needs an irq server
- * it must implement this itself (as it's already done), instead
- * only default handler are used with mach_default_handler.
- * request_irq got some flags different from other architectures:
- * - IRQ_FLG_REPLACE : Replace an existing handler (the default one
- * can be replaced without this flag)
- * - IRQ_FLG_LOCK : handler can't be replaced
- * There are other machine depending flags, see there
- * If you want to replace a default handler you should know what
- * you're doing, since it might handle different other irq sources
- * which must be served /Roman Zippel
*/
#include <linux/module.h>
diff --git a/arch/m68k/mac/iop.c b/arch/m68k/mac/iop.c
index 1ad4e9d..a5462cc 100644
--- a/arch/m68k/mac/iop.c
+++ b/arch/m68k/mac/iop.c
@@ -305,15 +305,13 @@ void __init iop_register_interrupts(void)
{
if (iop_ism_present) {
if (oss_present) {
- if (request_irq(OSS_IRQLEV_IOPISM, iop_ism_irq,
- IRQ_FLG_LOCK, "ISM IOP",
- (void *) IOP_NUM_ISM))
+ if (request_irq(OSS_IRQLEV_IOPISM, iop_ism_irq, 0,
+ "ISM IOP", (void *)IOP_NUM_ISM))
pr_err("Couldn't register ISM IOP interrupt\n");
oss_irq_enable(IRQ_MAC_ADB);
} else {
- if (request_irq(IRQ_VIA2_0, iop_ism_irq,
- IRQ_FLG_LOCK|IRQ_FLG_FAST, "ISM IOP",
- (void *) IOP_NUM_ISM))
+ if (request_irq(IRQ_VIA2_0, iop_ism_irq, 0, "ISM IOP",
+ (void *)IOP_NUM_ISM))
pr_err("Couldn't register ISM IOP interrupt\n");
}
if (!iop_alive(iop_base[IOP_NUM_ISM])) {
diff --git a/arch/m68k/mac/oss.c b/arch/m68k/mac/oss.c
index ad51241..1eb60f0 100644
--- a/arch/m68k/mac/oss.c
+++ b/arch/m68k/mac/oss.c
@@ -65,17 +65,14 @@ void __init oss_init(void)
void __init oss_register_interrupts(void)
{
- if (request_irq(OSS_IRQLEV_SCSI, oss_irq, IRQ_FLG_LOCK,
- "scsi", (void *) oss))
+ if (request_irq(OSS_IRQLEV_SCSI, oss_irq, 0, "scsi", (void *)oss))
pr_err("Couldn't register %s interrupt\n", "scsi");
- if (request_irq(OSS_IRQLEV_NUBUS, oss_nubus_irq, IRQ_FLG_LOCK,
- "nubus", (void *) oss))
+ if (request_irq(OSS_IRQLEV_NUBUS, oss_nubus_irq, 0, "nubus",
+ (void *)oss))
pr_err("Couldn't register %s interrupt\n", "nubus");
- if (request_irq(OSS_IRQLEV_SOUND, oss_irq, IRQ_FLG_LOCK,
- "sound", (void *) oss))
+ if (request_irq(OSS_IRQLEV_SOUND, oss_irq, 0, "sound", (void *)oss))
pr_err("Couldn't register %s interrupt\n", "sound");
- if (request_irq(OSS_IRQLEV_VIA1, via1_irq, IRQ_FLG_LOCK,
- "via1", (void *) via1))
+ if (request_irq(OSS_IRQLEV_VIA1, via1_irq, 0, "via1", (void *)via1))
pr_err("Couldn't register %s interrupt\n", "via1");
}
diff --git a/arch/m68k/mac/via.c b/arch/m68k/mac/via.c
index 0678570..af9ed33 100644
--- a/arch/m68k/mac/via.c
+++ b/arch/m68k/mac/via.c
@@ -281,7 +281,7 @@ void __init via_init_clock(irq_handler_t func)
via1[vT1CL] = MAC_CLOCK_LOW;
via1[vT1CH] = MAC_CLOCK_HIGH;
- if (request_irq(IRQ_MAC_TIMER_1, func, IRQ_FLG_LOCK, "timer", func))
+ if (request_irq(IRQ_MAC_TIMER_1, func, 0, "timer", func))
pr_err("Couldn't register %s interrupt\n", "timer");
}
@@ -292,25 +292,19 @@ void __init via_init_clock(irq_handler_t func)
void __init via_register_interrupts(void)
{
if (via_alt_mapping) {
- if (request_irq(IRQ_AUTO_1, via1_irq,
- IRQ_FLG_LOCK|IRQ_FLG_FAST, "software",
- (void *) via1))
+ if (request_irq(IRQ_AUTO_1, via1_irq, 0, "software",
+ (void *)via1))
pr_err("Couldn't register %s interrupt\n", "software");
- if (request_irq(IRQ_AUTO_6, via1_irq,
- IRQ_FLG_LOCK|IRQ_FLG_FAST, "via1",
- (void *) via1))
+ if (request_irq(IRQ_AUTO_6, via1_irq, 0, "via1", (void *)via1))
pr_err("Couldn't register %s interrupt\n", "via1");
} else {
- if (request_irq(IRQ_AUTO_1, via1_irq,
- IRQ_FLG_LOCK|IRQ_FLG_FAST, "via1",
- (void *) via1))
+ if (request_irq(IRQ_AUTO_1, via1_irq, 0, "via1", (void *)via1))
pr_err("Couldn't register %s interrupt\n", "via1");
}
- if (request_irq(IRQ_AUTO_2, via2_irq, IRQ_FLG_LOCK|IRQ_FLG_FAST,
- "via2", (void *) via2))
+ if (request_irq(IRQ_AUTO_2, via2_irq, 0, "via2", (void *)via2))
pr_err("Couldn't register %s interrupt\n", "via2");
- if (request_irq(IRQ_MAC_NUBUS, via_nubus_irq,
- IRQ_FLG_LOCK|IRQ_FLG_FAST, "nubus", (void *) via2))
+ if (request_irq(IRQ_MAC_NUBUS, via_nubus_irq, 0, "nubus",
+ (void *)via2))
pr_err("Couldn't register %s interrupt\n", "nubus");
}
diff --git a/arch/m68k/mvme147/config.c b/arch/m68k/mvme147/config.c
index 6cb9c3a..01f2adf 100644
--- a/arch/m68k/mvme147/config.c
+++ b/arch/m68k/mvme147/config.c
@@ -114,8 +114,7 @@ static irqreturn_t mvme147_timer_int (int irq, void *dev_id)
void mvme147_sched_init (irq_handler_t timer_routine)
{
tick_handler = timer_routine;
- if (request_irq(PCC_IRQ_TIMER1, mvme147_timer_int, IRQ_FLG_REPLACE,
- "timer 1", NULL))
+ if (request_irq(PCC_IRQ_TIMER1, mvme147_timer_int, 0, "timer 1", NULL))
pr_err("Couldn't register timer interrupt\n");
/* Init the clock with a value */
diff --git a/drivers/macintosh/via-macii.c b/drivers/macintosh/via-macii.c
index 817f37a..c9570fc 100644
--- a/drivers/macintosh/via-macii.c
+++ b/drivers/macintosh/via-macii.c
@@ -159,7 +159,7 @@ int macii_init(void)
err = macii_init_via();
if (err) goto out;
- err = request_irq(IRQ_MAC_ADB, macii_interrupt, IRQ_FLG_LOCK, "ADB",
+ err = request_irq(IRQ_MAC_ADB, macii_interrupt, 0, "ADB",
macii_interrupt);
if (err) goto out;
diff --git a/drivers/macintosh/via-maciisi.c b/drivers/macintosh/via-maciisi.c
index 9ab5b0c..34d02a9 100644
--- a/drivers/macintosh/via-maciisi.c
+++ b/drivers/macintosh/via-maciisi.c
@@ -122,8 +122,8 @@ maciisi_init(void)
return err;
}
- if (request_irq(IRQ_MAC_ADB, maciisi_interrupt, IRQ_FLG_LOCK | IRQ_FLG_FAST,
- "ADB", maciisi_interrupt)) {
+ if (request_irq(IRQ_MAC_ADB, maciisi_interrupt, 0, "ADB",
+ maciisi_interrupt)) {
printk(KERN_ERR "maciisi_init: can't get irq %d\n", IRQ_MAC_ADB);
return -EAGAIN;
}
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 11/27] m68k/irq: Add genirq support
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
` (9 preceding siblings ...)
2011-10-30 12:48 ` [PATCH 10/27] m68k/irq: Remove obsolete IRQ_FLG_* users Geert Uytterhoeven
@ 2011-10-30 12:48 ` Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 12/27] m68k/atari: Convert Atari to genirq Geert Uytterhoeven
` (16 subsequent siblings)
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven
Disabled on all platforms for now
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
[v1] Acked-by: Thomas Gleixner <tglx@linutronix.de>
---
arch/m68k/Kconfig | 17 ++++++++++++
arch/m68k/include/asm/hardirq.h | 5 +++
arch/m68k/include/asm/irq.h | 41 ++++++++++++++++++++++++------
arch/m68k/kernel/Makefile | 9 +++++-
arch/m68k/kernel/ints.c | 52 ++++++++++++++++++++++++++++++++++++++-
5 files changed, 112 insertions(+), 12 deletions(-)
diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig
index 6c28582..a7597e1 100644
--- a/arch/m68k/Kconfig
+++ b/arch/m68k/Kconfig
@@ -84,6 +84,23 @@ config MMU_SUN3
bool
depends on MMU && !MMU_MOTOROLA
+config USE_GENERIC_HARDIRQS
+ bool "Use genirq"
+ depends on MMU
+ depends on !AMIGA
+ depends on !ATARI
+ depends on !MAC
+ depends on !APOLLO
+ depends on !MVME147
+ depends on !MVME16x
+ depends on !BVME6000
+ depends on !HP300
+ depends on !SUN3X
+ depends on !Q40
+ depends on !SUN3
+ select HAVE_GENERIC_HARDIRQS
+ select GENERIC_IRQ_SHOW
+
menu "Platform setup"
source arch/m68k/Kconfig.cpu
diff --git a/arch/m68k/include/asm/hardirq.h b/arch/m68k/include/asm/hardirq.h
index 870e534..db30ed2 100644
--- a/arch/m68k/include/asm/hardirq.h
+++ b/arch/m68k/include/asm/hardirq.h
@@ -18,6 +18,11 @@
#ifdef CONFIG_MMU
+static inline void ack_bad_irq(unsigned int irq)
+{
+ pr_crit("unexpected IRQ trap at vector %02x\n", irq);
+}
+
/* entry.S is sensitive to the offsets of these fields */
typedef struct {
unsigned int __softirq_pending;
diff --git a/arch/m68k/include/asm/irq.h b/arch/m68k/include/asm/irq.h
index 9a2bae8..518e61f 100644
--- a/arch/m68k/include/asm/irq.h
+++ b/arch/m68k/include/asm/irq.h
@@ -27,11 +27,6 @@
#ifdef CONFIG_MMU
-#include <linux/linkage.h>
-#include <linux/hardirq.h>
-#include <linux/irqreturn.h>
-#include <linux/spinlock_types.h>
-
/*
* Interrupt source definitions
* General interrupt sources are the level 1-7.
@@ -54,10 +49,6 @@
#define IRQ_USER 8
-extern unsigned int irq_canonicalize(unsigned int irq);
-
-struct pt_regs;
-
/*
* various flags for request_irq() - the Amiga now uses the standard
* mechanism like all other architectures - IRQF_DISABLED and
@@ -71,6 +62,15 @@ struct pt_regs;
#define IRQ_FLG_STD (0x8000) /* internally used */
#endif
+#ifndef CONFIG_GENERIC_HARDIRQS
+
+#include <linux/linkage.h>
+#include <linux/hardirq.h>
+#include <linux/irqreturn.h>
+#include <linux/spinlock_types.h>
+
+struct pt_regs;
+
/*
* This structure is used to chain together the ISRs for a particular
* interrupt source (if it supports chaining).
@@ -121,10 +121,33 @@ extern void m68k_setup_irq_chip(struct irq_chip *, unsigned int, unsigned int);
extern void generic_handle_irq(unsigned int);
asmlinkage void do_IRQ(int irq, struct pt_regs *regs);
+#else /* CONFIG_GENERIC_HARDIRQS */
+
+struct irq_data;
+struct irq_chip;
+struct irq_desc;
+extern unsigned int m68k_irq_startup(struct irq_data *data);
+extern unsigned int m68k_irq_startup_irq(unsigned int irq);
+extern void m68k_irq_shutdown(struct irq_data *data);
+extern void m68k_setup_auto_interrupt(void (*handler)(unsigned int,
+ struct pt_regs *));
+extern void m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt,
+ void (*handler)(unsigned int,
+ struct pt_regs *));
+extern void m68k_setup_irq_controller(struct irq_chip *,
+ void (*handle)(unsigned int irq,
+ struct irq_desc *desc),
+ unsigned int irq, unsigned int cnt);
+
+#endif /* CONFIG_GENERIC_HARDIRQS */
+
+extern unsigned int irq_canonicalize(unsigned int irq);
+
#else
#define irq_canonicalize(irq) (irq)
#endif /* CONFIG_MMU */
asmlinkage void do_IRQ(int irq, struct pt_regs *regs);
+extern atomic_t irq_err_count;
#endif /* _M68K_IRQ_H_ */
diff --git a/arch/m68k/kernel/Makefile b/arch/m68k/kernel/Makefile
index e7f0f2e..1414257 100644
--- a/arch/m68k/kernel/Makefile
+++ b/arch/m68k/kernel/Makefile
@@ -9,13 +9,18 @@ extra-y += vmlinux.lds
obj-y := entry.o m68k_ksyms.o module.o process.o ptrace.o setup.o signal.o \
sys_m68k.o syscalltable.o time.o traps.o
-obj-$(CONFIG_MMU) += ints.o devres.o vectors.o
+obj-$(CONFIG_MMU) += ints.o vectors.o
devres-$(CONFIG_MMU) = ../../../kernel/irq/devres.o
ifndef CONFIG_MMU_SUN3
obj-y += dma.o
endif
ifndef CONFIG_MMU
-obj-y += init_task.o irq.o
+obj-y += init_task.o
+endif
+ifdef CONFIG_GENERIC_HARDIRQS
+obj-y += irq.o
+else
+obj-y += devres.o
endif
diff --git a/arch/m68k/kernel/ints.c b/arch/m68k/kernel/ints.c
index f6a4698..cea439f 100644
--- a/arch/m68k/kernel/ints.c
+++ b/arch/m68k/kernel/ints.c
@@ -31,6 +31,7 @@ extern u32 auto_irqhandler_fixup[];
extern u32 user_irqhandler_fixup[];
extern u16 user_irqvec_fixup[];
+#ifndef CONFIG_GENERIC_HARDIRQS
/* table for system interrupt handlers */
static struct irq_data *irq_list[NR_IRQS];
static struct irq_chip *irq_chip[NR_IRQS];
@@ -41,6 +42,8 @@ static inline int irq_set_chip(unsigned int irq, struct irq_chip *chip)
irq_chip[irq] = chip;
return 0;
}
+#define irq_set_chip_and_handler(irq, chip, dummy) irq_set_chip(irq, chip)
+#endif /* !CONFIG_GENERIC_HARDIRQS */
static int m68k_first_user_vec;
@@ -56,8 +59,10 @@ static struct irq_chip user_irq_chip = {
.irq_shutdown = m68k_irq_shutdown,
};
+#ifndef CONFIG_GENERIC_HARDIRQS
#define NUM_IRQ_NODES 100
static struct irq_data nodes[NUM_IRQ_NODES];
+#endif /* !CONFIG_GENERIC_HARDIRQS */
/*
* void init_IRQ(void)
@@ -81,7 +86,7 @@ void __init init_IRQ(void)
}
for (i = IRQ_AUTO_1; i <= IRQ_AUTO_7; i++)
- irq_set_chip(i, &auto_irq_chip);
+ irq_set_chip_and_handler(i, &auto_irq_chip, handle_simple_irq);
mach_init_IRQ();
}
@@ -128,6 +133,35 @@ void __init m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt,
flush_icache();
}
+#ifdef CONFIG_GENERIC_HARDIRQS
+
+/**
+ * m68k_setup_irq_controller
+ * @chip: irq chip which controls specified irq
+ * @handle: flow handler which handles specified irq
+ * @irq: first irq to be managed by the controller
+ * @cnt: number of irqs to be managed by the controller
+ *
+ * Change the controller for the specified range of irq, which will be used to
+ * manage these irq. auto/user irq already have a default controller, which can
+ * be changed as well, but the controller probably should use m68k_irq_startup/
+ * m68k_irq_shutdown.
+ */
+void m68k_setup_irq_controller(struct irq_chip *chip,
+ irq_flow_handler_t handle, unsigned int irq,
+ unsigned int cnt)
+{
+ int i;
+
+ for (i = 0; i < cnt; i++) {
+ irq_set_chip(irq + i, chip);
+ if (handle)
+ irq_set_handler(irq + i, handle);
+ }
+}
+
+#else /* !CONFIG_GENERIC_HARDIRQS */
+
/**
* m68k_setup_irq_chip
* @contr: irq controller which controls specified irq
@@ -316,6 +350,8 @@ void disable_irq_nosync(unsigned int irq) __attribute__((alias("disable_irq")));
EXPORT_SYMBOL(disable_irq_nosync);
+#endif /* !CONFIG_GENERIC_HARDIRQS */
+
unsigned int m68k_irq_startup_irq(unsigned int irq)
{
if (irq <= IRQ_AUTO_7)
@@ -341,6 +377,8 @@ void m68k_irq_shutdown(struct irq_data *data)
}
+#ifndef CONFIG_GENERIC_HARDIRQS
+
/*
* Do we need these probe functions on the m68k?
*
@@ -367,6 +405,7 @@ int probe_irq_off (unsigned long irqs)
}
EXPORT_SYMBOL(probe_irq_off);
+#endif /* CONFIG_GENERIC_HARDIRQS */
unsigned int irq_canonicalize(unsigned int irq)
{
@@ -379,6 +418,7 @@ unsigned int irq_canonicalize(unsigned int irq)
EXPORT_SYMBOL(irq_canonicalize);
+#ifndef CONFIG_GENERIC_HARDIRQS
void generic_handle_irq(unsigned int irq)
{
struct irq_data *node;
@@ -428,3 +468,13 @@ void init_irq_proc(void)
/* Insert /proc/irq driver here */
}
#endif
+
+#else /* CONFIG_GENERIC_HARDIRQS */
+
+asmlinkage void handle_badint(struct pt_regs *regs)
+{
+ atomic_inc(&irq_err_count);
+ pr_warn("unexpected interrupt from %u\n", regs->vector);
+}
+
+#endif /* CONFIG_GENERIC_HARDIRQS */
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 12/27] m68k/atari: Convert Atari to genirq
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
` (10 preceding siblings ...)
2011-10-30 12:48 ` [PATCH 11/27] m68k/irq: Add genirq support Geert Uytterhoeven
@ 2011-10-30 12:48 ` Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 13/27] m68k/atari: Remove code and comments about different irq types Geert Uytterhoeven
` (15 subsequent siblings)
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
[v1] Acked-by: Thomas Gleixner <tglx@linutronix.de>
---
arch/m68k/Kconfig | 1 -
1 files changed, 0 insertions(+), 1 deletions(-)
diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig
index a7597e1..9d60f40 100644
--- a/arch/m68k/Kconfig
+++ b/arch/m68k/Kconfig
@@ -88,7 +88,6 @@ config USE_GENERIC_HARDIRQS
bool "Use genirq"
depends on MMU
depends on !AMIGA
- depends on !ATARI
depends on !MAC
depends on !APOLLO
depends on !MVME147
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 13/27] m68k/atari: Remove code and comments about different irq types
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
` (11 preceding siblings ...)
2011-10-30 12:48 ` [PATCH 12/27] m68k/atari: Convert Atari to genirq Geert Uytterhoeven
@ 2011-10-30 12:48 ` Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 14/27] m68k/amiga: Refactor amiints.c Geert Uytterhoeven
` (14 subsequent siblings)
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven
This code was obsoleted during the irq restructuring in 2006.
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
---
arch/m68k/atari/ataints.c | 236 ---------------------------------------------
1 files changed, 0 insertions(+), 236 deletions(-)
diff --git a/arch/m68k/atari/ataints.c b/arch/m68k/atari/ataints.c
index 6149ff9..af54455 100644
--- a/arch/m68k/atari/ataints.c
+++ b/arch/m68k/atari/ataints.c
@@ -60,244 +60,8 @@
* <asm/atariints.h>): Autovector interrupts are 1..7, then follow ST-MFP,
* TT-MFP, SCC, and finally VME interrupts. Vector numbers for the latter can
* be allocated by atari_register_vme_int().
- *
- * Each interrupt can be of three types:
- *
- * - SLOW: The handler runs with all interrupts enabled, except the one it
- * was called by (to avoid reentering). This should be the usual method.
- * But it is currently possible only for MFP ints, since only the MFP
- * offers an easy way to mask interrupts.
- *
- * - FAST: The handler runs with all interrupts disabled. This should be used
- * only for really fast handlers, that just do actions immediately
- * necessary, and let the rest do a bottom half or task queue.
- *
- * - PRIORITIZED: The handler can be interrupted by higher-level ints
- * (greater IPL, no MFP priorities!). This is the method of choice for ints
- * which should be slow, but are not from a MFP.
- *
- * The feature of more than one handler for one int source is still there, but
- * only applicable if all handers are of the same type. To not slow down
- * processing of ints with only one handler by the chaining feature, the list
- * calling function atari_call_irq_list() is only plugged in at the time the
- * second handler is registered.
- *
- * Implementation notes: For fast-as-possible int handling, there are separate
- * entry points for each type (slow/fast/prio). The assembler handler calls
- * the irq directly in the usual case, no C wrapper is involved. In case of
- * multiple handlers, atari_call_irq_list() is registered as handler and calls
- * in turn the real irq's. To ease access from assembler level to the irq
- * function pointer and accompanying data, these two are stored in a separate
- * array, irq_handler[]. The rest of data (type, name) are put into a second
- * array, irq_param, that is accessed from C only. For each slow interrupt (32
- * in all) there are separate handler functions, which makes it possible to
- * hard-code the MFP register address and value, are necessary to mask the
- * int. If there'd be only one generic function, lots of calculations would be
- * needed to determine MFP register and int mask from the vector number :-(
- *
- * Furthermore, slow ints may not lower the IPL below its previous value
- * (before the int happened). This is needed so that an int of class PRIO, on
- * that this int may be stacked, cannot be reentered. This feature is
- * implemented as follows: If the stack frame format is 1 (throwaway), the int
- * is not stacked, and the IPL is anded with 0xfbff, resulting in a new level
- * 2, which still blocks the HSYNC, but no interrupts of interest. If the
- * frame format is 0, the int is nested, and the old IPL value can be found in
- * the sr copy in the frame.
*/
-#if 0
-
-#define NUM_INT_SOURCES (8 + NUM_ATARI_SOURCES)
-
-typedef void (*asm_irq_handler)(void);
-
-struct irqhandler {
- irqreturn_t (*handler)(int, void *, struct pt_regs *);
- void *dev_id;
-};
-
-struct irqparam {
- unsigned long flags;
- const char *devname;
-};
-
-/*
- * Array with irq's and their parameter data. This array is accessed from low
- * level assembler code, so an element size of 8 allows usage of index scaling
- * addressing mode.
- */
-static struct irqhandler irq_handler[NUM_INT_SOURCES];
-
-/*
- * This array hold the rest of parameters of int handlers: type
- * (slow,fast,prio) and the name of the handler. These values are only
- * accessed from C
- */
-static struct irqparam irq_param[NUM_INT_SOURCES];
-
-/* check for valid int number (complex, sigh...) */
-#define IS_VALID_INTNO(n) \
- ((n) > 0 && \
- /* autovec and ST-MFP ok anyway */ \
- (((n) < TTMFP_SOURCE_BASE) || \
- /* TT-MFP ok if present */ \
- ((n) >= TTMFP_SOURCE_BASE && (n) < SCC_SOURCE_BASE && \
- ATARIHW_PRESENT(TT_MFP)) || \
- /* SCC ok if present and number even */ \
- ((n) >= SCC_SOURCE_BASE && (n) < VME_SOURCE_BASE && \
- !((n) & 1) && ATARIHW_PRESENT(SCC)) || \
- /* greater numbers ok if they are registered VME vectors */ \
- ((n) >= VME_SOURCE_BASE && (n) < VME_SOURCE_BASE + VME_MAX_SOURCES && \
- free_vme_vec_bitmap & (1 << ((n) - VME_SOURCE_BASE)))))
-
-
-/*
- * Here start the assembler entry points for interrupts
- */
-
-#define IRQ_NAME(nr) atari_slow_irq_##nr##_handler(void)
-
-#define BUILD_SLOW_IRQ(n) \
-asmlinkage void IRQ_NAME(n); \
-/* Dummy function to allow asm with operands. */ \
-void atari_slow_irq_##n##_dummy (void) { \
-__asm__ (__ALIGN_STR "\n" \
-"atari_slow_irq_" #n "_handler:\t" \
-" addl %6,%5\n" /* preempt_count() += HARDIRQ_OFFSET */ \
- SAVE_ALL_INT "\n" \
- GET_CURRENT(%%d0) "\n" \
-" andb #~(1<<(%c3&7)),%a4:w\n" /* mask this interrupt */ \
- /* get old IPL from stack frame */ \
-" bfextu %%sp@(%c2){#5,#3},%%d0\n" \
-" movew %%sr,%%d1\n" \
-" bfins %%d0,%%d1{#21,#3}\n" \
-" movew %%d1,%%sr\n" /* set IPL = previous value */ \
-" addql #1,%a0\n" \
-" lea %a1,%%a0\n" \
-" pea %%sp@\n" /* push addr of frame */ \
-" movel %%a0@(4),%%sp@-\n" /* push handler data */ \
-" pea (%c3+8)\n" /* push int number */ \
-" movel %%a0@,%%a0\n" \
-" jbsr %%a0@\n" /* call the handler */ \
-" addql #8,%%sp\n" \
-" addql #4,%%sp\n" \
-" orw #0x0600,%%sr\n" \
-" andw #0xfeff,%%sr\n" /* set IPL = 6 again */ \
-" orb #(1<<(%c3&7)),%a4:w\n" /* now unmask the int again */ \
-" jbra ret_from_interrupt\n" \
- : : "i" (&kstat_cpu(0).irqs[n+8]), "i" (&irq_handler[n+8]), \
- "n" (PT_OFF_SR), "n" (n), \
- "i" (n & 8 ? (n & 16 ? &tt_mfp.int_mk_a : &st_mfp.int_mk_a) \
- : (n & 16 ? &tt_mfp.int_mk_b : &st_mfp.int_mk_b)), \
- "m" (preempt_count()), "di" (HARDIRQ_OFFSET) \
-); \
- for (;;); /* fake noreturn */ \
-}
-
-BUILD_SLOW_IRQ(0);
-BUILD_SLOW_IRQ(1);
-BUILD_SLOW_IRQ(2);
-BUILD_SLOW_IRQ(3);
-BUILD_SLOW_IRQ(4);
-BUILD_SLOW_IRQ(5);
-BUILD_SLOW_IRQ(6);
-BUILD_SLOW_IRQ(7);
-BUILD_SLOW_IRQ(8);
-BUILD_SLOW_IRQ(9);
-BUILD_SLOW_IRQ(10);
-BUILD_SLOW_IRQ(11);
-BUILD_SLOW_IRQ(12);
-BUILD_SLOW_IRQ(13);
-BUILD_SLOW_IRQ(14);
-BUILD_SLOW_IRQ(15);
-BUILD_SLOW_IRQ(16);
-BUILD_SLOW_IRQ(17);
-BUILD_SLOW_IRQ(18);
-BUILD_SLOW_IRQ(19);
-BUILD_SLOW_IRQ(20);
-BUILD_SLOW_IRQ(21);
-BUILD_SLOW_IRQ(22);
-BUILD_SLOW_IRQ(23);
-BUILD_SLOW_IRQ(24);
-BUILD_SLOW_IRQ(25);
-BUILD_SLOW_IRQ(26);
-BUILD_SLOW_IRQ(27);
-BUILD_SLOW_IRQ(28);
-BUILD_SLOW_IRQ(29);
-BUILD_SLOW_IRQ(30);
-BUILD_SLOW_IRQ(31);
-
-asm_irq_handler slow_handlers[32] = {
- [0] = atari_slow_irq_0_handler,
- [1] = atari_slow_irq_1_handler,
- [2] = atari_slow_irq_2_handler,
- [3] = atari_slow_irq_3_handler,
- [4] = atari_slow_irq_4_handler,
- [5] = atari_slow_irq_5_handler,
- [6] = atari_slow_irq_6_handler,
- [7] = atari_slow_irq_7_handler,
- [8] = atari_slow_irq_8_handler,
- [9] = atari_slow_irq_9_handler,
- [10] = atari_slow_irq_10_handler,
- [11] = atari_slow_irq_11_handler,
- [12] = atari_slow_irq_12_handler,
- [13] = atari_slow_irq_13_handler,
- [14] = atari_slow_irq_14_handler,
- [15] = atari_slow_irq_15_handler,
- [16] = atari_slow_irq_16_handler,
- [17] = atari_slow_irq_17_handler,
- [18] = atari_slow_irq_18_handler,
- [19] = atari_slow_irq_19_handler,
- [20] = atari_slow_irq_20_handler,
- [21] = atari_slow_irq_21_handler,
- [22] = atari_slow_irq_22_handler,
- [23] = atari_slow_irq_23_handler,
- [24] = atari_slow_irq_24_handler,
- [25] = atari_slow_irq_25_handler,
- [26] = atari_slow_irq_26_handler,
- [27] = atari_slow_irq_27_handler,
- [28] = atari_slow_irq_28_handler,
- [29] = atari_slow_irq_29_handler,
- [30] = atari_slow_irq_30_handler,
- [31] = atari_slow_irq_31_handler
-};
-
-asmlinkage void atari_fast_irq_handler( void );
-asmlinkage void atari_prio_irq_handler( void );
-
-/* Dummy function to allow asm with operands. */
-void atari_fast_prio_irq_dummy (void) {
-__asm__ (__ALIGN_STR "\n"
-"atari_fast_irq_handler:\n\t"
- "orw #0x700,%%sr\n" /* disable all interrupts */
-"atari_prio_irq_handler:\n\t"
- "addl %3,%2\n\t" /* preempt_count() += HARDIRQ_OFFSET */
- SAVE_ALL_INT "\n\t"
- GET_CURRENT(%%d0) "\n\t"
- /* get vector number from stack frame and convert to source */
- "bfextu %%sp@(%c1){#4,#10},%%d0\n\t"
- "subw #(0x40-8),%%d0\n\t"
- "jpl 1f\n\t"
- "addw #(0x40-8-0x18),%%d0\n"
- "1:\tlea %a0,%%a0\n\t"
- "addql #1,%%a0@(%%d0:l:4)\n\t"
- "lea irq_handler,%%a0\n\t"
- "lea %%a0@(%%d0:l:8),%%a0\n\t"
- "pea %%sp@\n\t" /* push frame address */
- "movel %%a0@(4),%%sp@-\n\t" /* push handler data */
- "movel %%d0,%%sp@-\n\t" /* push int number */
- "movel %%a0@,%%a0\n\t"
- "jsr %%a0@\n\t" /* and call the handler */
- "addql #8,%%sp\n\t"
- "addql #4,%%sp\n\t"
- "jbra ret_from_interrupt"
- : : "i" (&kstat_cpu(0).irqs), "n" (PT_OFF_FORMATVEC),
- "m" (preempt_count()), "di" (HARDIRQ_OFFSET)
-);
- for (;;);
-}
-#endif
-
/*
* Bitmap for free interrupt vector numbers
* (new vectors starting from 0x70 can be allocated by
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 14/27] m68k/amiga: Refactor amiints.c
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
` (12 preceding siblings ...)
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 ` Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 15/27] m68k/amiga: Convert Amiga to genirq Geert Uytterhoeven
` (13 subsequent siblings)
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven
- Remove filename in comments,
- Reorder functions so we no longer need forward declarations.
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
---
arch/m68k/amiga/amiints.c | 98 +++++++++++++++++++++-----------------------
1 files changed, 47 insertions(+), 51 deletions(-)
diff --git a/arch/m68k/amiga/amiints.c b/arch/m68k/amiga/amiints.c
index e5f3033..c8f9eac 100644
--- a/arch/m68k/amiga/amiints.c
+++ b/arch/m68k/amiga/amiints.c
@@ -1,5 +1,5 @@
/*
- * linux/arch/m68k/amiga/amiints.c -- Amiga Linux interrupt handling code
+ * Amiga Linux interrupt handling code
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file COPYING in the main directory of this archive
@@ -16,56 +16,6 @@
#include <asm/amigaints.h>
#include <asm/amipcmcia.h>
-static void amiga_irq_enable(struct irq_data *data);
-static void amiga_irq_disable(struct irq_data *data);
-static irqreturn_t ami_int1(int irq, void *dev_id);
-static irqreturn_t ami_int3(int irq, void *dev_id);
-static irqreturn_t ami_int4(int irq, void *dev_id);
-static irqreturn_t ami_int5(int irq, void *dev_id);
-
-static struct irq_chip amiga_irq_chip = {
- .name = "amiga",
- .irq_enable = amiga_irq_enable,
- .irq_disable = amiga_irq_disable,
-};
-
-/*
- * void amiga_init_IRQ(void)
- *
- * Parameters: None
- *
- * Returns: Nothing
- *
- * This function should be called during kernel startup to initialize
- * the amiga IRQ handling routines.
- */
-
-void __init amiga_init_IRQ(void)
-{
- 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))
- pr_err("Couldn't register int%d\n", 3);
- if (request_irq(IRQ_AUTO_4, ami_int4, 0, "int4", NULL))
- pr_err("Couldn't register int%d\n", 4);
- if (request_irq(IRQ_AUTO_5, ami_int5, 0, "int5", NULL))
- pr_err("Couldn't register int%d\n", 5);
-
- m68k_setup_irq_controller(&amiga_irq_chip, handle_simple_irq, IRQ_USER,
- AMI_STD_IRQS);
-
- /* turn off PCMCIA interrupts */
- if (AMIGAHW_PRESENT(PCMCIA))
- gayle.inten = GAYLE_IRQ_IDE;
-
- /* turn off all interrupts and enable the master interrupt bit */
- amiga_custom.intena = 0x7fff;
- amiga_custom.intreq = 0x7fff;
- amiga_custom.intena = IF_SETCLR | IF_INTEN;
-
- cia_init_IRQ(&ciaa_base);
- cia_init_IRQ(&ciab_base);
-}
/*
* Enable/disable a particular machine specific interrupt source.
@@ -84,6 +34,13 @@ static void amiga_irq_disable(struct irq_data *data)
amiga_custom.intena = 1 << (data->irq - IRQ_USER);
}
+static struct irq_chip amiga_irq_chip = {
+ .name = "amiga",
+ .irq_enable = amiga_irq_enable,
+ .irq_disable = amiga_irq_disable,
+};
+
+
/*
* The builtin Amiga hardware interrupt handlers.
*/
@@ -183,3 +140,42 @@ static irqreturn_t ami_int5(int irq, void *dev_id)
}
return IRQ_HANDLED;
}
+
+
+/*
+ * void amiga_init_IRQ(void)
+ *
+ * Parameters: None
+ *
+ * Returns: Nothing
+ *
+ * This function should be called during kernel startup to initialize
+ * the amiga IRQ handling routines.
+ */
+
+void __init amiga_init_IRQ(void)
+{
+ 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))
+ pr_err("Couldn't register int%d\n", 3);
+ if (request_irq(IRQ_AUTO_4, ami_int4, 0, "int4", NULL))
+ pr_err("Couldn't register int%d\n", 4);
+ if (request_irq(IRQ_AUTO_5, ami_int5, 0, "int5", NULL))
+ pr_err("Couldn't register int%d\n", 5);
+
+ m68k_setup_irq_controller(&amiga_irq_chip, handle_simple_irq, IRQ_USER,
+ AMI_STD_IRQS);
+
+ /* turn off PCMCIA interrupts */
+ if (AMIGAHW_PRESENT(PCMCIA))
+ gayle.inten = GAYLE_IRQ_IDE;
+
+ /* turn off all interrupts and enable the master interrupt bit */
+ amiga_custom.intena = 0x7fff;
+ amiga_custom.intreq = 0x7fff;
+ amiga_custom.intena = IF_SETCLR | IF_INTEN;
+
+ cia_init_IRQ(&ciaa_base);
+ cia_init_IRQ(&ciab_base);
+}
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 15/27] m68k/amiga: Convert Amiga to genirq
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
` (13 preceding siblings ...)
2011-10-30 12:48 ` [PATCH 14/27] m68k/amiga: Refactor amiints.c Geert Uytterhoeven
@ 2011-10-30 12:48 ` Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 16/27] m68k/amiga: Optimize interrupts using chain handlers Geert Uytterhoeven
` (12 subsequent siblings)
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
---
arch/m68k/Kconfig | 1 -
arch/m68k/amiga/amiints.c | 3 +++
2 files changed, 3 insertions(+), 1 deletions(-)
diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig
index 9d60f40..9000921 100644
--- a/arch/m68k/Kconfig
+++ b/arch/m68k/Kconfig
@@ -87,7 +87,6 @@ config MMU_SUN3
config USE_GENERIC_HARDIRQS
bool "Use genirq"
depends on MMU
- depends on !AMIGA
depends on !MAC
depends on !APOLLO
depends on !MVME147
diff --git a/arch/m68k/amiga/amiints.c b/arch/m68k/amiga/amiints.c
index c8f9eac..c3da534 100644
--- a/arch/m68k/amiga/amiints.c
+++ b/arch/m68k/amiga/amiints.c
@@ -9,6 +9,9 @@
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/errno.h>
+#ifdef CONFIG_GENERIC_HARDIRQS
+#include <linux/irq.h>
+#endif
#include <asm/irq.h>
#include <asm/traps.h>
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 16/27] m68k/amiga: Optimize interrupts using chain handlers
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
` (14 preceding siblings ...)
2011-10-30 12:48 ` [PATCH 15/27] m68k/amiga: Convert Amiga to genirq Geert Uytterhoeven
@ 2011-10-30 12:48 ` Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 17/27] m68k/mac: Convert Mac to genirq Geert Uytterhoeven
` (11 subsequent siblings)
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven
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
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 17/27] m68k/mac: Convert Mac to genirq
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
` (15 preceding siblings ...)
2011-10-30 12:48 ` [PATCH 16/27] m68k/amiga: Optimize interrupts using chain handlers Geert Uytterhoeven
@ 2011-10-30 12:48 ` Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 18/27] m68k/mac: Optimize interrupts using chain handlers Geert Uytterhoeven
` (10 subsequent siblings)
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
---
arch/m68k/Kconfig | 1 -
arch/m68k/mac/baboon.c | 3 +++
arch/m68k/mac/oss.c | 3 +++
arch/m68k/mac/psc.c | 3 +++
arch/m68k/mac/via.c | 3 +++
5 files changed, 12 insertions(+), 1 deletions(-)
diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig
index 9000921..9ba1a89 100644
--- a/arch/m68k/Kconfig
+++ b/arch/m68k/Kconfig
@@ -87,7 +87,6 @@ config MMU_SUN3
config USE_GENERIC_HARDIRQS
bool "Use genirq"
depends on MMU
- depends on !MAC
depends on !APOLLO
depends on !MVME147
depends on !MVME16x
diff --git a/arch/m68k/mac/baboon.c b/arch/m68k/mac/baboon.c
index f264791..ff11746 100644
--- a/arch/m68k/mac/baboon.c
+++ b/arch/m68k/mac/baboon.c
@@ -11,6 +11,9 @@
#include <linux/mm.h>
#include <linux/delay.h>
#include <linux/init.h>
+#ifdef CONFIG_GENERIC_HARDIRQS
+#include <linux/irq.h>
+#endif
#include <asm/traps.h>
#include <asm/bootinfo.h>
diff --git a/arch/m68k/mac/oss.c b/arch/m68k/mac/oss.c
index 1eb60f0..ed95270 100644
--- a/arch/m68k/mac/oss.c
+++ b/arch/m68k/mac/oss.c
@@ -19,6 +19,9 @@
#include <linux/mm.h>
#include <linux/delay.h>
#include <linux/init.h>
+#ifdef CONFIG_GENERIC_HARDIRQS
+#include <linux/irq.h>
+#endif
#include <asm/bootinfo.h>
#include <asm/macintosh.h>
diff --git a/arch/m68k/mac/psc.c b/arch/m68k/mac/psc.c
index 26c2b65..0a34b7a 100644
--- a/arch/m68k/mac/psc.c
+++ b/arch/m68k/mac/psc.c
@@ -18,6 +18,9 @@
#include <linux/mm.h>
#include <linux/delay.h>
#include <linux/init.h>
+#ifdef CONFIG_GENERIC_HARDIRQS
+#include <linux/irq.h>
+#endif
#include <asm/traps.h>
#include <asm/bootinfo.h>
diff --git a/arch/m68k/mac/via.c b/arch/m68k/mac/via.c
index af9ed33..bde156c 100644
--- a/arch/m68k/mac/via.c
+++ b/arch/m68k/mac/via.c
@@ -28,6 +28,9 @@
#include <linux/delay.h>
#include <linux/init.h>
#include <linux/module.h>
+#ifdef CONFIG_GENERIC_HARDIRQS
+#include <linux/irq.h>
+#endif
#include <asm/bootinfo.h>
#include <asm/macintosh.h>
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 18/27] m68k/mac: Optimize interrupts using chain handlers
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
` (16 preceding siblings ...)
2011-10-30 12:48 ` [PATCH 17/27] m68k/mac: Convert Mac to genirq Geert Uytterhoeven
@ 2011-10-30 12:48 ` Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 19/27] m68k/hp300: Convert HP9000/300 and HP9000/400 to genirq Geert Uytterhoeven
` (9 subsequent siblings)
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
---
arch/m68k/mac/baboon.c | 38 +++++++++++++
arch/m68k/mac/oss.c | 106 +++++++++++++++++++++++++++++-------
arch/m68k/mac/psc.c | 74 +++++++++++++++++++------
arch/m68k/mac/via.c | 143 +++++++++++++++++++++++++++++++++++++++---------
4 files changed, 298 insertions(+), 63 deletions(-)
diff --git a/arch/m68k/mac/baboon.c b/arch/m68k/mac/baboon.c
index ff11746..425144c 100644
--- a/arch/m68k/mac/baboon.c
+++ b/arch/m68k/mac/baboon.c
@@ -56,6 +56,39 @@ void __init baboon_init(void)
* Baboon interrupt handler. This works a lot like a VIA.
*/
+#ifdef CONFIG_GENERIC_HARDIRQS
+static void baboon_irq(unsigned int irq, struct irq_desc *desc)
+{
+ int irq_bit, irq_num;
+ unsigned char events;
+
+#ifdef DEBUG_IRQS
+ printk("baboon_irq: mb_control %02X mb_ifr %02X mb_status %02X\n",
+ (uint) baboon->mb_control, (uint) baboon->mb_ifr,
+ (uint) baboon->mb_status);
+#endif
+
+ events = baboon->mb_ifr & 0x07;
+ if (!events)
+ return;
+
+ irq_num = IRQ_BABOON_0;
+ irq_bit = 1;
+ do {
+ if (events & irq_bit) {
+ baboon->mb_ifr &= ~irq_bit;
+ generic_handle_irq(irq_num);
+ }
+ irq_bit <<= 1;
+ irq_num++;
+ } while(events >= irq_bit);
+#if 0
+ if (baboon->mb_ifr & 0x02) macide_ack_intr(NULL);
+ /* for now we need to smash all interrupts */
+ baboon->mb_ifr &= ~events;
+#endif
+}
+#else
static irqreturn_t baboon_irq(int irq, void *dev_id)
{
int irq_bit, irq_num;
@@ -87,6 +120,7 @@ static irqreturn_t baboon_irq(int irq, void *dev_id)
#endif
return IRQ_HANDLED;
}
+#endif
/*
* Register the Baboon interrupt dispatcher on nubus slot $C.
@@ -95,8 +129,12 @@ static irqreturn_t baboon_irq(int irq, void *dev_id)
void __init baboon_register_interrupts(void)
{
baboon_disabled = 0;
+#ifdef CONFIG_GENERIC_HARDIRQS
+ irq_set_chained_handler(IRQ_NUBUS_C, baboon_irq);
+#else
if (request_irq(IRQ_NUBUS_C, baboon_irq, 0, "baboon", (void *)baboon))
pr_err("Couldn't register baboon interrupt\n");
+#endif
}
/*
diff --git a/arch/m68k/mac/oss.c b/arch/m68k/mac/oss.c
index ed95270..cc784c2 100644
--- a/arch/m68k/mac/oss.c
+++ b/arch/m68k/mac/oss.c
@@ -32,10 +32,11 @@
int oss_present;
volatile struct mac_oss *oss;
-static irqreturn_t oss_irq(int, void *);
-static irqreturn_t oss_nubus_irq(int, void *);
-
+#ifdef CONFIG_GENERIC_HARDIRQS
+extern void via1_irq(unsigned int irq, struct irq_desc *desc);
+#else
extern irqreturn_t via1_irq(int, void *);
+#endif
/*
* Initialize the OSS
@@ -63,23 +64,6 @@ void __init oss_init(void)
}
/*
- * Register the OSS and NuBus interrupt dispatchers.
- */
-
-void __init oss_register_interrupts(void)
-{
- if (request_irq(OSS_IRQLEV_SCSI, oss_irq, 0, "scsi", (void *)oss))
- pr_err("Couldn't register %s interrupt\n", "scsi");
- if (request_irq(OSS_IRQLEV_NUBUS, oss_nubus_irq, 0, "nubus",
- (void *)oss))
- pr_err("Couldn't register %s interrupt\n", "nubus");
- if (request_irq(OSS_IRQLEV_SOUND, oss_irq, 0, "sound", (void *)oss))
- pr_err("Couldn't register %s interrupt\n", "sound");
- if (request_irq(OSS_IRQLEV_VIA1, via1_irq, 0, "via1", (void *)via1))
- pr_err("Couldn't register %s interrupt\n", "via1");
-}
-
-/*
* Initialize OSS for Nubus access
*/
@@ -92,6 +76,34 @@ void __init oss_nubus_init(void)
* and SCSI; everything else is routed to its own autovector IRQ.
*/
+#ifdef CONFIG_GENERIC_HARDIRQS
+static void oss_irq(unsigned int irq, struct irq_desc *desc)
+{
+ int events;
+
+ events = oss->irq_pending & (OSS_IP_SOUND|OSS_IP_SCSI);
+ if (!events)
+ return;
+
+#ifdef DEBUG_IRQS
+ if ((console_loglevel == 10) && !(events & OSS_IP_SCSI)) {
+ printk("oss_irq: irq %u events = 0x%04X\n", irq,
+ (int) oss->irq_pending);
+ }
+#endif
+ /* FIXME: how do you clear a pending IRQ? */
+
+ if (events & OSS_IP_SOUND) {
+ oss->irq_pending &= ~OSS_IP_SOUND;
+ /* FIXME: call sound handler */
+ } else if (events & OSS_IP_SCSI) {
+ oss->irq_pending &= ~OSS_IP_SCSI;
+ generic_handle_irq(IRQ_MAC_SCSI);
+ } else {
+ /* FIXME: error check here? */
+ }
+}
+#else
static irqreturn_t oss_irq(int irq, void *dev_id)
{
int events;
@@ -119,6 +131,7 @@ static irqreturn_t oss_irq(int irq, void *dev_id)
}
return IRQ_HANDLED;
}
+#endif
/*
* Nubus IRQ handler, OSS style
@@ -126,6 +139,34 @@ static irqreturn_t oss_irq(int irq, void *dev_id)
* Unlike the VIA/RBV this is on its own autovector interrupt level.
*/
+#ifdef CONFIG_GENERIC_HARDIRQS
+static void oss_nubus_irq(unsigned int irq, struct irq_desc *desc)
+{
+ int events, irq_bit, i;
+
+ events = oss->irq_pending & OSS_IP_NUBUS;
+ if (!events)
+ return;
+
+#ifdef DEBUG_NUBUS_INT
+ if (console_loglevel > 7) {
+ printk("oss_nubus_irq: events = 0x%04X\n", events);
+ }
+#endif
+ /* There are only six slots on the OSS, not seven */
+
+ i = 6;
+ irq_bit = 0x40;
+ do {
+ --i;
+ irq_bit >>= 1;
+ if (events & irq_bit) {
+ oss->irq_pending &= ~irq_bit;
+ generic_handle_irq(NUBUS_SOURCE_BASE + i);
+ }
+ } while(events & (irq_bit - 1));
+}
+#else
static irqreturn_t oss_nubus_irq(int irq, void *dev_id)
{
int events, irq_bit, i;
@@ -153,6 +194,31 @@ static irqreturn_t oss_nubus_irq(int irq, void *dev_id)
} while(events & (irq_bit - 1));
return IRQ_HANDLED;
}
+#endif
+
+/*
+ * Register the OSS and NuBus interrupt dispatchers.
+ */
+
+void __init oss_register_interrupts(void)
+{
+#ifdef CONFIG_GENERIC_HARDIRQS
+ irq_set_chained_handler(OSS_IRQLEV_SCSI, oss_irq);
+ irq_set_chained_handler(OSS_IRQLEV_NUBUS, oss_nubus_irq);
+ irq_set_chained_handler(OSS_IRQLEV_SOUND, oss_irq);
+ irq_set_chained_handler(OSS_IRQLEV_VIA1, via1_irq);
+#else /* !CONFIG_GENERIC_HARDIRQS */
+ if (request_irq(OSS_IRQLEV_SCSI, oss_irq, 0, "scsi", (void *)oss))
+ pr_err("Couldn't register %s interrupt\n", "scsi");
+ if (request_irq(OSS_IRQLEV_NUBUS, oss_nubus_irq, 0, "nubus",
+ (void *)oss))
+ pr_err("Couldn't register %s interrupt\n", "nubus");
+ if (request_irq(OSS_IRQLEV_SOUND, oss_irq, 0, "sound", (void *)oss))
+ pr_err("Couldn't register %s interrupt\n", "sound");
+ if (request_irq(OSS_IRQLEV_VIA1, via1_irq, 0, "via1", (void *)via1))
+ pr_err("Couldn't register %s interrupt\n", "via1");
+#endif /* !CONFIG_GENERIC_HARDIRQS */
+}
/*
* Enable an OSS interrupt
diff --git a/arch/m68k/mac/psc.c b/arch/m68k/mac/psc.c
index 0a34b7a..52840b8 100644
--- a/arch/m68k/mac/psc.c
+++ b/arch/m68k/mac/psc.c
@@ -33,8 +33,6 @@
int psc_present;
volatile __u8 *psc;
-irqreturn_t psc_irq(int, void *);
-
/*
* Debugging dump, used in various places to see what's going on.
*/
@@ -115,26 +113,40 @@ void __init psc_init(void)
}
/*
- * Register the PSC interrupt dispatchers for autovector interrupts 3-6.
+ * PSC interrupt handler. It's a lot like the VIA interrupt handler.
*/
-void __init psc_register_interrupts(void)
+#ifdef CONFIG_GENERIC_HARDIRQS
+static void psc_irq(unsigned int irq, struct irq_desc *desc)
{
- if (request_irq(IRQ_AUTO_3, psc_irq, 0, "psc3", (void *) 0x30))
- pr_err("Couldn't register psc%d interrupt\n", 3);
- if (request_irq(IRQ_AUTO_4, psc_irq, 0, "psc4", (void *) 0x40))
- pr_err("Couldn't register psc%d interrupt\n", 4);
- if (request_irq(IRQ_AUTO_5, psc_irq, 0, "psc5", (void *) 0x50))
- pr_err("Couldn't register psc%d interrupt\n", 5);
- if (request_irq(IRQ_AUTO_6, psc_irq, 0, "psc6", (void *) 0x60))
- pr_err("Couldn't register psc%d interrupt\n", 6);
-}
+ unsigned int offset = (unsigned int)irq_desc_get_handler_data(desc);
+ int pIFR = pIFRbase + offset;
+ int pIER = pIERbase + offset;
+ int irq_num;
+ unsigned char irq_bit, events;
-/*
- * PSC interrupt handler. It's a lot like the VIA interrupt handler.
- */
+#ifdef DEBUG_IRQS
+ printk("psc_irq: irq %u pIFR = 0x%02X pIER = 0x%02X\n",
+ irq, (int) psc_read_byte(pIFR), (int) psc_read_byte(pIER));
+#endif
-irqreturn_t psc_irq(int irq, void *dev_id)
+ events = psc_read_byte(pIFR) & psc_read_byte(pIER) & 0xF;
+ if (!events)
+ return;
+
+ irq_num = irq << 3;
+ irq_bit = 1;
+ do {
+ if (events & irq_bit) {
+ psc_write_byte(pIFR, irq_bit);
+ generic_handle_irq(irq_num);
+ }
+ irq_num++;
+ irq_bit <<= 1;
+ } while (events >= irq_bit);
+}
+#else
+static irqreturn_t psc_irq(int irq, void *dev_id)
{
int pIFR = pIFRbase + ((int) dev_id);
int pIER = pIERbase + ((int) dev_id);
@@ -162,6 +174,34 @@ irqreturn_t psc_irq(int irq, void *dev_id)
} while (events >= irq_bit);
return IRQ_HANDLED;
}
+#endif
+
+/*
+ * Register the PSC interrupt dispatchers for autovector interrupts 3-6.
+ */
+
+void __init psc_register_interrupts(void)
+{
+#ifdef CONFIG_GENERIC_HARDIRQS
+ irq_set_chained_handler(IRQ_AUTO_3, psc_irq);
+ irq_set_handler_data(IRQ_AUTO_3, (void *)0x30);
+ irq_set_chained_handler(IRQ_AUTO_4, psc_irq);
+ irq_set_handler_data(IRQ_AUTO_4, (void *)0x40);
+ irq_set_chained_handler(IRQ_AUTO_5, psc_irq);
+ irq_set_handler_data(IRQ_AUTO_5, (void *)0x50);
+ irq_set_chained_handler(IRQ_AUTO_6, psc_irq);
+ irq_set_handler_data(IRQ_AUTO_6, (void *)0x60);
+#else /* !CONFIG_GENERIC_HARDIRQS */
+ if (request_irq(IRQ_AUTO_3, psc_irq, 0, "psc3", (void *) 0x30))
+ pr_err("Couldn't register psc%d interrupt\n", 3);
+ if (request_irq(IRQ_AUTO_4, psc_irq, 0, "psc4", (void *) 0x40))
+ pr_err("Couldn't register psc%d interrupt\n", 4);
+ if (request_irq(IRQ_AUTO_5, psc_irq, 0, "psc5", (void *) 0x50))
+ pr_err("Couldn't register psc%d interrupt\n", 5);
+ if (request_irq(IRQ_AUTO_6, psc_irq, 0, "psc6", (void *) 0x60))
+ pr_err("Couldn't register psc%d interrupt\n", 6);
+#endif /* !CONFIG_GENERIC_HARDIRQS */
+}
void psc_irq_enable(int irq) {
int irq_src = IRQ_SRC(irq);
diff --git a/arch/m68k/mac/via.c b/arch/m68k/mac/via.c
index bde156c..b8156ac 100644
--- a/arch/m68k/mac/via.c
+++ b/arch/m68k/mac/via.c
@@ -80,9 +80,6 @@ static int gIER,gIFR,gBufA,gBufB;
static u8 nubus_disabled;
void via_debug_dump(void);
-irqreturn_t via1_irq(int, void *);
-irqreturn_t via2_irq(int, void *);
-irqreturn_t via_nubus_irq(int, void *);
void via_irq_enable(int irq);
void via_irq_disable(int irq);
void via_irq_clear(int irq);
@@ -289,29 +286,6 @@ void __init via_init_clock(irq_handler_t func)
}
/*
- * Register the interrupt dispatchers for VIA or RBV machines only.
- */
-
-void __init via_register_interrupts(void)
-{
- if (via_alt_mapping) {
- if (request_irq(IRQ_AUTO_1, via1_irq, 0, "software",
- (void *)via1))
- pr_err("Couldn't register %s interrupt\n", "software");
- if (request_irq(IRQ_AUTO_6, via1_irq, 0, "via1", (void *)via1))
- pr_err("Couldn't register %s interrupt\n", "via1");
- } else {
- if (request_irq(IRQ_AUTO_1, via1_irq, 0, "via1", (void *)via1))
- pr_err("Couldn't register %s interrupt\n", "via1");
- }
- if (request_irq(IRQ_AUTO_2, via2_irq, 0, "via2", (void *)via2))
- pr_err("Couldn't register %s interrupt\n", "via2");
- if (request_irq(IRQ_MAC_NUBUS, via_nubus_irq, 0, "nubus",
- (void *)via2))
- pr_err("Couldn't register %s interrupt\n", "nubus");
-}
-
-/*
* Debugging dump, used in various places to see what's going on.
*/
@@ -443,6 +417,49 @@ void __init via_nubus_init(void)
* via6522.c :-), disable/pending masks added.
*/
+#ifdef CONFIG_GENERIC_HARDIRQS
+void via1_irq(unsigned int irq, struct irq_desc *desc)
+{
+ int irq_num;
+ unsigned char irq_bit, events;
+
+ events = via1[vIFR] & via1[vIER] & 0x7F;
+ if (!events)
+ return;
+
+ irq_num = VIA1_SOURCE_BASE;
+ irq_bit = 1;
+ do {
+ if (events & irq_bit) {
+ via1[vIFR] = irq_bit;
+ generic_handle_irq(irq_num);
+ }
+ ++irq_num;
+ irq_bit <<= 1;
+ } while (events >= irq_bit);
+}
+
+static void via2_irq(unsigned int irq, struct irq_desc *desc)
+{
+ int irq_num;
+ unsigned char irq_bit, events;
+
+ events = via2[gIFR] & via2[gIER] & 0x7F;
+ if (!events)
+ return;
+
+ irq_num = VIA2_SOURCE_BASE;
+ irq_bit = 1;
+ do {
+ if (events & irq_bit) {
+ via2[gIFR] = irq_bit | rbv_clear;
+ generic_handle_irq(irq_num);
+ }
+ ++irq_num;
+ irq_bit <<= 1;
+ } while (events >= irq_bit);
+}
+#else
irqreturn_t via1_irq(int irq, void *dev_id)
{
int irq_num;
@@ -486,12 +503,49 @@ irqreturn_t via2_irq(int irq, void *dev_id)
} while (events >= irq_bit);
return IRQ_HANDLED;
}
+#endif
/*
* Dispatch Nubus interrupts. We are called as a secondary dispatch by the
* VIA2 dispatcher as a fast interrupt handler.
*/
+#ifdef CONFIG_GENERIC_HARDIRQS
+void via_nubus_irq(unsigned int irq, struct irq_desc *desc)
+{
+ int slot_irq;
+ unsigned char slot_bit, events;
+
+ events = ~via2[gBufA] & 0x7F;
+ if (rbv_present)
+ events &= via2[rSIER];
+ else
+ events &= ~via2[vDirA];
+ if (!events)
+ return;
+
+ do {
+ slot_irq = IRQ_NUBUS_F;
+ slot_bit = 0x40;
+ do {
+ if (events & slot_bit) {
+ events &= ~slot_bit;
+ generic_handle_irq(slot_irq);
+ }
+ --slot_irq;
+ slot_bit >>= 1;
+ } while (events);
+
+ /* clear the CA1 interrupt and make certain there's no more. */
+ via2[gIFR] = 0x02 | rbv_clear;
+ events = ~via2[gBufA] & 0x7F;
+ if (rbv_present)
+ events &= via2[rSIER];
+ else
+ events &= ~via2[vDirA];
+ } while (events);
+}
+#else
irqreturn_t via_nubus_irq(int irq, void *dev_id)
{
int slot_irq;
@@ -527,6 +581,43 @@ irqreturn_t via_nubus_irq(int irq, void *dev_id)
} while (events);
return IRQ_HANDLED;
}
+#endif
+
+/*
+ * Register the interrupt dispatchers for VIA or RBV machines only.
+ */
+
+void __init via_register_interrupts(void)
+{
+#ifdef CONFIG_GENERIC_HARDIRQS
+ if (via_alt_mapping) {
+ /* software interrupt */
+ irq_set_chained_handler(IRQ_AUTO_1, via1_irq);
+ /* via1 interrupt */
+ irq_set_chained_handler(IRQ_AUTO_6, via1_irq);
+ } else {
+ irq_set_chained_handler(IRQ_AUTO_1, via1_irq);
+ }
+ irq_set_chained_handler(IRQ_AUTO_2, via2_irq);
+ irq_set_chained_handler(IRQ_MAC_NUBUS, via_nubus_irq);
+#else
+ if (via_alt_mapping) {
+ if (request_irq(IRQ_AUTO_1, via1_irq, 0, "software",
+ (void *)via1))
+ pr_err("Couldn't register %s interrupt\n", "software");
+ if (request_irq(IRQ_AUTO_6, via1_irq, 0, "via1", (void *)via1))
+ pr_err("Couldn't register %s interrupt\n", "via1");
+ } else {
+ if (request_irq(IRQ_AUTO_1, via1_irq, 0, "via1", (void *)via1))
+ pr_err("Couldn't register %s interrupt\n", "via1");
+ }
+ if (request_irq(IRQ_AUTO_2, via2_irq, 0, "via2", (void *)via2))
+ pr_err("Couldn't register %s interrupt\n", "via2");
+ if (request_irq(IRQ_MAC_NUBUS, via_nubus_irq, 0, "nubus",
+ (void *)via2))
+ pr_err("Couldn't register %s interrupt\n", "nubus");
+#endif
+}
void via_irq_enable(int irq) {
int irq_src = IRQ_SRC(irq);
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 19/27] m68k/hp300: Convert HP9000/300 and HP9000/400 to genirq
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
` (17 preceding siblings ...)
2011-10-30 12:48 ` [PATCH 18/27] m68k/mac: Optimize interrupts using chain handlers Geert Uytterhoeven
@ 2011-10-30 12:48 ` Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 20/27] m68k/vme: Convert VME " Geert Uytterhoeven
` (8 subsequent siblings)
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k
Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven, Philip Blundell
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Philip Blundell <philb@gnu.org>
---
arch/m68k/Kconfig | 1 -
1 files changed, 0 insertions(+), 1 deletions(-)
diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig
index 9ba1a89..e4bd0c9 100644
--- a/arch/m68k/Kconfig
+++ b/arch/m68k/Kconfig
@@ -91,7 +91,6 @@ config USE_GENERIC_HARDIRQS
depends on !MVME147
depends on !MVME16x
depends on !BVME6000
- depends on !HP300
depends on !SUN3X
depends on !Q40
depends on !SUN3
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 20/27] m68k/vme: Convert VME to genirq
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
` (18 preceding siblings ...)
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 ` Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 21/27] m68k/apollo: Convert Apollo " Geert Uytterhoeven
` (7 subsequent siblings)
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven, Richard Hirst
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Richard Hirst <rhirst@parisc-linux.org>
---
arch/m68k/Kconfig | 3 ---
1 files changed, 0 insertions(+), 3 deletions(-)
diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig
index e4bd0c9..8ae37a8 100644
--- a/arch/m68k/Kconfig
+++ b/arch/m68k/Kconfig
@@ -88,9 +88,6 @@ config USE_GENERIC_HARDIRQS
bool "Use genirq"
depends on MMU
depends on !APOLLO
- depends on !MVME147
- depends on !MVME16x
- depends on !BVME6000
depends on !SUN3X
depends on !Q40
depends on !SUN3
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 21/27] m68k/apollo: Convert Apollo to genirq
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
` (19 preceding siblings ...)
2011-10-30 12:48 ` [PATCH 20/27] m68k/vme: Convert VME " Geert Uytterhoeven
@ 2011-10-30 12:48 ` Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 22/27] m68k/sun3: Use the kstat_irqs_cpu() wrapper Geert Uytterhoeven
` (6 subsequent siblings)
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k
Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven,
Peter De Schrijver
Replace the custom user vector interrupt handler that calls do_IRQ() and
does an EOI by handle_fasteoi_irq().
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Peter De Schrijver <p2@debian.org>
---
arch/m68k/Kconfig | 1 -
arch/m68k/apollo/dn_ints.c | 25 +++++++++++++++++++++++--
2 files changed, 23 insertions(+), 3 deletions(-)
diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig
index 8ae37a8..f2dc708 100644
--- a/arch/m68k/Kconfig
+++ b/arch/m68k/Kconfig
@@ -87,7 +87,6 @@ config MMU_SUN3
config USE_GENERIC_HARDIRQS
bool "Use genirq"
depends on MMU
- depends on !APOLLO
depends on !SUN3X
depends on !Q40
depends on !SUN3
diff --git a/arch/m68k/apollo/dn_ints.c b/arch/m68k/apollo/dn_ints.c
index 4b76431..fc190b3 100644
--- a/arch/m68k/apollo/dn_ints.c
+++ b/arch/m68k/apollo/dn_ints.c
@@ -1,9 +1,14 @@
#include <linux/interrupt.h>
-
+#ifdef CONFIG_GENERIC_HARDIRQS
+#include <linux/irq.h>
+#else
#include <asm/irq.h>
+#endif
+
#include <asm/traps.h>
#include <asm/apollohw.h>
+#ifndef CONFIG_GENERIC_HARDIRQS
void dn_process_int(unsigned int irq, struct pt_regs *fp)
{
do_IRQ(irq, fp);
@@ -11,6 +16,7 @@ void dn_process_int(unsigned int irq, struct pt_regs *fp)
*(volatile unsigned char *)(pica)=0x20;
*(volatile unsigned char *)(picb)=0x20;
}
+#endif
unsigned int apollo_irq_startup(struct irq_data *data)
{
@@ -33,16 +39,31 @@ void apollo_irq_shutdown(struct irq_data *data)
*(volatile unsigned char *)(picb+1) |= (1 << (irq - 8));
}
+#ifdef CONFIG_GENERIC_HARDIRQS
+void apollo_irq_eoi(struct irq_data *data)
+{
+ *(volatile unsigned char *)(pica) = 0x20;
+ *(volatile unsigned char *)(picb) = 0x20;
+}
+#endif
+
static struct irq_chip apollo_irq_chip = {
.name = "apollo",
.irq_startup = apollo_irq_startup,
.irq_shutdown = apollo_irq_shutdown,
+#ifdef CONFIG_GENERIC_HARDIRQS
+ .irq_eoi = apollo_irq_eoi,
+#endif
};
void __init dn_init_IRQ(void)
{
+#ifdef CONFIG_GENERIC_HARDIRQS
+ m68k_setup_user_interrupt(VEC_USER + 96, 16, NULL);
+#else
m68k_setup_user_interrupt(VEC_USER + 96, 16, dn_process_int);
- m68k_setup_irq_controller(&apollo_irq_chip, handle_simple_irq,
+#endif
+ m68k_setup_irq_controller(&apollo_irq_chip, handle_fasteoi_irq,
IRQ_APOLLO, 16);
}
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 22/27] m68k/sun3: Use the kstat_irqs_cpu() wrapper
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
` (20 preceding siblings ...)
2011-10-30 12:48 ` [PATCH 21/27] m68k/apollo: Convert Apollo " Geert Uytterhoeven
@ 2011-10-30 12:48 ` Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 23/27] m68k/sun3: Convert Sun3/3x to genirq Geert Uytterhoeven
` (5 subsequent siblings)
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Acked-by: Sam Creasey <sammy@sammy.net>
---
arch/m68k/sun3/sun3ints.c | 14 ++++++++++----
1 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/arch/m68k/sun3/sun3ints.c b/arch/m68k/sun3/sun3ints.c
index 20ffee7..1273eb8 100644
--- a/arch/m68k/sun3/sun3ints.c
+++ b/arch/m68k/sun3/sun3ints.c
@@ -51,14 +51,19 @@ void sun3_disable_irq(unsigned int irq)
static irqreturn_t sun3_int7(int irq, void *dev_id)
{
+ unsigned int cnt;
+
*sun3_intreg |= (1 << irq);
- if (!(kstat_cpu(0).irqs[irq] % 2000))
- sun3_leds(led_pattern[(kstat_cpu(0).irqs[irq] % 16000) / 2000]);
+ cnt = kstat_irqs_cpu(irq, 0);
+ if (!(cnt % 2000))
+ sun3_leds(led_pattern[cnt % 16000 / 2000]);
return IRQ_HANDLED;
}
static irqreturn_t sun3_int5(int irq, void *dev_id)
{
+ unsigned int cnt;
+
#ifdef CONFIG_SUN3
intersil_clear();
#endif
@@ -68,8 +73,9 @@ static irqreturn_t sun3_int5(int irq, void *dev_id)
#endif
xtime_update(1);
update_process_times(user_mode(get_irq_regs()));
- if (!(kstat_cpu(0).irqs[irq] % 20))
- sun3_leds(led_pattern[(kstat_cpu(0).irqs[irq] % 160) / 20]);
+ cnt = kstat_irqs_cpu(irq, 0);
+ if (!(cnt % 20))
+ sun3_leds(led_pattern[cnt % 160 / 20]);
return IRQ_HANDLED;
}
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 23/27] m68k/sun3: Convert Sun3/3x to genirq
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
` (21 preceding siblings ...)
2011-10-30 12:48 ` [PATCH 22/27] m68k/sun3: Use the kstat_irqs_cpu() wrapper Geert Uytterhoeven
@ 2011-10-30 12:48 ` Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 24/27] m68k/q40: Convert Q40/Q60 " Geert Uytterhoeven
` (4 subsequent siblings)
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven, Sam Creasey
Replace the custom irq handler that masks the irq and calls do_IRQ(), and
the unmasking in the individual handlers, by handle_level_irq().
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Sam Creasey <sammy@sammy.net>
---
arch/m68k/Kconfig | 2 --
arch/m68k/sun3/sun3ints.c | 16 ++++++++++++++--
2 files changed, 14 insertions(+), 4 deletions(-)
diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig
index f2dc708..290f9c8 100644
--- a/arch/m68k/Kconfig
+++ b/arch/m68k/Kconfig
@@ -87,9 +87,7 @@ config MMU_SUN3
config USE_GENERIC_HARDIRQS
bool "Use genirq"
depends on MMU
- depends on !SUN3X
depends on !Q40
- depends on !SUN3
select HAVE_GENERIC_HARDIRQS
select GENERIC_IRQ_SHOW
diff --git a/arch/m68k/sun3/sun3ints.c b/arch/m68k/sun3/sun3ints.c
index 1273eb8..626b601 100644
--- a/arch/m68k/sun3/sun3ints.c
+++ b/arch/m68k/sun3/sun3ints.c
@@ -53,7 +53,9 @@ static irqreturn_t sun3_int7(int irq, void *dev_id)
{
unsigned int cnt;
+#ifndef CONFIG_GENERIC_HARDIRQS
*sun3_intreg |= (1 << irq);
+#endif
cnt = kstat_irqs_cpu(irq, 0);
if (!(cnt % 2000))
sun3_leds(led_pattern[cnt % 16000 / 2000]);
@@ -67,7 +69,9 @@ static irqreturn_t sun3_int5(int irq, void *dev_id)
#ifdef CONFIG_SUN3
intersil_clear();
#endif
+#ifndef CONFIG_GENERIC_HARDIRQS
*sun3_intreg |= (1 << irq);
+#endif
#ifdef CONFIG_SUN3
intersil_clear();
#endif
@@ -85,12 +89,14 @@ static irqreturn_t sun3_vec255(int irq, void *dev_id)
return IRQ_HANDLED;
}
+#ifndef CONFIG_GENERIC_HARDIRQS
static void sun3_inthandle(unsigned int irq, struct pt_regs *fp)
{
*sun3_intreg &= ~(1 << irq);
do_IRQ(irq, fp);
}
+#endif
static void sun3_irq_enable(struct irq_data *data)
{
@@ -108,15 +114,21 @@ static struct irq_chip sun3_irq_chip = {
.irq_shutdown = m68k_irq_shutdown,
.irq_enable = sun3_irq_enable,
.irq_disable = sun3_irq_disable,
+#ifdef CONFIG_GENERIC_HARDIRQS
+ .irq_mask = sun3_irq_disable,
+ .irq_unmask = sun3_irq_enable,
+#endif
};
void __init sun3_init_IRQ(void)
{
*sun3_intreg = 1;
+#ifndef CONFIG_GENERIC_HARDIRQS
m68k_setup_auto_interrupt(sun3_inthandle);
- m68k_setup_irq_controller(&sun3_irq_chip, handle_simple_irq,
- IRQ_AUTO_1, 7);
+#endif
+ m68k_setup_irq_controller(&sun3_irq_chip, handle_level_irq, IRQ_AUTO_1,
+ 7);
m68k_setup_user_interrupt(VEC_USER, 128, NULL);
if (request_irq(IRQ_AUTO_5, sun3_int5, 0, "int5", NULL))
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 24/27] m68k/q40: Convert Q40/Q60 to genirq
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
` (22 preceding siblings ...)
2011-10-30 12:48 ` [PATCH 23/27] m68k/sun3: Convert Sun3/3x to genirq Geert Uytterhoeven
@ 2011-10-30 12:48 ` Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 25/27] m68k/irq: Remove obsolete m68k irq framework Geert Uytterhoeven
` (3 subsequent siblings)
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k
Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven, Richard Zidlicky
q40_irq_handler() must be kept to translate ISA IRQs to the range 1-15.
q40_probe_irq_o{ff,n}() become unused.
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Richard Zidlicky <rz@linux-m68k.org>
---
arch/m68k/Kconfig | 1 -
arch/m68k/include/asm/q40ints.h | 2 ++
arch/m68k/q40/q40ints.c | 8 +++++++-
3 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig
index 290f9c8..06198ce 100644
--- a/arch/m68k/Kconfig
+++ b/arch/m68k/Kconfig
@@ -87,7 +87,6 @@ config MMU_SUN3
config USE_GENERIC_HARDIRQS
bool "Use genirq"
depends on MMU
- depends on !Q40
select HAVE_GENERIC_HARDIRQS
select GENERIC_IRQ_SHOW
diff --git a/arch/m68k/include/asm/q40ints.h b/arch/m68k/include/asm/q40ints.h
index 3d970af..01cdbb4 100644
--- a/arch/m68k/include/asm/q40ints.h
+++ b/arch/m68k/include/asm/q40ints.h
@@ -25,5 +25,7 @@
#define Q40_IRQ14_MASK (1<<6)
#define Q40_IRQ15_MASK (1<<7)
+#ifndef CONFIG_GENERIC_HARDIRQS
extern unsigned long q40_probe_irq_on (void);
extern int q40_probe_irq_off (unsigned long irqs);
+#endif
diff --git a/arch/m68k/q40/q40ints.c b/arch/m68k/q40/q40ints.c
index afe600c..f1e5288 100644
--- a/arch/m68k/q40/q40ints.c
+++ b/arch/m68k/q40/q40ints.c
@@ -15,10 +15,14 @@
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/interrupt.h>
+#ifdef CONFIG_GENERIC_HARDIRQS
+#include <linux/irq.h>
+#else
+#include <asm/irq.h>
+#endif
#include <asm/ptrace.h>
#include <asm/system.h>
-#include <asm/irq.h>
#include <asm/traps.h>
#include <asm/q40_master.h>
@@ -326,6 +330,7 @@ void q40_irq_disable(struct irq_data *data)
}
}
+#ifndef CONFIG_GENERIC_HARDIRQS
unsigned long q40_probe_irq_on(void)
{
printk("irq probing not working - reconfigure the driver to avoid this\n");
@@ -335,3 +340,4 @@ int q40_probe_irq_off(unsigned long irqs)
{
return -1;
}
+#endif
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 25/27] m68k/irq: Remove obsolete m68k irq framework
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
` (23 preceding siblings ...)
2011-10-30 12:48 ` [PATCH 24/27] m68k/q40: Convert Q40/Q60 " Geert Uytterhoeven
@ 2011-10-30 12:48 ` Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 26/27] m68k/irq: Remove obsolete support for user vector interrupt fixups Geert Uytterhoeven
` (2 subsequent siblings)
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
---
arch/m68k/Kconfig | 10 +-
arch/m68k/amiga/amiints.c | 114 ---------------
arch/m68k/apollo/dn_ints.c | 22 ---
arch/m68k/include/asm/irq.h | 63 --------
arch/m68k/include/asm/q40ints.h | 5 -
arch/m68k/kernel/Makefile | 10 +-
arch/m68k/kernel/ints.c | 297 ---------------------------------------
arch/m68k/mac/baboon.c | 41 ------
arch/m68k/mac/oss.c | 78 ----------
arch/m68k/mac/psc.c | 44 ------
arch/m68k/mac/via.c | 104 --------------
arch/m68k/q40/q40ints.c | 16 --
arch/m68k/sun3/sun3ints.c | 20 ---
13 files changed, 4 insertions(+), 820 deletions(-)
diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig
index 06198ce..361d540 100644
--- a/arch/m68k/Kconfig
+++ b/arch/m68k/Kconfig
@@ -4,8 +4,8 @@ config M68K
select HAVE_IDE
select HAVE_AOUT if MMU
select GENERIC_ATOMIC64 if MMU
- select HAVE_GENERIC_HARDIRQS if !MMU
- select GENERIC_IRQ_SHOW if !MMU
+ select HAVE_GENERIC_HARDIRQS
+ select GENERIC_IRQ_SHOW
select ARCH_HAVE_NMI_SAFE_CMPXCHG if RMW_INSNS
config RWSEM_GENERIC_SPINLOCK
@@ -84,12 +84,6 @@ config MMU_SUN3
bool
depends on MMU && !MMU_MOTOROLA
-config USE_GENERIC_HARDIRQS
- bool "Use genirq"
- depends on MMU
- select HAVE_GENERIC_HARDIRQS
- select GENERIC_IRQ_SHOW
-
menu "Platform setup"
source arch/m68k/Kconfig.cpu
diff --git a/arch/m68k/amiga/amiints.c b/arch/m68k/amiga/amiints.c
index a8da471..47b5f90 100644
--- a/arch/m68k/amiga/amiints.c
+++ b/arch/m68k/amiga/amiints.c
@@ -9,9 +9,7 @@
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/errno.h>
-#ifdef CONFIG_GENERIC_HARDIRQS
#include <linux/irq.h>
-#endif
#include <asm/irq.h>
#include <asm/traps.h>
@@ -48,7 +46,6 @@ 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;
@@ -140,103 +137,6 @@ static void ami_int5(unsigned int irq, struct irq_desc *desc)
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;
-
- /* 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);
- }
- return IRQ_HANDLED;
-}
-
-static irqreturn_t ami_int3(int irq, void *dev_id)
-{
- 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);
- }
- return IRQ_HANDLED;
-}
-
-static irqreturn_t ami_int4(int irq, void *dev_id)
-{
- 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);
- }
- return IRQ_HANDLED;
-}
-
-static irqreturn_t ami_int5(int irq, void *dev_id)
-{
- 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);
- }
- return IRQ_HANDLED;
-}
-#endif /* !CONFIG_GENERIC_HARDIRQS */
/*
@@ -252,7 +152,6 @@ 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);
@@ -260,19 +159,6 @@ void __init amiga_init_IRQ(void)
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))
- pr_err("Couldn't register int%d\n", 3);
- if (request_irq(IRQ_AUTO_4, ami_int4, 0, "int4", NULL))
- pr_err("Couldn't register int%d\n", 4);
- if (request_irq(IRQ_AUTO_5, ami_int5, 0, "int5", NULL))
- pr_err("Couldn't register int%d\n", 5);
-
- 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))
diff --git a/arch/m68k/apollo/dn_ints.c b/arch/m68k/apollo/dn_ints.c
index fc190b3..b7d0aa3 100644
--- a/arch/m68k/apollo/dn_ints.c
+++ b/arch/m68k/apollo/dn_ints.c
@@ -1,23 +1,9 @@
#include <linux/interrupt.h>
-#ifdef CONFIG_GENERIC_HARDIRQS
#include <linux/irq.h>
-#else
-#include <asm/irq.h>
-#endif
#include <asm/traps.h>
#include <asm/apollohw.h>
-#ifndef CONFIG_GENERIC_HARDIRQS
-void dn_process_int(unsigned int irq, struct pt_regs *fp)
-{
- do_IRQ(irq, fp);
-
- *(volatile unsigned char *)(pica)=0x20;
- *(volatile unsigned char *)(picb)=0x20;
-}
-#endif
-
unsigned int apollo_irq_startup(struct irq_data *data)
{
unsigned int irq = data->irq;
@@ -39,31 +25,23 @@ void apollo_irq_shutdown(struct irq_data *data)
*(volatile unsigned char *)(picb+1) |= (1 << (irq - 8));
}
-#ifdef CONFIG_GENERIC_HARDIRQS
void apollo_irq_eoi(struct irq_data *data)
{
*(volatile unsigned char *)(pica) = 0x20;
*(volatile unsigned char *)(picb) = 0x20;
}
-#endif
static struct irq_chip apollo_irq_chip = {
.name = "apollo",
.irq_startup = apollo_irq_startup,
.irq_shutdown = apollo_irq_shutdown,
-#ifdef CONFIG_GENERIC_HARDIRQS
.irq_eoi = apollo_irq_eoi,
-#endif
};
void __init dn_init_IRQ(void)
{
-#ifdef CONFIG_GENERIC_HARDIRQS
m68k_setup_user_interrupt(VEC_USER + 96, 16, NULL);
-#else
- m68k_setup_user_interrupt(VEC_USER + 96, 16, dn_process_int);
-#endif
m68k_setup_irq_controller(&apollo_irq_chip, handle_fasteoi_irq,
IRQ_APOLLO, 16);
}
diff --git a/arch/m68k/include/asm/irq.h b/arch/m68k/include/asm/irq.h
index 518e61f..94349a5 100644
--- a/arch/m68k/include/asm/irq.h
+++ b/arch/m68k/include/asm/irq.h
@@ -62,67 +62,6 @@
#define IRQ_FLG_STD (0x8000) /* internally used */
#endif
-#ifndef CONFIG_GENERIC_HARDIRQS
-
-#include <linux/linkage.h>
-#include <linux/hardirq.h>
-#include <linux/irqreturn.h>
-#include <linux/spinlock_types.h>
-
-struct pt_regs;
-
-/*
- * This structure is used to chain together the ISRs for a particular
- * interrupt source (if it supports chaining).
- */
-struct irq_data {
- unsigned int irq;
- irqreturn_t (*handler)(int, void *);
- void *dev_id;
- struct irq_data *next;
- unsigned long flags;
- const char *devname;
-};
-
-/*
- * This structure has only 4 elements for speed reasons
- */
-struct irq_handler {
- int (*handler)(int, void *);
- unsigned long flags;
- void *dev_id;
- const char *devname;
-};
-
-struct irq_chip {
- const char *name;
- unsigned int (*irq_startup)(struct irq_data *data);
- void (*irq_shutdown)(struct irq_data *data);
- void (*irq_enable)(struct irq_data *data);
- void (*irq_disable)(struct irq_data *data);
-};
-
-extern unsigned int m68k_irq_startup(struct irq_data *data);
-extern unsigned int m68k_irq_startup_irq(unsigned int irq);
-extern void m68k_irq_shutdown(struct irq_data *data);
-
-/*
- * This function returns a new struct irq_data
- */
-extern struct irq_data *new_irq_node(void);
-
-extern void m68k_setup_auto_interrupt(void (*handler)(unsigned int, struct pt_regs *));
-extern void m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt,
- void (*handler)(unsigned int, struct pt_regs *));
-extern void m68k_setup_irq_chip(struct irq_chip *, unsigned int, unsigned int);
-#define m68k_setup_irq_controller(chip, dummy, irq, cnt) \
- m68k_setup_irq_chip((chip), (irq), (cnt))
-
-extern void generic_handle_irq(unsigned int);
-asmlinkage void do_IRQ(int irq, struct pt_regs *regs);
-
-#else /* CONFIG_GENERIC_HARDIRQS */
-
struct irq_data;
struct irq_chip;
struct irq_desc;
@@ -139,8 +78,6 @@ extern void m68k_setup_irq_controller(struct irq_chip *,
struct irq_desc *desc),
unsigned int irq, unsigned int cnt);
-#endif /* CONFIG_GENERIC_HARDIRQS */
-
extern unsigned int irq_canonicalize(unsigned int irq);
#else
diff --git a/arch/m68k/include/asm/q40ints.h b/arch/m68k/include/asm/q40ints.h
index 01cdbb4..22f12c9 100644
--- a/arch/m68k/include/asm/q40ints.h
+++ b/arch/m68k/include/asm/q40ints.h
@@ -24,8 +24,3 @@
#define Q40_IRQ10_MASK (1<<5)
#define Q40_IRQ14_MASK (1<<6)
#define Q40_IRQ15_MASK (1<<7)
-
-#ifndef CONFIG_GENERIC_HARDIRQS
-extern unsigned long q40_probe_irq_on (void);
-extern int q40_probe_irq_off (unsigned long irqs);
-#endif
diff --git a/arch/m68k/kernel/Makefile b/arch/m68k/kernel/Makefile
index 1414257..c569619 100644
--- a/arch/m68k/kernel/Makefile
+++ b/arch/m68k/kernel/Makefile
@@ -6,11 +6,10 @@ extra-$(CONFIG_MMU) := head.o
extra-$(CONFIG_SUN3) := sun3-head.o
extra-y += vmlinux.lds
-obj-y := entry.o m68k_ksyms.o module.o process.o ptrace.o setup.o signal.o \
- sys_m68k.o syscalltable.o time.o traps.o
+obj-y := entry.o irq.o m68k_ksyms.o module.o process.o ptrace.o setup.o \
+ signal.o sys_m68k.o syscalltable.o time.o traps.o
obj-$(CONFIG_MMU) += ints.o vectors.o
-devres-$(CONFIG_MMU) = ../../../kernel/irq/devres.o
ifndef CONFIG_MMU_SUN3
obj-y += dma.o
@@ -18,9 +17,4 @@ endif
ifndef CONFIG_MMU
obj-y += init_task.o
endif
-ifdef CONFIG_GENERIC_HARDIRQS
-obj-y += irq.o
-else
-obj-y += devres.o
-endif
diff --git a/arch/m68k/kernel/ints.c b/arch/m68k/kernel/ints.c
index cea439f..e2b056b 100644
--- a/arch/m68k/kernel/ints.c
+++ b/arch/m68k/kernel/ints.c
@@ -31,20 +31,6 @@ extern u32 auto_irqhandler_fixup[];
extern u32 user_irqhandler_fixup[];
extern u16 user_irqvec_fixup[];
-#ifndef CONFIG_GENERIC_HARDIRQS
-/* table for system interrupt handlers */
-static struct irq_data *irq_list[NR_IRQS];
-static struct irq_chip *irq_chip[NR_IRQS];
-static int irq_depth[NR_IRQS];
-
-static inline int irq_set_chip(unsigned int irq, struct irq_chip *chip)
-{
- irq_chip[irq] = chip;
- return 0;
-}
-#define irq_set_chip_and_handler(irq, chip, dummy) irq_set_chip(irq, chip)
-#endif /* !CONFIG_GENERIC_HARDIRQS */
-
static int m68k_first_user_vec;
static struct irq_chip auto_irq_chip = {
@@ -59,11 +45,6 @@ static struct irq_chip user_irq_chip = {
.irq_shutdown = m68k_irq_shutdown,
};
-#ifndef CONFIG_GENERIC_HARDIRQS
-#define NUM_IRQ_NODES 100
-static struct irq_data nodes[NUM_IRQ_NODES];
-#endif /* !CONFIG_GENERIC_HARDIRQS */
-
/*
* void init_IRQ(void)
*
@@ -133,8 +114,6 @@ void __init m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt,
flush_icache();
}
-#ifdef CONFIG_GENERIC_HARDIRQS
-
/**
* m68k_setup_irq_controller
* @chip: irq chip which controls specified irq
@@ -160,198 +139,6 @@ void m68k_setup_irq_controller(struct irq_chip *chip,
}
}
-#else /* !CONFIG_GENERIC_HARDIRQS */
-
-/**
- * m68k_setup_irq_chip
- * @contr: irq controller which controls specified irq
- * @irq: first irq to be managed by the controller
- *
- * Change the controller for the specified range of irq, which will be used to
- * manage these irq. auto/user irq already have a default controller, which can
- * be changed as well, but the controller probably should use m68k_irq_startup/
- * m68k_irq_shutdown.
- */
-void m68k_setup_irq_chip(struct irq_chip *contr, unsigned int irq,
- unsigned int cnt)
-{
- int i;
-
- for (i = 0; i < cnt; i++)
- irq_set_chip(irq + i, contr);
-}
-
-struct irq_data *new_irq_node(void)
-{
- struct irq_data *node;
- short i;
-
- for (node = nodes, i = NUM_IRQ_NODES-1; i >= 0; node++, i--) {
- if (!node->handler) {
- memset(node, 0, sizeof(*node));
- return node;
- }
- }
-
- printk ("new_irq_node: out of nodes\n");
- return NULL;
-}
-
-static int m68k_setup_irq(unsigned int irq, struct irq_data *node)
-{
- struct irq_chip *contr;
- struct irq_data **prev;
- unsigned long flags;
-
- if (irq >= NR_IRQS || !(contr = irq_chip[irq])) {
- printk("%s: Incorrect IRQ %d from %s\n",
- __func__, irq, node->devname);
- return -ENXIO;
- }
-
- local_irq_save(flags);
-
- prev = irq_list + irq;
- if (*prev) {
- /* Can't share interrupts unless both agree to */
- if (!((*prev)->flags & node->flags & IRQF_SHARED)) {
- local_irq_restore(flags);
- return -EBUSY;
- }
- while (*prev)
- prev = &(*prev)->next;
- }
-
- if (!irq_list[irq]) {
- if (contr->irq_startup)
- contr->irq_startup(node);
- else
- contr->irq_enable(node);
- }
- node->next = NULL;
- *prev = node;
-
- local_irq_restore(flags);
-
- return 0;
-}
-
-int request_irq(unsigned int irq,
- irq_handler_t handler,
- unsigned long flags, const char *devname, void *dev_id)
-{
- struct irq_data *node;
- int res;
-
- node = new_irq_node();
- if (!node)
- return -ENOMEM;
-
- node->irq = irq;
- node->handler = handler;
- node->flags = flags;
- node->dev_id = dev_id;
- node->devname = devname;
-
- res = m68k_setup_irq(irq, node);
- if (res)
- node->handler = NULL;
-
- return res;
-}
-
-EXPORT_SYMBOL(request_irq);
-
-void free_irq(unsigned int irq, void *dev_id)
-{
- struct irq_chip *contr;
- struct irq_data **p, *node;
- unsigned long flags;
-
- if (irq >= NR_IRQS || !(contr = irq_chip[irq])) {
- printk("%s: Incorrect IRQ %d\n", __func__, irq);
- return;
- }
-
- local_irq_save(flags);
-
- p = irq_list + irq;
- while ((node = *p)) {
- if (node->dev_id == dev_id)
- break;
- p = &node->next;
- }
-
- if (node) {
- *p = node->next;
- node->handler = NULL;
- } else
- printk("%s: Removing probably wrong IRQ %d\n",
- __func__, irq);
-
- if (!irq_list[irq]) {
- if (contr->irq_shutdown)
- contr->irq_shutdown(node);
- else
- contr->irq_disable(node);
- }
-
- local_irq_restore(flags);
-}
-
-EXPORT_SYMBOL(free_irq);
-
-void enable_irq(unsigned int irq)
-{
- struct irq_chip *contr;
- unsigned long flags;
-
- if (irq >= NR_IRQS || !(contr = irq_chip[irq])) {
- printk("%s: Incorrect IRQ %d\n",
- __func__, irq);
- return;
- }
-
- local_irq_save(flags);
- if (irq_depth[irq]) {
- if (!--irq_depth[irq]) {
- if (contr->irq_enable)
- contr->irq_enable(irq_list[irq]);
- }
- } else
- WARN_ON(1);
- local_irq_restore(flags);
-}
-
-EXPORT_SYMBOL(enable_irq);
-
-void disable_irq(unsigned int irq)
-{
- struct irq_chip *contr;
- unsigned long flags;
-
- if (irq >= NR_IRQS || !(contr = irq_chip[irq])) {
- printk("%s: Incorrect IRQ %d\n",
- __func__, irq);
- return;
- }
-
- local_irq_save(flags);
- if (!irq_depth[irq]++) {
- if (contr->irq_disable)
- contr->irq_disable(irq_list[irq]);
- }
- local_irq_restore(flags);
-}
-
-EXPORT_SYMBOL(disable_irq);
-
-void disable_irq_nosync(unsigned int irq) __attribute__((alias("disable_irq")));
-
-EXPORT_SYMBOL(disable_irq_nosync);
-
-#endif /* !CONFIG_GENERIC_HARDIRQS */
-
unsigned int m68k_irq_startup_irq(unsigned int irq)
{
if (irq <= IRQ_AUTO_7)
@@ -377,36 +164,6 @@ void m68k_irq_shutdown(struct irq_data *data)
}
-#ifndef CONFIG_GENERIC_HARDIRQS
-
-/*
- * Do we need these probe functions on the m68k?
- *
- * ... may be useful with ISA devices
- */
-unsigned long probe_irq_on (void)
-{
-#ifdef CONFIG_Q40
- if (MACH_IS_Q40)
- return q40_probe_irq_on();
-#endif
- return 0;
-}
-
-EXPORT_SYMBOL(probe_irq_on);
-
-int probe_irq_off (unsigned long irqs)
-{
-#ifdef CONFIG_Q40
- if (MACH_IS_Q40)
- return q40_probe_irq_off(irqs);
-#endif
- return 0;
-}
-
-EXPORT_SYMBOL(probe_irq_off);
-#endif /* CONFIG_GENERIC_HARDIRQS */
-
unsigned int irq_canonicalize(unsigned int irq)
{
#ifdef CONFIG_Q40
@@ -418,63 +175,9 @@ unsigned int irq_canonicalize(unsigned int irq)
EXPORT_SYMBOL(irq_canonicalize);
-#ifndef CONFIG_GENERIC_HARDIRQS
-void generic_handle_irq(unsigned int irq)
-{
- struct irq_data *node;
- kstat_cpu(0).irqs[irq]++;
- node = irq_list[irq];
- do {
- node->handler(irq, node->dev_id);
- node = node->next;
- } while (node);
-}
-
-asmlinkage void do_IRQ(int irq, struct pt_regs *regs)
-{
- struct pt_regs *old_regs;
- old_regs = set_irq_regs(regs);
- generic_handle_irq(irq);
- set_irq_regs(old_regs);
-}
-
-asmlinkage void handle_badint(struct pt_regs *regs)
-{
- kstat_cpu(0).irqs[0]++;
- printk("unexpected interrupt from %u\n", regs->vector);
-}
-
-int show_interrupts(struct seq_file *p, void *v)
-{
- struct irq_chip *contr;
- struct irq_data *node;
- int i = *(loff_t *) v;
-
- /* autovector interrupts */
- if (irq_list[i]) {
- contr = irq_chip[i];
- node = irq_list[i];
- seq_printf(p, "%-8s %3u: %10u %s", contr->name, i, kstat_cpu(0).irqs[i], node->devname);
- while ((node = node->next))
- seq_printf(p, ", %s", node->devname);
- seq_puts(p, "\n");
- }
- return 0;
-}
-
-#ifdef CONFIG_PROC_FS
-void init_irq_proc(void)
-{
- /* Insert /proc/irq driver here */
-}
-#endif
-
-#else /* CONFIG_GENERIC_HARDIRQS */
asmlinkage void handle_badint(struct pt_regs *regs)
{
atomic_inc(&irq_err_count);
pr_warn("unexpected interrupt from %u\n", regs->vector);
}
-
-#endif /* CONFIG_GENERIC_HARDIRQS */
diff --git a/arch/m68k/mac/baboon.c b/arch/m68k/mac/baboon.c
index 425144c..b55ead2 100644
--- a/arch/m68k/mac/baboon.c
+++ b/arch/m68k/mac/baboon.c
@@ -11,9 +11,7 @@
#include <linux/mm.h>
#include <linux/delay.h>
#include <linux/init.h>
-#ifdef CONFIG_GENERIC_HARDIRQS
#include <linux/irq.h>
-#endif
#include <asm/traps.h>
#include <asm/bootinfo.h>
@@ -56,7 +54,6 @@ void __init baboon_init(void)
* Baboon interrupt handler. This works a lot like a VIA.
*/
-#ifdef CONFIG_GENERIC_HARDIRQS
static void baboon_irq(unsigned int irq, struct irq_desc *desc)
{
int irq_bit, irq_num;
@@ -88,39 +85,6 @@ static void baboon_irq(unsigned int irq, struct irq_desc *desc)
baboon->mb_ifr &= ~events;
#endif
}
-#else
-static irqreturn_t baboon_irq(int irq, void *dev_id)
-{
- int irq_bit, irq_num;
- unsigned char events;
-
-#ifdef DEBUG_IRQS
- printk("baboon_irq: mb_control %02X mb_ifr %02X mb_status %02X\n",
- (uint) baboon->mb_control, (uint) baboon->mb_ifr,
- (uint) baboon->mb_status);
-#endif
-
- if (!(events = baboon->mb_ifr & 0x07))
- return IRQ_NONE;
-
- irq_num = IRQ_BABOON_0;
- irq_bit = 1;
- do {
- if (events & irq_bit) {
- baboon->mb_ifr &= ~irq_bit;
- generic_handle_irq(irq_num);
- }
- irq_bit <<= 1;
- irq_num++;
- } while(events >= irq_bit);
-#if 0
- if (baboon->mb_ifr & 0x02) macide_ack_intr(NULL);
- /* for now we need to smash all interrupts */
- baboon->mb_ifr &= ~events;
-#endif
- return IRQ_HANDLED;
-}
-#endif
/*
* Register the Baboon interrupt dispatcher on nubus slot $C.
@@ -129,12 +93,7 @@ static irqreturn_t baboon_irq(int irq, void *dev_id)
void __init baboon_register_interrupts(void)
{
baboon_disabled = 0;
-#ifdef CONFIG_GENERIC_HARDIRQS
irq_set_chained_handler(IRQ_NUBUS_C, baboon_irq);
-#else
- if (request_irq(IRQ_NUBUS_C, baboon_irq, 0, "baboon", (void *)baboon))
- pr_err("Couldn't register baboon interrupt\n");
-#endif
}
/*
diff --git a/arch/m68k/mac/oss.c b/arch/m68k/mac/oss.c
index cc784c2..a4c82da 100644
--- a/arch/m68k/mac/oss.c
+++ b/arch/m68k/mac/oss.c
@@ -19,9 +19,7 @@
#include <linux/mm.h>
#include <linux/delay.h>
#include <linux/init.h>
-#ifdef CONFIG_GENERIC_HARDIRQS
#include <linux/irq.h>
-#endif
#include <asm/bootinfo.h>
#include <asm/macintosh.h>
@@ -32,11 +30,7 @@
int oss_present;
volatile struct mac_oss *oss;
-#ifdef CONFIG_GENERIC_HARDIRQS
extern void via1_irq(unsigned int irq, struct irq_desc *desc);
-#else
-extern irqreturn_t via1_irq(int, void *);
-#endif
/*
* Initialize the OSS
@@ -76,7 +70,6 @@ void __init oss_nubus_init(void)
* and SCSI; everything else is routed to its own autovector IRQ.
*/
-#ifdef CONFIG_GENERIC_HARDIRQS
static void oss_irq(unsigned int irq, struct irq_desc *desc)
{
int events;
@@ -103,35 +96,6 @@ static void oss_irq(unsigned int irq, struct irq_desc *desc)
/* FIXME: error check here? */
}
}
-#else
-static irqreturn_t oss_irq(int irq, void *dev_id)
-{
- int events;
-
- events = oss->irq_pending & (OSS_IP_SOUND|OSS_IP_SCSI);
- if (!events)
- return IRQ_NONE;
-
-#ifdef DEBUG_IRQS
- if ((console_loglevel == 10) && !(events & OSS_IP_SCSI)) {
- printk("oss_irq: irq %d events = 0x%04X\n", irq,
- (int) oss->irq_pending);
- }
-#endif
- /* FIXME: how do you clear a pending IRQ? */
-
- if (events & OSS_IP_SOUND) {
- oss->irq_pending &= ~OSS_IP_SOUND;
- /* FIXME: call sound handler */
- } else if (events & OSS_IP_SCSI) {
- oss->irq_pending &= ~OSS_IP_SCSI;
- generic_handle_irq(IRQ_MAC_SCSI);
- } else {
- /* FIXME: error check here? */
- }
- return IRQ_HANDLED;
-}
-#endif
/*
* Nubus IRQ handler, OSS style
@@ -139,7 +103,6 @@ static irqreturn_t oss_irq(int irq, void *dev_id)
* Unlike the VIA/RBV this is on its own autovector interrupt level.
*/
-#ifdef CONFIG_GENERIC_HARDIRQS
static void oss_nubus_irq(unsigned int irq, struct irq_desc *desc)
{
int events, irq_bit, i;
@@ -166,35 +129,6 @@ static void oss_nubus_irq(unsigned int irq, struct irq_desc *desc)
}
} while(events & (irq_bit - 1));
}
-#else
-static irqreturn_t oss_nubus_irq(int irq, void *dev_id)
-{
- int events, irq_bit, i;
-
- events = oss->irq_pending & OSS_IP_NUBUS;
- if (!events)
- return IRQ_NONE;
-
-#ifdef DEBUG_NUBUS_INT
- if (console_loglevel > 7) {
- printk("oss_nubus_irq: events = 0x%04X\n", events);
- }
-#endif
- /* There are only six slots on the OSS, not seven */
-
- i = 6;
- irq_bit = 0x40;
- do {
- --i;
- irq_bit >>= 1;
- if (events & irq_bit) {
- oss->irq_pending &= ~irq_bit;
- generic_handle_irq(NUBUS_SOURCE_BASE + i);
- }
- } while(events & (irq_bit - 1));
- return IRQ_HANDLED;
-}
-#endif
/*
* Register the OSS and NuBus interrupt dispatchers.
@@ -202,22 +136,10 @@ static irqreturn_t oss_nubus_irq(int irq, void *dev_id)
void __init oss_register_interrupts(void)
{
-#ifdef CONFIG_GENERIC_HARDIRQS
irq_set_chained_handler(OSS_IRQLEV_SCSI, oss_irq);
irq_set_chained_handler(OSS_IRQLEV_NUBUS, oss_nubus_irq);
irq_set_chained_handler(OSS_IRQLEV_SOUND, oss_irq);
irq_set_chained_handler(OSS_IRQLEV_VIA1, via1_irq);
-#else /* !CONFIG_GENERIC_HARDIRQS */
- if (request_irq(OSS_IRQLEV_SCSI, oss_irq, 0, "scsi", (void *)oss))
- pr_err("Couldn't register %s interrupt\n", "scsi");
- if (request_irq(OSS_IRQLEV_NUBUS, oss_nubus_irq, 0, "nubus",
- (void *)oss))
- pr_err("Couldn't register %s interrupt\n", "nubus");
- if (request_irq(OSS_IRQLEV_SOUND, oss_irq, 0, "sound", (void *)oss))
- pr_err("Couldn't register %s interrupt\n", "sound");
- if (request_irq(OSS_IRQLEV_VIA1, via1_irq, 0, "via1", (void *)via1))
- pr_err("Couldn't register %s interrupt\n", "via1");
-#endif /* !CONFIG_GENERIC_HARDIRQS */
}
/*
diff --git a/arch/m68k/mac/psc.c b/arch/m68k/mac/psc.c
index 52840b8..e6c2d20 100644
--- a/arch/m68k/mac/psc.c
+++ b/arch/m68k/mac/psc.c
@@ -18,9 +18,7 @@
#include <linux/mm.h>
#include <linux/delay.h>
#include <linux/init.h>
-#ifdef CONFIG_GENERIC_HARDIRQS
#include <linux/irq.h>
-#endif
#include <asm/traps.h>
#include <asm/bootinfo.h>
@@ -116,7 +114,6 @@ void __init psc_init(void)
* PSC interrupt handler. It's a lot like the VIA interrupt handler.
*/
-#ifdef CONFIG_GENERIC_HARDIRQS
static void psc_irq(unsigned int irq, struct irq_desc *desc)
{
unsigned int offset = (unsigned int)irq_desc_get_handler_data(desc);
@@ -145,36 +142,6 @@ static void psc_irq(unsigned int irq, struct irq_desc *desc)
irq_bit <<= 1;
} while (events >= irq_bit);
}
-#else
-static irqreturn_t psc_irq(int irq, void *dev_id)
-{
- int pIFR = pIFRbase + ((int) dev_id);
- int pIER = pIERbase + ((int) dev_id);
- int irq_num;
- unsigned char irq_bit, events;
-
-#ifdef DEBUG_IRQS
- printk("psc_irq: irq %d pIFR = 0x%02X pIER = 0x%02X\n",
- irq, (int) psc_read_byte(pIFR), (int) psc_read_byte(pIER));
-#endif
-
- events = psc_read_byte(pIFR) & psc_read_byte(pIER) & 0xF;
- if (!events)
- return IRQ_NONE;
-
- irq_num = irq << 3;
- irq_bit = 1;
- do {
- if (events & irq_bit) {
- psc_write_byte(pIFR, irq_bit);
- generic_handle_irq(irq_num);
- }
- irq_num++;
- irq_bit <<= 1;
- } while (events >= irq_bit);
- return IRQ_HANDLED;
-}
-#endif
/*
* Register the PSC interrupt dispatchers for autovector interrupts 3-6.
@@ -182,7 +149,6 @@ static irqreturn_t psc_irq(int irq, void *dev_id)
void __init psc_register_interrupts(void)
{
-#ifdef CONFIG_GENERIC_HARDIRQS
irq_set_chained_handler(IRQ_AUTO_3, psc_irq);
irq_set_handler_data(IRQ_AUTO_3, (void *)0x30);
irq_set_chained_handler(IRQ_AUTO_4, psc_irq);
@@ -191,16 +157,6 @@ void __init psc_register_interrupts(void)
irq_set_handler_data(IRQ_AUTO_5, (void *)0x50);
irq_set_chained_handler(IRQ_AUTO_6, psc_irq);
irq_set_handler_data(IRQ_AUTO_6, (void *)0x60);
-#else /* !CONFIG_GENERIC_HARDIRQS */
- if (request_irq(IRQ_AUTO_3, psc_irq, 0, "psc3", (void *) 0x30))
- pr_err("Couldn't register psc%d interrupt\n", 3);
- if (request_irq(IRQ_AUTO_4, psc_irq, 0, "psc4", (void *) 0x40))
- pr_err("Couldn't register psc%d interrupt\n", 4);
- if (request_irq(IRQ_AUTO_5, psc_irq, 0, "psc5", (void *) 0x50))
- pr_err("Couldn't register psc%d interrupt\n", 5);
- if (request_irq(IRQ_AUTO_6, psc_irq, 0, "psc6", (void *) 0x60))
- pr_err("Couldn't register psc%d interrupt\n", 6);
-#endif /* !CONFIG_GENERIC_HARDIRQS */
}
void psc_irq_enable(int irq) {
diff --git a/arch/m68k/mac/via.c b/arch/m68k/mac/via.c
index b8156ac..f1600ad 100644
--- a/arch/m68k/mac/via.c
+++ b/arch/m68k/mac/via.c
@@ -28,9 +28,7 @@
#include <linux/delay.h>
#include <linux/init.h>
#include <linux/module.h>
-#ifdef CONFIG_GENERIC_HARDIRQS
#include <linux/irq.h>
-#endif
#include <asm/bootinfo.h>
#include <asm/macintosh.h>
@@ -417,7 +415,6 @@ void __init via_nubus_init(void)
* via6522.c :-), disable/pending masks added.
*/
-#ifdef CONFIG_GENERIC_HARDIRQS
void via1_irq(unsigned int irq, struct irq_desc *desc)
{
int irq_num;
@@ -459,58 +456,12 @@ static void via2_irq(unsigned int irq, struct irq_desc *desc)
irq_bit <<= 1;
} while (events >= irq_bit);
}
-#else
-irqreturn_t via1_irq(int irq, void *dev_id)
-{
- int irq_num;
- unsigned char irq_bit, events;
-
- events = via1[vIFR] & via1[vIER] & 0x7F;
- if (!events)
- return IRQ_NONE;
-
- irq_num = VIA1_SOURCE_BASE;
- irq_bit = 1;
- do {
- if (events & irq_bit) {
- via1[vIFR] = irq_bit;
- generic_handle_irq(irq_num);
- }
- ++irq_num;
- irq_bit <<= 1;
- } while (events >= irq_bit);
- return IRQ_HANDLED;
-}
-
-irqreturn_t via2_irq(int irq, void *dev_id)
-{
- int irq_num;
- unsigned char irq_bit, events;
-
- events = via2[gIFR] & via2[gIER] & 0x7F;
- if (!events)
- return IRQ_NONE;
-
- irq_num = VIA2_SOURCE_BASE;
- irq_bit = 1;
- do {
- if (events & irq_bit) {
- via2[gIFR] = irq_bit | rbv_clear;
- generic_handle_irq(irq_num);
- }
- ++irq_num;
- irq_bit <<= 1;
- } while (events >= irq_bit);
- return IRQ_HANDLED;
-}
-#endif
/*
* Dispatch Nubus interrupts. We are called as a secondary dispatch by the
* VIA2 dispatcher as a fast interrupt handler.
*/
-#ifdef CONFIG_GENERIC_HARDIRQS
void via_nubus_irq(unsigned int irq, struct irq_desc *desc)
{
int slot_irq;
@@ -545,43 +496,6 @@ void via_nubus_irq(unsigned int irq, struct irq_desc *desc)
events &= ~via2[vDirA];
} while (events);
}
-#else
-irqreturn_t via_nubus_irq(int irq, void *dev_id)
-{
- int slot_irq;
- unsigned char slot_bit, events;
-
- events = ~via2[gBufA] & 0x7F;
- if (rbv_present)
- events &= via2[rSIER];
- else
- events &= ~via2[vDirA];
- if (!events)
- return IRQ_NONE;
-
- do {
- slot_irq = IRQ_NUBUS_F;
- slot_bit = 0x40;
- do {
- if (events & slot_bit) {
- events &= ~slot_bit;
- generic_handle_irq(slot_irq);
- }
- --slot_irq;
- slot_bit >>= 1;
- } while (events);
-
- /* clear the CA1 interrupt and make certain there's no more. */
- via2[gIFR] = 0x02 | rbv_clear;
- events = ~via2[gBufA] & 0x7F;
- if (rbv_present)
- events &= via2[rSIER];
- else
- events &= ~via2[vDirA];
- } while (events);
- return IRQ_HANDLED;
-}
-#endif
/*
* Register the interrupt dispatchers for VIA or RBV machines only.
@@ -589,7 +503,6 @@ irqreturn_t via_nubus_irq(int irq, void *dev_id)
void __init via_register_interrupts(void)
{
-#ifdef CONFIG_GENERIC_HARDIRQS
if (via_alt_mapping) {
/* software interrupt */
irq_set_chained_handler(IRQ_AUTO_1, via1_irq);
@@ -600,23 +513,6 @@ void __init via_register_interrupts(void)
}
irq_set_chained_handler(IRQ_AUTO_2, via2_irq);
irq_set_chained_handler(IRQ_MAC_NUBUS, via_nubus_irq);
-#else
- if (via_alt_mapping) {
- if (request_irq(IRQ_AUTO_1, via1_irq, 0, "software",
- (void *)via1))
- pr_err("Couldn't register %s interrupt\n", "software");
- if (request_irq(IRQ_AUTO_6, via1_irq, 0, "via1", (void *)via1))
- pr_err("Couldn't register %s interrupt\n", "via1");
- } else {
- if (request_irq(IRQ_AUTO_1, via1_irq, 0, "via1", (void *)via1))
- pr_err("Couldn't register %s interrupt\n", "via1");
- }
- if (request_irq(IRQ_AUTO_2, via2_irq, 0, "via2", (void *)via2))
- pr_err("Couldn't register %s interrupt\n", "via2");
- if (request_irq(IRQ_MAC_NUBUS, via_nubus_irq, 0, "nubus",
- (void *)via2))
- pr_err("Couldn't register %s interrupt\n", "nubus");
-#endif
}
void via_irq_enable(int irq) {
diff --git a/arch/m68k/q40/q40ints.c b/arch/m68k/q40/q40ints.c
index f1e5288..2b88849 100644
--- a/arch/m68k/q40/q40ints.c
+++ b/arch/m68k/q40/q40ints.c
@@ -15,11 +15,7 @@
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/interrupt.h>
-#ifdef CONFIG_GENERIC_HARDIRQS
#include <linux/irq.h>
-#else
-#include <asm/irq.h>
-#endif
#include <asm/ptrace.h>
#include <asm/system.h>
@@ -329,15 +325,3 @@ void q40_irq_disable(struct irq_data *data)
printk("disable_irq nesting count %d\n",mext_disabled);
}
}
-
-#ifndef CONFIG_GENERIC_HARDIRQS
-unsigned long q40_probe_irq_on(void)
-{
- printk("irq probing not working - reconfigure the driver to avoid this\n");
- return -1;
-}
-int q40_probe_irq_off(unsigned long irqs)
-{
- return -1;
-}
-#endif
diff --git a/arch/m68k/sun3/sun3ints.c b/arch/m68k/sun3/sun3ints.c
index 626b601..7eb3781 100644
--- a/arch/m68k/sun3/sun3ints.c
+++ b/arch/m68k/sun3/sun3ints.c
@@ -53,9 +53,6 @@ static irqreturn_t sun3_int7(int irq, void *dev_id)
{
unsigned int cnt;
-#ifndef CONFIG_GENERIC_HARDIRQS
- *sun3_intreg |= (1 << irq);
-#endif
cnt = kstat_irqs_cpu(irq, 0);
if (!(cnt % 2000))
sun3_leds(led_pattern[cnt % 16000 / 2000]);
@@ -69,9 +66,6 @@ static irqreturn_t sun3_int5(int irq, void *dev_id)
#ifdef CONFIG_SUN3
intersil_clear();
#endif
-#ifndef CONFIG_GENERIC_HARDIRQS
- *sun3_intreg |= (1 << irq);
-#endif
#ifdef CONFIG_SUN3
intersil_clear();
#endif
@@ -89,15 +83,6 @@ static irqreturn_t sun3_vec255(int irq, void *dev_id)
return IRQ_HANDLED;
}
-#ifndef CONFIG_GENERIC_HARDIRQS
-static void sun3_inthandle(unsigned int irq, struct pt_regs *fp)
-{
- *sun3_intreg &= ~(1 << irq);
-
- do_IRQ(irq, fp);
-}
-#endif
-
static void sun3_irq_enable(struct irq_data *data)
{
sun3_enable_irq(data->irq);
@@ -114,19 +99,14 @@ static struct irq_chip sun3_irq_chip = {
.irq_shutdown = m68k_irq_shutdown,
.irq_enable = sun3_irq_enable,
.irq_disable = sun3_irq_disable,
-#ifdef CONFIG_GENERIC_HARDIRQS
.irq_mask = sun3_irq_disable,
.irq_unmask = sun3_irq_enable,
-#endif
};
void __init sun3_init_IRQ(void)
{
*sun3_intreg = 1;
-#ifndef CONFIG_GENERIC_HARDIRQS
- m68k_setup_auto_interrupt(sun3_inthandle);
-#endif
m68k_setup_irq_controller(&sun3_irq_chip, handle_level_irq, IRQ_AUTO_1,
7);
m68k_setup_user_interrupt(VEC_USER, 128, NULL);
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 26/27] m68k/irq: Remove obsolete support for user vector interrupt fixups
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
` (24 preceding siblings ...)
2011-10-30 12:48 ` [PATCH 25/27] m68k/irq: Remove obsolete m68k irq framework Geert Uytterhoeven
@ 2011-10-30 12:48 ` 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
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Greg Ungerer, Geert Uytterhoeven
It was used on Apollo only, before its conversion to genirq.
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
---
arch/m68k/apollo/dn_ints.c | 2 +-
arch/m68k/atari/ataints.c | 2 +-
arch/m68k/bvme6000/config.c | 2 +-
arch/m68k/include/asm/irq.h | 4 +---
arch/m68k/kernel/entry_mm.S | 3 +--
arch/m68k/kernel/ints.c | 11 ++---------
arch/m68k/mvme147/config.c | 2 +-
arch/m68k/mvme16x/config.c | 2 +-
arch/m68k/sun3/sun3ints.c | 2 +-
9 files changed, 10 insertions(+), 20 deletions(-)
diff --git a/arch/m68k/apollo/dn_ints.c b/arch/m68k/apollo/dn_ints.c
index b7d0aa3..17be1e7 100644
--- a/arch/m68k/apollo/dn_ints.c
+++ b/arch/m68k/apollo/dn_ints.c
@@ -41,7 +41,7 @@ static struct irq_chip apollo_irq_chip = {
void __init dn_init_IRQ(void)
{
- m68k_setup_user_interrupt(VEC_USER + 96, 16, NULL);
+ m68k_setup_user_interrupt(VEC_USER + 96, 16);
m68k_setup_irq_controller(&apollo_irq_chip, handle_fasteoi_irq,
IRQ_APOLLO, 16);
}
diff --git a/arch/m68k/atari/ataints.c b/arch/m68k/atari/ataints.c
index af54455..6d196da 100644
--- a/arch/m68k/atari/ataints.c
+++ b/arch/m68k/atari/ataints.c
@@ -137,7 +137,7 @@ static struct irq_chip atari_irq_chip = {
void __init atari_init_IRQ(void)
{
- m68k_setup_user_interrupt(VEC_USER, NUM_ATARI_SOURCES - IRQ_USER, NULL);
+ m68k_setup_user_interrupt(VEC_USER, NUM_ATARI_SOURCES - IRQ_USER);
m68k_setup_irq_controller(&atari_irq_chip, handle_simple_irq, 1,
NUM_ATARI_SOURCES - 1);
diff --git a/arch/m68k/bvme6000/config.c b/arch/m68k/bvme6000/config.c
index 1edd950..8128647 100644
--- a/arch/m68k/bvme6000/config.c
+++ b/arch/m68k/bvme6000/config.c
@@ -86,7 +86,7 @@ static void bvme6000_get_model(char *model)
*/
static void __init bvme6000_init_IRQ(void)
{
- m68k_setup_user_interrupt(VEC_USER, 192, NULL);
+ m68k_setup_user_interrupt(VEC_USER, 192);
}
void __init config_bvme6000(void)
diff --git a/arch/m68k/include/asm/irq.h b/arch/m68k/include/asm/irq.h
index 94349a5..6198df5 100644
--- a/arch/m68k/include/asm/irq.h
+++ b/arch/m68k/include/asm/irq.h
@@ -70,9 +70,7 @@ extern unsigned int m68k_irq_startup_irq(unsigned int irq);
extern void m68k_irq_shutdown(struct irq_data *data);
extern void m68k_setup_auto_interrupt(void (*handler)(unsigned int,
struct pt_regs *));
-extern void m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt,
- void (*handler)(unsigned int,
- struct pt_regs *));
+extern void m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt);
extern void m68k_setup_irq_controller(struct irq_chip *,
void (*handle)(unsigned int irq,
struct irq_desc *desc),
diff --git a/arch/m68k/kernel/entry_mm.S b/arch/m68k/kernel/entry_mm.S
index f5927d0..c713f51 100644
--- a/arch/m68k/kernel/entry_mm.S
+++ b/arch/m68k/kernel/entry_mm.S
@@ -48,7 +48,7 @@
.globl sys_fork, sys_clone, sys_vfork
.globl ret_from_interrupt, bad_interrupt
.globl auto_irqhandler_fixup
-.globl user_irqvec_fixup, user_irqhandler_fixup
+.globl user_irqvec_fixup
.text
ENTRY(buserr)
@@ -240,7 +240,6 @@ user_irqvec_fixup = . + 2
movel %sp,%sp@-
movel %d0,%sp@- | put vector # on stack
-user_irqhandler_fixup = . + 2
jsr do_IRQ | process the IRQ
addql #8,%sp | pop parameters off stack
diff --git a/arch/m68k/kernel/ints.c b/arch/m68k/kernel/ints.c
index e2b056b..74fefac 100644
--- a/arch/m68k/kernel/ints.c
+++ b/arch/m68k/kernel/ints.c
@@ -28,7 +28,6 @@
#endif
extern u32 auto_irqhandler_fixup[];
-extern u32 user_irqhandler_fixup[];
extern u16 user_irqvec_fixup[];
static int m68k_first_user_vec;
@@ -91,16 +90,12 @@ void __init m68k_setup_auto_interrupt(void (*handler)(unsigned int, struct pt_re
* m68k_setup_user_interrupt
* @vec: first user vector interrupt to handle
* @cnt: number of active user vector interrupts
- * @handler: called from user vector interrupts
*
* setup user vector interrupts, this includes activating the specified range
* of interrupts, only then these interrupts can be requested (note: this is
- * different from auto vector interrupts). An optional handler can be installed
- * to be called instead of the default do_IRQ(), it will be called
- * with irq numbers starting from IRQ_USER.
+ * different from auto vector interrupts).
*/
-void __init m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt,
- void (*handler)(unsigned int, struct pt_regs *))
+void __init m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt)
{
int i;
@@ -109,8 +104,6 @@ void __init m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt,
for (i = 0; i < cnt; i++)
irq_set_chip(IRQ_USER + i, &user_irq_chip);
*user_irqvec_fixup = vec - IRQ_USER;
- if (handler)
- *user_irqhandler_fixup = (u32)handler;
flush_icache();
}
diff --git a/arch/m68k/mvme147/config.c b/arch/m68k/mvme147/config.c
index 01f2adf..5de924e 100644
--- a/arch/m68k/mvme147/config.c
+++ b/arch/m68k/mvme147/config.c
@@ -81,7 +81,7 @@ static void mvme147_get_model(char *model)
void __init mvme147_init_IRQ(void)
{
- m68k_setup_user_interrupt(VEC_USER, 192, NULL);
+ m68k_setup_user_interrupt(VEC_USER, 192);
}
void __init config_mvme147(void)
diff --git a/arch/m68k/mvme16x/config.c b/arch/m68k/mvme16x/config.c
index 0b28e26..31a66d9 100644
--- a/arch/m68k/mvme16x/config.c
+++ b/arch/m68k/mvme16x/config.c
@@ -117,7 +117,7 @@ static void mvme16x_get_hardware_list(struct seq_file *m)
static void __init mvme16x_init_IRQ (void)
{
- m68k_setup_user_interrupt(VEC_USER, 192, NULL);
+ m68k_setup_user_interrupt(VEC_USER, 192);
}
#define pcc2chip ((volatile u_char *)0xfff42000)
diff --git a/arch/m68k/sun3/sun3ints.c b/arch/m68k/sun3/sun3ints.c
index 7eb3781..78b60f5 100644
--- a/arch/m68k/sun3/sun3ints.c
+++ b/arch/m68k/sun3/sun3ints.c
@@ -109,7 +109,7 @@ void __init sun3_init_IRQ(void)
m68k_setup_irq_controller(&sun3_irq_chip, handle_level_irq, IRQ_AUTO_1,
7);
- m68k_setup_user_interrupt(VEC_USER, 128, NULL);
+ m68k_setup_user_interrupt(VEC_USER, 128);
if (request_irq(IRQ_AUTO_5, sun3_int5, 0, "int5", NULL))
pr_err("Couldn't register %s interrupt\n", "int5");
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 27/27] m68k/mac: Remove mac_irq_{en,dis}able() wrappers
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
` (25 preceding siblings ...)
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 ` Geert Uytterhoeven
2011-10-31 1:29 ` [PATCH 00/27 v7] m68k: Convert to genirq Greg Ungerer
27 siblings, 0 replies; 29+ messages in thread
From: Geert Uytterhoeven @ 2011-10-30 12:48 UTC (permalink / raw)
To: linux-m68k; +Cc: linux-kernel, Greg Ungerer, Finn Thain, Geert Uytterhoeven
From: Finn Thain <fthain@telegraphics.com.au>
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
---
arch/m68k/include/asm/macintosh.h | 2 ++
arch/m68k/mac/baboon.c | 7 ++-----
arch/m68k/mac/macints.c | 25 +++++++------------------
3 files changed, 11 insertions(+), 23 deletions(-)
diff --git a/arch/m68k/include/asm/macintosh.h b/arch/m68k/include/asm/macintosh.h
index c2a1c5e..12ebe43 100644
--- a/arch/m68k/include/asm/macintosh.h
+++ b/arch/m68k/include/asm/macintosh.h
@@ -12,6 +12,8 @@ extern void mac_reset(void);
extern void mac_poweroff(void);
extern void mac_init_IRQ(void);
extern int mac_irq_pending(unsigned int);
+extern void mac_irq_enable(struct irq_data *data);
+extern void mac_irq_disable(struct irq_data *data);
/*
* Floppy driver magic hook - probably shouldn't be here
diff --git a/arch/m68k/mac/baboon.c b/arch/m68k/mac/baboon.c
index b55ead2..b403924 100644
--- a/arch/m68k/mac/baboon.c
+++ b/arch/m68k/mac/baboon.c
@@ -21,9 +21,6 @@
/* #define DEBUG_IRQS */
-extern void mac_enable_irq(unsigned int);
-extern void mac_disable_irq(unsigned int);
-
int baboon_present;
static volatile struct baboon *baboon;
static unsigned char baboon_disabled;
@@ -111,7 +108,7 @@ void baboon_irq_enable(int irq)
baboon_disabled &= ~(1 << irq_idx);
if (!baboon_disabled)
- mac_enable_irq(IRQ_NUBUS_C);
+ mac_irq_enable(irq_get_irq_data(IRQ_NUBUS_C));
}
void baboon_irq_disable(int irq)
@@ -124,7 +121,7 @@ void baboon_irq_disable(int irq)
baboon_disabled |= 1 << irq_idx;
if (baboon_disabled)
- mac_disable_irq(IRQ_NUBUS_C);
+ mac_irq_disable(irq_get_irq_data(IRQ_NUBUS_C));
}
void baboon_irq_clear(int irq)
diff --git a/arch/m68k/mac/macints.c b/arch/m68k/mac/macints.c
index 98497d2..ba220b7 100644
--- a/arch/m68k/mac/macints.c
+++ b/arch/m68k/mac/macints.c
@@ -190,19 +190,6 @@ irqreturn_t mac_debug_handler(int, void *);
/* #define DEBUG_MACINTS */
-void mac_enable_irq(unsigned int irq);
-void mac_disable_irq(unsigned int irq);
-
-static void mac_irq_enable(struct irq_data *data)
-{
- mac_enable_irq(data->irq);
-}
-
-static void mac_irq_disable(struct irq_data *data)
-{
- mac_disable_irq(data->irq);
-}
-
static struct irq_chip mac_irq_chip = {
.name = "mac",
.irq_enable = mac_irq_enable,
@@ -250,16 +237,17 @@ void __init mac_init_IRQ(void)
}
/*
- * mac_enable_irq - enable an interrupt source
- * mac_disable_irq - disable an interrupt source
+ * mac_irq_enable - enable an interrupt source
+ * mac_irq_disable - disable an interrupt source
* mac_clear_irq - clears a pending interrupt
- * mac_pending_irq - Returns the pending status of an IRQ (nonzero = pending)
+ * mac_irq_pending - returns the pending status of an IRQ (nonzero = pending)
*
* These routines are just dispatchers to the VIA/OSS/PSC routines.
*/
-void mac_enable_irq(unsigned int irq)
+void mac_irq_enable(struct irq_data *data)
{
+ int irq = data->irq;
int irq_src = IRQ_SRC(irq);
switch(irq_src) {
@@ -292,8 +280,9 @@ void mac_enable_irq(unsigned int irq)
}
}
-void mac_disable_irq(unsigned int irq)
+void mac_irq_disable(struct irq_data *data)
{
+ int irq = data->irq;
int irq_src = IRQ_SRC(irq);
switch(irq_src) {
--
1.7.0.4
^ permalink raw reply related [flat|nested] 29+ messages in thread
* Re: [PATCH 00/27 v7] m68k: Convert to genirq
2011-10-30 12:48 [PATCH 00/27 v7] m68k: Convert to genirq Geert Uytterhoeven
` (26 preceding siblings ...)
2011-10-30 12:48 ` [PATCH 27/27] m68k/mac: Remove mac_irq_{en,dis}able() wrappers Geert Uytterhoeven
@ 2011-10-31 1:29 ` Greg Ungerer
27 siblings, 0 replies; 29+ messages in thread
From: Greg Ungerer @ 2011-10-31 1:29 UTC (permalink / raw)
To: Geert Uytterhoeven; +Cc: linux-m68k, linux-kernel, Greg Ungerer
Hi Geert,
On 30/10/11 22:48, Geert Uytterhoeven wrote:
> This patch series converts the m68k/mmu (nommu was converted before)
> architecture to the generic hardirq framework.
>
> - [01/27] ide-{cd,floppy,tape}: Do not include<linux/irq.h>
> - [02/27] m68k/irq: Rename irq_controller to irq_chip
> - [03/27] m68k/irq: Kill irq_node_t typedef, always use struct irq_node
> - [04/27] m68k/irq: Rename irq_node to irq_data
> - [05/27] m68k/irq: Switch irq_chip methods to "struct irq_data *data"
> - [06/27] m68k/irq: Rename setup_irq() to m68k_setup_irq() and make it static
> - [07/27] m68k/irq: Extract irq_set_chip()
> - [08/27] m68k/irq: Add m68k_setup_irq_controller()
> - [09/27] m68k/irq: Rename {,__}m68k_handle_int()
> - [10/27] m68k/irq: Remove obsolete IRQ_FLG_* users
> - [11/27] m68k/irq: Add genirq support
> - [12/27] m68k/atari: Convert Atari to genirq
> - [13/27] m68k/atari: Remove code and comments about different irq types
> - [14/27] m68k/amiga: Refactor amiints.c
> - [15/27] m68k/amiga: Convert Amiga to genirq
> - [16/27] m68k/amiga: Optimize interrupts using chain handlers
> - [17/27] m68k/mac: Convert Mac to genirq
> - [18/27] m68k/mac: Optimize interrupts using chain handlers
> - [19/27] m68k/hp300: Convert HP9000/300 and HP9000/400 to genirq
> - [20/27] m68k/vme: Convert VME to genirq
> - [21/27] m68k/apollo: Convert Apollo to genirq
> - [22/27] m68k/sun3: Use the kstat_irqs_cpu() wrapper
> - [23/27] m68k/sun3: Convert Sun3/3x to genirq
> - [24/27] m68k/q40: Convert Q40/Q60 to genirq
> - [25/27] m68k/irq: Remove obsolete m68k irq framework
> - [26/27] m68k/irq: Remove obsolete support for user vector interrupt fixups
> - [27/27] m68k/mac: Remove mac_irq_{en,dis}able() wrappers
>
> Changes in v7:
> - Rebased after arch/m68k/Kconfig restructuring:
> - The temporary USE_GENERIC_HARDIRQS is now in arch/m68k/Kconfig,
> depending on MMU,
> - Rebased after arch/m68k/kernel/Makefile merge,
> - Split off IRQ_FLG_* removal in separate commits:
> - Postpone removals in drivers that should go through the respective
> driver trees (net/scsi/staging/serial),
> - Postpone final removal to v3.3,
> - Dropped (went in via another tree):
> - genirq: Add missing "else" in irq_shutdown(),
> - keyboard: Do not include<linux/irq.>,
> - Added Patch 27 ("m68k/mac: Remove mac_irq_{en,dis}able() wrappers")
>
> I added this to the m68k for-next and for-3.2 branches.
>
> I'll rebase it once more on top of v3.2-rc1 once that comes out (currently
> it's based on a random base point).
This all looks really good.
Acked-by: Greg Ungerer <gerg@uclinux.org>
Regards
Greg
------------------------------------------------------------------------
Greg Ungerer -- Principal Engineer EMAIL: gerg@snapgear.com
SnapGear Group, McAfee PHONE: +61 7 3435 2888
8 Gardner Close FAX: +61 7 3217 5323
Milton, QLD, 4064, Australia WEB: http://www.SnapGear.com
^ permalink raw reply [flat|nested] 29+ messages in thread
end of thread, other threads:[~2011-10-31 1:29 UTC | newest]
Thread overview: 29+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 ` [PATCH 16/27] m68k/amiga: Optimize interrupts using chain handlers Geert Uytterhoeven
2011-10-30 12:48 ` [PATCH 17/27] m68k/mac: Convert Mac to genirq 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
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).