diff options
| -rw-r--r-- | kernel/irq/chip.c | 20 | ||||
| -rw-r--r-- | kernel/irq/spurious.c | 3 |
2 files changed, 21 insertions, 2 deletions
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index cc54c6276356..fdb3fbe2b0c4 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
| @@ -246,6 +246,17 @@ static unsigned int default_startup(unsigned int irq) | |||
| 246 | } | 246 | } |
| 247 | 247 | ||
| 248 | /* | 248 | /* |
| 249 | * default shutdown function | ||
| 250 | */ | ||
| 251 | static void default_shutdown(unsigned int irq) | ||
| 252 | { | ||
| 253 | struct irq_desc *desc = irq_desc + irq; | ||
| 254 | |||
| 255 | desc->chip->mask(irq); | ||
| 256 | desc->status |= IRQ_MASKED; | ||
| 257 | } | ||
| 258 | |||
| 259 | /* | ||
| 249 | * Fixup enable/disable function pointers | 260 | * Fixup enable/disable function pointers |
| 250 | */ | 261 | */ |
| 251 | void irq_chip_set_defaults(struct irq_chip *chip) | 262 | void irq_chip_set_defaults(struct irq_chip *chip) |
| @@ -256,8 +267,15 @@ void irq_chip_set_defaults(struct irq_chip *chip) | |||
| 256 | chip->disable = default_disable; | 267 | chip->disable = default_disable; |
| 257 | if (!chip->startup) | 268 | if (!chip->startup) |
| 258 | chip->startup = default_startup; | 269 | chip->startup = default_startup; |
| 270 | /* | ||
| 271 | * We use chip->disable, when the user provided its own. When | ||
| 272 | * we have default_disable set for chip->disable, then we need | ||
| 273 | * to use default_shutdown, otherwise the irq line is not | ||
| 274 | * disabled on free_irq(): | ||
| 275 | */ | ||
| 259 | if (!chip->shutdown) | 276 | if (!chip->shutdown) |
| 260 | chip->shutdown = chip->disable; | 277 | chip->shutdown = chip->disable != default_disable ? |
| 278 | chip->disable : default_shutdown; | ||
| 261 | if (!chip->name) | 279 | if (!chip->name) |
| 262 | chip->name = chip->typename; | 280 | chip->name = chip->typename; |
| 263 | if (!chip->end) | 281 | if (!chip->end) |
diff --git a/kernel/irq/spurious.c b/kernel/irq/spurious.c index a6b2bc831dd0..088dabbf2d6a 100644 --- a/kernel/irq/spurious.c +++ b/kernel/irq/spurious.c | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | * This file contains spurious interrupt handling. | 6 | * This file contains spurious interrupt handling. |
| 7 | */ | 7 | */ |
| 8 | 8 | ||
| 9 | #include <linux/jiffies.h> | ||
| 9 | #include <linux/irq.h> | 10 | #include <linux/irq.h> |
| 10 | #include <linux/module.h> | 11 | #include <linux/module.h> |
| 11 | #include <linux/kallsyms.h> | 12 | #include <linux/kallsyms.h> |
| @@ -179,7 +180,7 @@ void note_interrupt(unsigned int irq, struct irq_desc *desc, | |||
| 179 | * otherwise the couter becomes a doomsday timer for otherwise | 180 | * otherwise the couter becomes a doomsday timer for otherwise |
| 180 | * working systems | 181 | * working systems |
| 181 | */ | 182 | */ |
| 182 | if (jiffies - desc->last_unhandled > HZ/10) | 183 | if (time_after(jiffies, desc->last_unhandled + HZ/10)) |
| 183 | desc->irqs_unhandled = 1; | 184 | desc->irqs_unhandled = 1; |
| 184 | else | 185 | else |
| 185 | desc->irqs_unhandled++; | 186 | desc->irqs_unhandled++; |
