diff --git a/drivers/gpu/arm/bifrost/mali_kbase_core_linux.c b/drivers/gpu/arm/bifrost/mali_kbase_core_linux.c index ea56af77b2c5..879203a087cf 100644 --- a/drivers/gpu/arm/bifrost/mali_kbase_core_linux.c +++ b/drivers/gpu/arm/bifrost/mali_kbase_core_linux.c @@ -5391,6 +5391,11 @@ static int kbase_device_suspend(struct device *dev) flush_workqueue(kbdev->devfreq_queue.workq); } #endif + if (kbdev->is_runtime_resumed) { + if (kbdev->pm.backend.callback_power_runtime_off) + kbdev->pm.backend.callback_power_runtime_off(kbdev); + } + return 0; } @@ -5410,6 +5415,11 @@ static int kbase_device_resume(struct device *dev) if (!kbdev) return -ENODEV; + if (kbdev->is_runtime_resumed) { + if (kbdev->pm.backend.callback_power_runtime_on) + kbdev->pm.backend.callback_power_runtime_on(kbdev); + } + kbase_pm_resume(kbdev); #ifdef CONFIG_MALI_BIFROST_DVFS @@ -5469,6 +5479,7 @@ static int kbase_device_runtime_suspend(struct device *dev) if (kbdev->pm.backend.callback_power_runtime_off) { kbdev->pm.backend.callback_power_runtime_off(kbdev); + kbdev->is_runtime_resumed = false; dev_dbg(dev, "runtime suspend\n"); } return ret; @@ -5498,6 +5509,7 @@ static int kbase_device_runtime_resume(struct device *dev) // KBASE_KTRACE_ADD(kbdev, PM_RUNTIME_RESUME_CALLBACK, NULL, 0); if (kbdev->pm.backend.callback_power_runtime_on) { ret = kbdev->pm.backend.callback_power_runtime_on(kbdev); + kbdev->is_runtime_resumed = true; dev_dbg(dev, "runtime resume\n"); } diff --git a/drivers/gpu/arm/bifrost/mali_kbase_defs.h b/drivers/gpu/arm/bifrost/mali_kbase_defs.h index 04e80e48d384..301c78393728 100755 --- a/drivers/gpu/arm/bifrost/mali_kbase_defs.h +++ b/drivers/gpu/arm/bifrost/mali_kbase_defs.h @@ -1073,6 +1073,7 @@ struct kbase_device { struct mutex kctx_list_lock; struct rockchip_opp_info opp_info; + bool is_runtime_resumed; #ifdef CONFIG_MALI_BIFROST_DEVFREQ struct devfreq_dev_profile devfreq_profile; struct devfreq *devfreq;