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