#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
 extern int swsusp_read(void);
 extern int swsusp_write(void);
 extern void swsusp_close(void);
+extern int suspend_enter(suspend_state_t state);
 
                }
                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;