diff options
| author | Marc Zyngier <marc.zyngier@arm.com> | 2015-03-18 07:01:22 -0400 |
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2015-04-08 17:28:28 -0400 |
| commit | 1b7047edfcfb257f69e306c9afbab150cb987717 (patch) | |
| tree | 68b2383acee6ce6a58900507e797e9c6178e4a5b /include/linux/interrupt.h | |
| parent | fe0c52fc003bc046380e52fe6799c96d770770cc (diff) | |
genirq: Allow the irqchip state of an IRQ to be save/restored
There is a number of cases where a kernel subsystem may want to
introspect the state of an interrupt at the irqchip level:
- When a peripheral is shared between virtual machines,
its interrupt state becomes part of the guest's state,
and must be switched accordingly. KVM on arm/arm64 requires
this for its guest-visible timer
- Some GPIO controllers seem to require peeking into the
interrupt controller they are connected to to report
their internal state
This seem to be a pattern that is common enough for the core code
to try and support this without too many horrible hacks. Introduce
a pair of accessors (irq_get_irqchip_state/irq_set_irqchip_state)
to retrieve the bits that can be of interest to another subsystem:
pending, active, and masked.
- irq_get_irqchip_state returns the state of the interrupt according
to a parameter set to IRQCHIP_STATE_PENDING, IRQCHIP_STATE_ACTIVE,
IRQCHIP_STATE_MASKED or IRQCHIP_STATE_LINE_LEVEL.
- irq_set_irqchip_state similarly sets the state of the interrupt.
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Reviewed-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
Tested-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
Cc: linux-arm-kernel@lists.infradead.org
Cc: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
Cc: Stephen Boyd <sboyd@codeaurora.org>
Cc: Phong Vo <pvo@apm.com>
Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: Tin Huynh <tnhuynh@apm.com>
Cc: Y Vo <yvo@apm.com>
Cc: Toan Le <toanle@apm.com>
Cc: Bjorn Andersson <bjorn@kryo.se>
Cc: Jason Cooper <jason@lakedaemon.net>
Cc: Arnd Bergmann <arnd@arndb.de>
Link: http://lkml.kernel.org/r/1426676484-21812-2-git-send-email-marc.zyngier@arm.com
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'include/linux/interrupt.h')
| -rw-r--r-- | include/linux/interrupt.h | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index 150dde04cf4f..950ae4501826 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h | |||
| @@ -361,6 +361,20 @@ static inline int disable_irq_wake(unsigned int irq) | |||
| 361 | return irq_set_irq_wake(irq, 0); | 361 | return irq_set_irq_wake(irq, 0); |
| 362 | } | 362 | } |
| 363 | 363 | ||
| 364 | /* | ||
| 365 | * irq_get_irqchip_state/irq_set_irqchip_state specific flags | ||
| 366 | */ | ||
| 367 | enum irqchip_irq_state { | ||
| 368 | IRQCHIP_STATE_PENDING, /* Is interrupt pending? */ | ||
| 369 | IRQCHIP_STATE_ACTIVE, /* Is interrupt in progress? */ | ||
| 370 | IRQCHIP_STATE_MASKED, /* Is interrupt masked? */ | ||
| 371 | IRQCHIP_STATE_LINE_LEVEL, /* Is IRQ line high? */ | ||
| 372 | }; | ||
| 373 | |||
| 374 | extern int irq_get_irqchip_state(unsigned int irq, enum irqchip_irq_state which, | ||
| 375 | bool *state); | ||
| 376 | extern int irq_set_irqchip_state(unsigned int irq, enum irqchip_irq_state which, | ||
| 377 | bool state); | ||
| 364 | 378 | ||
| 365 | #ifdef CONFIG_IRQ_FORCED_THREADING | 379 | #ifdef CONFIG_IRQ_FORCED_THREADING |
| 366 | extern bool force_irqthreads; | 380 | extern bool force_irqthreads; |
