From cafc99562f51557e32d0cbb08bbdeb3e93a1a989 Mon Sep 17 00:00:00 2001 From: Luca Tettamanti Date: Thu, 23 Mar 2006 03:00:09 -0800 Subject: [PATCH] --- yaml --- r: 23025 b: refs/heads/master c: 9b238205ba5d79a8a242d7a5ddb82b89e4dc4e48 h: refs/heads/master i: 23023: a946e18c1510b2ca6836eef5675da898e18de766 v: v3 --- [refs] | 2 +- trunk/kernel/power/main.c | 2 +- trunk/kernel/power/power.h | 4 +++- trunk/kernel/power/user.c | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 7d1bd4da8d08..08b8c8c25d50 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 94c188d32996beac00426740974310e32f162c14 +refs/heads/master: 9b238205ba5d79a8a242d7a5ddb82b89e4dc4e48 diff --git a/trunk/kernel/power/main.c b/trunk/kernel/power/main.c index 9cb235cba4a9..ee371f50ccaa 100644 --- a/trunk/kernel/power/main.c +++ b/trunk/kernel/power/main.c @@ -103,7 +103,7 @@ static int suspend_prepare(suspend_state_t state) } -static int suspend_enter(suspend_state_t state) +int suspend_enter(suspend_state_t state) { int error = 0; unsigned long flags; diff --git a/trunk/kernel/power/power.h b/trunk/kernel/power/power.h index 42c431c8bdde..f06f12f21767 100644 --- a/trunk/kernel/power/power.h +++ b/trunk/kernel/power/power.h @@ -77,7 +77,8 @@ int snapshot_image_loaded(struct snapshot_handle *handle); #define SNAPSHOT_GET_SWAP_PAGE _IOR(SNAPSHOT_IOC_MAGIC, 8, void *) #define SNAPSHOT_FREE_SWAP_PAGES _IO(SNAPSHOT_IOC_MAGIC, 9) #define SNAPSHOT_SET_SWAP_FILE _IOW(SNAPSHOT_IOC_MAGIC, 10, unsigned int) -#define SNAPSHOT_IOC_MAXNR 10 +#define SNAPSHOT_S2RAM _IO(SNAPSHOT_IOC_MAGIC, 11) +#define SNAPSHOT_IOC_MAXNR 11 /** * The bitmap is used for tracing allocated swap pages @@ -112,3 +113,4 @@ extern int swsusp_resume(void); extern int swsusp_read(void); extern int swsusp_write(void); extern void swsusp_close(void); +extern int suspend_enter(suspend_state_t state); diff --git a/trunk/kernel/power/user.c b/trunk/kernel/power/user.c index bbd4842104aa..3f1539fbe48a 100644 --- a/trunk/kernel/power/user.c +++ b/trunk/kernel/power/user.c @@ -266,6 +266,42 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp, } break; + case SNAPSHOT_S2RAM: + if (!data->frozen) { + error = -EPERM; + break; + } + + if (down_trylock(&pm_sem)) { + error = -EBUSY; + break; + } + + if (pm_ops->prepare) { + error = pm_ops->prepare(PM_SUSPEND_MEM); + if (error) + goto OutS3; + } + + /* Put devices to sleep */ + error = device_suspend(PMSG_SUSPEND); + if (error) { + printk(KERN_ERR "Failed to suspend some devices.\n"); + } else { + /* Enter S3, system is already frozen */ + suspend_enter(PM_SUSPEND_MEM); + + /* Wake up devices */ + device_resume(); + } + + if (pm_ops->finish) + pm_ops->finish(PM_SUSPEND_MEM); + +OutS3: + up(&pm_sem); + break; + default: error = -ENOTTY;