summaryrefslogtreecommitdiff
path: root/drivers/video/tegra/dc/ext/dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video/tegra/dc/ext/dev.c')
-rw-r--r--drivers/video/tegra/dc/ext/dev.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/drivers/video/tegra/dc/ext/dev.c b/drivers/video/tegra/dc/ext/dev.c
index ca4ca5370633..a0d0949f27a7 100644
--- a/drivers/video/tegra/dc/ext/dev.c
+++ b/drivers/video/tegra/dc/ext/dev.c
@@ -301,16 +301,25 @@ static int lock_windows_for_flip(struct tegra_dc_ext_user *user,
struct tegra_dc_ext_flip *args)
{
struct tegra_dc_ext *ext = user->ext;
+ u8 idx_mask = 0;
int i;
for (i = 0; i < DC_N_WINDOWS; i++) {
int index = args->win[i].index;
- struct tegra_dc_ext_win *win;
if (index < 0)
continue;
- win = &ext->win[index];
+ idx_mask |= BIT(index);
+ }
+
+ for (i = 0; i < DC_N_WINDOWS; i++) {
+ struct tegra_dc_ext_win *win;
+
+ if (!(idx_mask & BIT(i)))
+ continue;
+
+ win = &ext->win[i];
mutex_lock(&win->lock);
@@ -322,12 +331,10 @@ static int lock_windows_for_flip(struct tegra_dc_ext_user *user,
fail_unlock:
do {
- int index = args->win[i].index;
-
- if (index < 0)
+ if (!(idx_mask & BIT(i)))
continue;
- mutex_unlock(&ext->win[index].lock);
+ mutex_unlock(&ext->win[i].lock);
} while (i--);
return -EACCES;
@@ -337,6 +344,7 @@ static void unlock_windows_for_flip(struct tegra_dc_ext_user *user,
struct tegra_dc_ext_flip *args)
{
struct tegra_dc_ext *ext = user->ext;
+ u8 idx_mask = 0;
int i;
for (i = 0; i < DC_N_WINDOWS; i++) {
@@ -345,7 +353,14 @@ static void unlock_windows_for_flip(struct tegra_dc_ext_user *user,
if (index < 0)
continue;
- mutex_unlock(&ext->win[index].lock);
+ idx_mask |= BIT(index);
+ }
+
+ for (i = DC_N_WINDOWS - 1; i >= 0; i--) {
+ if (!(idx_mask & BIT(i)))
+ continue;
+
+ mutex_unlock(&ext->win[i].lock);
}
}