Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 137506
b: refs/heads/master
c: 6419711
h: refs/heads/master
v: v3
  • Loading branch information
Ben Dooks committed Mar 8, 2009
1 parent 1afb0a5 commit d69a683
Show file tree
Hide file tree
Showing 10 changed files with 172 additions and 111 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: a3f66351b3cc89011e8a34068c245b413ce696d6
refs/heads/master: 6419711a164ba1304fa8fbb75ae9485455e04dcd
11 changes: 2 additions & 9 deletions trunk/arch/arm/mach-s3c2410/pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,21 +37,14 @@
#include <plat/cpu.h>
#include <plat/pm.h>

#ifdef CONFIG_S3C2410_PM_DEBUG
extern void pm_dbg(const char *fmt, ...);
#define DBG(fmt...) pm_dbg(fmt)
#else
#define DBG(fmt...) printk(KERN_DEBUG fmt)
#endif

static void s3c2410_pm_prepare(void)
{
/* ensure at least GSTATUS3 has the resume address */

__raw_writel(virt_to_phys(s3c2410_cpu_resume), S3C2410_GSTATUS3);

DBG("GSTATUS3 0x%08x\n", __raw_readl(S3C2410_GSTATUS3));
DBG("GSTATUS4 0x%08x\n", __raw_readl(S3C2410_GSTATUS4));
S3C_PMDBG("GSTATUS3 0x%08x\n", __raw_readl(S3C2410_GSTATUS3));
S3C_PMDBG("GSTATUS4 0x%08x\n", __raw_readl(S3C2410_GSTATUS4));

if (machine_is_h1940()) {
void *base = phys_to_virt(H1940_SUSPEND_CHECK);
Expand Down
4 changes: 2 additions & 2 deletions trunk/arch/arm/mach-s3c2412/pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ static struct sleep_save s3c2412_sleep[] = {

static int s3c2412_pm_suspend(struct sys_device *dev, pm_message_t state)
{
s3c2410_pm_do_save(s3c2412_sleep, ARRAY_SIZE(s3c2412_sleep));
s3c_pm_do_save(s3c2412_sleep, ARRAY_SIZE(s3c2412_sleep));
return 0;
}

Expand All @@ -98,7 +98,7 @@ static int s3c2412_pm_resume(struct sys_device *dev)
tmp |= S3C2412_PWRCFG_STANDBYWFI_IDLE;
__raw_writel(tmp, S3C2412_PWRCFG);

s3c2410_pm_do_restore(s3c2412_sleep, ARRAY_SIZE(s3c2412_sleep));
s3c_pm_do_restore(s3c2412_sleep, ARRAY_SIZE(s3c2412_sleep));
return 0;
}

Expand Down
4 changes: 4 additions & 0 deletions trunk/arch/arm/plat-s3c/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ obj-y += pwm-clock.o
obj-y += gpio.o
obj-y += gpio-config.o

# PM support

obj-$(CONFIG_PM) += pm.o

# devices

obj-$(CONFIG_S3C_DEV_HSMMC) += dev-hsmmc.o
Expand Down
36 changes: 33 additions & 3 deletions trunk/arch/arm/plat-s3c/include/plat/pm.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/* linux/include/asm-arm/plat-s3c24xx/pm.h
*
* Copyright (c) 2004 Simtec Electronics
* http://armlinux.simtec.co.uk/
* Written by Ben Dooks, <ben@simtec.co.uk>
*
* This program is free software; you can redistribute it and/or modify
Expand Down Expand Up @@ -49,10 +50,18 @@ extern int s3c2410_cpu_save(unsigned long *saveblk);
extern void s3c2410_cpu_suspend(void);
extern void s3c2410_cpu_resume(void);

extern unsigned long s3c2410_sleep_save_phys;
extern unsigned long s3c_sleep_save_phys;

/* sleep save info */

/**
* struct sleep_save - save information for shared peripherals.
* @reg: Pointer to the register to save.
* @val: Holder for the value saved from reg.
*
* This describes a list of registers which is used by the pm core and
* other subsystem to save and restore register values over suspend.
*/
struct sleep_save {
void __iomem *reg;
unsigned long val;
Expand All @@ -61,8 +70,11 @@ struct sleep_save {
#define SAVE_ITEM(x) \
{ .reg = (x) }

extern void s3c2410_pm_do_save(struct sleep_save *ptr, int count);
extern void s3c2410_pm_do_restore(struct sleep_save *ptr, int count);
/* helper functions to save/restore lists of registers. */

extern void s3c_pm_do_save(struct sleep_save *ptr, int count);
extern void s3c_pm_do_restore(struct sleep_save *ptr, int count);
extern void s3c_pm_do_restore_core(struct sleep_save *ptr, int count);

#ifdef CONFIG_PM
extern int s3c24xx_irq_suspend(struct sys_device *dev, pm_message_t state);
Expand All @@ -71,3 +83,21 @@ extern int s3c24xx_irq_resume(struct sys_device *dev);
#define s3c24xx_irq_suspend NULL
#define s3c24xx_irq_resume NULL
#endif

/* PM debug functions */

#ifdef CONFIG_S3C2410_PM_DEBUG
/**
* s3c_pm_dbg() - low level debug function for use in suspend/resume.
* @msg: The message to print.
*
* This function is used mainly to debug the resume process before the system
* can rely on printk/console output. It uses the low-level debugging output
* routine printascii() to do its work.
*/
extern void s3c_pm_dbg(const char *msg, ...);

#define S3C_PMDBG(fmt...) s3c_pm_dbg(fmt)
#else
#define S3C_PMDBG(fmt...) printk(KERN_DEBUG fmt)
#endif
97 changes: 97 additions & 0 deletions trunk/arch/arm/plat-s3c/pm.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
/* linux/arch/arm/plat-s3c/pm.c
*
* Copyright 2008 Openmoko, Inc.
* Copyright 2004,2006,2008 Simtec Electronics
* Ben Dooks <ben@simtec.co.uk>
* http://armlinux.simtec.co.uk/
*
* S3C common power management (suspend to ram) support.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/

#include <linux/init.h>
#include <linux/suspend.h>
#include <linux/errno.h>
#include <linux/io.h>

#include <plat/pm.h>

/* for external use */

unsigned long s3c_pm_flags;

#ifdef CONFIG_S3C2410_PM_DEBUG
extern void printascii(const char *);

void s3c_pm_dbg(const char *fmt, ...)
{
va_list va;
char buff[256];

va_start(va, fmt);
vsprintf(buff, fmt, va);
va_end(va);

printascii(buff);
}
#endif /* CONFIG_S3C2410_PM_DEBUG */


/* helper functions to save and restore register state */

/**
* s3c_pm_do_save() - save a set of registers for restoration on resume.
* @ptr: Pointer to an array of registers.
* @count: Size of the ptr array.
*
* Run through the list of registers given, saving their contents in the
* array for later restoration when we wakeup.
*/
void s3c_pm_do_save(struct sleep_save *ptr, int count)
{
for (; count > 0; count--, ptr++) {
ptr->val = __raw_readl(ptr->reg);
S3C_PMDBG("saved %p value %08lx\n", ptr->reg, ptr->val);
}
}

/**
* s3c_pm_do_restore() - restore register values from the save list.
* @ptr: Pointer to an array of registers.
* @count: Size of the ptr array.
*
* Restore the register values saved from s3c_pm_do_save().
*
* Note, we do not use S3C_PMDBG() in here, as the system may not have
* restore the UARTs state yet
*/

void s3c_pm_do_restore(struct sleep_save *ptr, int count)
{
for (; count > 0; count--, ptr++) {
printk(KERN_DEBUG "restore %p (restore %08lx, was %08x)\n",
ptr->reg, ptr->val, __raw_readl(ptr->reg));

__raw_writel(ptr->val, ptr->reg);
}
}

/**
* s3c_pm_do_restore_core() - early restore register values from save list.
*
* This is similar to s3c_pm_do_restore() except we try and minimise the
* side effects of the function in case registers that hardware might need
* to work has been restored.
*
* WARNING: Do not put any debug in here that may effect memory or use
* peripherals, as things may be changing!
*/

void s3c_pm_do_restore_core(struct sleep_save *ptr, int count)
{
for (; count > 0; count--, ptr++)
__raw_writel(ptr->val, ptr->reg);
}
4 changes: 2 additions & 2 deletions trunk/arch/arm/plat-s3c24xx/irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -616,7 +616,7 @@ int s3c24xx_irq_suspend(struct sys_device *dev, pm_message_t state)
for (i = 0; i < ARRAY_SIZE(save_eintflt); i++)
save_eintflt[i] = __raw_readl(S3C24XX_EINFLT0 + (i*4));

s3c2410_pm_do_save(irq_save, ARRAY_SIZE(irq_save));
s3c_pm_do_save(irq_save, ARRAY_SIZE(irq_save));
save_eintmask = __raw_readl(S3C24XX_EINTMASK);

return 0;
Expand All @@ -632,7 +632,7 @@ int s3c24xx_irq_resume(struct sys_device *dev)
for (i = 0; i < ARRAY_SIZE(save_eintflt); i++)
__raw_writel(save_eintflt[i], S3C24XX_EINFLT0 + (i*4));

s3c2410_pm_do_restore(irq_save, ARRAY_SIZE(irq_save));
s3c_pm_do_restore(irq_save, ARRAY_SIZE(irq_save));
__raw_writel(save_eintmask, S3C24XX_EINTMASK);

return 0;
Expand Down
Loading

0 comments on commit d69a683

Please sign in to comment.