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