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

Signed-off-by: Graf Yang <graf.yang@analog.com>
Signed-off-by: Bryan Wu <cooloney@kernel.org>
This commit is contained in:
Graf Yang 2008-10-08 18:02:44 +08:00 committed by Bryan Wu
parent 9df10281e1
commit bfd15117ae
1 changed files with 12 additions and 4 deletions

View File

@ -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)
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)
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();