diff options
author | Jong Kim <jongk@nvidia.com> | 2014-06-05 10:56:58 -0700 |
---|---|---|
committer | Mandar Padmawar <mpadmawar@nvidia.com> | 2014-06-09 04:06:41 -0700 |
commit | 7b899e37a4b6afbdbc593a0e0322be039f4b9d53 (patch) | |
tree | 29128f01251752600eb3916020562b95a28e0907 /drivers | |
parent | 1ecc6f91f7031ad731be80ff4370201293993bb3 (diff) |
video: tegra: dc: get default mode from EDID
Override hard-coded default HDMI mode with the preferred mode
obtained from EDID read. Since the preferred mode is obtained
dynamically from EDID, the default hard-coded HDMI mode is set
to 640x480 @60Hz, which is universally supported.
bug 1495496
bug 200009711
Change-Id: Ib21109ebd5fcff4e0a825d8b20df9357cf08619e
Signed-off-by: Jong Kim <jongk@nvidia.com>
Reviewed-on: http://git-master/r/393564
(cherry picked from commit 151ac024bc3d27bee424aa33725988e8bf18375d)
Reviewed-on: http://git-master/r/419656
Reviewed-by: Mandar Padmawar <mpadmawar@nvidia.com>
Tested-by: Mandar Padmawar <mpadmawar@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/video/tegra/dc/dc.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/drivers/video/tegra/dc/dc.c b/drivers/video/tegra/dc/dc.c index a47b0e15be03..fe106d1c61b5 100644 --- a/drivers/video/tegra/dc/dc.c +++ b/drivers/video/tegra/dc/dc.c @@ -70,6 +70,10 @@ #include "tegra_adf.h" #endif +#ifdef CONFIG_FRAMEBUFFER_CONSOLE +#include "hdmi.h" +#endif /* CONFIG_FRAMEBUFFER_CONSOLE */ + /* HACK! This needs to come from DT */ #include "../../../../arch/arm/mach-tegra/iomap.h" @@ -3033,6 +3037,10 @@ static int tegra_dc_probe(struct platform_device *ndev) tegra_dc_feature_register(dc); if (dc->pdata->default_out) { +#ifdef CONFIG_FRAMEBUFFER_CONSOLE + if (dc->pdata->default_out->hotplug_init) + dc->pdata->default_out->hotplug_init(&dc->ndev->dev); +#endif /* CONFIG_FRAMEBUFFER_CONSOLE */ ret = tegra_dc_set_out(dc, dc->pdata->default_out); if (ret < 0) { dev_err(&dc->ndev->dev, "failed to initialize DC out ops\n"); @@ -3044,6 +3052,33 @@ static int tegra_dc_probe(struct platform_device *ndev) } dc->mode_dirty = false; /* ignore changes tegra_dc_set_out has done */ +#ifdef CONFIG_FRAMEBUFFER_CONSOLE + if (dc->out && dc->out->n_modes && + (dc->out->type == TEGRA_DC_OUT_HDMI)) { + struct fb_monspecs specs; + struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc); + if (!tegra_edid_get_monspecs(hdmi->edid, &specs)) { + struct tegra_dc_mode *dcmode = &dc->out->modes[0]; + dcmode->pclk = specs.modedb->pixclock; + dcmode->pclk = PICOS2KHZ(dcmode->pclk); + dcmode->pclk *= 1000; + dcmode->h_ref_to_sync = 1; + dcmode->v_ref_to_sync = 1; + dcmode->h_sync_width = specs.modedb->hsync_len; + dcmode->v_sync_width = specs.modedb->vsync_len; + dcmode->h_back_porch = specs.modedb->left_margin; + dcmode->v_back_porch = specs.modedb->upper_margin; + dcmode->h_active = specs.modedb->xres; + dcmode->v_active = specs.modedb->yres; + dcmode->h_front_porch = specs.modedb->right_margin; + dcmode->v_front_porch = specs.modedb->lower_margin; + tegra_dc_set_mode(dc, dcmode); + dc->pdata->fb->xres = dcmode->h_active; + dc->pdata->fb->yres = dcmode->v_active; + } + } +#endif /* CONFIG_FRAMEBUFFER_CONSOLE */ + #ifndef CONFIG_TEGRA_ISOMGR /* * The emc is a shared clock, it will be set based on @@ -3165,8 +3200,10 @@ static int tegra_dc_probe(struct platform_device *ndev) #endif } +#ifndef CONFIG_FRAMEBUFFER_CONSOLE if (dc->out && dc->out->hotplug_init) dc->out->hotplug_init(&ndev->dev); +#endif /* !CONFIG_FRAMEBUFFER_CONSOLE */ if (dc->out_ops) { if (dc->out_ops->detect) |