17f4dd379Sjsg /* Public domain. */
27f4dd379Sjsg
37f4dd379Sjsg #ifndef _LINUX_INTERRUPT_H
47f4dd379Sjsg #define _LINUX_INTERRUPT_H
57f4dd379Sjsg
67f4dd379Sjsg #include <sys/task.h>
77f4dd379Sjsg
87f4dd379Sjsg #include <machine/intr.h>
97f4dd379Sjsg #include <linux/hardirq.h>
107f4dd379Sjsg #include <linux/irqflags.h>
117f4dd379Sjsg #include <linux/atomic.h>
12c349dbc7Sjsg #include <linux/irqreturn.h>
137f4dd379Sjsg
1453e1df33Sjsg struct seq_file;
1553e1df33Sjsg
16*667382c7Skettenis #define IRQF_SHARED 0x0001
17*667382c7Skettenis #define IRQF_ONESHOT 0x0002
18*667382c7Skettenis #define IRQF_NO_AUTOEN 0x0004
19*667382c7Skettenis
20*667382c7Skettenis #define IRQF_TRIGGER_RISING 0x1000
21*667382c7Skettenis #define IRQF_TRIGGER_FALLING 0x2000
227f4dd379Sjsg
237f4dd379Sjsg #define request_irq(irq, hdlr, flags, name, dev) (0)
245ca02815Sjsg
255ca02815Sjsg static inline void
free_irq(unsigned int irq,void * dev)265ca02815Sjsg free_irq(unsigned int irq, void *dev)
275ca02815Sjsg {
285ca02815Sjsg }
297f4dd379Sjsg
30*667382c7Skettenis static inline void
disable_irq(u_int irq)31*667382c7Skettenis disable_irq(u_int irq)
32*667382c7Skettenis {
33*667382c7Skettenis }
34*667382c7Skettenis
35*667382c7Skettenis static inline void
enable_irq(u_int irq)36*667382c7Skettenis enable_irq(u_int irq)
37*667382c7Skettenis {
38*667382c7Skettenis }
39*667382c7Skettenis
40c349dbc7Sjsg typedef irqreturn_t (*irq_handler_t)(int, void *);
41c349dbc7Sjsg
42*667382c7Skettenis static inline int
devm_request_threaded_irq(struct device * dev,u_int irq,irq_handler_t handler,irq_handler_t thread_fn,u_int irqflags,const char * devname,void * arg)43*667382c7Skettenis devm_request_threaded_irq(struct device *dev, u_int irq, irq_handler_t handler,
44*667382c7Skettenis irq_handler_t thread_fn, u_int irqflags, const char *devname, void *arg)
45*667382c7Skettenis {
46*667382c7Skettenis return 0;
47*667382c7Skettenis }
48*667382c7Skettenis
497f4dd379Sjsg struct tasklet_struct {
505ca02815Sjsg union {
517f4dd379Sjsg void (*func)(unsigned long);
525ca02815Sjsg void (*callback)(struct tasklet_struct *);
535ca02815Sjsg };
545ca02815Sjsg bool use_callback;
557f4dd379Sjsg unsigned long data;
567f4dd379Sjsg unsigned long state;
577f4dd379Sjsg atomic_t count;
587f4dd379Sjsg struct task task;
597f4dd379Sjsg };
607f4dd379Sjsg
617f4dd379Sjsg #define TASKLET_STATE_SCHED 1
627f4dd379Sjsg #define TASKLET_STATE_RUN 0
637f4dd379Sjsg
645ca02815Sjsg #define from_tasklet(x, t, f) \
655ca02815Sjsg container_of(t, typeof(*x), f)
665ca02815Sjsg
677f4dd379Sjsg extern struct taskq *taskletq;
687f4dd379Sjsg void tasklet_run(void *);
695ca02815Sjsg void tasklet_unlock_wait(struct tasklet_struct *);
705ca02815Sjsg void tasklet_unlock_spin_wait(struct tasklet_struct *);
717f4dd379Sjsg
727f4dd379Sjsg static inline void
tasklet_init(struct tasklet_struct * ts,void (* func)(unsigned long),unsigned long data)737f4dd379Sjsg tasklet_init(struct tasklet_struct *ts, void (*func)(unsigned long),
747f4dd379Sjsg unsigned long data)
757f4dd379Sjsg {
767f4dd379Sjsg ts->func = func;
777f4dd379Sjsg ts->data = data;
787f4dd379Sjsg ts->state = 0;
797f4dd379Sjsg atomic_set(&ts->count, 0);
805ca02815Sjsg ts->use_callback = false;
815ca02815Sjsg task_set(&ts->task, tasklet_run, ts);
825ca02815Sjsg }
835ca02815Sjsg
845ca02815Sjsg static inline void
tasklet_setup(struct tasklet_struct * ts,void (* callback)(struct tasklet_struct *))855ca02815Sjsg tasklet_setup(struct tasklet_struct *ts,
865ca02815Sjsg void (*callback)(struct tasklet_struct *))
875ca02815Sjsg {
885ca02815Sjsg ts->callback = callback;
895ca02815Sjsg ts->data = 0;
905ca02815Sjsg ts->state = 0;
915ca02815Sjsg atomic_set(&ts->count, 0);
925ca02815Sjsg ts->use_callback = true;
937f4dd379Sjsg task_set(&ts->task, tasklet_run, ts);
947f4dd379Sjsg }
957f4dd379Sjsg
967f4dd379Sjsg static inline int
tasklet_trylock(struct tasklet_struct * ts)977f4dd379Sjsg tasklet_trylock(struct tasklet_struct *ts)
987f4dd379Sjsg {
997f4dd379Sjsg return !test_and_set_bit(TASKLET_STATE_RUN, &ts->state);
1007f4dd379Sjsg }
1017f4dd379Sjsg
1027f4dd379Sjsg static inline void
tasklet_unlock(struct tasklet_struct * ts)1037f4dd379Sjsg tasklet_unlock(struct tasklet_struct *ts)
1047f4dd379Sjsg {
1057f4dd379Sjsg smp_mb__before_atomic();
1067f4dd379Sjsg clear_bit(TASKLET_STATE_RUN, &ts->state);
1077f4dd379Sjsg }
1087f4dd379Sjsg
1097f4dd379Sjsg static inline void
tasklet_kill(struct tasklet_struct * ts)1107f4dd379Sjsg tasklet_kill(struct tasklet_struct *ts)
1117f4dd379Sjsg {
1127f4dd379Sjsg clear_bit(TASKLET_STATE_SCHED, &ts->state);
1137f4dd379Sjsg task_del(taskletq, &ts->task);
1147f4dd379Sjsg tasklet_unlock_wait(ts);
1157f4dd379Sjsg }
1167f4dd379Sjsg
1177f4dd379Sjsg static inline void
tasklet_schedule(struct tasklet_struct * ts)1187f4dd379Sjsg tasklet_schedule(struct tasklet_struct *ts)
1197f4dd379Sjsg {
1207f4dd379Sjsg set_bit(TASKLET_STATE_SCHED, &ts->state);
1217f4dd379Sjsg task_add(taskletq, &ts->task);
1227f4dd379Sjsg }
1237f4dd379Sjsg
1247f4dd379Sjsg static inline void
tasklet_hi_schedule(struct tasklet_struct * ts)1257f4dd379Sjsg tasklet_hi_schedule(struct tasklet_struct *ts)
1267f4dd379Sjsg {
1277f4dd379Sjsg set_bit(TASKLET_STATE_SCHED, &ts->state);
1287f4dd379Sjsg task_add(taskletq, &ts->task);
1297f4dd379Sjsg }
1307f4dd379Sjsg
131c349dbc7Sjsg static inline void
tasklet_disable_nosync(struct tasklet_struct * ts)132c349dbc7Sjsg tasklet_disable_nosync(struct tasklet_struct *ts)
133c349dbc7Sjsg {
134c349dbc7Sjsg atomic_inc(&ts->count);
135c349dbc7Sjsg smp_mb__after_atomic();
136c349dbc7Sjsg }
137c349dbc7Sjsg
138c349dbc7Sjsg static inline void
tasklet_enable(struct tasklet_struct * ts)139c349dbc7Sjsg tasklet_enable(struct tasklet_struct *ts)
140c349dbc7Sjsg {
141c349dbc7Sjsg smp_mb__before_atomic();
142c349dbc7Sjsg atomic_dec(&ts->count);
143c349dbc7Sjsg }
144c349dbc7Sjsg
1457f4dd379Sjsg #endif
146