summaryrefslogtreecommitdiff
path: root/drivers/video
diff options
context:
space:
mode:
authorKevin Huang <kevinh@nvidia.com>2011-09-15 11:57:19 -0700
committerRohan Somvanshi <rsomvanshi@nvidia.com>2011-09-19 06:03:18 -0700
commit078a2688c67c46cf840f191405cd4324cb9c4574 (patch)
tree931555ab828161ef3053165af34287967babb17a /drivers/video
parent47a4ffb6af7aec974ecb463ba7eb068422b3c3d4 (diff)
video: tegra: dc: Use FRAME_END_INT to mark completion of frame end.
V_BLANK_INT was used to mark frame end for other tasks. However, it occurs at frame start. Switch to FRAME_END_INT to mark the end of frame. Bug 875448 Change-Id: I345e27c3b92ec5a944a49f943b9f9eb0a62aa1ff Reviewed-on: http://git-master/r/52694 Reviewed-by: Rohan Somvanshi <rsomvanshi@nvidia.com> Tested-by: Rohan Somvanshi <rsomvanshi@nvidia.com>
Diffstat (limited to 'drivers/video')
-rw-r--r--drivers/video/tegra/dc/dc.c23
-rw-r--r--drivers/video/tegra/dc/dc_priv.h2
-rw-r--r--drivers/video/tegra/dc/dsi.c22
3 files changed, 24 insertions, 23 deletions
diff --git a/drivers/video/tegra/dc/dc.c b/drivers/video/tegra/dc/dc.c
index d647345548c4..d01e680afb5a 100644
--- a/drivers/video/tegra/dc/dc.c
+++ b/drivers/video/tegra/dc/dc.c
@@ -1933,15 +1933,16 @@ static void tegra_dc_one_shot_irq(struct tegra_dc *dc, unsigned long status)
/* Schedule any additional bottom-half vblank actvities. */
schedule_work(&dc->vblank_work);
-
- /* Mark the vblank as complete. */
- complete(&dc->vblank_complete);
-
}
/* Check underflow at frame end */
- if (status & FRAME_END_INT)
+ if (status & FRAME_END_INT) {
tegra_dc_underflow_handler(dc);
+
+ /* Mark the frame_end as complete. */
+ if (completion_done(&dc->frame_end_complete))
+ complete(&dc->frame_end_complete);
+ }
}
static void tegra_dc_continuous_irq(struct tegra_dc *dc, unsigned long status)
@@ -1952,13 +1953,15 @@ static void tegra_dc_continuous_irq(struct tegra_dc *dc, unsigned long status)
/* Schedule any additional bottom-half vblank actvities. */
schedule_work(&dc->vblank_work);
-
- /* Mark the vblank as complete. */
- complete(&dc->vblank_complete);
}
- if (status & FRAME_END_INT)
+ if (status & FRAME_END_INT) {
+ /* Mark the frame_end as complete. */
+ if (completion_done(&dc->frame_end_complete))
+ complete(&dc->frame_end_complete);
+
tegra_dc_trigger_windows(dc);
+ }
}
#endif
@@ -2533,7 +2536,7 @@ static int tegra_dc_probe(struct nvhost_device *ndev)
dc->enabled = true;
mutex_init(&dc->lock);
- init_completion(&dc->vblank_complete);
+ init_completion(&dc->frame_end_complete);
init_waitqueue_head(&dc->wq);
#ifdef CONFIG_ARCH_TEGRA_2x_SOC
INIT_WORK(&dc->reset_work, tegra_dc_reset_worker);
diff --git a/drivers/video/tegra/dc/dc_priv.h b/drivers/video/tegra/dc/dc_priv.h
index 027fd8490f20..b108967cd8b2 100644
--- a/drivers/video/tegra/dc/dc_priv.h
+++ b/drivers/video/tegra/dc/dc_priv.h
@@ -119,7 +119,7 @@ struct tegra_dc {
struct switch_dev modeset_switch;
- struct completion vblank_complete;
+ struct completion frame_end_complete;
struct work_struct vblank_work;
diff --git a/drivers/video/tegra/dc/dsi.c b/drivers/video/tegra/dc/dsi.c
index f3f249da72cc..b49044fe7cac 100644
--- a/drivers/video/tegra/dc/dsi.c
+++ b/drivers/video/tegra/dc/dsi.c
@@ -40,8 +40,7 @@
#include "dsi.h"
#define DSI_USE_SYNC_POINTS 1
-
-#define DSI_STOP_DC_DURATION_MSEC 1000
+#define S_TO_MS(x) 1000
#define DSI_MODULE_NOT_INIT 0x0
#define DSI_MODULE_INIT 0x1
@@ -840,30 +839,29 @@ void tegra_dsi_stop_dc_stream_at_frame_end(struct tegra_dc *dc,
{
int val;
long timeout;
+ u32 frame_period = DIV_ROUND_UP(S_TO_MS(1), dsi->info.refresh_rate);
/* stop dc */
tegra_dsi_stop_dc_stream(dc, dsi);
- /* enable vblank interrupt */
+ /* enable frame end interrupt */
val = tegra_dc_readl(dc, DC_CMD_INT_ENABLE);
- val |= V_BLANK_INT;
+ val |= FRAME_END_INT;
tegra_dc_writel(dc, val, DC_CMD_INT_ENABLE);
val = tegra_dc_readl(dc, DC_CMD_INT_MASK);
- val |= V_BLANK_INT;
+ val |= FRAME_END_INT;
tegra_dc_writel(dc, val, DC_CMD_INT_MASK);
- /* wait for vblank completion */
+ /* wait for frame_end completion */
timeout = wait_for_completion_interruptible_timeout(
- &dc->vblank_complete, DSI_STOP_DC_DURATION_MSEC);
+ &dc->frame_end_complete,
+ msecs_to_jiffies(frame_period));
- /* disable vblank interrupt */
+ /* disable frame end interrupt */
val = tegra_dc_readl(dc, DC_CMD_INT_ENABLE);
- val &= ~V_BLANK_INT;
+ val &= ~FRAME_END_INT;
tegra_dc_writel(dc, val, DC_CMD_INT_ENABLE);
-
- if (timeout == 0)
- printk("Warning: dc dosen't stop at the end of the frame.\n");
}
static void tegra_dsi_start_dc_stream(struct tegra_dc *dc,