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 #ifdef __cplusplus 16 extern "C" { 17 #endif 18 19 /** \defgroup irq Interrupt Handling Interfaces 20 * @{ */ 21 22 #include <stdlib.h> 23 24 /** IRQ handled status */ 25 #define METAL_IRQ_NOT_HANDLED 0 26 #define METAL_IRQ_HANDLED 1 27 28 /** 29 * @brief type of interrupt handler 30 * @param[in] irq interrupt id 31 * @param[in] priv private data 32 * @return irq handled status 33 */ 34 typedef int (*metal_irq_handler) (int irq, void *priv); 35 36 struct metal_device; 37 38 /** 39 * @brief Register interrupt handler for driver ID/device. 40 * 41 * @param[in] irq interrupt id 42 * @param[in] irq_handler interrupt handler 43 * @param[in] dev metal device this irq belongs to (can be NULL). 44 * @param[in] drv_id driver id is a unique interrupt handler identifier. 45 * It can also be used for driver data. 46 * @return 0 for success, non-zero on failure 47 */ 48 int metal_irq_register(int irq, 49 metal_irq_handler irq_handler, 50 struct metal_device *dev, 51 void *drv_id); 52 53 /** 54 * @brief Unregister interrupt handler for driver ID and/or device. 55 * 56 * If interrupt handler (hd), driver ID (drv_id) and device (dev) 57 * are NULL, unregister all handlers for this interrupt. 58 * 59 * If interrupt handler (hd), device (dev) or driver ID (drv_id), 60 * are not NULL, unregister handlers matching non NULL criterias. 61 * e.g: when call is made with drv_id and dev non NULL, 62 * all handlers matching both are unregistered. 63 * 64 * If interrupt is not found, or other criterias not matching, 65 * return -ENOENT 66 * 67 * @param[in] irq interrupt id 68 * @param[in] irq_handler interrupt handler 69 * @param[in] dev metal device this irq belongs to 70 * @param[in] drv_id driver id. It can be used for driver data. 71 * @return 0 for success, non-zero on failure 72 */ 73 int metal_irq_unregister(int irq, 74 metal_irq_handler irq_handler, 75 struct metal_device *dev, 76 void *drv_id); 77 78 /** 79 * @brief disable interrupts 80 * @return interrupts state 81 */ 82 unsigned int metal_irq_save_disable(void); 83 84 /** 85 * @brief restore interrupts to their previous state 86 * @param[in] flags previous interrupts state 87 */ 88 void metal_irq_restore_enable(unsigned int flags); 89 90 /** 91 * @brief metal_irq_enable 92 * 93 * Enables the given interrupt 94 * 95 * @param vector - interrupt vector number 96 */ 97 void metal_irq_enable(unsigned int vector); 98 99 /** 100 * @brief metal_irq_disable 101 * 102 * Disables the given interrupt 103 * 104 * @param vector - interrupt vector number 105 */ 106 void metal_irq_disable(unsigned int vector); 107 108 #include <metal/system/generic/irq.h> 109 110 /** @} */ 111 112 #ifdef __cplusplus 113 } 114 #endif 115 116 #endif /* __METAL_IRQ__H__ */ 117