#!/bin/bash

if [ -a /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed ]; then
  for cpu in `ls --color=none /sys/devices/system/cpu/`; do
    freq=$1
    if [ -a /sys/devices/system/cpu/$cpu/cpufreq/scaling_available_frequencies ]; then
        avail_freq=`cat /sys/devices/system/cpu/$cpu/cpufreq/scaling_available_frequencies`
        delta_opt=999999999
        max_freq=0
        for af in $avail_freq; do
            delta=$(($1-$af))
            if [ $delta -lt 0 ]; then
                delta=$((-$delta))
            fi
            if [ $delta -lt $delta_opt ]; then
                delta_opt=$delta
                freq=$af
            fi
            if [ $af -ge $max_freq ]; then
                max_freq=$af
            fi
        done
        if [ $freq -gt $max_freq ]; then
            freq=$max_freq
        fi
    else
        max_freq=`cat /sys/devices/system/cpu/$cpu/cpufreq/scaling_max_freq`
        if [ $freq -gt $max_freq ]; then
            freq=$max_freq
        fi
        min_freq=`cat /sys/devices/system/cpu/$cpu/cpufreq/scaling_min_freq`
        if [ $freq -lt $min_freq ]; then
            freq=$min_freq
        fi
    fi
    echo $freq > /sys/devices/system/cpu/$cpu/cpufreq/scaling_setspeed
  done
elif [ -a /proc/sys/cpu/0/speed ]; then
  for cpu in `ls --color=none /proc/sys/cpu/`; do
    freq=$1
    max_freq=`cat /proc/sys/cpu/$cpu/speed-max`
    if [ "$max_freq" != "" ]; then
        if [ "$max_freq" != "0" ]; then
            if [ $freq -gt $max_freq ]; then
                freq=$max_freq
            fi
        fi
    fi
    min_freq=`cat /proc/sys/cpu/$cpu/speed-min`
    if [ "$min_freq" != "" ]; then
        if [ $freq -lt $min_freq ]; then
            freq=$min_freq
        fi
    fi
    echo $freq > /proc/sys/cpu/$cpu/speed
  done
fi
