diff options
author | Michael Frydrych <mfrydrych@nvidia.com> | 2014-04-23 09:15:07 +0300 |
---|---|---|
committer | Raghunandan Bayes <rbayes@nvidia.com> | 2014-04-25 00:07:37 -0700 |
commit | 73896aaf41ac24c5d5b31cdbcf8aff4f8f659a3e (patch) | |
tree | 6d825a7181e8578b2c820467b85fc7bfe21f9ab8 /drivers/video/tegra/dc/dc.c | |
parent | 458c26866f9e0db96a154e0a8c0a0b4b097d55b3 (diff) |
video: tegra: blank dc windows during dc releasedaily-2014.05.06.0_rel-roth-r4-partner
Window owned by a process should be blanked when the process
releases dc or any individual window it has owned. The buffers
lastly displayed on those windows will be unpinned.
bug 1490686
bug 1467689
Change-Id: I3b3614a99b9598b7d432f08c4a95d8050a4ef99e
Signed-off-by: Michael Frydrych <mfrydrych@nvidia.com>
Reviewed-on: http://git-master/r/400894
GVS: Gerrit_Virtual_Submit
Reviewed-by: David Dastous St Hilaire <ddastoussthi@nvidia.com>
Tested-by: David Dastous St Hilaire <ddastoussthi@nvidia.com>
Reviewed-by: Jon Mayo <jmayo@nvidia.com>
Diffstat (limited to 'drivers/video/tegra/dc/dc.c')
-rw-r--r-- | drivers/video/tegra/dc/dc.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/drivers/video/tegra/dc/dc.c b/drivers/video/tegra/dc/dc.c index 728fb555344f..f56c007d5dab 100644 --- a/drivers/video/tegra/dc/dc.c +++ b/drivers/video/tegra/dc/dc.c @@ -4,7 +4,7 @@ * Copyright (C) 2010 Google, Inc. * Author: Erik Gilling <konkers@android.com> * - * Copyright (c) 2010-2013, NVIDIA CORPORATION, All rights reserved. + * Copyright (c) 2010-2014, NVIDIA CORPORATION, All rights reserved. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -2261,19 +2261,28 @@ bool tegra_dc_stats_get(struct tegra_dc *dc) return true; } -/* make the screen blank by disabling all windows */ -void tegra_dc_blank(struct tegra_dc *dc) +/* blank selected windows by disabling them */ +void tegra_dc_blank(struct tegra_dc *dc, unsigned windows) { struct tegra_dc_win *dcwins[DC_N_WINDOWS]; unsigned i; + unsigned long int blank_windows; + int nr_win = 0; - for (i = 0; i < DC_N_WINDOWS; i++) { - dcwins[i] = tegra_dc_get_window(dc, i); - dcwins[i]->flags &= ~TEGRA_WIN_FLAG_ENABLED; + if (!windows) + return; + + blank_windows = windows; + for_each_set_bit(i, &blank_windows, DC_N_WINDOWS) { + dcwins[nr_win] = tegra_dc_get_window(dc, i); + if (!dcwins[nr_win]) + continue; + dcwins[nr_win++]->flags &= ~TEGRA_WIN_FLAG_ENABLED; } - tegra_dc_update_windows(dcwins, DC_N_WINDOWS); - tegra_dc_sync_windows(dcwins, DC_N_WINDOWS); + tegra_dc_update_windows(dcwins, nr_win); + tegra_dc_sync_windows(dcwins, nr_win); + tegra_dc_program_bandwidth(dc, true); } static void _tegra_dc_disable(struct tegra_dc *dc) @@ -2854,7 +2863,7 @@ static void tegra_dc_shutdown(struct platform_device *ndev) if (!dc || !dc->enabled) return; - tegra_dc_blank(dc); + tegra_dc_blank(dc, BLANK_ALL); tegra_dc_disable(dc); } |