summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJong Kim <jongk@nvidia.com>2014-06-05 10:56:58 -0700
committerMandar Padmawar <mpadmawar@nvidia.com>2014-06-09 04:06:41 -0700
commit7b899e37a4b6afbdbc593a0e0322be039f4b9d53 (patch)
tree29128f01251752600eb3916020562b95a28e0907
parent1ecc6f91f7031ad731be80ff4370201293993bb3 (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>
-rw-r--r--arch/arm/mach-tegra/board-ardbeg-panel.c2
-rw-r--r--drivers/video/tegra/dc/dc.c37
2 files changed, 38 insertions, 1 deletions
diff --git a/arch/arm/mach-tegra/board-ardbeg-panel.c b/arch/arm/mach-tegra/board-ardbeg-panel.c
index 013acee2eae1..c39885b4b1b1 100644
--- a/arch/arm/mach-tegra/board-ardbeg-panel.c
+++ b/arch/arm/mach-tegra/board-ardbeg-panel.c
@@ -445,7 +445,7 @@ struct tegra_hdmi_out ardbeg_hdmi_out = {
#if defined(CONFIG_FRAMEBUFFER_CONSOLE)
static struct tegra_dc_mode hdmi_panel_modes[] = {
{
- .pclk = KHZ2PICOS(25200),
+ .pclk = 25200000,
.h_ref_to_sync = 1,
.v_ref_to_sync = 1,
.h_sync_width = 96, /* hsync_len */
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)