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