summaryrefslogtreecommitdiff
path: root/drivers/video/tegra/dc/overlay.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video/tegra/dc/overlay.c')
-rw-r--r--drivers/video/tegra/dc/overlay.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/drivers/video/tegra/dc/overlay.c b/drivers/video/tegra/dc/overlay.c
index 1f31631ea699..e809f76b7fe0 100644
--- a/drivers/video/tegra/dc/overlay.c
+++ b/drivers/video/tegra/dc/overlay.c
@@ -39,6 +39,8 @@
#include "../nvmap/nvmap.h"
#include "overlay.h"
+#include "dc_input.h"
+
/* Minimum extra shot for DIDIM if n shot is enabled. */
#define TEGRA_DC_DIDIM_MIN_SHOT 1
@@ -73,6 +75,8 @@ struct tegra_overlay_info {
struct workqueue_struct *flip_wq;
struct completion complete;
+ struct dc_input *input;
+
/* Big enough for tegra_dc%u when %u < 10 */
char name[10];
};
@@ -674,6 +678,7 @@ static int tegra_overlay_ioctl_flip(struct overlay_client *client,
mutex_unlock(&client->dev->dc->lock);
return -EPIPE;
}
+
mutex_unlock(&client->dev->dc->lock);
if (copy_from_user(&flip_args, arg, sizeof(flip_args)))
@@ -716,6 +721,8 @@ static int tegra_overlay_ioctl_flip(struct overlay_client *client,
if (copy_to_user(arg, &flip_args, sizeof(flip_args)))
return -EFAULT;
+ notify_overlay_flip(client->dev->input);
+
return 0;
}
@@ -902,8 +909,18 @@ struct tegra_overlay_info *tegra_overlay_register(struct nvhost_device *ndev,
dev_info(&ndev->dev, "registered overlay\n");
- return dev;
+ dev->input = dc_input_alloc();
+ if (!dev->input)
+ goto err_delete_wq;
+ e = dc_input_init(&dev->dev, dev->input);
+ if (e)
+ goto err_delete_input;
+ return dev;
+err_delete_input:
+ dc_input_destroy(dev->input);
+ dc_input_free(dev->input);
+ dev->input = NULL;
err_delete_wq:
err_free:
fail:
@@ -915,6 +932,8 @@ fail:
void tegra_overlay_unregister(struct tegra_overlay_info *info)
{
+ dc_input_destroy(info->input);
+ dc_input_free(info->input);
misc_deregister(&info->dev);
kfree(info);