--- /dev/null
+#!/bin/sh
+# kernel configuration script for power user kernel
+# (c) Copyright 2010 by Thomas Tanner <maemo@tannerlab.com>
+# licensed under GPLv3
+# version 0.1 (2. May 2010)
+
+if test $# -eq 0; then
+ echo "$0 command [options]"
+ echo "commands:"
+ echo " show - show current settings"
+ echo " load <file> - load settings from file"
+ echo " save <file> - save settings to file (abs. path or filename in /home/user/.kernel, none=defaults)"
+ echo " setdefault <file> - set file as default settings"
+ echo " lock [freq [volt] [dsp]] - un/lock CPU at frequency with specific settings"
+ echo "filenames: absolute path or filename in search path or none=defaults"
+ echo "search path: .,/home/user/.kernel,/usr/share/kernel-power-settings/"
+ exit 1
+fi
+if test "`id -u`" -ne 0; then
+ sudo $0 $* # run as root
+ exit $?
+fi
+
+cfr=/sys/devices/system/cpu/cpu0/cpufreq
+cfd=$cfr/ondemand
+pwr=/sys/power/
+
+echo ondemand > $cfr/scaling_governor
+if test -f $cfd/avoid_frequencies -a -f $pwr/vdd1_opps_vsel -a -f $pwr/dsp_opps_rate; then :
+else
+ echo This kernel version `uname -r` is not supported
+ exit 1
+fi
+
+allfreq=
+for f in `cat $cfr/scaling_available_frequencies`; do
+ allfreq="$f $allfreq"
+done
+vsel=`cat $pwr/vdd1_opps_vsel`
+rate=`cat $pwr/dsp_opps_rate`
+
+cmd=$1
+arg=
+shift
+if test "$cmd" = lock && test -z "$1"; then
+ echo 'unlocking frequency. reset to defaults'
+ cmd=loaddef
+ arg=
+fi
+
+popvsel() { curvsel=$1; shift; vsel="$*"; }
+poprate() { currate=$1; shift; rate="$*"; }
+
+case $cmd in
+show|save)
+ minfreq=$((`cat $cfr/scaling_min_freq`/1000))
+ maxfreq=$((`cat $cfr/scaling_max_freq`/1000))
+ test $maxfreq = 599 && maxfreq=600
+ avoid=`cat $cfd/avoid_frequencies`
+ freqs=
+ for f in $allfreq; do
+ popvsel $vsel
+ poprate $rate
+ case " $avoid " in *" $f "*) ;;
+ *) freqs="$freqs$((f/1000)):$curvsel,$currate "
+ esac
+ done
+ if test $cmd = show; then
+ echo "current kernel configuration:"
+ echo "current frequency:" $((`cat $cfr/scaling_cur_freq`/1000))
+ echo -n "supported frequencies: "
+ for f in $allfreq; do echo -n "$((f/1000)) "; done
+ echo
+ echo "min. frequency:" $minfreq
+ echo "max. frequency:" $maxfreq
+ echo -n "avoid frequencies: "
+ for f in $avoid; do echo -n "$((f/1000)) "; done
+ echo
+ echo "active frequencies: $freqs"
+ echo "SmartReflex" "VDD1=`cat $pwr/sr_vdd1_autocomp`, VDD2=`cat $pwr/sr_vdd2_autocomp`"
+ echo -n "ondemand: ignore nice load=" `cat $cfd/ignore_nice_load`
+ echo -n ", up threshold=" `cat $cfd/up_threshold`
+ echo ", sampling rate=" `cat $cfd/sampling_rate`
+ else
+ arg=$1
+ test -z "$arg" && arg=/etc/default/kernel-power
+ test `basename $arg` = $arg && arg=/home/user/.kernel/$arg
+ test $arg = /etc/default/kernel-power && test -L $arg && rm -f $arg
+ echo "saving to $arg"
+ echo "# kernel configuration file generated by $0" > $arg
+ echo "MINFREQ=$minfreq" >> $arg
+ echo "MAXFREQ=$maxfreq" >> $arg
+ echo "FREQS=$freqs" >> $arg
+ echo "SMARTREFLEX_VDD1=`cat $pwr/sr_vdd1_autocomp`" >> $arg
+ echo "SMARTREFLEX_VDD2=`cat $pwr/sr_vdd2_autocomp`" >> $arg
+ echo "IGNORE_NICE_LOAD=`cat $cfd/ignore_nice_load`" >> $arg
+ echo "UP_THRESHOLD=`cat $cfd/up_threshold`" >> $arg
+ echo "SAMPLING_RATE=`cat $cfd/sampling_rate`" >> $arg
+ fi
+ ;;
+load|loaddef)
+ test $cmd = loaddef || arg=$1
+ if test -z "$arg"; then
+ arg=/etc/default/kernel-power
+ test -f $arg || arg=/usr/share/kernel-power-settings/default
+ fi
+ if test `basename $arg` = $arg; then # not absolute
+ for p in . /home/user/.kernel /usr/share/kernel-power-settings; do
+ test -f $p/$arg && arg=$p/$arg && break
+ done
+ fi
+ if test ! -f "$arg"; then
+ echo "file not found $arg"
+ exit 1
+ fi
+ echo "loading $arg"
+ source $arg
+ if test -n "$VDD1_OPPS_VSEL" -o -n "$DSP_OPPS_RATE"; then
+ echo "warning: old configuration format detected. ignoring"
+ exit 1
+ fi
+ #echo $allfreq
+ #echo $vsel
+ #echo $rate
+ active=
+ minfreq=
+ maxfreq=
+ #echo $FREQS
+ for f in $FREQS; do
+ #echo processing $f
+ freq=`echo $f | cut -d: -f1`
+ f=`echo $f | cut -d: -f2`
+ volt=`echo $f | cut -d, -f1`
+ dsp=`echo $f | cut -d, -f2`
+ #echo freq $freq volt $volt dsp $dsp
+ if test ! $freq = 0; then
+ test -z "$minfreq" -o "$freq" -lt "$minfreq" && minfreq=$freq
+ test -z "$maxfreq" -o "$freq" -gt "$maxfreq" && maxfreq=$freq
+ freq=$((freq*1000))
+ case " $allfreq " in *" $freq "*) ;;
+ *) echo warning: $freq not supported; continue ;;
+ esac
+ active="$active $freq"
+ fi
+ test -z "$volt" && test -z "$dsp" && continue
+ tvsel=
+ trate=
+ cpvsel() { tvsel="$tvsel $1"; }
+ cprate() { trate="$trate $1"; }
+ for fr in 0 $allfreq; do
+ if test $fr = $freq; then
+ popvsel $vsel
+ poprate $rate
+ test -z "$volt" && volt=$curvsel
+ test -z "$dsp" && dsp=$currate
+ tvsel="$tvsel $volt $vsel"
+ trate="$trate $dsp $rate"
+ break
+ fi
+ popvsel $vsel
+ tvsel="$tvsel $curvsel"
+ poprate $rate
+ trate="$trate $currate"
+ done
+ vsel=$tvsel
+ rate=$trate
+ #echo $vsel
+ done
+ #echo vsel $vsel
+ #echo rate $rate
+ test -n "$MIN_FREQ" && minfreq=$MIN_FREQ
+ test -n "$MAX_FREQ" && maxfreq=$MAX_FREQ
+ test "$minfreq" -gt 100000 && minfreq=$((minfreq/1000))
+ test "$maxfreq" -gt 100000 && maxfreq=$((maxfreq/1000))
+ #echo $minfreq $maxfreq
+ avoid=
+ for f in $allfreq; do
+ if test "$f" -lt $((minfreq*1000)); then
+ avoid="$avoid $f"
+ continue
+ fi
+ case " $active " in *" $f "*) ;;
+ *) avoid="$avoid $f" ;;
+ esac
+ done
+ #echo $avoid
+ echo $avoid > $cdf/avoid_frequencies
+ echo $vsel > $pwr/vdd1_opps_vsel
+ echo $rates > $pwr/dsp_opps_rate
+ test $maxfreq = 600 && maxfreq=599
+ echo $((minfreq*1000)) > $cfr/scaling_min_freq
+ echo $((maxfreq*1000)) > $cfr/scaling_max_freq
+ test -n "$SMARTREFLEX_VDD1" && echo $SMARTREFLEX_VDD1 > $pwr/sr_vdd1_autocomp
+ test -n "$SMARTREFLEX_VDD2" && echo $SMARTREFLEX_VDD2 > $pwr/sr_vdd2_autocomp
+ test -n "$IGNORE_NICE_LOAD" && echo $IGNORE_NICE_LOAD > $cfd/ignore_nice_load
+ test -n "$UP_THRESHOLD" && echo $UP_THRESHOLD > $cfd/up_threshold
+ test -n "$SAMPLING_RATE" && echo $SAMPLING_RATE > $cfd/sampling_rate
+ echo "successfully loaded."
+ ;;
+setdefault)
+ arg=$1
+ if test -z "$arg"; then
+ echo "filename missing"
+ exit 1
+ fi
+ if test `basename $arg` = $arg; then # not absolute
+ for p in . /home/user/.kernel /usr/share/kernel-power-settings; do
+ test -f $p/$arg && arg=$p/$arg && break
+ done
+ fi
+ def=/etc/default/kernel-power
+ case $arg in
+ /usr/share/kernel-power-settings/*) ln -s $arg $def ;;
+ *) cp $arg $def ;;
+ esac
+ echo "defaults set to $arg"
+ ;;
+lock)
+ arg=$1
+ altfreq=
+ for f in $allfreq; do
+ test "$f" = "$arg" && continue
+ altfreq=$f
+ break
+ done
+ vsel=
+ dsp=
+ freq=$((arg*1000))
+ ifreq=
+ i=0
+ allfreq="0 $allfreq"
+ for f in $allfreq; do
+ i=$((i+1))
+ test $f = $freq || continue
+ ifreq=$i
+ break
+ done
+ if test -z "ifreq"; then
+ echo invalid frequency $freq
+ exit 1
+ fi
+ echo $ifreq $altfreq
+ test -f $cfd/avoid_frequencies && echo > $cfd/avoid_frequencies # enable all freqs
+ echo userspace > $cfr/scaling_governor
+ echo $altfreq > $cfr/scaling_setspeed # temporarily set alternative frequencies
+ volt=$2
+ if test -n "$volt"; then
+ i=0
+ vsel=
+ for v in `cat $pwr/vdd1_opps_vsel`; do
+ i=$((i+1))
+ test $i = $ifreq && v=$volt
+ vsel="$vsel $v"
+ done
+ echo $vsel
+ echo $vsel > $pwr/vdd1_opps_vsel
+ fi
+ dsp=$3
+ if test -n "$dsp"; then
+ i=0
+ dsp=
+ for r in `cat $pwr/dsp_opps_rate`; do
+ i=$((i+1))
+ test $i = $ifreq && r=$dsp
+ dsp="$dsp $r"
+ done
+ echo $dsp
+ echo $dsp > $pwr/dsp_opps_rate
+ fi
+ echo locking frequency $freq
+ echo $freq > $cfr/scaling_setspeed
+ ;;
+*)
+ echo "invalid command $cmd"
+ exit 1
+esac
+exit 0