summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pm/HOWTO.hooks7
-rw-r--r--pm/functions.in19
-rwxr-xr-xpm/sleep.d/20video67
-rwxr-xr-xpm/sleep.d/94cpufreq15
-rwxr-xr-xpm/sleep.d/99video110
-rw-r--r--pm/sleep.d/Makefile.am1
-rw-r--r--src/pm-action.in58
7 files changed, 124 insertions, 153 deletions
diff --git a/pm/HOWTO.hooks b/pm/HOWTO.hooks
index 43fe40d..0ce10de 100644
--- a/pm/HOWTO.hooks
+++ b/pm/HOWTO.hooks
@@ -6,12 +6,19 @@ A pm-utils hook is simply an executable file that accepts a single parameter.
For hooks in sleep.d, the potential values of that parameter are:
suspend -- The hook MUST perform whatever action is appropriate when the
system is preparing for S3 sleep (or its equivalent).
+suspend_hybrid -- The hook MUST perform whatever action is appropriate
+ when entering suspend mode. The hook SHOULD also save
+ any state it may need to bring the system back from
+ hibernate mode.
resume -- The hook MUST perform whatever action is appropriate when the
system is coming out of suspend.
hibernate -- The hook MUST perform whatever action is appropriate when
the system is preparing for suspend-to-disk.
thaw -- The hook MUST perform whatever action is appropriate when the system
is coming out of suspend-to-disk.
+help -- If your hook parses the PM_CMDLINE environment variable for switches,
+ this function SHOULD output text describing the parameters it parses
+ in a format easily understandable by an end-user.
For hooks in power.d, the potential values of that parameter are:
true -- the hook MUST perform whatever action is appropriate when the system
diff --git a/pm/functions.in b/pm/functions.in
index 82ff157..c9ce8fc 100644
--- a/pm/functions.in
+++ b/pm/functions.in
@@ -6,7 +6,6 @@
# for great debugging!
[ "${PM_DEBUG}" = "true" ] && set -x
-
# try to take the lock. Fail if we cannot get it.
try_lock()
{
@@ -80,7 +79,7 @@ _rmmod()
touch "${STORAGEDIR}/module:$1"
return 0
else
- echo "# could not unload '$1', usage count was $2"
+ log "# could not unload '$1', usage count was $2"
return 1
fi
}
@@ -136,7 +135,7 @@ if ! command_exists service; then
shift
"/etc/init.d/$svc" "$@"
else
- echo "$1" $": unrecognized service" 1>&2
+ log "$1" $": unrecognized service" 1>&2
return 1
fi
}
@@ -162,10 +161,20 @@ disablehook()
savestate()
{
- echo "$2" > "${STORAGEDIR}/state:$1"
+ if [ -n "$2" ]; then
+ echo "$2" > "${STORAGEDIR}/state:$1"
+ else
+ cat > "${STORAGEDIR}/state:$1"
+ fi
}
+state_exists()
+{
+ [ -O "${STORAGEDIR}/state:$1" ]
+}
+
+
restorestate()
{
- [ -O "${STORAGEDIR}/state:${1}" ] && cat "${STORAGEDIR}/state:${1}"
+ state_exists "$1" && cat "${STORAGEDIR}/state:$1"
}
diff --git a/pm/sleep.d/20video b/pm/sleep.d/20video
deleted file mode 100755
index 668b519..0000000
--- a/pm/sleep.d/20video
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/bin/sh
-#
-# Copyright 2006-2007 Richard Hughes <richard@hughsie.com>
-# Copyright 2007 Peter Jones <pjones@redhat.com>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of version 2 of the GNU General Public License as
-# published by the Free Software Foundation.
-
-. "${PM_FUNCTIONS}"
-
-if command_exists vbetool; then
- vbe() { vbetool "$@"; }
-else
- vbe() { echo "vbetool not found" 1>&2; return 1; }
-fi
-
-if command_exists radeontool; then
- radeon() { radeontool "$@"; }
-else
- radeon() { echo "radeontool not found" 1>&2; return 1; }
-fi
-
-suspend_video()
-{
- # 0=nothing, 1=s3_bios, 2=s3_mode, 3=both
- if [ "${DISPLAY_QUIRK_S3_BIOS}" = "true" -a \
- "${DISPLAY_QUIRK_S3_MODE}" = "true" ]; then
- sysctl -w kernel.acpi_video_flags=3
- elif [ "${DISPLAY_QUIRK_S3_BIOS}" = "true" ]; then
- sysctl -w kernel.acpi_video_flags=1
- elif [ "${DISPLAY_QUIRK_S3_MODE}" = "true" ]; then
- sysctl -w kernel.acpi_video_flags=2
- else
- sysctl -w kernel.acpi_video_flags=0
- fi
-
- # We might need to do one or many of these quirks
- if [ "${DISPLAY_QUIRK_RADEON_OFF}" = "true" ]; then
- radeon dac off
- radeon light off
- fi
- if [ "${DISPLAY_QUIRK_VBESTATE_RESTORE}" = "true" ]; then
- vbe vbestate save > /var/run/vbestate
- fi
- if [ "${DISPLAY_QUIRK_VBEMODE_RESTORE}" = "true" ]; then
- vbe vbemode get > /var/run/vbemode
- fi
- if [ "${DISPLAY_QUIRK_VGA_MODE_3}" = "true" ]; then
- vbe vbemode set 3
- fi
- if [ "${DISPLAY_QUIRK_DPMS_SUSPEND}" = "true" ]; then
- vbe dpms suspend
- fi
-}
-
-
-case "$1" in
- suspend*)
- suspend_video
- ;;
- hibernate)
- if [ "$HIBERNATE_RESUME_POST_VIDEO" = "yes" ]; then
- suspend_video
- fi
- ;;
-esac
diff --git a/pm/sleep.d/94cpufreq b/pm/sleep.d/94cpufreq
index 9157fb4..cfb0c60 100755
--- a/pm/sleep.d/94cpufreq
+++ b/pm/sleep.d/94cpufreq
@@ -7,12 +7,17 @@
hibernate_cpufreq()
{
( cd /sys/devices/system/cpu/
- for x in cpu[0-9]*/cpufreq/scaling_governor ; do
- [ -f "$x" ] || continue
+ for x in cpu[0-9]*; do
+ # if cpufreq is a symlink, it is handled by another cpu. Skip.
+ [ -L "$x/cpufreq" ] && continue
+ gov="$x/cpufreq/scaling_governor"
+ # if we do not have a scaling_governor file, skip.
+ [ -f "$gov" ] || continue
+ # if our temporary governor is not available, skip.
grep -q "$TEMPORARY_CPUFREQ_GOVERNOR" \
- "${x%/*}/scaling_available_governors" || continue
- savestate "${x%%/*}_governor" $(cat "$x")
- echo "$TEMPORARY_CPUFREQ_GOVERNOR" > "$x"
+ "$x/cpufreq/scaling_available_governors" || continue
+ savestate "${x}_governor" $(cat "$gov")
+ echo "$TEMPORARY_CPUFREQ_GOVERNOR" > "$gov"
done )
}
diff --git a/pm/sleep.d/99video b/pm/sleep.d/99video
index cdf2bc8..1dc88bd 100755
--- a/pm/sleep.d/99video
+++ b/pm/sleep.d/99video
@@ -9,6 +9,26 @@
. "${PM_FUNCTIONS}"
+for opt in $PM_CMDLINE; do
+ [ "${opt#--quirk-}" = "$opt" ] && continue # not one we care about.
+ case "${1##--quirk-}" in # just quirks, please
+ dpms-on) QUIRK_DPMS_ON="true" ;;
+ dpms-suspend) QUIRK_DPMS_SUSPEND="true" ;;
+ radeon-off) QUIRK_RADEON_OFF="true" ;;
+ reset-brightness) QUIRK_RESET_BRIGHTNESS="true" ;;
+ s3-bios) QUIRK_S3_BIOS="true" ;;
+ s3-mode) QUIRK_S3_MODE="true" ;;
+ vbe-post) QUIRK_VBE_POST="true" ;;
+ vbemode-restore) QUIRK_VBEMODE_RESTORE="true" ;;
+ vbestate-restore) QUIRK_VBESTATE_RESTORE="true" ;;
+ vga-mode3) QUIRK_VGA_MODE_3="true" ;;
+ none) QUIRK_NONE="true" ;;
+ *) continue ;;
+ esac
+ shift
+done
+
+
reset_brightness()
{
for bl in /sys/class/backlight/* ; do
@@ -49,44 +69,80 @@ resume_fbcon()
done
}
+# Some tiny helper functions for quirk handling
+quirk() { [ "$1" = "true" ] && [ -z $QUIRK_NONE ]; }
+
+# save/restore vbe state
+vbe_savestate() { vbe vbestate save |savestate vbestate; }
+vbe_restorestate() { restorestate vbestate |vbe vbestate restore; }
+
+# save/restore the vbe mode
+vbe_savemode() { vbe vbemode get |savestate vbemode; }
+vbe_restoremode() { vbe vbemode get |savestate vbemode; }
+
+# post the video card
+vbe_post() { vbe post; sleep 0.1; }
+
+# turn critical bits of radeon cards off/on
+radeon_off() { radeon dac off; radeon light off; }
+radeon_on() { radeon dac on; radeon light on; }
+
+suspend_video()
+{
+ # 0=nothing, 1=s3_bios, 2=s3_mode, 3=both
+ local acpi_flag=0
+ [ "${QUIRK_S3_BIOS}" = "true" ] && acpi_flag=$(($acpi_flag + 1))
+ [ "${QUIRK_S3_MODE}" = "true" ] && acpi_flag=$(($acpi_flag + 2))
+ sysctl -w kernel.acpi_video_flags=$acpi_flag
+
+ quirk "${QUIRK_VBESTATE_RESTORE}" && vbe_savestate
+ quirk "${QUIRK_VBEMODE_RESTORE}" && vbe_savemode
+ quirk "${QUIRK_RADEON_OFF}" && radeon_off
+ quirk "${QUIRK_VGA_MODE_3}" && vbe vbemode set 3
+ quirk "${QUIRK_DPMS_SUSPEND}" && vbe dpms suspend
+ save_fbcon # there should be a quirk, but HAL does not pass it.
+}
resume_video()
{
- if [ "${DISPLAY_QUIRK_RADEON_OFF}" = "true" ]; then
- radeon dac on
- radeon light on
- fi
# We might need to do one or many of these quirks
- if [ "${DISPLAY_QUIRK_VBE_POST}" = "true" ]; then
- vbe post
- sleep 0.1
- fi
- if [ "${DISPLAY_QUIRK_VBESTATE_RESTORE}" = "true" ]; then
- vbe vbestate restore < /var/run/vbestate
- fi
- if [ "${DISPLAY_QUIRK_VBEMODE_RESTORE}" = "true" ]; then
- vbe vbemode set "$(cat /var/run/vbemode)"
- fi
- # based on data from s2ram
- resume_fbcon
- if [ "${DISPLAY_QUIRK_DPMS_ON}" = "true" ]; then
- vbe dpms on
- fi
- if [ "${DISPLAY_QUIRK_RESET_BRIGHTNESS}" = "true" ]; then
- reset_brightness
- fi
+ quirk "${QUIRK_VBE_POST}" && vbe_post
+ quirk "${QUIRK_VBESTATE_RESTORE}" && vbe_restorestate
+ quirk "${QUIRK_VBEMODE_RESTORE}" && vbe_restoremode
+ resume_fbcon # also should be handled by a quirk.
+ quirk "${QUIRK_RADEON_OFF}" && radeon_on
+ quirk "${QUIRK_DPMS_ON}" && vbe dpms on
+ quirk "${QUIRK_RESET_BRIGHTNESS}" && reset_brightness
}
+help() {
+ echo # first echo makes it look nicer.
+ echo "Video quirk handler options:"
+ echo
+ echo " --quirk-dpms-on"
+ echo " --quirk-dpms-suspend"
+ echo " --quirk-radeon-off"
+ echo " --quirk-reset-brightness"
+ echo " --quirk-s3-bios"
+ echo " --quirk-s3-mode"
+ echo " --quirk-vbe-post"
+ echo " --quirk-vbemode-restore"
+ echo " --quirk-vbestate-restore"
+ echo " --quirk-vga-mode3"
+ echo " --quirk-none"
+}
case "$1" in
- suspend*)
- save_fbcon
- ;;
- resume)
- resume_video
+ suspend*) suspend_video ;;
+ hibernate)
+ if [ "$HIBERNATE_RESUME_POST_VIDEO" = "yes" ]; then
+ suspend_video
+ fi
;;
+ resume) resume_video ;;
thaw)
if [ "${HIBERNATE_RESUME_POST_VIDEO}" = "yes" ]; then
resume_video
fi
;;
+ help) help ;;
esac
diff --git a/pm/sleep.d/Makefile.am b/pm/sleep.d/Makefile.am
index 256ee0b..7efbc81 100644
--- a/pm/sleep.d/Makefile.am
+++ b/pm/sleep.d/Makefile.am
@@ -5,7 +5,6 @@ sleep_SCRIPTS = \
01grub \
05led \
10NetworkManager \
- 20video \
49bluetooth \
50modules \
55battery \
diff --git a/src/pm-action.in b/src/pm-action.in
index 32525c8..3359a1b 100644
--- a/src/pm-action.in
+++ b/src/pm-action.in
@@ -26,25 +26,17 @@
# The rule here? Simplicity.
-help_options()
+. "@PM-UTILS-LIBDIR@/pm-functions"
+
+# save the command line parameters for the hooks.
+export PM_CMDLINE="$*"
+help()
{
echo "${0##*/} [options]"
echo
- echo "Options can change how the supend or hibernate is done."
- echo
- echo "Possible actions are:"
- echo
- echo " --quirk-dpms-on"
- echo " --quirk-dpms-suspend"
- echo " --quirk-radeon-off"
- echo " --quirk-reset-brightness"
- echo " --quirk-s3-bios"
- echo " --quirk-s3-mode"
- echo " --quirk-vbe-post"
- echo " --quirk-vbemode-restore"
- echo " --quirk-vbestate-restore"
- echo " --quirk-vga-mode3"
- echo
+ echo "Options can change how suspend or hibernate is done."
+ run_hooks sleep help
+ exit 0
}
if [ -n "$EUID" -a "$EUID" != "0" ]; then
@@ -52,41 +44,13 @@ if [ -n "$EUID" -a "$EUID" != "0" ]; then
exit 1
fi
-# Get the command line options
+# Save the command line options for the hooks
while [ $# -gt 0 ]
do
- case "$1" in
- --quirk-dpms-on)
- export DISPLAY_QUIRK_DPMS_ON="true" ;;
- --quirk-dpms-suspend)
- export DISPLAY_QUIRK_DPMS_SUSPEND="true" ;;
- --quirk-radeon-off)
- export DISPLAY_QUIRK_RADEON_OFF="true" ;;
- --quirk-reset-brightness)
- export DISPLAY_QUIRK_RESET_BRIGHTNESS="true" ;;
- --quirk-s3-bios)
- export DISPLAY_QUIRK_S3_BIOS="true" ;;
- --quirk-s3-mode)
- export DISPLAY_QUIRK_S3_MODE="true" ;;
- --quirk-vbe-post)
- export DISPLAY_QUIRK_VBE_POST="true" ;;
- --quirk-vbemode-restore)
- export DISPLAY_QUIRK_VBEMODE_RESTORE="true" ;;
- --quirk-vbestate-restore)
- export DISPLAY_QUIRK_VBESTATE_RESTORE="true" ;;
- --quirk-vga-mode3)
- export DISPLAY_QUIRK_VGA_MODE_3="true" ;;
- --help)
- help_options
- exit 0 ;;
- *)
- break ;; # terminate while loop
- esac
+ [ "$1" = "--help" ] && help
shift
done
-. "@PM-UTILS-LIBDIR@/pm-functions"
-
ACTION="$(echo ${0##*pm-} |tr - _)"
case "$ACTION" in
@@ -97,8 +61,6 @@ case "$ACTION" in
exit 1 ;;
esac
-export PM_CMDLINE="$@"
-
"check_$ACTION" || { echo "System does not support $ACTION sleep."; exit 1; }
take_suspend_lock || exit 1