Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Copyright (C) 2002 - 2007 Jeff Dike (jdike@{linux.intel,addtoit}.com)
0004  */
0005 
0006 #include <linux/interrupt.h>
0007 #include <irq_kern.h>
0008 #include <os.h>
0009 #include <sigio.h>
0010 
0011 /* Protected by sigio_lock() called from write_sigio_workaround */
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 /* These are called from os-Linux/sigio.c to protect its pollfds arrays. */
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 }