1 /*
2 * Copyright (C) 2015-2021 Alibaba Group Holding Limited
3 */
4
5 #ifndef _U_INTERRUPT_H_
6 #define _U_INTERRUPT_H_
7
8 #include "aos/list.h"
9
10 #include <drivers/atomic.h>
11
12 #define U_IRQ_PASS_THROUGH 0
13 #define U_IRQ_LOCK_SPINLOCK 0
14
15 //TODO: irq description rbtree control marco
16 #define U_IRQ_DESC_LIST_RBTREE 0
17
18 #if U_IRQ_DESC_LIST_RBTREE
19 #include "k_rbtree.h"
20 #endif
21
22
23 /**
24 * enum irqreturn
25 * @IRQ_NONE interrupt was not from this device or was not handled
26 * @IRQ_HANDLED interrupt was handled by this device
27 * @IRQ_WAKE_THREAD handler requests to wake the handler thread
28 */
29 typedef enum u_irqreturn {
30 IRQ_NONE = (0 << 0),
31 IRQ_HANDLED = (1 << 0),
32 IRQ_WAKE_THREAD = (1 << 1),
33 } u_irqreturn_t;
34
35 typedef u_irqreturn_t (*u_irq_handler_t)(int, void *);
36
37 int u_request_threaded_irq(
38 unsigned int irq, u_irq_handler_t handler, u_irq_handler_t thread_fn,
39 unsigned long flags, const char *name, void *data);
40
u_request_irq(unsigned int irq,u_irq_handler_t handler,unsigned long flags,const char * name,void * data)41 static inline int u_request_irq(
42 unsigned int irq, u_irq_handler_t handler,
43 unsigned long flags, const char *name, void *data) {
44 return u_request_threaded_irq(irq, handler, NULL, flags, name, data);
45 }
46
47 void disable_u_irq_nosync(unsigned int irq);
48 void disable_u_irq(unsigned int irq);
49 void enable_u_irq(unsigned int irq);
50
51 #if U_IRQ_DESC_LIST_RBTREE
52 typedef struct u_irq_node {
53 struct k_rbtree_node_t rbt_node; /* rbttree node */
54 void *data; /* data */
55 } u_irq_node_t;
56 #endif
57
58 #if U_IRQ_LOCK_SPINLOCK
59 typedef pthread_spinlock_t u_irq_lock_t;
60 #else
61 typedef pthread_mutex_t u_irq_lock_t;
62 #endif
63
64 typedef struct u_irq_thread {
65 unsigned int should_stop;
66 unsigned int stopped;
67 char name[16];
68 dlist_t irq_desc_head;
69 dlist_t irq_thread_node;
70 pthread_t thread;
71 pthread_cond_t cond;
72 pthread_condattr_t condattr;
73 pthread_mutex_t mutex;
74 u_irq_lock_t lock;
75 dlist_t msg_head;
76 } u_irq_thread_t;
77
78 typedef struct u_irq_desc {
79 const char *name;
80 unsigned int irq_id;
81 u_irq_handler_t irq_handler;
82 u_irq_handler_t thread_handler;
83 unsigned int irq_cnt;
84 unsigned int flags;
85 void *data;
86 u_irq_thread_t *p_irq_th;
87 #if U_IRQ_DESC_LIST_RBTREE
88 u_irq_node_t node;
89 #else
90 dlist_t irq_desc_node; // pointer to next u_irq_desc
91 dlist_t thread_node; // node in irq thread list
92 #endif
93 } u_irq_desc_t;
94
95 typedef struct u_irq_msg {
96 dlist_t node;
97 u_irq_desc_t *u_irq;
98 } u_irq_msg_t;
99
100 int u_irq_system_init(void);
101 int u_irq_system_deinit(void);
102
103 #endif //_U_INTERRUPT_H_
104