diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/irq/generic-chip.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/kernel/irq/generic-chip.c b/kernel/irq/generic-chip.c index 5270a54b9fa4..ec5fe9a0cb05 100644 --- a/kernel/irq/generic-chip.c +++ b/kernel/irq/generic-chip.c | |||
@@ -151,6 +151,31 @@ void irq_gc_mask_disable_reg_and_ack(struct irq_data *d) | |||
151 | } | 151 | } |
152 | 152 | ||
153 | /** | 153 | /** |
154 | * irq_gc_mask_disable_and_ack_set - Mask and ack pending interrupt | ||
155 | * @d: irq_data | ||
156 | * | ||
157 | * This generic implementation of the irq_mask_ack method is for chips | ||
158 | * with separate enable/disable registers instead of a single mask | ||
159 | * register and where a pending interrupt is acknowledged by setting a | ||
160 | * bit. | ||
161 | * | ||
162 | * Note: This is the only permutation currently used. Similar generic | ||
163 | * functions should be added here if other permutations are required. | ||
164 | */ | ||
165 | void irq_gc_mask_disable_and_ack_set(struct irq_data *d) | ||
166 | { | ||
167 | struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); | ||
168 | struct irq_chip_type *ct = irq_data_get_chip_type(d); | ||
169 | u32 mask = d->mask; | ||
170 | |||
171 | irq_gc_lock(gc); | ||
172 | irq_reg_writel(gc, mask, ct->regs.disable); | ||
173 | *ct->mask_cache &= ~mask; | ||
174 | irq_reg_writel(gc, mask, ct->regs.ack); | ||
175 | irq_gc_unlock(gc); | ||
176 | } | ||
177 | |||
178 | /** | ||
154 | * irq_gc_eoi - EOI interrupt | 179 | * irq_gc_eoi - EOI interrupt |
155 | * @d: irq_data | 180 | * @d: irq_data |
156 | */ | 181 | */ |