summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVenu Raidu <vraidu@codeaurora.org>2019-02-22 11:56:55 +0530
committerShadul Shaikh <sshadu@codeaurora.org>2019-07-16 11:48:25 +0530
commitd1644a2fe6d9b76bae83d830861d23670186c6a8 (patch)
treec0a7b473cbdfca83f5a22aff4e53658cc4b89c7c
parent1b2ea6cc74925fbe5f79d97cbc5f315987b52d30 (diff)
msm: camera_v2: Reset CPP AXI at camera close
CPP AXI need to be reset during camera close to overcome stale data. Change-Id: I4af43bbf67a84eaa5fc2a722854117a5936ab896 Signed-off-by: Venu Raidu <vraidu@codeaurora.org> Signed-off-by: Sumalatha Malothu <smalot@codeaurora.org> Signed-off-by: Shadul Shaikh <sshadu@codeaurora.org>
-rw-r--r--drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c22
-rw-r--r--drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.h1
2 files changed, 23 insertions, 0 deletions
diff --git a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c
index 6339555bdf76..80e1558e686a 100644
--- a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c
+++ b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c
@@ -1499,6 +1499,8 @@ static int cpp_close_node(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
{
uint32_t i;
int rc = -1;
+ int counter = 0;
+ u32 result = 0;
struct cpp_device *cpp_dev = NULL;
struct msm_device_queue *processing_q = NULL;
struct msm_device_queue *eventData_q = NULL;
@@ -1579,6 +1581,26 @@ static int cpp_close_node(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
msm_camera_io_r(cpp_dev->cpp_hw_base + 0x88));
pr_debug("DEBUG_R1: 0x%x\n",
msm_camera_io_r(cpp_dev->cpp_hw_base + 0x8C));
+ /* mask IRQ status */
+ msm_camera_io_w(0xB, cpp_dev->cpp_hw_base + 0xC);
+
+ while (counter < MSM_CPP_AXI_RESET_RETRIES) {
+ /* MMSS_A_CPP_AXI_CMD = 0x16C, reset 0x1*/
+ msm_camera_io_w(0x1, cpp_dev->cpp_hw_base + 0x16C);
+ usleep_range(100, 200);
+ result = msm_camera_io_r(cpp_dev->cpp_hw_base + 0x16C);
+ if (result & 0x1) {
+ pr_debug("CPP AXI reset successful result %d",
+ result);
+ break;
+ }
+ counter++;
+ }
+
+ if (!(result & 0x1))
+ pr_err("CPP AXI reset un-successful result %d",
+ result);
+
msm_camera_io_w(0x0, cpp_dev->base + MSM_CPP_MICRO_CLKEN_CTL);
msm_cpp_clear_timer(cpp_dev);
cpp_release_hardware(cpp_dev);
diff --git a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.h b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.h
index 0f5d6759acd3..8e2334b0ee5f 100644
--- a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.h
+++ b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.h
@@ -92,6 +92,7 @@
#define MSM_CPP_START_ADDRESS 0x0
#define MSM_CPP_END_ADDRESS 0x3F00
+#define MSM_CPP_AXI_RESET_RETRIES 5
#define MSM_CPP_POLL_RETRIES 200
#define MSM_CPP_TASKLETQ_SIZE 16
#define MSM_CPP_TX_FIFO_LEVEL 16