summaryrefslogtreecommitdiff
path: root/pm
diff options
context:
space:
mode:
authorVictor Lowther <victor.lowther@gmail.com>2008-09-27 08:43:04 -0500
committerVictor Lowther <victor.lowther@gmail.com>2008-09-27 08:43:04 -0500
commitf9570ff8a38aeffb21fd9d6a525dbad7dc5098fb (patch)
tree1c9409cd7310954d34e90ff7254444fc4ba7b9b2 /pm
parent268ad38428662c410c7c70ccf561dab8ee6ecd50 (diff)
parent390d3019c38e917d3baf9eea8209c54e4970fc5a (diff)
Merge branch 'auto-backend'
Diffstat (limited to 'pm')
-rwxr-xr-xpm/module.d/kernel38
-rwxr-xr-xpm/module.d/tuxonice57
-rwxr-xr-xpm/module.d/uswsusp87
-rw-r--r--pm/pm-functions.in75
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