#define DEVFREQ_BUS_CURR_FREQ_PATH_SUFFIX "/cur_freq"
#define DEVFREQ_BUS_MIN_FREQ_PATH_SUFFIX "/min_freq"
#define DEVFREQ_BUS_MAX_FREQ_PATH_SUFFIX "/max_freq"
+#define DEVFREQ_BUS_AVAILABLE_FREQ_PATH_SUFFIX "/available_frequencies"
static int standard_dvfs_get_curr_governor(char *res_name, char *governor)
{
return 0;
}
+static int standard_dvfs_get_available_min_freq(char *res_name)
+{
+ char path[PATH_MAX];
+ char buf[MAX_BUF_SIZE];
+ char *p;
+ int ret;
+
+ if (!res_name)
+ return -EINVAL;
+
+ snprintf(path, PATH_MAX, "%s%s%s",
+ DEVFREQ_BUS_PATH_PREFIX,
+ res_name,
+ DEVFREQ_BUS_AVAILABLE_FREQ_PATH_SUFFIX);
+
+ ret = sysfs_read_str(path, buf, MAX_BUF_SIZE);
+ if (ret < 0)
+ return ret;
+
+ p = strchr(buf, ' ');
+ if (p)
+ *p = '\0';
+
+ ret = strtoul(buf, NULL, 10);
+ if (!ret)
+ return -EINVAL;
+
+ return ret;
+}
+
+static int standard_dvfs_get_available_max_freq(char *res_name)
+{
+ char path[PATH_MAX];
+ char buf[MAX_BUF_SIZE];
+ char *p;
+ int ret;
+
+ if (!res_name)
+ return -EINVAL;
+
+ snprintf(path, PATH_MAX, "%s%s%s",
+ DEVFREQ_BUS_PATH_PREFIX,
+ res_name,
+ DEVFREQ_BUS_AVAILABLE_FREQ_PATH_SUFFIX);
+
+ ret = sysfs_read_str(path, buf, MAX_BUF_SIZE);
+ if (ret < 0)
+ return ret;
+
+ p = strrchr(buf, ' ');
+ p = p ? p + 1 : buf;
+
+ ret = strtoul(p, NULL, 10);
+ if (!ret)
+ return -EINVAL;
+
+ return ret;
+}
static struct pass_resource_dvfs_ops standard_bus_dvfs_ops = {
.get_curr_governor = standard_dvfs_get_curr_governor,
.set_min_freq = standard_dvfs_set_min_freq,
.get_max_freq = standard_dvfs_get_max_freq,
.set_max_freq = standard_dvfs_set_max_freq,
+ .get_available_min_freq = standard_dvfs_get_available_min_freq,
+ .get_available_max_freq = standard_dvfs_get_available_max_freq,
};
static int standard_bus_open(char *res_name, struct pass_resource_info *info,
* and scaling_cur_freq is the CPU frequency set by the CPUFREQ policy.
*/
#define CPUFREQ_CURR_FREQ_PATH_SUFFIX "/cpufreq/cpuinfo_cur_freq"
+#define CPUFREQ_AVAILABLE_MIN_FREQ_PATH_SUFFIX "/cpufreq/cpuinfo_min_freq"
+#define CPUFREQ_AVAILABLE_MAX_FREQ_PATH_SUFFIX "/cpufreq/cpuinfo_max_freq"
#define CPUFREQ_MIN_FREQ_PATH_SUFFIX "/cpufreq/scaling_min_freq"
#define CPUFREQ_MAX_FREQ_PATH_SUFFIX "/cpufreq/scaling_max_freq"
#define CPUFREQ_UP_THRESHOLD_PATH_SUFFIX "/cpufreq/ondemand/up_threshold"
return 0;
}
+static int standard_dvfs_get_available_min_freq(char *res_name)
+{
+ char path[PATH_MAX];
+ int val, ret;
+
+ if (!res_name)
+ return -EINVAL;
+
+ snprintf(path, PATH_MAX, "%s%s%s",
+ CPUFREQ_PATH_PREFIX,
+ res_name,
+ CPUFREQ_AVAILABLE_MIN_FREQ_PATH_SUFFIX);
+
+ ret = sysfs_read_int(path, &val);
+ if (ret < 0)
+ return ret;
+
+ return val;
+}
+
+
+static int standard_dvfs_get_available_max_freq(char *res_name)
+{
+ char path[PATH_MAX];
+ int val, ret;
+
+ if (!res_name)
+ return -EINVAL;
+
+ snprintf(path, PATH_MAX, "%s%s%s",
+ CPUFREQ_PATH_PREFIX,
+ res_name,
+ CPUFREQ_AVAILABLE_MAX_FREQ_PATH_SUFFIX);
+
+ ret = sysfs_read_int(path, &val);
+ if (ret < 0)
+ return ret;
+
+ return val;
+}
+
static int standard_dvfs_get_up_threshold(char *res_name)
{
char path[PATH_MAX];
.set_min_freq = standard_dvfs_set_min_freq,
.get_max_freq = standard_dvfs_get_max_freq,
.set_max_freq = standard_dvfs_set_max_freq,
+ .get_available_min_freq = standard_dvfs_get_available_min_freq,
+ .get_available_max_freq = standard_dvfs_get_available_max_freq,
.get_up_threshold = standard_dvfs_get_up_threshold,
.set_up_threshold = standard_dvfs_set_up_threshold,
};