return 0;
}
-/*
- * Get/Set maximum cpu frequency
- */
-int get_cpufreq_scaling_max_freq(unsigned int cpu)
+enum FUNC_TYPE {
+ FUNC_GET = 0,
+ FUNC_SET,
+};
+
+enum FREQ_TYPE {
+ CPUFREQ = 0,
+ BUSFREQ,
+ GPUFREQ,
+};
+
+enum FREQ_VALUE_TYPE {
+ FREQ_CUR = 0,
+ FREQ_MAX,
+ FREQ_MIN,
+ FREQ_TYPE_NUM,
+};
+
+static int handle_freq(enum FUNC_TYPE func_type,
+ enum FREQ_TYPE freq_type,
+ enum FREQ_VALUE_TYPE value_type,
+ char *dev_name, unsigned int cpu, unsigned int val)
{
+ static char cpufreq[FREQ_TYPE_NUM][BUFF_MAX] = {
+ "scaling_cur_freq",
+ "scaling_max_freq",
+ "scaling_min_freq" };
+ static char devfreq[FREQ_TYPE_NUM][BUFF_MAX] = {
+ "cur_freq",
+ "max_freq",
+ "min_freq" };
char path[BUFF_MAX];
- int online;
+ int freq = 0;
int ret;
- ret = sprintf(path,
- "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_max_freq", cpu);
- if (ret < 0)
+ switch (freq_type) {
+ case CPUFREQ:
+ ret = sprintf(path, "/sys/devices/system/cpu/cpu%d/cpufreq/%s",
+ cpu, cpufreq[value_type]);
+ if (ret < 0)
+ return -EINVAL;
+ break;
+ case BUSFREQ:
+ case GPUFREQ:
+ ret = sprintf(path, "/sys/class/devfreq/%s/%s",
+ dev_name, devfreq[value_type]);
+ if (ret < 0)
+ return -EINVAL;
+ break;
+ default:
return -EINVAL;
+ }
+
+ switch (func_type) {
+ case FUNC_GET:
+ ret = sys_get_int(path, &freq);
+ case FUNC_SET:
+ ret = sys_set_int(path, val);
+ default:
+ return -EINVAL;
+ };
- ret = sys_get_int(path, &online);
if (ret < 0)
return -EAGAIN;
-
- return online;
+ return freq;
}
-int set_cpufreq_scaling_max_freq(unsigned int cpu, int freq)
-{
- char path[BUFF_MAX];
- int ret;
+#define GET_FREQ(name, freq_type, val_type) \
+int name (unsigned int cpu, char *dev_name) { \
+ return handle_freq(FUNC_GET, freq_type, val_type, dev_name, cpu, 0); \
+} \
- ret = sprintf(path,
- "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_max_freq", cpu);
- if (ret < 0) {
- return -EINVAL;
- }
+#define SET_FREQ(name, freq_type, val_type) \
+int name (unsigned int cpu, char *dev_name, unsigned int val) { \
+ return handle_freq(FUNC_SET, freq_type, val_type, dev_name, cpu, val); \
+} \
- ret = sys_set_int(path, freq);
- if (ret < 0) {
- return -EAGAIN;
- }
+/* Get/Set the max/min/curr frequenc for CPU */
+GET_FREQ(get_cpufreq_max_freq, CPUFREQ, FREQ_MAX);
+GET_FREQ(get_cpufreq_min_freq, CPUFREQ, FREQ_MIN);
+GET_FREQ(get_cpufreq_cur_freq, CPUFREQ, FREQ_CUR);
- return 0;
-}
+SET_FREQ(set_cpufreq_max_freq, CPUFREQ, FREQ_MAX);
+SET_FREQ(set_cpufreq_min_freq, CPUFREQ, FREQ_MIN);
+SET_FREQ(set_cpufreq_cur_freq, CPUFREQ, FREQ_CUR);
-int get_cpufreq_scaling_min_freq(unsigned int cpu)
-{
- char path[BUFF_MAX];
- int online;
- int ret;
+/* Get/Set the max/min/curr frequenc for memory bus */
+GET_FREQ(get_busfreq_max_freq, BUSFREQ, FREQ_MAX);
+GET_FREQ(get_busfreq_min_freq, BUSFREQ, FREQ_MIN);
+GET_FREQ(get_busfreq_cur_freq, BUSFREQ, FREQ_CUR);
- ret = sprintf(path,
- "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_min_freq", cpu);
- if (ret < 0)
- return -EINVAL;
+SET_FREQ(set_busfreq_max_freq, BUSFREQ, FREQ_MAX);
+SET_FREQ(set_busfreq_min_freq, BUSFREQ, FREQ_MIN);
+SET_FREQ(set_busfreq_cur_freq, BUSFREQ, FREQ_CUR);
- ret = sys_get_int(path, &online);
- if (ret < 0)
- return -EAGAIN;
+/* Get/Set the max/min/curr frequenc for GPU */
+GET_FREQ(get_gpufreq_max_freq, GPUFREQ, FREQ_MAX);
+GET_FREQ(get_gpufreq_min_freq, GPUFREQ, FREQ_MIN);
+GET_FREQ(get_gpufreq_cur_freq, GPUFREQ, FREQ_CUR);
- return online;
-}
+SET_FREQ(set_gpufreq_max_freq, GPUFREQ, FREQ_MAX);
+SET_FREQ(set_gpufreq_min_freq, GPUFREQ, FREQ_MIN);
+SET_FREQ(set_gpufreq_cur_freq, GPUFREQ, FREQ_CUR);
-int set_cpufreq_scaling_min_freq(unsigned int cpu, int freq)
+/*
+ * Get/Set maximum cpu frequency
+ */
+int get_cpufreq_scaling_max_freq(unsigned int cpu)
{
- char path[BUFF_MAX];
- int ret;
+ return get_cpufreq_max_freq(cpu, NULL);
+}
- ret = sprintf(path,
- "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_min_freq", cpu);
- if (ret < 0) {
- return -EINVAL;
- }
+int set_cpufreq_scaling_max_freq(unsigned int cpu, int freq)
+{
+ return set_cpufreq_max_freq(cpu, NULL, freq);
+}
- ret = sys_set_int(path, freq);
- if (ret < 0) {
- return -EAGAIN;
- }
+int get_cpufreq_scaling_min_freq(unsigned int cpu)
+{
+ return get_cpufreq_min_freq(cpu, NULL);
+}
- return 0;
+int set_cpufreq_scaling_min_freq(unsigned int cpu, int freq)
+{
+ return set_cpufreq_min_freq(cpu, NULL, freq);
}
int get_cpu_online(unsigned int cpu)