Loading drivers/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c +97 −7 Original line number Diff line number Diff line Loading @@ -182,6 +182,11 @@ static int cam_ife_mgr_get_hw_caps(void *hw_mgr_priv, struct cam_ife_hw_mgr *hw_mgr = hw_mgr_priv; struct cam_query_cap_cmd *query = hw_caps_args; struct cam_isp_query_cap_cmd query_isp; struct cam_isp_dev_cap_info *ife_full_hw_info = NULL; struct cam_isp_dev_cap_info *ife_lite_hw_info = NULL; struct cam_isp_dev_cap_info *csid_full_hw_info = NULL; struct cam_isp_dev_cap_info *csid_lite_hw_info = NULL; struct cam_ife_csid_hw_caps *ife_csid_caps = {0}; CAM_DBG(CAM_ISP, "enter"); Loading @@ -196,13 +201,98 @@ static int cam_ife_mgr_get_hw_caps(void *hw_mgr_priv, query_isp.device_iommu.secure = hw_mgr->mgr_common.img_iommu_hdl_secure; query_isp.cdm_iommu.non_secure = hw_mgr->mgr_common.cmd_iommu_hdl; query_isp.cdm_iommu.secure = hw_mgr->mgr_common.cmd_iommu_hdl_secure; query_isp.num_dev = 2; for (i = 0; i < query_isp.num_dev; i++) { query_isp.dev_caps[i].hw_type = CAM_ISP_HW_IFE; query_isp.dev_caps[i].hw_version.major = 1; query_isp.dev_caps[i].hw_version.minor = 7; query_isp.dev_caps[i].hw_version.incr = 0; query_isp.dev_caps[i].hw_version.reserved = 0; query_isp.num_dev = 0; for (i = 0; i < CAM_IFE_HW_NUM_MAX; i++) { if (!hw_mgr->ife_devices[i]) continue; if (hw_mgr->ife_dev_caps[i].is_lite) { if (ife_lite_hw_info == NULL) { ife_lite_hw_info = &query_isp.dev_caps[query_isp.num_dev]; query_isp.num_dev++; ife_lite_hw_info->hw_type = CAM_ISP_HW_IFE_LITE; ife_lite_hw_info->hw_version.major = hw_mgr->ife_dev_caps[i].major; ife_lite_hw_info->hw_version.minor = hw_mgr->ife_dev_caps[i].minor; ife_lite_hw_info->hw_version.incr = hw_mgr->ife_dev_caps[i].incr; ife_lite_hw_info->hw_version.reserved = 0; ife_lite_hw_info->num_hw = 0; } ife_lite_hw_info->num_hw++; } else { if (ife_full_hw_info == NULL) { ife_full_hw_info = &query_isp.dev_caps[query_isp.num_dev]; query_isp.num_dev++; ife_full_hw_info->hw_type = CAM_ISP_HW_IFE; ife_full_hw_info->hw_version.major = hw_mgr->ife_dev_caps[i].major; ife_full_hw_info->hw_version.minor = hw_mgr->ife_dev_caps[i].minor; ife_full_hw_info->hw_version.incr = hw_mgr->ife_dev_caps[i].incr; ife_full_hw_info->hw_version.reserved = 0; ife_full_hw_info->num_hw = 0; } ife_full_hw_info->num_hw++; } } for (i = 0; i < CAM_IFE_CSID_HW_NUM_MAX; i++) { if (!hw_mgr->csid_devices[i]) continue; ife_csid_caps = (struct cam_ife_csid_hw_caps *) &hw_mgr->ife_csid_dev_caps[i]; if (ife_csid_caps->is_lite) { if (csid_lite_hw_info == NULL) { csid_lite_hw_info = &query_isp.dev_caps[query_isp.num_dev]; query_isp.num_dev++; csid_lite_hw_info->hw_type = CAM_ISP_HW_CSID_LITE; csid_lite_hw_info->hw_version.major = ife_csid_caps->major_version; csid_lite_hw_info->hw_version.minor = ife_csid_caps->minor_version; csid_lite_hw_info->hw_version.incr = ife_csid_caps->version_incr; csid_lite_hw_info->hw_version.reserved = 0; csid_lite_hw_info->num_hw = 0; } csid_lite_hw_info->num_hw++; } else { if (csid_full_hw_info == NULL) { csid_full_hw_info = &query_isp.dev_caps[query_isp.num_dev]; query_isp.num_dev++; csid_full_hw_info->hw_type = CAM_ISP_HW_CSID; csid_full_hw_info->hw_version.major = ife_csid_caps->major_version; csid_full_hw_info->hw_version.minor = ife_csid_caps->minor_version; csid_full_hw_info->hw_version.incr = ife_csid_caps->version_incr; csid_full_hw_info->hw_version.reserved = 0; csid_full_hw_info->num_hw = 0; } csid_full_hw_info->num_hw++; } } if (copy_to_user(u64_to_user_ptr(query->caps_handle), Loading drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_core.c +22 −6 Original line number Diff line number Diff line Loading @@ -1223,7 +1223,7 @@ static int cam_ife_csid_enable_hw(struct cam_ife_csid_hw *csid_hw) int rc = 0; const struct cam_ife_csid_reg_offset *csid_reg; struct cam_hw_soc_info *soc_info; uint32_t i, val; uint32_t i; int clk_lvl; unsigned long flags; Loading Loading @@ -1305,10 +1305,12 @@ static int cam_ife_csid_enable_hw(struct cam_ife_csid_hw *csid_hw) spin_unlock_irqrestore(&csid_hw->hw_info->hw_lock, flags); val = cam_io_r_mb(soc_info->reg_map[0].mem_base + csid_hw->csid_info->hw_reg_version = cam_io_r_mb(soc_info->reg_map[0].mem_base + csid_reg->cmn_reg->csid_hw_version_addr); CAM_DBG(CAM_ISP, "CSID:%d CSID HW version: 0x%x", csid_hw->hw_intf->hw_idx, val); csid_hw->hw_intf->hw_idx, csid_hw->csid_info->hw_reg_version); spin_lock_irqsave(&csid_hw->lock_state, flags); csid_hw->device_enabled = 1; Loading Loading @@ -3102,6 +3104,7 @@ int cam_ife_csid_get_hw_caps(void *hw_priv, struct cam_ife_csid_hw *csid_hw; struct cam_hw_info *csid_hw_info; const struct cam_ife_csid_reg_offset *csid_reg; struct cam_csid_soc_private *soc_priv = NULL; if (!hw_priv || !get_hw_cap_args) { CAM_ERR(CAM_ISP, "CSID: Invalid args"); Loading @@ -3116,9 +3119,22 @@ int cam_ife_csid_get_hw_caps(void *hw_priv, hw_caps->num_rdis = csid_reg->cmn_reg->num_rdis; hw_caps->num_pix = csid_reg->cmn_reg->num_pix; hw_caps->num_ppp = csid_reg->cmn_reg->num_ppp; hw_caps->major_version = csid_reg->cmn_reg->major_version; hw_caps->minor_version = csid_reg->cmn_reg->minor_version; hw_caps->version_incr = csid_reg->cmn_reg->version_incr; /* NOTE: HW version is not correct since we dont enable * the soc resources in the probe for CSID, instead we * when the camera actually runs */ hw_caps->version_incr = csid_hw->csid_info->hw_reg_version & 0x00ffff; hw_caps->minor_version = (csid_hw->csid_info->hw_reg_version >> 16) & 0x0fff; hw_caps->major_version = (csid_hw->csid_info->hw_reg_version >> 28) & 0x000f; soc_priv = (struct cam_csid_soc_private *) (csid_hw_info->soc_info.soc_private); hw_caps->is_lite = soc_priv->is_ife_csid_lite; CAM_DBG(CAM_ISP, "CSID:%d No rdis:%d, no pix:%d, major:%d minor:%d ver :%d", Loading drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_core.h +2 −0 Original line number Diff line number Diff line Loading @@ -402,12 +402,14 @@ struct cam_ife_csid_reg_offset { * * @csid_reg: csid register offsets * @hw_dts_version: HW DTS version * @hw_reg_version: HW Version read from register * @csid_max_clk: maximim csid clock * */ struct cam_ife_csid_hw_info { const struct cam_ife_csid_reg_offset *csid_reg; uint32_t hw_dts_version; uint32_t hw_reg_version; uint32_t csid_max_clk; }; Loading drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_soc.c +10 −3 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. */ #include <linux/slab.h> #include "cam_ife_csid_soc.h" Loading @@ -10,16 +10,23 @@ static int cam_ife_csid_get_dt_properties(struct cam_hw_soc_info *soc_info) { struct device_node *of_node = NULL; struct csid_device_soc_info *csid_soc_info = NULL; struct cam_csid_soc_private *soc_private = NULL; int rc = 0; of_node = soc_info->pdev->dev.of_node; csid_soc_info = (struct csid_device_soc_info *)soc_info->soc_private; rc = cam_soc_util_get_dt_properties(soc_info); if (rc) return rc; soc_private = (struct cam_csid_soc_private *)soc_info->soc_private; soc_private->is_ife_csid_lite = false; if (strnstr(soc_info->compatible, "lite", strlen(soc_info->compatible)) != NULL) { soc_private->is_ife_csid_lite = true; } return rc; } Loading drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_soc.h +3 −1 Original line number Diff line number Diff line /* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. */ #ifndef _CAM_IFE_CSID_SOC_H_ Loading @@ -16,9 +16,11 @@ * @cpas_handle: Handle returned on registering with CPAS driver. * This handle is used for all further interface * with CPAS. * @is_ife_csid_lite: Flag to indicate Whether a full csid or a Lite csid */ struct cam_csid_soc_private { uint32_t cpas_handle; bool is_ife_csid_lite; }; /** Loading Loading
drivers/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c +97 −7 Original line number Diff line number Diff line Loading @@ -182,6 +182,11 @@ static int cam_ife_mgr_get_hw_caps(void *hw_mgr_priv, struct cam_ife_hw_mgr *hw_mgr = hw_mgr_priv; struct cam_query_cap_cmd *query = hw_caps_args; struct cam_isp_query_cap_cmd query_isp; struct cam_isp_dev_cap_info *ife_full_hw_info = NULL; struct cam_isp_dev_cap_info *ife_lite_hw_info = NULL; struct cam_isp_dev_cap_info *csid_full_hw_info = NULL; struct cam_isp_dev_cap_info *csid_lite_hw_info = NULL; struct cam_ife_csid_hw_caps *ife_csid_caps = {0}; CAM_DBG(CAM_ISP, "enter"); Loading @@ -196,13 +201,98 @@ static int cam_ife_mgr_get_hw_caps(void *hw_mgr_priv, query_isp.device_iommu.secure = hw_mgr->mgr_common.img_iommu_hdl_secure; query_isp.cdm_iommu.non_secure = hw_mgr->mgr_common.cmd_iommu_hdl; query_isp.cdm_iommu.secure = hw_mgr->mgr_common.cmd_iommu_hdl_secure; query_isp.num_dev = 2; for (i = 0; i < query_isp.num_dev; i++) { query_isp.dev_caps[i].hw_type = CAM_ISP_HW_IFE; query_isp.dev_caps[i].hw_version.major = 1; query_isp.dev_caps[i].hw_version.minor = 7; query_isp.dev_caps[i].hw_version.incr = 0; query_isp.dev_caps[i].hw_version.reserved = 0; query_isp.num_dev = 0; for (i = 0; i < CAM_IFE_HW_NUM_MAX; i++) { if (!hw_mgr->ife_devices[i]) continue; if (hw_mgr->ife_dev_caps[i].is_lite) { if (ife_lite_hw_info == NULL) { ife_lite_hw_info = &query_isp.dev_caps[query_isp.num_dev]; query_isp.num_dev++; ife_lite_hw_info->hw_type = CAM_ISP_HW_IFE_LITE; ife_lite_hw_info->hw_version.major = hw_mgr->ife_dev_caps[i].major; ife_lite_hw_info->hw_version.minor = hw_mgr->ife_dev_caps[i].minor; ife_lite_hw_info->hw_version.incr = hw_mgr->ife_dev_caps[i].incr; ife_lite_hw_info->hw_version.reserved = 0; ife_lite_hw_info->num_hw = 0; } ife_lite_hw_info->num_hw++; } else { if (ife_full_hw_info == NULL) { ife_full_hw_info = &query_isp.dev_caps[query_isp.num_dev]; query_isp.num_dev++; ife_full_hw_info->hw_type = CAM_ISP_HW_IFE; ife_full_hw_info->hw_version.major = hw_mgr->ife_dev_caps[i].major; ife_full_hw_info->hw_version.minor = hw_mgr->ife_dev_caps[i].minor; ife_full_hw_info->hw_version.incr = hw_mgr->ife_dev_caps[i].incr; ife_full_hw_info->hw_version.reserved = 0; ife_full_hw_info->num_hw = 0; } ife_full_hw_info->num_hw++; } } for (i = 0; i < CAM_IFE_CSID_HW_NUM_MAX; i++) { if (!hw_mgr->csid_devices[i]) continue; ife_csid_caps = (struct cam_ife_csid_hw_caps *) &hw_mgr->ife_csid_dev_caps[i]; if (ife_csid_caps->is_lite) { if (csid_lite_hw_info == NULL) { csid_lite_hw_info = &query_isp.dev_caps[query_isp.num_dev]; query_isp.num_dev++; csid_lite_hw_info->hw_type = CAM_ISP_HW_CSID_LITE; csid_lite_hw_info->hw_version.major = ife_csid_caps->major_version; csid_lite_hw_info->hw_version.minor = ife_csid_caps->minor_version; csid_lite_hw_info->hw_version.incr = ife_csid_caps->version_incr; csid_lite_hw_info->hw_version.reserved = 0; csid_lite_hw_info->num_hw = 0; } csid_lite_hw_info->num_hw++; } else { if (csid_full_hw_info == NULL) { csid_full_hw_info = &query_isp.dev_caps[query_isp.num_dev]; query_isp.num_dev++; csid_full_hw_info->hw_type = CAM_ISP_HW_CSID; csid_full_hw_info->hw_version.major = ife_csid_caps->major_version; csid_full_hw_info->hw_version.minor = ife_csid_caps->minor_version; csid_full_hw_info->hw_version.incr = ife_csid_caps->version_incr; csid_full_hw_info->hw_version.reserved = 0; csid_full_hw_info->num_hw = 0; } csid_full_hw_info->num_hw++; } } if (copy_to_user(u64_to_user_ptr(query->caps_handle), Loading
drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_core.c +22 −6 Original line number Diff line number Diff line Loading @@ -1223,7 +1223,7 @@ static int cam_ife_csid_enable_hw(struct cam_ife_csid_hw *csid_hw) int rc = 0; const struct cam_ife_csid_reg_offset *csid_reg; struct cam_hw_soc_info *soc_info; uint32_t i, val; uint32_t i; int clk_lvl; unsigned long flags; Loading Loading @@ -1305,10 +1305,12 @@ static int cam_ife_csid_enable_hw(struct cam_ife_csid_hw *csid_hw) spin_unlock_irqrestore(&csid_hw->hw_info->hw_lock, flags); val = cam_io_r_mb(soc_info->reg_map[0].mem_base + csid_hw->csid_info->hw_reg_version = cam_io_r_mb(soc_info->reg_map[0].mem_base + csid_reg->cmn_reg->csid_hw_version_addr); CAM_DBG(CAM_ISP, "CSID:%d CSID HW version: 0x%x", csid_hw->hw_intf->hw_idx, val); csid_hw->hw_intf->hw_idx, csid_hw->csid_info->hw_reg_version); spin_lock_irqsave(&csid_hw->lock_state, flags); csid_hw->device_enabled = 1; Loading Loading @@ -3102,6 +3104,7 @@ int cam_ife_csid_get_hw_caps(void *hw_priv, struct cam_ife_csid_hw *csid_hw; struct cam_hw_info *csid_hw_info; const struct cam_ife_csid_reg_offset *csid_reg; struct cam_csid_soc_private *soc_priv = NULL; if (!hw_priv || !get_hw_cap_args) { CAM_ERR(CAM_ISP, "CSID: Invalid args"); Loading @@ -3116,9 +3119,22 @@ int cam_ife_csid_get_hw_caps(void *hw_priv, hw_caps->num_rdis = csid_reg->cmn_reg->num_rdis; hw_caps->num_pix = csid_reg->cmn_reg->num_pix; hw_caps->num_ppp = csid_reg->cmn_reg->num_ppp; hw_caps->major_version = csid_reg->cmn_reg->major_version; hw_caps->minor_version = csid_reg->cmn_reg->minor_version; hw_caps->version_incr = csid_reg->cmn_reg->version_incr; /* NOTE: HW version is not correct since we dont enable * the soc resources in the probe for CSID, instead we * when the camera actually runs */ hw_caps->version_incr = csid_hw->csid_info->hw_reg_version & 0x00ffff; hw_caps->minor_version = (csid_hw->csid_info->hw_reg_version >> 16) & 0x0fff; hw_caps->major_version = (csid_hw->csid_info->hw_reg_version >> 28) & 0x000f; soc_priv = (struct cam_csid_soc_private *) (csid_hw_info->soc_info.soc_private); hw_caps->is_lite = soc_priv->is_ife_csid_lite; CAM_DBG(CAM_ISP, "CSID:%d No rdis:%d, no pix:%d, major:%d minor:%d ver :%d", Loading
drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_core.h +2 −0 Original line number Diff line number Diff line Loading @@ -402,12 +402,14 @@ struct cam_ife_csid_reg_offset { * * @csid_reg: csid register offsets * @hw_dts_version: HW DTS version * @hw_reg_version: HW Version read from register * @csid_max_clk: maximim csid clock * */ struct cam_ife_csid_hw_info { const struct cam_ife_csid_reg_offset *csid_reg; uint32_t hw_dts_version; uint32_t hw_reg_version; uint32_t csid_max_clk; }; Loading
drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_soc.c +10 −3 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. */ #include <linux/slab.h> #include "cam_ife_csid_soc.h" Loading @@ -10,16 +10,23 @@ static int cam_ife_csid_get_dt_properties(struct cam_hw_soc_info *soc_info) { struct device_node *of_node = NULL; struct csid_device_soc_info *csid_soc_info = NULL; struct cam_csid_soc_private *soc_private = NULL; int rc = 0; of_node = soc_info->pdev->dev.of_node; csid_soc_info = (struct csid_device_soc_info *)soc_info->soc_private; rc = cam_soc_util_get_dt_properties(soc_info); if (rc) return rc; soc_private = (struct cam_csid_soc_private *)soc_info->soc_private; soc_private->is_ife_csid_lite = false; if (strnstr(soc_info->compatible, "lite", strlen(soc_info->compatible)) != NULL) { soc_private->is_ife_csid_lite = true; } return rc; } Loading
drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_soc.h +3 −1 Original line number Diff line number Diff line /* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. */ #ifndef _CAM_IFE_CSID_SOC_H_ Loading @@ -16,9 +16,11 @@ * @cpas_handle: Handle returned on registering with CPAS driver. * This handle is used for all further interface * with CPAS. * @is_ife_csid_lite: Flag to indicate Whether a full csid or a Lite csid */ struct cam_csid_soc_private { uint32_t cpas_handle; bool is_ife_csid_lite; }; /** Loading