Browse Source

[PATCH] m68knommu: optimized local_irq_disable, and platform reboot code

Switch to a space optimized version of local_irq_disable() for ColdFire
platforms. Also add reboot support for the Freescale M5272 platform.
Patch originally submitted by Philippe De Muyter <phdm@macqel.be>.

Add reboot support for the Freescale M523x ColdFire platform. Patch originally
submitted by Jate Sujjavanich.

Signed-off-by: Greg Ungerer <gerg@uclinux.com>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Greg Ungerer 19 years ago
parent
commit
9c2aba4852
1 changed files with 48 additions and 6 deletions
  1. 48 6
      include/asm-m68knommu/system.h

+ 48 - 6
include/asm-m68knommu/system.h

@@ -57,9 +57,18 @@ asmlinkage void resume(void);
         : "cc", "%d0", "memory")
         : "cc", "%d0", "memory")
 #define local_irq_disable() __asm__ __volatile__ (		\
 #define local_irq_disable() __asm__ __volatile__ (		\
 	"move %/sr,%%d0\n\t"					\
 	"move %/sr,%%d0\n\t"					\
-	"ori.l  #0x0700,%%d0\n\t"				\
+	"ori.l #0x0700,%%d0\n\t"				\
 	"move %%d0,%/sr\n"					\
 	"move %%d0,%/sr\n"					\
-	: /* no inputs */					\
+	: /* no outputs */					\
+	:							\
+	: "cc", "%d0", "memory")
+/* For spinlocks etc */
+#define local_irq_save(x) __asm__ __volatile__ (		\
+	"movew %%sr,%0\n\t"					\
+	"movew #0x0700,%%d0\n\t"				\
+	"or.l  %0,%%d0\n\t"					\
+	"movew %%d0,%/sr"					\
+	: "=d" (x)						\
 	:							\
 	:							\
 	: "cc", "%d0", "memory")
 	: "cc", "%d0", "memory")
 #else
 #else
@@ -75,7 +84,9 @@ asmlinkage void resume(void);
 #define local_irq_restore(x) asm volatile ("movew %0,%%sr": :"d" (x) : "memory")
 #define local_irq_restore(x) asm volatile ("movew %0,%%sr": :"d" (x) : "memory")
 
 
 /* For spinlocks etc */
 /* For spinlocks etc */
+#ifndef local_irq_save
 #define local_irq_save(x) do { local_save_flags(x); local_irq_disable(); } while (0)
 #define local_irq_save(x) do { local_save_flags(x); local_irq_disable(); } while (0)
+#endif
 
 
 #define	irqs_disabled()			\
 #define	irqs_disabled()			\
 ({					\
 ({					\
@@ -234,9 +245,9 @@ cmpxchg(volatile int *p, int old, int new)
 #ifdef CONFIG_COLDFIRE
 #ifdef CONFIG_COLDFIRE
 #if defined(CONFIG_M5272) && defined(CONFIG_NETtel)
 #if defined(CONFIG_M5272) && defined(CONFIG_NETtel)
 /*
 /*
- *	Need to account for broken early mask of 5272 silicon. So don't
- *	jump through the original start address. Jump strait into the
- *	known start of the FLASH code.
+ * Need to account for broken early mask of 5272 silicon. So don't
+ * jump through the original start address. Jump strait into the
+ * known start of the FLASH code.
  */
  */
 #define HARD_RESET_NOW() ({		\
 #define HARD_RESET_NOW() ({		\
         asm("				\
         asm("				\
@@ -244,7 +255,9 @@ cmpxchg(volatile int *p, int old, int new)
         jmp 0xf0000400;			\
         jmp 0xf0000400;			\
         ");				\
         ");				\
 })
 })
-#elif defined(CONFIG_NETtel) || defined(CONFIG_eLIA) || defined(CONFIG_DISKtel) || defined(CONFIG_SECUREEDGEMP3) || defined(CONFIG_CLEOPATRA)
+#elif defined(CONFIG_NETtel) || defined(CONFIG_eLIA) || \
+      defined(CONFIG_DISKtel) || defined(CONFIG_SECUREEDGEMP3) || \
+      defined(CONFIG_CLEOPATRA)
 #define HARD_RESET_NOW() ({		\
 #define HARD_RESET_NOW() ({		\
         asm("				\
         asm("				\
 	movew #0x2700, %sr;		\
 	movew #0x2700, %sr;		\
@@ -257,6 +270,26 @@ cmpxchg(volatile int *p, int old, int new)
         jmp (%a0);			\
         jmp (%a0);			\
         ");				\
         ");				\
 })
 })
+#elif defined(CONFIG_M5272)
+/*
+ * Retrieve the boot address in flash using CSBR0 and CSOR0
+ * find the reset vector at flash_address + 4 (e.g. 0x400)
+ * remap it in the flash's current location (e.g. 0xf0000400)
+ * and jump there.
+ */ 
+#define HARD_RESET_NOW() ({		\
+	asm("				\
+	movew #0x2700, %%sr;		\
+	move.l	%0+0x40,%%d0;		\
+	and.l	%0+0x44,%%d0;		\
+	andi.l	#0xfffff000,%%d0;	\
+	mov.l	%%d0,%%a0;		\
+	or.l	4(%%a0),%%d0;		\
+	mov.l	%%d0,%%a0;		\
+	jmp (%%a0);"			\
+	: /* No output */		\
+	: "o" (*(char *)MCF_MBAR) );	\
+})
 #elif defined(CONFIG_M528x)
 #elif defined(CONFIG_M528x)
 /*
 /*
  * The MCF528x has a bit (SOFTRST) in memory (Reset Control Register RCR),
  * The MCF528x has a bit (SOFTRST) in memory (Reset Control Register RCR),
@@ -270,6 +303,15 @@ cmpxchg(volatile int *p, int old, int new)
 	while(1)				\
 	while(1)				\
 	*reset |= (0x01 << 7);\
 	*reset |= (0x01 << 7);\
 })
 })
+#elif defined(CONFIG_M523x)
+#define HARD_RESET_NOW() ({		\
+	asm("				\
+	movew #0x2700, %sr;		\
+	movel #0x01000000, %sp;		\
+	moveal #0x40110000, %a0;	\
+	moveb #0x80, (%a0);		\
+	");				\
+})
 #else
 #else
 #define HARD_RESET_NOW() ({		\
 #define HARD_RESET_NOW() ({		\
         asm("				\
         asm("				\