git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'sii-m15w' into upstream
[pandora-kernel.git]
/
arch
/
sparc
/
kernel
/
irq.c
diff --git
a/arch/sparc/kernel/irq.c
b/arch/sparc/kernel/irq.c
index
4c60a6e
..
72f0201
100644
(file)
--- a/
arch/sparc/kernel/irq.c
+++ b/
arch/sparc/kernel/irq.c
@@
-11,7
+11,6
@@
* Copyright (C) 1998-2000 Anton Blanchard (anton@samba.org)
*/
* Copyright (C) 1998-2000 Anton Blanchard (anton@samba.org)
*/
-#include <linux/config.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/ptrace.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/ptrace.h>
@@
-154,9
+153,11
@@
void (*sparc_init_timers)(irqreturn_t (*)(int, void *,struct pt_regs *)) =
struct irqaction static_irqaction[MAX_STATIC_ALLOC];
int static_irq_count;
struct irqaction static_irqaction[MAX_STATIC_ALLOC];
int static_irq_count;
-struct irqaction *irq_action[NR_IRQS] = {
- [0 ... (NR_IRQS-1)] = NULL
-};
+struct {
+ struct irqaction *action;
+ int flags;
+} sparc_irq[NR_IRQS];
+#define SPARC_IRQ_INPROGRESS 1
/* Used to protect the IRQ action lists */
DEFINE_SPINLOCK(irq_action_lock);
/* Used to protect the IRQ action lists */
DEFINE_SPINLOCK(irq_action_lock);
@@
-177,7
+178,7
@@
int show_interrupts(struct seq_file *p, void *v)
}
spin_lock_irqsave(&irq_action_lock, flags);
if (i < NR_IRQS) {
}
spin_lock_irqsave(&irq_action_lock, flags);
if (i < NR_IRQS) {
- action =
*(i + irq_action)
;
+ action =
sparc_irq[i].action
;
if (!action)
goto out_unlock;
seq_printf(p, "%3d: ", i);
if (!action)
goto out_unlock;
seq_printf(p, "%3d: ", i);
@@
-186,15
+187,15
@@
int show_interrupts(struct seq_file *p, void *v)
#else
for_each_online_cpu(j) {
seq_printf(p, "%10u ",
#else
for_each_online_cpu(j) {
seq_printf(p, "%10u ",
- kstat_cpu(
cpu_logical_map(j)
).irqs[i]);
+ kstat_cpu(
j
).irqs[i]);
}
#endif
seq_printf(p, " %c %s",
}
#endif
seq_printf(p, " %c %s",
- (action->flags &
SA_INTERRUPT
) ? '+' : ' ',
+ (action->flags &
IRQF_DISABLED
) ? '+' : ' ',
action->name);
for (action=action->next; action; action = action->next) {
seq_printf(p, ",%s %s",
action->name);
for (action=action->next; action; action = action->next) {
seq_printf(p, ",%s %s",
- (action->flags &
SA_INTERRUPT
) ? " +" : "",
+ (action->flags &
IRQF_DISABLED
) ? " +" : "",
action->name);
}
seq_putc(p, '\n');
action->name);
}
seq_putc(p, '\n');
@@
-207,7
+208,7
@@
out_unlock:
void free_irq(unsigned int irq, void *dev_id)
{
struct irqaction * action;
void free_irq(unsigned int irq, void *dev_id)
{
struct irqaction * action;
- struct irqaction *
tmp = NULL
;
+ struct irqaction *
*actionp
;
unsigned long flags;
unsigned int cpu_irq;
unsigned long flags;
unsigned int cpu_irq;
@@
-225,7
+226,8
@@
void free_irq(unsigned int irq, void *dev_id)
spin_lock_irqsave(&irq_action_lock, flags);
spin_lock_irqsave(&irq_action_lock, flags);
- action = *(cpu_irq + irq_action);
+ actionp = &sparc_irq[cpu_irq].action;
+ action = *actionp;
if (!action->handler) {
printk("Trying to free free IRQ%d\n",irq);
if (!action->handler) {
printk("Trying to free free IRQ%d\n",irq);
@@
-235,13
+237,13
@@
void free_irq(unsigned int irq, void *dev_id)
for (; action; action = action->next) {
if (action->dev_id == dev_id)
break;
for (; action; action = action->next) {
if (action->dev_id == dev_id)
break;
-
tmp = action
;
+
actionp = &action->next
;
}
if (!action) {
printk("Trying to free free shared IRQ%d\n",irq);
goto out_unlock;
}
}
if (!action) {
printk("Trying to free free shared IRQ%d\n",irq);
goto out_unlock;
}
- } else if (action->flags &
SA_SHIRQ
) {
+ } else if (action->flags &
IRQF_SHARED
) {
printk("Trying to free shared IRQ%d with NULL device ID\n", irq);
goto out_unlock;
}
printk("Trying to free shared IRQ%d with NULL device ID\n", irq);
goto out_unlock;
}
@@
-254,11
+256,8
@@
void free_irq(unsigned int irq, void *dev_id)
irq, action->name);
goto out_unlock;
}
irq, action->name);
goto out_unlock;
}
-
- if (action && tmp)
- tmp->next = action->next;
- else
- *(cpu_irq + irq_action) = action->next;
+
+ *actionp = action->next;
spin_unlock_irqrestore(&irq_action_lock, flags);
spin_unlock_irqrestore(&irq_action_lock, flags);
@@
-268,7
+267,7
@@
void free_irq(unsigned int irq, void *dev_id)
kfree(action);
kfree(action);
- if (!
(*(cpu_irq + irq_action))
)
+ if (!
sparc_irq[cpu_irq].action
)
disable_irq(irq);
out_unlock:
disable_irq(irq);
out_unlock:
@@
-287,8
+286,11
@@
EXPORT_SYMBOL(free_irq);
#ifdef CONFIG_SMP
void synchronize_irq(unsigned int irq)
{
#ifdef CONFIG_SMP
void synchronize_irq(unsigned int irq)
{
- printk("synchronize_irq says: implement me!\n");
- BUG();
+ unsigned int cpu_irq;
+
+ cpu_irq = irq & (NR_IRQS - 1);
+ while (sparc_irq[cpu_irq].flags & SPARC_IRQ_INPROGRESS)
+ cpu_relax();
}
#endif /* SMP */
}
#endif /* SMP */
@@
-299,7
+301,7
@@
void unexpected_irq(int irq, void *dev_id, struct pt_regs * regs)
unsigned int cpu_irq;
cpu_irq = irq & (NR_IRQS - 1);
unsigned int cpu_irq;
cpu_irq = irq & (NR_IRQS - 1);
- action =
*(cpu_irq + irq_action)
;
+ action =
sparc_irq[cpu_irq].action
;
printk("IO device interrupt, irq = %d\n", irq);
printk("PC = %08lx NPC = %08lx FP=%08lx\n", regs->pc,
printk("IO device interrupt, irq = %d\n", irq);
printk("PC = %08lx NPC = %08lx FP=%08lx\n", regs->pc,
@@
-327,10
+329,11
@@
void handler_irq(int irq, struct pt_regs * regs)
disable_pil_irq(irq);
#ifdef CONFIG_SMP
/* Only rotate on lower priority IRQ's (scsi, ethernet, etc.). */
disable_pil_irq(irq);
#ifdef CONFIG_SMP
/* Only rotate on lower priority IRQ's (scsi, ethernet, etc.). */
- if(
irq < 10
)
+ if(
(sparc_cpu_model==sun4m) && (irq < 10)
)
smp4m_irq_rotate(cpu);
#endif
smp4m_irq_rotate(cpu);
#endif
- action = *(irq + irq_action);
+ action = sparc_irq[irq].action;
+ sparc_irq[irq].flags |= SPARC_IRQ_INPROGRESS;
kstat_cpu(cpu).irqs[irq]++;
do {
if (!action || !action->handler)
kstat_cpu(cpu).irqs[irq]++;
do {
if (!action || !action->handler)
@@
-338,6
+341,7
@@
void handler_irq(int irq, struct pt_regs * regs)
action->handler(irq, action->dev_id, regs);
action = action->next;
} while (action);
action->handler(irq, action->dev_id, regs);
action = action->next;
} while (action);
+ sparc_irq[irq].flags &= ~SPARC_IRQ_INPROGRESS;
enable_pil_irq(irq);
irq_exit();
}
enable_pil_irq(irq);
irq_exit();
}
@@
-389,11
+393,11
@@
int request_fast_irq(unsigned int irq,
spin_lock_irqsave(&irq_action_lock, flags);
spin_lock_irqsave(&irq_action_lock, flags);
- action =
*(cpu_irq + irq_action)
;
+ action =
sparc_irq[cpu_irq].action
;
if(action) {
if(action) {
- if(action->flags &
SA_SHIRQ
)
+ if(action->flags &
IRQF_SHARED
)
panic("Trying to register fast irq when already shared.\n");
panic("Trying to register fast irq when already shared.\n");
- if(irqflags &
SA_SHIRQ
)
+ if(irqflags &
IRQF_SHARED
)
panic("Trying to register fast irq as shared.\n");
/* Anyway, someone already owns it so cannot be made fast. */
panic("Trying to register fast irq as shared.\n");
/* Anyway, someone already owns it so cannot be made fast. */
@@
-452,7
+456,7
@@
int request_fast_irq(unsigned int irq,
action->dev_id = NULL;
action->next = NULL;
action->dev_id = NULL;
action->next = NULL;
-
*(cpu_irq + irq_action)
= action;
+
sparc_irq[cpu_irq].action
= action;
enable_irq(irq);
enable_irq(irq);
@@
-467,7
+471,7
@@
int request_irq(unsigned int irq,
irqreturn_t (*handler)(int, void *, struct pt_regs *),
unsigned long irqflags, const char * devname, void *dev_id)
{
irqreturn_t (*handler)(int, void *, struct pt_regs *),
unsigned long irqflags, const char * devname, void *dev_id)
{
- struct irqaction * action, *
tmp = NULL
;
+ struct irqaction * action, *
*actionp
;
unsigned long flags;
unsigned int cpu_irq;
int ret;
unsigned long flags;
unsigned int cpu_irq;
int ret;
@@
-490,20
+494,20
@@
int request_irq(unsigned int irq,
spin_lock_irqsave(&irq_action_lock, flags);
spin_lock_irqsave(&irq_action_lock, flags);
- action = *(cpu_irq + irq_action);
+ actionp = &sparc_irq[cpu_irq].action;
+ action = *actionp;
if (action) {
if (action) {
- if ((action->flags & SA_SHIRQ) && (irqflags & SA_SHIRQ)) {
- for (tmp = action; tmp->next; tmp = tmp->next);
- } else {
+ if (!(action->flags & IRQF_SHARED) || !(irqflags & IRQF_SHARED)) {
ret = -EBUSY;
goto out_unlock;
}
ret = -EBUSY;
goto out_unlock;
}
- if ((action->flags &
SA_INTERRUPT) ^ (irqflags & SA_INTERRUPT
)) {
+ if ((action->flags &
IRQF_DISABLED) != (irqflags & IRQF_DISABLED
)) {
printk("Attempt to mix fast and slow interrupts on IRQ%d denied\n", irq);
ret = -EBUSY;
goto out_unlock;
printk("Attempt to mix fast and slow interrupts on IRQ%d denied\n", irq);
ret = -EBUSY;
goto out_unlock;
- }
- action = NULL; /* Or else! */
+ }
+ for ( ; action; action = *actionp)
+ actionp = &action->next;
}
/* If this is flagged as statically allocated then we use our
}
/* If this is flagged as statically allocated then we use our
@@
-532,10
+536,7
@@
int request_irq(unsigned int irq,
action->next = NULL;
action->dev_id = dev_id;
action->next = NULL;
action->dev_id = dev_id;
- if (tmp)
- tmp->next = action;
- else
- *(cpu_irq + irq_action) = action;
+ *actionp = action;
enable_irq(irq);
enable_irq(irq);