msm: ais: Add regulator enable and disable independent of CSID
Regulator enable and disable of CSIPHY depends on the CSID module. Make the enable and disable of clk regulator independent of CSIPHY. Change-Id: Id635b0dfd04a79bac580689a0da8592c6ff87661 CRs-Fixed: 1107702 Signed-off-by: Terence Ho <terenceh@codeaurora.org> Signed-off-by: Andy Sun <bins@codeaurora.org>
This commit is contained in:
parent
96e3d4de6d
commit
2d1568326e
2 changed files with 90 additions and 4 deletions
|
@ -787,6 +787,25 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev)
|
||||||
|
|
||||||
CDBG("%s:%d called\n", __func__, __LINE__);
|
CDBG("%s:%d called\n", __func__, __LINE__);
|
||||||
|
|
||||||
|
rc = msm_camera_config_vreg(&csiphy_dev->pdev->dev,
|
||||||
|
csiphy_dev->csiphy_vreg,
|
||||||
|
csiphy_dev->regulator_count, NULL, 0,
|
||||||
|
&csiphy_dev->csiphy_reg_ptr[0], 1);
|
||||||
|
if (rc < 0) {
|
||||||
|
pr_err("%s:%d csiphy config_vreg failed\n",
|
||||||
|
__func__, __LINE__);
|
||||||
|
goto csiphy_vreg_config_fail;
|
||||||
|
}
|
||||||
|
rc = msm_camera_enable_vreg(&csiphy_dev->pdev->dev,
|
||||||
|
csiphy_dev->csiphy_vreg,
|
||||||
|
csiphy_dev->regulator_count, NULL, 0,
|
||||||
|
&csiphy_dev->csiphy_reg_ptr[0], 1);
|
||||||
|
if (rc < 0) {
|
||||||
|
pr_err("%s:%d csiphy enable_vreg failed\n",
|
||||||
|
__func__, __LINE__);
|
||||||
|
goto top_vreg_enable_failed;
|
||||||
|
}
|
||||||
|
|
||||||
rc = msm_camera_clk_enable(&csiphy_dev->pdev->dev,
|
rc = msm_camera_clk_enable(&csiphy_dev->pdev->dev,
|
||||||
csiphy_dev->csiphy_clk_info, csiphy_dev->csiphy_clk,
|
csiphy_dev->csiphy_clk_info, csiphy_dev->csiphy_clk,
|
||||||
csiphy_dev->num_clk, true);
|
csiphy_dev->num_clk, true);
|
||||||
|
@ -795,7 +814,7 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev)
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
pr_err("%s: csiphy clk enable failed\n", __func__);
|
pr_err("%s: csiphy clk enable failed\n", __func__);
|
||||||
csiphy_dev->ref_count--;
|
csiphy_dev->ref_count--;
|
||||||
goto csiphy_resource_fail;
|
goto csiphy_enable_clk_fail;
|
||||||
}
|
}
|
||||||
CDBG("%s:%d called\n", __func__, __LINE__);
|
CDBG("%s:%d called\n", __func__, __LINE__);
|
||||||
|
|
||||||
|
@ -823,7 +842,17 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev)
|
||||||
csiphy_dev->csiphy_state = CSIPHY_POWER_UP;
|
csiphy_dev->csiphy_state = CSIPHY_POWER_UP;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
csiphy_resource_fail:
|
csiphy_enable_clk_fail:
|
||||||
|
msm_camera_enable_vreg(&csiphy_dev->pdev->dev,
|
||||||
|
csiphy_dev->csiphy_vreg,
|
||||||
|
csiphy_dev->regulator_count, NULL, 0,
|
||||||
|
&csiphy_dev->csiphy_reg_ptr[0], 0);
|
||||||
|
top_vreg_enable_failed:
|
||||||
|
msm_camera_config_vreg(&csiphy_dev->pdev->dev,
|
||||||
|
csiphy_dev->csiphy_vreg,
|
||||||
|
csiphy_dev->regulator_count, NULL, 0,
|
||||||
|
&csiphy_dev->csiphy_reg_ptr[0], 0);
|
||||||
|
csiphy_vreg_config_fail:
|
||||||
if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY,
|
if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY,
|
||||||
CAM_AHB_SUSPEND_VOTE) < 0)
|
CAM_AHB_SUSPEND_VOTE) < 0)
|
||||||
pr_err("%s: failed to vote for AHB\n", __func__);
|
pr_err("%s: failed to vote for AHB\n", __func__);
|
||||||
|
@ -862,14 +891,34 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rc = msm_camera_config_vreg(&csiphy_dev->pdev->dev,
|
||||||
|
csiphy_dev->csiphy_vreg,
|
||||||
|
csiphy_dev->regulator_count, NULL, 0,
|
||||||
|
&csiphy_dev->csiphy_reg_ptr[0], 1);
|
||||||
|
if (rc < 0) {
|
||||||
|
pr_err("%s:%d csiphy config_vreg failed\n",
|
||||||
|
__func__, __LINE__);
|
||||||
|
goto csiphy_vreg_config_fail;
|
||||||
|
}
|
||||||
|
rc = msm_camera_enable_vreg(&csiphy_dev->pdev->dev,
|
||||||
|
csiphy_dev->csiphy_vreg,
|
||||||
|
csiphy_dev->regulator_count, NULL, 0,
|
||||||
|
&csiphy_dev->csiphy_reg_ptr[0], 1);
|
||||||
|
if (rc < 0) {
|
||||||
|
pr_err("%s:%d csiphy enable_vreg failed\n",
|
||||||
|
__func__, __LINE__);
|
||||||
|
goto top_vreg_enable_failed;
|
||||||
|
}
|
||||||
|
|
||||||
rc = msm_camera_clk_enable(&csiphy_dev->pdev->dev,
|
rc = msm_camera_clk_enable(&csiphy_dev->pdev->dev,
|
||||||
csiphy_dev->csiphy_clk_info, csiphy_dev->csiphy_clk,
|
csiphy_dev->csiphy_clk_info, csiphy_dev->csiphy_clk,
|
||||||
csiphy_dev->num_clk, true);
|
csiphy_dev->num_clk, true);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
pr_err("%s: csiphy clk enable failed\n", __func__);
|
pr_err("%s: csiphy clk enable failed\n", __func__);
|
||||||
csiphy_dev->ref_count--;
|
csiphy_dev->ref_count--;
|
||||||
goto csiphy_resource_fail;
|
goto csiphy_enable_clk_fail;
|
||||||
}
|
}
|
||||||
|
CDBG("%s:%d clk enable success\n", __func__, __LINE__);
|
||||||
|
|
||||||
if (csiphy_dev->csiphy_3phase == CSI_3PHASE_HW)
|
if (csiphy_dev->csiphy_3phase == CSI_3PHASE_HW)
|
||||||
msm_csiphy_3ph_reset(csiphy_dev);
|
msm_csiphy_3ph_reset(csiphy_dev);
|
||||||
|
@ -890,7 +939,17 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev)
|
||||||
csiphy_dev->csiphy_state = CSIPHY_POWER_UP;
|
csiphy_dev->csiphy_state = CSIPHY_POWER_UP;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
csiphy_resource_fail:
|
csiphy_enable_clk_fail:
|
||||||
|
msm_camera_enable_vreg(&csiphy_dev->pdev->dev,
|
||||||
|
csiphy_dev->csiphy_vreg,
|
||||||
|
csiphy_dev->regulator_count, NULL, 0,
|
||||||
|
&csiphy_dev->csiphy_reg_ptr[0], 0);
|
||||||
|
top_vreg_enable_failed:
|
||||||
|
msm_camera_config_vreg(&csiphy_dev->pdev->dev,
|
||||||
|
csiphy_dev->csiphy_vreg,
|
||||||
|
csiphy_dev->regulator_count, NULL, 0,
|
||||||
|
&csiphy_dev->csiphy_reg_ptr[0], 0);
|
||||||
|
csiphy_vreg_config_fail:
|
||||||
if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY,
|
if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY,
|
||||||
CAM_AHB_SUSPEND_VOTE) < 0)
|
CAM_AHB_SUSPEND_VOTE) < 0)
|
||||||
pr_err("%s: failed to vote for AHB\n", __func__);
|
pr_err("%s: failed to vote for AHB\n", __func__);
|
||||||
|
@ -999,6 +1058,14 @@ static int msm_csiphy_release(struct csiphy_device *csiphy_dev, void *arg)
|
||||||
csiphy_dev->csiphy_3p_clk, 2, false);
|
csiphy_dev->csiphy_3p_clk, 2, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
msm_camera_enable_vreg(&csiphy_dev->pdev->dev,
|
||||||
|
csiphy_dev->csiphy_vreg,
|
||||||
|
csiphy_dev->regulator_count, NULL, 0,
|
||||||
|
&csiphy_dev->csiphy_reg_ptr[0], 0);
|
||||||
|
msm_camera_config_vreg(&csiphy_dev->pdev->dev,
|
||||||
|
csiphy_dev->csiphy_vreg, csiphy_dev->regulator_count,
|
||||||
|
NULL, 0, &csiphy_dev->csiphy_reg_ptr[0], 0);
|
||||||
|
|
||||||
csiphy_dev->csiphy_state = CSIPHY_POWER_DOWN;
|
csiphy_dev->csiphy_state = CSIPHY_POWER_DOWN;
|
||||||
|
|
||||||
if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY,
|
if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY,
|
||||||
|
@ -1105,6 +1172,13 @@ static int msm_csiphy_release(struct csiphy_device *csiphy_dev, void *arg)
|
||||||
csiphy_dev->csiphy_3p_clk, 2, false);
|
csiphy_dev->csiphy_3p_clk, 2, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
msm_camera_enable_vreg(&csiphy_dev->pdev->dev,
|
||||||
|
csiphy_dev->csiphy_vreg, csiphy_dev->regulator_count,
|
||||||
|
NULL, 0, &csiphy_dev->csiphy_reg_ptr[0], 0);
|
||||||
|
msm_camera_config_vreg(&csiphy_dev->pdev->dev,
|
||||||
|
csiphy_dev->csiphy_vreg, csiphy_dev->regulator_count,
|
||||||
|
NULL, 0, &csiphy_dev->csiphy_reg_ptr[0], 0);
|
||||||
|
|
||||||
csiphy_dev->csiphy_state = CSIPHY_POWER_DOWN;
|
csiphy_dev->csiphy_state = CSIPHY_POWER_DOWN;
|
||||||
|
|
||||||
if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY,
|
if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY,
|
||||||
|
@ -1463,6 +1537,14 @@ static int csiphy_probe(struct platform_device *pdev)
|
||||||
goto csiphy_no_resource;
|
goto csiphy_no_resource;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rc = msm_camera_get_dt_vreg_data(pdev->dev.of_node,
|
||||||
|
&(new_csiphy_dev->csiphy_vreg),
|
||||||
|
&(new_csiphy_dev->regulator_count));
|
||||||
|
if (rc < 0) {
|
||||||
|
pr_err("%s: get vreg data from dtsi fail\n", __func__);
|
||||||
|
rc = -EFAULT;
|
||||||
|
goto csiphy_no_resource;
|
||||||
|
}
|
||||||
/* ToDo: Enable 3phase clock for dynamic clock enable/disable */
|
/* ToDo: Enable 3phase clock for dynamic clock enable/disable */
|
||||||
rc = msm_csiphy_get_clk_info(new_csiphy_dev, pdev);
|
rc = msm_csiphy_get_clk_info(new_csiphy_dev, pdev);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include <media/ais/msm_ais_sensor.h>
|
#include <media/ais/msm_ais_sensor.h>
|
||||||
#include "msm_sd.h"
|
#include "msm_sd.h"
|
||||||
#include "msm_camera_io_util.h"
|
#include "msm_camera_io_util.h"
|
||||||
|
#include "msm_camera_dt_util.h"
|
||||||
#include "cam_soc_api.h"
|
#include "cam_soc_api.h"
|
||||||
|
|
||||||
#define MAX_CSIPHY 3
|
#define MAX_CSIPHY 3
|
||||||
|
@ -169,6 +170,9 @@ struct csiphy_device {
|
||||||
uint32_t csiphy_sof_debug;
|
uint32_t csiphy_sof_debug;
|
||||||
uint32_t csiphy_sof_debug_count;
|
uint32_t csiphy_sof_debug_count;
|
||||||
uint32_t is_combo_mode;
|
uint32_t is_combo_mode;
|
||||||
|
struct camera_vreg_t *csiphy_vreg;
|
||||||
|
struct regulator *csiphy_reg_ptr[MAX_REGULATOR];
|
||||||
|
int32_t regulator_count;
|
||||||
struct msm_camera_csiphy_params csiphy_params;
|
struct msm_camera_csiphy_params csiphy_params;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue