summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorMichael Frydrych <mfrydrych@nvidia.com>2011-02-23 16:30:13 +0200
committerVarun Colbert <vcolbert@nvidia.com>2011-03-03 10:40:14 -0800
commit4e45cc465acdf70a59262f175784418219885f6b (patch)
tree220bcfc82de5206685a4db5ebfebb344b8b08180 /drivers
parent68ef6162f1ed332289d2d7bd29a56011b662fc73 (diff)
video: tegra: flush flip work queue upon controller disable
When display controller is being disabled, some scheduled flips may still be pending in a work queue. Do not lose them. Change-Id: I043fce583d44bb962494e6625a5c28675498fb55 Reviewed-on: http://git-master/r/20580 Reviewed-by: Jihoon Bang <jbang@nvidia.com> Tested-by: Jihoon Bang <jbang@nvidia.com> Reviewed-by: Daniel Willemsen <dwillemsen@nvidia.com> Reviewed-by: Michael Frydrych <mfrydrych@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/tegra/dc/dc.c3
-rw-r--r--drivers/video/tegra/dc/overlay.c8
-rw-r--r--drivers/video/tegra/dc/overlay.h5
3 files changed, 15 insertions, 1 deletions
diff --git a/drivers/video/tegra/dc/dc.c b/drivers/video/tegra/dc/dc.c
index fe6150f6aabf..2c6eaea9a561 100644
--- a/drivers/video/tegra/dc/dc.c
+++ b/drivers/video/tegra/dc/dc.c
@@ -1204,6 +1204,9 @@ static void _tegra_dc_disable(struct tegra_dc *dc)
{
disable_irq(dc->irq);
+ if (dc->overlay)
+ tegra_overlay_disable(dc->overlay);
+
if (dc->out_ops && dc->out_ops->disable)
dc->out_ops->disable(dc);
diff --git a/drivers/video/tegra/dc/overlay.c b/drivers/video/tegra/dc/overlay.c
index 94d5d6349273..4b1a9ec53711 100644
--- a/drivers/video/tegra/dc/overlay.c
+++ b/drivers/video/tegra/dc/overlay.c
@@ -404,6 +404,9 @@ static int tegra_overlay_ioctl_flip(struct overlay_client *client,
bool found_one = false;
struct tegra_overlay_flip_args flip_args;
+ if (!client->dev->dc->enabled)
+ return -EPIPE;
+
if (copy_from_user(&flip_args, arg, sizeof(flip_args)))
return -EFAULT;
@@ -641,4 +644,7 @@ void tegra_overlay_unregister(struct tegra_overlay_info *info)
kfree(info);
}
-
+void tegra_overlay_disable(struct tegra_overlay_info *overlay_info)
+{
+ flush_workqueue(overlay_info->flip_wq);
+}
diff --git a/drivers/video/tegra/dc/overlay.h b/drivers/video/tegra/dc/overlay.h
index a3469813b1bf..812bc0237562 100644
--- a/drivers/video/tegra/dc/overlay.h
+++ b/drivers/video/tegra/dc/overlay.h
@@ -23,6 +23,7 @@ struct tegra_overlay_info;
struct tegra_overlay_info *tegra_overlay_register(struct nvhost_device *ndev,
struct tegra_dc *dc);
void tegra_overlay_unregister(struct tegra_overlay_info *overlay_info);
+void tegra_overlay_disable(struct tegra_overlay_info *overlay_info);
#else
static inline struct tegra_overlay_info *tegra_overlay_register(struct nvhost_device *ndev,
struct tegra_dc *dc)
@@ -33,6 +34,10 @@ static inline struct tegra_overlay_info *tegra_overlay_register(struct nvhost_de
static inline void tegra_overlay_unregister(struct tegra_overlay_info *overlay_info)
{
}
+
+static inline void tegra_overlay_disable(struct tegra_overlay_info *overlay_info)
+{
+}
#endif
#endif