diff options
author | Andrey Smirnov <andrew.smirnov@gmail.com> | 2016-11-07 08:53:20 -0800 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2016-11-08 09:46:13 +0100 |
commit | 05a90cc7293878aa5b914e380a02ea9b65e2336d (patch) | |
tree | 17110370c76b39b5d3b97ec1e43344843864d486 /drivers/pinctrl | |
parent | ab5bd035445932397bfe351403ce52246096a261 (diff) |
pinctrl-sx150x: Simplify interrupt handler
Make use of for_each_set_bit macro and reduce boilerplate code.
Tested-by: Neil Armstrong <narmstrong@baylibre.com>
Acked-by: Neil Armstrong <narmstrong@baylibre.com>
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl')
-rw-r--r-- | drivers/pinctrl/pinctrl-sx150x.c | 18 |
1 files changed, 6 insertions, 12 deletions
diff --git a/drivers/pinctrl/pinctrl-sx150x.c b/drivers/pinctrl/pinctrl-sx150x.c index f2ec072a2134..78e15c9a73a2 100644 --- a/drivers/pinctrl/pinctrl-sx150x.c +++ b/drivers/pinctrl/pinctrl-sx150x.c @@ -465,11 +465,9 @@ static int sx150x_irq_set_type(struct irq_data *d, unsigned int flow_type) static irqreturn_t sx150x_irq_thread_fn(int irq, void *dev_id) { struct sx150x_pinctrl *pctl = (struct sx150x_pinctrl *)dev_id; - unsigned int nhandled = 0; - unsigned int sub_irq; - unsigned int n; - s32 err; + unsigned long n, status; unsigned int val; + int err; err = regmap_read(pctl->regmap, pctl->data->reg_irq_src, &val); if (err < 0) @@ -479,15 +477,11 @@ static irqreturn_t sx150x_irq_thread_fn(int irq, void *dev_id) if (err < 0) return IRQ_NONE; - for (n = 0; n < pctl->data->ngpios; ++n) { - if (val & BIT(n)) { - sub_irq = irq_find_mapping(pctl->gpio.irqdomain, n); - handle_nested_irq(sub_irq); - ++nhandled; - } - } + status = val; + for_each_set_bit(n, &status, pctl->data->ngpios) + handle_nested_irq(irq_find_mapping(pctl->gpio.irqdomain, n)); - return (nhandled > 0 ? IRQ_HANDLED : IRQ_NONE); + return IRQ_HANDLED; } static void sx150x_irq_bus_lock(struct irq_data *d) |