--- a/pm/pm-functions.in +++ b/pm/pm-functions.in @@ -312,6 +312,32 @@ { + local hibernate_mode_save ret + [ -n "${HIBERNATE_MODE}" ] && \ - grep -qw "${HIBERNATE_MODE}" /sys/power/disk && \ - echo -n "${HIBERNATE_MODE}" > /sys/power/disk + grep -qw "${HIBERNATE_MODE}" /sys/power/disk && \ + hibernate_mode_save=$(cat /sys/power/disk) && \ + hibernate_mode_save="${hibernate_mode_save##*\[}" && \ + hibernate_mode_save="${hibernate_mode_save%%\]*}" && \ + [ "$hibernate_mode_save" != "${HIBERNATE_MODE}" ] || \ + hibernate_mode_save="" + [ -n "$hibernate_mode_save" ] && \ + echo -n "${HIBERNATE_MODE}" > /sys/power/disk echo -n "disk" > /sys/power/state + ret=$? + [ -n "$hibernate_mode_save" ] && \ + echo -n "$hibernate_mode_save" > /sys/power/disk + return $ret + } +fi + +# for kernels that support suspend to both (i.e. hybrid suspend) +# since kernel 3.6 +if [ -z "$SUSPEND_HYBRID_MODULE" ] && \ + [ -f /sys/power/disk ] && \ + grep -q disk /sys/power/state && \ + grep -q suspend /sys/power/disk; then + SUSPEND_HYBRID_MODULE="kernel" + do_suspend_hybrid() + { + HIBERNATE_MODE="suspend" + do_hibernate }