Loading drivers/media/platform/msm/camera/cam_core/cam_context_utils.c +12 −12 Original line number Diff line number Diff line Loading @@ -537,8 +537,7 @@ int32_t cam_context_flush_ctx_to_hw(struct cam_context *ctx) CAM_ERR(CAM_CTXT, "Req: %llu already signalled, sync_id:%d", req->request_id, req->out_map_entries[i]. sync_id); req->out_map_entries[i].sync_id); break; } } Loading Loading @@ -629,6 +628,7 @@ int32_t cam_context_flush_req_to_hw(struct cam_context *ctx, struct cam_ctx_request *req = NULL; struct cam_hw_flush_args flush_args; uint32_t i; int32_t sync_id = 0; int rc = 0; CAM_DBG(CAM_CTXT, "[%s] E: NRT flush req", ctx->dev_name); Loading Loading @@ -683,20 +683,20 @@ int32_t cam_context_flush_req_to_hw(struct cam_context *ctx, if (req) { if (flush_args.num_req_pending || flush_args.num_req_active) { for (i = 0; i < req->num_out_map_entries; i++) if (req->out_map_entries[i].sync_id != -1) { rc = cam_sync_signal( req->out_map_entries[i].sync_id, for (i = 0; i < req->num_out_map_entries; i++) { sync_id = req->out_map_entries[i].sync_id; if (sync_id != -1) { rc = cam_sync_signal(sync_id, CAM_SYNC_STATE_SIGNALED_ERROR); if (rc == -EALREADY) { CAM_ERR(CAM_CTXT, "Req: %llu already signalled, sync_id:%d", req->request_id, req->out_map_entries[i]. sync_id); req->request_id, sync_id); break; } } } if (flush_args.num_req_active) { spin_lock(&ctx->lock); list_add_tail(&req->list, &ctx->free_req_list); Loading drivers/media/platform/msm/camera/cam_cpas/cam_cpas_hw.c +14 −4 Original line number Diff line number Diff line Loading @@ -873,6 +873,7 @@ static int cam_cpas_hw_update_ahb_vote(struct cam_hw_info *cpas_hw, if (!CAM_CPAS_CLIENT_VALID(client_indx)) return -EINVAL; mutex_lock(&cpas_hw->hw_mutex); mutex_lock(&cpas_core->client_mutex[client_indx]); if (!CAM_CPAS_CLIENT_STARTED(cpas_core, client_indx)) { Loading @@ -892,6 +893,7 @@ static int cam_cpas_hw_update_ahb_vote(struct cam_hw_info *cpas_hw, unlock_client: mutex_unlock(&cpas_core->client_mutex[client_indx]); mutex_unlock(&cpas_hw->hw_mutex); return rc; } Loading @@ -907,6 +909,7 @@ static int cam_cpas_hw_start(void *hw_priv, void *start_args, struct cam_axi_vote *axi_vote; enum cam_vote_level applied_level = CAM_SVS_VOTE; int rc; struct cam_cpas_private_soc *soc_private = NULL; if (!hw_priv || !start_args) { CAM_ERR(CAM_CPAS, "Invalid arguments %pK %pK", Loading @@ -922,6 +925,8 @@ static int cam_cpas_hw_start(void *hw_priv, void *start_args, cpas_hw = (struct cam_hw_info *)hw_priv; cpas_core = (struct cam_cpas *) cpas_hw->core_info; soc_private = (struct cam_cpas_private_soc *) cpas_hw->soc_info.soc_private; cmd_hw_start = (struct cam_cpas_hw_cmd_start *)start_args; client_indx = CAM_CPAS_GET_CLIENT_IDX(cmd_hw_start->client_handle); ahb_vote = cmd_hw_start->ahb_vote; Loading Loading @@ -1005,8 +1010,9 @@ static int cam_cpas_hw_start(void *hw_priv, void *start_args, cpas_client->started = true; cpas_core->streamon_clients++; CAM_DBG(CAM_CPAS, "client_indx=%d, streamon_clients=%d", client_indx, cpas_core->streamon_clients); CAM_DBG(CAM_CPAS, "client=%s, streamon_clients=%d", soc_private->client_name[client_indx], cpas_core->streamon_clients); done: mutex_unlock(&cpas_core->client_mutex[client_indx]); mutex_unlock(&cpas_hw->hw_mutex); Loading @@ -1028,6 +1034,7 @@ static int cam_cpas_hw_stop(void *hw_priv, void *stop_args, struct cam_cpas_client *cpas_client; struct cam_ahb_vote ahb_vote; struct cam_axi_vote axi_vote; struct cam_cpas_private_soc *soc_private = NULL; int rc = 0; long result; Loading @@ -1045,6 +1052,8 @@ static int cam_cpas_hw_stop(void *hw_priv, void *stop_args, cpas_hw = (struct cam_hw_info *)hw_priv; cpas_core = (struct cam_cpas *) cpas_hw->core_info; soc_private = (struct cam_cpas_private_soc *) cpas_hw->soc_info.soc_private; cmd_hw_stop = (struct cam_cpas_hw_cmd_stop *)stop_args; client_indx = CAM_CPAS_GET_CLIENT_IDX(cmd_hw_stop->client_handle); Loading @@ -1054,8 +1063,9 @@ static int cam_cpas_hw_stop(void *hw_priv, void *stop_args, mutex_lock(&cpas_hw->hw_mutex); mutex_lock(&cpas_core->client_mutex[client_indx]); CAM_DBG(CAM_CPAS, "client_indx=%d, streamon_clients=%d", client_indx, cpas_core->streamon_clients); CAM_DBG(CAM_CPAS, "client=%s, streamon_clients=%d", soc_private->client_name[client_indx], cpas_core->streamon_clients); if (!CAM_CPAS_CLIENT_STARTED(cpas_core, client_indx)) { CAM_ERR(CAM_CPAS, "Client %d is not started", client_indx); Loading drivers/media/platform/msm/camera/cam_icp/fw_inc/hfi_session_defs.h +2 −2 Original line number Diff line number Diff line Loading @@ -261,8 +261,8 @@ enum bps_io_images { }; struct frame_buffer { uint32_t buffer_ptr[MAX_NUM_OF_IMAGE_PLANES]; uint32_t meta_buffer_ptr[MAX_NUM_OF_IMAGE_PLANES]; uint32_t buf_ptr[MAX_NUM_OF_IMAGE_PLANES]; uint32_t meta_buf_ptr[MAX_NUM_OF_IMAGE_PLANES]; } __packed; struct bps_frame_process_data { Loading drivers/media/platform/msm/camera/cam_icp/icp_hw/bps_hw/bps_dev.c +36 −2 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 @@ -33,6 +33,40 @@ static struct cam_bps_device_hw_info cam_bps_hw_info = { }; EXPORT_SYMBOL(cam_bps_hw_info); static bool cam_bps_cpas_cb(uint32_t client_handle, void *userdata, struct cam_cpas_irq_data *irq_data) { bool error_handled = false; if (!irq_data) return error_handled; switch (irq_data->irq_type) { case CAM_CAMNOC_IRQ_IPE_BPS_UBWC_DECODE_ERROR: CAM_ERR_RATE_LIMIT(CAM_ICP, "IPE/BPS UBWC Decode error type=%d status=%x thr_err=%d, fcl_err=%d, len_md_err=%d, format_err=%d", irq_data->irq_type, irq_data->u.dec_err.decerr_status.value, irq_data->u.dec_err.decerr_status.thr_err, irq_data->u.dec_err.decerr_status.fcl_err, irq_data->u.dec_err.decerr_status.len_md_err, irq_data->u.dec_err.decerr_status.format_err); error_handled = true; break; case CAM_CAMNOC_IRQ_IPE_BPS_UBWC_ENCODE_ERROR: CAM_ERR_RATE_LIMIT(CAM_ICP, "IPE/BPS UBWC Encode error type=%d status=%x", irq_data->irq_type, irq_data->u.enc_err.encerr_status.value); error_handled = true; break; default: break; } return error_handled; } int cam_bps_register_cpas(struct cam_hw_soc_info *soc_info, struct cam_bps_device_core_info *core_info, uint32_t hw_idx) Loading @@ -42,7 +76,7 @@ int cam_bps_register_cpas(struct cam_hw_soc_info *soc_info, cpas_register_params.dev = &soc_info->pdev->dev; memcpy(cpas_register_params.identifier, "bps", sizeof("bps")); cpas_register_params.cam_cpas_client_cb = NULL; cpas_register_params.cam_cpas_client_cb = cam_bps_cpas_cb; cpas_register_params.cell_index = hw_idx; cpas_register_params.userdata = NULL; Loading drivers/media/platform/msm/camera/cam_icp/icp_hw/icp_hw_mgr/cam_icp_hw_mgr.c +13 −14 Original line number Diff line number Diff line Loading @@ -308,8 +308,9 @@ static int32_t cam_icp_deinit_idle_clk(void *priv, void *data) ctx_data = &hw_mgr->ctx_data[i]; mutex_lock(&ctx_data->ctx_mutex); if ((ctx_data->state == CAM_ICP_CTX_STATE_ACQUIRED) && (ICP_DEV_TYPE_TO_CLK_TYPE(ctx_data-> icp_dev_acquire_info->dev_type) == clk_info->hw_type)) { (ICP_DEV_TYPE_TO_CLK_TYPE( ctx_data->icp_dev_acquire_info->dev_type) == clk_info->hw_type)) { busy = cam_icp_frame_pending(ctx_data); if (busy) { mutex_unlock(&ctx_data->ctx_mutex); Loading Loading @@ -2994,6 +2995,8 @@ static int cam_icp_mgr_process_cmd_desc(struct cam_icp_hw_mgr *hw_mgr, uint64_t cpu_addr = 0; struct ipe_frame_process_data *frame_process_data = NULL; struct bps_frame_process_data *bps_frame_process_data = NULL; struct frame_set *ipe_set = NULL; struct frame_buffer *bps_bufs = NULL; cmd_desc = (struct cam_cmd_buf_desc *) ((uint32_t *) &packet->payload + packet->cmd_buf_offset/4); Loading Loading @@ -3042,14 +3045,11 @@ static int cam_icp_mgr_process_cmd_desc(struct cam_icp_hw_mgr *hw_mgr, frame_process_data->cdm_buffer_addr = 0; frame_process_data->cdm_prog_base = 0; for (i = 0; i < frame_process_data->frames_in_batch; i++) { ipe_set = &frame_process_data->framesets[i]; for (j = 0; j < IPE_IO_IMAGES_MAX; j++) { for (k = 0; k < MAX_NUM_OF_IMAGE_PLANES; k++) { frame_process_data-> framesets[i].buffers[j]. buffer_ptr[k] = 0; frame_process_data-> framesets[i].buffers[j]. meta_buffer_ptr[k] = 0; ipe_set->buffers[j].buf_ptr[k] = 0; ipe_set->buffers[j].meta_buf_ptr[k] = 0; } } } Loading @@ -3066,11 +3066,10 @@ static int cam_icp_mgr_process_cmd_desc(struct cam_icp_hw_mgr *hw_mgr, bps_frame_process_data->strip_lib_out_addr = 0; bps_frame_process_data->cdm_prog_addr = 0; for (i = 0; i < BPS_IO_IMAGES_MAX; i++) { bps_bufs = &bps_frame_process_data->buffers[i]; for (j = 0; j < MAX_NUM_OF_IMAGE_PLANES; j++) { bps_frame_process_data-> buffers[i].buffer_ptr[j] = 0; bps_frame_process_data-> buffers[i].meta_buffer_ptr[j] = 0; bps_bufs->buf_ptr[j] = 0; bps_bufs->meta_buf_ptr[j] = 0; } } } Loading Loading @@ -4028,8 +4027,8 @@ static int cam_icp_mgr_alloc_devs(struct device_node *of_node) CAM_ERR(CAM_ICP, "read num bps devices failed"); goto num_bps_failed; } icp_hw_mgr.devices[CAM_ICP_DEV_BPS] = kzalloc( sizeof(struct cam_hw_intf *) * num_dev, GFP_KERNEL); icp_hw_mgr.devices[CAM_ICP_DEV_BPS] = kcalloc(num_dev, sizeof(struct cam_hw_intf *), GFP_KERNEL); if (!icp_hw_mgr.devices[CAM_ICP_DEV_BPS]) { rc = -ENOMEM; goto num_bps_failed; Loading Loading
drivers/media/platform/msm/camera/cam_core/cam_context_utils.c +12 −12 Original line number Diff line number Diff line Loading @@ -537,8 +537,7 @@ int32_t cam_context_flush_ctx_to_hw(struct cam_context *ctx) CAM_ERR(CAM_CTXT, "Req: %llu already signalled, sync_id:%d", req->request_id, req->out_map_entries[i]. sync_id); req->out_map_entries[i].sync_id); break; } } Loading Loading @@ -629,6 +628,7 @@ int32_t cam_context_flush_req_to_hw(struct cam_context *ctx, struct cam_ctx_request *req = NULL; struct cam_hw_flush_args flush_args; uint32_t i; int32_t sync_id = 0; int rc = 0; CAM_DBG(CAM_CTXT, "[%s] E: NRT flush req", ctx->dev_name); Loading Loading @@ -683,20 +683,20 @@ int32_t cam_context_flush_req_to_hw(struct cam_context *ctx, if (req) { if (flush_args.num_req_pending || flush_args.num_req_active) { for (i = 0; i < req->num_out_map_entries; i++) if (req->out_map_entries[i].sync_id != -1) { rc = cam_sync_signal( req->out_map_entries[i].sync_id, for (i = 0; i < req->num_out_map_entries; i++) { sync_id = req->out_map_entries[i].sync_id; if (sync_id != -1) { rc = cam_sync_signal(sync_id, CAM_SYNC_STATE_SIGNALED_ERROR); if (rc == -EALREADY) { CAM_ERR(CAM_CTXT, "Req: %llu already signalled, sync_id:%d", req->request_id, req->out_map_entries[i]. sync_id); req->request_id, sync_id); break; } } } if (flush_args.num_req_active) { spin_lock(&ctx->lock); list_add_tail(&req->list, &ctx->free_req_list); Loading
drivers/media/platform/msm/camera/cam_cpas/cam_cpas_hw.c +14 −4 Original line number Diff line number Diff line Loading @@ -873,6 +873,7 @@ static int cam_cpas_hw_update_ahb_vote(struct cam_hw_info *cpas_hw, if (!CAM_CPAS_CLIENT_VALID(client_indx)) return -EINVAL; mutex_lock(&cpas_hw->hw_mutex); mutex_lock(&cpas_core->client_mutex[client_indx]); if (!CAM_CPAS_CLIENT_STARTED(cpas_core, client_indx)) { Loading @@ -892,6 +893,7 @@ static int cam_cpas_hw_update_ahb_vote(struct cam_hw_info *cpas_hw, unlock_client: mutex_unlock(&cpas_core->client_mutex[client_indx]); mutex_unlock(&cpas_hw->hw_mutex); return rc; } Loading @@ -907,6 +909,7 @@ static int cam_cpas_hw_start(void *hw_priv, void *start_args, struct cam_axi_vote *axi_vote; enum cam_vote_level applied_level = CAM_SVS_VOTE; int rc; struct cam_cpas_private_soc *soc_private = NULL; if (!hw_priv || !start_args) { CAM_ERR(CAM_CPAS, "Invalid arguments %pK %pK", Loading @@ -922,6 +925,8 @@ static int cam_cpas_hw_start(void *hw_priv, void *start_args, cpas_hw = (struct cam_hw_info *)hw_priv; cpas_core = (struct cam_cpas *) cpas_hw->core_info; soc_private = (struct cam_cpas_private_soc *) cpas_hw->soc_info.soc_private; cmd_hw_start = (struct cam_cpas_hw_cmd_start *)start_args; client_indx = CAM_CPAS_GET_CLIENT_IDX(cmd_hw_start->client_handle); ahb_vote = cmd_hw_start->ahb_vote; Loading Loading @@ -1005,8 +1010,9 @@ static int cam_cpas_hw_start(void *hw_priv, void *start_args, cpas_client->started = true; cpas_core->streamon_clients++; CAM_DBG(CAM_CPAS, "client_indx=%d, streamon_clients=%d", client_indx, cpas_core->streamon_clients); CAM_DBG(CAM_CPAS, "client=%s, streamon_clients=%d", soc_private->client_name[client_indx], cpas_core->streamon_clients); done: mutex_unlock(&cpas_core->client_mutex[client_indx]); mutex_unlock(&cpas_hw->hw_mutex); Loading @@ -1028,6 +1034,7 @@ static int cam_cpas_hw_stop(void *hw_priv, void *stop_args, struct cam_cpas_client *cpas_client; struct cam_ahb_vote ahb_vote; struct cam_axi_vote axi_vote; struct cam_cpas_private_soc *soc_private = NULL; int rc = 0; long result; Loading @@ -1045,6 +1052,8 @@ static int cam_cpas_hw_stop(void *hw_priv, void *stop_args, cpas_hw = (struct cam_hw_info *)hw_priv; cpas_core = (struct cam_cpas *) cpas_hw->core_info; soc_private = (struct cam_cpas_private_soc *) cpas_hw->soc_info.soc_private; cmd_hw_stop = (struct cam_cpas_hw_cmd_stop *)stop_args; client_indx = CAM_CPAS_GET_CLIENT_IDX(cmd_hw_stop->client_handle); Loading @@ -1054,8 +1063,9 @@ static int cam_cpas_hw_stop(void *hw_priv, void *stop_args, mutex_lock(&cpas_hw->hw_mutex); mutex_lock(&cpas_core->client_mutex[client_indx]); CAM_DBG(CAM_CPAS, "client_indx=%d, streamon_clients=%d", client_indx, cpas_core->streamon_clients); CAM_DBG(CAM_CPAS, "client=%s, streamon_clients=%d", soc_private->client_name[client_indx], cpas_core->streamon_clients); if (!CAM_CPAS_CLIENT_STARTED(cpas_core, client_indx)) { CAM_ERR(CAM_CPAS, "Client %d is not started", client_indx); Loading
drivers/media/platform/msm/camera/cam_icp/fw_inc/hfi_session_defs.h +2 −2 Original line number Diff line number Diff line Loading @@ -261,8 +261,8 @@ enum bps_io_images { }; struct frame_buffer { uint32_t buffer_ptr[MAX_NUM_OF_IMAGE_PLANES]; uint32_t meta_buffer_ptr[MAX_NUM_OF_IMAGE_PLANES]; uint32_t buf_ptr[MAX_NUM_OF_IMAGE_PLANES]; uint32_t meta_buf_ptr[MAX_NUM_OF_IMAGE_PLANES]; } __packed; struct bps_frame_process_data { Loading
drivers/media/platform/msm/camera/cam_icp/icp_hw/bps_hw/bps_dev.c +36 −2 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 @@ -33,6 +33,40 @@ static struct cam_bps_device_hw_info cam_bps_hw_info = { }; EXPORT_SYMBOL(cam_bps_hw_info); static bool cam_bps_cpas_cb(uint32_t client_handle, void *userdata, struct cam_cpas_irq_data *irq_data) { bool error_handled = false; if (!irq_data) return error_handled; switch (irq_data->irq_type) { case CAM_CAMNOC_IRQ_IPE_BPS_UBWC_DECODE_ERROR: CAM_ERR_RATE_LIMIT(CAM_ICP, "IPE/BPS UBWC Decode error type=%d status=%x thr_err=%d, fcl_err=%d, len_md_err=%d, format_err=%d", irq_data->irq_type, irq_data->u.dec_err.decerr_status.value, irq_data->u.dec_err.decerr_status.thr_err, irq_data->u.dec_err.decerr_status.fcl_err, irq_data->u.dec_err.decerr_status.len_md_err, irq_data->u.dec_err.decerr_status.format_err); error_handled = true; break; case CAM_CAMNOC_IRQ_IPE_BPS_UBWC_ENCODE_ERROR: CAM_ERR_RATE_LIMIT(CAM_ICP, "IPE/BPS UBWC Encode error type=%d status=%x", irq_data->irq_type, irq_data->u.enc_err.encerr_status.value); error_handled = true; break; default: break; } return error_handled; } int cam_bps_register_cpas(struct cam_hw_soc_info *soc_info, struct cam_bps_device_core_info *core_info, uint32_t hw_idx) Loading @@ -42,7 +76,7 @@ int cam_bps_register_cpas(struct cam_hw_soc_info *soc_info, cpas_register_params.dev = &soc_info->pdev->dev; memcpy(cpas_register_params.identifier, "bps", sizeof("bps")); cpas_register_params.cam_cpas_client_cb = NULL; cpas_register_params.cam_cpas_client_cb = cam_bps_cpas_cb; cpas_register_params.cell_index = hw_idx; cpas_register_params.userdata = NULL; Loading
drivers/media/platform/msm/camera/cam_icp/icp_hw/icp_hw_mgr/cam_icp_hw_mgr.c +13 −14 Original line number Diff line number Diff line Loading @@ -308,8 +308,9 @@ static int32_t cam_icp_deinit_idle_clk(void *priv, void *data) ctx_data = &hw_mgr->ctx_data[i]; mutex_lock(&ctx_data->ctx_mutex); if ((ctx_data->state == CAM_ICP_CTX_STATE_ACQUIRED) && (ICP_DEV_TYPE_TO_CLK_TYPE(ctx_data-> icp_dev_acquire_info->dev_type) == clk_info->hw_type)) { (ICP_DEV_TYPE_TO_CLK_TYPE( ctx_data->icp_dev_acquire_info->dev_type) == clk_info->hw_type)) { busy = cam_icp_frame_pending(ctx_data); if (busy) { mutex_unlock(&ctx_data->ctx_mutex); Loading Loading @@ -2994,6 +2995,8 @@ static int cam_icp_mgr_process_cmd_desc(struct cam_icp_hw_mgr *hw_mgr, uint64_t cpu_addr = 0; struct ipe_frame_process_data *frame_process_data = NULL; struct bps_frame_process_data *bps_frame_process_data = NULL; struct frame_set *ipe_set = NULL; struct frame_buffer *bps_bufs = NULL; cmd_desc = (struct cam_cmd_buf_desc *) ((uint32_t *) &packet->payload + packet->cmd_buf_offset/4); Loading Loading @@ -3042,14 +3045,11 @@ static int cam_icp_mgr_process_cmd_desc(struct cam_icp_hw_mgr *hw_mgr, frame_process_data->cdm_buffer_addr = 0; frame_process_data->cdm_prog_base = 0; for (i = 0; i < frame_process_data->frames_in_batch; i++) { ipe_set = &frame_process_data->framesets[i]; for (j = 0; j < IPE_IO_IMAGES_MAX; j++) { for (k = 0; k < MAX_NUM_OF_IMAGE_PLANES; k++) { frame_process_data-> framesets[i].buffers[j]. buffer_ptr[k] = 0; frame_process_data-> framesets[i].buffers[j]. meta_buffer_ptr[k] = 0; ipe_set->buffers[j].buf_ptr[k] = 0; ipe_set->buffers[j].meta_buf_ptr[k] = 0; } } } Loading @@ -3066,11 +3066,10 @@ static int cam_icp_mgr_process_cmd_desc(struct cam_icp_hw_mgr *hw_mgr, bps_frame_process_data->strip_lib_out_addr = 0; bps_frame_process_data->cdm_prog_addr = 0; for (i = 0; i < BPS_IO_IMAGES_MAX; i++) { bps_bufs = &bps_frame_process_data->buffers[i]; for (j = 0; j < MAX_NUM_OF_IMAGE_PLANES; j++) { bps_frame_process_data-> buffers[i].buffer_ptr[j] = 0; bps_frame_process_data-> buffers[i].meta_buffer_ptr[j] = 0; bps_bufs->buf_ptr[j] = 0; bps_bufs->meta_buf_ptr[j] = 0; } } } Loading Loading @@ -4028,8 +4027,8 @@ static int cam_icp_mgr_alloc_devs(struct device_node *of_node) CAM_ERR(CAM_ICP, "read num bps devices failed"); goto num_bps_failed; } icp_hw_mgr.devices[CAM_ICP_DEV_BPS] = kzalloc( sizeof(struct cam_hw_intf *) * num_dev, GFP_KERNEL); icp_hw_mgr.devices[CAM_ICP_DEV_BPS] = kcalloc(num_dev, sizeof(struct cam_hw_intf *), GFP_KERNEL); if (!icp_hw_mgr.devices[CAM_ICP_DEV_BPS]) { rc = -ENOMEM; goto num_bps_failed; Loading