Loading drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/isp_hw/include/cam_isp_hw.h +6 −0 Original line number Diff line number Diff line Loading @@ -99,6 +99,8 @@ enum cam_isp_resource_type { * @tasklet_info: Tasklet structure that will be used to * schedule IRQ events related to this resource * @irq_handle: handle returned on subscribing for IRQ event * @init: function pointer to init the HW resource * @deinit: function pointer to deinit the HW resource * @start: function pointer to start the HW resource * @stop: function pointer to stop the HW resource * @process_cmd: function pointer for processing commands Loading @@ -117,6 +119,10 @@ struct cam_isp_resource_node { void *tasklet_info; int irq_handle; int (*init)(struct cam_isp_resource_node *rsrc_node, void *init_args, uint32_t arg_size); int (*deinit)(struct cam_isp_resource_node *rsrc_node, void *deinit_args, uint32_t arg_size); int (*start)(struct cam_isp_resource_node *rsrc_node); int (*stop)(struct cam_isp_resource_node *rsrc_node); int (*process_cmd)(struct cam_isp_resource_node *rsrc_node, Loading drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/cam_vfe_core.c +23 −2 Original line number Diff line number Diff line Loading @@ -148,6 +148,7 @@ int cam_vfe_init_hw(void *hw_priv, void *init_hw_args, uint32_t arg_size) struct cam_hw_info *vfe_hw = hw_priv; struct cam_hw_soc_info *soc_info = NULL; struct cam_vfe_hw_core_info *core_info = NULL; struct cam_isp_resource_node *isp_res = NULL; int rc = 0; CAM_DBG(CAM_ISP, "Enter"); Loading Loading @@ -177,23 +178,35 @@ int cam_vfe_init_hw(void *hw_priv, void *init_hw_args, uint32_t arg_size) goto decrement_open_cnt; } isp_res = (struct cam_isp_resource_node *)init_hw_args; if (isp_res && isp_res->init) { rc = isp_res->init(isp_res, NULL, 0); if (rc) { CAM_ERR(CAM_ISP, "init Failed rc=%d", rc); goto disable_soc; } } CAM_DBG(CAM_ISP, "Enable soc done"); /* Do HW Reset */ rc = cam_vfe_reset(hw_priv, NULL, 0); if (rc) { CAM_ERR(CAM_ISP, "Reset Failed rc=%d", rc); goto disable_soc; goto deinint_vfe_res; } rc = core_info->vfe_bus->hw_ops.init(core_info->vfe_bus->bus_priv, NULL, 0); if (rc) { CAM_ERR(CAM_ISP, "Bus HW init Failed rc=%d", rc); goto disable_soc; goto deinint_vfe_res; } return 0; deinint_vfe_res: if (isp_res && isp_res->deinit) isp_res->deinit(isp_res, NULL, 0); disable_soc: cam_vfe_disable_soc_resources(soc_info); decrement_open_cnt: Loading @@ -208,6 +221,7 @@ int cam_vfe_deinit_hw(void *hw_priv, void *deinit_hw_args, uint32_t arg_size) struct cam_hw_info *vfe_hw = hw_priv; struct cam_hw_soc_info *soc_info = NULL; struct cam_vfe_hw_core_info *core_info = NULL; struct cam_isp_resource_node *isp_res = NULL; int rc = 0; CAM_DBG(CAM_ISP, "Enter"); Loading Loading @@ -238,6 +252,13 @@ int cam_vfe_deinit_hw(void *hw_priv, void *deinit_hw_args, uint32_t arg_size) if (rc) CAM_ERR(CAM_ISP, "Bus HW deinit Failed rc=%d", rc); isp_res = (struct cam_isp_resource_node *)deinit_hw_args; if (isp_res && isp_res->deinit) { rc = isp_res->deinit(isp_res, NULL, 0); if (rc) CAM_ERR(CAM_ISP, "deinit failed"); } /* Turn OFF Regulators, Clocks and other SOC resources */ CAM_DBG(CAM_ISP, "Disable SOC resource"); rc = cam_vfe_disable_soc_resources(soc_info); Loading drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/cam_vfe_soc.c +59 −0 Original line number Diff line number Diff line Loading @@ -76,6 +76,12 @@ int cam_vfe_init_soc_resources(struct cam_hw_soc_info *soc_info, goto free_soc_private; } rc = cam_soc_util_get_option_clk_by_name(soc_info, CAM_VFE_DSP_CLK_NAME, &soc_private->dsp_clk, &soc_private->dsp_clk_index, &soc_private->dsp_clk_rate); if (rc) CAM_WARN(CAM_ISP, "option clk get failed"); rc = cam_vfe_request_platform_resource(soc_info, vfe_irq_handler, irq_data); if (rc < 0) { Loading Loading @@ -132,6 +138,11 @@ int cam_vfe_deinit_soc_resources(struct cam_hw_soc_info *soc_info) CAM_ERR(CAM_ISP, "Error! Release platform resources failed rc=%d", rc); rc = cam_soc_util_clk_put(&soc_private->dsp_clk); if (rc < 0) CAM_ERR(CAM_ISP, "Error Put dsp clk failed rc=%d", rc); kfree(soc_private); return rc; Loading Loading @@ -179,6 +190,54 @@ int cam_vfe_enable_soc_resources(struct cam_hw_soc_info *soc_info) return rc; } int cam_vfe_soc_enable_clk(struct cam_hw_soc_info *soc_info, const char *clk_name) { int rc = 0; struct cam_vfe_soc_private *soc_private; if (!soc_info) { CAM_ERR(CAM_ISP, "Error Invalid params"); rc = -EINVAL; return rc; } soc_private = soc_info->soc_private; if (strcmp(clk_name, CAM_VFE_DSP_CLK_NAME) == 0) { rc = cam_soc_util_clk_enable(soc_private->dsp_clk, CAM_VFE_DSP_CLK_NAME, soc_private->dsp_clk_rate); if (rc) CAM_ERR(CAM_ISP, "Error enable dsp clk failed rc=%d", rc); } return rc; } int cam_vfe_soc_disable_clk(struct cam_hw_soc_info *soc_info, const char *clk_name) { int rc = 0; struct cam_vfe_soc_private *soc_private; if (!soc_info) { CAM_ERR(CAM_ISP, "Error Invalid params"); rc = -EINVAL; return rc; } soc_private = soc_info->soc_private; if (strcmp(clk_name, CAM_VFE_DSP_CLK_NAME) == 0) { rc = cam_soc_util_clk_disable(soc_private->dsp_clk, CAM_VFE_DSP_CLK_NAME); if (rc) CAM_ERR(CAM_ISP, "Error enable dsp clk failed rc=%d", rc); } return rc; } int cam_vfe_disable_soc_resources(struct cam_hw_soc_info *soc_info) { Loading drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/cam_vfe_soc.h +34 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ #include "cam_soc_util.h" #include "cam_isp_hw.h" #define CAM_VFE_DSP_CLK_NAME "ife_dsp_clk" /* * struct cam_vfe_soc_private: * Loading @@ -27,6 +29,9 @@ */ struct cam_vfe_soc_private { uint32_t cpas_handle; struct clk *dsp_clk; int32_t dsp_clk_index; int32_t dsp_clk_rate; }; /* Loading Loading @@ -80,4 +85,32 @@ int cam_vfe_enable_soc_resources(struct cam_hw_soc_info *soc_info); */ int cam_vfe_disable_soc_resources(struct cam_hw_soc_info *soc_info); /* * cam_vfe_soc_enable_clk() * * @brief: Enable clock with given name * * @soc_info: Device soc information * @clk_name: Name of clock to enable * * @Return: 0: Success * Non-zero: Failure */ int cam_vfe_soc_enable_clk(struct cam_hw_soc_info *soc_info, const char *clk_name); /* * cam_vfe_soc_disable_dsp_clk() * * @brief: Disable clock with given name * * @soc_info: Device soc information * @clk_name: Name of clock to enable * * @Return: 0: Success * Non-zero: Failure */ int cam_vfe_soc_disable_clk(struct cam_hw_soc_info *soc_info, const char *clk_name); #endif /* _CAM_VFE_SOC_H_ */ drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe170/cam_vfe170.h +4 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,10 @@ static struct cam_vfe_camif_reg_data vfe_170_camif_reg_data = { .extern_reg_update_mask = 1, .pixel_pattern_shift = 0, .pixel_pattern_mask = 0x7, .dsp_mode_shift = 23, .dsp_mode_mask = 0x1, .dsp_en_shift = 3, .dsp_en_mask = 0x1, .reg_update_cmd_data = 0x1, .epoch_line_cfg = 0x00140014, .sof_irq_mask = 0x00000001, Loading Loading
drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/isp_hw/include/cam_isp_hw.h +6 −0 Original line number Diff line number Diff line Loading @@ -99,6 +99,8 @@ enum cam_isp_resource_type { * @tasklet_info: Tasklet structure that will be used to * schedule IRQ events related to this resource * @irq_handle: handle returned on subscribing for IRQ event * @init: function pointer to init the HW resource * @deinit: function pointer to deinit the HW resource * @start: function pointer to start the HW resource * @stop: function pointer to stop the HW resource * @process_cmd: function pointer for processing commands Loading @@ -117,6 +119,10 @@ struct cam_isp_resource_node { void *tasklet_info; int irq_handle; int (*init)(struct cam_isp_resource_node *rsrc_node, void *init_args, uint32_t arg_size); int (*deinit)(struct cam_isp_resource_node *rsrc_node, void *deinit_args, uint32_t arg_size); int (*start)(struct cam_isp_resource_node *rsrc_node); int (*stop)(struct cam_isp_resource_node *rsrc_node); int (*process_cmd)(struct cam_isp_resource_node *rsrc_node, Loading
drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/cam_vfe_core.c +23 −2 Original line number Diff line number Diff line Loading @@ -148,6 +148,7 @@ int cam_vfe_init_hw(void *hw_priv, void *init_hw_args, uint32_t arg_size) struct cam_hw_info *vfe_hw = hw_priv; struct cam_hw_soc_info *soc_info = NULL; struct cam_vfe_hw_core_info *core_info = NULL; struct cam_isp_resource_node *isp_res = NULL; int rc = 0; CAM_DBG(CAM_ISP, "Enter"); Loading Loading @@ -177,23 +178,35 @@ int cam_vfe_init_hw(void *hw_priv, void *init_hw_args, uint32_t arg_size) goto decrement_open_cnt; } isp_res = (struct cam_isp_resource_node *)init_hw_args; if (isp_res && isp_res->init) { rc = isp_res->init(isp_res, NULL, 0); if (rc) { CAM_ERR(CAM_ISP, "init Failed rc=%d", rc); goto disable_soc; } } CAM_DBG(CAM_ISP, "Enable soc done"); /* Do HW Reset */ rc = cam_vfe_reset(hw_priv, NULL, 0); if (rc) { CAM_ERR(CAM_ISP, "Reset Failed rc=%d", rc); goto disable_soc; goto deinint_vfe_res; } rc = core_info->vfe_bus->hw_ops.init(core_info->vfe_bus->bus_priv, NULL, 0); if (rc) { CAM_ERR(CAM_ISP, "Bus HW init Failed rc=%d", rc); goto disable_soc; goto deinint_vfe_res; } return 0; deinint_vfe_res: if (isp_res && isp_res->deinit) isp_res->deinit(isp_res, NULL, 0); disable_soc: cam_vfe_disable_soc_resources(soc_info); decrement_open_cnt: Loading @@ -208,6 +221,7 @@ int cam_vfe_deinit_hw(void *hw_priv, void *deinit_hw_args, uint32_t arg_size) struct cam_hw_info *vfe_hw = hw_priv; struct cam_hw_soc_info *soc_info = NULL; struct cam_vfe_hw_core_info *core_info = NULL; struct cam_isp_resource_node *isp_res = NULL; int rc = 0; CAM_DBG(CAM_ISP, "Enter"); Loading Loading @@ -238,6 +252,13 @@ int cam_vfe_deinit_hw(void *hw_priv, void *deinit_hw_args, uint32_t arg_size) if (rc) CAM_ERR(CAM_ISP, "Bus HW deinit Failed rc=%d", rc); isp_res = (struct cam_isp_resource_node *)deinit_hw_args; if (isp_res && isp_res->deinit) { rc = isp_res->deinit(isp_res, NULL, 0); if (rc) CAM_ERR(CAM_ISP, "deinit failed"); } /* Turn OFF Regulators, Clocks and other SOC resources */ CAM_DBG(CAM_ISP, "Disable SOC resource"); rc = cam_vfe_disable_soc_resources(soc_info); Loading
drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/cam_vfe_soc.c +59 −0 Original line number Diff line number Diff line Loading @@ -76,6 +76,12 @@ int cam_vfe_init_soc_resources(struct cam_hw_soc_info *soc_info, goto free_soc_private; } rc = cam_soc_util_get_option_clk_by_name(soc_info, CAM_VFE_DSP_CLK_NAME, &soc_private->dsp_clk, &soc_private->dsp_clk_index, &soc_private->dsp_clk_rate); if (rc) CAM_WARN(CAM_ISP, "option clk get failed"); rc = cam_vfe_request_platform_resource(soc_info, vfe_irq_handler, irq_data); if (rc < 0) { Loading Loading @@ -132,6 +138,11 @@ int cam_vfe_deinit_soc_resources(struct cam_hw_soc_info *soc_info) CAM_ERR(CAM_ISP, "Error! Release platform resources failed rc=%d", rc); rc = cam_soc_util_clk_put(&soc_private->dsp_clk); if (rc < 0) CAM_ERR(CAM_ISP, "Error Put dsp clk failed rc=%d", rc); kfree(soc_private); return rc; Loading Loading @@ -179,6 +190,54 @@ int cam_vfe_enable_soc_resources(struct cam_hw_soc_info *soc_info) return rc; } int cam_vfe_soc_enable_clk(struct cam_hw_soc_info *soc_info, const char *clk_name) { int rc = 0; struct cam_vfe_soc_private *soc_private; if (!soc_info) { CAM_ERR(CAM_ISP, "Error Invalid params"); rc = -EINVAL; return rc; } soc_private = soc_info->soc_private; if (strcmp(clk_name, CAM_VFE_DSP_CLK_NAME) == 0) { rc = cam_soc_util_clk_enable(soc_private->dsp_clk, CAM_VFE_DSP_CLK_NAME, soc_private->dsp_clk_rate); if (rc) CAM_ERR(CAM_ISP, "Error enable dsp clk failed rc=%d", rc); } return rc; } int cam_vfe_soc_disable_clk(struct cam_hw_soc_info *soc_info, const char *clk_name) { int rc = 0; struct cam_vfe_soc_private *soc_private; if (!soc_info) { CAM_ERR(CAM_ISP, "Error Invalid params"); rc = -EINVAL; return rc; } soc_private = soc_info->soc_private; if (strcmp(clk_name, CAM_VFE_DSP_CLK_NAME) == 0) { rc = cam_soc_util_clk_disable(soc_private->dsp_clk, CAM_VFE_DSP_CLK_NAME); if (rc) CAM_ERR(CAM_ISP, "Error enable dsp clk failed rc=%d", rc); } return rc; } int cam_vfe_disable_soc_resources(struct cam_hw_soc_info *soc_info) { Loading
drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/cam_vfe_soc.h +34 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ #include "cam_soc_util.h" #include "cam_isp_hw.h" #define CAM_VFE_DSP_CLK_NAME "ife_dsp_clk" /* * struct cam_vfe_soc_private: * Loading @@ -27,6 +29,9 @@ */ struct cam_vfe_soc_private { uint32_t cpas_handle; struct clk *dsp_clk; int32_t dsp_clk_index; int32_t dsp_clk_rate; }; /* Loading Loading @@ -80,4 +85,32 @@ int cam_vfe_enable_soc_resources(struct cam_hw_soc_info *soc_info); */ int cam_vfe_disable_soc_resources(struct cam_hw_soc_info *soc_info); /* * cam_vfe_soc_enable_clk() * * @brief: Enable clock with given name * * @soc_info: Device soc information * @clk_name: Name of clock to enable * * @Return: 0: Success * Non-zero: Failure */ int cam_vfe_soc_enable_clk(struct cam_hw_soc_info *soc_info, const char *clk_name); /* * cam_vfe_soc_disable_dsp_clk() * * @brief: Disable clock with given name * * @soc_info: Device soc information * @clk_name: Name of clock to enable * * @Return: 0: Success * Non-zero: Failure */ int cam_vfe_soc_disable_clk(struct cam_hw_soc_info *soc_info, const char *clk_name); #endif /* _CAM_VFE_SOC_H_ */
drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe170/cam_vfe170.h +4 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,10 @@ static struct cam_vfe_camif_reg_data vfe_170_camif_reg_data = { .extern_reg_update_mask = 1, .pixel_pattern_shift = 0, .pixel_pattern_mask = 0x7, .dsp_mode_shift = 23, .dsp_mode_mask = 0x1, .dsp_en_shift = 3, .dsp_en_mask = 0x1, .reg_update_cmd_data = 0x1, .epoch_line_cfg = 0x00140014, .sof_irq_mask = 0x00000001, Loading