diff options
author | Deepak Nibade <dnibade@nvidia.com> | 2014-02-07 15:03:01 +0530 |
---|---|---|
committer | Terje Bergstrom <tbergstrom@nvidia.com> | 2014-02-13 22:14:07 -0800 |
commit | eae55c8e4cbb65e3ed1a8c8ef8150d8a6ba938bf (patch) | |
tree | ddedf6ce22176e25b0c21ca73b319a16108024a4 | |
parent | 27690e435d7ad65f14935c134e1b496c4c3f816a (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>
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, |