On 01/02/14 16:37, Stephen Boyd wrote: > Some drivers use request_any_context_irq() but there isn't a > devm_* function for it. Add one so that these drivers don't need > to explicitly free the irq on driver detach. > > Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> > Signed-off-by: Stephen Boyd <sboyd@xxxxxxxxxxxxxx> Thomas, can you please review this patch? > --- > include/linux/interrupt.h | 5 +++++ > kernel/irq/devres.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 50 insertions(+) > > diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h > index 0053adde0ed9..a2678d35b5a2 100644 > --- a/include/linux/interrupt.h > +++ b/include/linux/interrupt.h > @@ -158,6 +158,11 @@ devm_request_irq(struct device *dev, unsigned int irq, irq_handler_t handler, > devname, dev_id); > } > > +extern int __must_check > +devm_request_any_context_irq(struct device *dev, unsigned int irq, > + irq_handler_t handler, unsigned long irqflags, > + const char *devname, void *dev_id); > + > extern void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id); > > /* > diff --git a/kernel/irq/devres.c b/kernel/irq/devres.c > index bd8e788d71e0..1ef0606797c9 100644 > --- a/kernel/irq/devres.c > +++ b/kernel/irq/devres.c > @@ -73,6 +73,51 @@ int devm_request_threaded_irq(struct device *dev, unsigned int irq, > EXPORT_SYMBOL(devm_request_threaded_irq); > > /** > + * devm_request_any_context_irq - allocate an interrupt line for a managed device > + * @dev: device to request interrupt for > + * @irq: Interrupt line to allocate > + * @handler: Function to be called when the IRQ occurs > + * @thread_fn: function to be called in a threaded interrupt context. NULL > + * for devices which handle everything in @handler > + * @irqflags: Interrupt type flags > + * @devname: An ascii name for the claiming device > + * @dev_id: A cookie passed back to the handler function > + * > + * Except for the extra @dev argument, this function takes the > + * same arguments and performs the same function as > + * request_any_context_irq(). IRQs requested with this function will be > + * automatically freed on driver detach. > + * > + * If an IRQ allocated with this function needs to be freed > + * separately, devm_free_irq() must be used. > + */ > +int devm_request_any_context_irq(struct device *dev, unsigned int irq, > + irq_handler_t handler, unsigned long irqflags, > + const char *devname, void *dev_id) > +{ > + struct irq_devres *dr; > + int rc; > + > + dr = devres_alloc(devm_irq_release, sizeof(struct irq_devres), > + GFP_KERNEL); > + if (!dr) > + return -ENOMEM; > + > + rc = request_any_context_irq(irq, handler, irqflags, devname, dev_id); > + if (rc) { > + devres_free(dr); > + return rc; > + } > + > + dr->irq = irq; > + dr->dev_id = dev_id; > + devres_add(dev, dr); > + > + return 0; > +} > +EXPORT_SYMBOL(devm_request_any_context_irq); > + > +/** > * devm_free_irq - free an interrupt > * @dev: device to free interrupt for > * @irq: Interrupt line to free -- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html