diff options
author | Rakesh Iyer <riyer@nvidia.com> | 2012-11-09 17:53:19 -0800 |
---|---|---|
committer | Simone Willett <swillett@nvidia.com> | 2012-12-05 17:35:54 -0800 |
commit | 26c071bd1ea5b132dceb665ca8488ef7ae5c0212 (patch) | |
tree | 09dea85812c2c7127f3f97069e424ed73051c7ab /drivers/video/tegra/dc | |
parent | ce25ebbdabee207d7a7cd9f1812d736ed935c722 (diff) |
video: tegra: dc: multiple mode support
Support multiple modes in platform device mode list.
Bug 1166276
Bug 560152
Change-Id: I94f9458f3ae006d2dd50cd3c3b704ea2153c3e1d
Signed-off-by: Rakesh Iyer <riyer@nvidia.com>
Signed-off-by: Jon Mayo <jmayo@nvidia.com>
Reviewed-on: http://git-master/r/162840
Reviewed-by: Simone Willett <swillett@nvidia.com>
Tested-by: Simone Willett <swillett@nvidia.com>
Diffstat (limited to 'drivers/video/tegra/dc')
-rw-r--r-- | drivers/video/tegra/dc/dc.c | 6 | ||||
-rw-r--r-- | drivers/video/tegra/dc/dc_priv.h | 2 | ||||
-rw-r--r-- | drivers/video/tegra/dc/mode.c | 12 |
3 files changed, 14 insertions, 6 deletions
diff --git a/drivers/video/tegra/dc/dc.c b/drivers/video/tegra/dc/dc.c index af20ef4ee01b..a7a1d744873f 100644 --- a/drivers/video/tegra/dc/dc.c +++ b/drivers/video/tegra/dc/dc.c @@ -1536,6 +1536,7 @@ static irqreturn_t tegra_dc_irq(int irq, void *ptr) unsigned long status; unsigned long underflow_mask; u32 val; + int need_disable = 0; mutex_lock(&dc->lock); if (!dc->enabled) { @@ -1586,13 +1587,16 @@ static irqreturn_t tegra_dc_irq(int irq, void *ptr) /* update video mode if it has changed since the last frame */ if (status & (FRAME_END_INT | V_BLANK_INT)) - tegra_dc_update_mode(dc); + if (tegra_dc_update_mode(dc)) + need_disable = 1; /* force display off on error */ tegra_dc_release_dc_out(dc); tegra_dc_io_end(dc); clk_disable_unprepare(dc->clk); mutex_unlock(&dc->lock); + if (need_disable) + tegra_dc_disable(dc); return IRQ_HANDLED; #else /* CONFIG_TEGRA_FPGA_PLATFORM */ return IRQ_NONE; diff --git a/drivers/video/tegra/dc/dc_priv.h b/drivers/video/tegra/dc/dc_priv.h index 387977d5bde8..9f0a693dc60b 100644 --- a/drivers/video/tegra/dc/dc_priv.h +++ b/drivers/video/tegra/dc/dc_priv.h @@ -266,7 +266,7 @@ int tegra_dc_set_dynamic_emc(struct tegra_dc_win *windows[], int n); /* defined in mode.c, used in dc.c and window.c */ int tegra_dc_program_mode(struct tegra_dc *dc, struct tegra_dc_mode *mode); int tegra_dc_calc_refresh(const struct tegra_dc_mode *m); -void tegra_dc_update_mode(struct tegra_dc *dc); +int tegra_dc_update_mode(struct tegra_dc *dc); /* defined in clock.c, used in dc.c, rgb.c, dsi.c and hdmi.c */ void tegra_dc_setup_clk(struct tegra_dc *dc, struct clk *clk); diff --git a/drivers/video/tegra/dc/mode.c b/drivers/video/tegra/dc/mode.c index f972648f2399..57a045518077 100644 --- a/drivers/video/tegra/dc/mode.c +++ b/drivers/video/tegra/dc/mode.c @@ -327,16 +327,20 @@ int tegra_dc_to_fb_videomode(struct fb_videomode *fbmode, fbmode->sync |= FB_SYNC_HOR_HIGH_ACT; if (!(mode->flags & TEGRA_DC_MODE_FLAG_NEG_V_SYNC)) fbmode->sync |= FB_SYNC_VERT_HIGH_ACT; - /* round up refresh rate for fractions above 0.500Hz */ - fbmode->refresh = (tegra_dc_calc_refresh(mode) + 500) / 1000; + if (mode->rated_pclk >= 1000) + fbmode->pixclock = KHZ2PICOS(mode->rated_pclk / 1000); + else if (mode->pclk >= 1000) + fbmode->pixclock = KHZ2PICOS(mode->pclk / 1000); + fbmode->refresh = tegra_dc_calc_refresh(mode) / 1000; return 0; } -void tegra_dc_update_mode(struct tegra_dc *dc) +int tegra_dc_update_mode(struct tegra_dc *dc) { if (dc->mode_dirty) - tegra_dc_program_mode(dc, &dc->mode); + return tegra_dc_program_mode(dc, &dc->mode); + return 0; } int tegra_dc_set_fb_mode(struct tegra_dc *dc, |