Loading drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe_bus/cam_vfe_bus_ver2.c +90 −24 Original line number Diff line number Diff line Loading @@ -71,6 +71,16 @@ enum cam_vfe_bus_packer_format { PACKER_FMT_MAX = 0xF, }; enum cam_vfe_bus_comp_grp_id { CAM_VFE_BUS_COMP_GROUP_NONE = -EINVAL, CAM_VFE_BUS_COMP_GROUP_ID_0 = 0x0, CAM_VFE_BUS_COMP_GROUP_ID_1 = 0x1, CAM_VFE_BUS_COMP_GROUP_ID_2 = 0x2, CAM_VFE_BUS_COMP_GROUP_ID_3 = 0x3, CAM_VFE_BUS_COMP_GROUP_ID_4 = 0x4, CAM_VFE_BUS_COMP_GROUP_ID_5 = 0x5, }; struct cam_vfe_bus_ver2_common_data { uint32_t core_index; void __iomem *mem_base; Loading Loading @@ -136,6 +146,9 @@ struct cam_vfe_bus_ver2_comp_grp_data { uint32_t intra_client_mask; uint32_t composite_mask; uint32_t acquire_dev_cnt; uint32_t irq_trigger_cnt; void *ctx; }; Loading Loading @@ -187,6 +200,28 @@ static int cam_vfe_bus_get_evt_payload( return 0; } static enum cam_vfe_bus_comp_grp_id cam_vfe_bus_comp_grp_id_convert(uint32_t comp_grp) { switch (comp_grp) { case CAM_ISP_RES_COMP_GROUP_ID_0: return CAM_VFE_BUS_COMP_GROUP_ID_0; case CAM_ISP_RES_COMP_GROUP_ID_1: return CAM_VFE_BUS_COMP_GROUP_ID_1; case CAM_ISP_RES_COMP_GROUP_ID_2: return CAM_VFE_BUS_COMP_GROUP_ID_2; case CAM_ISP_RES_COMP_GROUP_ID_3: return CAM_VFE_BUS_COMP_GROUP_ID_3; case CAM_ISP_RES_COMP_GROUP_ID_4: return CAM_VFE_BUS_COMP_GROUP_ID_4; case CAM_ISP_RES_COMP_GROUP_ID_5: return CAM_VFE_BUS_COMP_GROUP_ID_5; case CAM_ISP_RES_COMP_GROUP_NONE: default: return CAM_VFE_BUS_COMP_GROUP_NONE; } } static int cam_vfe_bus_put_evt_payload(void *core_info, struct cam_vfe_bus_irq_evt_payload **evt_payload) { Loading Loading @@ -1188,12 +1223,18 @@ static int cam_vfe_bus_acquire_comp_grp( struct cam_isp_resource_node **comp_grp) { int rc = 0; uint32_t bus_comp_grp_id; struct cam_isp_resource_node *comp_grp_local = NULL; struct cam_vfe_bus_ver2_comp_grp_data *rsrc_data = NULL; bus_comp_grp_id = cam_vfe_bus_comp_grp_id_convert( out_port_info->comp_grp_id); /* Perform match only if there is valid comp grp request */ if (out_port_info->comp_grp_id != CAM_ISP_RES_COMP_GROUP_NONE) { /* Check if matching comp_grp already acquired */ cam_vfe_bus_match_comp_grp(ver2_bus_priv, &comp_grp_local, out_port_info->comp_grp_id, unique_id); bus_comp_grp_id, unique_id); } if (!comp_grp_local) { /* First find a free group */ Loading Loading @@ -1228,7 +1269,7 @@ static int cam_vfe_bus_acquire_comp_grp( rsrc_data->is_master = is_master; rsrc_data->composite_mask = 0; rsrc_data->unique_id = unique_id; rsrc_data->comp_grp_local_idx = out_port_info->comp_grp_id; rsrc_data->comp_grp_local_idx = bus_comp_grp_id; list_add_tail(&comp_grp_local->list, &ver2_bus_priv->used_comp_grp); Loading @@ -1246,6 +1287,7 @@ static int cam_vfe_bus_acquire_comp_grp( } rsrc_data->ctx = ctx; rsrc_data->acquire_dev_cnt++; *comp_grp = comp_grp_local; return rc; Loading @@ -1260,15 +1302,21 @@ static int cam_vfe_bus_release_comp_grp( int match_found = 0; if (!in_comp_grp) { CAM_ERR(CAM_ISP, "Invalid Params Comp Grp %pK", in_rsrc_data); CAM_ERR(CAM_ISP, "Invalid Params Comp Grp %pK", in_comp_grp); return -EINVAL; } if (in_comp_grp->res_state == CAM_ISP_RESOURCE_STATE_AVAILABLE) { /* Already Released. Do Nothing */ CAM_ERR(CAM_ISP, "Already released Comp Grp"); return 0; } if (in_comp_grp->res_state == CAM_ISP_RESOURCE_STATE_STREAMING) { CAM_ERR(CAM_ISP, "Invalid State %d", in_comp_grp->res_state); return -EBUSY; } in_rsrc_data = in_comp_grp->res_priv; list_for_each_entry(comp_grp, &ver2_bus_priv->used_comp_grp, list) { Loading @@ -1284,24 +1332,32 @@ static int cam_vfe_bus_release_comp_grp( return -ENODEV; } in_rsrc_data->acquire_dev_cnt--; if (in_rsrc_data->acquire_dev_cnt == 0) { list_del(&comp_grp->list); if (in_rsrc_data->comp_grp_type >= CAM_VFE_BUS_VER2_COMP_GRP_DUAL_0 && in_rsrc_data->comp_grp_type <= CAM_VFE_BUS_VER2_COMP_GRP_DUAL_5) list_add_tail(&comp_grp->list, &ver2_bus_priv->free_dual_comp_grp); else if (in_rsrc_data->comp_grp_type >= CAM_VFE_BUS_VER2_COMP_GRP_0 && in_rsrc_data->comp_grp_type <= CAM_VFE_BUS_VER2_COMP_GRP_5) list_add_tail(&comp_grp->list, &ver2_bus_priv->free_comp_grp); in_rsrc_data->unique_id = 0; in_rsrc_data->comp_grp_local_idx = 0; in_rsrc_data->comp_grp_local_idx = CAM_VFE_BUS_COMP_GROUP_NONE; in_rsrc_data->composite_mask = 0; in_rsrc_data->dual_slave_core = CAM_VFE_BUS_VER2_VFE_CORE_MAX; comp_grp->tasklet_info = NULL; comp_grp->res_state = CAM_ISP_RESOURCE_STATE_AVAILABLE; if (in_rsrc_data->comp_grp_type >= CAM_VFE_BUS_VER2_COMP_GRP_DUAL_0 && in_rsrc_data->comp_grp_type <= CAM_VFE_BUS_VER2_COMP_GRP_DUAL_5) list_add_tail(&comp_grp->list, &ver2_bus_priv->free_dual_comp_grp); else if (in_rsrc_data->comp_grp_type >= CAM_VFE_BUS_VER2_COMP_GRP_0 && in_rsrc_data->comp_grp_type <= CAM_VFE_BUS_VER2_COMP_GRP_5) list_add_tail(&comp_grp->list, &ver2_bus_priv->free_comp_grp); } return 0; } Loading Loading @@ -1491,8 +1547,13 @@ static int cam_vfe_bus_handle_comp_done_bottom_half( /* Regular Composite SUCCESS */ if (status_reg & BIT(comp_grp_id + 5)) { rsrc_data->irq_trigger_cnt++; if (rsrc_data->irq_trigger_cnt == rsrc_data->acquire_dev_cnt) { cam_ife_irq_regs[CAM_IFE_IRQ_BUS_REG_STATUS0] &= ~BIT(comp_grp_id + 5); rsrc_data->irq_trigger_cnt = 0; } rc = CAM_VFE_IRQ_STATUS_SUCCESS; } Loading Loading @@ -1530,8 +1591,13 @@ static int cam_vfe_bus_handle_comp_done_bottom_half( /* DUAL Composite SUCCESS */ if (status_reg & BIT(comp_grp_id)) { rsrc_data->irq_trigger_cnt++; if (rsrc_data->irq_trigger_cnt == rsrc_data->acquire_dev_cnt) { cam_ife_irq_regs[CAM_IFE_IRQ_BUS_REG_STATUS2] &= ~BIT(comp_grp_id + 5); rsrc_data->irq_trigger_cnt = 0; } rc = CAM_VFE_IRQ_STATUS_SUCCESS; } Loading Loading
drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe_bus/cam_vfe_bus_ver2.c +90 −24 Original line number Diff line number Diff line Loading @@ -71,6 +71,16 @@ enum cam_vfe_bus_packer_format { PACKER_FMT_MAX = 0xF, }; enum cam_vfe_bus_comp_grp_id { CAM_VFE_BUS_COMP_GROUP_NONE = -EINVAL, CAM_VFE_BUS_COMP_GROUP_ID_0 = 0x0, CAM_VFE_BUS_COMP_GROUP_ID_1 = 0x1, CAM_VFE_BUS_COMP_GROUP_ID_2 = 0x2, CAM_VFE_BUS_COMP_GROUP_ID_3 = 0x3, CAM_VFE_BUS_COMP_GROUP_ID_4 = 0x4, CAM_VFE_BUS_COMP_GROUP_ID_5 = 0x5, }; struct cam_vfe_bus_ver2_common_data { uint32_t core_index; void __iomem *mem_base; Loading Loading @@ -136,6 +146,9 @@ struct cam_vfe_bus_ver2_comp_grp_data { uint32_t intra_client_mask; uint32_t composite_mask; uint32_t acquire_dev_cnt; uint32_t irq_trigger_cnt; void *ctx; }; Loading Loading @@ -187,6 +200,28 @@ static int cam_vfe_bus_get_evt_payload( return 0; } static enum cam_vfe_bus_comp_grp_id cam_vfe_bus_comp_grp_id_convert(uint32_t comp_grp) { switch (comp_grp) { case CAM_ISP_RES_COMP_GROUP_ID_0: return CAM_VFE_BUS_COMP_GROUP_ID_0; case CAM_ISP_RES_COMP_GROUP_ID_1: return CAM_VFE_BUS_COMP_GROUP_ID_1; case CAM_ISP_RES_COMP_GROUP_ID_2: return CAM_VFE_BUS_COMP_GROUP_ID_2; case CAM_ISP_RES_COMP_GROUP_ID_3: return CAM_VFE_BUS_COMP_GROUP_ID_3; case CAM_ISP_RES_COMP_GROUP_ID_4: return CAM_VFE_BUS_COMP_GROUP_ID_4; case CAM_ISP_RES_COMP_GROUP_ID_5: return CAM_VFE_BUS_COMP_GROUP_ID_5; case CAM_ISP_RES_COMP_GROUP_NONE: default: return CAM_VFE_BUS_COMP_GROUP_NONE; } } static int cam_vfe_bus_put_evt_payload(void *core_info, struct cam_vfe_bus_irq_evt_payload **evt_payload) { Loading Loading @@ -1188,12 +1223,18 @@ static int cam_vfe_bus_acquire_comp_grp( struct cam_isp_resource_node **comp_grp) { int rc = 0; uint32_t bus_comp_grp_id; struct cam_isp_resource_node *comp_grp_local = NULL; struct cam_vfe_bus_ver2_comp_grp_data *rsrc_data = NULL; bus_comp_grp_id = cam_vfe_bus_comp_grp_id_convert( out_port_info->comp_grp_id); /* Perform match only if there is valid comp grp request */ if (out_port_info->comp_grp_id != CAM_ISP_RES_COMP_GROUP_NONE) { /* Check if matching comp_grp already acquired */ cam_vfe_bus_match_comp_grp(ver2_bus_priv, &comp_grp_local, out_port_info->comp_grp_id, unique_id); bus_comp_grp_id, unique_id); } if (!comp_grp_local) { /* First find a free group */ Loading Loading @@ -1228,7 +1269,7 @@ static int cam_vfe_bus_acquire_comp_grp( rsrc_data->is_master = is_master; rsrc_data->composite_mask = 0; rsrc_data->unique_id = unique_id; rsrc_data->comp_grp_local_idx = out_port_info->comp_grp_id; rsrc_data->comp_grp_local_idx = bus_comp_grp_id; list_add_tail(&comp_grp_local->list, &ver2_bus_priv->used_comp_grp); Loading @@ -1246,6 +1287,7 @@ static int cam_vfe_bus_acquire_comp_grp( } rsrc_data->ctx = ctx; rsrc_data->acquire_dev_cnt++; *comp_grp = comp_grp_local; return rc; Loading @@ -1260,15 +1302,21 @@ static int cam_vfe_bus_release_comp_grp( int match_found = 0; if (!in_comp_grp) { CAM_ERR(CAM_ISP, "Invalid Params Comp Grp %pK", in_rsrc_data); CAM_ERR(CAM_ISP, "Invalid Params Comp Grp %pK", in_comp_grp); return -EINVAL; } if (in_comp_grp->res_state == CAM_ISP_RESOURCE_STATE_AVAILABLE) { /* Already Released. Do Nothing */ CAM_ERR(CAM_ISP, "Already released Comp Grp"); return 0; } if (in_comp_grp->res_state == CAM_ISP_RESOURCE_STATE_STREAMING) { CAM_ERR(CAM_ISP, "Invalid State %d", in_comp_grp->res_state); return -EBUSY; } in_rsrc_data = in_comp_grp->res_priv; list_for_each_entry(comp_grp, &ver2_bus_priv->used_comp_grp, list) { Loading @@ -1284,24 +1332,32 @@ static int cam_vfe_bus_release_comp_grp( return -ENODEV; } in_rsrc_data->acquire_dev_cnt--; if (in_rsrc_data->acquire_dev_cnt == 0) { list_del(&comp_grp->list); if (in_rsrc_data->comp_grp_type >= CAM_VFE_BUS_VER2_COMP_GRP_DUAL_0 && in_rsrc_data->comp_grp_type <= CAM_VFE_BUS_VER2_COMP_GRP_DUAL_5) list_add_tail(&comp_grp->list, &ver2_bus_priv->free_dual_comp_grp); else if (in_rsrc_data->comp_grp_type >= CAM_VFE_BUS_VER2_COMP_GRP_0 && in_rsrc_data->comp_grp_type <= CAM_VFE_BUS_VER2_COMP_GRP_5) list_add_tail(&comp_grp->list, &ver2_bus_priv->free_comp_grp); in_rsrc_data->unique_id = 0; in_rsrc_data->comp_grp_local_idx = 0; in_rsrc_data->comp_grp_local_idx = CAM_VFE_BUS_COMP_GROUP_NONE; in_rsrc_data->composite_mask = 0; in_rsrc_data->dual_slave_core = CAM_VFE_BUS_VER2_VFE_CORE_MAX; comp_grp->tasklet_info = NULL; comp_grp->res_state = CAM_ISP_RESOURCE_STATE_AVAILABLE; if (in_rsrc_data->comp_grp_type >= CAM_VFE_BUS_VER2_COMP_GRP_DUAL_0 && in_rsrc_data->comp_grp_type <= CAM_VFE_BUS_VER2_COMP_GRP_DUAL_5) list_add_tail(&comp_grp->list, &ver2_bus_priv->free_dual_comp_grp); else if (in_rsrc_data->comp_grp_type >= CAM_VFE_BUS_VER2_COMP_GRP_0 && in_rsrc_data->comp_grp_type <= CAM_VFE_BUS_VER2_COMP_GRP_5) list_add_tail(&comp_grp->list, &ver2_bus_priv->free_comp_grp); } return 0; } Loading Loading @@ -1491,8 +1547,13 @@ static int cam_vfe_bus_handle_comp_done_bottom_half( /* Regular Composite SUCCESS */ if (status_reg & BIT(comp_grp_id + 5)) { rsrc_data->irq_trigger_cnt++; if (rsrc_data->irq_trigger_cnt == rsrc_data->acquire_dev_cnt) { cam_ife_irq_regs[CAM_IFE_IRQ_BUS_REG_STATUS0] &= ~BIT(comp_grp_id + 5); rsrc_data->irq_trigger_cnt = 0; } rc = CAM_VFE_IRQ_STATUS_SUCCESS; } Loading Loading @@ -1530,8 +1591,13 @@ static int cam_vfe_bus_handle_comp_done_bottom_half( /* DUAL Composite SUCCESS */ if (status_reg & BIT(comp_grp_id)) { rsrc_data->irq_trigger_cnt++; if (rsrc_data->irq_trigger_cnt == rsrc_data->acquire_dev_cnt) { cam_ife_irq_regs[CAM_IFE_IRQ_BUS_REG_STATUS2] &= ~BIT(comp_grp_id + 5); rsrc_data->irq_trigger_cnt = 0; } rc = CAM_VFE_IRQ_STATUS_SUCCESS; } Loading