From 8696cc387516eca1bf061458d593868dcc1fc20b Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Tue, 19 Feb 2019 11:10:52 +0800 Subject: [PATCH] irq: add irq busy validation return -EBUSY when this irq is occupied. Change-Id: I75ad6c0b13e167762cab2b8f9a2b786e588b2ade Signed-off-by: Joseph Chen --- drivers/irq/irq-generic.c | 5 +++++ drivers/irq/irq-gpio-switch.c | 9 +++++++-- include/irq-generic.h | 1 + 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/irq/irq-generic.c b/drivers/irq/irq-generic.c index b4362e9d77..7fffacff6b 100644 --- a/drivers/irq/irq-generic.c +++ b/drivers/irq/irq-generic.c @@ -64,6 +64,11 @@ void _do_generic_irq_handler(void) gic_irq_chip->irq_eoi(irq); } +int irq_is_busy(int irq) +{ + return (irq >= 0 && irqs_desc[irq].handle_irq) ? -EBUSY : 0; +} + static int chip_irq_bad(struct irq_chip *chip) { if (!chip->name || diff --git a/drivers/irq/irq-gpio-switch.c b/drivers/irq/irq-gpio-switch.c index c1529ef62d..c8bc722d8a 100644 --- a/drivers/irq/irq-gpio-switch.c +++ b/drivers/irq/irq-gpio-switch.c @@ -57,6 +57,7 @@ static int gpio_is_valid(u32 gpio) static int _hard_gpio_to_irq(u32 gpio) { int idx, bank = 0, pin = 0; + int irq; if (!gpio_is_valid(gpio)) return -EINVAL; @@ -65,8 +66,12 @@ static int _hard_gpio_to_irq(u32 gpio) pin = (gpio & GPIO_PIN_MASK) >> GPIO_PIN_OFFSET; for (idx = 0; idx < ARRAY_SIZE(gpio_banks); idx++) { - if (gpio_banks[idx].id == bank) - return (gpio_banks[idx].irq_base + pin); + if (gpio_banks[idx].id == bank) { + irq = (gpio_banks[idx].irq_base + pin); + if (irq_is_busy(irq)) + return -EBUSY; + return irq; + } } return -EINVAL; diff --git a/include/irq-generic.h b/include/irq-generic.h index eaa7331686..62e611b33d 100644 --- a/include/irq-generic.h +++ b/include/irq-generic.h @@ -69,6 +69,7 @@ int irq_handler_disable(int irq); int irq_get_gpio_level(int irq); int irqs_suspend(void); int irqs_resume(void); +int irq_is_busy(int irq); int gpio_to_irq(struct gpio_desc *gpio); /*