Skip to content

Commit 44e72c7

Browse files
brglKAGA-KOKO
authored andcommitted
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>
1 parent b19af51 commit 44e72c7

File tree

3 files changed

+47
-0
lines changed

3 files changed

+47
-0
lines changed

Documentation/driver-model/devres.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,7 @@ IRQ
312312
devm_irq_alloc_descs_from()
313313
devm_irq_alloc_generic_chip()
314314
devm_irq_setup_generic_chip()
315+
devm_irq_sim_init()
315316

316317
LED
317318
devm_led_classdev_register()

include/linux/irq_sim.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
*/
1111

1212
#include <linux/irq_work.h>
13+
#include <linux/device.h>
1314

1415
/*
1516
* Provides a framework for allocating simulated interrupts which can be
@@ -34,6 +35,8 @@ struct irq_sim {
3435
};
3536

3637
int irq_sim_init(struct irq_sim *sim, unsigned int num_irqs);
38+
int devm_irq_sim_init(struct device *dev, struct irq_sim *sim,
39+
unsigned int num_irqs);
3740
void irq_sim_fini(struct irq_sim *sim);
3841
void irq_sim_fire(struct irq_sim *sim, unsigned int offset);
3942
int irq_sim_irqnum(struct irq_sim *sim, unsigned int offset);

kernel/irq/irq_sim.c

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@
1010
#include <linux/irq_sim.h>
1111
#include <linux/irq.h>
1212

13+
struct irq_sim_devres {
14+
struct irq_sim *sim;
15+
};
16+
1317
static void irq_sim_irqmask(struct irq_data *data)
1418
{
1519
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)
9296
}
9397
EXPORT_SYMBOL_GPL(irq_sim_fini);
9498

99+
static void devm_irq_sim_release(struct device *dev, void *res)
100+
{
101+
struct irq_sim_devres *this = res;
102+
103+
irq_sim_fini(this->sim);
104+
}
105+
106+
/**
107+
* irq_sim_init - Initialize the interrupt simulator for a managed device.
108+
*
109+
* @dev: Device to initialize the simulator object for.
110+
* @sim: The interrupt simulator object to initialize.
111+
* @num_irqs: Number of interrupts to allocate
112+
*
113+
* Returns 0 on success and a negative error number on failure.
114+
*/
115+
int devm_irq_sim_init(struct device *dev, struct irq_sim *sim,
116+
unsigned int num_irqs)
117+
{
118+
struct irq_sim_devres *dr;
119+
int rv;
120+
121+
dr = devres_alloc(devm_irq_sim_release, sizeof(*dr), GFP_KERNEL);
122+
if (!dr)
123+
return -ENOMEM;
124+
125+
rv = irq_sim_init(sim, num_irqs);
126+
if (rv) {
127+
devres_free(dr);
128+
return rv;
129+
}
130+
131+
dr->sim = sim;
132+
devres_add(dev, dr);
133+
134+
return 0;
135+
}
136+
EXPORT_SYMBOL_GPL(devm_irq_sim_init);
137+
95138
/**
96139
* irq_sim_fire - Enqueue an interrupt.
97140
*

0 commit comments

Comments
 (0)