From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753925AbcHAO2F (ORCPT ); Mon, 1 Aug 2016 10:28:05 -0400 Received: from smtpoutz27.laposte.net ([194.117.213.102]:42014 "EHLO smtp.laposte.net" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753643AbcHAO1z (ORCPT ); Mon, 1 Aug 2016 10:27:55 -0400 To: Thomas Gleixner , Marc Zyngier , Jason Cooper Cc: LKML , Mason From: Sebastian Frias Subject: [PATCH 2/2] genirq: Generic chip: factorise code using irq_get_domain_generic_chip() Message-ID: <579F5C69.8070006@laposte.net> Date: Mon, 1 Aug 2016 16:27:53 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.8.0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-VR-SrcIP: 78.31.43.6 X-VR-FullState: 0 X-VR-Score: -100 X-VR-Cause-1: gggruggvucftvghtrhhoucdtuddrfeeltddrjeehgdejgecutefuodetggdotefrodftvfcurfhrohhf X-VR-Cause-2: ihhlvgemucfntefrqffuvffgnecuuegrihhlohhuthemucehtddtnecusecvtfgvtghiphhivghnthhs X-VR-Cause-3: ucdlqddutddtmdenucfjughrpefvhffukffffgggtgfgsehtjegrtddtfeejnecuhfhrohhmpefuvggs X-VR-Cause-4: rghsthhirghnucfhrhhirghsuceoshhfkeegsehlrghpohhsthgvrdhnvghtqeenucfkphepjeekrdef X-VR-Cause-5: uddrgeefrdeinecurfgrrhgrmhepmhhouggvpehsmhhtphhouhhtpdhhvghloheplgdujedvrddvjedr X-VR-Cause-6: tddrvddugegnpdhinhgvthepjeekrdefuddrgeefrdeipdhmrghilhhfrhhomhepshhfkeegsehlrghp X-VR-Cause-7: ohhsthgvrdhnvghtpdhrtghpthhtohepthhglhigsehlihhnuhhtrhhonhhigidruggv X-VR-AvState: No X-VR-State: 0 X-VR-State: 0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org irq_map_generic_chip() contains about the same code as irq_get_domain_generic_chip() except for the return values. Using ERR_PTR() along with IS_ERR() and PTR_ERR() it is possible to make the map (and unmap) functions call irq_get_domain_generic_chip instead of duplicating the code. irq_get_domain_generic_chip() is modified to return different error codes using ERR_PTR() to preserve error information. Most callers of irq_get_domain_generic_chip() do not check for its return value and assume it is always a valid pointer. The two drivers that do check for its return value are updated to use IS_ERR() Fixes: 088f40b7b027 ("genirq: Generic chip: Add linear irq domain support") Signed-off-by: Sebastian Frias --- drivers/gpio/gpio-dwapb.c | 2 +- drivers/irqchip/irq-atmel-aic-common.c | 2 +- kernel/irq/generic-chip.c | 24 ++++++++---------------- 3 files changed, 10 insertions(+), 18 deletions(-) diff --git a/drivers/gpio/gpio-dwapb.c b/drivers/gpio/gpio-dwapb.c index 34779bb..157d684 100644 --- a/drivers/gpio/gpio-dwapb.c +++ b/drivers/gpio/gpio-dwapb.c @@ -317,7 +317,7 @@ static void dwapb_configure_irqs(struct dwapb_gpio *gpio, } irq_gc = irq_get_domain_generic_chip(gpio->domain, 0); - if (!irq_gc) { + if (IS_ERR(irq_gc)) { irq_domain_remove(gpio->domain); gpio->domain = NULL; return; diff --git a/drivers/irqchip/irq-atmel-aic-common.c b/drivers/irqchip/irq-atmel-aic-common.c index 28b26c8..33205211 100644 --- a/drivers/irqchip/irq-atmel-aic-common.c +++ b/drivers/irqchip/irq-atmel-aic-common.c @@ -122,7 +122,7 @@ static void __init aic_common_ext_irq_of_init(struct irq_domain *domain) of_property_for_each_u32(node, "atmel,external-irqs", prop, p, hwirq) { gc = irq_get_domain_generic_chip(domain, hwirq); - if (!gc) { + if (IS_ERR(gc)) { pr_warn("AIC: external irq %d >= %d skip it\n", hwirq, domain->revmap_size); continue; diff --git a/kernel/irq/generic-chip.c b/kernel/irq/generic-chip.c index f7d6654..3ccac06 100644 --- a/kernel/irq/generic-chip.c +++ b/kernel/irq/generic-chip.c @@ -350,10 +350,10 @@ irq_get_domain_generic_chip(struct irq_domain *d, unsigned int hw_irq) int idx; if (!dgc) - return NULL; + return ERR_PTR(-ENODEV); idx = hw_irq / dgc->irqs_per_chip; if (idx >= dgc->num_chips) - return NULL; + return ERR_PTR(-EINVAL); return dgc->gc[idx]; } EXPORT_SYMBOL_GPL(irq_get_domain_generic_chip); @@ -378,13 +378,9 @@ int irq_map_generic_chip(struct irq_domain *d, unsigned int virq, unsigned long flags; int idx; - if (!d->gc) - return -ENODEV; - - idx = hw_irq / dgc->irqs_per_chip; - if (idx >= dgc->num_chips) - return -EINVAL; - gc = dgc->gc[idx]; + gc = irq_get_domain_generic_chip(d, hw_irq); + if (IS_ERR(gc)) + return PTR_ERR(gc); idx = hw_irq % dgc->irqs_per_chip; @@ -433,15 +429,11 @@ void irq_unmap_generic_chip(struct irq_domain *d, unsigned int virq) struct irq_domain_chip_generic *dgc = d->gc; struct irq_chip_generic *gc; unsigned int hw_irq = data->hwirq; - int chip_idx, irq_idx; - - if (!d->gc) - return; + int irq_idx; - chip_idx = hw_irq / dgc->irqs_per_chip; - if (chip_idx >= dgc->num_chips) + gc = irq_get_domain_generic_chip(d, hw_irq); + if (IS_ERR(gc)) return; - gc = dgc->gc[chip_idx]; irq_idx = hw_irq % dgc->irqs_per_chip; -- 1.7.11.2