diff options
author | Adam Jiang <chaoj@nvidia.com> | 2012-03-08 21:34:53 +0900 |
---|---|---|
committer | Rohan Somvanshi <rsomvanshi@nvidia.com> | 2012-04-04 09:19:27 -0700 |
commit | d0b210bd39f43799bae7f4ea8ca2e71d4ac47f2b (patch) | |
tree | 8deb2fe9f6da634613c2c7f67bf63864f5f99818 | |
parent | 3b693812e9c606561b92d665d2eb676616e27ac4 (diff) |
dc: enabled recovery from resetting
Enabled recovery of DC from resetting. When underflow triggered serveral
times(current > 4 for tegra2), DC driver will reset itself to prevent
data corruption. Reopend nvhost connection when resetting finished. That
helps system to show frames instead of a blank screen again.
Fixed Bug 936613
Change-Id: I314c37258a4a446dc07167ac60d0420e79a5fb2d
Signed-off-by: Adam Jiang <chaoj@nvidia.com>
Reviewed-on: http://git-master/r/89406
Reviewed-by: Rohan Somvanshi <rsomvanshi@nvidia.com>
Tested-by: Rohan Somvanshi <rsomvanshi@nvidia.com>
-rw-r--r-- | drivers/video/tegra/dc/dc.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/video/tegra/dc/dc.c b/drivers/video/tegra/dc/dc.c index 8b3bf041a7df..113e64c59563 100644 --- a/drivers/video/tegra/dc/dc.c +++ b/drivers/video/tegra/dc/dc.c @@ -2101,8 +2101,11 @@ static void tegra_dc_underflow_handler(struct tegra_dc *dc) dc->windows[i].underflows++; #ifdef CONFIG_ARCH_TEGRA_2x_SOC - if (dc->windows[i].underflows > 4) + if (dc->windows[i].underflows > 4) { schedule_work(&dc->reset_work); + /* reset counter */ + dc->windows[i].underflows = 0; + } #endif } else { dc->windows[i].underflows = 0; @@ -2734,6 +2737,13 @@ static void tegra_dc_reset_worker(struct work_struct *work) _tegra_dc_controller_reset_enable(dc); dc->enabled = true; + + /* reopen host read bus */ + val = tegra_dc_readl(dc, DC_CMD_CONT_SYNCPT_VSYNC); + val &= ~(0x00000100); + val |= 0x100; + tegra_dc_writel(dc, val, DC_CMD_CONT_SYNCPT_VSYNC); + unlock: mutex_unlock(&dc->lock); mutex_unlock(&shared_lock); |