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