diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2018-12-04 00:21:58 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2018-12-04 00:21:57 -0800 |
commit | 08a391fbb94e39eef385c7441fc403b503a13b0b (patch) | |
tree | 367f6e36ca3439b3629268d17a59f14524b319d3 /drivers | |
parent | 0b402f74a04ff7f09193c5c88cdf860498b93b5c (diff) | |
parent | b97ae1f1d013d5a19f962b74528b2e4299baf862 (diff) |
Merge "msm: ais: Move wait for early camera handoff"
Diffstat (limited to 'drivers')
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", |