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