libmetal  latest
irq_controller.h
Go to the documentation of this file.
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_CONTROLLER__H__
13 #define __METAL_IRQ_CONTROLLER__H__
14 
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18 
23 #include <metal/irq.h>
24 #include <metal/list.h>
25 #include <stdlib.h>
26 
28 #define METAL_IRQ_ANY (-1)
29 
33 #define METAL_IRQ_DISABLE 0U
34 #define METAL_IRQ_ENABLE 1U
35 
37 
44 typedef void (*metal_irq_set_enable) (struct metal_irq_controller *irq_cntr,
45  int irq, unsigned int enable);
46 
55 typedef int (*metal_cntr_irq_register) (struct metal_irq_controller *irq_cntr,
56  int irq, metal_irq_handler hd,
57  void *arg);
58 
60 struct metal_irq {
62  void *arg;
63 };
64 
67  int irq_base;
70  int irq_num;
71  void *arg;
76  struct metal_list node;
77  struct metal_irq *irqs;
78 };
79 
80 #define METAL_IRQ_CONTROLLER_DECLARE(_irq_controller, \
81  _irq_base, _irq_num, \
82  _arg, \
83  _irq_set_enable, \
84  _irq_register, \
85  _irqs) \
86  struct metal_irq_controller _irq_controller = { \
87  .irq_base = _irq_base, \
88  .irq_num = _irq_num, \
89  .arg = _arg, \
90  .irq_set_enable = _irq_set_enable, \
91  .irq_register = _irq_register, \
92  .irqs = _irqs,\
93  }
94 
108 
118 static inline
119 int metal_irq_handle(struct metal_irq *irq_data, int irq)
120 {
121  if (irq_data && irq_data->hd) {
122  return irq_data->hd(irq, irq_data->arg);
123  } else {
124  return METAL_IRQ_NOT_HANDLED;
125  }
126 }
127 
130 #ifdef __cplusplus
131 }
132 #endif
133 
134 #endif /* __METAL_IRQ__H__ */
void(* metal_irq_set_enable)(struct metal_irq_controller *irq_cntr, int irq, unsigned int enable)
type of interrupt controller to set irq enable
Definition: irq_controller.h:44
int(* metal_cntr_irq_register)(struct metal_irq_controller *irq_cntr, int irq, metal_irq_handler hd, void *arg)
type of controller specific registering interrupt function
Definition: irq_controller.h:55
#define METAL_IRQ_NOT_HANDLED
IRQ handled status.
Definition: irq.h:27
int(* metal_irq_handler)(int irq, void *arg)
type of interrupt handler
Definition: irq.h:36
static int metal_irq_handle(struct metal_irq *irq_data, int irq)
metal_irq_handle
Definition: irq_controller.h:119
int metal_irq_register_controller(struct metal_irq_controller *cntr)
metal_irq_register_controller
Definition: irq.c:50
Libmetal interrupt controller structure.
Definition: irq_controller.h:66
metal_cntr_irq_register irq_register
function to register IRQ handler
Definition: irq_controller.h:73
struct metal_list node
list node
Definition: irq_controller.h:76
metal_irq_set_enable irq_set_enable
function to set IRQ enable
Definition: irq_controller.h:72
void * arg
Argument to pass to interrupt controller function.
Definition: irq_controller.h:71
struct metal_irq * irqs
Array of IRQs managed by the controller.
Definition: irq_controller.h:77
int irq_num
Number of IRQs managed by the IRQ controller.
Definition: irq_controller.h:70
int irq_base
Start of IRQ number of the range managed by the IRQ controller.
Definition: irq_controller.h:67
Libmetal interrupt structure.
Definition: irq_controller.h:60
void * arg
Argument to pass to the interrupt handler.
Definition: irq_controller.h:62
metal_irq_handler hd
Interrupt handler.
Definition: irq_controller.h:61
Definition: list.h:26