static ssize_t set_clock(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { unsigned int clk = 0; int ret, i, policy_count; static bool cur_state; const struct kbase_pm_policy *const *policy_list; static const struct kbase_pm_policy *prev_policy; static bool prev_tmu_status = true; #ifdef CONFIG_MALI_DVFS static bool prev_dvfs_status = true; #endif /* CONFIG_MALI_DVFS */ struct exynos_context *platform = (struct exynos_context *)pkbdev->platform_context; if (!platform) return -ENODEV; ret = kstrtoint(buf, 0, &clk); if (ret) { GPU_LOG(DVFS_WARNING, DUMMY, 0u, 0u, "%s: invalid value\n", __func__); return -ENOENT; } if (!cur_state) { prev_tmu_status = platform->tmu_status; #ifdef CONFIG_MALI_DVFS prev_dvfs_status = platform->dvfs_status; #endif /* CONFIG_MALI_DVFS */ prev_policy = kbase_pm_get_policy(pkbdev); } if (clk == 0) { kbase_pm_set_policy(pkbdev, prev_policy); platform->tmu_status = prev_tmu_status; #ifdef CONFIG_MALI_DVFS if (!platform->dvfs_status) gpu_dvfs_on_off(true); #endif /* CONFIG_MALI_DVFS */ cur_state = false; } else { policy_count = kbase_pm_list_policies(&policy_list); for (i = 0; i < policy_count; i++) { if (sysfs_streq(policy_list[i]->name, "always_on")) { kbase_pm_set_policy(pkbdev, policy_list[i]); break; } } platform->tmu_status = false; #ifdef CONFIG_MALI_DVFS if (platform->dvfs_status) gpu_dvfs_on_off(false); #endif /* CONFIG_MALI_DVFS */ gpu_set_target_clk_vol(clk, false); cur_state = true; } return count; }
static void kbase_platform_set_policy(struct kbase_device *kbdev, const char *buf) { const struct kbase_pm_policy *new_policy = NULL; const struct kbase_pm_policy *const *policy_list; int policy_count; int i; policy_count = kbase_pm_list_policies(&policy_list); for (i = 0; i < policy_count; i++) { if (sysfs_streq(policy_list[i]->name, buf)) { new_policy = policy_list[i]; break; } } if (new_policy) { kbase_pm_set_policy(kbdev, new_policy); } }