0001
0002
0003
0004
0005
0006 #include <linux/interrupt.h>
0007 #include <irq_kern.h>
0008 #include <os.h>
0009 #include <sigio.h>
0010
0011
0012 static int sigio_irq_fd = -1;
0013
0014 static irqreturn_t sigio_interrupt(int irq, void *data)
0015 {
0016 char c;
0017
0018 os_read_file(sigio_irq_fd, &c, sizeof(c));
0019 return IRQ_HANDLED;
0020 }
0021
0022 int write_sigio_irq(int fd)
0023 {
0024 int err;
0025
0026 err = um_request_irq(SIGIO_WRITE_IRQ, fd, IRQ_READ, sigio_interrupt,
0027 0, "write sigio", NULL);
0028 if (err < 0) {
0029 printk(KERN_ERR "write_sigio_irq : um_request_irq failed, "
0030 "err = %d\n", err);
0031 return -1;
0032 }
0033 sigio_irq_fd = fd;
0034 return 0;
0035 }
0036
0037
0038 static DEFINE_MUTEX(sigio_mutex);
0039
0040 void sigio_lock(void)
0041 {
0042 mutex_lock(&sigio_mutex);
0043 }
0044
0045 void sigio_unlock(void)
0046 {
0047 mutex_unlock(&sigio_mutex);
0048 }