Remove ARM-specific set_irq_flags usage from irqdomain implementations
Subsystems (13)
RFC PATCH 1/1 Remove ARM-specific set_irq_flags usage from irqdomain implementations
Hey all-
Looking through a bunch of irqdomain implementations (and in some other places), it appears that the following pattern is distressingly common:
static int foo_map(struct irq_domain *d, unsigned int irq,
irq_hw_number_t hw)
{
/*...*/
#ifdef CONFIG_ARM
set_irq_flags(irq, IRQF_VALID);
#else
irq_set_noprobe(irq);
#endif
return 0;
}Which, to someone unfamiliar with how ARM's set_irq_flags() (and ARM's ARCH_IRQ_INIT_FLAGS), is just confusing and ugly[1].
I think there is an opportunity for some simplification here, based on the following assumptions[2]:
1. The irqdomain core already manages the IRQ_NOREQUEST bit, clearing it after creating a association, and setting it on disassociation
2. No existing irqdomain implementations are relying on set_irq_flags() to clear the IRQ_NOAUTOEN bit
If these two assumptions hold, then the following simplification can take place[3]:
-#if CONFIG_ARM
- set_irq_flags(irq, IRQF_VALID);
-#else
irq_set_noprobe(irq);
-#endif
The first assumption fairly clearly holds, looking at the irqdomain core. I'm confident that the fact that IRQF_NOAUTOEN is not in ARCH_IRQ_INIT_FLAGS and that no existing IRQF_NOAUTOEN users appear to muck with irqdomains that it's a safe bet. And...any code relying AUTOEN to be cleared would currently be broken on non-ARM platforms.
Thoughts? If this is a worthwhile simplification and my analysis is sane, I'll cook up the proper patches.
Thanks,
Josh
[1]: git grep 'kill me now'
[2]: For reference, here's a truth table establishing the mapping between
ARM's IRQF_{VALID,PROBE,NOAUTOEN} flags and the generic flags:
V P NA | NR NP NA
0 0 0 | 1 1 0
ARM-specific 0 0 1 | 1 1 1 genirq irqflag
irqflags 0 1 0 | 1 0 0 definitions
V - IRQF_VALID 0 1 1 | 1 0 1 NR - IRQ_NOREQUEST
P - IRQF_PROBE 1 0 0 | 0 1 0 NP - IRQ_NOPROBE
NA - IRQF_NOAUTOEN 1 0 1 | 0 1 1 NA - IRQ_NOAUTOEN
1 1 0 | 0 0 0
1 1 1 | 0 0 1[3]: With the same justifications, on unmap:
-#if CONFIG_ARM
- set_irq_flags(irq, 0);
-#endif
---
drivers/base/regmap/regmap-irq.c | 8 -------- drivers/gpio/gpio-adnp.c | 6 ------ drivers/gpio/gpio-bcm-kona.c | 5 ----- drivers/gpio/gpio-grgpio.c | 8 -------- drivers/gpio/gpio-pca953x.c | 5 ----- drivers/gpio/gpio-pcf857x.c | 4 ---- drivers/gpio/gpio-stmpe.c | 8 -------- drivers/gpio/gpio-tc3589x.c | 8 -------- drivers/mfd/88pm860x-core.c | 4 ---- drivers/mfd/ab8500-core.c | 5 ----- drivers/mfd/arizona-irq.c | 8 -------- drivers/mfd/lp8788-irq.c | 6 ------ drivers/mfd/max77686-irq.c | 4 ---- drivers/mfd/max77693-irq.c | 4 ---- drivers/mfd/max8925-core.c | 4 ---- drivers/mfd/max8997-irq.c | 4 ---- drivers/mfd/max8998-irq.c | 4 ---- drivers/mfd/stmpe.c | 8 -------- drivers/mfd/tc3589x.c | 8 -------- drivers/mfd/tps6586x.c | 8 -------- drivers/mfd/twl6030-irq.c | 14 -------------- drivers/mfd/wm831x-irq.c | 8 -------- drivers/mfd/wm8994-irq.c | 8 -------- drivers/pinctrl/pinctrl-single.c | 4 ---- 24 files changed, 153 deletions(-)
drivers/base/regmap/regmap-irq.c +0 -8
@@ -306,15 +306,7 @@ static int regmap_irq_map(struct irq_domain *h, unsigned int virq,irq_set_chip_data (virq, data);irq_set_chip (virq, &data->irq_chip);irq_set_nested_thread (virq,1 ); - -/* ARM needs us to explicitly flag the IRQ as valid -* and will set them noprobe when we do so. */ -#ifdef CONFIG_ARM -set_irq_flags (virq,IRQF_VALID ); -#else irq_set_noprobe (virq); -#endif -return 0 ; }
drivers/gpio/gpio-adnp.c +0 -6
@@ -423,13 +423,7 @@ static int adnp_irq_map(struct irq_domain *domain, unsigned int irq,irq_set_chip_data (irq, domain->host_data);irq_set_chip (irq, &adnp_irq_chip);irq_set_nested_thread (irq, true); - -#ifdef CONFIG_ARM -set_irq_flags (irq,IRQF_VALID ); -#else irq_set_noprobe (irq); -#endif -return 0 ; }
drivers/gpio/gpio-bcm-kona.c +0 -5
@@ -480,12 +480,7 @@ static int bcm_kona_gpio_irq_map(struct irq_domain *d, unsigned int irq,return ret;irq_set_lockdep_class (irq, &gpio_lock_class);irq_set_chip_and_handler (irq, &bcm_gpio_irq_chip, handle_simple_irq); -#ifdef CONFIG_ARM -set_irq_flags (irq,IRQF_VALID ); -#else irq_set_noprobe (irq); -#endif -return 0 ; }
drivers/gpio/gpio-grgpio.c +0 -8
@@ -282,12 +282,7 @@ static int grgpio_irq_map(struct irq_domain *d, unsigned int irq,irq_set_chip_and_handler (irq, &grgpio_irq_chip, handle_simple_irq);irq_clear_status_flags (irq,IRQ_NOREQUEST ); -#ifdef CONFIG_ARM -set_irq_flags (irq,IRQF_VALID ); -#else irq_set_noprobe (irq); -#endif -return ret; }
@@ -301,9 +296,6 @@ static void grgpio_irq_unmap(struct irq_domain *d, unsigned int irq)int ngpio = priv->bgc.gc.ngpio;int i; -#ifdef CONFIG_ARM -set_irq_flags (irq,0 ); -#endif irq_set_chip_and_handler (irq,NULL ,NULL );irq_set_chip_data (irq,NULL );
drivers/gpio/gpio-pca953x.c +0 -5
@@ -525,12 +525,7 @@ static int pca953x_gpio_irq_map(struct irq_domain *d, unsigned int irq,irq_set_chip_data (irq, d->host_data);irq_set_chip (irq, &pca953x_irq_chip);irq_set_nested_thread (irq, true); -#ifdef CONFIG_ARM -set_irq_flags (irq,IRQF_VALID ); -#else irq_set_noprobe (irq); -#endif -return 0 ; }
drivers/gpio/gpio-pcf857x.c +0 -4
@@ -226,11 +226,7 @@ static int pcf857x_irq_domain_map(struct irq_domain *domain, unsigned int irq,irq_set_chip_and_handler (irq, &dummy_irq_chip, handle_level_irq); -#ifdef CONFIG_ARM -set_irq_flags (irq,IRQF_VALID ); -#else irq_set_noprobe (irq); -#endif gpio->irq_mapped |= (1 << hw);return 0 ;
drivers/gpio/gpio-stmpe.c +0 -8
@@ -284,20 +284,12 @@ static int stmpe_gpio_irq_map(struct irq_domain *d, unsigned int irq,irq_set_chip_and_handler (irq, &stmpe_gpio_irq_chip, handle_simple_irq);irq_set_nested_thread (irq,1 ); -#ifdef CONFIG_ARM -set_irq_flags (irq,IRQF_VALID ); -#else irq_set_noprobe (irq); -#endif -return 0 ; }static void stmpe_gpio_irq_unmap (struct irq_domain *d,unsigned int irq) { -#ifdef CONFIG_ARM -set_irq_flags (irq,0 ); -#endif irq_set_chip_and_handler (irq,NULL ,NULL );irq_set_chip_data (irq,NULL ); }
drivers/gpio/gpio-tc3589x.c +0 -8
@@ -263,20 +263,12 @@ static int tc3589x_gpio_irq_map(struct irq_domain *d, unsigned int irq,irq_set_chip_and_handler (irq, &tc3589x_gpio_irq_chip, handle_simple_irq);irq_set_nested_thread (irq,1 ); -#ifdef CONFIG_ARM -set_irq_flags (irq,IRQF_VALID ); -#else irq_set_noprobe (irq); -#endif -return 0 ; }static void tc3589x_gpio_irq_unmap (struct irq_domain *d,unsigned int irq) { -#ifdef CONFIG_ARM -set_irq_flags (irq,0 ); -#endif irq_set_chip_and_handler (irq,NULL ,NULL );irq_set_chip_data (irq,NULL ); }
drivers/mfd/88pm860x-core.c +0 -4
@@ -552,11 +552,7 @@ static int pm860x_irq_domain_map(struct irq_domain *d, unsigned int virq,irq_set_chip_data (virq, d->host_data);irq_set_chip_and_handler (virq, &pm860x_irq_chip, handle_edge_irq);irq_set_nested_thread (virq,1 ); -#ifdef CONFIG_ARM -set_irq_flags (virq,IRQF_VALID ); -#else irq_set_noprobe (virq); -#endif return 0 ; }
drivers/mfd/ab8500-core.c +0 -5
@@ -563,12 +563,7 @@ static int ab8500_irq_map(struct irq_domain *d, unsigned int virq,irq_set_chip_and_handler (virq, &ab8500_irq_chip, handle_simple_irq);irq_set_nested_thread (virq,1 ); -#ifdef CONFIG_ARM -set_irq_flags (virq,IRQF_VALID ); -#else irq_set_noprobe (virq); -#endif -return 0 ; }
drivers/mfd/arizona-irq.c +0 -8
@@ -166,15 +166,7 @@ static int arizona_irq_map(struct irq_domain *h, unsigned int virq,irq_set_chip_data (virq, data);irq_set_chip_and_handler (virq, &arizona_irq_chip, handle_edge_irq);irq_set_nested_thread (virq,1 ); - -/* ARM needs us to explicitly flag the IRQ as valid -* and will set them noprobe when we do so. */ -#ifdef CONFIG_ARM -set_irq_flags (virq,IRQF_VALID ); -#else irq_set_noprobe (virq); -#endif -return 0 ; }
drivers/mfd/lp8788-irq.c +0 -6
@@ -139,13 +139,7 @@ static int lp8788_irq_map(struct irq_domain *d, unsigned int virq,irq_set_chip_data (virq, irqd);irq_set_chip_and_handler (virq, chip, handle_edge_irq);irq_set_nested_thread (virq,1 ); - -#ifdef CONFIG_ARM -set_irq_flags (virq,IRQF_VALID ); -#else irq_set_noprobe (virq); -#endif -return 0 ; }
drivers/mfd/max77686-irq.c +0 -4
@@ -230,11 +230,7 @@ static int max77686_irq_domain_map(struct irq_domain *d, unsigned int irq,irq_set_chip_data (irq, max77686);irq_set_chip_and_handler (irq, &max77686_irq_chip, handle_edge_irq);irq_set_nested_thread (irq,1 ); -#ifdef CONFIG_ARM -set_irq_flags (irq,IRQF_VALID ); -#else irq_set_noprobe (irq); -#endif return 0 ; }
drivers/mfd/max77693-irq.c +0 -4
@@ -246,11 +246,7 @@ static int max77693_irq_domain_map(struct irq_domain *d, unsigned int irq,irq_set_chip_data (irq, max77693);irq_set_chip_and_handler (irq, &max77693_irq_chip, handle_edge_irq);irq_set_nested_thread (irq,1 ); -#ifdef CONFIG_ARM -set_irq_flags (irq,IRQF_VALID ); -#else irq_set_noprobe (irq); -#endif return 0 ; }
drivers/mfd/max8925-core.c +0 -4
@@ -648,11 +648,7 @@ static int max8925_irq_domain_map(struct irq_domain *d, unsigned int virq,irq_set_chip_data (virq, d->host_data);irq_set_chip_and_handler (virq, &max8925_irq_chip, handle_edge_irq);irq_set_nested_thread (virq,1 ); -#ifdef CONFIG_ARM -set_irq_flags (virq,IRQF_VALID ); -#else irq_set_noprobe (virq); -#endif return 0 ; }
drivers/mfd/max8997-irq.c +0 -4
@@ -295,11 +295,7 @@ static int max8997_irq_domain_map(struct irq_domain *d, unsigned int irq,irq_set_chip_data (irq, max8997);irq_set_chip_and_handler (irq, &max8997_irq_chip, handle_edge_irq);irq_set_nested_thread (irq,1 ); -#ifdef CONFIG_ARM -set_irq_flags (irq,IRQF_VALID ); -#else irq_set_noprobe (irq); -#endif return 0 ; }
drivers/mfd/max8998-irq.c +0 -4
@@ -206,11 +206,7 @@ static int max8998_irq_domain_map(struct irq_domain *d, unsigned int irq,irq_set_chip_data (irq, max8998);irq_set_chip_and_handler (irq, &max8998_irq_chip, handle_edge_irq);irq_set_nested_thread (irq,1 ); -#ifdef CONFIG_ARM -set_irq_flags (irq,IRQF_VALID ); -#else irq_set_noprobe (irq); -#endif return 0 ; }
drivers/mfd/stmpe.c +0 -8
@@ -957,20 +957,12 @@ static int stmpe_irq_map(struct irq_domain *d, unsigned int virq,irq_set_chip_data (virq, stmpe);irq_set_chip_and_handler (virq, chip, handle_edge_irq);irq_set_nested_thread (virq,1 ); -#ifdef CONFIG_ARM -set_irq_flags (virq,IRQF_VALID ); -#else irq_set_noprobe (virq); -#endif -return 0 ; }static void stmpe_irq_unmap (struct irq_domain *d,unsigned int virq) { -#ifdef CONFIG_ARM -set_irq_flags (virq,0 ); -#endif irq_set_chip_and_handler (virq,NULL ,NULL );irq_set_chip_data (virq,NULL ); }
drivers/mfd/tc3589x.c +0 -8
@@ -213,20 +213,12 @@ static int tc3589x_irq_map(struct irq_domain *d, unsigned int virq,irq_set_chip_and_handler (virq, &dummy_irq_chip, handle_edge_irq);irq_set_nested_thread (virq,1 ); -#ifdef CONFIG_ARM -set_irq_flags (virq,IRQF_VALID ); -#else irq_set_noprobe (virq); -#endif -return 0 ; }static void tc3589x_irq_unmap (struct irq_domain *d,unsigned int virq) { -#ifdef CONFIG_ARM -set_irq_flags (virq,0 ); -#endif irq_set_chip_and_handler (virq,NULL ,NULL );irq_set_chip_data (virq,NULL ); }
drivers/mfd/tps6586x.c +0 -8
@@ -290,15 +290,7 @@ static int tps6586x_irq_map(struct irq_domain *h, unsigned int virq,irq_set_chip_data (virq, tps6586x);irq_set_chip_and_handler (virq, &tps6586x_irq_chip, handle_simple_irq);irq_set_nested_thread (virq,1 ); - -/* ARM needs us to explicitly flag the IRQ as valid -* and will set them noprobe when we do so. */ -#ifdef CONFIG_ARM -set_irq_flags (virq,IRQF_VALID ); -#else irq_set_noprobe (virq); -#endif -return 0 ; }
drivers/mfd/twl6030-irq.c +0 -14
@@ -349,26 +349,12 @@ static int twl6030_irq_map(struct irq_domain *d, unsigned int virq,irq_set_chip_and_handler (virq, &pdata->irq_chip, handle_simple_irq);irq_set_nested_thread (virq, true);irq_set_parent (virq, pdata->twl_irq); - -#ifdef CONFIG_ARM -/* -* ARM requires an extra step to clear IRQ_NOREQUEST, which it -* sets on behalf of every irq_chip. Also sets IRQ_NOPROBE. -*/ -set_irq_flags (virq,IRQF_VALID ); -#else -/* same effect on other architectures */ irq_set_noprobe (virq); -#endif -return 0 ; }static void twl6030_irq_unmap (struct irq_domain *d,unsigned int virq) { -#ifdef CONFIG_ARM -set_irq_flags (virq,0 ); -#endif irq_set_chip_and_handler (virq,NULL ,NULL );irq_set_chip_data (virq,NULL ); }
drivers/mfd/wm831x-irq.c +0 -8
@@ -552,15 +552,7 @@ static int wm831x_irq_map(struct irq_domain *h, unsigned int virq,irq_set_chip_data (virq, h->host_data);irq_set_chip_and_handler (virq, &wm831x_irq_chip, handle_edge_irq);irq_set_nested_thread (virq,1 ); - -/* ARM needs us to explicitly flag the IRQ as valid -* and will set them noprobe when we do so. */ -#ifdef CONFIG_ARM -set_irq_flags (virq,IRQF_VALID ); -#else irq_set_noprobe (virq); -#endif -return 0 ; }
drivers/mfd/wm8994-irq.c +0 -8
@@ -172,15 +172,7 @@ static int wm8994_edge_irq_map(struct irq_domain *h, unsigned int virq,irq_set_chip_data (virq, wm8994);irq_set_chip_and_handler (virq, &wm8994_edge_irq_chip, handle_edge_irq);irq_set_nested_thread (virq,1 ); - -/* ARM needs us to explicitly flag the IRQ as valid -* and will set them noprobe when we do so. */ -#ifdef CONFIG_ARM -set_irq_flags (virq,IRQF_VALID ); -#else irq_set_noprobe (virq); -#endif -return 0 ; }
drivers/pinctrl/pinctrl-single.c +0 -4
@@ -1744,11 +1744,7 @@ static int pcs_irqdomain_map(struct irq_domain *d, unsigned int irq,irq_set_chip_and_handler (irq, &pcs->chip, handle_level_irq); -#ifdef CONFIG_ARM -set_irq_flags (irq,IRQF_VALID ); -#else irq_set_noprobe (irq); -#endif return 0 ; }
Signature · 2 lines
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation