diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-08-22 10:45:36 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-08-22 10:45:36 -0400 |
| commit | 84f3fe460838df2ecd80bf9ed943a1b557e81354 (patch) | |
| tree | e92e29c7ef42681541439e25453274998e368d97 | |
| parent | f8a89fc05a81d8cae63890e8d52489de8e700fee (diff) | |
| parent | 8200fe4347870d4ad6475048bcdf3e7c106c5268 (diff) | |
Merge branch 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull irq fixes from Thomas Gleixner:
"A series of small fixlets for a regression visible on OMAP devices
caused by the conversion of the OMAP interrupt chips to hierarchical
interrupt domains. Mostly one liners on the driver side plus a small
helper function in the core to avoid open coded mess in the drivers"
* 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
irqchip/crossbar: Restore set_wake functionality
irqchip/crossbar: Restore the mask on suspend behaviour
ARM: OMAP: wakeupgen: Restore the irq_set_type() mechanism
irqchip/crossbar: Restore the irq_set_type() mechanism
genirq: Introduce irq_chip_set_type_parent() helper
genirq: Don't return ENOSYS in irq_chip_retrigger_hierarchy
| -rw-r--r-- | arch/arm/mach-omap2/omap-wakeupgen.c | 1 | ||||
| -rw-r--r-- | drivers/irqchip/irq-crossbar.c | 4 | ||||
| -rw-r--r-- | include/linux/irq.h | 1 | ||||
| -rw-r--r-- | kernel/irq/chip.c | 19 |
4 files changed, 23 insertions, 2 deletions
diff --git a/arch/arm/mach-omap2/omap-wakeupgen.c b/arch/arm/mach-omap2/omap-wakeupgen.c index 8e52621b5a6b..e1d2e991d17a 100644 --- a/arch/arm/mach-omap2/omap-wakeupgen.c +++ b/arch/arm/mach-omap2/omap-wakeupgen.c | |||
| @@ -392,6 +392,7 @@ static struct irq_chip wakeupgen_chip = { | |||
| 392 | .irq_mask = wakeupgen_mask, | 392 | .irq_mask = wakeupgen_mask, |
| 393 | .irq_unmask = wakeupgen_unmask, | 393 | .irq_unmask = wakeupgen_unmask, |
| 394 | .irq_retrigger = irq_chip_retrigger_hierarchy, | 394 | .irq_retrigger = irq_chip_retrigger_hierarchy, |
| 395 | .irq_set_type = irq_chip_set_type_parent, | ||
| 395 | .flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MASK_ON_SUSPEND, | 396 | .flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MASK_ON_SUSPEND, |
| 396 | #ifdef CONFIG_SMP | 397 | #ifdef CONFIG_SMP |
| 397 | .irq_set_affinity = irq_chip_set_affinity_parent, | 398 | .irq_set_affinity = irq_chip_set_affinity_parent, |
diff --git a/drivers/irqchip/irq-crossbar.c b/drivers/irqchip/irq-crossbar.c index 692fe2bc8197..c12bb93334ff 100644 --- a/drivers/irqchip/irq-crossbar.c +++ b/drivers/irqchip/irq-crossbar.c | |||
| @@ -68,7 +68,9 @@ static struct irq_chip crossbar_chip = { | |||
| 68 | .irq_mask = irq_chip_mask_parent, | 68 | .irq_mask = irq_chip_mask_parent, |
| 69 | .irq_unmask = irq_chip_unmask_parent, | 69 | .irq_unmask = irq_chip_unmask_parent, |
| 70 | .irq_retrigger = irq_chip_retrigger_hierarchy, | 70 | .irq_retrigger = irq_chip_retrigger_hierarchy, |
| 71 | .irq_set_wake = irq_chip_set_wake_parent, | 71 | .irq_set_type = irq_chip_set_type_parent, |
| 72 | .flags = IRQCHIP_MASK_ON_SUSPEND | | ||
| 73 | IRQCHIP_SKIP_SET_WAKE, | ||
| 72 | #ifdef CONFIG_SMP | 74 | #ifdef CONFIG_SMP |
| 73 | .irq_set_affinity = irq_chip_set_affinity_parent, | 75 | .irq_set_affinity = irq_chip_set_affinity_parent, |
| 74 | #endif | 76 | #endif |
diff --git a/include/linux/irq.h b/include/linux/irq.h index 92188b0225bb..51744bcf74ee 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
| @@ -484,6 +484,7 @@ extern int irq_chip_set_affinity_parent(struct irq_data *data, | |||
| 484 | extern int irq_chip_set_wake_parent(struct irq_data *data, unsigned int on); | 484 | extern int irq_chip_set_wake_parent(struct irq_data *data, unsigned int on); |
| 485 | extern int irq_chip_set_vcpu_affinity_parent(struct irq_data *data, | 485 | extern int irq_chip_set_vcpu_affinity_parent(struct irq_data *data, |
| 486 | void *vcpu_info); | 486 | void *vcpu_info); |
| 487 | extern int irq_chip_set_type_parent(struct irq_data *data, unsigned int type); | ||
| 487 | #endif | 488 | #endif |
| 488 | 489 | ||
| 489 | /* Handling of unhandled and spurious interrupts: */ | 490 | /* Handling of unhandled and spurious interrupts: */ |
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 27f4332c7f84..ae216824e8ca 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
| @@ -985,6 +985,23 @@ int irq_chip_set_affinity_parent(struct irq_data *data, | |||
| 985 | } | 985 | } |
| 986 | 986 | ||
| 987 | /** | 987 | /** |
| 988 | * irq_chip_set_type_parent - Set IRQ type on the parent interrupt | ||
| 989 | * @data: Pointer to interrupt specific data | ||
| 990 | * @type: IRQ_TYPE_{LEVEL,EDGE}_* value - see include/linux/irq.h | ||
| 991 | * | ||
| 992 | * Conditional, as the underlying parent chip might not implement it. | ||
| 993 | */ | ||
| 994 | int irq_chip_set_type_parent(struct irq_data *data, unsigned int type) | ||
| 995 | { | ||
| 996 | data = data->parent_data; | ||
| 997 | |||
| 998 | if (data->chip->irq_set_type) | ||
| 999 | return data->chip->irq_set_type(data, type); | ||
| 1000 | |||
| 1001 | return -ENOSYS; | ||
| 1002 | } | ||
| 1003 | |||
| 1004 | /** | ||
| 988 | * irq_chip_retrigger_hierarchy - Retrigger an interrupt in hardware | 1005 | * irq_chip_retrigger_hierarchy - Retrigger an interrupt in hardware |
| 989 | * @data: Pointer to interrupt specific data | 1006 | * @data: Pointer to interrupt specific data |
| 990 | * | 1007 | * |
| @@ -997,7 +1014,7 @@ int irq_chip_retrigger_hierarchy(struct irq_data *data) | |||
| 997 | if (data->chip && data->chip->irq_retrigger) | 1014 | if (data->chip && data->chip->irq_retrigger) |
| 998 | return data->chip->irq_retrigger(data); | 1015 | return data->chip->irq_retrigger(data); |
| 999 | 1016 | ||
| 1000 | return -ENOSYS; | 1017 | return 0; |
| 1001 | } | 1018 | } |
| 1002 | 1019 | ||
| 1003 | /** | 1020 | /** |
