blob: cc50c93d881b4dc14a475e0071c6fad34938bfb6 [file] [log] [blame]
#!/bin/sh
version="1.5.1"
base_path=/sys/bus/usb/devices
query_mode=true
as_control=
timeout=
control_mask=".*"
runtime_status_mask=".*"
recursive=false
usage()
{
echo "USB power management utility $version"
echo "Usage: pmusb [OPTIONS] [DEVICES]"
echo " -r - recursive (including all the children)"
echo " -m MODE - on|auto. If omitted, status is displayed (query mode)"
echo " -t TIMEOUT - autosuspend timeout in seconds"
echo " -c CMASK - control file mask (query mode only)"
echo " -s SMASK - runtime status file mask (query mode only)"
echo " -t TIMEOUT - autosuspend timeout in seconds"
echo " DEVICES - names of USB device (usb1, usb2, usb1/1-1 ...). If omitted, all devices"
}
as_control()
{
local dev_path=${1%%/.}
local dev_name=`basename $dev_path`;
autosuspend_file=$dev_path/power/autosuspend
control_file=$dev_path/power/control
level_file=$dev_path/power/level
runtime_status_file=$dev_path/power/runtime_status
[ ! -f $control_file ] && control_file=$level_file
if [ -f "$control_file" -o -f "$level_file" ] ; then
supported_device=1
if [ -f "$runtime_status_file" ] ; then
[ ! -z `grep 'active\|suspended' $runtime_status_file` ] || supported_device=
fi
if [ ! -z "$supported_device" ] ; then
if [ "$query_mode" = "true" ] ; then
filter_out=0
[ -z "`grep $control_mask $control_file`" ] && filter_out=1
if [ -f "$runtime_status_file" ] ; then
[ -z "`grep $runtime_status_mask $runtime_status_file`" ] && filter_out=1
fi
if [ $filter_out -eq 0 ] ; then
echo "$dev_name ($dev_path):"
if [ -r "$control_file" ] ; then
echo -n " control : " ; cat $control_file
fi
if [ -r "$runtime_status_file" ] ; then
echo -n " runtime_status: " ; cat $runtime_status_file
fi
if [ -r "$autosuspend_file" ] ; then
echo -n " autosuspend : " ; cat $autosuspend_file
fi
fi
else
[ -f "$autosuspend_file" -a ! -z "$timeout" ] && echo $timeout > $autosuspend_file
if [ ! -z "$as_control" ] ; then
[ -w "$control_file" ] && echo $as_control > $control_file
fi
fi
fi
fi
}
while getopts "m:t:h?rc:s:" option
do
case $option in
m)
query_mode=false
as_control=$OPTARG
if [ ! "$as_control" = "auto" -a ! "$as_control" = "on" ] ; then
usage
exit 1
fi
;;
r)
recursive=true ;;
c)
control_mask=$OPTARG ;;
s)
runtime_status_mask=$OPTARG ;;
t)
query_mode=false
timeout=$OPTARG ;;
h|?|*)
usage
exit 1 ;;
esac
done
# the rest are device names
shift $(($OPTIND-1));
# no pushd/popd in ash
save_pwd=`pwd`
cd $base_path
if [ -z "$1" ] ; then
# all usb controllers
dev_name_list=`ls -d usb*`
else
# some usb controllers
dev_name_list="$*"
fi
for dev_name in $dev_name_list ; do
if [ "$recursive" = "true" ] ; then
save_pwd2=`pwd`
cd $base_path/$dev_name
ch_dev_name_list=`find . -type d`
for ch_dev_name in $ch_dev_name_list ; do
as_control $base_path/$dev_name/$ch_dev_name
done
cd $save_pwd2
else
as_control $base_path/$dev_name
fi
done
cd $save_pwd