xref: /rk3399_rockchip-uboot/drivers/irq/irq-internal.h (revision 2c4e90c1f82ec1e96293ab9fcb0105fcfad8d2d1)
1cf344252SJoseph Chen /*
2cf344252SJoseph Chen  * (C) Copyright 2017 Rockchip Electronics Co., Ltd
3cf344252SJoseph Chen  *
4cf344252SJoseph Chen  * SPDX-License-Identifier:     GPL-2.0+
5cf344252SJoseph Chen  */
6cf344252SJoseph Chen 
7cf344252SJoseph Chen #ifndef _IRQ_GIC_H_
8cf344252SJoseph Chen #define _IRQ_GIC_H_
9cf344252SJoseph Chen 
10cf344252SJoseph Chen #include <asm/io.h>
11cf344252SJoseph Chen #include <irq-generic.h>
12cf344252SJoseph Chen #include <irq-platform.h>
13cf344252SJoseph Chen #include "irq-internal.h"
14cf344252SJoseph Chen 
15cf344252SJoseph Chen /*
16cf344252SJoseph Chen  * IRQ-NUMBERS
17cf344252SJoseph Chen  */
18*2c4e90c1SJoseph Chen #define PLATFORM_SUSPEND_MAX_IRQ	12
19cf344252SJoseph Chen #define PLATFORM_GIC_MAX_IRQ		(GIC_IRQS_NR)
20cf344252SJoseph Chen #define PLATFORM_GPIO_MAX_IRQ		(GIC_IRQS_NR + GPIO_IRQS_NR)
21cf344252SJoseph Chen #define PLATFORM_MAX_IRQ		(GIC_IRQS_NR + GPIO_IRQS_NR)
22cf344252SJoseph Chen 
23cf344252SJoseph Chen /*
24cf344252SJoseph Chen  * IRQ-CHIP
25cf344252SJoseph Chen  */
26cf344252SJoseph Chen struct irq_chip *arch_gic_get_irqchip(void);
27cf344252SJoseph Chen struct irq_chip *arch_gpio_get_irqchip(void);
2841766119SJoseph Chen struct irq_chip *arch_virq_get_irqchip(void);
2941766119SJoseph Chen 
3041766119SJoseph Chen /*
3141766119SJoseph Chen  * IRQ-VIRTUAL
3241766119SJoseph Chen  */
3341766119SJoseph Chen int bad_virq(int irq);
3441766119SJoseph Chen void virq_free_handler(int irq);
3541766119SJoseph Chen int virq_install_handler(int irq, interrupt_handler_t *handler, void *data);
36cf344252SJoseph Chen 
37cf344252SJoseph Chen /*
38cf344252SJoseph Chen  * Other
39cf344252SJoseph Chen  */
40cf344252SJoseph Chen int bad_irq(int irq);
41cf344252SJoseph Chen 
42cf344252SJoseph Chen /*
43cf344252SJoseph Chen  * IRQ-GPIO-SWITCH
44cf344252SJoseph Chen  */
45cf344252SJoseph Chen #define GPIO_BANK_MASK		0xFFFFFF00
46cf344252SJoseph Chen #define GPIO_BANK_OFFSET	8
47cf344252SJoseph Chen #define GPIO_PIN_MASK		0x000000FF
48cf344252SJoseph Chen #define GPIO_PIN_OFFSET		0
49cf344252SJoseph Chen #define EINVAL_GPIO		-1
50cf344252SJoseph Chen #define PIN_BASE		GIC_IRQS_NR
51cf344252SJoseph Chen 
52cf344252SJoseph Chen struct gpio_bank {
53cf344252SJoseph Chen 	char *name;
54cf344252SJoseph Chen 	void __iomem *regbase;
55cf344252SJoseph Chen 	int id;
56cf344252SJoseph Chen 	int irq_base;
57cf344252SJoseph Chen 	int ngpio;
58cf344252SJoseph Chen 	int use_count;
59cf344252SJoseph Chen };
60cf344252SJoseph Chen 
61cf344252SJoseph Chen #define GPIO_BANK_REGISTER(ID, GPIO_BANK_NUM)			\
62cf344252SJoseph Chen {								\
63cf344252SJoseph Chen 	.name	  = __stringify(gpio##ID),			\
64cf344252SJoseph Chen 	.regbase  = (unsigned char __iomem *)GPIO##ID##_PHYS,	\
65cf344252SJoseph Chen 	.id	  = ID,						\
66cf344252SJoseph Chen 	.irq_base = PIN_BASE + (ID) * (GPIO_BANK_NUM),		\
67cf344252SJoseph Chen 	.ngpio    = GPIO_BANK_NUM,				\
68cf344252SJoseph Chen 	.use_count = 0						\
69cf344252SJoseph Chen }
70cf344252SJoseph Chen 
71cf344252SJoseph Chen /* gpio bank[31:8] and pin[7:0] */
72cf344252SJoseph Chen #define GPIO_BANK(gpio)		((gpio & GPIO_BANK_MASK) >> GPIO_BANK_OFFSET)
73cf344252SJoseph Chen #define GPIO_PIN(gpio)		((gpio & GPIO_PIN_MASK) >> GPIO_PIN_OFFSET)
74cf344252SJoseph Chen #define GPIO_BANK_VALID(gpio)	(GPIO_BANK(gpio) < GPIO_BANK_NUM)
75cf344252SJoseph Chen #define GPIO_PIN_VALID(gpio)	(GPIO_PIN(gpio) < GPIO_BANK_PINS)
76cf344252SJoseph Chen 
77cf344252SJoseph Chen int hard_gpio_to_irq(u32 gpio);
78cf344252SJoseph Chen int irq_to_gpio(int irq);
79cf344252SJoseph Chen struct gpio_bank *gpio_id_to_bank(unsigned int id);
80cf344252SJoseph Chen struct gpio_bank *gpio_to_bank(unsigned gpio);
81cf344252SJoseph Chen 
82cf344252SJoseph Chen void __generic_gpio_handle_irq(int irq);
83cf344252SJoseph Chen 
84cf344252SJoseph Chen #endif /* _IRQ_GIC_H_ */
85