diff options
Diffstat (limited to 'drivers/video/tegra')
-rw-r--r-- | drivers/video/tegra/dc/ext/dev.c | 46 |
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++) { |