Commit bfd15117 authored by Graf Yang's avatar Graf Yang Committed by Bryan Wu

Blackfin arch: Not call generic set_irq_handler() in bfin_gpio_irq_type() due to spinlock recursion

Signed-off-by: default avatarGraf Yang <graf.yang@analog.com>
Signed-off-by: default avatarBryan Wu <cooloney@kernel.org>
parent 9df10281
...@@ -364,6 +364,14 @@ static void bfin_demux_error_irq(unsigned int int_err_irq, ...@@ -364,6 +364,14 @@ static void bfin_demux_error_irq(unsigned int int_err_irq,
} }
#endif /* BF537_GENERIC_ERROR_INT_DEMUX */ #endif /* BF537_GENERIC_ERROR_INT_DEMUX */
static inline void bfin_set_irq_handler(unsigned irq, irq_flow_handler_t handle)
{
struct irq_desc *desc = irq_desc + irq;
/* May not call generic set_irq_handler() due to spinlock
recursion. */
desc->handle_irq = handle;
}
#if !defined(CONFIG_BF54x) #if !defined(CONFIG_BF54x)
static unsigned short gpio_enabled[gpio_bank(MAX_BLACKFIN_GPIOS)]; static unsigned short gpio_enabled[gpio_bank(MAX_BLACKFIN_GPIOS)];
...@@ -476,9 +484,9 @@ static int bfin_gpio_irq_type(unsigned int irq, unsigned int type) ...@@ -476,9 +484,9 @@ static int bfin_gpio_irq_type(unsigned int irq, unsigned int type)
SSYNC(); SSYNC();
if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING))
set_irq_handler(irq, handle_edge_irq); bfin_set_irq_handler(irq, handle_edge_irq);
else else
set_irq_handler(irq, handle_level_irq); bfin_set_irq_handler(irq, handle_level_irq);
return 0; return 0;
} }
...@@ -808,10 +816,10 @@ static int bfin_gpio_irq_type(unsigned int irq, unsigned int type) ...@@ -808,10 +816,10 @@ static int bfin_gpio_irq_type(unsigned int irq, unsigned int type)
if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) { if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) {
pint[bank]->edge_set = pintbit; pint[bank]->edge_set = pintbit;
set_irq_handler(irq, handle_edge_irq); bfin_set_irq_handler(irq, handle_edge_irq);
} else { } else {
pint[bank]->edge_clear = pintbit; pint[bank]->edge_clear = pintbit;
set_irq_handler(irq, handle_level_irq); bfin_set_irq_handler(irq, handle_level_irq);
} }
SSYNC(); SSYNC();
......
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