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