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