summaryrefslogtreecommitdiff
path: root/drivers/media/platform/soc_camera
diff options
context:
space:
mode:
authorBryan Wu <pengw@nvidia.com>2013-02-27 18:06:54 -0800
committerDan Willemsen <dwillemsen@nvidia.com>2013-09-14 13:15:21 -0700
commit3b1572fd965221f70b4f76d53c4baffb05a1eff9 (patch)
tree8c9ac7a430e721343a3d9888a1607e493412213a /drivers/media/platform/soc_camera
parent9fa06987634f9cf62c9f1179254adf4bd3a3aa87 (diff)
media: tegra: make V4L2 camera can be a module
"vi" will be binded with host1x client VI driver, while "tegra-camera" is for our V4L2 driver. Use nvhost_client_device_release() to release resources Bug 1240806 Change-Id: Ieccc5010ab72d2aa92384c88be484eb4ade72212 Signed-off-by: Bryan Wu <pengw@nvidia.com> Reviewed-on: http://git-master/r/226468 GVS: Gerrit_Virtual_Submit Reviewed-by: Allen Martin <amartin@nvidia.com>
Diffstat (limited to 'drivers/media/platform/soc_camera')
-rw-r--r--drivers/media/platform/soc_camera/tegra_v4l2_camera.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/drivers/media/platform/soc_camera/tegra_v4l2_camera.c b/drivers/media/platform/soc_camera/tegra_v4l2_camera.c
index 418461ed6650..0c7823e67597 100644
--- a/drivers/media/platform/soc_camera/tegra_v4l2_camera.c
+++ b/drivers/media/platform/soc_camera/tegra_v4l2_camera.c
@@ -28,7 +28,7 @@
#include "dev.h"
#include "bus_client.h"
-#include "host1x/host1x_syncpt.h"
+#include "nvhost_syncpt.h"
#define TEGRA_CAM_DRV_NAME "vi"
#define TEGRA_CAM_VERSION_CODE KERNEL_VERSION(0, 0, 5)
@@ -268,6 +268,7 @@ struct tegra_camera_dev {
struct soc_camera_device *icd;
struct platform_device *ndev;
struct tegra_camera_platform_data *pdata;
+ struct nvhost_device_data *ndata;
struct clk *clk_vi;
struct clk *clk_vi_sensor;
@@ -850,12 +851,14 @@ static int tegra_camera_capture_start(struct tegra_camera_dev *pcdev,
TEGRA_VI_SYNCPT_CSI,
pcdev->syncpt_csi,
TEGRA_SYNCPT_CSI_WAIT_TIMEOUT,
+ NULL,
NULL);
else
err = nvhost_syncpt_wait_timeout_ext(pcdev->ndev,
TEGRA_VI_SYNCPT_VI,
pcdev->syncpt_csi,
TEGRA_SYNCPT_VI_WAIT_TIMEOUT,
+ NULL,
NULL);
if (!err)
@@ -920,6 +923,7 @@ static int tegra_camera_capture_stop(struct tegra_camera_dev *pcdev)
TEGRA_VI_SYNCPT_VI,
pcdev->syncpt_vi,
TEGRA_SYNCPT_VI_WAIT_TIMEOUT,
+ NULL,
NULL);
else
err = 0;
@@ -1668,6 +1672,7 @@ static int tegra_camera_probe(struct platform_device *pdev)
goto exit;
}
+ pcdev->ndata = ndata;
pcdev->pdata = ndata->private_data;
if (!pcdev->pdata) {
dev_err(&pdev->dev, "No platform data!\n");
@@ -1754,7 +1759,7 @@ static int tegra_camera_probe(struct platform_device *pdev)
pcdev->alloc_ctx = vb2_dma_nvmap_init_ctx(NULL);
if (IS_ERR(pcdev->alloc_ctx)) {
err = PTR_ERR(pcdev->alloc_ctx);
- goto exit_put_resources;
+ goto exit_pm_disable;
}
platform_set_drvdata(pdev, pcdev);
@@ -1767,10 +1772,10 @@ static int tegra_camera_probe(struct platform_device *pdev)
return err;
exit_cleanup_alloc_ctx:
- vb2_dma_nvmap_cleanup_ctx(&pdev->dev);
-exit_put_resources:
+ platform_set_drvdata(pdev, pcdev->ndata);
+ vb2_dma_nvmap_cleanup_ctx(pcdev->alloc_ctx);
+exit_pm_disable:
pm_runtime_disable(&pdev->dev);
- nvhost_client_device_put_resources(pdev);
exit_put_regulator:
regulator_put(pcdev->reg);
exit_put_clk_csus:
@@ -1794,17 +1799,13 @@ static int tegra_camera_remove(struct platform_device *pdev)
struct soc_camera_host *ici = to_soc_camera_host(&pdev->dev);
struct tegra_camera_dev *pcdev = container_of(ici,
struct tegra_camera_dev, ici);
- struct resource *res;
-
- res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs");
- if (!res)
- return -EBUSY;
- iounmap(pcdev->vi_base);
- release_mem_region(res->start, resource_size(res));
soc_camera_host_unregister(ici);
- vb2_dma_nvmap_cleanup_ctx(&pdev->dev);
+ platform_set_drvdata(pdev, pcdev->ndata);
+ nvhost_client_device_release(pdev);
+
+ vb2_dma_nvmap_cleanup_ctx(pcdev->alloc_ctx);
pm_runtime_disable(&pdev->dev);