From: Huibin Hong Date: Mon, 21 Nov 2016 09:47:06 +0000 (+0800) Subject: irqchip/gicv2/3: add gic_retrigger X-Git-Tag: firefly_0821_release~121 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=c04b4e2e77a884014ab4d2538a90281b4b0e3a6f;p=firefly-linux-kernel-4.4.55.git irqchip/gicv2/3: add gic_retrigger Change-Id: Ic87d4936317fb598c04e3ccc56a850c0c9e4e6ba Signed-off-by: chenjh --- diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c index dff17aef68a2..3d1514ac932d 100644 --- a/drivers/irqchip/irq-gic-v3.c +++ b/drivers/irqchip/irq-gic-v3.c @@ -216,6 +216,15 @@ static void gic_unmask_irq(struct irq_data *d) gic_poke_irq(d, GICD_ISENABLER); } +#ifdef CONFIG_ARCH_ROCKCHIP +static int gic_retrigger(struct irq_data *d) +{ + gic_poke_irq(d, GICD_ISPENDR); + /* the genirq layer expects 0 if we can't retrigger in hardware */ + return 0; +} +#endif + static int gic_irq_set_irqchip_state(struct irq_data *d, enum irqchip_irq_state which, bool val) { @@ -697,6 +706,9 @@ static struct irq_chip gic_chip = { .irq_unmask = gic_unmask_irq, .irq_eoi = gic_eoi_irq, .irq_set_type = gic_set_type, +#ifdef CONFIG_ARCH_ROCKCHIP + .irq_retrigger = gic_retrigger, +#endif .irq_set_affinity = gic_set_affinity, .irq_get_irqchip_state = gic_irq_get_irqchip_state, .irq_set_irqchip_state = gic_irq_set_irqchip_state, @@ -708,6 +720,9 @@ static struct irq_chip gic_eoimode1_chip = { .irq_mask = gic_eoimode1_mask_irq, .irq_unmask = gic_unmask_irq, .irq_eoi = gic_eoimode1_eoi_irq, +#ifdef CONFIG_ARCH_ROCKCHIP + .irq_retrigger = gic_retrigger, +#endif .irq_set_type = gic_set_type, .irq_set_affinity = gic_set_affinity, .irq_get_irqchip_state = gic_irq_get_irqchip_state, diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c index 7851e786af99..d422377f5743 100644 --- a/drivers/irqchip/irq-gic.c +++ b/drivers/irqchip/irq-gic.c @@ -205,6 +205,15 @@ static void gic_unmask_irq(struct irq_data *d) gic_poke_irq(d, GIC_DIST_ENABLE_SET); } +#ifdef CONFIG_ARCH_ROCKCHIP +static int gic_retrigger(struct irq_data *d) +{ + gic_poke_irq(d, GIC_DIST_PENDING_SET); + /* the genirq layer expects 0 if we can't retrigger in hardware */ + return 0; +} +#endif + static void gic_eoi_irq(struct irq_data *d) { writel_relaxed(gic_irq(d), gic_cpu_base(d) + GIC_CPU_EOI); @@ -396,6 +405,9 @@ static struct irq_chip gic_chip = { .irq_unmask = gic_unmask_irq, .irq_eoi = gic_eoi_irq, .irq_set_type = gic_set_type, +#ifdef CONFIG_ARCH_ROCKCHIP + .irq_retrigger = gic_retrigger, +#endif #ifdef CONFIG_SMP .irq_set_affinity = gic_set_affinity, #endif @@ -412,6 +424,9 @@ static struct irq_chip gic_eoimode1_chip = { .irq_unmask = gic_unmask_irq, .irq_eoi = gic_eoimode1_eoi_irq, .irq_set_type = gic_set_type, +#ifdef CONFIG_ARCH_ROCKCHIP + .irq_retrigger = gic_retrigger, +#endif #ifdef CONFIG_SMP .irq_set_affinity = gic_set_affinity, #endif