1/* SPDX-License-Identifier: GPL-2.0+ */ 2/* 3 * Copyright (C) 2017-2018 Bartosz Golaszewski <brgl@bgdev.pl> 4 */ 5 6#ifndef _LINUX_IRQ_SIM_H 7#define _LINUX_IRQ_SIM_H 8 9#include <linux/irq_work.h> 10#include <linux/device.h> 11 12/* 13 * Provides a framework for allocating simulated interrupts which can be 14 * requested like normal irqs and enqueued from process context. 15 */ 16 17struct irq_sim_work_ctx { 18 struct irq_work work; 19 unsigned long *pending; 20}; 21 22struct irq_sim_irq_ctx { 23 int irqnum; 24 bool enabled; 25}; 26 27struct irq_sim { 28 struct irq_sim_work_ctx work_ctx; 29 int irq_base; 30 unsigned int irq_count; 31 struct irq_sim_irq_ctx *irqs; 32}; 33 34int irq_sim_init(struct irq_sim *sim, unsigned int num_irqs); 35int devm_irq_sim_init(struct device *dev, struct irq_sim *sim, 36 unsigned int num_irqs); 37void irq_sim_fini(struct irq_sim *sim); 38void irq_sim_fire(struct irq_sim *sim, unsigned int offset); 39int irq_sim_irqnum(struct irq_sim *sim, unsigned int offset); 40 41#endif /* _LINUX_IRQ_SIM_H */ 42