1*4e6670feSJoseph Chen /* 2*4e6670feSJoseph Chen * (C) Copyright 2017 Rockchip Electronics Co., Ltd 3*4e6670feSJoseph Chen * 4*4e6670feSJoseph Chen * SPDX-License-Identifier: GPL-2.0+ 5*4e6670feSJoseph Chen */ 6*4e6670feSJoseph Chen 7*4e6670feSJoseph Chen #ifndef _IRQ_GENERIC_H 8*4e6670feSJoseph Chen #define _IRQ_GENERIC_H 9*4e6670feSJoseph Chen 10*4e6670feSJoseph Chen #include <asm-generic/gpio.h> 11*4e6670feSJoseph Chen #include <common.h> 12*4e6670feSJoseph Chen #include <dt-bindings/pinctrl/rockchip.h> 13*4e6670feSJoseph Chen 14*4e6670feSJoseph Chen /* 15*4e6670feSJoseph Chen * IRQ line status. 16*4e6670feSJoseph Chen * 17*4e6670feSJoseph Chen * IRQ_TYPE_NONE - default, unspecified type 18*4e6670feSJoseph Chen * IRQ_TYPE_EDGE_RISING - rising edge triggered 19*4e6670feSJoseph Chen * IRQ_TYPE_EDGE_FALLING - falling edge triggered 20*4e6670feSJoseph Chen * IRQ_TYPE_EDGE_BOTH - rising and falling edge triggered 21*4e6670feSJoseph Chen * IRQ_TYPE_LEVEL_HIGH - high level triggered 22*4e6670feSJoseph Chen * IRQ_TYPE_LEVEL_LOW - low level triggered 23*4e6670feSJoseph Chen * IRQ_TYPE_LEVEL_MASK - mask to filter out the level bits 24*4e6670feSJoseph Chen * IRQ_TYPE_SENSE_MASK - mask for all the above bits 25*4e6670feSJoseph Chen */ 26*4e6670feSJoseph Chen enum { 27*4e6670feSJoseph Chen IRQ_TYPE_NONE = 0x00000000, 28*4e6670feSJoseph Chen IRQ_TYPE_EDGE_RISING = 0x00000001, 29*4e6670feSJoseph Chen IRQ_TYPE_EDGE_FALLING = 0x00000002, 30*4e6670feSJoseph Chen IRQ_TYPE_EDGE_BOTH = (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING), 31*4e6670feSJoseph Chen IRQ_TYPE_LEVEL_HIGH = 0x00000004, 32*4e6670feSJoseph Chen IRQ_TYPE_LEVEL_LOW = 0x00000008, 33*4e6670feSJoseph Chen IRQ_TYPE_LEVEL_MASK = (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH), 34*4e6670feSJoseph Chen IRQ_TYPE_SENSE_MASK = 0x0000000f, 35*4e6670feSJoseph Chen }; 36*4e6670feSJoseph Chen 37*4e6670feSJoseph Chen /* 38*4e6670feSJoseph Chen * struct irq_chip - hardware interrupt chip descriptor 39*4e6670feSJoseph Chen * 40*4e6670feSJoseph Chen * @name: name for irq chip 41*4e6670feSJoseph Chen * @irq_enable: enable the interrupt (defaults to chip->unmask if NULL) 42*4e6670feSJoseph Chen * @irq_disable: disable the interrupt 43*4e6670feSJoseph Chen * @irq_ack: start of a new interrupt 44*4e6670feSJoseph Chen * @irq_eoi: end of interrupt 45*4e6670feSJoseph Chen * @irq_set_type: set the flow type (IRQ_TYPE_LEVEL/etc.) of an IRQ 46*4e6670feSJoseph Chen */ 47*4e6670feSJoseph Chen struct irq_chip { 48*4e6670feSJoseph Chen const char *name; 49*4e6670feSJoseph Chen int (*irq_init)(void); 50*4e6670feSJoseph Chen int (*irq_get)(void); 51*4e6670feSJoseph Chen int (*irq_enable)(int irq); 52*4e6670feSJoseph Chen int (*irq_disable)(int irq); 53*4e6670feSJoseph Chen void (*irq_ack)(int irq); 54*4e6670feSJoseph Chen void (*irq_eoi)(int irq); 55*4e6670feSJoseph Chen int (*irq_set_type)(int irq, unsigned int flow_type); 56*4e6670feSJoseph Chen }; 57*4e6670feSJoseph Chen 58*4e6670feSJoseph Chen /* APIs for irqs */ 59*4e6670feSJoseph Chen void irq_install_handler(int irq, interrupt_handler_t *handler, void *data); 60*4e6670feSJoseph Chen void irq_free_handler(int irq); 61*4e6670feSJoseph Chen int irq_set_irq_type(int irq, unsigned int type); 62*4e6670feSJoseph Chen int irq_handler_enable(int irq); 63*4e6670feSJoseph Chen int irq_handler_disable(int irq); 64*4e6670feSJoseph Chen int gpio_to_irq(struct gpio_desc *gpio); 65*4e6670feSJoseph Chen 66*4e6670feSJoseph Chen /* 67*4e6670feSJoseph Chen * Assign gpio to irq directly. Don't use it without special reasons. 68*4e6670feSJoseph Chen * 69*4e6670feSJoseph Chen * Usage example: 70*4e6670feSJoseph Chen * int gpio0_a0, irq; 71*4e6670feSJoseph Chen * 72*4e6670feSJoseph Chen * gpio = RK_IRQ_GPIO(RK_GPIO0, RK_PA0); 73*4e6670feSJoseph Chen * irq = hard_gpio_to_irq(gpio0_a0); 74*4e6670feSJoseph Chen * irq_install_handler(irq, ...); 75*4e6670feSJoseph Chen */ 76*4e6670feSJoseph Chen #define GPIO_BANK_SHIFT 8 77*4e6670feSJoseph Chen #define RK_IRQ_GPIO(bank, pin) (((bank) << GPIO_BANK_SHIFT) | (pin)) 78*4e6670feSJoseph Chen int hard_gpio_to_irq(unsigned gpio); 79*4e6670feSJoseph Chen 80*4e6670feSJoseph Chen /* only irq-gpio.c can use it */ 81*4e6670feSJoseph Chen void _generic_gpio_handle_irq(int irq, void *data); 82*4e6670feSJoseph Chen 83*4e6670feSJoseph Chen #endif /* _IRQ_GENERIC_H */ 84