msm: camera: ife: Sync master and slave IFE

Program hw_sync_sel field in core_cfg register
in case of dual ife.

CRs-Fixed: 2582959
Change-Id: I8a60cb06991738872c4caf0120ea21e5954d208a
Signed-off-by: Vishalsingh Hajeri <vhajeri@codeaurora.org>
Dieser Commit ist enthalten in:
Vishalsingh Hajeri
2019-12-06 20:10:27 -08:00
Ursprung 7d7ed34560
Commit 423e6d195c
5 geänderte Dateien mit 44 neuen und 10 gelöschten Zeilen

Datei anzeigen

@@ -1,6 +1,6 @@
// 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>
@@ -1550,6 +1550,7 @@ static int cam_ife_hw_mgr_acquire_res_ife_src(
else
vfe_acquire.vfe_in.sync_mode =
CAM_ISP_HW_SYNC_NONE;
vfe_acquire.vfe_in.is_dual = csid_res->is_dual_vfe;
break;
case CAM_IFE_PIX_PATH_RES_PPP:
@@ -1590,12 +1591,21 @@ static int cam_ife_hw_mgr_acquire_res_ife_src(
hw_intf = ife_hw_mgr->ife_devices[
csid_res->hw_res[i]->hw_intf->hw_idx];
if (i == CAM_ISP_HW_SPLIT_LEFT &&
ife_src_res->is_dual_vfe) {
vfe_acquire.vfe_in.dual_hw_idx =
ife_ctx->slave_hw_idx;
}
/* fill in more acquire information as needed */
/* slave Camif resource, */
if (i == CAM_ISP_HW_SPLIT_RIGHT &&
ife_src_res->is_dual_vfe)
ife_src_res->is_dual_vfe) {
vfe_acquire.vfe_in.sync_mode =
CAM_ISP_HW_SYNC_SLAVE;
vfe_acquire.vfe_in.dual_hw_idx =
ife_ctx->master_hw_idx;
}
rc = hw_intf->hw_ops.reserve(hw_intf->hw_priv,
&vfe_acquire,

Datei anzeigen

@@ -1,6 +1,6 @@
/* 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_VFE_HW_INTF_H_
@@ -137,6 +137,8 @@ struct cam_vfe_hw_vfe_out_acquire_args {
* is successful
* @res_id: Resource ID of resource to acquire if specific,
* else CAM_ISP_HW_VFE_IN_MAX
* @dual_hw_idx: Slave core for this master core if dual vfe case
* @is_dual: flag to indicate if dual vfe case
* @cdm_ops: CDM operations
* @sync_mode: In case of Dual VFE, this is Master or Slave.
* (Default is Master in case of Single VFE)
@@ -145,6 +147,8 @@ struct cam_vfe_hw_vfe_out_acquire_args {
struct cam_vfe_hw_vfe_in_acquire_args {
struct cam_isp_resource_node *rsrc_node;
uint32_t res_id;
uint32_t dual_hw_idx;
uint32_t is_dual;
void *cdm_ops;
enum cam_isp_hw_sync_mode sync_mode;
struct cam_isp_in_port_generic_info *in_port;

Datei anzeigen

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2019, The Linux Foundation. All rights reserved.
* Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
*/
@@ -37,6 +37,7 @@ static struct cam_vfe_camif_ver3_reg_data vfe_580_camif_reg_data = {
.pp_camif_cfg_en_shift = 0,
.pp_camif_cfg_ife_out_en_shift = 8,
.top_debug_cfg_en = 1,
.dual_vfe_sync_mask = 0x3,
};
static struct cam_vfe_camif_lite_ver3_reg_data vfe580_camif_rdi1_reg_data = {

Datei anzeigen

@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2019, The Linux Foundation. All rights reserved.
* Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
*/
#include <linux/slab.h>
@@ -52,6 +52,8 @@ struct cam_vfe_mux_camif_ver3_data {
uint32_t camif_debug;
uint32_t horizontal_bin;
uint32_t qcfa_bin;
uint32_t dual_hw_idx;
uint32_t is_dual;
};
static int cam_vfe_camif_ver3_get_evt_payload(
@@ -258,6 +260,10 @@ int cam_vfe_camif_ver3_acquire_resource(
camif_data->qcfa_bin = acquire_data->vfe_in.in_port->qcfa_bin;
camif_data->event_cb = acquire_data->event_cb;
camif_data->priv = acquire_data->priv;
camif_data->is_dual = acquire_data->vfe_in.is_dual;
if (acquire_data->vfe_in.is_dual)
camif_data->dual_hw_idx = acquire_data->vfe_in.dual_hw_idx;
CAM_DBG(CAM_ISP, "VFE:%d CAMIF pix_pattern:%d dsp_mode=%d",
camif_res->hw_intf->hw_idx,
@@ -387,10 +393,16 @@ static int cam_vfe_camif_ver3_resource_start(
if ((rsrc_data->dsp_mode >= CAM_ISP_DSP_MODE_ONE_WAY) &&
(rsrc_data->dsp_mode <= CAM_ISP_DSP_MODE_ROUND)) {
/* DSP mode reg val is CAM_ISP_DSP_MODE - 1 */
val |= (((rsrc_data->dsp_mode - 1) &
rsrc_data->reg_data->dsp_mode_mask) <<
rsrc_data->reg_data->dsp_mode_shift);
val |= (0x1 << rsrc_data->reg_data->dsp_en_shift);
if (camif_res->hw_intf->hw_idx != CAM_ISP_HW_VFE_CORE_2) {
val |= (((rsrc_data->dsp_mode - 1) &
rsrc_data->reg_data->dsp_mode_mask) <<
rsrc_data->reg_data->dsp_mode_shift);
val |= (0x1 << rsrc_data->reg_data->dsp_en_shift);
} else {
CAM_ERR(CAM_ISP, "Error, HVX not available for IFE_%d",
camif_res->hw_intf->hw_idx);
return -EINVAL;
}
}
if (rsrc_data->sync_mode == CAM_ISP_HW_SYNC_SLAVE)
@@ -419,6 +431,12 @@ static int cam_vfe_camif_ver3_resource_start(
val |= (rsrc_data->cam_common_cfg.input_mux_sel_pp & 0x3) <<
CAM_SHIFT_TOP_CORE_CFG_INPUTMUX_PP;
if (rsrc_data->is_dual && rsrc_data->reg_data->dual_vfe_sync_mask) {
val |= (((rsrc_data->dual_hw_idx &
rsrc_data->reg_data->dual_vfe_sync_mask) + 1) <<
rsrc_data->reg_data->dual_ife_sync_sel_shift);
}
cam_io_w_mb(val, rsrc_data->mem_base +
rsrc_data->common_reg->core_cfg_0);

Datei anzeigen

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2019, The Linux Foundation. All rights reserved.
* Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
*/
#ifndef _CAM_VFE_CAMIF_VER3_H_
@@ -58,6 +58,7 @@ struct cam_vfe_camif_ver3_reg_data {
uint32_t pp_camif_cfg_en_shift;
uint32_t pp_camif_cfg_ife_out_en_shift;
uint32_t top_debug_cfg_en;
uint32_t dual_vfe_sync_mask;
};
struct cam_vfe_camif_ver3_hw_info {