mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
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: Bartosz Golaszewski <brgl@bgdev.pl> Acked-by: Jonathan 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.pl Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
b19af510e6
commit
44e72c7ebf
3 changed files with 47 additions and 0 deletions
|
@ -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 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#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 {
|
||||||
};
|
};
|
||||||
|
|
||||||
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 @@
|
||||||
#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)
|
||||||
}
|
}
|
||||||
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.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue