Commit 2e93d1ec authored by Manuel Lauss's avatar Manuel Lauss Committed by Ralf Baechle

MIPS: Alchemy: sleepcode without compile-time cputype dependencies

Split the low-level sleepcode into per-cpu functions instead of
relying on compile-time-defined cpu type.
Signed-off-by: default avatarManuel Lauss <manuel.lauss@gmail.com>
To: Linux-MIPS <linux-mips@linux-mips.org>
Patchwork: http://patchwork.linux-mips.org/patch/1281/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent c9f84873
...@@ -193,9 +193,15 @@ static void restore_core_regs(void) ...@@ -193,9 +193,15 @@ static void restore_core_regs(void)
void au_sleep(void) void au_sleep(void)
{ {
save_core_regs(); int cpuid = alchemy_get_cputype();
au1xxx_save_and_sleep(); if (cpuid != ALCHEMY_CPU_UNKNOWN) {
restore_core_regs(); save_core_regs();
if (cpuid <= ALCHEMY_CPU_AU1500)
alchemy_sleep_au1000();
else if (cpuid <= ALCHEMY_CPU_AU1200)
alchemy_sleep_au1550();
restore_core_regs();
}
} }
#endif /* CONFIG_PM */ #endif /* CONFIG_PM */
...@@ -22,10 +22,9 @@ ...@@ -22,10 +22,9 @@
.set noat .set noat
.align 5 .align 5
/* Save all of the processor general registers and go to sleep.
* A wakeup condition will get us back here to restore the registers. /* preparatory stuff */
*/ .macro SETUP_SLEEP
LEAF(au1xxx_save_and_sleep)
subu sp, PT_SIZE subu sp, PT_SIZE
sw $1, PT_R1(sp) sw $1, PT_R1(sp)
sw $2, PT_R2(sp) sw $2, PT_R2(sp)
...@@ -69,12 +68,32 @@ LEAF(au1xxx_save_and_sleep) ...@@ -69,12 +68,32 @@ LEAF(au1xxx_save_and_sleep)
*/ */
lui t3, 0xb190 /* sys_xxx */ lui t3, 0xb190 /* sys_xxx */
sw sp, 0x0018(t3) sw sp, 0x0018(t3)
la k0, 3f /* resume path */ la k0, alchemy_sleep_wakeup /* resume path */
sw k0, 0x001c(t3) sw k0, 0x001c(t3)
.endm
/* Put SDRAM into self refresh: Preload instructions into cache, .macro DO_SLEEP
* issue a precharge, auto/self refresh, then sleep commands to it. /* put power supply and processor to sleep */
*/ sw zero, 0x0078(t3) /* sys_slppwr */
sync
sw zero, 0x007c(t3) /* sys_sleep */
sync
nop
nop
nop
nop
nop
nop
nop
nop
.endm
/* sleep code for Au1000/Au1100/Au1500 memory controller type */
LEAF(alchemy_sleep_au1000)
SETUP_SLEEP
/* cache following instructions, as memory gets put to sleep */
la t0, 1f la t0, 1f
.set mips3 .set mips3
cache 0x14, 0(t0) cache 0x14, 0(t0)
...@@ -84,17 +103,32 @@ LEAF(au1xxx_save_and_sleep) ...@@ -84,17 +103,32 @@ LEAF(au1xxx_save_and_sleep)
.set mips0 .set mips0
1: lui a0, 0xb400 /* mem_xxx */ 1: lui a0, 0xb400 /* mem_xxx */
#if defined(CONFIG_SOC_AU1000) || defined(CONFIG_SOC_AU1100) || \
defined(CONFIG_SOC_AU1500)
sw zero, 0x001c(a0) /* Precharge */ sw zero, 0x001c(a0) /* Precharge */
sync sync
sw zero, 0x0020(a0) /* Auto Refresh */ sw zero, 0x0020(a0) /* Auto Refresh */
sync sync
sw zero, 0x0030(a0) /* Sleep */ sw zero, 0x0030(a0) /* Sleep */
sync sync
#endif
#if defined(CONFIG_SOC_AU1550) || defined(CONFIG_SOC_AU1200) DO_SLEEP
END(alchemy_sleep_au1000)
/* sleep code for Au1550/Au1200 memory controller type */
LEAF(alchemy_sleep_au1550)
SETUP_SLEEP
/* cache following instructions, as memory gets put to sleep */
la t0, 1f
.set mips3
cache 0x14, 0(t0)
cache 0x14, 32(t0)
cache 0x14, 64(t0)
cache 0x14, 96(t0)
.set mips0
1: lui a0, 0xb400 /* mem_xxx */
sw zero, 0x08c0(a0) /* Precharge */ sw zero, 0x08c0(a0) /* Precharge */
sync sync
sw zero, 0x08d0(a0) /* Self Refresh */ sw zero, 0x08d0(a0) /* Self Refresh */
...@@ -114,26 +148,17 @@ LEAF(au1xxx_save_and_sleep) ...@@ -114,26 +148,17 @@ LEAF(au1xxx_save_and_sleep)
and t1, t0, t1 /* clear CE[1:0] */ and t1, t0, t1 /* clear CE[1:0] */
sw t1, 0x0840(a0) /* mem_sdconfiga */ sw t1, 0x0840(a0) /* mem_sdconfiga */
sync sync
#endif
/* put power supply and processor to sleep */ DO_SLEEP
sw zero, 0x0078(t3) /* sys_slppwr */
sync END(alchemy_sleep_au1550)
sw zero, 0x007c(t3) /* sys_sleep */
sync
nop
nop
nop
nop
nop
nop
nop
nop
/* This is where we return upon wakeup. /* This is where we return upon wakeup.
* Reload all of the registers and return. * Reload all of the registers and return.
*/ */
3: lw k0, 0x20(sp) LEAF(alchemy_sleep_wakeup)
lw k0, 0x20(sp)
mtc0 k0, CP0_STATUS mtc0 k0, CP0_STATUS
lw k0, 0x1c(sp) lw k0, 0x1c(sp)
mtc0 k0, CP0_CONTEXT mtc0 k0, CP0_CONTEXT
...@@ -169,4 +194,4 @@ LEAF(au1xxx_save_and_sleep) ...@@ -169,4 +194,4 @@ LEAF(au1xxx_save_and_sleep)
lw $31, PT_R31(sp) lw $31, PT_R31(sp)
jr ra jr ra
addiu sp, PT_SIZE addiu sp, PT_SIZE
END(au1xxx_save_and_sleep) END(alchemy_sleep_wakeup)
...@@ -188,7 +188,8 @@ extern unsigned long get_au1x00_uart_baud_base(void); ...@@ -188,7 +188,8 @@ extern unsigned long get_au1x00_uart_baud_base(void);
extern unsigned long au1xxx_calc_clock(void); extern unsigned long au1xxx_calc_clock(void);
/* PM: arch/mips/alchemy/common/sleeper.S, power.c, irq.c */ /* PM: arch/mips/alchemy/common/sleeper.S, power.c, irq.c */
void au1xxx_save_and_sleep(void); void alchemy_sleep_au1000(void);
void alchemy_sleep_au1550(void);
void au_sleep(void); void au_sleep(void);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment