]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
media: tegra_camera: use dynamic syncpts
authorDeepak Nibade <dnibade@nvidia.com>
Fri, 7 Feb 2014 09:33:01 +0000 (15:03 +0530)
committerTerje Bergstrom <tbergstrom@nvidia.com>
Thu, 20 Mar 2014 06:50:26 +0000 (23:50 -0700)
- 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: I6bdaace034b966d8409308fd52f5d2b1507314c1
Signed-off-by: Deepak Nibade <dnibade@nvidia.com>
Reviewed-on: http://git-master/r/381958
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
drivers/media/platform/soc_camera/tegra_camera/common.c
drivers/media/platform/soc_camera/tegra_camera/common.h
drivers/media/platform/soc_camera/tegra_camera/vi.c
drivers/media/platform/soc_camera/tegra_camera/vi2.c

index 00a7049150c5117c1cfef835b31ea2fea0b1cce4..41685abc38b65a7a30a2a0d5e0c9013be9fa3fb2 100644 (file)
@@ -882,6 +882,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",
index 94a3f46bbf926612b1b2183c35d28cc91be2df83..76de2a070cc6e07048828fd1836942a5127360e4 100644 (file)
@@ -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;
index 85f60713b4e37e8fad3e0265c6b36ff1891e3e42..6bdec974164d82b23774c64be27232b82d58fb04 100644 (file)
 #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,33 +403,39 @@ 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)
 {
        u32 val;
 
        if (!nvhost_syncpt_read_ext_check(cam->ndev,
-                       TEGRA_VI_SYNCPT_CSI_A, &val))
+                       cam->syncpt_id_csi_a, &val))
                cam->syncpt_csi_a = val;
 
        if (!nvhost_syncpt_read_ext_check(cam->ndev,
-                       TEGRA_VI_SYNCPT_CSI_B, &val))
+                       cam->syncpt_id_csi_b, &val))
                cam->syncpt_csi_b = val;
 
        if (!nvhost_syncpt_read_ext_check(cam->ndev,
-                       TEGRA_VI_SYNCPT_VI, &val))
+                       cam->syncpt_id_vip, &val))
                cam->syncpt_vip = val;
 }
 
 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)
@@ -519,7 +520,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);
 
@@ -602,7 +603,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);
 
@@ -642,7 +643,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);
 }
@@ -726,7 +727,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) {
@@ -750,7 +751,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 {
@@ -904,7 +905,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,
@@ -914,7 +915,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,
@@ -924,7 +925,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,
@@ -980,7 +981,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,
@@ -1055,6 +1056,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,
 
index 232340082e06e558f0dfd893d04fd14635ab8d61..8fc4618c2546823ac6a99046fb0841b02507c498 100644 (file)
@@ -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
@@ -431,26 +428,31 @@ 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)
 {
        u32 val;
 
        if (!nvhost_syncpt_read_ext_check(cam->ndev,
-                       TEGRA_VI_SYNCPT_CSI_A, &val))
+                       cam->syncpt_id_csi_a, &val))
                cam->syncpt_csi_a = val;
 
        if (!nvhost_syncpt_read_ext_check(cam->ndev,
-                       TEGRA_VI_SYNCPT_CSI_B, &val))
+                       cam->syncpt_id_csi_b, &val))
                cam->syncpt_csi_b = val;
 }
 
 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)
@@ -488,7 +490,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,
@@ -541,7 +543,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,
@@ -712,7 +714,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,
@@ -723,7 +725,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,
@@ -799,6 +801,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,