diff options
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, |