forked from luck/tmp_suning_uos_patched
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:
parent
9df10281e1
commit
bfd15117ae
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user