#! /bin/sh
### BEGIN INIT INFO
# Provides:          powersaved
# Required-Start:    $local_fs dbus
# Required-Stop:     $local_fs dbus
# Should-Start:	     $syslog acpid
# Should-Stop:       $syslog acpid
# Default-Start:     2 3 4 5
# Default-Stop:      S 0 1 6
# Short-Description: power management daemon
# Description:       Support for ACPI, APM and CPU frequency scaling.
#                    Detects HW support for mentioned systems and optimises 
#                    power consumption accordingly.
### END INIT INFO
#
# Author: Michael Biebl <biebl@debian.org>.
#

DAEMON=/usr/sbin/powersaved
DAEMON_OPTS="-f /var/run/acpid.socket"
NAME=powersaved
DESC="power management daemon"
CONFIG=/etc/powersave
SYSFS_PATH="/sys/devices/system/cpu/cpu0/cpufreq"
POWERSAVE_BIN=/usr/bin/powersave
ACPID_BIN=/usr/sbin/acpid

test -x $DAEMON || exit 0
test -x $POWERSAVE_BIN || exit 0
test -x /usr/bin/logger && LOGGER="/usr/bin/logger -t powersaved" || LOGGER="echo"

. /lib/lsb/init-functions

if [ -r $CONFIG ] ; then
	. $CONFIG/common
	. $CONFIG/cpufreq
fi


load_governors()
{
    if [ ! -r $SYSFS_PATH ];then
	$LOGGER Cannot load cpufreq governors - No cpufreq driver available
	return 1
    fi
    read govs < $SYSFS_PATH/scaling_available_governors
    case "$govs" in
	*powersave*) 
	    ;;
	*) 
	    modprobe -q cpufreq_powersave >/dev/null 2>&1
	    [ $? -ne 0 ] && $LOGGER powersave cpufreq governor could not be loaded
	    ;;
    esac
    case "$govs" in
	*performance*) 
	    ;;
	*) 
	    modprobe -q cpufreq_performance >/dev/null 2>&1
	    [ $? -ne 0 ] && $LOGGER perfromance cpufreq governor could not be loaded
	    ;;
    esac
    case "$govs" in
	*userspace*) 
	    ;;
	*) 
	    modprobe -q cpufreq_userspace >/dev/null 2>&1
	    [ $? -ne 0 ] && $LOGGER userspace cpufreq governor could not be loaded
	    ;;
    esac
    case "$govs" in
	*ondemand*)
	    ;;
	*) 
	    modprobe -q cpufreq_ondemand >/dev/null 2>&1
	    [ $? -ne 0 ]&& $LOGGER ondemand cpufreq governor could not be loaded
	    ;;
    esac
    return 0
}
 
load_cpufreq_modules()
{
	CPUFREQ_MODULES="speedstep_centrino speedstep_ich powernow_k8 powernow_k7 powernow_k6 longrun longhaul acpi_cpufreq"
	CPUFREQ_MODULES_GREP="^speedstep_centrino\|^speedstep_ich\|^powernow_k8\|^powernow_k7\|^powernow_k6\|^longrun\|^longhaul\|^acpi_cpufreq"

	###### load CPUFREQ modules############
	# module specfied in sysconfig.cpufreq?
	if [ "$CPUFREQD_MODULE" != "off" ]; then
		# test for already loaded modules
		ALREADY_LOADED_MODS=`grep $CPUFREQ_MODULES_GREP /proc/modules`
		if [ "$CPUFREQD_MODULE" ]; then
			modprobe -q $CPUFREQD_MODULE $CPUFREQD_MODULE_OPTS &>/dev/null
			RETVAL=$?
		# try to load one of the modules we know
		elif [ -z "$ALREADY_LOADED_MODS" ] ; then 
			for MODULE in $CPUFREQ_MODULES; do
				$LOGGER "Loading $MODULE"
				modprobe $MODULE &>/dev/null
				RETVAL=$?
				[ "$RETVAL" -eq 0 ] && break
			done
			# skip if no module could be loaded!
			if [ "$RETVAL" -ne 0 ]; then
				$LOGGER "CPU frequency scaling is not supported by your processor."
				$LOGGER "enter 'CPUFREQD_MODULE=off' in $CONFIG/cpufreq to avoid this warning."
			else
				$LOGGER "enter '$MODULE' into CPUFREQD_MODULE in $CONFIG/cpufreq."
				$LOGGER "this will speed up starting powersaved and avoid unnecessary warnings in syslog."
			fi
		fi
		# see function above 
                # -> load powersave,performance,userspace and ondemand governor
		load_governors
		# wait for modules to be loaded
		sleep .2
	fi
	###### load CPUFREQ modules############
}

check_apm_acpi()
{
	ACPI_APM=`$POWERSAVE_BIN --apm-acpi`
	
	if [ "$ACPI_APM" = "ACPI" ] ; then
		# set thermal polling frequency
		# this should be managed by the daemon later
		if [ "$THERMAL_POLLING_FREQUENCY" != "0" ];then
			[ -z "$THERMAL_POLLING_FREQUENCY" ] && THERMAL_POLLING_FREQUENCY=2
                       	for x in /proc/acpi/thermal_zone/*; do
				[ -w $x/polling_frequency ] && echo "$THERMAL_POLLING_FREQUENCY" >$x/polling_frequency
			done
		fi

		if ! [ `pidof  $ACPID_BIN` ] ; then
			log_end_msg 1
			$LOGGER "WARN: Service powersaved skipped. You have to install and start acpid before powersaved"
			echo "##########################################################"
			echo "# ACPI system but acpid not running.                     #"
			echo "# Please install acpid package, then restart powersaved! #"
			echo "##########################################################"
			exit 7
		fi
		$LOGGER "Starting powersaved with ACPI support"
	elif [ "$ACPI_APM" = "APM" ] ; then
		$LOGGER "Starting powersaved with APM support"
	else
		$LOGGER "Starting powersaved without APM and ACPI support"
	fi
}

case "$1" in
  start)
  	log_daemon_msg "Starting $DESC" $NAME
	load_cpufreq_modules
	check_apm_acpi
	start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
		--exec $DAEMON -- -d $DAEMON_OPTS
	log_end_msg $?
	;;
  stop)
	log_daemon_msg "Stopping $DESC" $NAME
	start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \
		--exec $DAEMON
	log_end_msg $?
	;;
  reload|force-reload)
	log_begin_msg "Reloading $DESC configuration files"
	start-stop-daemon --stop --signal 1 --quiet --pidfile \
		/var/run/$NAME.pid --exec $DAEMON
	log_end_msg $?
  ;;
  restart)
	$0 stop
        sleep 1
        $0 start
	;;
  *)
	N=/etc/init.d/$NAME
	echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
	exit 1
	;;
esac

exit 0
