From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753202Ab2FPF6A (ORCPT ); Sat, 16 Jun 2012 01:58:00 -0400 Received: from gate.crashing.org ([63.228.1.57]:60670 "EHLO gate.crashing.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750715Ab2FPF56 (ORCPT ); Sat, 16 Jun 2012 01:57:58 -0400 Message-ID: <1339826247.9220.219.camel@pasglop> Subject: Re: [PATCH 01/12] irqdomain: Split disassociating code into separate function From: Benjamin Herrenschmidt To: Grant Likely Cc: linux-kernel@vger.kernel.org, Milton Miller , Paul Mundt , Thomas Gleixner , Rob Herring Date: Sat, 16 Jun 2012 15:57:27 +1000 In-Reply-To: <1339822897-15840-2-git-send-email-grant.likely@secretlab.ca> References: <1339822897-15840-1-git-send-email-grant.likely@secretlab.ca> <1339822897-15840-2-git-send-email-grant.likely@secretlab.ca> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit Mime-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, 2012-06-15 at 23:01 -0600, Grant Likely wrote: > This patch moves the irq disassociation code out into a separate > function in preparation to extend irq_setup_virq to handle multiple > irqs and rename it for use by interrupt controller drivers. The new > function will be used by irq_setup_virq() in its error path. > > Signed-off-by: Grant Likely > Cc: Paul Mundt Acked-by: Benjamin Herrenschmidt > Cc: Thomas Gleixner > Cc: Rob Herring > --- > kernel/irq/irqdomain.c | 75 ++++++++++++++++++++++++++++++------------------ > 1 file changed, 47 insertions(+), 28 deletions(-) > > diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c > index b1f774c..4161d2a 100644 > --- a/kernel/irq/irqdomain.c > +++ b/kernel/irq/irqdomain.c > @@ -333,6 +333,52 @@ void irq_set_default_host(struct irq_domain *domain) > } > EXPORT_SYMBOL_GPL(irq_set_default_host); > > +static void irq_domain_disassociate_many(struct irq_domain *domain, > + unsigned int irq_base, int count) > +{ > + /* > + * disassociate in reverse order; > + * not strictly necessary, but nice for unwinding > + */ > + while (count--) { > + int irq = irq_base + count; > + struct irq_data *irq_data = irq_get_irq_data(irq); > + irq_hw_number_t hwirq = irq_data->hwirq; > + > + if (WARN_ON(!irq_data || irq_data->domain != domain)) > + continue; > + > + irq_set_status_flags(irq, IRQ_NOREQUEST); > + > + /* remove chip and handler */ > + irq_set_chip_and_handler(irq, NULL, NULL); > + > + /* Make sure it's completed */ > + synchronize_irq(irq); > + > + /* Tell the PIC about it */ > + if (domain->ops->unmap) > + domain->ops->unmap(domain, irq); > + smp_mb(); > + > + irq_data->domain = NULL; > + irq_data->hwirq = 0; > + > + /* Clear reverse map */ > + switch(domain->revmap_type) { > + case IRQ_DOMAIN_MAP_LINEAR: > + if (hwirq < domain->revmap_data.linear.size) > + domain->revmap_data.linear.revmap[hwirq] = 0; > + break; > + case IRQ_DOMAIN_MAP_TREE: > + mutex_lock(&revmap_trees_mutex); > + radix_tree_delete(&domain->revmap_data.tree, hwirq); > + mutex_unlock(&revmap_trees_mutex); > + break; > + } > + } > +} > + > static int irq_setup_virq(struct irq_domain *domain, unsigned int virq, > irq_hw_number_t hwirq) > { > @@ -513,7 +559,6 @@ void irq_dispose_mapping(unsigned int virq) > { > struct irq_data *irq_data = irq_get_irq_data(virq); > struct irq_domain *domain; > - irq_hw_number_t hwirq; > > if (!virq || !irq_data) > return; > @@ -526,33 +571,7 @@ void irq_dispose_mapping(unsigned int virq) > if (domain->revmap_type == IRQ_DOMAIN_MAP_LEGACY) > return; > > - irq_set_status_flags(virq, IRQ_NOREQUEST); > - > - /* remove chip and handler */ > - irq_set_chip_and_handler(virq, NULL, NULL); > - > - /* Make sure it's completed */ > - synchronize_irq(virq); > - > - /* Tell the PIC about it */ > - if (domain->ops->unmap) > - domain->ops->unmap(domain, virq); > - smp_mb(); > - > - /* Clear reverse map */ > - hwirq = irq_data->hwirq; > - switch(domain->revmap_type) { > - case IRQ_DOMAIN_MAP_LINEAR: > - if (hwirq < domain->revmap_data.linear.size) > - domain->revmap_data.linear.revmap[hwirq] = 0; > - break; > - case IRQ_DOMAIN_MAP_TREE: > - mutex_lock(&revmap_trees_mutex); > - radix_tree_delete(&domain->revmap_data.tree, hwirq); > - mutex_unlock(&revmap_trees_mutex); > - break; > - } > - > + irq_domain_disassociate_many(domain, virq, 1); > irq_free_desc(virq); > } > EXPORT_SYMBOL_GPL(irq_dispose_mapping);