diff options
| author | 2013-03-23 17:27:53 +0000 | |
|---|---|---|
| committer | 2013-05-08 01:19:04 +0200 | |
| commit | 33ff712aef509ff1b116a46084c96179f8da1d49 (patch) | |
| tree | 2ea35165158d82337ad19c57a7dfa88ea97d0b75 | |
| parent | MIPS: BCM63XX: merge bcm63xx_clk.h into bcm63xx/clk.c (diff) | |
| download | linux-dev-33ff712aef509ff1b116a46084c96179f8da1d49.tar.xz linux-dev-33ff712aef509ff1b116a46084c96179f8da1d49.zip  | |
MIPS: Netlogic: Optimize and fix write_c0_eimr()
Remove the irq save/restore from write_c0_eimr(), as it is always called
with interrupts off.
This allows us to remove workaround in write_c0_eimr() to fix up the
flags used by local_irq_save. This fixup worked on XLR, but will break
when 32-bit support is added to r2 cpus like XLP.
Signed-off-by: Jayachandran C <jchandra@broadcom.com>
Patchwork: http://patchwork.linux-mips.org/patch/5022/
Acked-by: John Crispin <blogic@openwrt.org>
| -rw-r--r-- | arch/mips/include/asm/netlogic/mips-extns.h | 13 | 
1 files changed, 5 insertions, 8 deletions
diff --git a/arch/mips/include/asm/netlogic/mips-extns.h b/arch/mips/include/asm/netlogic/mips-extns.h index 8ad2e0f81719..69d18a0e0581 100644 --- a/arch/mips/include/asm/netlogic/mips-extns.h +++ b/arch/mips/include/asm/netlogic/mips-extns.h @@ -43,16 +43,15 @@  #define write_c0_eirr(val)	__write_64bit_c0_register($9, 6, val)  /* - * Writing EIMR in 32 bit is a special case, the lower 8 bit of the - * EIMR is shadowed in the status register, so we cannot save and - * restore status register for split read. + * NOTE: Do not save/restore flags around write_c0_eimr(). + * On non-R2 platforms the flags has part of EIMR that is shadowed in STATUS + * register. Restoring flags will overwrite the lower 8 bits of EIMR. + * + * Call with interrupts disabled.   */  #define write_c0_eimr(val)						\  do {									\  	if (sizeof(unsigned long) == 4) {				\ -		unsigned long __flags;					\ -									\ -		local_irq_save(__flags);				\  		__asm__ __volatile__(					\  			".set\tmips64\n\t"				\  			"dsll\t%L0, %L0, 32\n\t"			\ @@ -62,8 +61,6 @@ do {									\  			"dmtc0\t%L0, $9, 7\n\t"				\  			".set\tmips0"					\  			: : "r" (val));					\ -		__flags = (__flags & 0xffff00ff) | (((val) & 0xff) << 8);\ -		local_irq_restore(__flags);				\  	} else								\  		__write_64bit_c0_register($9, 7, (val));		\  } while (0)  | 
