diff options
Diffstat (limited to 'kernel/irq/chip.c')
| -rw-r--r-- | kernel/irq/chip.c | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 42ec11b2af8a..b7091d5ca2f8 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
| @@ -359,6 +359,23 @@ static inline void mask_ack_irq(struct irq_desc *desc, int irq) | |||
| 359 | if (desc->chip->ack) | 359 | if (desc->chip->ack) |
| 360 | desc->chip->ack(irq); | 360 | desc->chip->ack(irq); |
| 361 | } | 361 | } |
| 362 | desc->status |= IRQ_MASKED; | ||
| 363 | } | ||
| 364 | |||
| 365 | static inline void mask_irq(struct irq_desc *desc, int irq) | ||
| 366 | { | ||
| 367 | if (desc->chip->mask) { | ||
| 368 | desc->chip->mask(irq); | ||
| 369 | desc->status |= IRQ_MASKED; | ||
| 370 | } | ||
| 371 | } | ||
| 372 | |||
| 373 | static inline void unmask_irq(struct irq_desc *desc, int irq) | ||
| 374 | { | ||
| 375 | if (desc->chip->unmask) { | ||
| 376 | desc->chip->unmask(irq); | ||
| 377 | desc->status &= ~IRQ_MASKED; | ||
| 378 | } | ||
| 362 | } | 379 | } |
| 363 | 380 | ||
| 364 | /* | 381 | /* |
| @@ -484,10 +501,8 @@ handle_level_irq(unsigned int irq, struct irq_desc *desc) | |||
| 484 | raw_spin_lock(&desc->lock); | 501 | raw_spin_lock(&desc->lock); |
| 485 | desc->status &= ~IRQ_INPROGRESS; | 502 | desc->status &= ~IRQ_INPROGRESS; |
| 486 | 503 | ||
| 487 | if (unlikely(desc->status & IRQ_ONESHOT)) | 504 | if (!(desc->status & (IRQ_DISABLED | IRQ_ONESHOT))) |
| 488 | desc->status |= IRQ_MASKED; | 505 | unmask_irq(desc, irq); |
| 489 | else if (!(desc->status & IRQ_DISABLED) && desc->chip->unmask) | ||
| 490 | desc->chip->unmask(irq); | ||
| 491 | out_unlock: | 506 | out_unlock: |
| 492 | raw_spin_unlock(&desc->lock); | 507 | raw_spin_unlock(&desc->lock); |
| 493 | } | 508 | } |
| @@ -524,8 +539,7 @@ handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc) | |||
| 524 | action = desc->action; | 539 | action = desc->action; |
| 525 | if (unlikely(!action || (desc->status & IRQ_DISABLED))) { | 540 | if (unlikely(!action || (desc->status & IRQ_DISABLED))) { |
| 526 | desc->status |= IRQ_PENDING; | 541 | desc->status |= IRQ_PENDING; |
| 527 | if (desc->chip->mask) | 542 | mask_irq(desc, irq); |
| 528 | desc->chip->mask(irq); | ||
| 529 | goto out; | 543 | goto out; |
| 530 | } | 544 | } |
| 531 | 545 | ||
| @@ -593,7 +607,7 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc) | |||
| 593 | irqreturn_t action_ret; | 607 | irqreturn_t action_ret; |
| 594 | 608 | ||
| 595 | if (unlikely(!action)) { | 609 | if (unlikely(!action)) { |
| 596 | desc->chip->mask(irq); | 610 | mask_irq(desc, irq); |
| 597 | goto out_unlock; | 611 | goto out_unlock; |
| 598 | } | 612 | } |
| 599 | 613 | ||
| @@ -605,8 +619,7 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc) | |||
| 605 | if (unlikely((desc->status & | 619 | if (unlikely((desc->status & |
| 606 | (IRQ_PENDING | IRQ_MASKED | IRQ_DISABLED)) == | 620 | (IRQ_PENDING | IRQ_MASKED | IRQ_DISABLED)) == |
| 607 | (IRQ_PENDING | IRQ_MASKED))) { | 621 | (IRQ_PENDING | IRQ_MASKED))) { |
| 608 | desc->chip->unmask(irq); | 622 | unmask_irq(desc, irq); |
| 609 | desc->status &= ~IRQ_MASKED; | ||
| 610 | } | 623 | } |
| 611 | 624 | ||
| 612 | desc->status &= ~IRQ_PENDING; | 625 | desc->status &= ~IRQ_PENDING; |
| @@ -716,7 +729,7 @@ set_irq_chip_and_handler_name(unsigned int irq, struct irq_chip *chip, | |||
| 716 | __set_irq_handler(irq, handle, 0, name); | 729 | __set_irq_handler(irq, handle, 0, name); |
| 717 | } | 730 | } |
| 718 | 731 | ||
| 719 | void __init set_irq_noprobe(unsigned int irq) | 732 | void set_irq_noprobe(unsigned int irq) |
| 720 | { | 733 | { |
| 721 | struct irq_desc *desc = irq_to_desc(irq); | 734 | struct irq_desc *desc = irq_to_desc(irq); |
| 722 | unsigned long flags; | 735 | unsigned long flags; |
| @@ -731,7 +744,7 @@ void __init set_irq_noprobe(unsigned int irq) | |||
| 731 | raw_spin_unlock_irqrestore(&desc->lock, flags); | 744 | raw_spin_unlock_irqrestore(&desc->lock, flags); |
| 732 | } | 745 | } |
| 733 | 746 | ||
| 734 | void __init set_irq_probe(unsigned int irq) | 747 | void set_irq_probe(unsigned int irq) |
| 735 | { | 748 | { |
| 736 | struct irq_desc *desc = irq_to_desc(irq); | 749 | struct irq_desc *desc = irq_to_desc(irq); |
| 737 | unsigned long flags; | 750 | unsigned long flags; |
