Skip to content

Commit

Permalink
Blackfin arch: Not call generic set_irq_handler() in bfin_gpio_irq_ty…
Browse files Browse the repository at this point in the history
…pe() due to spinlock recursion

Signed-off-by: Graf Yang <graf.yang@analog.com>
Signed-off-by: Bryan Wu <cooloney@kernel.org>
  • Loading branch information
Graf Yang authored and Bryan Wu committed Oct 8, 2008
1 parent 9df1028 commit bfd1511
Showing 1 changed file with 12 additions and 4 deletions.
16 changes: 12 additions & 4 deletions arch/blackfin/mach-common/ints-priority.c
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,14 @@ static void bfin_demux_error_irq(unsigned int int_err_irq,
}
#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)

static unsigned short gpio_enabled[gpio_bank(MAX_BLACKFIN_GPIOS)];
Expand Down Expand Up @@ -476,9 +484,9 @@ static int bfin_gpio_irq_type(unsigned int irq, unsigned int type)
SSYNC();

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
set_irq_handler(irq, handle_level_irq);
bfin_set_irq_handler(irq, handle_level_irq);

return 0;
}
Expand Down Expand Up @@ -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)) {
pint[bank]->edge_set = pintbit;
set_irq_handler(irq, handle_edge_irq);
bfin_set_irq_handler(irq, handle_edge_irq);
} else {
pint[bank]->edge_clear = pintbit;
set_irq_handler(irq, handle_level_irq);
bfin_set_irq_handler(irq, handle_level_irq);
}

SSYNC();
Expand Down

0 comments on commit bfd1511

Please sign in to comment.