Commit aa8aba69 authored by Ben Dooks's avatar Ben Dooks

[ARM] S3C: Do not kmalloc/kfree during inner suspend code.

The PM CRC checking code kmallocs an area to save a set of
CRC values during suspend. This triggers a warning due to the
call of a function that might sleep whilst the system is not
in a valid state to do so.

Move the allocation and free to points in the suspend and resume
process where they can call a function that might-sleep.
Signed-off-by: default avatarBen Dooks <ben-linux@fluff.org>
parent 663a8304
...@@ -129,10 +129,12 @@ extern void s3c_pm_dbg(const char *msg, ...); ...@@ -129,10 +129,12 @@ extern void s3c_pm_dbg(const char *msg, ...);
#ifdef CONFIG_S3C2410_PM_CHECK #ifdef CONFIG_S3C2410_PM_CHECK
extern void s3c_pm_check_prepare(void); extern void s3c_pm_check_prepare(void);
extern void s3c_pm_check_restore(void); extern void s3c_pm_check_restore(void);
extern void s3c_pm_check_cleanup(void);
extern void s3c_pm_check_store(void); extern void s3c_pm_check_store(void);
#else #else
#define s3c_pm_check_prepare() do { } while(0) #define s3c_pm_check_prepare() do { } while(0)
#define s3c_pm_check_restore() 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) #define s3c_pm_check_store() do { } while(0)
#endif #endif
......
...@@ -222,9 +222,21 @@ static u32 *s3c_pm_runcheck(struct resource *res, u32 *val) ...@@ -222,9 +222,21 @@ static u32 *s3c_pm_runcheck(struct resource *res, u32 *val)
*/ */
void s3c_pm_check_restore(void) void s3c_pm_check_restore(void)
{ {
if (crcs != NULL) { if (crcs != NULL)
s3c_pm_run_sysram(s3c_pm_runcheck, crcs); 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;
}
...@@ -254,10 +254,6 @@ static int s3c_pm_enter(suspend_state_t state) ...@@ -254,10 +254,6 @@ static int s3c_pm_enter(suspend_state_t state)
return -EINVAL; return -EINVAL;
} }
/* prepare check area if configured */
s3c_pm_check_prepare();
/* store the physical address of the register recovery block */ /* store the physical address of the register recovery block */
s3c_sleep_save_phys = virt_to_phys(regs_save); s3c_sleep_save_phys = virt_to_phys(regs_save);
...@@ -329,8 +325,23 @@ static int s3c_pm_enter(suspend_state_t state) ...@@ -329,8 +325,23 @@ static int s3c_pm_enter(suspend_state_t state)
return 0; 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 struct platform_suspend_ops s3c_pm_ops = { static struct platform_suspend_ops s3c_pm_ops = {
.enter = s3c_pm_enter, .enter = s3c_pm_enter,
.prepare = s3c_pm_prepare,
.finish = s3c_pm_finish,
.valid = suspend_valid_only_mem, .valid = suspend_valid_only_mem,
}; };
......
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