summaryrefslogtreecommitdiff
path: root/drivers/video/tegra
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video/tegra')
-rw-r--r--drivers/video/tegra/dc/ext/dev.c46
1 files changed, 29 insertions, 17 deletions
diff --git a/drivers/video/tegra/dc/ext/dev.c b/drivers/video/tegra/dc/ext/dev.c
index 92e42ce32ac2..8ec015cbde9b 100644
--- a/drivers/video/tegra/dc/ext/dev.c
+++ b/drivers/video/tegra/dc/ext/dev.c
@@ -274,31 +274,40 @@ static int tegra_dc_ext_set_windowattr(struct tegra_dc_ext *ext,
return 0;
}
-static struct srcu_notifier_head tegra_dc_flip_notifier_list;
-static bool init_tegra_dc_flip_notifier_list_called;
-static int __init init_tegra_dc_flip_notifier_list(void)
+static void (*flip_callback)(void);
+static spinlock_t flip_callback_lock;
+static bool init_tegra_dc_flip_callback_called;
+
+static int __init init_tegra_dc_flip_callback(void)
{
- srcu_init_notifier_head(&tegra_dc_flip_notifier_list);
- init_tegra_dc_flip_notifier_list_called = true;
+ spin_lock_init(&flip_callback_lock);
+ init_tegra_dc_flip_callback_called = true;
return 0;
}
-pure_initcall(init_tegra_dc_flip_notifier_list);
+pure_initcall(init_tegra_dc_flip_callback);
-int tegra_dc_register_flip_notifier(struct notifier_block *nb)
+int tegra_dc_set_flip_callback(void (*callback)(void))
{
- WARN_ON(!init_tegra_dc_flip_notifier_list_called);
+ WARN_ON(!init_tegra_dc_flip_callback_called);
+
+ spin_lock(&flip_callback_lock);
+ flip_callback = callback;
+ spin_unlock(&flip_callback_lock);
- return srcu_notifier_chain_register(
- &tegra_dc_flip_notifier_list, nb);
+ return 0;
}
-EXPORT_SYMBOL(tegra_dc_register_flip_notifier);
+EXPORT_SYMBOL(tegra_dc_set_flip_callback);
-int tegra_dc_unregister_flip_notifier(struct notifier_block *nb)
+int tegra_dc_unset_flip_callback()
{
- return srcu_notifier_chain_unregister(&tegra_dc_flip_notifier_list, nb);
+ spin_lock(&flip_callback_lock);
+ flip_callback = NULL;
+ spin_unlock(&flip_callback_lock);
+
+ return 0;
}
-EXPORT_SYMBOL(tegra_dc_unregister_flip_notifier);
+EXPORT_SYMBOL(tegra_dc_unset_flip_callback);
static void tegra_dc_ext_flip_worker(struct work_struct *work)
{
@@ -353,9 +362,12 @@ static void tegra_dc_ext_flip_worker(struct work_struct *work)
tegra_dc_update_windows(wins, nr_win);
/* TODO: implement swapinterval here */
tegra_dc_sync_windows(wins, nr_win);
- if (!tegra_dc_has_multiple_dc())
- srcu_notifier_call_chain(&tegra_dc_flip_notifier_list,
- 1UL, NULL);
+ if (!tegra_dc_has_multiple_dc()) {
+ spin_lock(&flip_callback_lock);
+ if (flip_callback)
+ flip_callback();
+ spin_unlock(&flip_callback_lock);
+ }
}
for (i = 0; i < DC_N_WINDOWS; i++) {