summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2017-03-14 23:45:36 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2017-03-14 23:45:36 -0700
commitba76a5fa05e9ba0f029a2c6fd9c57b77251db5dc (patch)
treeb1bad3c7b28b690fb37047e3db0553f59e72d891
parentf3392ded876a86f4a96ea470919bcce3cd1547a9 (diff)
parent8628870cc9d07926488c0c08fb61b2b8149121ff (diff)
Merge "msm: camera: isp: correct the CX iPeak voting logic"
-rw-r--r--drivers/media/platform/msm/camera_v2/isp/msm_isp.c4
-rw-r--r--drivers/media/platform/msm/camera_v2/isp/msm_isp.h1
-rw-r--r--drivers/media/platform/msm/camera_v2/isp/msm_isp47.c63
3 files changed, 44 insertions, 24 deletions
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp.c
index bb3f0dca9d92..f2f3388b41c1 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp.c
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp.c
@@ -590,9 +590,9 @@ int vfe_hw_probe(struct platform_device *pdev)
(struct msm_vfe_hardware_info *) match_dev->data;
/* Cx ipeak support */
if (of_find_property(pdev->dev.of_node,
- "qcom,vfe_cx_ipeak", NULL)) {
+ "qcom,vfe-cx-ipeak", NULL)) {
vfe_dev->vfe_cx_ipeak = cx_ipeak_register(
- pdev->dev.of_node, "qcom,vfe_cx_ipeak");
+ pdev->dev.of_node, "qcom,vfe-cx-ipeak");
}
} else {
vfe_dev->hw_info = (struct msm_vfe_hardware_info *)
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h
index c8cc66a564ce..941ab97d150b 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h
@@ -768,7 +768,6 @@ struct vfe_device {
size_t num_hvx_clk;
size_t num_norm_clk;
enum cam_ahb_clk_vote ahb_vote;
- bool turbo_vote;
struct cx_ipeak_client *vfe_cx_ipeak;
/* Sync variables*/
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c
index d829aefe6c98..049f3d47dfab 100644
--- a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c
+++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c
@@ -331,7 +331,6 @@ int msm_vfe47_init_hardware(struct vfe_device *vfe_dev)
goto ahb_vote_fail;
}
vfe_dev->ahb_vote = CAM_AHB_SVS_VOTE;
- vfe_dev->turbo_vote = 0;
vfe_dev->common_data->dual_vfe_res->vfe_base[vfe_dev->pdev->id] =
vfe_dev->vfe_base;
@@ -2563,31 +2562,53 @@ int msm_vfe47_set_clk_rate(struct vfe_device *vfe_dev, long *rate)
int rc = 0;
int clk_idx = vfe_dev->hw_info->vfe_clk_idx;
int ret;
+ long clk_rate, prev_clk_rate;
+ clk_rate = clk_round_rate(vfe_dev->vfe_clk[clk_idx], *rate);
+ if (vfe_dev->msm_isp_vfe_clk_rate == clk_rate)
+ return rc;
+
+ prev_clk_rate = vfe_dev->msm_isp_vfe_clk_rate;
+ vfe_dev->msm_isp_vfe_clk_rate = clk_rate;
+ /*
+ * if cx_ipeak is supported vote first so that dsp throttling is
+ * reduced before we go to turbo
+ */
+ if ((vfe_dev->vfe_cx_ipeak) &&
+ (vfe_dev->msm_isp_vfe_clk_rate >=
+ vfe_dev->vfe_clk_rates[MSM_VFE_CLK_RATE_TURBO]
+ [vfe_dev->hw_info->vfe_clk_idx]) &&
+ prev_clk_rate <
+ vfe_dev->vfe_clk_rates[MSM_VFE_CLK_RATE_TURBO]
+ [vfe_dev->hw_info->vfe_clk_idx]) {
+ ret = cx_ipeak_update(vfe_dev->vfe_cx_ipeak, true);
+ if (ret) {
+ pr_err("%s: cx_ipeak_update failed %d\n",
+ __func__, ret);
+ return ret;
+ }
+ }
+ /*set vfe clock*/
rc = msm_camera_clk_set_rate(&vfe_dev->pdev->dev,
vfe_dev->vfe_clk[clk_idx], *rate);
if (rc < 0)
return rc;
- *rate = clk_round_rate(vfe_dev->vfe_clk[clk_idx], *rate);
- vfe_dev->msm_isp_vfe_clk_rate = *rate;
- if (vfe_dev->vfe_cx_ipeak) {
- if (vfe_dev->msm_isp_vfe_clk_rate >=
- vfe_dev->vfe_clk_rates[MSM_VFE_CLK_RATE_TURBO]
- [vfe_dev->hw_info->vfe_clk_idx] &&
- vfe_dev->turbo_vote == 0) {
- ret = cx_ipeak_update(vfe_dev->vfe_cx_ipeak, true);
- if (ret)
- pr_debug("%s: cx_ipeak_update failed %d\n",
- __func__, ret);
- else
- vfe_dev->turbo_vote = 1;
- } else if (vfe_dev->turbo_vote == 1) {
- ret = cx_ipeak_update(vfe_dev->vfe_cx_ipeak, false);
- if (ret)
- pr_debug("%s: cx_ipeak_update failed %d\n",
- __func__, ret);
- else
- vfe_dev->turbo_vote = 0;
+ /*
+ * if cx_ipeak is supported remove the vote for non-turbo clock and
+ * if voting done earlier
+ */
+ if ((vfe_dev->vfe_cx_ipeak) &&
+ (vfe_dev->msm_isp_vfe_clk_rate <
+ vfe_dev->vfe_clk_rates[MSM_VFE_CLK_RATE_TURBO]
+ [vfe_dev->hw_info->vfe_clk_idx]) &&
+ prev_clk_rate >=
+ vfe_dev->vfe_clk_rates[MSM_VFE_CLK_RATE_TURBO]
+ [vfe_dev->hw_info->vfe_clk_idx]) {
+ ret = cx_ipeak_update(vfe_dev->vfe_cx_ipeak, false);
+ if (ret) {
+ pr_err("%s: cx_ipeak_update failed %d\n",
+ __func__, ret);
+ return ret;
}
}
if (vfe_dev->hw_info->vfe_ops.core_ops.ahb_clk_cfg)