xref: /openbsd-src/sys/dev/pci/drm/include/linux/interrupt.h (revision 667382c7a43214428c9590fa699030f09445b426)
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