162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2002 - 2007 Jeff Dike (jdike@{linux.intel,addtoit}.com)
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <linux/interrupt.h>
762306a36Sopenharmony_ci#include <irq_kern.h>
862306a36Sopenharmony_ci#include <os.h>
962306a36Sopenharmony_ci#include <sigio.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci/* Protected by sigio_lock() called from write_sigio_workaround */
1262306a36Sopenharmony_cistatic int sigio_irq_fd = -1;
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cistatic irqreturn_t sigio_interrupt(int irq, void *data)
1562306a36Sopenharmony_ci{
1662306a36Sopenharmony_ci	char c;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci	os_read_file(sigio_irq_fd, &c, sizeof(c));
1962306a36Sopenharmony_ci	return IRQ_HANDLED;
2062306a36Sopenharmony_ci}
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ciint write_sigio_irq(int fd)
2362306a36Sopenharmony_ci{
2462306a36Sopenharmony_ci	int err;
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	err = um_request_irq(SIGIO_WRITE_IRQ, fd, IRQ_READ, sigio_interrupt,
2762306a36Sopenharmony_ci			     0, "write sigio", NULL);
2862306a36Sopenharmony_ci	if (err < 0) {
2962306a36Sopenharmony_ci		printk(KERN_ERR "write_sigio_irq : um_request_irq failed, "
3062306a36Sopenharmony_ci		       "err = %d\n", err);
3162306a36Sopenharmony_ci		return -1;
3262306a36Sopenharmony_ci	}
3362306a36Sopenharmony_ci	sigio_irq_fd = fd;
3462306a36Sopenharmony_ci	return 0;
3562306a36Sopenharmony_ci}
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci/* These are called from os-Linux/sigio.c to protect its pollfds arrays. */
3862306a36Sopenharmony_cistatic DEFINE_MUTEX(sigio_mutex);
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_civoid sigio_lock(void)
4162306a36Sopenharmony_ci{
4262306a36Sopenharmony_ci	mutex_lock(&sigio_mutex);
4362306a36Sopenharmony_ci}
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_civoid sigio_unlock(void)
4662306a36Sopenharmony_ci{
4762306a36Sopenharmony_ci	mutex_unlock(&sigio_mutex);
4862306a36Sopenharmony_ci}
49