Merge "msm: camera: cpp: Vote AHB with clock enabled and no mem retention"

This commit is contained in:
Linux Build Service Account 2016-08-16 10:20:24 -07:00 committed by Gerrit - the friendly Code Review server
commit 0c50b41e40
2 changed files with 39 additions and 22 deletions

View file

@ -373,24 +373,24 @@
camss-vdd-supply = <&gdsc_camss_top>;
vdd-supply = <&gdsc_cpp>;
qcom,vdd-names = "smmu-vdd", "camss-vdd", "vdd";
clocks = <&clock_mmss clk_mmss_mnoc_maxi_clk>,
clocks = <&clock_gcc clk_mmssnoc_axi_clk>,
<&clock_mmss clk_mmss_mnoc_maxi_clk>,
<&clock_mmss clk_mmss_mnoc_ahb_clk>,
<&clock_mmss clk_mmss_camss_ahb_clk>,
<&clock_mmss clk_mmss_camss_top_ahb_clk>,
<&clock_mmss clk_cpp_clk_src>,
<&clock_mmss clk_mmss_camss_cpp_clk>,
<&clock_mmss clk_mmss_camss_cpp_ahb_clk>,
<&clock_mmss clk_mmss_camss_cpp_axi_clk>,
<&clock_mmss clk_mmss_camss_cpp_clk>,
<&clock_mmss clk_mmss_camss_micro_ahb_clk>,
<&clock_mmss clk_mmss_bimc_smmu_axi_clk>,
<&clock_mmss clk_mmss_camss_cpp_vbif_ahb_clk>;
clock-names = "mnoc_maxi_clk", "mnoc_ahb_clk",
clock-names = "mmssnoc_axi_clk",
"mnoc_maxi_clk", "mnoc_ahb_clk",
"camss_ahb_clk", "camss_top_ahb_clk",
"cpp_core_clk", "camss_cpp_ahb_clk",
"camss_cpp_axi_clk", "camss_cpp_clk",
"micro_iface_clk", "mmss_smmu_axi_clk",
"cpp_vbif_ahb_clk";
qcom,clock-rates = <0 0 0 0 200000000 0 0 200000000 0 0 0>;
"camss_cpp_axi_clk", "micro_iface_clk",
"mmss_smmu_axi_clk", "cpp_vbif_ahb_clk";
qcom,clock-rates = <0 0 0 0 0 200000000 0 0 0 0 0>;
qcom,min-clock-rate = <200000000>;
qcom,bus-master = <1>;
qcom,vbif-qos-setting = <0x20 0x10000000>,

View file

@ -25,6 +25,7 @@
#include <linux/timer.h>
#include <linux/kernel.h>
#include <linux/workqueue.h>
#include <linux/clk/msm-clk.h>
#include <media/v4l2-event.h>
#include <media/v4l2-ioctl.h>
#include <media/msmb_camera.h>
@ -788,13 +789,6 @@ static int cpp_init_hardware(struct cpp_device *cpp_dev)
int rc = 0;
uint32_t vbif_version;
rc = cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CPP,
CAM_AHB_SVS_VOTE);
if (rc < 0) {
pr_err("%s: failed to vote for AHB\n", __func__);
goto ahb_vote_fail;
}
rc = msm_camera_regulator_enable(cpp_dev->cpp_vdd,
cpp_dev->num_reg, true);
if (rc < 0) {
@ -817,6 +811,13 @@ static int cpp_init_hardware(struct cpp_device *cpp_dev)
goto clk_failed;
}
rc = cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CPP,
CAM_AHB_SVS_VOTE);
if (rc < 0) {
pr_err("%s: failed to vote for AHB\n", __func__);
goto ahb_vote_fail;
}
if (cpp_dev->state != CPP_STATE_BOOT) {
rc = msm_camera_register_irq(cpp_dev->pdev, cpp_dev->irq,
msm_cpp_irq, IRQF_TRIGGER_RISING, "cpp", cpp_dev);
@ -880,16 +881,16 @@ static int cpp_init_hardware(struct cpp_device *cpp_dev)
pwr_collapse_reset:
msm_cpp_update_gdscr_status(cpp_dev, false);
req_irq_fail:
if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CPP,
CAM_AHB_SUSPEND_VOTE) < 0)
pr_err("%s: failed to remove vote for AHB\n", __func__);
ahb_vote_fail:
msm_camera_clk_enable(&cpp_dev->pdev->dev, cpp_dev->clk_info,
cpp_dev->cpp_clk, cpp_dev->num_clks, false);
clk_failed:
msm_camera_regulator_enable(cpp_dev->cpp_vdd,
cpp_dev->num_reg, false);
reg_enable_failed:
if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CPP,
CAM_AHB_SUSPEND_VOTE) < 0)
pr_err("%s: failed to remove vote for AHB\n", __func__);
ahb_vote_fail:
return rc;
}
@ -903,6 +904,9 @@ static void cpp_release_hardware(struct cpp_device *cpp_dev)
}
msm_cpp_delete_buff_queue(cpp_dev);
msm_cpp_update_gdscr_status(cpp_dev, false);
if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CPP,
CAM_AHB_SUSPEND_VOTE) < 0)
pr_err("%s: failed to remove vote for AHB\n", __func__);
msm_camera_clk_enable(&cpp_dev->pdev->dev, cpp_dev->clk_info,
cpp_dev->cpp_clk, cpp_dev->num_clks, false);
msm_camera_regulator_enable(cpp_dev->cpp_vdd, cpp_dev->num_reg, false);
@ -912,9 +916,6 @@ static void cpp_release_hardware(struct cpp_device *cpp_dev)
}
cpp_dev->stream_cnt = 0;
if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CPP,
CAM_AHB_SUSPEND_VOTE) < 0)
pr_err("%s: failed to remove vote for AHB\n", __func__);
}
static int32_t cpp_load_fw(struct cpp_device *cpp_dev, char *fw_name_bin)
@ -3932,6 +3933,7 @@ static int cpp_probe(struct platform_device *pdev)
{
struct cpp_device *cpp_dev;
int rc = 0;
int i = 0;
CPP_DBG("E");
cpp_dev = kzalloc(sizeof(struct cpp_device), GFP_KERNEL);
@ -4000,6 +4002,21 @@ static int cpp_probe(struct platform_device *pdev)
goto mem_err;
}
/* set memcore and mem periphery logic flags to 0 */
for (i = 0; i < cpp_dev->num_clks; i++) {
if ((strcmp(cpp_dev->clk_info[i].clk_name,
"cpp_core_clk") == 0) ||
(strcmp(cpp_dev->clk_info[i].clk_name,
"camss_cpp_axi_clk") == 0) ||
(strcmp(cpp_dev->clk_info[i].clk_name,
"micro_iface_clk") == 0)) {
msm_camera_set_clk_flags(cpp_dev->cpp_clk[i],
CLKFLAG_NORETAIN_MEM);
msm_camera_set_clk_flags(cpp_dev->cpp_clk[i],
CLKFLAG_NORETAIN_PERIPH);
}
}
rc = msm_camera_get_regulator_info(pdev, &cpp_dev->cpp_vdd,
&cpp_dev->num_reg);
if (rc < 0) {