diff options
author | merge <null@invalid> | 2008-12-12 11:56:13 +0000 |
---|---|---|
committer | Andy Green <agreen@pads.home.warmcat.com> | 2008-12-12 11:56:13 +0000 |
commit | a78452203a2a1a852ed9d7b4be5ccf5dd72b5777 (patch) | |
tree | 68cfc4c19627020468dcaef852062598748fcb04 /arch/arm/plat-s3c | |
parent | de473ca893c9285ab2dd3ea82973e6f253eaec1d (diff) |
MERGE-via-pending-tracking-hist-MERGE-via-stable-tracking-MERGE-via-mokopatches-tracking-MERGE-via-master-MERGE-via-master-hist-1229078937-1229079488-1229082516-1229082771
pending-tracking-hist top was MERGE-via-stable-tracking-MERGE-via-mokopatches-tracking-MERGE-via-master-MERGE-via-master-hist-1229078937-1229079488-1229082516-1229082771 / f410ecd0cc4642ae8b0f69c15fe349ea5639f5e2 ... parent commitmessage:
From: merge <null@invalid>
MERGE-via-stable-tracking-hist-MERGE-via-mokopatches-tracking-MERGE-via-master-MERGE-via-master-hist-1229078937-1229079488-1229082516
stable-tracking-hist top was MERGE-via-mokopatches-tracking-MERGE-via-master-MERGE-via-master-hist-1229078937-1229079488-1229082516 / 18f9a76ecc30ba8eee5de0627de3e7eb049775c3 ... parent commitmessage:
From: merge <null@invalid>
MERGE-via-mokopatches-tracking-hist-MERGE-via-master-MERGE-via-master-hist-1229078937-1229079488
mokopatches-tracking-hist top was MERGE-via-master-MERGE-via-master-hist-1229078937-1229079488 / 7eb66508f95eeebbd7ad3487c5183b76524d4765 ... parent commitmessage:
From: merge <null@invalid>
MERGE-via-master-MERGE-via-master-hist-1229078937
master top was MERGE-via-master-hist-1229078937 / ff0b5902f29135a782a3bfb68e3429b86669aea4 ... parent commitmessage:
From: merge <null@invalid>
MERGE-master-patchset-edits
Diffstat (limited to 'arch/arm/plat-s3c')
-rw-r--r-- | arch/arm/plat-s3c/include/plat/pm.h | 3 | ||||
-rw-r--r-- | arch/arm/plat-s3c/pm-check.c | 34 | ||||
-rw-r--r-- | arch/arm/plat-s3c/pm-gpio.c | 4 | ||||
-rw-r--r-- | arch/arm/plat-s3c/pm.c | 25 |
4 files changed, 50 insertions, 16 deletions
diff --git a/arch/arm/plat-s3c/include/plat/pm.h b/arch/arm/plat-s3c/include/plat/pm.h index 9b9a88592ee..6694107db90 100644 --- a/arch/arm/plat-s3c/include/plat/pm.h +++ b/arch/arm/plat-s3c/include/plat/pm.h @@ -146,10 +146,12 @@ static inline void s3c_pm_debug_smdkled(u32 set, u32 clear) { } #ifdef CONFIG_S3C2410_PM_CHECK extern void s3c_pm_check_prepare(void); extern void s3c_pm_check_restore(void); +extern void s3c_pm_check_cleanup(void); extern void s3c_pm_check_store(void); #else #define s3c_pm_check_prepare() do { } while(0) #define s3c_pm_check_restore() do { } while(0) +#define s3c_pm_check_cleanup() do { } while(0) #define s3c_pm_check_store() do { } while(0) #endif @@ -179,3 +181,4 @@ extern void s3c_pm_save_gpios(void); extern void s3c_pm_save_core(void); extern void s3c_pm_restore_core(void); + diff --git a/arch/arm/plat-s3c/pm-check.c b/arch/arm/plat-s3c/pm-check.c index 7f21bef09c3..39f2555564d 100644 --- a/arch/arm/plat-s3c/pm-check.c +++ b/arch/arm/plat-s3c/pm-check.c @@ -43,7 +43,7 @@ typedef u32 *(run_fn_t)(struct resource *ptr, u32 *arg); /* s3c_pm_run_res * - * go thorugh the given resource list, and look for system ram + * go through the given resource list, and look for system ram */ static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg) @@ -136,7 +136,7 @@ void s3c_pm_check_store(void) /* in_region * - * return TRUE if the area defined by ptr..ptr+size contatins the + * return TRUE if the area defined by ptr..ptr+size contains the * what..what+whatsz */ @@ -152,7 +152,7 @@ static inline int in_region(void *ptr, int size, void *what, size_t whatsz) } /** - * s3c_pm_runcheck*() - helper to check a resource on restore. + * s3c_pm_runcheck() - helper to check a resource on restore. * @res: The resource to check * @vak: Pointer to list of CRC32 values to check. * @@ -166,9 +166,12 @@ static u32 *s3c_pm_runcheck(struct resource *res, u32 *val) void *save_at = phys_to_virt(s3c_sleep_save_phys); unsigned long addr; unsigned long left; + void *stkpage; void *ptr; u32 calc; + stkpage = (void *)((u32)&calc & ~PAGE_MASK); + for (addr = res->start; addr < res->end; addr += CHECK_CHUNKSIZE) { left = res->end - addr; @@ -178,6 +181,11 @@ static u32 *s3c_pm_runcheck(struct resource *res, u32 *val) ptr = phys_to_virt(addr); + if (in_region(ptr, left, stkpage, 4096)) { + S3C_PMDBG("skipping %08lx, has stack in\n", addr); + goto skip_check; + } + if (in_region(ptr, left, crcs, crc_size)) { S3C_PMDBG("skipping %08lx, has crc block in\n", addr); goto skip_check; @@ -214,9 +222,21 @@ static u32 *s3c_pm_runcheck(struct resource *res, u32 *val) */ void s3c_pm_check_restore(void) { - if (crcs != NULL) { + if (crcs != NULL) s3c_pm_run_sysram(s3c_pm_runcheck, crcs); - kfree(crcs); - crcs = NULL; - } } + +/** + * s3c_pm_check_cleanup() - free memory resources + * + * Free the resources that where allocated by the suspend + * memory check code. We do this separately from the + * s3c_pm_check_restore() function as we cannot call any + * functions that might sleep during that resume. + */ +void s3c_pm_check_cleanup(void) +{ + kfree(crcs); + crcs = NULL; +} + diff --git a/arch/arm/plat-s3c/pm-gpio.c b/arch/arm/plat-s3c/pm-gpio.c index 6b5d6ec1dd7..b58d000d8b3 100644 --- a/arch/arm/plat-s3c/pm-gpio.c +++ b/arch/arm/plat-s3c/pm-gpio.c @@ -260,7 +260,7 @@ static void s3c_gpio_pm_4bit_resume(struct s3c_gpio_chip *chip) void __iomem *base = chip->base; u32 old_gpcon[2]; u32 old_gpdat = __raw_readl(base + OFFS_DAT); - u32 gps_gpdat = chip->pm_save[1]; + u32 gps_gpdat = chip->pm_save[2]; /* First, modify the CON settings */ @@ -284,7 +284,7 @@ static void s3c_gpio_pm_4bit_resume(struct s3c_gpio_chip *chip) __raw_writel(chip->pm_save[3], base + OFFS_UP); if (chip->chip.ngpio > 8) { - S3C_PMDBG("%s: CON4 %08x => %08x, DAT %08x => %08x\n", + S3C_PMDBG("%s: CON4 %08x,%08x => %08x,%08x, DAT %08x => %08x\n", chip->chip.label, old_gpcon[0], old_gpcon[1], __raw_readl(base - 4), __raw_readl(base + OFFS_CON), diff --git a/arch/arm/plat-s3c/pm.c b/arch/arm/plat-s3c/pm.c index 3091837d177..422dea207b0 100644 --- a/arch/arm/plat-s3c/pm.c +++ b/arch/arm/plat-s3c/pm.c @@ -197,7 +197,7 @@ void s3c_pm_do_restore(struct sleep_save *ptr, int count) /** * s3c_pm_do_restore_core() - early restore register values from save list. * - * This is simialr to s3c_pm_do_restore() except we try and minimise the + * 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. * @@ -267,10 +267,6 @@ static int s3c_pm_enter(suspend_state_t state) return -EINVAL; } - /* prepare check area if configured */ - - s3c_pm_check_prepare(); - /* store the physical address of the register recovery block */ s3c_sleep_save_phys = virt_to_phys(regs_save); @@ -333,17 +329,30 @@ static int s3c_pm_enter(suspend_state_t state) S3C_PMDBG("%s: post sleep, preparing to return\n", __func__); + s3c_pm_check_restore(); + /* LEDs should now be 1110 */ s3c_pm_debug_smdkled(1 << 1, 0); - s3c_pm_check_restore(); - /* ok, let's return from sleep */ S3C_PMDBG("S3C PM Resume (post-restore)\n"); return 0; } +static int s3c_pm_prepare(void) +{ + /* prepare check area if configured */ + + s3c_pm_check_prepare(); + return 0; +} + +static void s3c_pm_finish(void) +{ + s3c_pm_check_cleanup(); +} + static int s3c_pm_begin(suspend_state_t state) { int ret = 0; @@ -356,6 +365,8 @@ static int s3c_pm_begin(suspend_state_t state) static struct platform_suspend_ops s3c_pm_ops = { .enter = s3c_pm_enter, + .prepare = s3c_pm_prepare, + .finish = s3c_pm_finish, .valid = suspend_valid_only_mem, .begin = s3c_pm_begin, }; |