blob: 2b272b63b514c1508a83c3199d7a1b926d0c8c40 [file] [log] [blame]
Jeff Dike8e367062006-03-27 01:14:32 -08001/*
Jeff Dikec5d4bb12008-02-04 22:31:14 -08002 * Copyright (C) 2002 - 2007 Jeff Dike (jdike@{linux.intel,addtoit}.com)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003 * Licensed under the GPL
4 */
5
Jeff Dikec5d4bb12008-02-04 22:31:14 -08006#include <linux/interrupt.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -07007#include "irq_kern.h"
Jeff Dike8e367062006-03-27 01:14:32 -08008#include "os.h"
Jeff Dikec5d4bb12008-02-04 22:31:14 -08009#include "sigio.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070010
11/* Protected by sigio_lock() called from write_sigio_workaround */
12static int sigio_irq_fd = -1;
13
Al Viro7bea96f2006-10-08 22:49:34 +010014static irqreturn_t sigio_interrupt(int irq, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -070015{
Jeff Dike8e367062006-03-27 01:14:32 -080016 char c;
17
Jeff Dikea6ea4cc2007-05-06 14:51:43 -070018 os_read_file(sigio_irq_fd, &c, sizeof(c));
Linus Torvalds1da177e2005-04-16 15:20:36 -070019 reactivate_fd(sigio_irq_fd, SIGIO_WRITE_IRQ);
Jeff Dike4cffb7f2007-02-10 01:44:24 -080020 return IRQ_HANDLED;
Linus Torvalds1da177e2005-04-16 15:20:36 -070021}
22
23int write_sigio_irq(int fd)
24{
25 int err;
26
27 err = um_request_irq(SIGIO_WRITE_IRQ, fd, IRQ_READ, sigio_interrupt,
Jeff Dike1d3468a2006-07-10 04:45:13 -070028 IRQF_DISABLED|IRQF_SAMPLE_RANDOM, "write sigio",
Linus Torvalds1da177e2005-04-16 15:20:36 -070029 NULL);
Jeff Dikec5d4bb12008-02-04 22:31:14 -080030 if (err) {
31 printk(KERN_ERR "write_sigio_irq : um_request_irq failed, "
32 "err = %d\n", err);
Jeff Dike4cffb7f2007-02-10 01:44:24 -080033 return -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -070034 }
35 sigio_irq_fd = fd;
Jeff Dike4cffb7f2007-02-10 01:44:24 -080036 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -070037}
38
Jeff Diked9f9d312007-02-10 01:44:23 -080039/* These are called from os-Linux/sigio.c to protect its pollfds arrays. */
Linus Torvalds1da177e2005-04-16 15:20:36 -070040static DEFINE_SPINLOCK(sigio_spinlock);
41
42void sigio_lock(void)
43{
44 spin_lock(&sigio_spinlock);
45}
46
47void sigio_unlock(void)
48{
49 spin_unlock(&sigio_spinlock);
50}