1 /*
2 * Copyright (c) 2017 Intel corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 /**
8 * @file
9 * @brief Public interface for configuring interrupts
10 */
11 #ifndef ZEPHYR_INCLUDE_IRQ_NEXTLEVEL_H_
12 #define ZEPHYR_INCLUDE_IRQ_NEXTLEVEL_H_
13
14 #ifdef __cplusplus
15 extern "C" {
16 #endif
17
18 #if defined(CONFIG_MULTI_LEVEL_INTERRUPTS) || defined(__DOXYGEN__)
19 /**
20 * @cond INTERNAL_HIDDEN
21 *
22 * These are for internal use only, so skip these in
23 * public documentation.
24 */
25 typedef void (*irq_next_level_func_t)(const struct device *dev,
26 unsigned int irq);
27 typedef unsigned int (*irq_next_level_get_state_t)(const struct device *dev);
28 typedef void (*irq_next_level_priority_t)(const struct device *dev,
29 unsigned int irq, unsigned int prio,
30 uint32_t flags);
31 typedef int (*irq_next_level_get_line_state_t)(const struct device *dev,
32 unsigned int irq);
33
34 struct irq_next_level_api {
35 irq_next_level_func_t intr_enable;
36 irq_next_level_func_t intr_disable;
37 irq_next_level_get_state_t intr_get_state;
38 irq_next_level_priority_t intr_set_priority;
39 irq_next_level_get_line_state_t intr_get_line_state;
40 };
41 /**
42 * @endcond
43 */
44
45 /**
46 * @brief Enable an IRQ in the next level.
47 *
48 * This routine enables interrupts present in the interrupt controller.
49 *
50 * @param dev Pointer to the device structure for the driver instance.
51 * @param irq IRQ to be enabled.
52 */
irq_enable_next_level(const struct device * dev,uint32_t irq)53 static inline void irq_enable_next_level(const struct device *dev,
54 uint32_t irq)
55 {
56 const struct irq_next_level_api *api =
57 (const struct irq_next_level_api *)dev->api;
58
59 api->intr_enable(dev, irq);
60 }
61
62 /**
63 * @brief Disable an IRQ in the next level.
64 *
65 * This routine disables interrupts present in the interrupt controller.
66 *
67 * @param dev Pointer to the device structure for the driver instance.
68 * @param irq IRQ to be disabled.
69 */
irq_disable_next_level(const struct device * dev,uint32_t irq)70 static inline void irq_disable_next_level(const struct device *dev,
71 uint32_t irq)
72 {
73 const struct irq_next_level_api *api =
74 (const struct irq_next_level_api *)dev->api;
75
76 api->intr_disable(dev, irq);
77 }
78
79 /**
80 * @brief Get IRQ enable state.
81 *
82 * This routine indicates if any interrupts are enabled in the interrupt
83 * controller.
84 *
85 * @param dev Pointer to the device structure for the driver instance.
86 *
87 * @return interrupt enable state, true or false
88 */
irq_is_enabled_next_level(const struct device * dev)89 static inline unsigned int irq_is_enabled_next_level(const struct device *dev)
90 {
91 const struct irq_next_level_api *api =
92 (const struct irq_next_level_api *)dev->api;
93
94 return api->intr_get_state(dev);
95 }
96
97 /**
98 * @brief Set IRQ priority.
99 *
100 * This routine indicates if any interrupts are enabled in the interrupt
101 * controller.
102 *
103 * @param dev Pointer to the device structure for the driver instance.
104 * @param irq IRQ to be disabled.
105 * @param prio priority for irq in the interrupt controller.
106 * @param flags controller specific flags.
107 */
irq_set_priority_next_level(const struct device * dev,uint32_t irq,uint32_t prio,uint32_t flags)108 static inline void irq_set_priority_next_level(const struct device *dev,
109 uint32_t irq,
110 uint32_t prio, uint32_t flags)
111 {
112 const struct irq_next_level_api *api =
113 (const struct irq_next_level_api *)dev->api;
114
115 if (api->intr_set_priority)
116 api->intr_set_priority(dev, irq, prio, flags);
117 }
118
119 /**
120 * @brief Get IRQ line enable state.
121 *
122 * Query if a particular IRQ line is enabled.
123 *
124 * @param dev Pointer to the device structure for the driver instance.
125 * @param irq IRQ line to be queried.
126 *
127 * @return interrupt enable state, true or false
128 */
irq_line_is_enabled_next_level(const struct device * dev,unsigned int irq)129 static inline unsigned int irq_line_is_enabled_next_level(const struct device *dev,
130 unsigned int irq)
131 {
132 const struct irq_next_level_api *api =
133 (const struct irq_next_level_api *)dev->api;
134
135 return api->intr_get_line_state(dev, irq);
136 }
137
138 #endif /* CONFIG_MULTI_LEVEL_INTERRUPTS */
139 #ifdef __cplusplus
140 }
141 #endif
142
143 #endif /* ZEPHYR_INCLUDE_IRQ_NEXTLEVEL_H_ */
144