diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.h index 6221afe796de..123c58cb030f 100644 --- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.h +++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.h @@ -25,7 +25,6 @@ int kbase_devfreq_init(struct kbase_device *kbdev); void kbase_devfreq_term(struct kbase_device *kbdev); -int kbase_platform_rk_init_opp_table(struct kbase_device *kbdev); int kbase_devfreq_opp_helper(struct dev_pm_set_opp_data *data); /** diff --git a/drivers/gpu/arm/bifrost/mali_kbase_core_linux.c b/drivers/gpu/arm/bifrost/mali_kbase_core_linux.c index 879203a087cf..7e165311550b 100644 --- a/drivers/gpu/arm/bifrost/mali_kbase_core_linux.c +++ b/drivers/gpu/arm/bifrost/mali_kbase_core_linux.c @@ -5391,10 +5391,17 @@ static int kbase_device_suspend(struct device *dev) flush_workqueue(kbdev->devfreq_queue.workq); } #endif + +#ifdef CONFIG_ARCH_ROCKCHIP + kbase_platform_rk_enable_regulator(kbdev); +#endif + +#ifdef KBASE_PM_RUNTIME if (kbdev->is_runtime_resumed) { if (kbdev->pm.backend.callback_power_runtime_off) kbdev->pm.backend.callback_power_runtime_off(kbdev); } +#endif /* KBASE_PM_RUNTIME */ return 0; } @@ -5415,10 +5422,12 @@ static int kbase_device_resume(struct device *dev) if (!kbdev) return -ENODEV; +#ifdef KBASE_PM_RUNTIME if (kbdev->is_runtime_resumed) { if (kbdev->pm.backend.callback_power_runtime_on) kbdev->pm.backend.callback_power_runtime_on(kbdev); } +#endif /* KBASE_PM_RUNTIME */ kbase_pm_resume(kbdev); diff --git a/drivers/gpu/arm/bifrost/platform/rk/mali_kbase_config_platform.h b/drivers/gpu/arm/bifrost/platform/rk/mali_kbase_config_platform.h index 24733bfa8537..a2c93fa69e67 100755 --- a/drivers/gpu/arm/bifrost/platform/rk/mali_kbase_config_platform.h +++ b/drivers/gpu/arm/bifrost/platform/rk/mali_kbase_config_platform.h @@ -88,3 +88,6 @@ extern struct kbase_platform_funcs_conf platform_funcs; #define CLK_RATE_TRACE_OPS (&clk_rate_trace_ops) extern struct kbase_clk_rate_trace_op_conf clk_rate_trace_ops; + +int kbase_platform_rk_init_opp_table(struct kbase_device *kbdev); +int kbase_platform_rk_enable_regulator(struct kbase_device *kbdev); diff --git a/drivers/gpu/arm/bifrost/platform/rk/mali_kbase_config_rk.c b/drivers/gpu/arm/bifrost/platform/rk/mali_kbase_config_rk.c index 53c5a86d016e..bf991ca608f1 100755 --- a/drivers/gpu/arm/bifrost/platform/rk/mali_kbase_config_rk.c +++ b/drivers/gpu/arm/bifrost/platform/rk/mali_kbase_config_rk.c @@ -34,6 +34,7 @@ #include #include +#include "mali_kbase_config_platform.h" #include "mali_kbase_rk.h" #define POWER_DOWN_FREQ 200000000 @@ -105,6 +106,7 @@ static void rk_pm_power_off_delay_work(struct work_struct *work) rk_pm_disable_clk(kbdev); rk_pm_disable_regulator(kbdev); + platform->is_regulator_on = false; platform->is_powered = false; wake_unlock(&platform->wake_lock); @@ -243,11 +245,14 @@ static int rk_pm_callback_power_on(struct kbase_device *kbdev) } /* we must enable vdd_gpu before pd_gpu_in_chip. */ - err = rk_pm_enable_regulator(kbdev); - if (err) { - E("fail to enable regulator, err : %d.", err); - ret = err; - goto out; + if (!platform->is_regulator_on) { + err = rk_pm_enable_regulator(kbdev); + if (err) { + E("fail to enable regulator, err : %d.", err); + ret = err; + goto out; + } + platform->is_regulator_on = true; } err = rk_pm_enable_clk(kbdev); @@ -554,6 +559,23 @@ int kbase_platform_rk_init_opp_table(struct kbase_device *kbdev) "gpu_leakage", "mali"); } +int kbase_platform_rk_enable_regulator(struct kbase_device *kbdev) +{ + struct rk_context *platform = get_rk_context(kbdev); + int err = 0; + + if (!platform->is_regulator_on) { + err = rk_pm_enable_regulator(kbdev); + if (err) { + E("fail to enable regulator, err : %d.", err); + return err; + } + platform->is_regulator_on = true; + } + + return 0; +} + /*---------------------------------------------------------------------------*/ static void *enumerate_gpu_clk(struct kbase_device *kbdev, diff --git a/drivers/gpu/arm/bifrost/platform/rk/mali_kbase_rk.h b/drivers/gpu/arm/bifrost/platform/rk/mali_kbase_rk.h index df72b84022f3..0a42559df2bf 100755 --- a/drivers/gpu/arm/bifrost/platform/rk/mali_kbase_rk.h +++ b/drivers/gpu/arm/bifrost/platform/rk/mali_kbase_rk.h @@ -33,6 +33,8 @@ struct rk_context { */ bool is_powered; + bool is_regulator_on; + struct kbase_device *kbdev; struct workqueue_struct *power_off_wq;