Messages in this thread | | | Date | Wed, 15 Jul 2015 14:19:53 -0700 | From | David Daney <> | Subject | Re: [patch 10/12] MIPS/cavium/octeon: Replace the homebrewn flow handler |
| |
On 07/13/2015 01:46 PM, Thomas Gleixner wrote: > The gpio interrupt handling of octeon contains a homebrewn flow > handler which calls either handle_level_irq or handle_edge_irq > depending on the trigger type. Thats an extra conditional and call in > the interrupt handling path. The proper way to handle different types > and therefor different flows is to update the handler in the > irq_set_type() callback. > > Remove the extra indirection and add the handler update to > octeon_irq_ciu_gpio_set_type(). At mapping time it defaults to > handle_level_irq which gets updated if the device tree contains a > different trigger type. > > Signed-off-by: Thomas Gleixner<tglx@linutronix.de>
This looks sane, not tested, but ...
Acked-by: David Daney <david.daney@cavium.com>
> Cc: Ralf Baechle<ralf@linux-mips.org> > Cc: David Daney<david.daney@cavium.com> > Cc: Jiang Liu<jiang.liu@linux.intel.com> > Cc:linux-mips@linux-mips.org > --- > arch/mips/cavium-octeon/octeon-irq.c | 22 +++++++++++----------- > 1 file changed, 11 insertions(+), 11 deletions(-) > > Index: tip/arch/mips/cavium-octeon/octeon-irq.c > =================================================================== > --- tip.orig/arch/mips/cavium-octeon/octeon-irq.c > +++ tip/arch/mips/cavium-octeon/octeon-irq.c > @@ -663,6 +663,11 @@ static int octeon_irq_ciu_gpio_set_type( > irqd_set_trigger_type(data, t); > octeon_irq_gpio_setup(data); > > + if (irqd_get_trigger_type(data) & IRQ_TYPE_EDGE_BOTH) > + irq_set_handler_locked(data, handle_edge_irq); > + else > + irq_set_handler_locked(data, handle_level_irq); > + > return IRQ_SET_MASK_OK; > } > > @@ -697,16 +702,6 @@ static void octeon_irq_ciu_gpio_ack(stru > cvmx_write_csr(CVMX_GPIO_INT_CLR, mask); > } > > -static void octeon_irq_handle_trigger(unsigned int irq, struct irq_desc *desc) > -{ > - struct irq_data *data = irq_desc_get_irq_data(desc); > - > - if (irqd_get_trigger_type(data) & IRQ_TYPE_EDGE_BOTH) > - handle_edge_irq(irq, desc); > - else > - handle_level_irq(irq, desc); > -} > - > #ifdef CONFIG_SMP > > static void octeon_irq_cpu_offline_ciu(struct irq_data *data) > @@ -1229,8 +1224,13 @@ static int octeon_irq_gpio_map(struct ir > octeon_irq_ciu_to_irq[line][bit] != 0) > return -EINVAL; > > + /* > + * Default to handle_level_irq. If the DT contains a different > + * trigger type, it will call the irq_set_type callback and > + * the handler gets updated. > + */ > r = octeon_irq_set_ciu_mapping(virq, line, bit, hw, > - octeon_irq_gpio_chip, octeon_irq_handle_trigger); > + octeon_irq_gpio_chip, handle_level_irq); > return r; > } > > > > > >
| |