From 8eb29f8315af5edd433acb32df043ab957494979 Mon Sep 17 00:00:00 2001 From: Andrei Warkentin Date: Thu, 21 Apr 2011 11:57:57 -0500 Subject: 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 --- drivers/video/tegra/dc/dc.c | 14 ++++++-------- drivers/video/tegra/dc/nvhdcp.c | 3 ++- 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, -- cgit v1.2.3