Loading drivers/cam_cpas/cam_cpas_hw.c +9 −1 Original line number Diff line number Diff line Loading @@ -1747,6 +1747,7 @@ static int cam_cpas_hw_get_hw_info(void *hw_priv, struct cam_hw_info *cpas_hw; struct cam_cpas *cpas_core; struct cam_cpas_hw_caps *hw_caps; struct cam_cpas_private_soc *soc_private; if (!hw_priv || !get_hw_cap_args) { CAM_ERR(CAM_CPAS, "Invalid arguments %pK %pK", Loading @@ -1763,9 +1764,16 @@ static int cam_cpas_hw_get_hw_info(void *hw_priv, cpas_hw = (struct cam_hw_info *)hw_priv; cpas_core = (struct cam_cpas *) cpas_hw->core_info; hw_caps = (struct cam_cpas_hw_caps *)get_hw_cap_args; *hw_caps = cpas_core->hw_caps; /*Extract Fuse Info*/ soc_private = (struct cam_cpas_private_soc *) cpas_hw->soc_info.soc_private; hw_caps->fuse_info = soc_private->fuse_info; CAM_INFO(CAM_CPAS, "fuse info->num_fuses %d", hw_caps->fuse_info.num_fuses); return 0; } Loading drivers/cam_cpas/cam_cpas_hw_intf.h +2 −0 Original line number Diff line number Diff line Loading @@ -114,6 +114,7 @@ struct cam_cpas_hw_cmd_stop { * @camera_version: Camera version * @cpas_version: CPAS version * @camera_capability: Camera hw capabilities * @fuse_info: Fuse information * */ struct cam_cpas_hw_caps { Loading @@ -121,6 +122,7 @@ struct cam_cpas_hw_caps { struct cam_hw_version camera_version; struct cam_hw_version cpas_version; uint32_t camera_capability; struct cam_cpas_fuse_info fuse_info; }; int cam_cpas_hw_probe(struct platform_device *pdev, Loading drivers/cam_cpas/cam_cpas_intf.c +38 −5 Original line number Diff line number Diff line Loading @@ -173,7 +173,8 @@ int cam_cpas_get_cpas_hw_version(uint32_t *hw_version) int cam_cpas_get_hw_info(uint32_t *camera_family, struct cam_hw_version *camera_version, struct cam_hw_version *cpas_version, uint32_t *cam_caps) uint32_t *cam_caps, struct cam_cpas_fuse_info *cam_fuse_info) { if (!CAM_CPAS_INTF_INITIALIZED()) { CAM_ERR(CAM_CPAS, "cpas intf not initialized"); Loading @@ -190,6 +191,12 @@ int cam_cpas_get_hw_info(uint32_t *camera_family, *camera_version = g_cpas_intf->hw_caps.camera_version; *cpas_version = g_cpas_intf->hw_caps.cpas_version; *cam_caps = g_cpas_intf->hw_caps.camera_capability; if (cam_fuse_info) *cam_fuse_info = g_cpas_intf->hw_caps.fuse_info; CAM_DBG(CAM_CPAS, "Family %d, version %d.%d cam_caps %d", *camera_family, camera_version->major, camera_version->minor, *cam_caps); return 0; } Loading Loading @@ -529,7 +536,32 @@ int cam_cpas_subdev_cmd(struct cam_cpas_intf *cpas_intf, rc = cam_cpas_get_hw_info(&query.camera_family, &query.camera_version, &query.cpas_version, &query.reserved); &query.reserved, NULL); if (rc) break; rc = copy_to_user(u64_to_user_ptr(cmd->handle), &query, sizeof(query)); if (rc) CAM_ERR(CAM_CPAS, "Failed in copy to user, rc=%d", rc); break; } case CAM_QUERY_CAP_V2: { struct cam_cpas_query_cap_v2 query; rc = copy_from_user(&query, u64_to_user_ptr(cmd->handle), sizeof(query)); if (rc) { CAM_ERR(CAM_CPAS, "Failed in copy from user, rc=%d", rc); break; } rc = cam_cpas_get_hw_info(&query.camera_family, &query.camera_version, &query.cpas_version, &query.reserved, &query.fuse_info); if (rc) break; Loading Loading @@ -729,6 +761,7 @@ static int cam_cpas_dev_component_bind(struct device *dev, hw_intf = g_cpas_intf->hw_intf; hw_caps = &g_cpas_intf->hw_caps; if (hw_intf->hw_ops.get_hw_caps) { rc = hw_intf->hw_ops.get_hw_caps(hw_intf->hw_priv, hw_caps, sizeof(struct cam_cpas_hw_caps)); Loading drivers/cam_cpas/cam_cpas_soc.c +46 −1 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ static uint cpas_dump; module_param(cpas_dump, uint, 0644); void cam_cpas_dump_axi_vote_info( const struct cam_cpas_client *cpas_client, const char *identifier, Loading Loading @@ -467,6 +466,51 @@ static int cam_cpas_parse_node_tree(struct cam_cpas *cpas_core, return 0; } int cam_cpas_get_hw_fuse(struct platform_device *pdev, struct cam_cpas_private_soc *soc_private) { struct device_node *of_node; void *fuse; uint32_t fuse_addr, fuse_bit; uint32_t fuse_val = 0, feature_bit_pos; int count = 0, i = 0; memset(&soc_private->fuse_info, 0, sizeof(soc_private->fuse_info)); of_node = pdev->dev.of_node; count = of_property_count_u32_elems(of_node, "cam_hw_fuse"); if (count <= 0) { CAM_INFO(CAM_CPAS, "no or invalid fuse enrties %d", count); return 0; } else if (count%3 != 0) { CAM_INFO(CAM_CPAS, "fuse entries should be multiple of 3 %d", count); return -EINVAL; } for (i = 0; i < count; i = i + 3) { of_property_read_u32_index(of_node, "cam_hw_fuse", i, &feature_bit_pos); of_property_read_u32_index(of_node, "cam_hw_fuse", i + 1, &fuse_addr); of_property_read_u32_index(of_node, "cam_hw_fuse", i + 2, &fuse_bit); CAM_INFO(CAM_CPAS, "feature_bit 0x%x addr 0x%x, bit %d", feature_bit_pos, fuse_addr, fuse_bit); fuse = ioremap(fuse_addr, 4); if (fuse) { fuse_val = cam_io_r(fuse); soc_private->fuse_info.fuse_val[i].fuse_id = fuse_addr; soc_private->fuse_info.fuse_val[i].fuse_val = fuse_val; } CAM_INFO(CAM_CPAS, "fuse_addr 0x%x, fuse_val %x", fuse_addr, fuse_val); soc_private->fuse_info.num_fuses++; iounmap(fuse); } return 0; } int cam_cpas_get_hw_features(struct platform_device *pdev, struct cam_cpas_private_soc *soc_private) Loading Loading @@ -532,6 +576,7 @@ int cam_cpas_get_custom_dt_info(struct cam_hw_info *cpas_hw, } cam_cpas_get_hw_features(pdev, soc_private); cam_cpas_get_hw_fuse(pdev, soc_private); soc_private->camnoc_axi_min_ib_bw = 0; rc = of_property_read_u64(of_node, Loading drivers/cam_cpas/cam_cpas_soc.h +2 −0 Original line number Diff line number Diff line Loading @@ -91,6 +91,7 @@ struct cam_cpas_tree_node { * camnoc axi clock * @camnoc_axi_min_ib_bw: Min camnoc BW which varies based on target * @feature_mask: feature mask value for hw supported features * @fuse_info: fuse information * */ struct cam_cpas_private_soc { Loading @@ -109,6 +110,7 @@ struct cam_cpas_private_soc { uint32_t camnoc_axi_clk_bw_margin; uint64_t camnoc_axi_min_ib_bw; uint32_t feature_mask; struct cam_cpas_fuse_info fuse_info; }; void cam_cpas_util_debug_parse_data(struct cam_cpas_private_soc *soc_private); Loading Loading
drivers/cam_cpas/cam_cpas_hw.c +9 −1 Original line number Diff line number Diff line Loading @@ -1747,6 +1747,7 @@ static int cam_cpas_hw_get_hw_info(void *hw_priv, struct cam_hw_info *cpas_hw; struct cam_cpas *cpas_core; struct cam_cpas_hw_caps *hw_caps; struct cam_cpas_private_soc *soc_private; if (!hw_priv || !get_hw_cap_args) { CAM_ERR(CAM_CPAS, "Invalid arguments %pK %pK", Loading @@ -1763,9 +1764,16 @@ static int cam_cpas_hw_get_hw_info(void *hw_priv, cpas_hw = (struct cam_hw_info *)hw_priv; cpas_core = (struct cam_cpas *) cpas_hw->core_info; hw_caps = (struct cam_cpas_hw_caps *)get_hw_cap_args; *hw_caps = cpas_core->hw_caps; /*Extract Fuse Info*/ soc_private = (struct cam_cpas_private_soc *) cpas_hw->soc_info.soc_private; hw_caps->fuse_info = soc_private->fuse_info; CAM_INFO(CAM_CPAS, "fuse info->num_fuses %d", hw_caps->fuse_info.num_fuses); return 0; } Loading
drivers/cam_cpas/cam_cpas_hw_intf.h +2 −0 Original line number Diff line number Diff line Loading @@ -114,6 +114,7 @@ struct cam_cpas_hw_cmd_stop { * @camera_version: Camera version * @cpas_version: CPAS version * @camera_capability: Camera hw capabilities * @fuse_info: Fuse information * */ struct cam_cpas_hw_caps { Loading @@ -121,6 +122,7 @@ struct cam_cpas_hw_caps { struct cam_hw_version camera_version; struct cam_hw_version cpas_version; uint32_t camera_capability; struct cam_cpas_fuse_info fuse_info; }; int cam_cpas_hw_probe(struct platform_device *pdev, Loading
drivers/cam_cpas/cam_cpas_intf.c +38 −5 Original line number Diff line number Diff line Loading @@ -173,7 +173,8 @@ int cam_cpas_get_cpas_hw_version(uint32_t *hw_version) int cam_cpas_get_hw_info(uint32_t *camera_family, struct cam_hw_version *camera_version, struct cam_hw_version *cpas_version, uint32_t *cam_caps) uint32_t *cam_caps, struct cam_cpas_fuse_info *cam_fuse_info) { if (!CAM_CPAS_INTF_INITIALIZED()) { CAM_ERR(CAM_CPAS, "cpas intf not initialized"); Loading @@ -190,6 +191,12 @@ int cam_cpas_get_hw_info(uint32_t *camera_family, *camera_version = g_cpas_intf->hw_caps.camera_version; *cpas_version = g_cpas_intf->hw_caps.cpas_version; *cam_caps = g_cpas_intf->hw_caps.camera_capability; if (cam_fuse_info) *cam_fuse_info = g_cpas_intf->hw_caps.fuse_info; CAM_DBG(CAM_CPAS, "Family %d, version %d.%d cam_caps %d", *camera_family, camera_version->major, camera_version->minor, *cam_caps); return 0; } Loading Loading @@ -529,7 +536,32 @@ int cam_cpas_subdev_cmd(struct cam_cpas_intf *cpas_intf, rc = cam_cpas_get_hw_info(&query.camera_family, &query.camera_version, &query.cpas_version, &query.reserved); &query.reserved, NULL); if (rc) break; rc = copy_to_user(u64_to_user_ptr(cmd->handle), &query, sizeof(query)); if (rc) CAM_ERR(CAM_CPAS, "Failed in copy to user, rc=%d", rc); break; } case CAM_QUERY_CAP_V2: { struct cam_cpas_query_cap_v2 query; rc = copy_from_user(&query, u64_to_user_ptr(cmd->handle), sizeof(query)); if (rc) { CAM_ERR(CAM_CPAS, "Failed in copy from user, rc=%d", rc); break; } rc = cam_cpas_get_hw_info(&query.camera_family, &query.camera_version, &query.cpas_version, &query.reserved, &query.fuse_info); if (rc) break; Loading Loading @@ -729,6 +761,7 @@ static int cam_cpas_dev_component_bind(struct device *dev, hw_intf = g_cpas_intf->hw_intf; hw_caps = &g_cpas_intf->hw_caps; if (hw_intf->hw_ops.get_hw_caps) { rc = hw_intf->hw_ops.get_hw_caps(hw_intf->hw_priv, hw_caps, sizeof(struct cam_cpas_hw_caps)); Loading
drivers/cam_cpas/cam_cpas_soc.c +46 −1 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ static uint cpas_dump; module_param(cpas_dump, uint, 0644); void cam_cpas_dump_axi_vote_info( const struct cam_cpas_client *cpas_client, const char *identifier, Loading Loading @@ -467,6 +466,51 @@ static int cam_cpas_parse_node_tree(struct cam_cpas *cpas_core, return 0; } int cam_cpas_get_hw_fuse(struct platform_device *pdev, struct cam_cpas_private_soc *soc_private) { struct device_node *of_node; void *fuse; uint32_t fuse_addr, fuse_bit; uint32_t fuse_val = 0, feature_bit_pos; int count = 0, i = 0; memset(&soc_private->fuse_info, 0, sizeof(soc_private->fuse_info)); of_node = pdev->dev.of_node; count = of_property_count_u32_elems(of_node, "cam_hw_fuse"); if (count <= 0) { CAM_INFO(CAM_CPAS, "no or invalid fuse enrties %d", count); return 0; } else if (count%3 != 0) { CAM_INFO(CAM_CPAS, "fuse entries should be multiple of 3 %d", count); return -EINVAL; } for (i = 0; i < count; i = i + 3) { of_property_read_u32_index(of_node, "cam_hw_fuse", i, &feature_bit_pos); of_property_read_u32_index(of_node, "cam_hw_fuse", i + 1, &fuse_addr); of_property_read_u32_index(of_node, "cam_hw_fuse", i + 2, &fuse_bit); CAM_INFO(CAM_CPAS, "feature_bit 0x%x addr 0x%x, bit %d", feature_bit_pos, fuse_addr, fuse_bit); fuse = ioremap(fuse_addr, 4); if (fuse) { fuse_val = cam_io_r(fuse); soc_private->fuse_info.fuse_val[i].fuse_id = fuse_addr; soc_private->fuse_info.fuse_val[i].fuse_val = fuse_val; } CAM_INFO(CAM_CPAS, "fuse_addr 0x%x, fuse_val %x", fuse_addr, fuse_val); soc_private->fuse_info.num_fuses++; iounmap(fuse); } return 0; } int cam_cpas_get_hw_features(struct platform_device *pdev, struct cam_cpas_private_soc *soc_private) Loading Loading @@ -532,6 +576,7 @@ int cam_cpas_get_custom_dt_info(struct cam_hw_info *cpas_hw, } cam_cpas_get_hw_features(pdev, soc_private); cam_cpas_get_hw_fuse(pdev, soc_private); soc_private->camnoc_axi_min_ib_bw = 0; rc = of_property_read_u64(of_node, Loading
drivers/cam_cpas/cam_cpas_soc.h +2 −0 Original line number Diff line number Diff line Loading @@ -91,6 +91,7 @@ struct cam_cpas_tree_node { * camnoc axi clock * @camnoc_axi_min_ib_bw: Min camnoc BW which varies based on target * @feature_mask: feature mask value for hw supported features * @fuse_info: fuse information * */ struct cam_cpas_private_soc { Loading @@ -109,6 +110,7 @@ struct cam_cpas_private_soc { uint32_t camnoc_axi_clk_bw_margin; uint64_t camnoc_axi_min_ib_bw; uint32_t feature_mask; struct cam_cpas_fuse_info fuse_info; }; void cam_cpas_util_debug_parse_data(struct cam_cpas_private_soc *soc_private); Loading