git://ftp.safe.ca
/
safe
/
jmp
/
linux-2.6
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
x86/uv: fix for no memory at paddr 0
[safe/jmp/linux-2.6]
/
kernel
/
irq
/
chip.c
diff --git
a/kernel/irq/chip.c
b/kernel/irq/chip.c
index
d96d6f6
..
c687ba4
100644
(file)
--- a/
kernel/irq/chip.c
+++ b/
kernel/irq/chip.c
@@
-27,7
+27,6
@@
void dynamic_irq_init(unsigned int irq)
struct irq_desc *desc;
unsigned long flags;
struct irq_desc *desc;
unsigned long flags;
- /* first time to use this irq_desc */
desc = irq_to_desc(irq);
if (!desc) {
WARN(1, KERN_ERR "Trying to initialize invalid IRQ%d\n", irq);
desc = irq_to_desc(irq);
if (!desc) {
WARN(1, KERN_ERR "Trying to initialize invalid IRQ%d\n", irq);
@@
-47,7
+46,10
@@
void dynamic_irq_init(unsigned int irq)
desc->irq_count = 0;
desc->irqs_unhandled = 0;
#ifdef CONFIG_SMP
desc->irq_count = 0;
desc->irqs_unhandled = 0;
#ifdef CONFIG_SMP
- cpus_setall(desc->affinity);
+ cpumask_setall(desc->affinity);
+#ifdef CONFIG_GENERIC_PENDING_IRQ
+ cpumask_clear(desc->pending_mask);
+#endif
#endif
spin_unlock_irqrestore(&desc->lock, flags);
}
#endif
spin_unlock_irqrestore(&desc->lock, flags);
}
@@
-58,10
+60,9
@@
void dynamic_irq_init(unsigned int irq)
*/
void dynamic_irq_cleanup(unsigned int irq)
{
*/
void dynamic_irq_cleanup(unsigned int irq)
{
- struct irq_desc *desc;
+ struct irq_desc *desc
= irq_to_desc(irq)
;
unsigned long flags;
unsigned long flags;
- desc = irq_to_desc(irq);
if (!desc) {
WARN(1, KERN_ERR "Trying to cleanup invalid IRQ%d\n", irq);
return;
if (!desc) {
WARN(1, KERN_ERR "Trying to cleanup invalid IRQ%d\n", irq);
return;
@@
-79,6
+80,8
@@
void dynamic_irq_cleanup(unsigned int irq)
desc->chip_data = NULL;
desc->handle_irq = handle_bad_irq;
desc->chip = &no_irq_chip;
desc->chip_data = NULL;
desc->handle_irq = handle_bad_irq;
desc->chip = &no_irq_chip;
+ desc->name = NULL;
+ clear_kstat_irqs(desc);
spin_unlock_irqrestore(&desc->lock, flags);
}
spin_unlock_irqrestore(&desc->lock, flags);
}
@@
-90,10
+93,9
@@
void dynamic_irq_cleanup(unsigned int irq)
*/
int set_irq_chip(unsigned int irq, struct irq_chip *chip)
{
*/
int set_irq_chip(unsigned int irq, struct irq_chip *chip)
{
- struct irq_desc *desc;
+ struct irq_desc *desc
= irq_to_desc(irq)
;
unsigned long flags;
unsigned long flags;
- desc = irq_to_desc(irq);
if (!desc) {
WARN(1, KERN_ERR "Trying to install chip for IRQ%d\n", irq);
return -EINVAL;
if (!desc) {
WARN(1, KERN_ERR "Trying to install chip for IRQ%d\n", irq);
return -EINVAL;
@@
-118,21
+120,21
@@
EXPORT_SYMBOL(set_irq_chip);
*/
int set_irq_type(unsigned int irq, unsigned int type)
{
*/
int set_irq_type(unsigned int irq, unsigned int type)
{
- struct irq_desc *desc;
+ struct irq_desc *desc
= irq_to_desc(irq)
;
unsigned long flags;
int ret = -ENXIO;
unsigned long flags;
int ret = -ENXIO;
- desc = irq_to_desc(irq);
if (!desc) {
printk(KERN_ERR "Trying to set irq type for IRQ%d\n", irq);
return -ENODEV;
}
if (!desc) {
printk(KERN_ERR "Trying to set irq type for IRQ%d\n", irq);
return -ENODEV;
}
+ type &= IRQ_TYPE_SENSE_MASK;
if (type == IRQ_TYPE_NONE)
return 0;
spin_lock_irqsave(&desc->lock, flags);
if (type == IRQ_TYPE_NONE)
return 0;
spin_lock_irqsave(&desc->lock, flags);
- ret = __irq_set_trigger(desc, irq,
flags
);
+ ret = __irq_set_trigger(desc, irq,
type
);
spin_unlock_irqrestore(&desc->lock, flags);
return ret;
}
spin_unlock_irqrestore(&desc->lock, flags);
return ret;
}
@@
-147,10
+149,9
@@
EXPORT_SYMBOL(set_irq_type);
*/
int set_irq_data(unsigned int irq, void *data)
{
*/
int set_irq_data(unsigned int irq, void *data)
{
- struct irq_desc *desc;
+ struct irq_desc *desc
= irq_to_desc(irq)
;
unsigned long flags;
unsigned long flags;
- desc = irq_to_desc(irq);
if (!desc) {
printk(KERN_ERR
"Trying to install controller data for IRQ%d\n", irq);
if (!desc) {
printk(KERN_ERR
"Trying to install controller data for IRQ%d\n", irq);
@@
-173,10
+174,9
@@
EXPORT_SYMBOL(set_irq_data);
*/
int set_irq_msi(unsigned int irq, struct msi_desc *entry)
{
*/
int set_irq_msi(unsigned int irq, struct msi_desc *entry)
{
- struct irq_desc *desc;
+ struct irq_desc *desc
= irq_to_desc(irq)
;
unsigned long flags;
unsigned long flags;
- desc = irq_to_desc(irq);
if (!desc) {
printk(KERN_ERR
"Trying to install msi data for IRQ%d\n", irq);
if (!desc) {
printk(KERN_ERR
"Trying to install msi data for IRQ%d\n", irq);
@@
-200,10
+200,9
@@
int set_irq_msi(unsigned int irq, struct msi_desc *entry)
*/
int set_irq_chip_data(unsigned int irq, void *data)
{
*/
int set_irq_chip_data(unsigned int irq, void *data)
{
- struct irq_desc *desc;
+ struct irq_desc *desc
= irq_to_desc(irq)
;
unsigned long flags;
unsigned long flags;
- desc = irq_to_desc(irq);
if (!desc) {
printk(KERN_ERR
"Trying to install chip data for IRQ%d\n", irq);
if (!desc) {
printk(KERN_ERR
"Trying to install chip data for IRQ%d\n", irq);
@@
-228,9
+227,8
@@
EXPORT_SYMBOL(set_irq_chip_data);
*/
static void default_enable(unsigned int irq)
{
*/
static void default_enable(unsigned int irq)
{
- struct irq_desc *desc;
+ struct irq_desc *desc
= irq_to_desc(irq)
;
- desc = irq_to_desc(irq);
desc->chip->unmask(irq);
desc->status &= ~IRQ_MASKED;
}
desc->chip->unmask(irq);
desc->status &= ~IRQ_MASKED;
}
@@
-247,11
+245,9
@@
static void default_disable(unsigned int irq)
*/
static unsigned int default_startup(unsigned int irq)
{
*/
static unsigned int default_startup(unsigned int irq)
{
- struct irq_desc *desc;
+ struct irq_desc *desc
= irq_to_desc(irq)
;
- desc = irq_to_desc(irq);
desc->chip->enable(irq);
desc->chip->enable(irq);
-
return 0;
}
return 0;
}
@@
-260,9
+256,8
@@
static unsigned int default_startup(unsigned int irq)
*/
static void default_shutdown(unsigned int irq)
{
*/
static void default_shutdown(unsigned int irq)
{
- struct irq_desc *desc;
+ struct irq_desc *desc
= irq_to_desc(irq)
;
- desc = irq_to_desc(irq);
desc->chip->mask(irq);
desc->status |= IRQ_MASKED;
}
desc->chip->mask(irq);
desc->status |= IRQ_MASKED;
}
@@
-299,7
+294,8
@@
static inline void mask_ack_irq(struct irq_desc *desc, int irq)
desc->chip->mask_ack(irq);
else {
desc->chip->mask(irq);
desc->chip->mask_ack(irq);
else {
desc->chip->mask(irq);
- desc->chip->ack(irq);
+ if (desc->chip->ack)
+ desc->chip->ack(irq);
}
}
}
}
@@
-363,6
+359,7
@@
handle_level_irq(unsigned int irq, struct irq_desc *desc)
spin_lock(&desc->lock);
mask_ack_irq(desc, irq);
spin_lock(&desc->lock);
mask_ack_irq(desc, irq);
+ desc = irq_remap_to_desc(irq, desc);
if (unlikely(desc->status & IRQ_INPROGRESS))
goto out_unlock;
if (unlikely(desc->status & IRQ_INPROGRESS))
goto out_unlock;
@@
-391,6
+388,7
@@
handle_level_irq(unsigned int irq, struct irq_desc *desc)
out_unlock:
spin_unlock(&desc->lock);
}
out_unlock:
spin_unlock(&desc->lock);
}
+EXPORT_SYMBOL_GPL(handle_level_irq);
/**
* handle_fasteoi_irq - irq handler for transparent controllers
/**
* handle_fasteoi_irq - irq handler for transparent controllers
@@
-440,6
+438,7
@@
handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc)
desc->status &= ~IRQ_INPROGRESS;
out:
desc->chip->eoi(irq);
desc->status &= ~IRQ_INPROGRESS;
out:
desc->chip->eoi(irq);
+ desc = irq_remap_to_desc(irq, desc);
spin_unlock(&desc->lock);
}
spin_unlock(&desc->lock);
}
@@
-476,12
+475,15
@@
handle_edge_irq(unsigned int irq, struct irq_desc *desc)
!desc->action)) {
desc->status |= (IRQ_PENDING | IRQ_MASKED);
mask_ack_irq(desc, irq);
!desc->action)) {
desc->status |= (IRQ_PENDING | IRQ_MASKED);
mask_ack_irq(desc, irq);
+ desc = irq_remap_to_desc(irq, desc);
goto out_unlock;
}
kstat_incr_irqs_this_cpu(irq, desc);
/* Start handling the irq */
goto out_unlock;
}
kstat_incr_irqs_this_cpu(irq, desc);
/* Start handling the irq */
- desc->chip->ack(irq);
+ if (desc->chip->ack)
+ desc->chip->ack(irq);
+ desc = irq_remap_to_desc(irq, desc);
/* Mark the IRQ currently in progress.*/
desc->status |= IRQ_INPROGRESS;
/* Mark the IRQ currently in progress.*/
desc->status |= IRQ_INPROGRESS;
@@
-542,18
+544,19
@@
handle_percpu_irq(unsigned int irq, struct irq_desc *desc)
if (!noirqdebug)
note_interrupt(irq, desc, action_ret);
if (!noirqdebug)
note_interrupt(irq, desc, action_ret);
- if (desc->chip->eoi)
+ if (desc->chip->eoi)
{
desc->chip->eoi(irq);
desc->chip->eoi(irq);
+ desc = irq_remap_to_desc(irq, desc);
+ }
}
void
__set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
const char *name)
{
}
void
__set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
const char *name)
{
- struct irq_desc *desc;
+ struct irq_desc *desc
= irq_to_desc(irq)
;
unsigned long flags;
unsigned long flags;
- desc = irq_to_desc(irq);
if (!desc) {
printk(KERN_ERR
"Trying to install type control for IRQ%d\n", irq);
if (!desc) {
printk(KERN_ERR
"Trying to install type control for IRQ%d\n", irq);
@@
-579,8
+582,10
@@
__set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
/* Uninstall? */
if (handle == handle_bad_irq) {
/* Uninstall? */
if (handle == handle_bad_irq) {
- if (desc->chip != &no_irq_chip)
+ if (desc->chip != &no_irq_chip)
{
mask_ack_irq(desc, irq);
mask_ack_irq(desc, irq);
+ desc = irq_remap_to_desc(irq, desc);
+ }
desc->status |= IRQ_DISABLED;
desc->depth = 1;
}
desc->status |= IRQ_DISABLED;
desc->depth = 1;
}
@@
-595,6
+600,7
@@
__set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
}
spin_unlock_irqrestore(&desc->lock, flags);
}
}
spin_unlock_irqrestore(&desc->lock, flags);
}
+EXPORT_SYMBOL_GPL(__set_irq_handler);
void
set_irq_chip_and_handler(unsigned int irq, struct irq_chip *chip,
void
set_irq_chip_and_handler(unsigned int irq, struct irq_chip *chip,
@@
-614,13
+620,11
@@
set_irq_chip_and_handler_name(unsigned int irq, struct irq_chip *chip,
void __init set_irq_noprobe(unsigned int irq)
{
void __init set_irq_noprobe(unsigned int irq)
{
- struct irq_desc *desc;
+ struct irq_desc *desc
= irq_to_desc(irq)
;
unsigned long flags;
unsigned long flags;
- desc = irq_to_desc(irq);
if (!desc) {
printk(KERN_ERR "Trying to mark IRQ%d non-probeable\n", irq);
if (!desc) {
printk(KERN_ERR "Trying to mark IRQ%d non-probeable\n", irq);
-
return;
}
return;
}
@@
-631,13
+635,11
@@
void __init set_irq_noprobe(unsigned int irq)
void __init set_irq_probe(unsigned int irq)
{
void __init set_irq_probe(unsigned int irq)
{
- struct irq_desc *desc;
+ struct irq_desc *desc
= irq_to_desc(irq)
;
unsigned long flags;
unsigned long flags;
- desc = irq_to_desc(irq);
if (!desc) {
printk(KERN_ERR "Trying to mark IRQ%d probeable\n", irq);
if (!desc) {
printk(KERN_ERR "Trying to mark IRQ%d probeable\n", irq);
-
return;
}
return;
}