summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2018-12-04 00:21:58 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2018-12-04 00:21:57 -0800
commit08a391fbb94e39eef385c7441fc403b503a13b0b (patch)
tree367f6e36ca3439b3629268d17a59f14524b319d3 /drivers
parent0b402f74a04ff7f09193c5c88cdf860498b93b5c (diff)
parentb97ae1f1d013d5a19f962b74528b2e4299baf862 (diff)
Merge "msm: ais: Move wait for early camera handoff"
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/platform/msm/ais/isp/msm_isp_util.c5
-rw-r--r--drivers/media/platform/msm/ais/sensor/cci/msm_early_cam.c20
-rw-r--r--drivers/media/platform/msm/ais/sensor/cci/msm_early_cam.h1
-rw-r--r--drivers/media/platform/msm/ais/sensor/msm_sensor_init.c23
4 files changed, 29 insertions, 20 deletions
diff --git a/drivers/media/platform/msm/ais/isp/msm_isp_util.c b/drivers/media/platform/msm/ais/isp/msm_isp_util.c
index a9b6e5e6a861..83b3dfe68932 100644
--- a/drivers/media/platform/msm/ais/isp/msm_isp_util.c
+++ b/drivers/media/platform/msm/ais/isp/msm_isp_util.c
@@ -23,6 +23,7 @@
#include "cam_smmu_api.h"
#define CREATE_TRACE_POINTS
#include "trace/events/msm_cam.h"
+#include "sensor/cci/msm_early_cam.h"
#define MAX_ISP_V4l2_EVENTS 100
#define MAX_ISP_REG_LIST 100
@@ -2290,6 +2291,9 @@ int msm_isp_open_node(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
vfe_dev->isp_raw1_debug = 0;
vfe_dev->isp_raw2_debug = 0;
+ /* Postpone hardware changes until early camera is complete */
+ msm_early_camera_wait();
+
if (vfe_dev->hw_info->vfe_ops.core_ops.init_hw(vfe_dev) < 0) {
pr_err("%s: init hardware failed\n", __func__);
vfe_dev->vfe_open_cnt--;
@@ -2302,7 +2306,6 @@ int msm_isp_open_node(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
atomic_set(&vfe_dev->error_info.overflow_state, NO_OVERFLOW);
vfe_dev->hw_info->vfe_ops.core_ops.clear_status_reg(vfe_dev);
-
vfe_dev->vfe_hw_version = msm_camera_io_r(vfe_dev->vfe_base);
ISP_DBG("%s: HW Version: 0x%x\n", __func__, vfe_dev->vfe_hw_version);
rc = vfe_dev->hw_info->vfe_ops.core_ops.reset_hw(vfe_dev, 1, 1);
diff --git a/drivers/media/platform/msm/ais/sensor/cci/msm_early_cam.c b/drivers/media/platform/msm/ais/sensor/cci/msm_early_cam.c
index 885f09c85cb8..1329511440c4 100644
--- a/drivers/media/platform/msm/ais/sensor/cci/msm_early_cam.c
+++ b/drivers/media/platform/msm/ais/sensor/cci/msm_early_cam.c
@@ -17,6 +17,7 @@
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/of_platform.h>
+#include <linux/iopoll.h>
#include "msm_sd.h"
#include "msm_early_cam.h"
#include "msm_cam_cci_hwreg.h"
@@ -38,6 +39,12 @@
static struct platform_driver msm_early_camera_driver;
static struct early_cam_device *new_early_cam_dev;
+#define MMSS_A_VFE_0_BASE 0x00A10000
+#define MMSS_A_VFE_0_SIZE 0x1000
+#define EARLY_CAMERA_SIGNAL_DONE 0xa5a5a5a5
+#define EARLY_CAMERA_SIGNAL_DISABLED 0
+#define MMSS_A_VFE_0_SPARE 0xC84
+
int msm_early_cam_disable_clocks(void)
{
int rc = 0;
@@ -253,6 +260,19 @@ int msm_ais_disable_clocks(void)
return 0;
}
+
+void msm_early_camera_wait(void)
+{
+ u32 val = 0;
+ void __iomem *base;
+
+ base = ioremap(MMSS_A_VFE_0_BASE, MMSS_A_VFE_0_SIZE);
+ readl_poll_timeout(base + MMSS_A_VFE_0_SPARE, val,
+ ((val == EARLY_CAMERA_SIGNAL_DONE)
+ || (val == EARLY_CAMERA_SIGNAL_DISABLED)), 0, 0);
+ iounmap(base);
+}
+
static int msm_early_cam_probe(struct platform_device *pdev)
{
int rc = 0;
diff --git a/drivers/media/platform/msm/ais/sensor/cci/msm_early_cam.h b/drivers/media/platform/msm/ais/sensor/cci/msm_early_cam.h
index e2530d05955c..246ad8d0966c 100644
--- a/drivers/media/platform/msm/ais/sensor/cci/msm_early_cam.h
+++ b/drivers/media/platform/msm/ais/sensor/cci/msm_early_cam.h
@@ -53,4 +53,5 @@ struct early_cam_device {
int msm_early_cam_disable_clocks(void);
int msm_ais_enable_clocks(void);
int msm_ais_disable_clocks(void);
+void msm_early_camera_wait(void);
#endif
diff --git a/drivers/media/platform/msm/ais/sensor/msm_sensor_init.c b/drivers/media/platform/msm/ais/sensor/msm_sensor_init.c
index ffbf963e819e..7158d413a033 100644
--- a/drivers/media/platform/msm/ais/sensor/msm_sensor_init.c
+++ b/drivers/media/platform/msm/ais/sensor/msm_sensor_init.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -23,9 +23,6 @@
#undef CDBG
#define CDBG(fmt, args...) pr_debug(fmt, ##args)
-#define EARLY_CAMERA_SIGNAL_DONE 0xa5a5a5a5
-#define EARLY_CAMERA_SIGNAL_DISABLED 0
-
static bool early_camera_clock_off;
static struct msm_sensor_init_t *s_init;
@@ -48,14 +45,10 @@ static int msm_sensor_wait_for_probe_done(struct msm_sensor_init_t *s_init)
return rc;
}
-#define MMSS_A_VFE_0_SPARE 0xC84
-
/* Static function definition */
int32_t msm_sensor_driver_cmd(struct msm_sensor_init_t *s_init, void *arg)
{
int32_t rc = 0;
- u32 val = 0;
- void __iomem *base;
struct sensor_init_cfg_data *cfg = (struct sensor_init_cfg_data *)arg;
/* Validate input parameters */
@@ -64,6 +57,8 @@ int32_t msm_sensor_driver_cmd(struct msm_sensor_init_t *s_init, void *arg)
return -EINVAL;
}
+ /* Postpone hardware changes until early camera is complete */
+ msm_early_camera_wait();
pr_debug("%s : %d", __func__, cfg->cfgtype);
switch (cfg->cfgtype) {
case CFG_SINIT_PROBE:
@@ -79,17 +74,7 @@ int32_t msm_sensor_driver_cmd(struct msm_sensor_init_t *s_init, void *arg)
case CFG_SINIT_PROBE_DONE:
if (early_camera_clock_off == false) {
- base = ioremap(0x00A10000, 0x1000);
- val = msm_camera_io_r_mb(base + MMSS_A_VFE_0_SPARE);
- while (val != EARLY_CAMERA_SIGNAL_DONE) {
- if (val == EARLY_CAMERA_SIGNAL_DISABLED)
- break;
- msleep(1000);
- val = msm_camera_io_r_mb(
- base + MMSS_A_VFE_0_SPARE);
- pr_err("Waiting for signal from LK val = %u\n",
- val);
- }
+ msm_early_camera_wait();
rc = msm_early_cam_disable_clocks();
if (rc < 0) {
pr_err("Failed to disable early camera :%d\n",