Skip to content

Commit

Permalink
[ARM] S3C: Move PM support functions to common location
Browse files Browse the repository at this point in the history
Start moving the PM code by moving all the common support functions
to a common location in arch/arm/plat-s3c. With the move we rename
the functions from s3cxxx_ to s3c_ to fit the new location.

Signed-off-by: Ben Dooks <ben-linux@fluff.org>
  • Loading branch information
Ben Dooks committed Mar 8, 2009
1 parent a3f6635 commit 6419711
Show file tree
Hide file tree
Showing 9 changed files with 171 additions and 110 deletions.
11 changes: 2 additions & 9 deletions 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 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 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 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 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 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 6419711

Please sign in to comment.