Loading drivers/media/platform/msm/camera/cam_core/cam_context.c +25 −1 Original line number Diff line number Diff line /* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -196,6 +196,30 @@ int cam_context_handle_crm_flush_req(struct cam_context *ctx, return rc; } int cam_context_handle_crm_process_evt(struct cam_context *ctx, struct cam_req_mgr_link_evt_data *process_evt) { int rc = 0; if (!ctx->state_machine) { CAM_ERR(CAM_CORE, "Context is not ready"); return -EINVAL; } mutex_lock(&ctx->ctx_mutex); if (ctx->state_machine[ctx->state].crm_ops.process_evt) { rc = ctx->state_machine[ctx->state].crm_ops.process_evt(ctx, process_evt); } else { /* handling of this message is optional */ CAM_DBG(CAM_CORE, "No crm process evt in dev %d, state %d", ctx->dev_hdl, ctx->state); } mutex_unlock(&ctx->ctx_mutex); return rc; } int cam_context_handle_acquire_dev(struct cam_context *ctx, struct cam_acquire_dev_cmd *cmd) { Loading drivers/media/platform/msm/camera/cam_core/cam_context.h +16 −1 Original line number Diff line number Diff line /* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -110,6 +110,7 @@ struct cam_ctx_ioctl_ops { * @unlink: Unlink the context * @apply_req: Apply setting for the context * @flush_req: Flush request to remove request ids * @process_evt: Handle event notification from CRM.(optional) * */ struct cam_ctx_crm_ops { Loading @@ -123,6 +124,8 @@ struct cam_ctx_crm_ops { struct cam_req_mgr_apply_request *apply); int (*flush_req)(struct cam_context *ctx, struct cam_req_mgr_flush_request *flush); int (*process_evt)(struct cam_context *ctx, struct cam_req_mgr_link_evt_data *evt_data); }; Loading Loading @@ -272,6 +275,18 @@ int cam_context_handle_crm_apply_req(struct cam_context *ctx, int cam_context_handle_crm_flush_req(struct cam_context *ctx, struct cam_req_mgr_flush_request *apply); /** * cam_context_handle_crm_process_evt() * * @brief: Handle process event command * * @ctx: Object pointer for cam_context * @process_evt: process event command payload * */ int cam_context_handle_crm_process_evt(struct cam_context *ctx, struct cam_req_mgr_link_evt_data *process_evt); /** * cam_context_handle_acquire_dev() * Loading drivers/media/platform/msm/camera/cam_core/cam_node.c +21 −1 Original line number Diff line number Diff line /* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -342,6 +342,25 @@ static int __cam_node_crm_flush_req(struct cam_req_mgr_flush_request *flush) return cam_context_handle_crm_flush_req(ctx, flush); } static int __cam_node_crm_process_evt( struct cam_req_mgr_link_evt_data *evt_data) { struct cam_context *ctx = NULL; if (!evt_data) { CAM_ERR(CAM_CORE, "Invalid process event request payload"); return -EINVAL; } ctx = (struct cam_context *) cam_get_device_priv(evt_data->dev_hdl); if (!ctx) { CAM_ERR(CAM_CORE, "Can not get context for handle %d", evt_data->dev_hdl); return -EINVAL; } return cam_context_handle_crm_process_evt(ctx, evt_data); } int cam_node_deinit(struct cam_node *node) { if (node) Loading Loading @@ -394,6 +413,7 @@ int cam_node_init(struct cam_node *node, struct cam_hw_mgr_intf *hw_mgr_intf, node->crm_node_intf.get_dev_info = __cam_node_crm_get_dev_info; node->crm_node_intf.link_setup = __cam_node_crm_link_setup; node->crm_node_intf.flush_req = __cam_node_crm_flush_req; node->crm_node_intf.process_evt = __cam_node_crm_process_evt; mutex_init(&node->list_mutex); INIT_LIST_HEAD(&node->free_ctx_list); Loading drivers/media/platform/msm/camera/cam_isp/cam_isp_context.c +53 −0 Original line number Diff line number Diff line Loading @@ -2300,6 +2300,58 @@ static int __cam_isp_ctx_release_dev_in_activated(struct cam_context *ctx, return rc; } static int __cam_isp_ctx_link_pause(struct cam_context *ctx) { int rc = 0; struct cam_isp_hw_cmd_args hw_cmd_args; struct cam_isp_context *ctx_isp = (struct cam_isp_context *) ctx->ctx_priv; hw_cmd_args.ctxt_to_hw_map = ctx_isp->hw_ctx; hw_cmd_args.cmd_type = CAM_ISP_HW_MGR_CMD_PAUSE_HW; rc = ctx->hw_mgr_intf->hw_cmd(ctx->hw_mgr_intf->hw_mgr_priv, &hw_cmd_args); return rc; } static int __cam_isp_ctx_link_resume(struct cam_context *ctx) { int rc = 0; struct cam_isp_hw_cmd_args hw_cmd_args; struct cam_isp_context *ctx_isp = (struct cam_isp_context *) ctx->ctx_priv; hw_cmd_args.ctxt_to_hw_map = ctx_isp->hw_ctx; hw_cmd_args.cmd_type = CAM_ISP_HW_MGR_CMD_RESUME_HW; rc = ctx->hw_mgr_intf->hw_cmd(ctx->hw_mgr_intf->hw_mgr_priv, &hw_cmd_args); return rc; } static int __cam_isp_ctx_process_evt(struct cam_context *ctx, struct cam_req_mgr_link_evt_data *link_evt_data) { int rc = 0; switch (link_evt_data->evt_type) { case CAM_REQ_MGR_LINK_EVT_ERR: /* No need to handle this message now */ break; case CAM_REQ_MGR_LINK_EVT_PAUSE: __cam_isp_ctx_link_pause(ctx); break; case CAM_REQ_MGR_LINK_EVT_RESUME: __cam_isp_ctx_link_resume(ctx); break; default: CAM_WARN(CAM_ISP, "Unknown event from CRM"); break; } return rc; } static int __cam_isp_ctx_unlink_in_activated(struct cam_context *ctx, struct cam_req_mgr_core_dev_link_setup *unlink) { Loading Loading @@ -2432,6 +2484,7 @@ static struct cam_ctx_ops .unlink = __cam_isp_ctx_unlink_in_activated, .apply_req = __cam_isp_ctx_apply_req, .flush_req = __cam_isp_ctx_flush_req_in_activated, .process_evt = __cam_isp_ctx_process_evt, }, .irq_ops = __cam_isp_ctx_handle_irq_in_activated, }, Loading drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c +54 −1 Original line number Diff line number Diff line /* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -2488,6 +2488,53 @@ static int cam_ife_mgr_prepare_hw_update(void *hw_mgr_priv, return rc; } static int cam_ife_mgr_bw_control(struct cam_ife_hw_mgr_ctx *ctx, enum cam_vfe_bw_control_action action) { struct cam_ife_hw_mgr_res *hw_mgr_res; struct cam_hw_intf *hw_intf; struct cam_vfe_bw_control_args bw_ctrl_args; int rc = -EINVAL; uint32_t i; CAM_DBG(CAM_ISP, "Enter...ctx id:%d", ctx->ctx_index); list_for_each_entry(hw_mgr_res, &ctx->res_list_ife_src, list) { for (i = 0; i < CAM_ISP_HW_SPLIT_MAX; i++) { if (!hw_mgr_res->hw_res[i]) continue; hw_intf = hw_mgr_res->hw_res[i]->hw_intf; if (hw_intf && hw_intf->hw_ops.process_cmd) { bw_ctrl_args.node_res = hw_mgr_res->hw_res[i]; bw_ctrl_args.action = action; rc = hw_intf->hw_ops.process_cmd( hw_intf->hw_priv, CAM_ISP_HW_CMD_BW_CONTROL, &bw_ctrl_args, sizeof(struct cam_vfe_bw_control_args)); if (rc) CAM_ERR(CAM_ISP, "BW Update failed"); } else CAM_WARN(CAM_ISP, "NULL hw_intf!"); } } return rc; } static int cam_ife_mgr_pause_hw(struct cam_ife_hw_mgr_ctx *ctx) { return cam_ife_mgr_bw_control(ctx, CAM_VFE_BW_CONTROL_EXCLUDE); } static int cam_ife_mgr_resume_hw(struct cam_ife_hw_mgr_ctx *ctx) { return cam_ife_mgr_bw_control(ctx, CAM_VFE_BW_CONTROL_INCLUDE); } static int cam_ife_mgr_cmd(void *hw_mgr_priv, void *cmd_args) { int rc = 0; Loading @@ -2512,6 +2559,12 @@ static int cam_ife_mgr_cmd(void *hw_mgr_priv, void *cmd_args) else hw_cmd_args->u.is_rdi_only_context = 0; break; case CAM_ISP_HW_MGR_CMD_PAUSE_HW: cam_ife_mgr_pause_hw(ctx); break; case CAM_ISP_HW_MGR_CMD_RESUME_HW: cam_ife_mgr_resume_hw(ctx); break; default: CAM_ERR(CAM_ISP, "Invalid HW mgr command:0x%x", Loading Loading
drivers/media/platform/msm/camera/cam_core/cam_context.c +25 −1 Original line number Diff line number Diff line /* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -196,6 +196,30 @@ int cam_context_handle_crm_flush_req(struct cam_context *ctx, return rc; } int cam_context_handle_crm_process_evt(struct cam_context *ctx, struct cam_req_mgr_link_evt_data *process_evt) { int rc = 0; if (!ctx->state_machine) { CAM_ERR(CAM_CORE, "Context is not ready"); return -EINVAL; } mutex_lock(&ctx->ctx_mutex); if (ctx->state_machine[ctx->state].crm_ops.process_evt) { rc = ctx->state_machine[ctx->state].crm_ops.process_evt(ctx, process_evt); } else { /* handling of this message is optional */ CAM_DBG(CAM_CORE, "No crm process evt in dev %d, state %d", ctx->dev_hdl, ctx->state); } mutex_unlock(&ctx->ctx_mutex); return rc; } int cam_context_handle_acquire_dev(struct cam_context *ctx, struct cam_acquire_dev_cmd *cmd) { Loading
drivers/media/platform/msm/camera/cam_core/cam_context.h +16 −1 Original line number Diff line number Diff line /* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -110,6 +110,7 @@ struct cam_ctx_ioctl_ops { * @unlink: Unlink the context * @apply_req: Apply setting for the context * @flush_req: Flush request to remove request ids * @process_evt: Handle event notification from CRM.(optional) * */ struct cam_ctx_crm_ops { Loading @@ -123,6 +124,8 @@ struct cam_ctx_crm_ops { struct cam_req_mgr_apply_request *apply); int (*flush_req)(struct cam_context *ctx, struct cam_req_mgr_flush_request *flush); int (*process_evt)(struct cam_context *ctx, struct cam_req_mgr_link_evt_data *evt_data); }; Loading Loading @@ -272,6 +275,18 @@ int cam_context_handle_crm_apply_req(struct cam_context *ctx, int cam_context_handle_crm_flush_req(struct cam_context *ctx, struct cam_req_mgr_flush_request *apply); /** * cam_context_handle_crm_process_evt() * * @brief: Handle process event command * * @ctx: Object pointer for cam_context * @process_evt: process event command payload * */ int cam_context_handle_crm_process_evt(struct cam_context *ctx, struct cam_req_mgr_link_evt_data *process_evt); /** * cam_context_handle_acquire_dev() * Loading
drivers/media/platform/msm/camera/cam_core/cam_node.c +21 −1 Original line number Diff line number Diff line /* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -342,6 +342,25 @@ static int __cam_node_crm_flush_req(struct cam_req_mgr_flush_request *flush) return cam_context_handle_crm_flush_req(ctx, flush); } static int __cam_node_crm_process_evt( struct cam_req_mgr_link_evt_data *evt_data) { struct cam_context *ctx = NULL; if (!evt_data) { CAM_ERR(CAM_CORE, "Invalid process event request payload"); return -EINVAL; } ctx = (struct cam_context *) cam_get_device_priv(evt_data->dev_hdl); if (!ctx) { CAM_ERR(CAM_CORE, "Can not get context for handle %d", evt_data->dev_hdl); return -EINVAL; } return cam_context_handle_crm_process_evt(ctx, evt_data); } int cam_node_deinit(struct cam_node *node) { if (node) Loading Loading @@ -394,6 +413,7 @@ int cam_node_init(struct cam_node *node, struct cam_hw_mgr_intf *hw_mgr_intf, node->crm_node_intf.get_dev_info = __cam_node_crm_get_dev_info; node->crm_node_intf.link_setup = __cam_node_crm_link_setup; node->crm_node_intf.flush_req = __cam_node_crm_flush_req; node->crm_node_intf.process_evt = __cam_node_crm_process_evt; mutex_init(&node->list_mutex); INIT_LIST_HEAD(&node->free_ctx_list); Loading
drivers/media/platform/msm/camera/cam_isp/cam_isp_context.c +53 −0 Original line number Diff line number Diff line Loading @@ -2300,6 +2300,58 @@ static int __cam_isp_ctx_release_dev_in_activated(struct cam_context *ctx, return rc; } static int __cam_isp_ctx_link_pause(struct cam_context *ctx) { int rc = 0; struct cam_isp_hw_cmd_args hw_cmd_args; struct cam_isp_context *ctx_isp = (struct cam_isp_context *) ctx->ctx_priv; hw_cmd_args.ctxt_to_hw_map = ctx_isp->hw_ctx; hw_cmd_args.cmd_type = CAM_ISP_HW_MGR_CMD_PAUSE_HW; rc = ctx->hw_mgr_intf->hw_cmd(ctx->hw_mgr_intf->hw_mgr_priv, &hw_cmd_args); return rc; } static int __cam_isp_ctx_link_resume(struct cam_context *ctx) { int rc = 0; struct cam_isp_hw_cmd_args hw_cmd_args; struct cam_isp_context *ctx_isp = (struct cam_isp_context *) ctx->ctx_priv; hw_cmd_args.ctxt_to_hw_map = ctx_isp->hw_ctx; hw_cmd_args.cmd_type = CAM_ISP_HW_MGR_CMD_RESUME_HW; rc = ctx->hw_mgr_intf->hw_cmd(ctx->hw_mgr_intf->hw_mgr_priv, &hw_cmd_args); return rc; } static int __cam_isp_ctx_process_evt(struct cam_context *ctx, struct cam_req_mgr_link_evt_data *link_evt_data) { int rc = 0; switch (link_evt_data->evt_type) { case CAM_REQ_MGR_LINK_EVT_ERR: /* No need to handle this message now */ break; case CAM_REQ_MGR_LINK_EVT_PAUSE: __cam_isp_ctx_link_pause(ctx); break; case CAM_REQ_MGR_LINK_EVT_RESUME: __cam_isp_ctx_link_resume(ctx); break; default: CAM_WARN(CAM_ISP, "Unknown event from CRM"); break; } return rc; } static int __cam_isp_ctx_unlink_in_activated(struct cam_context *ctx, struct cam_req_mgr_core_dev_link_setup *unlink) { Loading Loading @@ -2432,6 +2484,7 @@ static struct cam_ctx_ops .unlink = __cam_isp_ctx_unlink_in_activated, .apply_req = __cam_isp_ctx_apply_req, .flush_req = __cam_isp_ctx_flush_req_in_activated, .process_evt = __cam_isp_ctx_process_evt, }, .irq_ops = __cam_isp_ctx_handle_irq_in_activated, }, Loading
drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c +54 −1 Original line number Diff line number Diff line /* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -2488,6 +2488,53 @@ static int cam_ife_mgr_prepare_hw_update(void *hw_mgr_priv, return rc; } static int cam_ife_mgr_bw_control(struct cam_ife_hw_mgr_ctx *ctx, enum cam_vfe_bw_control_action action) { struct cam_ife_hw_mgr_res *hw_mgr_res; struct cam_hw_intf *hw_intf; struct cam_vfe_bw_control_args bw_ctrl_args; int rc = -EINVAL; uint32_t i; CAM_DBG(CAM_ISP, "Enter...ctx id:%d", ctx->ctx_index); list_for_each_entry(hw_mgr_res, &ctx->res_list_ife_src, list) { for (i = 0; i < CAM_ISP_HW_SPLIT_MAX; i++) { if (!hw_mgr_res->hw_res[i]) continue; hw_intf = hw_mgr_res->hw_res[i]->hw_intf; if (hw_intf && hw_intf->hw_ops.process_cmd) { bw_ctrl_args.node_res = hw_mgr_res->hw_res[i]; bw_ctrl_args.action = action; rc = hw_intf->hw_ops.process_cmd( hw_intf->hw_priv, CAM_ISP_HW_CMD_BW_CONTROL, &bw_ctrl_args, sizeof(struct cam_vfe_bw_control_args)); if (rc) CAM_ERR(CAM_ISP, "BW Update failed"); } else CAM_WARN(CAM_ISP, "NULL hw_intf!"); } } return rc; } static int cam_ife_mgr_pause_hw(struct cam_ife_hw_mgr_ctx *ctx) { return cam_ife_mgr_bw_control(ctx, CAM_VFE_BW_CONTROL_EXCLUDE); } static int cam_ife_mgr_resume_hw(struct cam_ife_hw_mgr_ctx *ctx) { return cam_ife_mgr_bw_control(ctx, CAM_VFE_BW_CONTROL_INCLUDE); } static int cam_ife_mgr_cmd(void *hw_mgr_priv, void *cmd_args) { int rc = 0; Loading @@ -2512,6 +2559,12 @@ static int cam_ife_mgr_cmd(void *hw_mgr_priv, void *cmd_args) else hw_cmd_args->u.is_rdi_only_context = 0; break; case CAM_ISP_HW_MGR_CMD_PAUSE_HW: cam_ife_mgr_pause_hw(ctx); break; case CAM_ISP_HW_MGR_CMD_RESUME_HW: cam_ife_mgr_resume_hw(ctx); break; default: CAM_ERR(CAM_ISP, "Invalid HW mgr command:0x%x", Loading