#include <asm/arch/sys_proto.h>
#include "sleep.h"
-extern int s5pc110_cpu_save(unsigned long *saveblk);
-extern void s5pc110_cpu_resume(void);
-extern unsigned int s5pc110_sleep_return_addr;
-extern unsigned int s5pc110_sleep_save_phys;
-
struct stack {
u32 irq[3];
u32 abt[3];
unsigned int start_address;
unsigned int size;
};
+
static struct regs_to_save core_save[] = {
- { .start_address=0xE0100200, .size=7},
- { .start_address=0xE0100280, .size=2},
- { .start_address=0xE0100300, .size=8},
- { .start_address=0xE0100460, .size=5},
- { .start_address=0xE0100480, .size=3},
- { .start_address=0xE0100500, .size=1},
- { .start_address=0xE0107008, .size=1},
+ { .start_address = 0xE0100200, .size = 7 },
+ { .start_address = 0xE0100280, .size = 2 },
+ { .start_address = 0xE0100300, .size = 8 },
+ { .start_address = 0xE0100460, .size = 5 },
+ { .start_address = 0xE0100480, .size = 3 },
+ { .start_address = 0xE0100500, .size = 1 },
+ { .start_address = 0xE0107008, .size = 1 },
};
-static unsigned int buf_core_save[7+2+8+5+3+1+1];
+
+static unsigned int buf_core_save[7 + 2 + 8 + 5 + 3 + 1 + 1];
+
static struct regs_to_save gpio_save[] = {
- { .start_address=0xE0200000, .size=6},
- { .start_address=0xE0200020, .size=6},
- { .start_address=0xE0200040, .size=6},
- { .start_address=0xE0200060, .size=6},
- { .start_address=0xE0200080, .size=6},
- { .start_address=0xE02000A0, .size=6},
- { .start_address=0xE02000C0, .size=6},
- { .start_address=0xE02000E0, .size=6},
- { .start_address=0xE0200100, .size=6},
- { .start_address=0xE0200120, .size=6},
- { .start_address=0xE0200140, .size=6},
- { .start_address=0xE0200160, .size=6},
- { .start_address=0xE0200180, .size=6},
- { .start_address=0xE02001A0, .size=6},
- { .start_address=0xE02001C0, .size=6},
- { .start_address=0xE02001E0, .size=6},
- { .start_address=0xE0200200, .size=6},
- { .start_address=0xE0200220, .size=6},
- { .start_address=0xE0200240, .size=6},
- { .start_address=0xE0200260, .size=6},
- { .start_address=0xE0200280, .size=6},
- { .start_address=0xE02002A0, .size=6},
- { .start_address=0xE02002C0, .size=6},
- { .start_address=0xE02002E0, .size=6},
- { .start_address=0xE0200300, .size=6},
- { .start_address=0xE0200320, .size=6},
- { .start_address=0xE0200340, .size=6},
- { .start_address=0xE0200360, .size=6},
- { .start_address=0xE0200380, .size=6},
- { .start_address=0xE02003A0, .size=6},
- { .start_address=0xE02003C0, .size=6},
- { .start_address=0xE02003E0, .size=6},
- { .start_address=0xE0200400, .size=6},
- { .start_address=0xE0200420, .size=6},
- { .start_address=0xE0200440, .size=6},
- { .start_address=0xE0200460, .size=6},
- { .start_address=0xE0200480, .size=6},
- { .start_address=0xE02004A0, .size=6},
- { .start_address=0xE02004C0, .size=6},
- { .start_address=0xE02004E0, .size=6},
- { .start_address=0xE0200500, .size=6},
- { .start_address=0xE0200520, .size=6},
- { .start_address=0xE0200540, .size=6},
- { .start_address=0xE0200560, .size=6},
- { .start_address=0xE0200580, .size=6},
- { .start_address=0xE02005A0, .size=6},
- { .start_address=0xE02005C0, .size=6},
- { .start_address=0xE02005E0, .size=6},
- { .start_address=0xE0200700, .size=22},
- { .start_address=0xE0200900, .size=22},
- { .start_address=0xE0200A00, .size=22},
+ { .start_address = 0xE0200000, .size = 6 },
+ { .start_address = 0xE0200020, .size = 6 },
+ { .start_address = 0xE0200040, .size = 6 },
+ { .start_address = 0xE0200060, .size = 6 },
+ { .start_address = 0xE0200080, .size = 6 },
+ { .start_address = 0xE02000A0, .size = 6 },
+ { .start_address = 0xE02000C0, .size = 6 },
+ { .start_address = 0xE02000E0, .size = 6 },
+ { .start_address = 0xE0200100, .size = 6 },
+ { .start_address = 0xE0200120, .size = 6 },
+ { .start_address = 0xE0200140, .size = 6 },
+ { .start_address = 0xE0200160, .size = 6 },
+ { .start_address = 0xE0200180, .size = 6 },
+ { .start_address = 0xE02001A0, .size = 6 },
+ { .start_address = 0xE02001C0, .size = 6 },
+ { .start_address = 0xE02001E0, .size = 6 },
+ { .start_address = 0xE0200200, .size = 6 },
+ { .start_address = 0xE0200220, .size = 6 },
+ { .start_address = 0xE0200240, .size = 6 },
+ { .start_address = 0xE0200260, .size = 6 },
+ { .start_address = 0xE0200280, .size = 6 },
+ { .start_address = 0xE02002A0, .size = 6 },
+ { .start_address = 0xE02002C0, .size = 6 },
+ { .start_address = 0xE02002E0, .size = 6 },
+ { .start_address = 0xE0200300, .size = 6 },
+ { .start_address = 0xE0200320, .size = 6 },
+ { .start_address = 0xE0200340, .size = 6 },
+ { .start_address = 0xE0200360, .size = 6 },
+ { .start_address = 0xE0200380, .size = 6 },
+ { .start_address = 0xE02003A0, .size = 6 },
+ { .start_address = 0xE02003C0, .size = 6 },
+ { .start_address = 0xE02003E0, .size = 6 },
+ { .start_address = 0xE0200400, .size = 6 },
+ { .start_address = 0xE0200420, .size = 6 },
+ { .start_address = 0xE0200440, .size = 6 },
+ { .start_address = 0xE0200460, .size = 6 },
+ { .start_address = 0xE0200480, .size = 6 },
+ { .start_address = 0xE02004A0, .size = 6 },
+ { .start_address = 0xE02004C0, .size = 6 },
+ { .start_address = 0xE02004E0, .size = 6 },
+ { .start_address = 0xE0200500, .size = 6 },
+ { .start_address = 0xE0200520, .size = 6 },
+ { .start_address = 0xE0200540, .size = 6 },
+ { .start_address = 0xE0200560, .size = 6 },
+ { .start_address = 0xE0200580, .size = 6 },
+ { .start_address = 0xE02005A0, .size = 6 },
+ { .start_address = 0xE02005C0, .size = 6 },
+ { .start_address = 0xE02005E0, .size = 6 },
+ { .start_address = 0xE0200700, .size = 22 },
+ { .start_address = 0xE0200900, .size = 22 },
+ { .start_address = 0xE0200A00, .size = 22 },
};
-static unsigned int buf_gpio_save[ 6*8*6 + 22*3 ];
+
+static unsigned int buf_gpio_save[6 * 8 * 6 + 22 * 3];
+
static struct regs_to_save irq_save[] = {
- { .start_address=0xF200000C, .size=2},
- { .start_address=0xF2000018, .size=1},
- { .start_address=0xF210000C, .size=2},
- { .start_address=0xF2100018, .size=1},
- { .start_address=0xF220000C, .size=2},
- { .start_address=0xF2200018, .size=1},
- { .start_address=0xF230000C, .size=2},
- { .start_address=0xF2300018, .size=1},
+ { .start_address = 0xF200000C, .size = 2 },
+ { .start_address = 0xF2000018, .size = 1 },
+ { .start_address = 0xF210000C, .size = 2 },
+ { .start_address = 0xF2100018, .size = 1 },
+ { .start_address = 0xF220000C, .size = 2 },
+ { .start_address = 0xF2200018, .size = 1 },
+ { .start_address = 0xF230000C, .size = 2 },
+ { .start_address = 0xF2300018, .size = 1 },
};
-static unsigned int buf_irq_save[ (2+1)*4 ];
+
+static unsigned int buf_irq_save[(2 + 1) * 4];
+
static struct regs_to_save sromc_save[] = {
- { .start_address=0xE8000000, .size=7},
+ { .start_address = 0xE8000000, .size = 7 },
};
+
static unsigned int buf_sromc_save[7];
+
static struct regs_to_save uart_save[] = {
- { .start_address=0xE2900000, .size=4},
- { .start_address=0xE2900028, .size=2},
- { .start_address=0xE2900038, .size=1},
- { .start_address=0xE2900400, .size=4},
- { .start_address=0xE2900428, .size=2},
- { .start_address=0xE2900438, .size=1},
- { .start_address=0xE2900800, .size=4},
- { .start_address=0xE2900828, .size=2},
- { .start_address=0xE2900838, .size=1},
- { .start_address=0xE2900C00, .size=4},
- { .start_address=0xE2900C28, .size=2},
- { .start_address=0xE2900C38, .size=1},
+ { .start_address = 0xE2900000, .size = 4 },
+ { .start_address = 0xE2900028, .size = 2 },
+ { .start_address = 0xE2900038, .size = 1 },
+ { .start_address = 0xE2900400, .size = 4 },
+ { .start_address = 0xE2900428, .size = 2 },
+ { .start_address = 0xE2900438, .size = 1 },
+ { .start_address = 0xE2900800, .size = 4 },
+ { .start_address = 0xE2900828, .size = 2 },
+ { .start_address = 0xE2900838, .size = 1 },
+ { .start_address = 0xE2900C00, .size = 4 },
+ { .start_address = 0xE2900C28, .size = 2 },
+ { .start_address = 0xE2900C38, .size = 1 },
};
-static unsigned int buf_uart_save[(4+2+1)*4];
+static unsigned int buf_uart_save[(4 + 2 + 1) * 4];
static unsigned int reg_others;
-void s5pc110_save_reg(struct regs_to_save * list, unsigned int * buf, int length)
+void s5pc110_save_reg(struct regs_to_save *list,
+ unsigned int *buf, int length)
{
int i;
+ int j;
int counter = 0;
- for (i=0; i<length; i++) {
- int j;
- for (j=0; j<list[i].size; j++) {
- (*buf) = readl((unsigned int *)(list[i].start_address+j*4));
+
+ for (i = 0; i < length; i++) {
+ for (j = 0; j < list[i].size; j++) {
+ *buf = readl((unsigned int *)
+ (list[i].start_address+j * 4));
buf++;
counter++;
}
}
}
+
void s5pc110_save_regs(void)
{
reg_others = readl(S5PC110_OTHERS);
s5pc110_save_reg(sromc_save, buf_sromc_save, ARRAY_SIZE(sromc_save));
s5pc110_save_reg(uart_save, buf_uart_save, ARRAY_SIZE(uart_save));
}
-void s5pc110_restore_reg(struct regs_to_save * list, unsigned int * buf, int length)
+
+void s5pc110_restore_reg(struct regs_to_save *list,
+ unsigned int *buf, int length)
{
int i;
+ int j;
+
+ for (i = 0; i < length; i++) {
+ for (j = 0; j < list[i].size; j++) {
+ writel(*buf, (unsigned int *)
+ (list[i].start_address+j * 4));
- for (i=0; i<length; i++) {
- int j;
- for (j=0; j<list[i].size; j++) {
- writel(*buf, (unsigned int *)(list[i].start_address+j*4));
if (s5pc1xx_get_cpu_rev() == 0) {
unsigned int tmp;
tmp = readl((unsigned int *)
- (list[i].start_address+j*4));
+ (list[i].start_address+j * 4));
}
+
buf++;
}
}
}
+
void s5pc110_restore_regs(void)
{
s5pc110_restore_reg(uart_save, buf_uart_save, ARRAY_SIZE(uart_save));
"I" (PSR_F_BIT | PSR_I_BIT | SVC_MODE)
: "r14");
-
s5pc110_restore_regs();
- reg_others |= 1<<28;
+ reg_others |= (1 << 28);
writel(reg_others, S5PC110_OTHERS);
printf("%s: Waking up...\n", __func__);
timer_init();
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
- i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); /* init_func_i2c */
+ /* init_func_i2c */
+ i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
#endif
#if defined(CONFIG_CMD_ONENAND)
onenand_init();
-#endif
+#endif
#ifdef CONFIG_SERIAL_MULTI
serial_initialize();
#endif
- stdio_init_resume (); /* get the devices list going. */
+ stdio_init_resume(); /* get the devices list going. */
return;
}
if (s5pc1xx_get_cpu_rev() == 0) {
value = readl(S5PC110_EINT_WAKEUP_MASK);
for (i = 0; i < 4; i++)
- value = readl(0xE0200F40+i*4);
+ value = readl(0xE0200F40 + i * 4);
}
s5pc110_save_regs();
writel(value, S5PC110_OTHERS);
/* cache flush */
- asm ("mcr p15, 0, %0, c7, c5, 0": :"r" (0));
+ asm ("mcr p15, 0, %0, c7, c5, 0": :"r" (0));
l2_cache_disable();
invalidate_dcache(get_device_type());
if (s5pc110_cpu_save(regs_save) == 0) {
/* cache flush */
- asm ("mcr p15, 0, %0, c7, c5, 0": :"r" (0));
+ asm ("mcr p15, 0, %0, c7, c5, 0": :"r" (0));
l2_cache_disable();
invalidate_dcache(get_device_type());
value |= S5PC110_CFG_STANDBYWFI_SLEEP;
writel(value, S5PC110_PWR_CFG);
- asm("b 1f\n\t"
- ".align 5\n\t"
- "1:\n\t"
- "mcr p15, 0, %0, c7, c10, 5\n\t"
- "mcr p15, 0, %0, c7, c10, 4\n\t"
- ".word 0xe320f003" :: "r" (value));
+ asm ("b 1f\n\t"
+ ".align 5\n\t"
+ "1:\n\t"
+ "mcr p15, 0, %0, c7, c10, 5\n\t"
+ "mcr p15, 0, %0, c7, c10, 4\n\t"
+ ".word 0xe320f003" :: "r" (value));
} else { /* SLEEP_REGISTER */
value = (1 << 2);
writel(value, S5PC110_PWR_MODE);
- while(1);
+
+ while (1)
+ ;
}
}
writel(0, S5PC110_EINT_WAKEUP_MASK);
readl(S5PC110_EINT_WAKEUP_MASK);
+
for (i = 0; i < 4; i++)
- readl(0xE0200F40+i*4);
+ readl(0xE0200F40 + i * 4);
+
value = readl(S5PC110_WAKEUP_STAT);
writel(0xFFFF & value, S5PC110_WAKEUP_STAT);
U_BOOT_CMD(
sleep, CONFIG_SYS_MAXARGS, 1, do_sleep,
"S5PC110 sleep",
- "[sleep mode]\n# sleep: Sleep with SLEEP_WFI mode\n# sleep 1: Sleep with SLEEP_REGISTER mode\n"
+ "- Sleep with SLEEP_WFI mode\n"
+ "sleep 1 - Sleep with SLEEP_REGISTER mode\n"
);
-