You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

125 lines
3.5 KiB

/*
* (C) Copyright 2017 Rockchip Electronics Co., Ltd
*
* SPDX-License-Identifier: GPL-2.0+
*/
#ifndef _IRQ_GENERIC_H
#define _IRQ_GENERIC_H
#include <asm-generic/gpio.h>
#include <common.h>
#include <dt-bindings/pinctrl/rockchip.h>
#define IRQ_I(fmt, args...) printf("IRQ: "fmt, ##args)
#define IRQ_W(fmt, args...) printf("IRQ Warn: "fmt, ##args)
#define IRQ_E(fmt, args...) printf("IRQ Err: "fmt, ##args)
#define IRQ_D(fmt, args...) debug("IRQ Debug "fmt, ##args)
/*
* IRQ line status.
*
* IRQ_TYPE_NONE - default, unspecified type
* IRQ_TYPE_EDGE_RISING - rising edge triggered
* IRQ_TYPE_EDGE_FALLING - falling edge triggered
* IRQ_TYPE_EDGE_BOTH - rising and falling edge triggered
* IRQ_TYPE_LEVEL_HIGH - high level triggered
* IRQ_TYPE_LEVEL_LOW - low level triggered
* IRQ_TYPE_LEVEL_MASK - mask to filter out the level bits
* IRQ_TYPE_SENSE_MASK - mask for all the above bits
*/
enum {
IRQ_TYPE_NONE = 0x00000000,
IRQ_TYPE_EDGE_RISING = 0x00000001,
IRQ_TYPE_EDGE_FALLING = 0x00000002,
IRQ_TYPE_EDGE_BOTH = (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING),
IRQ_TYPE_LEVEL_HIGH = 0x00000004,
IRQ_TYPE_LEVEL_LOW = 0x00000008,
IRQ_TYPE_LEVEL_MASK = (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH),
IRQ_TYPE_SENSE_MASK = 0x0000000f,
};
/*
* struct irq_chip - hardware interrupt chip descriptor
*
* @name: name for irq chip
* @irq_enable: enable the interrupt (defaults to chip->unmask if NULL)
* @irq_disable: disable the interrupt
* @irq_ack: start of a new interrupt
* @irq_eoi: end of interrupt
* @irq_set_type: set the flow type (IRQ_TYPE_LEVEL/etc.) of an IRQ
*/
struct irq_chip {
const char *name;
int (*irq_init)(void);
int (*irq_suspend)(void);
int (*irq_resume)(void);
int (*irq_get)(void);
int (*irq_enable)(int irq);
int (*irq_disable)(int irq);
void (*irq_ack)(int irq);
void (*irq_eoi)(int irq);
int (*irq_set_type)(int irq, unsigned int flow_type);
int (*irq_revert_type)(int irq);
int (*irq_get_gpio_level)(int irq);
};
/*
* Virtual irq chip structure
*/
typedef int(virq_write_t)(struct udevice *dev, uint reg, uint value);
typedef int(virq_read_t)(struct udevice *dev, uint reg);
struct virq_reg {
uint reg_offset;
uint mask;
};
struct virq_chip {
uint status_base;
uint mask_base;
uint irq_reg_stride;
uint irq_unalign_reg_idx;
uint irq_unalign_reg_stride;
int num_regs;
const struct virq_reg *irqs;
int num_irqs;
virq_read_t *read;
virq_write_t *write;
};
/* APIs for irqs */
void irq_install_handler(int irq, interrupt_handler_t *handler, void *data);
void irq_free_handler(int irq);
int irq_set_irq_type(int irq, unsigned int type);
int irq_revert_irq_type(int irq);
int irq_handler_enable(int irq);
int irq_handler_enable_suspend_only(int irq);
int irq_handler_disable(int irq);
int irq_get_gpio_level(int irq);
int irqs_suspend(void);
int irqs_resume(void);
int irq_is_busy(int irq);
int gpio_to_irq(struct gpio_desc *gpio);
/*
* Assign gpio to irq directly. Don't use it without special reasons.
*
* Usage example:
* int gpio0_a0, irq;
*
* gpio = RK_IRQ_GPIO(RK_GPIO0, RK_PA0);
* irq = hard_gpio_to_irq(gpio0_a0);
* irq_install_handler(irq, ...);
*/
#define GPIO_BANK_SHIFT 8
#define RK_IRQ_GPIO(bank, pin) (((bank) << GPIO_BANK_SHIFT) | (pin))
int hard_gpio_to_irq(unsigned gpio);
int phandle_gpio_to_irq(u32 gpio_phandle, u32 pin);
/* Virtual irq */
int virq_to_irq(struct virq_chip *chip, int virq);
int virq_add_chip(struct udevice *dev, struct virq_chip *chip, int irq);
#endif /* _IRQ_GENERIC_H */