Merge "msm: camera: ife: Configure epoch to exactly half of the frame" into camera-kernel.lnx.4.0
Bu işleme şunda yer alıyor:

işlemeyi yapan:
Gerrit - the friendly Code Review server

işleme
64d45ce53f
@@ -49,6 +49,7 @@ static uint32_t blob_type_hw_cmd_map[CAM_ISP_GENERIC_BLOB_TYPE_MAX] = {
|
||||
CAM_ISP_HW_CMD_CORE_CONFIG,
|
||||
CAM_ISP_HW_CMD_WM_CONFIG_UPDATE,
|
||||
CAM_ISP_HW_CMD_BW_UPDATE_V2,
|
||||
CAM_ISP_HW_CMD_BLANKING_UPDATE,
|
||||
};
|
||||
|
||||
static struct cam_ife_hw_mgr g_ife_hw_mgr;
|
||||
@@ -5577,6 +5578,53 @@ static int cam_isp_blob_csid_config_update(
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int cam_isp_blob_sensor_blanking_config(
|
||||
uint32_t blob_type,
|
||||
struct cam_isp_generic_blob_info *blob_info,
|
||||
struct cam_isp_sensor_blanking_config *sensor_blanking_config,
|
||||
struct cam_hw_prepare_update_args *prepare)
|
||||
|
||||
{
|
||||
struct cam_ife_hw_mgr_ctx *ctx = NULL;
|
||||
struct cam_isp_hw_mgr_res *hw_mgr_res;
|
||||
struct cam_hw_intf *hw_intf;
|
||||
struct cam_isp_blanking_config blanking_config;
|
||||
int rc = 0, i;
|
||||
|
||||
ctx = prepare->ctxt_to_hw_map;
|
||||
if (list_empty(&ctx->res_list_ife_src)) {
|
||||
CAM_ERR(CAM_ISP, "Mux List empty");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
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;
|
||||
blanking_config.node_res = hw_mgr_res->hw_res[i];
|
||||
blanking_config.vbi = sensor_blanking_config->vbi;
|
||||
blanking_config.hbi = sensor_blanking_config->hbi;
|
||||
|
||||
if (hw_intf && hw_intf->hw_ops.process_cmd) {
|
||||
rc = hw_intf->hw_ops.process_cmd(
|
||||
hw_intf->hw_priv,
|
||||
CAM_ISP_HW_CMD_BLANKING_UPDATE,
|
||||
&blanking_config,
|
||||
sizeof(
|
||||
struct cam_isp_blanking_config));
|
||||
if (rc)
|
||||
CAM_ERR(CAM_ISP,
|
||||
"blanking update failed");
|
||||
}
|
||||
}
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int cam_isp_packet_generic_blob_handler(void *user_data,
|
||||
uint32_t blob_type, uint32_t blob_size, uint8_t *blob_data)
|
||||
{
|
||||
@@ -6057,6 +6105,25 @@ static int cam_isp_packet_generic_blob_handler(void *user_data,
|
||||
CAM_ERR(CAM_ISP, "CSID Config failed rc: %d", rc);
|
||||
}
|
||||
break;
|
||||
case CAM_ISP_GENERIC_BLOB_TYPE_SENSOR_BLANKING_CONFIG: {
|
||||
struct cam_isp_sensor_blanking_config *sensor_blanking_config;
|
||||
|
||||
if (blob_size < sizeof(struct cam_isp_sensor_blanking_config)) {
|
||||
CAM_ERR(CAM_ISP, "Invalid blob size %zu expected %zu",
|
||||
blob_size,
|
||||
sizeof(struct cam_isp_sensor_blanking_config));
|
||||
return -EINVAL;
|
||||
}
|
||||
sensor_blanking_config =
|
||||
(struct cam_isp_sensor_blanking_config *)blob_data;
|
||||
|
||||
rc = cam_isp_blob_sensor_blanking_config(blob_type, blob_info,
|
||||
sensor_blanking_config, prepare);
|
||||
if (rc)
|
||||
CAM_ERR(CAM_ISP,
|
||||
"Epoch Configuration Update Failed rc:%d", rc);
|
||||
}
|
||||
break;
|
||||
case CAM_ISP_GENERIC_BLOB_TYPE_SENSOR_DIMENSION_CONFIG: {
|
||||
struct cam_isp_sensor_config *csid_dim_config;
|
||||
|
||||
|
@@ -124,6 +124,7 @@ enum cam_isp_hw_cmd_type {
|
||||
CAM_ISP_HW_CMD_UNMASK_BUS_WR_IRQ,
|
||||
CAM_ISP_HW_CMD_IS_CONSUMED_ADDR_SUPPORT,
|
||||
CAM_ISP_HW_CMD_GET_RES_FOR_MID,
|
||||
CAM_ISP_HW_CMD_BLANKING_UPDATE,
|
||||
CAM_ISP_HW_CMD_MAX,
|
||||
};
|
||||
|
||||
@@ -178,6 +179,20 @@ struct cam_isp_resource_node {
|
||||
CAM_IRQ_HANDLER_BOTTOM_HALF bottom_half_handler;
|
||||
};
|
||||
|
||||
/*
|
||||
* struct cam_isp_blanking_config:
|
||||
*
|
||||
* @Brief: Structure to pass blanking details
|
||||
* @hbi: HBI Value
|
||||
* @vbi: VBI Value
|
||||
* node_res: Pointer to Resource Node object
|
||||
*/
|
||||
struct cam_isp_blanking_config {
|
||||
uint32_t hbi;
|
||||
uint32_t vbi;
|
||||
struct cam_isp_resource_node *node_res;
|
||||
};
|
||||
|
||||
/*
|
||||
* struct cam_isp_hw_event_info:
|
||||
*
|
||||
|
@@ -79,6 +79,8 @@ struct cam_tfe_camif_data {
|
||||
uint32_t camif_debug;
|
||||
uint32_t camif_pd_enable;
|
||||
uint32_t dual_tfe_sync_sel;
|
||||
uint32_t hbi_value;
|
||||
uint32_t vbi_value;
|
||||
};
|
||||
|
||||
struct cam_tfe_rdi_data {
|
||||
@@ -265,6 +267,10 @@ static void cam_tfe_log_tfe_in_debug_status(
|
||||
"Acquired line start:0x%x line end:0x%x",
|
||||
camif_data->first_line,
|
||||
camif_data->last_line);
|
||||
CAM_INFO(CAM_ISP, "vbi_value:0x%x hbi_value:0x%x",
|
||||
camif_data->vbi_value,
|
||||
camif_data->hbi_value);
|
||||
|
||||
} else if ((top_priv->in_rsrc[i].res_id >=
|
||||
CAM_ISP_HW_TFE_IN_RDI0) ||
|
||||
(top_priv->in_rsrc[i].res_id <=
|
||||
@@ -1815,6 +1821,10 @@ int cam_tfe_top_reserve(void *device_priv,
|
||||
acquire_args->in_port->line_start;
|
||||
camif_data->last_line =
|
||||
acquire_args->in_port->line_end;
|
||||
camif_data->vbi_value =
|
||||
acquire_args->in_port->sensor_vbi;
|
||||
camif_data->hbi_value =
|
||||
acquire_args->in_port->sensor_hbi;
|
||||
camif_data->camif_pd_enable =
|
||||
acquire_args->camif_pd_enable;
|
||||
camif_data->dual_tfe_sync_sel =
|
||||
@@ -1978,9 +1988,12 @@ static int cam_tfe_camif_resource_start(
|
||||
}
|
||||
|
||||
/* Epoch config */
|
||||
epoch0_irq_mask = ((rsrc_data->last_line -
|
||||
epoch0_irq_mask = (((rsrc_data->last_line + rsrc_data->vbi_value) -
|
||||
rsrc_data->first_line) / 2) +
|
||||
rsrc_data->first_line;
|
||||
if (epoch0_irq_mask > rsrc_data->last_line)
|
||||
epoch0_irq_mask = rsrc_data->last_line;
|
||||
|
||||
epoch1_irq_mask = rsrc_data->reg_data->epoch_line_cfg &
|
||||
0xFFFF;
|
||||
computed_epoch_line_cfg = (epoch0_irq_mask << 16) |
|
||||
|
@@ -601,6 +601,7 @@ int cam_vfe_process_cmd(void *hw_priv, uint32_t cmd_type,
|
||||
case CAM_ISP_HW_CMD_ADD_WAIT:
|
||||
case CAM_ISP_HW_CMD_ADD_WAIT_TRIGGER:
|
||||
case CAM_ISP_HW_CMD_CAMIF_DATA:
|
||||
case CAM_ISP_HW_CMD_BLANKING_UPDATE:
|
||||
rc = core_info->vfe_top->hw_ops.process_cmd(
|
||||
core_info->vfe_top->top_priv, cmd_type, cmd_args,
|
||||
arg_size);
|
||||
|
@@ -371,6 +371,9 @@ static int cam_vfe_camif_lite_process_cmd(
|
||||
break;
|
||||
case CAM_ISP_HW_CMD_SET_CAMIF_DEBUG:
|
||||
break;
|
||||
case CAM_ISP_HW_CMD_BLANKING_UPDATE:
|
||||
rc = 0;
|
||||
break;
|
||||
default:
|
||||
CAM_ERR(CAM_ISP,
|
||||
"unsupported process command:%d", cmd_type);
|
||||
|
@@ -772,6 +772,9 @@ static int cam_vfe_camif_lite_process_cmd(
|
||||
rsrc_node->res_priv;
|
||||
camif_lite_priv->camif_debug = *((uint32_t *)cmd_args);
|
||||
break;
|
||||
case CAM_ISP_HW_CMD_BLANKING_UPDATE:
|
||||
rc = 0;
|
||||
break;
|
||||
default:
|
||||
CAM_ERR(CAM_ISP,
|
||||
"unsupported process command:%d", cmd_type);
|
||||
|
@@ -45,6 +45,8 @@ struct cam_vfe_mux_camif_data {
|
||||
uint32_t first_line;
|
||||
uint32_t last_pixel;
|
||||
uint32_t last_line;
|
||||
uint32_t hbi_value;
|
||||
uint32_t vbi_value;
|
||||
bool enable_sof_irq_debug;
|
||||
uint32_t irq_debug_cnt;
|
||||
uint32_t camif_debug;
|
||||
@@ -269,6 +271,8 @@ int cam_vfe_camif_ver2_acquire_resource(
|
||||
camif_data->event_cb = acquire_data->event_cb;
|
||||
camif_data->priv = acquire_data->priv;
|
||||
camif_data->is_dual = acquire_data->vfe_in.is_dual;
|
||||
camif_data->hbi_value = 0;
|
||||
camif_data->vbi_value = 0;
|
||||
|
||||
if (acquire_data->vfe_in.is_dual)
|
||||
camif_data->dual_hw_idx =
|
||||
@@ -420,9 +424,13 @@ static int cam_vfe_camif_resource_start(
|
||||
rsrc_data->camif_reg->epoch_irq);
|
||||
break;
|
||||
default:
|
||||
epoch0_irq_mask = ((rsrc_data->last_line -
|
||||
epoch0_irq_mask = (((rsrc_data->last_line +
|
||||
rsrc_data->vbi_value) -
|
||||
rsrc_data->first_line) / 2) +
|
||||
rsrc_data->first_line;
|
||||
if (epoch0_irq_mask > rsrc_data->last_line)
|
||||
epoch0_irq_mask = rsrc_data->last_line;
|
||||
|
||||
epoch1_irq_mask = rsrc_data->reg_data->epoch_line_cfg &
|
||||
0xFFFF;
|
||||
computed_epoch_line_cfg = (epoch0_irq_mask << 16) |
|
||||
@@ -431,10 +439,11 @@ static int cam_vfe_camif_resource_start(
|
||||
rsrc_data->mem_base +
|
||||
rsrc_data->camif_reg->epoch_irq);
|
||||
CAM_DBG(CAM_ISP, "first_line: %u\n"
|
||||
"last_line: %u\n"
|
||||
"last_line: %u vbi: %u\n"
|
||||
"epoch_line_cfg: 0x%x",
|
||||
rsrc_data->first_line,
|
||||
rsrc_data->last_line,
|
||||
rsrc_data->vbi_value,
|
||||
computed_epoch_line_cfg);
|
||||
break;
|
||||
}
|
||||
@@ -669,6 +678,23 @@ int cam_vfe_camif_dump_timestamps(
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cam_vfe_camif_blanking_update(
|
||||
struct cam_isp_resource_node *rsrc_node, void *cmd_args)
|
||||
{
|
||||
struct cam_vfe_mux_camif_data *camif_priv =
|
||||
(struct cam_vfe_mux_camif_data *)rsrc_node->res_priv;
|
||||
|
||||
struct cam_isp_blanking_config *blanking_config =
|
||||
(struct cam_isp_blanking_config *)cmd_args;
|
||||
|
||||
camif_priv->hbi_value = blanking_config->hbi;
|
||||
camif_priv->vbi_value = blanking_config->vbi;
|
||||
|
||||
CAM_DBG(CAM_ISP, "hbi:%d vbi:%d",
|
||||
camif_priv->hbi_value, camif_priv->vbi_value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cam_vfe_camif_process_cmd(struct cam_isp_resource_node *rsrc_node,
|
||||
uint32_t cmd_type, void *cmd_args, uint32_t arg_size)
|
||||
{
|
||||
@@ -696,6 +722,9 @@ static int cam_vfe_camif_process_cmd(struct cam_isp_resource_node *rsrc_node,
|
||||
case CAM_ISP_HW_CMD_CAMIF_DATA:
|
||||
rc = cam_vfe_camif_dump_timestamps(rsrc_node, cmd_args);
|
||||
break;
|
||||
case CAM_ISP_HW_CMD_BLANKING_UPDATE:
|
||||
rc = cam_vfe_camif_blanking_update(rsrc_node, cmd_args);
|
||||
break;
|
||||
default:
|
||||
CAM_ERR(CAM_ISP,
|
||||
"unsupported process command:%d", cmd_type);
|
||||
|
@@ -48,6 +48,8 @@ struct cam_vfe_mux_camif_ver3_data {
|
||||
uint32_t first_line;
|
||||
uint32_t last_pixel;
|
||||
uint32_t last_line;
|
||||
uint32_t hbi_value;
|
||||
uint32_t vbi_value;
|
||||
bool enable_sof_irq_debug;
|
||||
uint32_t irq_debug_cnt;
|
||||
uint32_t camif_debug;
|
||||
@@ -276,6 +278,8 @@ int cam_vfe_camif_ver3_acquire_resource(
|
||||
camif_data->qcfa_bin = acquire_data->vfe_in.in_port->qcfa_bin;
|
||||
camif_data->horizontal_bin =
|
||||
acquire_data->vfe_in.in_port->horizontal_bin;
|
||||
camif_data->hbi_value = 0;
|
||||
camif_data->vbi_value = 0;
|
||||
|
||||
if (camif_data->is_dual)
|
||||
camif_data->dual_hw_idx = acquire_data->vfe_in.dual_hw_idx;
|
||||
@@ -464,8 +468,11 @@ static int cam_vfe_camif_ver3_resource_start(
|
||||
case CAM_CPAS_TITAN_480_V100:
|
||||
case CAM_CPAS_TITAN_580_V100:
|
||||
case CAM_CPAS_TITAN_570_V200:
|
||||
epoch0_line_cfg = (rsrc_data->last_line -
|
||||
epoch0_line_cfg = ((rsrc_data->last_line +
|
||||
rsrc_data->vbi_value) -
|
||||
rsrc_data->first_line) / 4;
|
||||
if (epoch0_line_cfg > rsrc_data->last_line)
|
||||
epoch0_line_cfg = rsrc_data->last_line;
|
||||
/* epoch line cfg will still be configured at midpoint of the
|
||||
* frame width. We use '/ 4' instead of '/ 2'
|
||||
* cause it is multipixel path
|
||||
@@ -811,6 +818,23 @@ int cam_vfe_camif_ver3_dump_timestamps(
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cam_vfe_camif_ver3_blanking_update(
|
||||
struct cam_isp_resource_node *rsrc_node, void *cmd_args)
|
||||
{
|
||||
struct cam_vfe_mux_camif_ver3_data *camif_priv =
|
||||
(struct cam_vfe_mux_camif_ver3_data *)rsrc_node->res_priv;
|
||||
|
||||
struct cam_isp_blanking_config *blanking_config =
|
||||
(struct cam_isp_blanking_config *)cmd_args;
|
||||
|
||||
camif_priv->hbi_value = blanking_config->hbi;
|
||||
camif_priv->vbi_value = blanking_config->vbi;
|
||||
|
||||
CAM_DBG(CAM_ISP, "hbi:%d vbi:%d",
|
||||
camif_priv->hbi_value, camif_priv->vbi_value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cam_vfe_camif_ver3_process_cmd(
|
||||
struct cam_isp_resource_node *rsrc_node,
|
||||
uint32_t cmd_type, void *cmd_args, uint32_t arg_size)
|
||||
@@ -850,6 +874,9 @@ static int cam_vfe_camif_ver3_process_cmd(
|
||||
case CAM_ISP_HW_CMD_CAMIF_DATA:
|
||||
rc = cam_vfe_camif_ver3_dump_timestamps(rsrc_node, cmd_args);
|
||||
break;
|
||||
case CAM_ISP_HW_CMD_BLANKING_UPDATE:
|
||||
rc = cam_vfe_camif_ver3_blanking_update(rsrc_node, cmd_args);
|
||||
break;
|
||||
default:
|
||||
CAM_ERR(CAM_ISP,
|
||||
"unsupported process command:%d", cmd_type);
|
||||
|
@@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/slab.h>
|
||||
@@ -36,6 +36,8 @@ struct cam_vfe_mux_fe_data {
|
||||
uint32_t first_line;
|
||||
uint32_t last_pixel;
|
||||
uint32_t last_line;
|
||||
uint32_t hbi_value;
|
||||
uint32_t vbi_value;
|
||||
bool enable_sof_irq_debug;
|
||||
uint32_t irq_debug_cnt;
|
||||
uint32_t fe_cfg_data;
|
||||
@@ -179,6 +181,8 @@ int cam_vfe_fe_ver1_acquire_resource(
|
||||
fe_data->last_pixel = acquire_data->vfe_in.in_port->left_stop;
|
||||
fe_data->first_line = acquire_data->vfe_in.in_port->line_start;
|
||||
fe_data->last_line = acquire_data->vfe_in.in_port->line_stop;
|
||||
fe_data->hbi_value = 0;
|
||||
fe_data->vbi_value = 0;
|
||||
|
||||
CAM_DBG(CAM_ISP, "hw id:%d pix_pattern:%d dsp_mode=%d",
|
||||
fe_res->hw_intf->hw_idx,
|
||||
@@ -302,16 +306,19 @@ static int cam_vfe_fe_resource_start(
|
||||
CAM_VFE_TOP_VER2_MODULE_STATS]->cgc_ovd);
|
||||
|
||||
/* epoch config */
|
||||
epoch0_irq_mask = ((rsrc_data->last_line - rsrc_data->first_line) / 2) +
|
||||
rsrc_data->first_line;
|
||||
epoch0_irq_mask = (((rsrc_data->last_line + rsrc_data->vbi_value) -
|
||||
rsrc_data->first_line) / 2) + rsrc_data->first_line;
|
||||
if (epoch0_irq_mask > rsrc_data->last_line)
|
||||
epoch0_irq_mask = rsrc_data->last_line;
|
||||
|
||||
epoch1_irq_mask = rsrc_data->reg_data->epoch_line_cfg & 0xFFFF;
|
||||
computed_epoch_line_cfg = (epoch0_irq_mask << 16) | epoch1_irq_mask;
|
||||
cam_io_w_mb(computed_epoch_line_cfg,
|
||||
rsrc_data->mem_base + rsrc_data->fe_reg->epoch_irq);
|
||||
CAM_DBG(CAM_ISP, "first_line:0x%x last_line:0x%x epoch_line_cfg: 0x%x",
|
||||
CAM_DBG(CAM_ISP,
|
||||
"first_line:0x%x last_line:0x%x vbi:0x%x epoch_line_cfg: 0x%x",
|
||||
rsrc_data->first_line, rsrc_data->last_line,
|
||||
computed_epoch_line_cfg);
|
||||
rsrc_data->vbi_value, computed_epoch_line_cfg);
|
||||
|
||||
fe_res->res_state = CAM_ISP_RESOURCE_STATE_STREAMING;
|
||||
|
||||
@@ -446,6 +453,23 @@ static int cam_vfe_fe_sof_irq_debug(
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cam_vfe_fe_blanking_update(
|
||||
struct cam_isp_resource_node *rsrc_node, void *cmd_args)
|
||||
{
|
||||
struct cam_vfe_mux_fe_data *fe_priv =
|
||||
(struct cam_vfe_mux_fe_data *)rsrc_node->res_priv;
|
||||
|
||||
struct cam_isp_blanking_config *blanking_config =
|
||||
(struct cam_isp_blanking_config *)cmd_args;
|
||||
|
||||
fe_priv->hbi_value = blanking_config->hbi;
|
||||
fe_priv->vbi_value = blanking_config->vbi;
|
||||
CAM_DBG(CAM_ISP, "hbi:%d vbi:%d",
|
||||
fe_priv->hbi_value, fe_priv->vbi_value);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cam_vfe_fe_process_cmd(struct cam_isp_resource_node *rsrc_node,
|
||||
uint32_t cmd_type, void *cmd_args, uint32_t arg_size)
|
||||
{
|
||||
@@ -467,6 +491,9 @@ static int cam_vfe_fe_process_cmd(struct cam_isp_resource_node *rsrc_node,
|
||||
case CAM_ISP_HW_CMD_FE_UPDATE_IN_RD:
|
||||
rc = cam_vfe_fe_update(rsrc_node, cmd_args, arg_size);
|
||||
break;
|
||||
case CAM_ISP_HW_CMD_BLANKING_UPDATE:
|
||||
rc = cam_vfe_fe_blanking_update(rsrc_node, cmd_args);
|
||||
break;
|
||||
default:
|
||||
CAM_ERR(CAM_ISP,
|
||||
"unsupported process command:%d", cmd_type);
|
||||
|
@@ -169,6 +169,31 @@ static int cam_vfe_top_clock_update(
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int cam_vfe_top_blanking_update(uint32_t cmd_type,
|
||||
void *cmd_args, uint32_t arg_size)
|
||||
{
|
||||
struct cam_isp_blanking_config *blanking_config = NULL;
|
||||
struct cam_isp_resource_node *node_res = NULL;
|
||||
|
||||
blanking_config =
|
||||
(struct cam_isp_blanking_config *)cmd_args;
|
||||
node_res = blanking_config->node_res;
|
||||
|
||||
if (!node_res) {
|
||||
CAM_ERR(CAM_PERF, "Invalid input res %pK", node_res);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!node_res->process_cmd) {
|
||||
CAM_ERR(CAM_PERF, "Invalid input res process_cmd %pK",
|
||||
node_res->process_cmd);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return node_res->process_cmd(node_res,
|
||||
cmd_type, cmd_args, arg_size);
|
||||
}
|
||||
|
||||
static int cam_vfe_top_mux_get_reg_update(
|
||||
struct cam_vfe_top_ver2_priv *top_priv,
|
||||
void *cmd_args, uint32_t arg_size)
|
||||
@@ -795,6 +820,9 @@ int cam_vfe_top_process_cmd(void *device_priv, uint32_t cmd_type,
|
||||
case CAM_ISP_HW_CMD_ADD_WAIT_TRIGGER:
|
||||
rc = cam_vfe_top_add_wait_trigger(top_priv, cmd_args, arg_size);
|
||||
break;
|
||||
case CAM_ISP_HW_CMD_BLANKING_UPDATE:
|
||||
rc = cam_vfe_top_blanking_update(cmd_type, cmd_args, arg_size);
|
||||
break;
|
||||
default:
|
||||
rc = -EINVAL;
|
||||
CAM_ERR(CAM_ISP, "Error! Invalid cmd:%d", cmd_type);
|
||||
|
@@ -189,6 +189,31 @@ static int cam_vfe_top_ver3_clock_update(
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int cam_vfe_top_ver3_blanking_update(uint32_t cmd_type,
|
||||
void *cmd_args, uint32_t arg_size)
|
||||
{
|
||||
struct cam_isp_blanking_config *blanking_config = NULL;
|
||||
struct cam_isp_resource_node *node_res = NULL;
|
||||
|
||||
blanking_config =
|
||||
(struct cam_isp_blanking_config *)cmd_args;
|
||||
node_res = blanking_config->node_res;
|
||||
|
||||
if (!node_res) {
|
||||
CAM_ERR(CAM_PERF, "Invalid input res %pK", node_res);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!node_res->process_cmd) {
|
||||
CAM_ERR(CAM_PERF, "Invalid input res process_cmd %pK",
|
||||
node_res->process_cmd);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return node_res->process_cmd(node_res,
|
||||
cmd_type, cmd_args, arg_size);
|
||||
}
|
||||
|
||||
static int cam_vfe_core_config_control(
|
||||
struct cam_vfe_top_ver3_priv *top_priv,
|
||||
void *cmd_args, uint32_t arg_size)
|
||||
@@ -727,6 +752,10 @@ int cam_vfe_top_ver3_process_cmd(void *device_priv, uint32_t cmd_type,
|
||||
case CAM_ISP_HW_CMD_ADD_WAIT_TRIGGER:
|
||||
rc = cam_vfe_top_add_wait_trigger(top_priv, cmd_args, arg_size);
|
||||
break;
|
||||
case CAM_ISP_HW_CMD_BLANKING_UPDATE:
|
||||
rc = cam_vfe_top_ver3_blanking_update(cmd_type,
|
||||
cmd_args, arg_size);
|
||||
break;
|
||||
default:
|
||||
rc = -EINVAL;
|
||||
CAM_ERR(CAM_ISP, "Error, Invalid cmd:%d", cmd_type);
|
||||
|
@@ -107,6 +107,7 @@
|
||||
#define CAM_ISP_GENERIC_BLOB_TYPE_CSID_CONFIG 10
|
||||
#define CAM_ISP_GENERIC_BLOB_TYPE_SENSOR_DIMENSION_CONFIG 11
|
||||
#define CAM_ISP_GENERIC_BLOB_TYPE_CSID_QCFA_CONFIG 12
|
||||
#define CAM_ISP_GENERIC_BLOB_TYPE_SENSOR_BLANKING_CONFIG 13
|
||||
|
||||
#define CAM_ISP_VC_DT_CFG 4
|
||||
|
||||
@@ -616,6 +617,17 @@ struct cam_isp_sensor_dimension {
|
||||
__u32 measure_enabled;
|
||||
} __attribute__((packed));
|
||||
|
||||
/**
|
||||
* struct cam_isp_sensor_blanking_config
|
||||
*
|
||||
* @hbi HBI value
|
||||
* @vbi VBI value
|
||||
*/
|
||||
struct cam_isp_sensor_blanking_config {
|
||||
__u32 hbi;
|
||||
__u32 vbi;
|
||||
} __attribute__((packed));
|
||||
|
||||
/**
|
||||
* struct cam_isp_sensor_config - Sensor Dimension configuration
|
||||
*
|
||||
|
Yeni konuda referans
Bir kullanıcı engelle