@@ -45,8 +45,6 @@ struct drm_hdmi_context {
struct exynos_drm_subdrv subdrv;
struct exynos_drm_hdmi_context *hdmi_ctx;
struct exynos_drm_hdmi_context *mixer_ctx;
-
- bool enabled[MIXER_WIN_NR];
};
int exynos_platform_device_hdmi_register(void)
@@ -250,16 +248,11 @@ static void drm_hdmi_dpms(struct device *subdrv_dev, int mode)
static void drm_hdmi_apply(struct device *subdrv_dev)
{
struct drm_hdmi_context *ctx = to_context(subdrv_dev);
- int i;
DRM_DEBUG_KMS("%s\n", __FILE__);
- for (i = 0; i < MIXER_WIN_NR; i++) {
- if (!ctx->enabled[i])
- continue;
- if (mixer_ops && mixer_ops->win_commit)
- mixer_ops->win_commit(ctx->mixer_ctx->ctx, i);
- }
+ if (mixer_ops && mixer_ops->apply)
+ mixer_ops->apply(ctx->mixer_ctx->ctx);
if (hdmi_ops && hdmi_ops->commit)
hdmi_ops->commit(ctx->hdmi_ctx->ctx);
@@ -302,8 +295,6 @@ static void drm_mixer_commit(struct device *subdrv_dev, int zpos)
if (mixer_ops && mixer_ops->win_commit)
mixer_ops->win_commit(ctx->mixer_ctx->ctx, win);
-
- ctx->enabled[win] = true;
}
static void drm_mixer_disable(struct device *subdrv_dev, int zpos)
@@ -320,8 +311,6 @@ static void drm_mixer_disable(struct device *subdrv_dev, int zpos)
if (mixer_ops && mixer_ops->win_disable)
mixer_ops->win_disable(ctx->mixer_ctx->ctx, win);
-
- ctx->enabled[win] = false;
}
static struct exynos_drm_overlay_ops drm_hdmi_overlay_ops = {
@@ -58,6 +58,7 @@ struct exynos_mixer_ops {
void (*win_mode_set)(void *ctx, struct exynos_drm_overlay *overlay);
void (*win_commit)(void *ctx, int zpos);
void (*win_disable)(void *ctx, int zpos);
+ void (*apply)(void *ctx);
};
void exynos_hdmi_drv_attach(struct exynos_drm_hdmi_context *ctx);
@@ -810,6 +810,20 @@ static void mixer_win_disable(void *ctx, int win)
mixer_ctx->win_data[win].enabled = false;
}
+static void mixer_apply(void *ctx)
+{
+ struct mixer_context *mixer_ctx = ctx;
+ int i;
+
+ DRM_DEBUG_KMS("%s\n", __FILE__);
+
+ for (i = 0; i < MIXER_WIN_NR; i++) {
+ struct hdmi_win_data *win_data = &mixer_ctx->win_data[i];
+ if (win_data->enabled)
+ mixer_win_commit(ctx, i);
+ }
+}
+
static void mixer_wait_for_vblank(void *ctx)
{
struct mixer_context *mixer_ctx = ctx;
@@ -841,7 +855,8 @@ static void mixer_window_suspend(struct mixer_context *ctx)
for (i = 0; i < MIXER_WIN_NR; i++) {
win_data = &ctx->win_data[i];
win_data->resume = win_data->enabled;
- mixer_win_disable(ctx, i);
+ if (win_data->enabled)
+ mixer_win_disable(ctx, i);
}
mixer_wait_for_vblank(ctx);
}
@@ -947,6 +962,7 @@ static struct exynos_mixer_ops mixer_ops = {
.win_mode_set = mixer_win_mode_set,
.win_commit = mixer_win_commit,
.win_disable = mixer_win_disable,
+ .apply = mixer_apply,
};
/* for pageflip event */
Currently, an enabled flag for each mixer window is being set in both mixer and the common hdmi framework. This patch adds an apply function in mixer and moves the enabled flag inside the mixer. This is required to ensure the enabled flag is updated by the resume flag during dpms. Signed-off-by: Prathyush K <prathyush.k@samsung.com> --- drivers/gpu/drm/exynos/exynos_drm_hdmi.c | 15 ++------------- drivers/gpu/drm/exynos/exynos_drm_hdmi.h | 1 + drivers/gpu/drm/exynos/exynos_mixer.c | 18 +++++++++++++++++- 3 files changed, 20 insertions(+), 14 deletions(-)