Commit 56a86c35 authored by Thomas Gleixner's avatar Thomas Gleixner Committed by Ralf Baechle

MIPS: octeon: Replace the homebrewn flow handler

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: default avatarThomas Gleixner <tglx@linutronix.de>
Cc: David Daney <david.daney@cavium.com>
Cc: Jiang Liu <jiang.liu@linux.intel.com>
Cc: linux-mips@linux-mips.org
Cc: LKML <linux-kernel@vger.kernel.org>
Patchwork: https://patchwork.linux-mips.org/patch/10704/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 9d9a2fa7
...@@ -663,6 +663,11 @@ static int octeon_irq_ciu_gpio_set_type(struct irq_data *data, unsigned int t) ...@@ -663,6 +663,11 @@ static int octeon_irq_ciu_gpio_set_type(struct irq_data *data, unsigned int t)
irqd_set_trigger_type(data, t); irqd_set_trigger_type(data, t);
octeon_irq_gpio_setup(data); 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; return IRQ_SET_MASK_OK;
} }
...@@ -697,16 +702,6 @@ static void octeon_irq_ciu_gpio_ack(struct irq_data *data) ...@@ -697,16 +702,6 @@ static void octeon_irq_ciu_gpio_ack(struct irq_data *data)
cvmx_write_csr(CVMX_GPIO_INT_CLR, mask); 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 #ifdef CONFIG_SMP
static void octeon_irq_cpu_offline_ciu(struct irq_data *data) static void octeon_irq_cpu_offline_ciu(struct irq_data *data)
...@@ -1229,8 +1224,13 @@ static int octeon_irq_gpio_map(struct irq_domain *d, ...@@ -1229,8 +1224,13 @@ static int octeon_irq_gpio_map(struct irq_domain *d,
octeon_irq_ciu_to_irq[line][bit] != 0) octeon_irq_ciu_to_irq[line][bit] != 0)
return -EINVAL; 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, 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; return r;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment