Commit 44e72c7e authored by Bartosz Golaszewski's avatar Bartosz Golaszewski Committed by Thomas Gleixner

genirq/irq_sim: Add a devres variant of irq_sim_init()

Add a resource managed version of irq_sim_init(). This can be
conveniently used in device drivers.
Signed-off-by: default avatarBartosz Golaszewski <brgl@bgdev.pl>
Acked-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Cc: Lars-Peter Clausen <lars@metafoo.de>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Marc Zyngier <marc.zyngier@arm.com>
Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: linux-doc@vger.kernel.org
Cc: linux-gpio@vger.kernel.org
Cc: Bamvor Jian Zhang <bamvor.zhangjian@linaro.org>
Cc: Jonathan Cameron <jic23@kernel.org>
Link: http://lkml.kernel.org/r/20170814145318.6495-3-brgl@bgdev.plSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent b19af510
...@@ -312,6 +312,7 @@ IRQ ...@@ -312,6 +312,7 @@ IRQ
devm_irq_alloc_descs_from() devm_irq_alloc_descs_from()
devm_irq_alloc_generic_chip() devm_irq_alloc_generic_chip()
devm_irq_setup_generic_chip() devm_irq_setup_generic_chip()
devm_irq_sim_init()
LED LED
devm_led_classdev_register() devm_led_classdev_register()
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
*/ */
#include <linux/irq_work.h> #include <linux/irq_work.h>
#include <linux/device.h>
/* /*
* Provides a framework for allocating simulated interrupts which can be * Provides a framework for allocating simulated interrupts which can be
...@@ -34,6 +35,8 @@ struct irq_sim { ...@@ -34,6 +35,8 @@ struct irq_sim {
}; };
int irq_sim_init(struct irq_sim *sim, unsigned int num_irqs); int irq_sim_init(struct irq_sim *sim, unsigned int num_irqs);
int devm_irq_sim_init(struct device *dev, struct irq_sim *sim,
unsigned int num_irqs);
void irq_sim_fini(struct irq_sim *sim); void irq_sim_fini(struct irq_sim *sim);
void irq_sim_fire(struct irq_sim *sim, unsigned int offset); void irq_sim_fire(struct irq_sim *sim, unsigned int offset);
int irq_sim_irqnum(struct irq_sim *sim, unsigned int offset); int irq_sim_irqnum(struct irq_sim *sim, unsigned int offset);
......
...@@ -10,6 +10,10 @@ ...@@ -10,6 +10,10 @@
#include <linux/irq_sim.h> #include <linux/irq_sim.h>
#include <linux/irq.h> #include <linux/irq.h>
struct irq_sim_devres {
struct irq_sim *sim;
};
static void irq_sim_irqmask(struct irq_data *data) static void irq_sim_irqmask(struct irq_data *data)
{ {
struct irq_sim_irq_ctx *irq_ctx = irq_data_get_irq_chip_data(data); struct irq_sim_irq_ctx *irq_ctx = irq_data_get_irq_chip_data(data);
...@@ -92,6 +96,45 @@ void irq_sim_fini(struct irq_sim *sim) ...@@ -92,6 +96,45 @@ void irq_sim_fini(struct irq_sim *sim)
} }
EXPORT_SYMBOL_GPL(irq_sim_fini); EXPORT_SYMBOL_GPL(irq_sim_fini);
static void devm_irq_sim_release(struct device *dev, void *res)
{
struct irq_sim_devres *this = res;
irq_sim_fini(this->sim);
}
/**
* irq_sim_init - Initialize the interrupt simulator for a managed device.
*
* @dev: Device to initialize the simulator object for.
* @sim: The interrupt simulator object to initialize.
* @num_irqs: Number of interrupts to allocate
*
* Returns 0 on success and a negative error number on failure.
*/
int devm_irq_sim_init(struct device *dev, struct irq_sim *sim,
unsigned int num_irqs)
{
struct irq_sim_devres *dr;
int rv;
dr = devres_alloc(devm_irq_sim_release, sizeof(*dr), GFP_KERNEL);
if (!dr)
return -ENOMEM;
rv = irq_sim_init(sim, num_irqs);
if (rv) {
devres_free(dr);
return rv;
}
dr->sim = sim;
devres_add(dev, dr);
return 0;
}
EXPORT_SYMBOL_GPL(devm_irq_sim_init);
/** /**
* irq_sim_fire - Enqueue an interrupt. * irq_sim_fire - Enqueue an interrupt.
* *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment