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)61 void 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