From 86c9754e625b6b9ac86db944c08158c895ca7919 Mon Sep 17 00:00:00 2001 From: Shashank Sharma Date: Mon, 30 Apr 2012 19:23:57 +0530 Subject: video: tegra: fb: Call mode filter from check var Call dc_hdmi_mode_filter to validate a videomode. X prepares its own modedb of supported HDMI modes, but all of them may not be supported from the HDMI driver. This call makes sure a X-mode is listed only if supported in DC driver. Bug: 959676 Change-Id: I8aff65f4e08fcc4471af096150e3972b5913a95a Signed-off-by: Shashank Sharma Reviewed-on: http://git-master/r/99650 Reviewed-by: Rohan Somvanshi Tested-by: Rohan Somvanshi --- drivers/video/tegra/dc/dc_priv.h | 5 ++++- drivers/video/tegra/dc/hdmi.c | 2 +- drivers/video/tegra/fb.c | 18 +++++++++++++++++- 3 files changed, 22 insertions(+), 3 deletions(-) (limited to 'drivers') diff --git a/drivers/video/tegra/dc/dc_priv.h b/drivers/video/tegra/dc/dc_priv.h index c08cd12f5a22..2f2dcec82055 100644 --- a/drivers/video/tegra/dc/dc_priv.h +++ b/drivers/video/tegra/dc/dc_priv.h @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -64,11 +65,13 @@ struct tegra_dc_out_ops { void (*enable)(struct tegra_dc *dc); /* disable output. dc clocks are on at this point */ void (*disable)(struct tegra_dc *dc); - /* suspend output. dc clocks are on at this point */ void (*suspend)(struct tegra_dc *dc); /* resume output. dc clocks are on at this point */ void (*resume)(struct tegra_dc *dc); + /* mode filter. to provide a list of supported modes*/ + bool (*mode_filter)(struct tegra_dc *dc, + struct fb_videomode *mode); }; struct tegra_dc { diff --git a/drivers/video/tegra/dc/hdmi.c b/drivers/video/tegra/dc/hdmi.c index 67d081967a07..dc688136b7f4 100644 --- a/drivers/video/tegra/dc/hdmi.c +++ b/drivers/video/tegra/dc/hdmi.c @@ -1289,7 +1289,6 @@ static bool tegra_dc_hdmi_mode_filter(const struct tegra_dc *dc, return false; } - static bool tegra_dc_hdmi_hpd(struct tegra_dc *dc) { return tegra_dc_hpd(dc); @@ -2399,6 +2398,7 @@ struct tegra_dc_out_ops tegra_dc_hdmi_ops = { .detect = tegra_dc_hdmi_detect, .suspend = tegra_dc_hdmi_suspend, .resume = tegra_dc_hdmi_resume, + .mode_filter = tegra_dc_hdmi_mode_filter, }; struct tegra_dc_edid *tegra_dc_get_edid(struct tegra_dc *dc) diff --git a/drivers/video/tegra/fb.c b/drivers/video/tegra/fb.c index 32ae6527c640..fc9befdf72c8 100644 --- a/drivers/video/tegra/fb.c +++ b/drivers/video/tegra/fb.c @@ -64,11 +64,27 @@ static u32 pseudo_palette[16]; static int tegra_fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) { + struct tegra_fb_info *tegra_fb = info->par; + struct tegra_dc *dc = tegra_fb->win->dc; + struct tegra_dc_out_ops *ops = dc->out_ops; + struct fb_videomode mode; + if ((var->yres * var->xres * var->bits_per_pixel / 8 * 2) > info->screen_size) return -EINVAL; - /* double yres_virtual to allow double buffering through pan_display */ + /* Apply mode filter for HDMI only -LVDS supports only fix mode */ + if (ops && ops->mode_filter) { + + fb_var_to_videomode(&mode, var); + if (!ops->mode_filter(dc, &mode)) + return -EINVAL; + + /* Mode filter may have modified the mode */ + fb_videomode_to_var(var, &mode); + } + + /* Double yres_virtual to allow double buffering through pan_display */ var->yres_virtual = var->yres * 2; return 0; -- cgit v1.2.3