diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2010-09-27 08:44:35 -0400 |
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2010-10-04 06:43:35 -0400 |
| commit | 3876ec9ef3775d062345b3760d3271ecb8cd3fea (patch) | |
| tree | 6c1cd233753fe09d48bdf107da34b4dbe4e003fc | |
| parent | a77c4635915021c646cc017f22239e66d1aab4d5 (diff) | |
genirq: Provide compat handling for bus_lock/bus_sync_unlock
Wrap the old chip functions for bus_lock/bus_sync_unlock until the
migration is complete and the old chip functions are removed.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Peter Zijlstra <peterz@infradead.org>
LKML-Reference: <20100927121841.842536121@linutronix.de>
Reviewed-by: H. Peter Anvin <hpa@zytor.com>
Reviewed-by: Ingo Molnar <mingo@elte.hu>
| -rw-r--r-- | kernel/irq/chip.c | 20 | ||||
| -rw-r--r-- | kernel/irq/internals.h | 12 | ||||
| -rw-r--r-- | kernel/irq/manage.c | 22 |
3 files changed, 35 insertions, 19 deletions
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index e0e93ff10afd..77e551d92239 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
| @@ -324,6 +324,17 @@ static void default_shutdown(unsigned int irq) | |||
| 324 | desc->status |= IRQ_MASKED; | 324 | desc->status |= IRQ_MASKED; |
| 325 | } | 325 | } |
| 326 | 326 | ||
| 327 | /* Temporary migration helpers */ | ||
| 328 | static void compat_bus_lock(struct irq_data *data) | ||
| 329 | { | ||
| 330 | data->chip->bus_lock(data->irq); | ||
| 331 | } | ||
| 332 | |||
| 333 | static void compat_bus_sync_unlock(struct irq_data *data) | ||
| 334 | { | ||
| 335 | data->chip->bus_sync_unlock(data->irq); | ||
| 336 | } | ||
| 337 | |||
| 327 | /* | 338 | /* |
| 328 | * Fixup enable/disable function pointers | 339 | * Fixup enable/disable function pointers |
| 329 | */ | 340 | */ |
| @@ -346,6 +357,11 @@ void irq_chip_set_defaults(struct irq_chip *chip) | |||
| 346 | chip->disable : default_shutdown; | 357 | chip->disable : default_shutdown; |
| 347 | if (!chip->end) | 358 | if (!chip->end) |
| 348 | chip->end = dummy_irq_chip.end; | 359 | chip->end = dummy_irq_chip.end; |
| 360 | |||
| 361 | if (chip->bus_lock) | ||
| 362 | chip->irq_bus_lock = compat_bus_lock; | ||
| 363 | if (chip->bus_sync_unlock) | ||
| 364 | chip->irq_bus_sync_unlock = compat_bus_sync_unlock; | ||
| 349 | } | 365 | } |
| 350 | 366 | ||
| 351 | static inline void mask_ack_irq(struct irq_desc *desc, int irq) | 367 | static inline void mask_ack_irq(struct irq_desc *desc, int irq) |
| @@ -687,7 +703,7 @@ __set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained, | |||
| 687 | desc->irq_data.chip = &dummy_irq_chip; | 703 | desc->irq_data.chip = &dummy_irq_chip; |
| 688 | } | 704 | } |
| 689 | 705 | ||
| 690 | chip_bus_lock(irq, desc); | 706 | chip_bus_lock(desc); |
| 691 | raw_spin_lock_irqsave(&desc->lock, flags); | 707 | raw_spin_lock_irqsave(&desc->lock, flags); |
| 692 | 708 | ||
| 693 | /* Uninstall? */ | 709 | /* Uninstall? */ |
| @@ -707,7 +723,7 @@ __set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained, | |||
| 707 | desc->irq_data.chip->startup(irq); | 723 | desc->irq_data.chip->startup(irq); |
| 708 | } | 724 | } |
| 709 | raw_spin_unlock_irqrestore(&desc->lock, flags); | 725 | raw_spin_unlock_irqrestore(&desc->lock, flags); |
| 710 | chip_bus_sync_unlock(irq, desc); | 726 | chip_bus_sync_unlock(desc); |
| 711 | } | 727 | } |
| 712 | EXPORT_SYMBOL_GPL(__set_irq_handler); | 728 | EXPORT_SYMBOL_GPL(__set_irq_handler); |
| 713 | 729 | ||
diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h index 562fc7eeabec..ecafbfee5b12 100644 --- a/kernel/irq/internals.h +++ b/kernel/irq/internals.h | |||
| @@ -43,16 +43,16 @@ extern int irq_select_affinity_usr(unsigned int irq); | |||
| 43 | extern void irq_set_thread_affinity(struct irq_desc *desc); | 43 | extern void irq_set_thread_affinity(struct irq_desc *desc); |
| 44 | 44 | ||
| 45 | /* Inline functions for support of irq chips on slow busses */ | 45 | /* Inline functions for support of irq chips on slow busses */ |
| 46 | static inline void chip_bus_lock(unsigned int irq, struct irq_desc *desc) | 46 | static inline void chip_bus_lock(struct irq_desc *desc) |
| 47 | { | 47 | { |
| 48 | if (unlikely(desc->irq_data.chip->bus_lock)) | 48 | if (unlikely(desc->irq_data.chip->irq_bus_lock)) |
| 49 | desc->irq_data.chip->bus_lock(irq); | 49 | desc->irq_data.chip->irq_bus_lock(&desc->irq_data); |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | static inline void chip_bus_sync_unlock(unsigned int irq, struct irq_desc *desc) | 52 | static inline void chip_bus_sync_unlock(struct irq_desc *desc) |
| 53 | { | 53 | { |
| 54 | if (unlikely(desc->irq_data.chip->bus_sync_unlock)) | 54 | if (unlikely(desc->irq_data.chip->irq_bus_sync_unlock)) |
| 55 | desc->irq_data.chip->bus_sync_unlock(irq); | 55 | desc->irq_data.chip->irq_bus_sync_unlock(&desc->irq_data); |
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | /* | 58 | /* |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 4dfb19521d9f..dfb02ff7d2ef 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
| @@ -246,11 +246,11 @@ void disable_irq_nosync(unsigned int irq) | |||
| 246 | if (!desc) | 246 | if (!desc) |
| 247 | return; | 247 | return; |
| 248 | 248 | ||
| 249 | chip_bus_lock(irq, desc); | 249 | chip_bus_lock(desc); |
| 250 | raw_spin_lock_irqsave(&desc->lock, flags); | 250 | raw_spin_lock_irqsave(&desc->lock, flags); |
| 251 | __disable_irq(desc, irq, false); | 251 | __disable_irq(desc, irq, false); |
| 252 | raw_spin_unlock_irqrestore(&desc->lock, flags); | 252 | raw_spin_unlock_irqrestore(&desc->lock, flags); |
| 253 | chip_bus_sync_unlock(irq, desc); | 253 | chip_bus_sync_unlock(desc); |
| 254 | } | 254 | } |
| 255 | EXPORT_SYMBOL(disable_irq_nosync); | 255 | EXPORT_SYMBOL(disable_irq_nosync); |
| 256 | 256 | ||
| @@ -323,11 +323,11 @@ void enable_irq(unsigned int irq) | |||
| 323 | if (!desc) | 323 | if (!desc) |
| 324 | return; | 324 | return; |
| 325 | 325 | ||
| 326 | chip_bus_lock(irq, desc); | 326 | chip_bus_lock(desc); |
| 327 | raw_spin_lock_irqsave(&desc->lock, flags); | 327 | raw_spin_lock_irqsave(&desc->lock, flags); |
| 328 | __enable_irq(desc, irq, false); | 328 | __enable_irq(desc, irq, false); |
| 329 | raw_spin_unlock_irqrestore(&desc->lock, flags); | 329 | raw_spin_unlock_irqrestore(&desc->lock, flags); |
| 330 | chip_bus_sync_unlock(irq, desc); | 330 | chip_bus_sync_unlock(desc); |
| 331 | } | 331 | } |
| 332 | EXPORT_SYMBOL(enable_irq); | 332 | EXPORT_SYMBOL(enable_irq); |
| 333 | 333 | ||
| @@ -507,7 +507,7 @@ static int irq_wait_for_interrupt(struct irqaction *action) | |||
| 507 | static void irq_finalize_oneshot(unsigned int irq, struct irq_desc *desc) | 507 | static void irq_finalize_oneshot(unsigned int irq, struct irq_desc *desc) |
| 508 | { | 508 | { |
| 509 | again: | 509 | again: |
| 510 | chip_bus_lock(irq, desc); | 510 | chip_bus_lock(desc); |
| 511 | raw_spin_lock_irq(&desc->lock); | 511 | raw_spin_lock_irq(&desc->lock); |
| 512 | 512 | ||
| 513 | /* | 513 | /* |
| @@ -521,7 +521,7 @@ again: | |||
| 521 | */ | 521 | */ |
| 522 | if (unlikely(desc->status & IRQ_INPROGRESS)) { | 522 | if (unlikely(desc->status & IRQ_INPROGRESS)) { |
| 523 | raw_spin_unlock_irq(&desc->lock); | 523 | raw_spin_unlock_irq(&desc->lock); |
| 524 | chip_bus_sync_unlock(irq, desc); | 524 | chip_bus_sync_unlock(desc); |
| 525 | cpu_relax(); | 525 | cpu_relax(); |
| 526 | goto again; | 526 | goto again; |
| 527 | } | 527 | } |
| @@ -531,7 +531,7 @@ again: | |||
| 531 | desc->irq_data.chip->unmask(irq); | 531 | desc->irq_data.chip->unmask(irq); |
| 532 | } | 532 | } |
| 533 | raw_spin_unlock_irq(&desc->lock); | 533 | raw_spin_unlock_irq(&desc->lock); |
| 534 | chip_bus_sync_unlock(irq, desc); | 534 | chip_bus_sync_unlock(desc); |
| 535 | } | 535 | } |
| 536 | 536 | ||
| 537 | #ifdef CONFIG_SMP | 537 | #ifdef CONFIG_SMP |
| @@ -997,9 +997,9 @@ void free_irq(unsigned int irq, void *dev_id) | |||
| 997 | if (!desc) | 997 | if (!desc) |
| 998 | return; | 998 | return; |
| 999 | 999 | ||
| 1000 | chip_bus_lock(irq, desc); | 1000 | chip_bus_lock(desc); |
| 1001 | kfree(__free_irq(irq, dev_id)); | 1001 | kfree(__free_irq(irq, dev_id)); |
| 1002 | chip_bus_sync_unlock(irq, desc); | 1002 | chip_bus_sync_unlock(desc); |
| 1003 | } | 1003 | } |
| 1004 | EXPORT_SYMBOL(free_irq); | 1004 | EXPORT_SYMBOL(free_irq); |
| 1005 | 1005 | ||
| @@ -1086,9 +1086,9 @@ int request_threaded_irq(unsigned int irq, irq_handler_t handler, | |||
| 1086 | action->name = devname; | 1086 | action->name = devname; |
| 1087 | action->dev_id = dev_id; | 1087 | action->dev_id = dev_id; |
| 1088 | 1088 | ||
| 1089 | chip_bus_lock(irq, desc); | 1089 | chip_bus_lock(desc); |
| 1090 | retval = __setup_irq(irq, desc, action); | 1090 | retval = __setup_irq(irq, desc, action); |
| 1091 | chip_bus_sync_unlock(irq, desc); | 1091 | chip_bus_sync_unlock(desc); |
| 1092 | 1092 | ||
| 1093 | if (retval) | 1093 | if (retval) |
| 1094 | kfree(action); | 1094 | kfree(action); |
