spin_lock_irqsave and ISP interrupts on OMAP 3530

Russell King - ARM Linux linux at arm.linux.org.uk
Thu Feb 10 12:53:55 EST 2011

On Thu, Feb 10, 2011 at 09:36:35AM -0800, Adam Wozniak wrote:
> [Apologies, I tried this email a week ago on the linux-omap list with  
> zero responses, so I thought I should try here.]
> I'm hoping I'm just not understanding something and this isn't as broke  
> as I fear it is.
> I'm using the ISP on an OMAP3530, linux 2.6.32.  I've got some kernel  
> code I want to lock in both the process context and the ISP interrupt  
> context, so I'm using a spinlock.  As I understand it, locking the  
> spinlock should disable all interrupts.  However, I'm still seeing the  
> ISP interrupt happen when I've got the spinlock locked in the process  
> context.
> i.e. somewhere I've got the code below, and my Warning is tripping.  Is  
> this broken, or am I not understanding something?
> int am_i_locked = 0;
> spinlock_t my_spinlock = SPIN_LOCK_UNLOCKED;
> void foo(void) {
>     /* function could be called from process context, or could be called 
> from omap34xx_isp_isr (interrupt context) */
>     unsigned long flags;
>     spin_lock_irqsave(&my_spinlock, flags);
>     WARN_ON(am_i_locked);
>     am_i_locked++;
>     /* do some stuff */
>     am_i_locked--;
>     spin_unlock_irqrestore(&my_spinlock, flags);
> }

You probably didn't get a response because this is insufficient to guess
what could be going on.  Try posting the entire code for this function.

More information about the linux-arm mailing list