xref: /openbsd/sys/dev/pci/drm/include/linux/interrupt.h (revision 73471bf0)
1 /* Public domain. */
2 
3 #ifndef _LINUX_INTERRUPT_H
4 #define _LINUX_INTERRUPT_H
5 
6 #include <sys/task.h>
7 
8 #include <machine/intr.h>
9 #include <linux/hardirq.h>
10 #include <linux/irqflags.h>
11 #include <linux/atomic.h>
12 #include <linux/compiler.h>
13 #include <linux/irqreturn.h>
14 
15 #define IRQF_SHARED	0
16 
17 #define request_irq(irq, hdlr, flags, name, dev)	(0)
18 #define free_irq(irq, dev)
19 
20 typedef irqreturn_t (*irq_handler_t)(int, void *);
21 
22 struct tasklet_struct {
23 	void (*func)(unsigned long);
24 	unsigned long data;
25 	unsigned long state;
26 	atomic_t count;
27 	struct task task;
28 };
29 
30 #define TASKLET_STATE_SCHED	1
31 #define TASKLET_STATE_RUN	0
32 
33 extern struct taskq *taskletq;
34 void tasklet_run(void *);
35 
36 static inline void
37 tasklet_init(struct tasklet_struct *ts, void (*func)(unsigned long),
38     unsigned long data)
39 {
40 	ts->func = func;
41 	ts->data = data;
42 	ts->state = 0;
43 	atomic_set(&ts->count, 0);
44 	task_set(&ts->task, tasklet_run, ts);
45 }
46 
47 static inline int
48 tasklet_trylock(struct tasklet_struct *ts)
49 {
50 	return !test_and_set_bit(TASKLET_STATE_RUN, &ts->state);
51 }
52 
53 static inline void
54 tasklet_unlock(struct tasklet_struct *ts)
55 {
56 	smp_mb__before_atomic();
57 	clear_bit(TASKLET_STATE_RUN, &ts->state);
58 }
59 
60 static inline void
61 tasklet_unlock_wait(struct tasklet_struct *ts)
62 {
63 	while (test_bit(TASKLET_STATE_RUN, &ts->state))
64 		barrier();
65 }
66 
67 static inline void
68 tasklet_kill(struct tasklet_struct *ts)
69 {
70 	clear_bit(TASKLET_STATE_SCHED, &ts->state);
71 	task_del(taskletq, &ts->task);
72 	tasklet_unlock_wait(ts);
73 }
74 
75 static inline void
76 tasklet_schedule(struct tasklet_struct *ts)
77 {
78 	set_bit(TASKLET_STATE_SCHED, &ts->state);
79 	task_add(taskletq, &ts->task);
80 }
81 
82 static inline void
83 tasklet_hi_schedule(struct tasklet_struct *ts)
84 {
85 	set_bit(TASKLET_STATE_SCHED, &ts->state);
86 	task_add(taskletq, &ts->task);
87 }
88 
89 static inline void
90 tasklet_disable_nosync(struct tasklet_struct *ts)
91 {
92 	atomic_inc(&ts->count);
93 	smp_mb__after_atomic();
94 }
95 
96 static inline void
97 tasklet_enable(struct tasklet_struct *ts)
98 {
99 	smp_mb__before_atomic();
100 	atomic_dec(&ts->count);
101 }
102 
103 #endif
104