diff options
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_mixer.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c index 4c5aed7e54c8..c00abbe3cd13 100644 --- a/drivers/gpu/drm/exynos/exynos_mixer.c +++ b/drivers/gpu/drm/exynos/exynos_mixer.c | |||
@@ -1061,7 +1061,7 @@ static void mixer_poweron(struct exynos_drm_manager *mgr) | |||
1061 | mutex_unlock(&ctx->mixer_mutex); | 1061 | mutex_unlock(&ctx->mixer_mutex); |
1062 | return; | 1062 | return; |
1063 | } | 1063 | } |
1064 | ctx->powered = true; | 1064 | |
1065 | mutex_unlock(&ctx->mixer_mutex); | 1065 | mutex_unlock(&ctx->mixer_mutex); |
1066 | 1066 | ||
1067 | pm_runtime_get_sync(ctx->dev); | 1067 | pm_runtime_get_sync(ctx->dev); |
@@ -1072,6 +1072,10 @@ static void mixer_poweron(struct exynos_drm_manager *mgr) | |||
1072 | clk_prepare_enable(res->sclk_mixer); | 1072 | clk_prepare_enable(res->sclk_mixer); |
1073 | } | 1073 | } |
1074 | 1074 | ||
1075 | mutex_lock(&ctx->mixer_mutex); | ||
1076 | ctx->powered = true; | ||
1077 | mutex_unlock(&ctx->mixer_mutex); | ||
1078 | |||
1075 | mixer_reg_write(res, MXR_INT_EN, ctx->int_en); | 1079 | mixer_reg_write(res, MXR_INT_EN, ctx->int_en); |
1076 | mixer_win_reset(ctx); | 1080 | mixer_win_reset(ctx); |
1077 | 1081 | ||
@@ -1084,14 +1088,20 @@ static void mixer_poweroff(struct exynos_drm_manager *mgr) | |||
1084 | struct mixer_resources *res = &ctx->mixer_res; | 1088 | struct mixer_resources *res = &ctx->mixer_res; |
1085 | 1089 | ||
1086 | mutex_lock(&ctx->mixer_mutex); | 1090 | mutex_lock(&ctx->mixer_mutex); |
1087 | if (!ctx->powered) | 1091 | if (!ctx->powered) { |
1088 | goto out; | 1092 | mutex_unlock(&ctx->mixer_mutex); |
1093 | return; | ||
1094 | } | ||
1089 | mutex_unlock(&ctx->mixer_mutex); | 1095 | mutex_unlock(&ctx->mixer_mutex); |
1090 | 1096 | ||
1091 | mixer_window_suspend(mgr); | 1097 | mixer_window_suspend(mgr); |
1092 | 1098 | ||
1093 | ctx->int_en = mixer_reg_read(res, MXR_INT_EN); | 1099 | ctx->int_en = mixer_reg_read(res, MXR_INT_EN); |
1094 | 1100 | ||
1101 | mutex_lock(&ctx->mixer_mutex); | ||
1102 | ctx->powered = false; | ||
1103 | mutex_unlock(&ctx->mixer_mutex); | ||
1104 | |||
1095 | clk_disable_unprepare(res->mixer); | 1105 | clk_disable_unprepare(res->mixer); |
1096 | if (ctx->vp_enabled) { | 1106 | if (ctx->vp_enabled) { |
1097 | clk_disable_unprepare(res->vp); | 1107 | clk_disable_unprepare(res->vp); |
@@ -1099,12 +1109,6 @@ static void mixer_poweroff(struct exynos_drm_manager *mgr) | |||
1099 | } | 1109 | } |
1100 | 1110 | ||
1101 | pm_runtime_put_sync(ctx->dev); | 1111 | pm_runtime_put_sync(ctx->dev); |
1102 | |||
1103 | mutex_lock(&ctx->mixer_mutex); | ||
1104 | ctx->powered = false; | ||
1105 | |||
1106 | out: | ||
1107 | mutex_unlock(&ctx->mixer_mutex); | ||
1108 | } | 1112 | } |
1109 | 1113 | ||
1110 | static void mixer_dpms(struct exynos_drm_manager *mgr, int mode) | 1114 | static void mixer_dpms(struct exynos_drm_manager *mgr, int mode) |