On Thu, Apr 09, 2020 at 05:12:17PM +0300, Andy Shevchenko wrote: > Refactor IRQ handler in order to: > - enter and exit chained IRQ > - use for_each_set_bit() helper Please split these two changes into the dedicated patches. After this Reviewed-by: Serge Semin <fancer.lancer@xxxxxxxxx> > > Signed-off-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> > --- > drivers/gpio/gpio-dwapb.c | 20 +++++++++----------- > 1 file changed, 9 insertions(+), 11 deletions(-) > > diff --git a/drivers/gpio/gpio-dwapb.c b/drivers/gpio/gpio-dwapb.c > index c1b6d4f7307e..f61139f787d9 100644 > --- a/drivers/gpio/gpio-dwapb.c > +++ b/drivers/gpio/gpio-dwapb.c > @@ -193,22 +193,21 @@ static void dwapb_toggle_trigger(struct dwapb_gpio *gpio, unsigned int offs) > > static u32 dwapb_do_irq(struct dwapb_gpio *gpio) > { > - u32 irq_status = dwapb_read(gpio, GPIO_INTSTATUS); > - u32 ret = irq_status; > + unsigned long irq_status; > + int hwirq; > > - while (irq_status) { > - int hwirq = fls(irq_status) - 1; > + irq_status = dwapb_read(gpio, GPIO_INTSTATUS); > + for_each_set_bit(hwirq, &irq_status, 32) { > int gpio_irq = irq_find_mapping(gpio->domain, hwirq); > + u32 irq_type = irq_get_trigger_type(gpio_irq); > > generic_handle_irq(gpio_irq); > - irq_status &= ~BIT(hwirq); > > - if ((irq_get_trigger_type(gpio_irq) & IRQ_TYPE_SENSE_MASK) > - == IRQ_TYPE_EDGE_BOTH) > + if ((irq_type & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH) > dwapb_toggle_trigger(gpio, hwirq); > } > > - return ret; > + return irq_status; > } > > static void dwapb_irq_handler(struct irq_desc *desc) > @@ -216,10 +215,9 @@ static void dwapb_irq_handler(struct irq_desc *desc) > struct dwapb_gpio *gpio = irq_desc_get_handler_data(desc); > struct irq_chip *chip = irq_desc_get_chip(desc); > > + chained_irq_enter(chip, desc); > dwapb_do_irq(gpio); > - > - if (chip->irq_eoi) > - chip->irq_eoi(irq_desc_get_irq_data(desc)); > + chained_irq_exit(chip, desc); > } > > static void dwapb_irq_enable(struct irq_data *d) > -- > 2.25.1 >