[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>
This commit is contained in:
parent
9f5757476d
commit
9c2aba4852
1 changed files with 48 additions and 6 deletions
|
@ -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
|
* Need to account for broken early mask of 5272 silicon. So don't
|
||||||
* jump through the original start address. Jump strait into the
|
* jump through the original start address. Jump strait into the
|
||||||
* known start of the FLASH code.
|
* 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(" \
|
||||||
|
|
Loading…
Add table
Reference in a new issue