diff options
author | Michael Frydrych <mfrydrych@nvidia.com> | 2011-02-23 16:30:13 +0200 |
---|---|---|
committer | Varun Colbert <vcolbert@nvidia.com> | 2011-03-03 10:40:14 -0800 |
commit | 4e45cc465acdf70a59262f175784418219885f6b (patch) | |
tree | 220bcfc82de5206685a4db5ebfebb344b8b08180 /drivers | |
parent | 68ef6162f1ed332289d2d7bd29a56011b662fc73 (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.c | 3 | ||||
-rw-r--r-- | drivers/video/tegra/dc/overlay.c | 8 | ||||
-rw-r--r-- | drivers/video/tegra/dc/overlay.h | 5 |
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 |