1 /*
2  * Chained IRQ handlers support.
3  *
4  * Copyright (C) 2011 ARM Ltd.
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18 #ifndef __IRQCHIP_CHAINED_IRQ_H
19 #define __IRQCHIP_CHAINED_IRQ_H
20 
21 #include <linux/irq.h>
22 
23 /*
24  * Entry/exit functions for chained handlers where the primary IRQ chip
25  * may implement either fasteoi or level-trigger flow control.
26  */
chained_irq_enter(struct irq_chip * chip,struct irq_desc * desc)27 static inline void chained_irq_enter(struct irq_chip *chip,
28 				     struct irq_desc *desc)
29 {
30 	/* FastEOI controllers require no action on entry. */
31 	if (chip->irq_eoi)
32 		return;
33 
34 	if (chip->irq_mask_ack) {
35 		chip->irq_mask_ack(&desc->irq_data);
36 	} else {
37 		chip->irq_mask(&desc->irq_data);
38 		if (chip->irq_ack)
39 			chip->irq_ack(&desc->irq_data);
40 	}
41 }
42 
chained_irq_exit(struct irq_chip * chip,struct irq_desc * desc)43 static inline void chained_irq_exit(struct irq_chip *chip,
44 				    struct irq_desc *desc)
45 {
46 	if (chip->irq_eoi)
47 		chip->irq_eoi(&desc->irq_data);
48 	else
49 		chip->irq_unmask(&desc->irq_data);
50 }
51 
52 #endif /* __IRQCHIP_CHAINED_IRQ_H */
53