From c952930533a5ed73de5b7dc76e9dd73ed9c56715 Mon Sep 17 00:00:00 2001 From: Vishalsingh Hajeri Date: Mon, 24 Jun 2019 16:48:27 -0700 Subject: [PATCH] msm: camera: isp: Add CSID binning Add support to configure CSID binning Change-Id: I09b76b287c243149c89cba958a786f7476c8addb Signed-off-by: Vishalsingh Hajeri --- drivers/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c | 4 ++++ .../isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid480.h | 2 ++ .../isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_core.c | 8 ++++++++ .../isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_core.h | 3 +++ .../isp_hw_mgr/isp_hw/include/cam_ife_csid_hw_intf.h | 2 ++ .../isp_hw_mgr/isp_hw/vfe_hw/vfe_top/cam_vfe_camif_ver3.c | 8 ++++++++ 6 files changed, 27 insertions(+) diff --git a/drivers/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c b/drivers/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c index fac5c41aa1a4..75f157f0d5b8 100644 --- a/drivers/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c +++ b/drivers/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c @@ -2147,6 +2147,8 @@ static int cam_ife_mgr_acquire_get_unified_structure_v0( port_info->dsp_mode = in->dsp_mode; port_info->hbi_cnt = in->hbi_cnt; port_info->cust_node = 0; + port_info->horizontal_bin = 0; + port_info->qcfa_bin = 0; port_info->num_out_res = in->num_out_res; port_info->data = kcalloc(in->num_out_res, @@ -2246,6 +2248,8 @@ static int cam_ife_mgr_acquire_get_unified_structure_v2( port_info->dsp_mode = in->dsp_mode; port_info->hbi_cnt = in->hbi_cnt; port_info->cust_node = in->cust_node; + port_info->horizontal_bin = in->horizontal_bin; + port_info->qcfa_bin = in->qcfa_bin; port_info->num_out_res = in->num_out_res; port_info->data = kcalloc(in->num_out_res, diff --git a/drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid480.h b/drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid480.h index f8eee4109b65..b545ccc2a246 100644 --- a/drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid480.h +++ b/drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid480.h @@ -50,6 +50,8 @@ static struct cam_ife_csid_pxl_reg_offset cam_ife_csid_480_ipp_reg_offset = { /* configurations */ .pix_store_en_shift_val = 7, .early_eof_en_shift_val = 29, + .horizontal_bin_en_shift_val = 2, + .quad_cfa_bin_en_shift_val = 30, .ccif_violation_en = 1, .overflow_ctrl_en = 1, }; diff --git a/drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_core.c b/drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_core.c index a41d203d4402..252c1a5aa36a 100644 --- a/drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_core.c +++ b/drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_core.c @@ -1016,6 +1016,8 @@ static int cam_ife_csid_path_reserve(struct cam_ife_csid_hw *csid_hw, path_data->end_line = reserve->in_port->line_stop; path_data->crop_enable = reserve->crop_enable; path_data->drop_enable = reserve->drop_enable; + path_data->horizontal_bin = reserve->in_port->horizontal_bin; + path_data->qcfa_bin = reserve->in_port->qcfa_bin; CAM_DBG(CAM_ISP, "Res id: %d height:%d line_start %d line_stop %d crop_en %d", @@ -1603,6 +1605,12 @@ static int cam_ife_csid_init_config_pxl_path( (path_data->drop_enable << csid_reg->cmn_reg->drop_v_en_shift_val); + if (path_data->horizontal_bin || path_data->qcfa_bin) { + val |= (1 << pxl_reg->horizontal_bin_en_shift_val); + if (path_data->qcfa_bin) + val |= (1 << pxl_reg->quad_cfa_bin_en_shift_val); + } + val |= (1 << pxl_reg->pix_store_en_shift_val); cam_io_w_mb(val, soc_info->reg_map[0].mem_base + pxl_reg->csid_pxl_cfg0_addr); diff --git a/drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_core.h b/drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_core.h index a68c56188c5f..3e998858b596 100644 --- a/drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_core.h +++ b/drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_core.h @@ -133,6 +133,7 @@ struct cam_ife_csid_pxl_reg_offset { /* configuration */ uint32_t pix_store_en_shift_val; uint32_t early_eof_en_shift_val; + uint32_t horizontal_bin_en_shift_val; uint32_t quad_cfa_bin_en_shift_val; uint32_t ccif_violation_en; uint32_t overflow_ctrl_en; @@ -448,6 +449,8 @@ struct cam_ife_csid_path_cfg { enum cam_isp_hw_sync_mode sync_mode; uint32_t master_idx; uint64_t clk_rate; + uint32_t horizontal_bin; + uint32_t qcfa_bin; }; /** diff --git a/drivers/cam_isp/isp_hw_mgr/isp_hw/include/cam_ife_csid_hw_intf.h b/drivers/cam_isp/isp_hw_mgr/isp_hw/include/cam_ife_csid_hw_intf.h index 777dfdb5d145..d8ba811c7ad5 100644 --- a/drivers/cam_isp/isp_hw_mgr/isp_hw/include/cam_ife_csid_hw_intf.h +++ b/drivers/cam_isp/isp_hw_mgr/isp_hw/include/cam_ife_csid_hw_intf.h @@ -95,6 +95,8 @@ struct cam_isp_in_port_generic_info { uint32_t hbi_cnt; uint32_t cust_node; uint32_t num_out_res; + uint32_t horizontal_bin; + uint32_t qcfa_bin; struct cam_isp_out_port_generic_info *data; }; diff --git a/drivers/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe_top/cam_vfe_camif_ver3.c b/drivers/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe_top/cam_vfe_camif_ver3.c index e4a05a1031b7..bbc25bc96045 100644 --- a/drivers/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe_top/cam_vfe_camif_ver3.c +++ b/drivers/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe_top/cam_vfe_camif_ver3.c @@ -49,6 +49,8 @@ struct cam_vfe_mux_camif_ver3_data { bool enable_sof_irq_debug; uint32_t irq_debug_cnt; uint32_t camif_debug; + uint32_t horizontal_bin; + uint32_t qcfa_bin; }; static int cam_vfe_camif_ver3_get_evt_payload( @@ -250,6 +252,9 @@ int cam_vfe_camif_ver3_acquire_resource( camif_data->last_pixel = acquire_data->vfe_in.in_port->left_stop; camif_data->first_line = acquire_data->vfe_in.in_port->line_start; camif_data->last_line = acquire_data->vfe_in.in_port->line_stop; + camif_data->horizontal_bin = + acquire_data->vfe_in.in_port->horizontal_bin; + 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; @@ -441,6 +446,9 @@ static int cam_vfe_camif_ver3_resource_start( * frame width. We use '/ 4' instead of '/ 2' * cause it is multipixel path */ + if (rsrc_data->horizontal_bin || rsrc_data->qcfa_bin) + epoch0_line_cfg >>= 1; + epoch1_line_cfg = rsrc_data->reg_data->epoch_line_cfg & 0xFFFF; computed_epoch_line_cfg = (epoch1_line_cfg << 16) |