diff options
Diffstat (limited to 'drivers/video/tegra/dc/overlay.c')
-rw-r--r-- | drivers/video/tegra/dc/overlay.c | 21 |
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); |