This patch adds the implementation of check_mode callback in the mixer driver. Based on the mixer version, correct set of restrictions will be exposed by the mixer driver. A resolution will be acceptable only if passes the criteria set by mixer and hdmi IPs.
Signed-off-by: Rahul Sharma <rahul.sharma at samsung.com> Signed-off-by: Sean Paul <seanpaul at chromium.org> --- drivers/gpu/drm/exynos/exynos_mixer.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c index 21db895..093b374 100644 --- a/drivers/gpu/drm/exynos/exynos_mixer.c +++ b/drivers/gpu/drm/exynos/exynos_mixer.c @@ -810,6 +810,33 @@ static void mixer_win_disable(void *ctx, int win) mixer_ctx->win_data[win].enabled = false; } +int mixer_check_mode(void *ctx, void *mode) +{ + struct mixer_context *mixer_ctx = ctx; + struct fb_videomode *check_mode = mode; + unsigned int w, h; + + w = check_mode->xres; + h = check_mode->yres; + + DRM_DEBUG_KMS("%s : xres=%d, yres=%d, refresh=%d, intl=%d\n", + __func__, check_mode->xres, check_mode->yres, + check_mode->refresh, (check_mode->vmode & + FB_VMODE_INTERLACED) ? true : false); + + if (mixer_ctx->mxr_ver == MXR_VER_16_0_33_0) { + if ((w >= 464 && w <= 720 && h >= 261 && h <= 576) || + (w >= 1024 && w <= 1280 && + h >= 576 && h <= 720) || + (w >= 1664 && w <= 1920 && + h >= 936 && h <= 1080)) + return 0; + } else { + return 0; + } + + return -EINVAL; +} static void mixer_wait_for_vblank(void *ctx) { struct mixer_context *mixer_ctx = ctx; @@ -947,6 +974,9 @@ static struct exynos_mixer_ops mixer_ops = { .win_mode_set = mixer_win_mode_set, .win_commit = mixer_win_commit, .win_disable = mixer_win_disable, + + /* display */ + .check_mode = mixer_check_mode, }; /* for pageflip event */ -- 1.8.0