linux/arch/um/kernel/sigio.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2002 - 2007 Jeff Dike (jdike@{linux.intel,addtoit}.com)
   3 * Licensed under the GPL
   4 */
   5
   6#include <linux/interrupt.h>
   7#include <irq_kern.h>
   8#include <os.h>
   9#include <sigio.h>
  10
  11/* Protected by sigio_lock() called from write_sigio_workaround */
  12static int sigio_irq_fd = -1;
  13
  14static irqreturn_t sigio_interrupt(int irq, void *data)
  15{
  16        char c;
  17
  18        os_read_file(sigio_irq_fd, &c, sizeof(c));
  19        reactivate_fd(sigio_irq_fd, SIGIO_WRITE_IRQ);
  20        return IRQ_HANDLED;
  21}
  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,
  28                             0, "write sigio", NULL);
  29        if (err) {
  30                printk(KERN_ERR "write_sigio_irq : um_request_irq failed, "
  31                       "err = %d\n", err);
  32                return -1;
  33        }
  34        sigio_irq_fd = fd;
  35        return 0;
  36}
  37
  38/* These are called from os-Linux/sigio.c to protect its pollfds arrays. */
  39static DEFINE_SPINLOCK(sigio_spinlock);
  40
  41void sigio_lock(void)
  42{
  43        spin_lock(&sigio_spinlock);
  44}
  45
  46void sigio_unlock(void)
  47{
  48        spin_unlock(&sigio_spinlock);
  49}
  50