#include <linux/regmap.h>
#include <linux/mfd/syscon.h>
#include <dt-bindings/pinctrl/rockchip.h>
+#include <linux/ipipe.h>
#include "core.h"
#include "pinconf.h"
struct irq_domain *domain;
struct gpio_chip gpio_chip;
struct pinctrl_gpio_range grange;
- raw_spinlock_t slock;
+ ipipe_spinlock_t slock;
u32 toggle_edge_mode;
u32 recalced_mask;
u32 route_mask;
} while ((data & BIT(irq)) != (data_old & BIT(irq)));
}
- generic_handle_irq(virq);
+ ipipe_handle_demuxed_irq(virq);
}
chained_irq_exit(chip, desc);
u32 polarity;
u32 level;
u32 data;
- unsigned long flags;
+ unsigned long flags, gcflags;
int ret;
/* make sure the pin is configured as gpio input */
irq_set_handler_locked(d, handle_level_irq);
raw_spin_lock_irqsave(&bank->slock, flags);
- irq_gc_lock(gc);
+ gcflags = irq_gc_lock(gc);
level = readl_relaxed(gc->reg_base + GPIO_INTTYPE_LEVEL);
polarity = readl_relaxed(gc->reg_base + GPIO_INT_POLARITY);
polarity &= ~mask;
break;
default:
- irq_gc_unlock(gc);
+ irq_gc_unlock(gc, gcflags);
raw_spin_unlock_irqrestore(&bank->slock, flags);
clk_disable(bank->clk);
return -EINVAL;
writel_relaxed(level, gc->reg_base + GPIO_INTTYPE_LEVEL);
writel_relaxed(polarity, gc->reg_base + GPIO_INT_POLARITY);
- irq_gc_unlock(gc);
+ irq_gc_unlock(gc, gcflags);
raw_spin_unlock_irqrestore(&bank->slock, flags);
clk_disable(bank->clk);
gc->chip_types[0].chip.irq_suspend = rockchip_irq_suspend;
gc->chip_types[0].chip.irq_resume = rockchip_irq_resume;
gc->chip_types[0].chip.irq_set_type = rockchip_irq_set_type;
+ gc->chip_types[0].chip.flags = IRQCHIP_PIPELINE_SAFE;
gc->wake_enabled = IRQ_MSK(bank->nr_pins);
irq_set_chained_handler_and_data(bank->irq,