Message ID | 20200409141228.49561-3-andriy.shevchenko@linux.intel.com |
---|---|
State | New |
Headers | show |
Series | gpio: dwapb: Clean up the driver and a fix | expand |
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@gmail.com> > > Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> > --- > 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 >
On Wed, Apr 15, 2020 at 03:04:49PM +0300, Serge Semin wrote: > 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. Will do in v2. Hope your Tested-by holds. > After this > Reviewed-by: Serge Semin <fancer.lancer@gmail.com> Thanks!
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)
Refactor IRQ handler in order to: - enter and exit chained IRQ - use for_each_set_bit() helper Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> --- drivers/gpio/gpio-dwapb.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-)