diff options
author | Victor Lowther <victor.lowther@gmail.com> | 2008-09-27 08:43:04 -0500 |
---|---|---|
committer | Victor Lowther <victor.lowther@gmail.com> | 2008-09-27 08:43:04 -0500 |
commit | f9570ff8a38aeffb21fd9d6a525dbad7dc5098fb (patch) | |
tree | 1c9409cd7310954d34e90ff7254444fc4ba7b9b2 /pm | |
parent | 268ad38428662c410c7c70ccf561dab8ee6ecd50 (diff) | |
parent | 390d3019c38e917d3baf9eea8209c54e4970fc5a (diff) |
Merge branch 'auto-backend'
Diffstat (limited to 'pm')
-rwxr-xr-x | pm/module.d/kernel | 38 | ||||
-rwxr-xr-x | pm/module.d/tuxonice | 57 | ||||
-rwxr-xr-x | pm/module.d/uswsusp | 87 | ||||
-rw-r--r-- | pm/pm-functions.in | 75 |
4 files changed, 138 insertions, 119 deletions
diff --git a/pm/module.d/kernel b/pm/module.d/kernel index 88a9e5d..157fc8a 100755 --- a/pm/module.d/kernel +++ b/pm/module.d/kernel @@ -1,38 +1,4 @@ #!/bin/sh -check_suspend() -{ - [ -c /dev/pmu ] || grep -q mem /sys/power/state -} - -do_suspend() -{ - if [ -c /dev/pmu ]; then - pm-pmu --suspend - else - echo -n "mem" > /sys/power/state - fi -} - -check_hibernate() -{ - [ -f /sys/power/disk ] && grep -q disk /sys/power/state -} - -do_hibernate() -{ - [ -n "${HIBERNATE_MODE}" ] && \ - grep -qw "${HIBERNATE_MODE}" /sys/power/disk && \ - echo -n "${HIBERNATE_MODE}" > /sys/power/disk - echo -n "disk" > /sys/power/state -} - -check_suspend_hybrid() -{ - return 1 -} - -do_suspend_hybrid() -{ - return 1 -} +# this file is a stub -- pm-functions will always fall back to kernel methods +# if nothing else is available.
\ No newline at end of file diff --git a/pm/module.d/tuxonice b/pm/module.d/tuxonice index 57b7bb8..f4e3de9 100755 --- a/pm/module.d/tuxonice +++ b/pm/module.d/tuxonice @@ -11,41 +11,26 @@ for loc in "/sys/power/tuxonice" "/sys/power/suspend2"; do [ -d "${loc}" ] && { TUXONICE_LOC="${loc}"; break; } done -check_suspend() -{ - [ -c /dev/pmu ] || grep -q mem /sys/power/state -} +if [ -z "$HIBERNATE_MODULE" -a -n "$TUXONICE_LOC" ] && \ + [ -f "${TUXONICE_LOC}/do_hibernate" ]; then + HIBERNATE_METHOD="tuxonice" + do_hibernate() + { + echo 5 > "${TUXONICE_LOC}/powerdown_method" + echo anything > "${TUXONICE_LOC}/do_hibernate" + } +fi -do_suspend() -{ - if [ -c /dev/pmu ]; then - pm-pmu --suspend - else - echo -n "mem" > /sys/power/state - fi -} - -check_hibernate() -{ - [ -f "${TUXONICE_LOC}/do_hibernate" ] -} - -do_hibernate() -{ - echo 5 > "${TUXONICE_LOC}/powerdown_method" - echo anything > "${TUXONICE_LOC}/do_hibernate" -} - -check_suspend_hybrid() -{ +if [ -z "$SUSPEND_HYBRID_MODULE" -a -n "$TUXONICE_LOC" ] && \ grep -q mem /sys/power/state && \ - [ -f "${TUXONICE_LOC}/do_hibernate" ] -} -do_suspend_hybrid() -{ - echo 3 >"${TUXONICE_LOC}/powerdown_method" - echo anything >"${TUXONICE_LOC}/do_hibernate" - [ -f /sys/power/tuxonice/did_suspend_to_both ] && \ - [ "$(cat /sys/power/tuxonice/did_suspend_to_both)" != "1" ] && \ - REVERSE="thaw" -} + [ -f "${TUXONICE_LOC}/do_hibernate" ]; then + SUSPEND_HYBRID_METHOD="tuxonice" + do_suspend_hybrid() + { + echo 3 >"${TUXONICE_LOC}/powerdown_method" + echo anything >"${TUXONICE_LOC}/do_hibernate" + [ -f /sys/power/tuxonice/did_suspend_to_both ] && \ + [ "$(cat /sys/power/tuxonice/did_suspend_to_both)" != "1" ] && \ + REVERSE="thaw" + } +fi diff --git a/pm/module.d/uswsusp b/pm/module.d/uswsusp index 4647824..1bb1e68 100755 --- a/pm/module.d/uswsusp +++ b/pm/module.d/uswsusp @@ -1,13 +1,13 @@ #!/bin/sh # disable processing of 99video -before_hooks() +uswsusp_hooks() { disablehook 90chvt "disabled by uswsusp" disablehook 99video "disabled by uswsusp" } -get_quirks() +uswsusp_get_quirks() { OPTS="" ACPI_SLEEP=0 @@ -33,45 +33,7 @@ get_quirks() [ "$QUIRK_NONE" = "true" ] && OPTS="" } -check_suspend() -{ - command_exists s2ram || return 1 - [ -c /dev/pmu ] || grep -q mem /sys/power/state -} - -do_suspend() -{ - get_quirks - s2ram --force $OPTS -} - -check_hibernate() -{ - [ -f /sys/power/disk ] && \ - grep -q disk /sys/power/state && \ - [ -c /dev/snapshot ] && - command_exists s2disk -} - -do_hibernate() -{ - s2disk -} - -check_suspend_hybrid() -{ - grep -q mem /sys/power/state && \ - command_exists s2both && \ - check_hibernate -} - -do_suspend_hybrid() -{ - get_quirks - s2both --force $OPTS -} - -sleep_method_help() +uswsusp_help() { echo # first echo makes it look nicer. echo "Video quirk handler options:" @@ -89,3 +51,46 @@ sleep_method_help() echo " --quirk-save-pci" echo " --quirk-none" } + +if [ -z "$SUSPEND_METHOD" ] && command_exists s2ram && \ + ( grep -q mem /sys/power/state || \ + ( [ -c /dev/pmu ] && pm-pmu --check; ); ); then + SUSPEND_METHOD="uswsusp" + do_suspend() + { + uswsusp_get_quirks + s2ram --force $OPTS + } + if [ "$METHOD" = "suspend" ]; then + add_before_hooks uswsusp_hooks + add_module_help uswsusp_help + fi +fi + +if [ -z "$HIBERNATE_METHOD" ] && \ + [ -f /sys/power/disk ] && \ + grep -q disk /sys/power/state && \ + [ -c /dev/snapshot ] && + command_exists s2disk; then + HIBERNATE_METHOD="uswsusp" + do_hibernate() + { + s2disk + } +fi + +if [ -z "$SUSPEND_HYBRID_METHOD" ] && + grep -q mem /sys/power/state && \ + command_exists s2both && \ + check_hibernate; then + SUSPEND_HYBRID_METHOD="uswsusp" + do_suspend_hybrid() + { + uswsusp_get_quirks + s2both --force $OPTS + } + if [ "$METHOD" = "suspend_hybrid" ]; then + add_before_hooks uswsusp_hooks + add_module_help uswsusp_help + fi +fi diff --git a/pm/pm-functions.in b/pm/pm-functions.in index c7cd2e9..f5cc400 100644 --- a/pm/pm-functions.in +++ b/pm/pm-functions.in @@ -44,6 +44,11 @@ DROP_PARAMETERS="" PARAMETERS="${STORAGEDIR}/parameters" INHIBIT="${STORAGEDIR}/inhibit" PM_CMDLINE="$*" +BEFORE_HOOKS="" +MODULE_HELP="" +SUSPEND_MODULE="" +HIBERNATE_MODULE="" +SUSPEND_HYBRID_MODULE="" # when loading configuration files, allow stash-specific ones # to override the pm-utils global ones. @@ -90,6 +95,34 @@ log() printf "$fmt" "$*" } +add_before_hooks() { + [ -z "$BEFORE_HOOKS" ] && BEFORE_HOOKS="$*" || \ + BEFORE_HOOKS="$BEFORE_HOOKS $*" +} + +add_module_help() { + [ -z "$MODULE_HELP" ] && MODULE_HELP="$*" || \ + MODULE_HELP="$MODULE_HELP $*" +} + +before_hooks() +{ + [ -z "$BEFORE_HOOKS" ] && return 0 + local meth + for meth in $BEFORE_HOOKS; do + command_exists "$meth" && "$meth" + done +} + +sleep_module_help() +{ + [ -z "$MODULE_HELP" ] && return 0 + local meth + for meth in $MODULE_HELP; do + command_exists "$meth" && "$meth" + done +} + # update PM_CMDLINE iff someone changed our parameters update_parameters() { @@ -203,12 +236,42 @@ init_logfile() exec > "$1" 2>&1 } +check_suspend() { [ -n "$SUSPEND_MODULE" ]; } +check_hibernate() { [ -n "$HIBERNATE_MODULE" ]; } +check_suspend_hybrid() { [ -n "$SUSPEND_HYBRID_MODULE" ]; } -SLEEP_FUNCTIONS="${PM_UTILS_LIBDIR}/module.d/${SLEEP_MODULE}" -[ -f "${SLEEP_FUNCTIONS}" ] || { - echo "Requested sleep module $SLEEP_MODULE not available." - exit 1 -} +# allow autodetection of sleep methods +if [ "$SLEEP_MODULE" = "auto" ]; then + SLEEP_MODULE="tuxonice uswsusp" +fi + +for mod in $SLEEP_MODULE; do + mod="${PM_UTILS_LIBDIR}/module.d/${mod}" + [ -f "$mod" ] || continue + . "$mod" +done -. "${SLEEP_FUNCTIONS}" +# always fall back to kernel methods if nothing else was declared +if [ -z "$SUSPEND_MODULE" ]; then + if grep -q mem /sys/power/state; then + SUSPEND_MODULE="kernel" + do_suspend() { echo -n "mem" >/sys/power/state; } + elif [ -c /dev/pmu ] && pm-pmu --check; then + SUSPEND_MODULE="kernel" + do_suspend() { pm-pmu --suspend; } + fi +fi + +if [ -z "$HIBERNATE_MODULE" ] && \ + [ -f /sys/power/disk ] && \ + grep -q disk /sys/power/state; then + HIBERNATE_MODULE="kernel" + do_hibernate() + { + [ -n "${HIBERNATE_MODE}" ] && \ + grep -qw "${HIBERNATE_MODE}" /sys/power/disk && \ + echo -n "${HIBERNATE_MODE}" > /sys/power/disk + echo -n "disk" > /sys/power/state + } +fi |