diff options
author | Shashank Sharma <shashanks@nvidia.com> | 2012-04-30 19:23:57 +0530 |
---|---|---|
committer | Rohan Somvanshi <rsomvanshi@nvidia.com> | 2012-05-08 06:07:22 -0700 |
commit | 86c9754e625b6b9ac86db944c08158c895ca7919 (patch) | |
tree | 50f240a6b24fcce620b09c684688130d51584f66 /drivers/video/tegra | |
parent | 4ab7c111fa8570e58ad70a6b0f7c6539b2c4ae3d (diff) |
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 <shashanks@nvidia.com>
Reviewed-on: http://git-master/r/99650
Reviewed-by: Rohan Somvanshi <rsomvanshi@nvidia.com>
Tested-by: Rohan Somvanshi <rsomvanshi@nvidia.com>
Diffstat (limited to 'drivers/video/tegra')
-rw-r--r-- | drivers/video/tegra/dc/dc_priv.h | 5 | ||||
-rw-r--r-- | drivers/video/tegra/dc/hdmi.c | 2 | ||||
-rw-r--r-- | drivers/video/tegra/fb.c | 18 |
3 files changed, 22 insertions, 3 deletions
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 <linux/io.h> #include <linux/mutex.h> #include <linux/wait.h> +#include <linux/fb.h> #include <linux/completion.h> #include <linux/switch.h> @@ -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; |