Signed-off-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> --- drivers/gpio/gpio-xilinx.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/drivers/gpio/gpio-xilinx.c b/drivers/gpio/gpio-xilinx.c index d5a08dcdd677..109b32104867 100644 --- a/drivers/gpio/gpio-xilinx.c +++ b/drivers/gpio/gpio-xilinx.c @@ -75,9 +75,14 @@ struct xgpio_instance { struct clk *clk; }; +static inline int xgpio_from_bit(struct xgpio_instance *chip, int bit) +{ + return bitmap_bitremap(bit, chip->hw_map, chip->sw_map, 64); +} + static inline int xgpio_to_bit(struct xgpio_instance *chip, int gpio) { - return bitmap_bitremap(gpio, chip->sw_map, chip->hw_map, chip->gc.ngpio); + return bitmap_bitremap(gpio, chip->sw_map, chip->hw_map, 64); } static inline u32 xgpio_get_value32(const unsigned long *map, int bit) @@ -207,11 +212,11 @@ static void xgpio_set_multiple(struct gpio_chip *gc, unsigned long *mask, spin_lock_irqsave(&chip->gpio_lock, flags); - bitmap_replace(state, chip->state, hw_bits, hw_mask, gc->ngpio); + bitmap_replace(state, chip->state, hw_bits, hw_mask, 64); xgpio_write_ch_all(chip, XGPIO_DATA_OFFSET, state); - bitmap_copy(chip->state, state, gc->ngpio); + bitmap_copy(chip->state, state, 64); spin_unlock_irqrestore(&chip->gpio_lock, flags); } @@ -501,6 +506,7 @@ static void xgpio_irqhandler(struct irq_desc *desc) DECLARE_BITMAP(rising, 64); DECLARE_BITMAP(falling, 64); DECLARE_BITMAP(all, 64); + int irq_offset; u32 status; u32 bit; @@ -530,8 +536,10 @@ static void xgpio_irqhandler(struct irq_desc *desc) dev_dbg(gc->parent, "IRQ rising %*pb falling %*pb\n", 64, rising, 64, falling); - for_each_set_bit(bit, all, 64) - generic_handle_irq(irq_find_mapping(gc->irq.domain, bit)); + for_each_set_bit(bit, all, 64) { + irq_offset = xgpio_from_bit(chip, bit); + generic_handle_irq(irq_find_mapping(gc->irq.domain, irq_offset)); + } chained_irq_exit(irqchip, desc); } -- 2.30.2