summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorAndrei Warkentin <andreiw@motorola.com>2011-04-21 11:57:57 -0500
committerRebecca Schultz Zavin <rebecca@android.com>2011-04-21 17:24:57 -0700
commit8eb29f8315af5edd433acb32df043ab957494979 (patch)
tree167926af0f9bfa2424ec0191711465abe75c3d27 /drivers
parent390426653550474a432a051a81441678c4ef6eaa (diff)
video: tegra: dc: Fix several problems
Resolve potential race between resume and reset Fix wmb after return Change-Id: I98ad1e713b9781d780bf93561496011bf62b86d1 Signed-off-by: Andrei Warkentin <andreiw@motorola.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/tegra/dc/dc.c14
-rw-r--r--drivers/video/tegra/dc/nvhdcp.c3
2 files changed, 8 insertions, 9 deletions
diff --git a/drivers/video/tegra/dc/dc.c b/drivers/video/tegra/dc/dc.c
index a61e86fb5dd7..f39fb40e3ccd 100644
--- a/drivers/video/tegra/dc/dc.c
+++ b/drivers/video/tegra/dc/dc.c
@@ -1044,7 +1044,7 @@ static bool _tegra_dc_enable(struct tegra_dc *dc)
dc->out->enable();
tegra_dc_setup_clk(dc, dc->clk);
-
+ tegra_periph_reset_assert(dc->clk);
clk_enable(dc->clk);
clk_enable(dc->emc_clk);
tegra_periph_reset_deassert(dc->clk);
@@ -1119,14 +1119,12 @@ static void tegra_dc_reset_worker(struct work_struct *work)
dev_warn(&dc->ndev->dev, "overlay stuck in underflow state. resetting.\n");
mutex_lock(&dc->lock);
- _tegra_dc_disable(dc);
-
- msleep(100);
- tegra_periph_reset_assert(dc->clk);
-
- /* _tegra_dc_enable deasserts reset */
- _tegra_dc_enable(dc);
+ if (dc->enabled && !dc->suspended) {
+ _tegra_dc_disable(dc);
+ /* _tegra_dc_enable deasserts reset */
+ _tegra_dc_enable(dc);
+ }
mutex_unlock(&dc->lock);
}
diff --git a/drivers/video/tegra/dc/nvhdcp.c b/drivers/video/tegra/dc/nvhdcp.c
index 5c2d9050a14b..69c13c4110ce 100644
--- a/drivers/video/tegra/dc/nvhdcp.c
+++ b/drivers/video/tegra/dc/nvhdcp.c
@@ -108,8 +108,9 @@ static inline bool nvhdcp_is_plugged(struct tegra_nvhdcp *nvhdcp)
static inline bool nvhdcp_set_plugged(struct tegra_nvhdcp *nvhdcp, bool plugged)
{
- return nvhdcp->plugged = plugged;
+ nvhdcp->plugged = plugged;
wmb();
+ return plugged;
}
static int nvhdcp_i2c_read(struct tegra_nvhdcp *nvhdcp, u8 reg,