diff options
Diffstat (limited to 'cpufreq.c')
-rw-r--r-- | cpufreq.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/cpufreq.c b/cpufreq.c new file mode 100644 index 0000000..d9e0e4e --- /dev/null +++ b/cpufreq.c @@ -0,0 +1,82 @@ +#include <fcntl.h> +#include <sys/syscall.h> +#include <unistd.h> +#include <string.h> +#include <stdio.h> +#include "debug.h" +#include "sysfs.h" + +#define DIR_BUF_SIZE 1024 + +int cpufreq_is_cpu(char *name) +{ + if (strncmp(name,"cpu",3)!=0) return 0; + if ((name[3]<'0') || (name[3]>'9')) return 0; + + return 1; +} + +int cpufreq_set_str(char *parameter,char *value,int checkdelay) +{ + int fd; + char sysfs_file[128]; + + DEBUG1_CPUFREQ("Set %s to %s\n",parameter,value) + + char buf[DIR_BUF_SIZE]; + long nread; + + struct linux_dirent { + unsigned long d_ino; + off_t d_off; + unsigned short d_reclen; + char d_name[]; + }; + + struct linux_dirent *d; + size_t bpos; + + fd=open("/sys/devices/system/cpu",O_RDONLY|O_DIRECTORY); + if (fd==-1) + { + DEBUG1_CPUFREQ("Unable to find CPU's\n"); + return -1; + } + + while(1) + { + nread=syscall(SYS_getdents,fd,buf,DIR_BUF_SIZE); + if (nread==-1) + { + DEBUG1_CPUFREQ("Unable to find CPU's\n"); + close(fd); + return -1; + } + if (nread==0) break; + + for(bpos=0;bpos<nread;) + { + d=(struct linux_dirent *)(buf+bpos); + if (cpufreq_is_cpu(d->d_name)) + { + DEBUG2_CPUFREQ("Found CPU %s\n",d->d_name); + snprintf(sysfs_file,128,"/sys/devices/system/cpu/%s/cpufreq/%s",d->d_name,parameter); + if (sysfs_write_str(sysfs_file,value,checkdelay)!=0) + { + DEBUG1_CPUFREQ("Failed to set %s\n",d->d_name); + return -1; + } + } + bpos+=d->d_reclen; + } + } + close(fd); +} + +int cpufreq_set_long_int(char *parameter,long int value,int checkdelay) +{ + char buf[255]; + + snprintf(buf,255,"%ld",value); + cpufreq_set_str(parameter,buf,checkdelay); +} |