#!/bin/bash

if [ "$1" = "--help" ] ; then
	echo "Usage: cpugov [new_governor [new_speed]]"
	echo "If no arguments are supplied, the current governor is returned."
	echo "new_speed applies only if new_governor is userspace."
	exit
fi

CPUGOV_FILENAME="/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"
CPUSETSPEED_FILENAME="/sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed"
CPUGETSPEED_FILENAME="/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq"

OLDGOV=`cat $CPUGOV_FILENAME`
OLDSPEED=`cat $CPUGETSPEED_FILENAME 2> /dev/null`
WANT_NEWGOV=$1
WANT_NEWSPEED=$2
if [ -n "$WANT_NEWSPEED" ] ; then
	WANT_NEWSPEED=`expr $WANT_NEWSPEED \* 1000`
fi

# Let the user know if the operation is going to have no effect.
if [ "$WANT_NEWGOV" = "$OLDGOV" -a "$WANT_NEWSPEED" = "$OLDSPEED" ] ; then
	if [ -n "$WANT_NEWSPEED" ] ; then
		echo "Speed unchanged."
	else
		echo "Governor unchanged."
	fi
	exit
fi

# Set new governor and speed if desired.
if [ -n "$WANT_NEWGOV" ] ; then
	echo $WANT_NEWGOV > $CPUGOV_FILENAME
	if [ -n "$WANT_NEWSPEED" ] ; then
		if [ -w $CPUSETSPEED_FILENAME ] ; then
			echo $WANT_NEWSPEED > $CPUSETSPEED_FILENAME
		else
			echo "Unable to change speed."
		fi
	fi
fi

# Read new governer and speed.
NEWGOV=`cat $CPUGOV_FILENAME`
NEWSPEED=`cat $CPUGETSPEED_FILENAME 2> /dev/null`

# If they were trying to set the new governor, make sure it worked.
if [ -n "$WANT_NEWGOV" ] ; then
	if [ "$NEWGOV" != "$WANT_NEWGOV" ] ; then
		echo "Governor NOT set!"
		echo -n "Current governor: "
	else
		echo -n "OK: "
	fi
fi

# Show the new governor and speed.
echo -n $NEWGOV
[ $NEWGOV == "userspace" -o $NEWGOV == "ondemand" ] && echo -n " "`expr $NEWSPEED / 1000`"MHz"
echo

