genirq: Generic chip: factorise code using irq_get_domain_generic_chip()
Subsystems (5)
PATCH 2/2 genirq: Generic chip: factorise code using irq_get_domain_generic_chip()
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()
--- 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(-)
drivers/gpio/gpio-dwapb.c +1 -1
@@ -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 ;
drivers/irqchip/irq-atmel-aic-common.c +1 -1
@@ -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 ;
kernel/irq/generic-chip.c +8 -16
@@ -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;
Signature · 1 line
1.7.11.2
kernel/irq/generic-chip.c irq_get_domain_generic_chip(struct irq_domain *d, unsigned int hw_irq) · line 356
Quoted 10 lines · Sebastian Frias
kernel/irq/generic-chip.c +2
-2@@ -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 );
This is completely pointless churn. None of the existing callsites cares about the error value. We can simply split out the guts into a static function and keep the semantics for irq_get_domain_generic_chip.
I'll fix that up while applying it.
Thanks,
tglx
tip-bot for Sebastian Frias
merge bot[tip:irq/core] genirq/generic_chip: Get rid of code duplication
In reply to Sebastian Friasgenirq/generic_chip: Get rid of code duplication
Commit-ID: f0c450eaa364cb77c778f2a46ee2aa3ff464b332 Gitweb: http://git.kernel.org/tip/f0c450eaa364cb77c778f2a46ee2aa3ff464b332 Author: Sebastian Frias <[email protected]> AuthorDate: Mon, 1 Aug 2016 16:27:53 +0200 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 2 Sep 2016 18:06:49 +0200
genirq/generic_chip: Get rid of code duplication
irq_map_generic_chip() contains about the same code as irq_get_domain_generic_chip() except for the return values.
Split out the irq_get_domain_generic_chip() implementation so it can be reused.
[ tglx: Removed the extra churn in irq_get_domain_generic_chip() callers
and massaged changelog ]
--- kernel/irq/generic-chip.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-)
kernel/irq/generic-chip.c +19 -15
@@ -328,6 +328,20 @@ int irq_alloc_domain_generic_chips(struct irq_domain *d, int irqs_per_chip, }EXPORT_SYMBOL_GPL (irq_alloc_domain_generic_chips); +static struct irq_chip_generic * +__irq_get_domain_generic_chip (struct irq_domain *d,unsigned int hw_irq) +{ +struct irq_domain_chip_generic *dgc = d->gc; +int idx; + +if (!dgc) +return ERR_PTR (-ENODEV ); + idx = hw_irq / dgc->irqs_per_chip; +if (idx >= dgc->num_chips) +return ERR_PTR (-EINVAL ); +return dgc->gc[idx]; +} +/** * irq_get_domain_generic_chip - Get a pointer to the generic chip of a hw_irq * @d: irq domain pointer
@@ -336,15 +350,9 @@ EXPORT_SYMBOL_GPL(irq_alloc_domain_generic_chips);struct irq_chip_generic *irq_get_domain_generic_chip (struct irq_domain *d,unsigned int hw_irq) { -struct irq_domain_chip_generic *dgc = d->gc; -int idx; +struct irq_chip_generic *gc =__irq_get_domain_generic_chip (d, hw_irq); -if (!dgc) -return NULL ; - idx = hw_irq / dgc->irqs_per_chip; -if (idx >= dgc->num_chips) -return NULL ; -return dgc->gc[idx]; +return !IS_ERR (gc) ? gc :NULL ; }EXPORT_SYMBOL_GPL (irq_get_domain_generic_chip);
@@ -368,13 +376,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;