1 /* 2 * Copyright (c) 2016, Xilinx Inc. and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 /* 8 * @file irq.h 9 * @brief Interrupt handling primitives for libmetal. 10 */ 11 12 #ifndef __METAL_IRQ__H__ 13 #define __METAL_IRQ__H__ 14 15 #include <metal/list.h> 16 #include <stdlib.h> 17 18 #ifdef __cplusplus 19 extern "C" { 20 #endif 21 22 /** \defgroup irq Interrupt Handling Interfaces 23 * @{ 24 */ 25 26 /** IRQ handled status */ 27 #define METAL_IRQ_NOT_HANDLED 0 28 #define METAL_IRQ_HANDLED 1 29 30 /** 31 * @brief type of interrupt handler 32 * @param[in] irq interrupt id 33 * @param[in] arg argument to pass to the handler 34 * @return irq handled status 35 */ 36 typedef int (*metal_irq_handler) (int irq, void *arg); 37 38 /** 39 * @brief Register interrupt handler for interrupt. 40 * Only allow single interrupt handler for a interrupt. 41 * 42 * If irq_handler is NULL, it will unregister interrupt 43 * handler from interrupt 44 * 45 * @param[in] irq interrupt id 46 * @param[in] irq_handler interrupt handler 47 * @param[in] arg arg is the argument pointing to the data which 48 * will be passed to the interrupt handler. 49 * @return 0 for success, non-zero on failure 50 */ 51 int metal_irq_register(int irq, 52 metal_irq_handler irq_handler, 53 void *arg); 54 55 /** 56 * @brief Unregister interrupt handler for interrupt. 57 * 58 * @param[in] irq interrupt id 59 */ 60 static inline metal_irq_unregister(int irq)61void metal_irq_unregister(int irq) 62 { 63 metal_irq_register(irq, 0, NULL); 64 } 65 66 /** 67 * @brief disable interrupts 68 * @return interrupts state 69 */ 70 unsigned int metal_irq_save_disable(void); 71 72 /** 73 * @brief restore interrupts to their previous state 74 * @param[in] flags previous interrupts state 75 */ 76 void metal_irq_restore_enable(unsigned int flags); 77 78 /** 79 * @brief metal_irq_enable 80 * 81 * Enables the given interrupt 82 * 83 * @param vector - interrupt vector number 84 */ 85 void metal_irq_enable(unsigned int vector); 86 87 /** 88 * @brief metal_irq_disable 89 * 90 * Disables the given interrupt 91 * 92 * @param vector - interrupt vector number 93 */ 94 void metal_irq_disable(unsigned int vector); 95 96 #include <metal/system/@PROJECT_SYSTEM@/irq.h> 97 98 /** @} */ 99 100 #ifdef __cplusplus 101 } 102 #endif 103 104 #endif /* __METAL_IRQ__H__ */ 105