diff options
Diffstat (limited to 'arch/sparc/kernel/leon_kernel.c')
| -rw-r--r-- | arch/sparc/kernel/leon_kernel.c | 14 | 
1 files changed, 7 insertions, 7 deletions
diff --git a/arch/sparc/kernel/leon_kernel.c b/arch/sparc/kernel/leon_kernel.c index 8591cf124ec..390e4696276 100644 --- a/arch/sparc/kernel/leon_kernel.c +++ b/arch/sparc/kernel/leon_kernel.c @@ -31,6 +31,7 @@ int leondebug_irq_disable;  int leon_debug_irqout;  static int dummy_master_l10_counter;  unsigned long amba_system_id; +static DEFINE_SPINLOCK(leon_irq_lock);  unsigned long leon3_gptimer_irq; /* interrupt controller irq number */  unsigned long leon3_gptimer_idx; /* Timer Index (0..6) within Timer Core */ @@ -88,10 +89,10 @@ static void leon_unmask_irq(struct irq_data *data)  	unsigned long mask, flags;  	mask = (unsigned long)data->chip_data; -	local_irq_save(flags); +	spin_lock_irqsave(&leon_irq_lock, flags);  	LEON3_BYPASS_STORE_PA(LEON_IMASK,  			      (LEON3_BYPASS_LOAD_PA(LEON_IMASK) | (mask))); -	local_irq_restore(flags); +	spin_unlock_irqrestore(&leon_irq_lock, flags);  }  static void leon_mask_irq(struct irq_data *data) @@ -99,11 +100,10 @@ static void leon_mask_irq(struct irq_data *data)  	unsigned long mask, flags;  	mask = (unsigned long)data->chip_data; -	local_irq_save(flags); +	spin_lock_irqsave(&leon_irq_lock, flags);  	LEON3_BYPASS_STORE_PA(LEON_IMASK,  			      (LEON3_BYPASS_LOAD_PA(LEON_IMASK) & ~(mask))); -	local_irq_restore(flags); - +	spin_unlock_irqrestore(&leon_irq_lock, flags);  }  static unsigned int leon_startup_irq(struct irq_data *data) @@ -383,10 +383,10 @@ void leon_enable_irq_cpu(unsigned int irq_nr, unsigned int cpu)  {  	unsigned long mask, flags, *addr;  	mask = get_irqmask(irq_nr); -	local_irq_save(flags); +	spin_lock_irqsave(&leon_irq_lock, flags);  	addr = (unsigned long *)&(leon3_irqctrl_regs->mask[cpu]);  	LEON3_BYPASS_STORE_PA(addr, (LEON3_BYPASS_LOAD_PA(addr) | (mask))); -	local_irq_restore(flags); +	spin_unlock_irqrestore(&leon_irq_lock, flags);  }  #endif  |