summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDeepak Nibade <dnibade@nvidia.com>2014-02-07 15:03:01 +0530
committerTerje Bergstrom <tbergstrom@nvidia.com>2014-02-13 22:14:07 -0800
commiteae55c8e4cbb65e3ed1a8c8ef8150d8a6ba938bf (patch)
treeddedf6ce22176e25b0c21ca73b319a16108024a4
parent27690e435d7ad65f14935c134e1b496c4c3f816a (diff)
media: tegra_camera: use dynamic syncpts
- use API nvhost_get_syncpt_client_managed() to get syncpts dynamically - add new function pointers .init_syncpts() to initialize the syncpts at probe() time only Bug 1305024 Change-Id: Ib751b0a23d556444ba9d86fedc978439b4212b90 Signed-off-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-on: http://git-master/r/364854 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Shridhar Rasal <srasal@nvidia.com> Reviewed-by: Bryan Wu <pengw@nvidia.com> Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
-rw-r--r--drivers/media/platform/soc_camera/tegra_camera/common.c5
-rw-r--r--drivers/media/platform/soc_camera/tegra_camera/common.h9
-rw-r--r--drivers/media/platform/soc_camera/tegra_camera/vi.c53
-rw-r--r--drivers/media/platform/soc_camera/tegra_camera/vi2.c33
4 files changed, 55 insertions, 45 deletions
diff --git a/drivers/media/platform/soc_camera/tegra_camera/common.c b/drivers/media/platform/soc_camera/tegra_camera/common.c
index d257115258b9..aa5b915bb2d6 100644
--- a/drivers/media/platform/soc_camera/tegra_camera/common.c
+++ b/drivers/media/platform/soc_camera/tegra_camera/common.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, NVIDIA CORPORATION. All rights reserved.
+ * Copyright (c) 2013-2014, NVIDIA CORPORATION. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
@@ -874,6 +874,9 @@ static int tegra_camera_probe(struct platform_device *pdev)
goto exit_deinit_clk;
}
+ /* Init syncpts */
+ cam->ops->init_syncpts(cam);
+
cam->reg_base = ndata->aperture[0];
if (!cam->reg_base) {
dev_err(&pdev->dev, "%s: failed to map register base\n",
diff --git a/drivers/media/platform/soc_camera/tegra_camera/common.h b/drivers/media/platform/soc_camera/tegra_camera/common.h
index 94a3f46bbf92..76de2a070cc6 100644
--- a/drivers/media/platform/soc_camera/tegra_camera/common.h
+++ b/drivers/media/platform/soc_camera/tegra_camera/common.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2013, NVIDIA CORPORATION. All rights reserved.
+ * Copyright (c) 2012-2014, NVIDIA CORPORATION. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
@@ -67,6 +67,7 @@ struct tegra_camera_ops {
struct tegra_camera_buffer *buf);
int (*capture_stop)(struct tegra_camera_dev *vi2_cam, int port);
+ void (*init_syncpts)(struct tegra_camera_dev *vi2_cam);
void (*incr_syncpts)(struct tegra_camera_dev *vi2_cam);
void (*save_syncpts)(struct tegra_camera_dev *vi2_cam);
@@ -100,6 +101,12 @@ struct tegra_camera_dev {
struct work_struct work;
struct mutex work_mutex;
+ /* syncpt ids */
+ u32 syncpt_id_csi_a;
+ u32 syncpt_id_csi_b;
+ u32 syncpt_id_vip;
+
+ /* syncpt values */
u32 syncpt_csi_a;
u32 syncpt_csi_b;
u32 syncpt_vip;
diff --git a/drivers/media/platform/soc_camera/tegra_camera/vi.c b/drivers/media/platform/soc_camera/tegra_camera/vi.c
index 9792d1869538..201abd2f7406 100644
--- a/drivers/media/platform/soc_camera/tegra_camera/vi.c
+++ b/drivers/media/platform/soc_camera/tegra_camera/vi.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, NVIDIA CORPORATION. All rights reserved.
+ * Copyright (c) 2013-2014, NVIDIA CORPORATION. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
@@ -33,11 +33,6 @@
#define TEGRA_VIP_H_ACTIVE_START 0x98
#define TEGRA_VIP_V_ACTIVE_START 0x10
-/* SYNCPTs 12-17 are reserved for VI. */
-#define TEGRA_VI_SYNCPT_VI NVSYNCPT_VI_ISP_2
-#define TEGRA_VI_SYNCPT_CSI_A NVSYNCPT_VI_ISP_3
-#define TEGRA_VI_SYNCPT_CSI_B NVSYNCPT_VI_ISP_4
-
/* Tegra CSI-MIPI registers. */
#define TEGRA_VI_OUT_1_INCR_SYNCPT 0x000
#define TEGRA_VI_OUT_1_INCR_SYNCPT_CNTRL 0x004
@@ -408,31 +403,34 @@ static void vi_clks_disable(struct tegra_camera_dev *cam)
}
}
+static void vi_init_syncpts(struct tegra_camera_dev *cam)
+{
+ cam->syncpt_id_csi_a = nvhost_get_syncpt_client_managed("vi_csi_A");
+
+ cam->syncpt_id_csi_b = nvhost_get_syncpt_client_managed("vi_csi_B");
+
+ cam->syncpt_id_vip = nvhost_get_syncpt_client_managed("vi_vip");
+}
+
static void vi_save_syncpts(struct tegra_camera_dev *cam)
{
cam->syncpt_csi_a =
- nvhost_syncpt_read_ext(cam->ndev,
- TEGRA_VI_SYNCPT_CSI_A);
+ nvhost_syncpt_read_ext(cam->ndev, cam->syncpt_id_csi_a);
cam->syncpt_csi_b =
- nvhost_syncpt_read_ext(cam->ndev,
- TEGRA_VI_SYNCPT_CSI_B);
+ nvhost_syncpt_read_ext(cam->ndev, cam->syncpt_id_csi_b);
cam->syncpt_vip =
- nvhost_syncpt_read_ext(cam->ndev,
- TEGRA_VI_SYNCPT_VI);
+ nvhost_syncpt_read_ext(cam->ndev, cam->syncpt_id_vip);
}
static void vi_incr_syncpts(struct tegra_camera_dev *cam)
{
- nvhost_syncpt_cpu_incr_ext(cam->ndev,
- TEGRA_VI_SYNCPT_CSI_A);
+ nvhost_syncpt_cpu_incr_ext(cam->ndev, cam->syncpt_id_csi_a);
- nvhost_syncpt_cpu_incr_ext(cam->ndev,
- TEGRA_VI_SYNCPT_CSI_B);
+ nvhost_syncpt_cpu_incr_ext(cam->ndev, cam->syncpt_id_csi_b);
- nvhost_syncpt_cpu_incr_ext(cam->ndev,
- TEGRA_VI_SYNCPT_VI);
+ nvhost_syncpt_cpu_incr_ext(cam->ndev, cam->syncpt_id_vip);
}
static void vi_capture_clean(struct tegra_camera_dev *cam)
@@ -517,7 +515,7 @@ static void vi_capture_setup_csi_a(struct tegra_camera_dev *cam,
TC_VI_REG_WT(cam, TEGRA_VI_CONT_SYNCPT_CSI_PPA_FRAME_END,
(0x1 << 8) | /* Enable continuous syncpt */
- TEGRA_VI_SYNCPT_CSI_A);
+ cam->syncpt_id_csi_a);
TC_VI_REG_WT(cam, TEGRA_CSI_PHY_CIL_COMMAND, 0x00020001);
@@ -600,7 +598,7 @@ static void vi_capture_setup_csi_b(struct tegra_camera_dev *cam,
TC_VI_REG_WT(cam, TEGRA_VI_CONT_SYNCPT_CSI_PPB_FRAME_END,
(0x1 << 8) | /* Enable continuous syncpt */
- TEGRA_VI_SYNCPT_CSI_B);
+ cam->syncpt_id_csi_b);
TC_VI_REG_WT(cam, TEGRA_CSI_PHY_CIL_COMMAND, 0x00010002);
@@ -640,7 +638,7 @@ static void vi_capture_setup_vip(struct tegra_camera_dev *cam,
TC_VI_REG_WT(cam, TEGRA_VI_CONT_SYNCPT_VIP_VSYNC,
(0x1 << 8) | /* Enable continuous syncpt */
- TEGRA_VI_SYNCPT_VI);
+ cam->syncpt_id_vip);
TC_VI_REG_WT(cam, TEGRA_VI_CAMERA_CONTROL, 0x00000004);
}
@@ -724,7 +722,7 @@ static int vi_capture_output_channel_setup(
TC_VI_REG_WT(cam, TEGRA_VI_CONT_SYNCPT_OUT_1,
(0x1 << 8) | /* Enable continuous syncpt */
- TEGRA_VI_SYNCPT_VI);
+ cam->syncpt_id_vip);
TC_VI_REG_WT(cam, TEGRA_VI_VI_ENABLE, 0x00000000);
} else if (buf->output_channel == 1) {
@@ -748,7 +746,7 @@ static int vi_capture_output_channel_setup(
TC_VI_REG_WT(cam, TEGRA_VI_CONT_SYNCPT_OUT_2,
(0x1 << 8) | /* Enable continuous syncpt */
- TEGRA_VI_SYNCPT_VI);
+ cam->syncpt_id_vip);
TC_VI_REG_WT(cam, TEGRA_VI_VI_ENABLE_2, 0x00000000);
} else {
@@ -902,7 +900,7 @@ static int vi_capture_start(struct tegra_camera_dev *cam,
TC_VI_REG_WT(cam, TEGRA_CSI_PIXEL_STREAM_PPA_COMMAND,
0x0000f005);
err = nvhost_syncpt_wait_timeout_ext(cam->ndev,
- TEGRA_VI_SYNCPT_CSI_A,
+ cam->syncpt_id_csi_a,
cam->syncpt_csi_a,
TEGRA_SYNCPT_CSI_WAIT_TIMEOUT,
NULL,
@@ -912,7 +910,7 @@ static int vi_capture_start(struct tegra_camera_dev *cam,
TC_VI_REG_WT(cam, TEGRA_CSI_PIXEL_STREAM_PPB_COMMAND,
0x0000f005);
err = nvhost_syncpt_wait_timeout_ext(cam->ndev,
- TEGRA_VI_SYNCPT_CSI_B,
+ cam->syncpt_id_csi_b,
cam->syncpt_csi_b,
TEGRA_SYNCPT_CSI_WAIT_TIMEOUT,
NULL,
@@ -922,7 +920,7 @@ static int vi_capture_start(struct tegra_camera_dev *cam,
TC_VI_REG_WT(cam, TEGRA_VI_CAMERA_CONTROL,
0x00000001);
err = nvhost_syncpt_wait_timeout_ext(cam->ndev,
- TEGRA_VI_SYNCPT_VI,
+ cam->syncpt_id_vip,
cam->syncpt_csi_a,
TEGRA_SYNCPT_VI_WAIT_TIMEOUT,
NULL,
@@ -978,7 +976,7 @@ static int vi_capture_stop(struct tegra_camera_dev *cam, int port)
if (vi_port_is_csi(port))
err = nvhost_syncpt_wait_timeout_ext(cam->ndev,
- TEGRA_VI_SYNCPT_VI,
+ cam->syncpt_id_vip,
cam->syncpt_vip,
TEGRA_SYNCPT_VI_WAIT_TIMEOUT,
NULL,
@@ -1053,6 +1051,7 @@ struct tegra_camera_ops vi_ops = {
.activate = vi_unpowergate,
.deactivate = vi_powergate,
+ .init_syncpts = vi_init_syncpts,
.save_syncpts = vi_save_syncpts,
.incr_syncpts = vi_incr_syncpts,
diff --git a/drivers/media/platform/soc_camera/tegra_camera/vi2.c b/drivers/media/platform/soc_camera/tegra_camera/vi2.c
index f58c03bff8a5..bf69682c85c8 100644
--- a/drivers/media/platform/soc_camera/tegra_camera/vi2.c
+++ b/drivers/media/platform/soc_camera/tegra_camera/vi2.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, NVIDIA CORPORATION. All rights reserved.
+ * Copyright (c) 2013-2014, NVIDIA CORPORATION. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
@@ -29,9 +29,6 @@
#define TEGRA_SYNCPT_CSI_WAIT_TIMEOUT 200
-#define TEGRA_VI_SYNCPT_CSI_A NVSYNCPT_VI_0_3
-#define TEGRA_VI_SYNCPT_CSI_B NVSYNCPT_VI_1_3
-
#define TEGRA_VI_CFG_VI_INCR_SYNCPT 0x000
#define TEGRA_VI_CFG_VI_INCR_SYNCPT_CNTRL 0x004
#define TEGRA_VI_CFG_VI_INCR_SYNCPT_ERROR 0x008
@@ -438,24 +435,27 @@ static void vi2_clks_disable(struct tegra_camera_dev *cam)
}
}
+static void vi2_init_syncpts(struct tegra_camera_dev *cam)
+{
+ cam->syncpt_id_csi_a = nvhost_get_syncpt_client_managed("vi_csi_A");
+
+ cam->syncpt_id_csi_b = nvhost_get_syncpt_client_managed("vi_csi_B");
+}
+
static void vi2_save_syncpts(struct tegra_camera_dev *cam)
{
cam->syncpt_csi_a =
- nvhost_syncpt_read_ext(cam->ndev,
- TEGRA_VI_SYNCPT_CSI_A);
+ nvhost_syncpt_read_ext(cam->ndev, cam->syncpt_id_csi_a);
cam->syncpt_csi_b =
- nvhost_syncpt_read_ext(cam->ndev,
- TEGRA_VI_SYNCPT_CSI_B);
+ nvhost_syncpt_read_ext(cam->ndev, cam->syncpt_id_csi_b);
}
static void vi2_incr_syncpts(struct tegra_camera_dev *cam)
{
- nvhost_syncpt_cpu_incr_ext(cam->ndev,
- TEGRA_VI_SYNCPT_CSI_A);
+ nvhost_syncpt_cpu_incr_ext(cam->ndev, cam->syncpt_id_csi_a);
- nvhost_syncpt_cpu_incr_ext(cam->ndev,
- TEGRA_VI_SYNCPT_CSI_B);
+ nvhost_syncpt_cpu_incr_ext(cam->ndev, cam->syncpt_id_csi_b);
}
static void vi2_capture_clean(struct tegra_camera_dev *cam)
@@ -493,7 +493,7 @@ static int vi2_capture_setup_csi_0(struct tegra_camera_dev *cam,
/* VI_MWA_REQ_DONE */
TC_VI_REG_WT(cam, TEGRA_VI_CFG_VI_INCR_SYNCPT,
- (0x4 << 8) | TEGRA_VI_SYNCPT_CSI_A);
+ (0x4 << 8) | cam->syncpt_id_csi_a);
if (cam->tpg_mode) {
TC_VI_REG_WT(cam, TEGRA_CSI_PATTERN_GENERATOR_CTRL_A,
@@ -546,7 +546,7 @@ static int vi2_capture_setup_csi_1(struct tegra_camera_dev *cam,
/* VI_MWB_REQ_DONE */
TC_VI_REG_WT(cam, TEGRA_VI_CFG_VI_INCR_SYNCPT,
- (0x5 << 8) | TEGRA_VI_SYNCPT_CSI_B);
+ (0x5 << 8) | cam->syncpt_id_csi_b);
if (cam->tpg_mode) {
TC_VI_REG_WT(cam, TEGRA_CSI_PATTERN_GENERATOR_CTRL_B,
@@ -717,7 +717,7 @@ static int vi2_capture_start(struct tegra_camera_dev *cam,
0x0000f005);
TC_VI_REG_WT(cam, TEGRA_VI_CSI_0_SINGLE_SHOT, 0x1);
err = nvhost_syncpt_wait_timeout_ext(cam->ndev,
- TEGRA_VI_SYNCPT_CSI_A,
+ cam->syncpt_id_csi_a,
cam->syncpt_csi_a,
TEGRA_SYNCPT_CSI_WAIT_TIMEOUT,
NULL,
@@ -728,7 +728,7 @@ static int vi2_capture_start(struct tegra_camera_dev *cam,
0x0000f005);
TC_VI_REG_WT(cam, TEGRA_VI_CSI_1_SINGLE_SHOT, 0x1);
err = nvhost_syncpt_wait_timeout_ext(cam->ndev,
- TEGRA_VI_SYNCPT_CSI_B,
+ cam->syncpt_id_csi_b,
cam->syncpt_csi_b,
TEGRA_SYNCPT_CSI_WAIT_TIMEOUT,
NULL,
@@ -804,6 +804,7 @@ struct tegra_camera_ops vi2_ops = {
.activate = vi2_sw_reset,
+ .init_syncpts = vi2_init_syncpts,
.save_syncpts = vi2_save_syncpts,
.incr_syncpts = vi2_incr_syncpts,