#include <linux/init.h>
#include <linux/spinlock.h>
#include <linux/throughput_ioctl.h>
+#include <linux/module.h>
#include <linux/nvhost.h>
#include <mach/dc.h>
else
last_frame_time = (unsigned short) timediff;
+ if (last_frame_time == 0)
+ return NOTIFY_DONE;
+
throughput_hint =
((int) target_frame_time * 100)/last_frame_time;
static int throughput_open(struct inode *inode, struct file *file)
{
+ int need_init = 0;
+
+ spin_lock(&lock);
+
if (!notifier_initialized) {
- tegra_dc_register_flip_notifier(&throughput_flip_nb);
notifier_initialized = 1;
+ need_init = 1;
}
- spin_lock(&lock);
-
throughput_active_app_count++;
if (throughput_active_app_count > 1)
multiple_app_disable = 1;
spin_unlock(&lock);
+ if (need_init)
+ tegra_dc_register_flip_notifier(&throughput_flip_nb);
+
pr_debug("throughput_open node %p file %p\n", inode, file);
return 0;
static int throughput_release(struct inode *inode, struct file *file)
{
+ int need_deinit = 0;
+
spin_lock(&lock);
- throughput_active_app_count--;
- spin_unlock(&lock);
+ throughput_active_app_count--;
if (throughput_active_app_count == 0) {
reset_target_frame_time();
multiple_app_disable = 0;
- tegra_dc_unregister_flip_notifier(&throughput_flip_nb);
notifier_initialized = 0;
+ need_deinit = 1;
}
+ spin_unlock(&lock);
+
+ if (need_deinit)
+ tegra_dc_unregister_flip_notifier(&throughput_flip_nb);
pr_debug("throughput_release node %p file %p\n", inode, file);