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 17 struct irq_sim_work_ctx { 18 struct irq_work work; 19 unsigned long *pending; 20 }; 21 22 struct irq_sim_irq_ctx { 23 int irqnum; 24 bool enabled; 25 }; 26 27 struct 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 34 int irq_sim_init(struct irq_sim *sim, unsigned int num_irqs); 35 int devm_irq_sim_init(struct device *dev, struct irq_sim *sim, 36 unsigned int num_irqs); 37 void irq_sim_fini(struct irq_sim *sim); 38 void irq_sim_fire(struct irq_sim *sim, unsigned int offset); 39 int irq_sim_irqnum(struct irq_sim *sim, unsigned int offset); 40 41 #endif /* _LINUX_IRQ_SIM_H */ 42