msm: camera: isp: Move clock voting to common vfe top
Currently, clock update function is same between different vfe top versions. Move clock voting functions to common top to avoid duplication. CRs-Fixed: 2841729 Change-Id: I2504632a260ea18f8b5e38e65395db95375588bb Signed-off-by: Mukund Madhusudan Atre <matre@codeaurora.org>
Šī revīzija ir iekļauta:

revīziju iesūtīja
Gerrit - the friendly Code Review server

vecāks
a9c89d1f41
revīzija
98b269d0b0
@@ -6,6 +6,113 @@
|
||||
#include "cam_vfe_top_common.h"
|
||||
#include "cam_debug_util.h"
|
||||
|
||||
int cam_vfe_top_set_hw_clk_rate(
|
||||
struct cam_vfe_top_priv_common *top_common)
|
||||
{
|
||||
struct cam_hw_soc_info *soc_info = NULL;
|
||||
struct cam_vfe_soc_private *soc_private = NULL;
|
||||
struct cam_ahb_vote ahb_vote;
|
||||
int i, rc = 0, clk_lvl = -1;
|
||||
unsigned long max_clk_rate = 0;
|
||||
|
||||
soc_info = top_common->soc_info;
|
||||
soc_private = (struct cam_vfe_soc_private *)soc_info->soc_private;
|
||||
|
||||
for (i = 0; i < top_common->num_mux; i++) {
|
||||
if (top_common->req_clk_rate[i] > max_clk_rate)
|
||||
max_clk_rate = top_common->req_clk_rate[i];
|
||||
}
|
||||
|
||||
if (max_clk_rate == top_common->hw_clk_rate) {
|
||||
CAM_DBG(CAM_ISP, "VFE:%d Clock Unchanged %llu",
|
||||
top_common->hw_idx, top_common->hw_clk_rate);
|
||||
return 0;
|
||||
}
|
||||
|
||||
CAM_DBG(CAM_PERF, "VFE:%d Clock name=%s idx=%d clk=%llu",
|
||||
top_common->hw_idx,
|
||||
soc_info->clk_name[soc_info->src_clk_idx],
|
||||
soc_info->src_clk_idx, max_clk_rate);
|
||||
|
||||
rc = cam_soc_util_set_src_clk_rate(soc_info, max_clk_rate);
|
||||
|
||||
if (!rc) {
|
||||
soc_private->ife_clk_src = max_clk_rate;
|
||||
|
||||
top_common->hw_clk_rate = max_clk_rate;
|
||||
rc = cam_soc_util_get_clk_level(soc_info, max_clk_rate,
|
||||
soc_info->src_clk_idx, &clk_lvl);
|
||||
if (rc) {
|
||||
CAM_WARN(CAM_ISP,
|
||||
"Failed to get clk level for %s with clk_rate %llu src_idx %d rc %d",
|
||||
soc_info->dev_name, max_clk_rate,
|
||||
soc_info->src_clk_idx, rc);
|
||||
rc = 0;
|
||||
goto end;
|
||||
}
|
||||
|
||||
ahb_vote.type = CAM_VOTE_ABSOLUTE;
|
||||
ahb_vote.vote.level = clk_lvl;
|
||||
cam_cpas_update_ahb_vote(soc_private->cpas_handle, &ahb_vote);
|
||||
} else {
|
||||
CAM_ERR(CAM_PERF, "VFE:%d Set Clock rate failed, rc=%d",
|
||||
top_common->hw_idx, rc);
|
||||
}
|
||||
|
||||
end:
|
||||
return rc;
|
||||
}
|
||||
|
||||
int cam_vfe_top_clock_update(struct cam_vfe_top_priv_common *top_common,
|
||||
void *cmd_args, uint32_t arg_size)
|
||||
{
|
||||
struct cam_vfe_clock_update_args *clk_update = NULL;
|
||||
struct cam_isp_resource_node *res = NULL;
|
||||
struct cam_hw_info *hw_info = NULL;
|
||||
int i, rc = 0;
|
||||
|
||||
clk_update =
|
||||
(struct cam_vfe_clock_update_args *)cmd_args;
|
||||
res = clk_update->node_res;
|
||||
|
||||
if (!res || !res->hw_intf->hw_priv) {
|
||||
CAM_ERR(CAM_PERF, "Invalid input res %pK", res);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
hw_info = res->hw_intf->hw_priv;
|
||||
|
||||
if (res->res_type != CAM_ISP_RESOURCE_VFE_IN ||
|
||||
res->res_id >= CAM_ISP_HW_VFE_IN_MAX) {
|
||||
CAM_ERR(CAM_PERF, "VFE:%d Invalid res_type:%d res id%d",
|
||||
res->hw_intf->hw_idx, res->res_type,
|
||||
res->res_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
for (i = 0; i < top_common->num_mux; i++) {
|
||||
if (top_common->mux_rsrc[i].res_id == res->res_id) {
|
||||
top_common->req_clk_rate[i] = clk_update->clk_rate;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (hw_info->hw_state != CAM_HW_STATE_POWER_UP) {
|
||||
CAM_DBG(CAM_PERF,
|
||||
"VFE:%d Not ready to set clocks yet :%d",
|
||||
res->hw_intf->hw_idx,
|
||||
hw_info->hw_state);
|
||||
} else {
|
||||
rc = cam_vfe_top_set_hw_clk_rate(top_common);
|
||||
if (rc)
|
||||
CAM_ERR(CAM_PERF,
|
||||
"VFE:%d Failed in setting clock rate rc=%d",
|
||||
top_common->hw_idx, rc);
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static struct cam_axi_vote *cam_vfe_top_delay_bw_reduction(
|
||||
struct cam_vfe_top_priv_common *top_common,
|
||||
uint64_t *to_be_applied_bw)
|
||||
|
@@ -29,6 +29,10 @@ struct cam_vfe_top_priv_common {
|
||||
uint64_t total_bw_applied;
|
||||
uint32_t hw_version;
|
||||
enum cam_vfe_bw_control_action axi_vote_control[CAM_VFE_TOP_MUX_MAX];
|
||||
struct cam_hw_soc_info *soc_info;
|
||||
unsigned long hw_clk_rate;
|
||||
unsigned long req_clk_rate[CAM_VFE_TOP_MUX_MAX];
|
||||
|
||||
};
|
||||
|
||||
struct cam_vfe_top_reg_dump_entry {
|
||||
@@ -55,6 +59,12 @@ struct cam_vfe_top_dump_data {
|
||||
lut_entry[CAM_VFE_TOP_MAX_LUT_DUMP_ENTRIES];
|
||||
};
|
||||
|
||||
int cam_vfe_top_set_hw_clk_rate(
|
||||
struct cam_vfe_top_priv_common *top_common);
|
||||
|
||||
int cam_vfe_top_clock_update(struct cam_vfe_top_priv_common *top_common,
|
||||
void *cmd_args, uint32_t arg_size);
|
||||
|
||||
int cam_vfe_top_set_axi_bw_vote(struct cam_vfe_soc_private *soc_private,
|
||||
struct cam_vfe_top_priv_common *top_common, bool start_stop);
|
||||
|
||||
|
@@ -16,7 +16,6 @@
|
||||
#define CAM_VFE_HW_RESET_HW_VAL 0x00003F87
|
||||
|
||||
struct cam_vfe_top_ver2_common_data {
|
||||
struct cam_hw_soc_info *soc_info;
|
||||
struct cam_hw_intf *hw_intf;
|
||||
struct cam_vfe_top_ver2_reg_offset_common *common_reg;
|
||||
struct cam_vfe_top_dump_data *dump_data;
|
||||
@@ -24,9 +23,6 @@ struct cam_vfe_top_ver2_common_data {
|
||||
|
||||
struct cam_vfe_top_ver2_priv {
|
||||
struct cam_vfe_top_ver2_common_data common_data;
|
||||
unsigned long hw_clk_rate;
|
||||
unsigned long req_clk_rate[
|
||||
CAM_VFE_TOP_MUX_MAX];
|
||||
struct cam_vfe_top_priv_common top_common;
|
||||
};
|
||||
|
||||
@@ -44,7 +40,7 @@ static int cam_vfe_top_mux_get_base(struct cam_vfe_top_ver2_priv *top_priv,
|
||||
}
|
||||
|
||||
if (!cdm_args || !cdm_args->res || !top_priv ||
|
||||
!top_priv->common_data.soc_info) {
|
||||
!top_priv->top_common.soc_info) {
|
||||
CAM_ERR(CAM_ISP, "Error! Invalid args");
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -66,9 +62,9 @@ static int cam_vfe_top_mux_get_base(struct cam_vfe_top_ver2_priv *top_priv,
|
||||
}
|
||||
|
||||
mem_base = CAM_SOC_GET_REG_MAP_CAM_BASE(
|
||||
top_priv->common_data.soc_info, VFE_CORE_BASE_IDX);
|
||||
top_priv->top_common.soc_info, VFE_CORE_BASE_IDX);
|
||||
CAM_DBG(CAM_ISP, "core %d mem_base 0x%x",
|
||||
top_priv->common_data.soc_info->index, mem_base);
|
||||
top_priv->top_common.soc_info->index, mem_base);
|
||||
|
||||
cdm_util_ops->cdm_write_changebase(
|
||||
cdm_args->cmd.cmd_buf_addr, mem_base);
|
||||
@@ -77,39 +73,6 @@ static int cam_vfe_top_mux_get_base(struct cam_vfe_top_ver2_priv *top_priv,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cam_vfe_top_set_hw_clk_rate(
|
||||
struct cam_vfe_top_ver2_priv *top_priv)
|
||||
{
|
||||
struct cam_hw_soc_info *soc_info = NULL;
|
||||
int i, rc = 0;
|
||||
unsigned long max_clk_rate = 0;
|
||||
struct cam_vfe_soc_private *soc_private = NULL;
|
||||
|
||||
soc_info = top_priv->common_data.soc_info;
|
||||
soc_private =
|
||||
(struct cam_vfe_soc_private *)soc_info->soc_private;
|
||||
|
||||
for (i = 0; i < top_priv->top_common.num_mux; i++) {
|
||||
if (top_priv->req_clk_rate[i] > max_clk_rate)
|
||||
max_clk_rate = top_priv->req_clk_rate[i];
|
||||
}
|
||||
if (max_clk_rate == top_priv->hw_clk_rate)
|
||||
return 0;
|
||||
|
||||
CAM_DBG(CAM_PERF, "VFE: Clock name=%s idx=%d clk=%llu",
|
||||
soc_info->clk_name[soc_info->src_clk_idx],
|
||||
soc_info->src_clk_idx, max_clk_rate);
|
||||
soc_private->ife_clk_src = max_clk_rate;
|
||||
rc = cam_soc_util_set_src_clk_rate(soc_info, max_clk_rate);
|
||||
|
||||
if (!rc)
|
||||
top_priv->hw_clk_rate = max_clk_rate;
|
||||
else
|
||||
CAM_ERR(CAM_PERF, "Set Clock rate failed, rc=%d", rc);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int cam_vfe_top_fs_update(
|
||||
struct cam_vfe_top_ver2_priv *top_priv,
|
||||
void *cmd_args, uint32_t arg_size)
|
||||
@@ -123,56 +86,10 @@ static int cam_vfe_top_fs_update(
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cam_vfe_top_clock_update(
|
||||
struct cam_vfe_top_ver2_priv *top_priv,
|
||||
void *cmd_args, uint32_t arg_size)
|
||||
{
|
||||
struct cam_vfe_clock_update_args *clk_update = NULL;
|
||||
struct cam_isp_resource_node *res = NULL;
|
||||
struct cam_hw_info *hw_info = NULL;
|
||||
int i, rc = 0;
|
||||
|
||||
clk_update =
|
||||
(struct cam_vfe_clock_update_args *)cmd_args;
|
||||
res = clk_update->node_res;
|
||||
|
||||
if (!res || !res->hw_intf->hw_priv) {
|
||||
CAM_ERR(CAM_PERF, "Invalid input res %pK", res);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
hw_info = res->hw_intf->hw_priv;
|
||||
|
||||
if (res->res_type != CAM_ISP_RESOURCE_VFE_IN ||
|
||||
res->res_id >= CAM_ISP_HW_VFE_IN_MAX) {
|
||||
CAM_ERR(CAM_PERF, "VFE:%d Invalid res_type:%d res id%d",
|
||||
res->hw_intf->hw_idx, res->res_type,
|
||||
res->res_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
for (i = 0; i < top_priv->top_common.num_mux; i++) {
|
||||
if (top_priv->top_common.mux_rsrc[i].res_id == res->res_id) {
|
||||
top_priv->req_clk_rate[i] = clk_update->clk_rate;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (hw_info->hw_state != CAM_HW_STATE_POWER_UP) {
|
||||
CAM_DBG(CAM_PERF,
|
||||
"VFE:%d Not ready to set clocks yet :%d",
|
||||
res->hw_intf->hw_idx,
|
||||
hw_info->hw_state);
|
||||
} else
|
||||
rc = cam_vfe_top_set_hw_clk_rate(top_priv);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int cam_vfe_top_dump_info(
|
||||
struct cam_vfe_top_ver2_priv *top_priv, uint32_t cmd_type)
|
||||
{
|
||||
struct cam_hw_soc_info *soc_info = top_priv->common_data.soc_info;
|
||||
struct cam_hw_soc_info *soc_info = top_priv->top_common.soc_info;
|
||||
|
||||
if (!soc_info) {
|
||||
CAM_ERR(CAM_ISP, "Null soc_info");
|
||||
@@ -243,7 +160,7 @@ static int cam_vfe_top_wait_comp_event(struct cam_vfe_top_ver2_priv *top_priv,
|
||||
}
|
||||
|
||||
if (!cdm_args || !cdm_args->res || !top_priv ||
|
||||
!top_priv->common_data.soc_info) {
|
||||
!top_priv->top_common.soc_info) {
|
||||
CAM_ERR(CAM_ISP, "Error! Invalid args");
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -285,7 +202,7 @@ static int cam_vfe_top_add_wait_trigger(struct cam_vfe_top_ver2_priv *top_priv,
|
||||
}
|
||||
|
||||
if (!cdm_args || !cdm_args->res || !top_priv ||
|
||||
!top_priv->common_data.soc_info) {
|
||||
!top_priv->top_common.soc_info) {
|
||||
CAM_ERR(CAM_ISP, "Error! Invalid args");
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -346,13 +263,13 @@ int cam_vfe_top_get_hw_caps(void *device_priv,
|
||||
vfe_cap_info = (struct cam_vfe_hw_get_hw_cap *)args;
|
||||
vfe_top_prv = (struct cam_vfe_top_ver2_priv *)device_priv;
|
||||
|
||||
if (!vfe_top_prv->common_data.soc_info) {
|
||||
if (!vfe_top_prv->top_common.soc_info) {
|
||||
CAM_ERR(CAM_ISP, "soc_info is null");
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
vfe_soc_private = (struct cam_vfe_soc_private *)
|
||||
vfe_top_prv->common_data.soc_info->soc_private;
|
||||
vfe_top_prv->top_common.soc_info->soc_private;
|
||||
|
||||
vfe_cap_info->is_lite = (vfe_soc_private->is_ife_lite) ? true : false;
|
||||
vfe_cap_info->incr =
|
||||
@@ -405,7 +322,7 @@ static int cam_vfe_hw_dump(
|
||||
return -ENOSPC;
|
||||
}
|
||||
dump_data = top_priv->common_data.dump_data;
|
||||
soc_info = top_priv->common_data.soc_info;
|
||||
soc_info = top_priv->top_common.soc_info;
|
||||
|
||||
/*Dump registers */
|
||||
for (i = 0; i < dump_data->num_reg_dump_entries; i++)
|
||||
@@ -505,10 +422,10 @@ int cam_vfe_top_init_hw(void *device_priv,
|
||||
struct cam_vfe_top_ver2_priv *top_priv = device_priv;
|
||||
struct cam_vfe_top_ver2_common_data common_data = top_priv->common_data;
|
||||
|
||||
top_priv->hw_clk_rate = 0;
|
||||
top_priv->top_common.hw_clk_rate = 0;
|
||||
|
||||
top_priv->top_common.hw_version =
|
||||
cam_io_r_mb(common_data.soc_info->reg_map[0].mem_base +
|
||||
cam_io_r_mb(top_priv->top_common.soc_info->reg_map[0].mem_base +
|
||||
common_data.common_reg->hw_version);
|
||||
|
||||
return 0;
|
||||
@@ -538,7 +455,7 @@ int cam_vfe_top_reset(void *device_priv,
|
||||
}
|
||||
|
||||
CAM_DBG(CAM_ISP, "reset reg value: %x", reset_reg_val);
|
||||
soc_info = top_priv->common_data.soc_info;
|
||||
soc_info = top_priv->top_common.soc_info;
|
||||
reg_common = top_priv->common_data.common_reg;
|
||||
|
||||
/* Mask All the IRQs except RESET */
|
||||
@@ -674,7 +591,7 @@ int cam_vfe_top_start(void *device_priv,
|
||||
}
|
||||
|
||||
top_priv = (struct cam_vfe_top_ver2_priv *)device_priv;
|
||||
soc_info = top_priv->common_data.soc_info;
|
||||
soc_info = top_priv->top_common.soc_info;
|
||||
soc_private = soc_info->soc_private;
|
||||
if (!soc_private) {
|
||||
CAM_ERR(CAM_ISP, "Error soc_private NULL");
|
||||
@@ -685,7 +602,7 @@ int cam_vfe_top_start(void *device_priv,
|
||||
hw_info = (struct cam_hw_info *)mux_res->hw_intf->hw_priv;
|
||||
|
||||
if (hw_info->hw_state == CAM_HW_STATE_POWER_UP) {
|
||||
rc = cam_vfe_top_set_hw_clk_rate(top_priv);
|
||||
rc = cam_vfe_top_set_hw_clk_rate(&top_priv->top_common);
|
||||
if (rc) {
|
||||
CAM_ERR(CAM_ISP,
|
||||
"set_hw_clk_rate failed, rc=%d", rc);
|
||||
@@ -733,7 +650,7 @@ int cam_vfe_top_stop(void *device_priv,
|
||||
top_priv = (struct cam_vfe_top_ver2_priv *)device_priv;
|
||||
mux_res = (struct cam_isp_resource_node *)stop_args;
|
||||
hw_info = (struct cam_hw_info *)mux_res->hw_intf->hw_priv;
|
||||
soc_info = top_priv->common_data.soc_info;
|
||||
soc_info = top_priv->top_common.soc_info;
|
||||
soc_private = soc_info->soc_private;
|
||||
|
||||
if ((mux_res->res_id == CAM_ISP_HW_VFE_IN_CAMIF) ||
|
||||
@@ -751,8 +668,7 @@ int cam_vfe_top_stop(void *device_priv,
|
||||
for (i = 0; i < top_priv->top_common.num_mux; i++) {
|
||||
if (top_priv->top_common.mux_rsrc[i].res_id ==
|
||||
mux_res->res_id) {
|
||||
top_priv->req_clk_rate[i] = 0;
|
||||
top_priv->req_clk_rate[i] = 0;
|
||||
top_priv->top_common.req_clk_rate[i] = 0;
|
||||
top_priv->top_common.req_axi_vote[i]
|
||||
.axi_path[0].camnoc_bw = 0;
|
||||
top_priv->top_common.req_axi_vote[i]
|
||||
@@ -794,7 +710,7 @@ int cam_vfe_top_process_cmd(void *device_priv, uint32_t cmd_type,
|
||||
return -EINVAL;
|
||||
}
|
||||
top_priv = (struct cam_vfe_top_ver2_priv *)device_priv;
|
||||
soc_info = top_priv->common_data.soc_info;
|
||||
soc_info = top_priv->top_common.soc_info;
|
||||
soc_private = soc_info->soc_private;
|
||||
if (!soc_private) {
|
||||
CAM_ERR(CAM_ISP, "Error soc_private NULL");
|
||||
@@ -814,7 +730,7 @@ int cam_vfe_top_process_cmd(void *device_priv, uint32_t cmd_type,
|
||||
arg_size);
|
||||
break;
|
||||
case CAM_ISP_HW_CMD_CLOCK_UPDATE:
|
||||
rc = cam_vfe_top_clock_update(top_priv, cmd_args,
|
||||
rc = cam_vfe_top_clock_update(&top_priv->top_common, cmd_args,
|
||||
arg_size);
|
||||
break;
|
||||
case CAM_ISP_HW_NOTIFY_OVERFLOW:
|
||||
@@ -886,7 +802,7 @@ int cam_vfe_top_ver2_init(
|
||||
}
|
||||
|
||||
vfe_top->top_priv = top_priv;
|
||||
top_priv->hw_clk_rate = 0;
|
||||
top_priv->top_common.hw_clk_rate = 0;
|
||||
if (ver2_hw_info->num_mux > CAM_VFE_TOP_MUX_MAX) {
|
||||
CAM_ERR(CAM_ISP, "Invalid number of input rsrc: %d, max: %d",
|
||||
ver2_hw_info->num_mux, CAM_VFE_TOP_MUX_MAX);
|
||||
@@ -902,7 +818,7 @@ int cam_vfe_top_ver2_init(
|
||||
top_priv->top_common.mux_rsrc[i].hw_intf = hw_intf;
|
||||
top_priv->top_common.mux_rsrc[i].res_state =
|
||||
CAM_ISP_RESOURCE_STATE_AVAILABLE;
|
||||
top_priv->req_clk_rate[i] = 0;
|
||||
top_priv->top_common.req_clk_rate[i] = 0;
|
||||
|
||||
if (ver2_hw_info->mux_type[i] == CAM_VFE_CAMIF_VER_2_0) {
|
||||
top_priv->top_common.mux_rsrc[i].res_id =
|
||||
@@ -967,7 +883,7 @@ int cam_vfe_top_ver2_init(
|
||||
vfe_top->hw_ops.process_cmd = cam_vfe_top_process_cmd;
|
||||
*vfe_top_ptr = vfe_top;
|
||||
|
||||
top_priv->common_data.soc_info = soc_info;
|
||||
top_priv->top_common.soc_info = soc_info;
|
||||
top_priv->common_data.hw_intf = hw_intf;
|
||||
top_priv->top_common.hw_idx = hw_intf->hw_idx;
|
||||
top_priv->common_data.common_reg = ver2_hw_info->common_reg;
|
||||
|
@@ -20,16 +20,12 @@
|
||||
|
||||
struct cam_vfe_top_ver3_common_data {
|
||||
struct cam_vfe_top_ver3_hw_info *hw_info;
|
||||
struct cam_hw_soc_info *soc_info;
|
||||
struct cam_hw_intf *hw_intf;
|
||||
struct cam_vfe_top_ver3_reg_offset_common *common_reg;
|
||||
};
|
||||
|
||||
struct cam_vfe_top_ver3_priv {
|
||||
struct cam_vfe_top_ver3_common_data common_data;
|
||||
unsigned long hw_clk_rate;
|
||||
unsigned long req_clk_rate[
|
||||
CAM_VFE_TOP_MUX_MAX];
|
||||
struct cam_vfe_top_priv_common top_common;
|
||||
};
|
||||
|
||||
@@ -63,7 +59,7 @@ static int cam_vfe_top_ver3_mux_get_base(struct cam_vfe_top_ver3_priv *top_priv,
|
||||
}
|
||||
|
||||
if (!cdm_args || !cdm_args->res || !top_priv ||
|
||||
!top_priv->common_data.soc_info) {
|
||||
!top_priv->top_common.soc_info) {
|
||||
CAM_ERR(CAM_ISP, "Error, Invalid args");
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -85,9 +81,9 @@ static int cam_vfe_top_ver3_mux_get_base(struct cam_vfe_top_ver3_priv *top_priv,
|
||||
}
|
||||
|
||||
mem_base = CAM_SOC_GET_REG_MAP_CAM_BASE(
|
||||
top_priv->common_data.soc_info, VFE_CORE_BASE_IDX);
|
||||
top_priv->top_common.soc_info, VFE_CORE_BASE_IDX);
|
||||
CAM_DBG(CAM_ISP, "core %d mem_base 0x%x",
|
||||
top_priv->common_data.soc_info->index, mem_base);
|
||||
top_priv->top_common.soc_info->index, mem_base);
|
||||
|
||||
cdm_util_ops->cdm_write_changebase(
|
||||
cdm_args->cmd.cmd_buf_addr, mem_base);
|
||||
@@ -96,58 +92,6 @@ static int cam_vfe_top_ver3_mux_get_base(struct cam_vfe_top_ver3_priv *top_priv,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cam_vfe_top_ver3_set_hw_clk_rate(
|
||||
struct cam_vfe_top_ver3_priv *top_priv)
|
||||
{
|
||||
struct cam_hw_soc_info *soc_info = NULL;
|
||||
struct cam_vfe_soc_private *soc_private = NULL;
|
||||
struct cam_ahb_vote ahb_vote;
|
||||
int i, rc = 0, clk_lvl = -1;
|
||||
unsigned long max_clk_rate = 0;
|
||||
|
||||
soc_info = top_priv->common_data.soc_info;
|
||||
soc_private =
|
||||
(struct cam_vfe_soc_private *)soc_info->soc_private;
|
||||
|
||||
for (i = 0; i < top_priv->top_common.num_mux; i++) {
|
||||
if (top_priv->req_clk_rate[i] > max_clk_rate)
|
||||
max_clk_rate = top_priv->req_clk_rate[i];
|
||||
}
|
||||
if (max_clk_rate == top_priv->hw_clk_rate)
|
||||
return 0;
|
||||
|
||||
CAM_DBG(CAM_PERF, "VFE: Clock name=%s idx=%d clk=%llu",
|
||||
soc_info->clk_name[soc_info->src_clk_idx],
|
||||
soc_info->src_clk_idx, max_clk_rate);
|
||||
|
||||
rc = cam_soc_util_set_src_clk_rate(soc_info, max_clk_rate);
|
||||
|
||||
if (!rc) {
|
||||
soc_private->ife_clk_src = max_clk_rate;
|
||||
|
||||
top_priv->hw_clk_rate = max_clk_rate;
|
||||
rc = cam_soc_util_get_clk_level(soc_info, max_clk_rate,
|
||||
soc_info->src_clk_idx, &clk_lvl);
|
||||
if (rc) {
|
||||
CAM_WARN(CAM_ISP,
|
||||
"Failed to get clk level for %s with clk_rate %llu src_idx %d rc %d",
|
||||
soc_info->dev_name, max_clk_rate,
|
||||
soc_info->src_clk_idx, rc);
|
||||
rc = 0;
|
||||
goto end;
|
||||
}
|
||||
|
||||
ahb_vote.type = CAM_VOTE_ABSOLUTE;
|
||||
ahb_vote.vote.level = clk_lvl;
|
||||
cam_cpas_update_ahb_vote(soc_private->cpas_handle, &ahb_vote);
|
||||
} else {
|
||||
CAM_ERR(CAM_PERF, "Set Clock rate failed, rc=%d", rc);
|
||||
}
|
||||
|
||||
end:
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int cam_vfe_top_fs_update(
|
||||
struct cam_vfe_top_ver3_priv *top_priv,
|
||||
void *cmd_args, uint32_t arg_size)
|
||||
@@ -161,56 +105,10 @@ static int cam_vfe_top_fs_update(
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cam_vfe_top_ver3_clock_update(
|
||||
struct cam_vfe_top_ver3_priv *top_priv,
|
||||
void *cmd_args, uint32_t arg_size)
|
||||
{
|
||||
struct cam_vfe_clock_update_args *clk_update = NULL;
|
||||
struct cam_isp_resource_node *res = NULL;
|
||||
struct cam_hw_info *hw_info = NULL;
|
||||
int i, rc = 0;
|
||||
|
||||
clk_update =
|
||||
(struct cam_vfe_clock_update_args *)cmd_args;
|
||||
res = clk_update->node_res;
|
||||
|
||||
if (!res || !res->hw_intf->hw_priv) {
|
||||
CAM_ERR(CAM_PERF, "Invalid input res %pK", res);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
hw_info = res->hw_intf->hw_priv;
|
||||
|
||||
if (res->res_type != CAM_ISP_RESOURCE_VFE_IN ||
|
||||
res->res_id >= CAM_ISP_HW_VFE_IN_MAX) {
|
||||
CAM_ERR(CAM_PERF, "VFE:%d Invalid res_type:%d res id%d",
|
||||
res->hw_intf->hw_idx, res->res_type,
|
||||
res->res_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
for (i = 0; i < top_priv->top_common.num_mux; i++) {
|
||||
if (top_priv->top_common.mux_rsrc[i].res_id == res->res_id) {
|
||||
top_priv->req_clk_rate[i] = clk_update->clk_rate;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (hw_info->hw_state != CAM_HW_STATE_POWER_UP) {
|
||||
CAM_DBG(CAM_PERF,
|
||||
"VFE:%d Not ready to set clocks yet :%d",
|
||||
res->hw_intf->hw_idx,
|
||||
hw_info->hw_state);
|
||||
} else
|
||||
rc = cam_vfe_top_ver3_set_hw_clk_rate(top_priv);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int cam_vfe_top_ver3_dump_info(
|
||||
struct cam_vfe_top_ver3_priv *top_priv, uint32_t cmd_type)
|
||||
{
|
||||
struct cam_hw_soc_info *soc_info = top_priv->common_data.soc_info;
|
||||
struct cam_hw_soc_info *soc_info = top_priv->top_common.soc_info;
|
||||
|
||||
if (!soc_info) {
|
||||
CAM_ERR(CAM_ISP, "Null soc_info");
|
||||
@@ -296,7 +194,7 @@ static int cam_vfe_top_wait_comp_event(struct cam_vfe_top_ver3_priv *top_priv,
|
||||
}
|
||||
|
||||
if (!cdm_args || !cdm_args->res || !top_priv ||
|
||||
!top_priv->common_data.soc_info) {
|
||||
!top_priv->top_common.soc_info) {
|
||||
CAM_ERR(CAM_ISP, "Error, Invalid args");
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -341,7 +239,7 @@ static int cam_vfe_top_add_wait_trigger(struct cam_vfe_top_ver3_priv *top_priv,
|
||||
}
|
||||
|
||||
if (!cdm_args || !cdm_args->res || !top_priv ||
|
||||
!top_priv->common_data.soc_info) {
|
||||
!top_priv->top_common.soc_info) {
|
||||
CAM_ERR(CAM_ISP, "Error, Invalid args");
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -408,13 +306,13 @@ int cam_vfe_top_ver3_get_hw_caps(void *device_priv,
|
||||
vfe_cap_info = (struct cam_vfe_hw_get_hw_cap *)args;
|
||||
vfe_top_prv = (struct cam_vfe_top_ver3_priv *)device_priv;
|
||||
|
||||
if (!vfe_top_prv->common_data.soc_info) {
|
||||
if (!vfe_top_prv->top_common.soc_info) {
|
||||
CAM_ERR(CAM_ISP, "soc_info is null");
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
vfe_soc_private = (struct cam_vfe_soc_private *)
|
||||
vfe_top_prv->common_data.soc_info->soc_private;
|
||||
vfe_top_prv->top_common.soc_info->soc_private;
|
||||
|
||||
vfe_cap_info->is_lite = (vfe_soc_private->is_ife_lite) ? true : false;
|
||||
vfe_cap_info->incr =
|
||||
@@ -433,7 +331,7 @@ int cam_vfe_top_ver3_init_hw(void *device_priv,
|
||||
struct cam_vfe_top_ver3_priv *top_priv = device_priv;
|
||||
struct cam_vfe_top_ver3_common_data common_data = top_priv->common_data;
|
||||
|
||||
top_priv->hw_clk_rate = 0;
|
||||
top_priv->top_common.hw_clk_rate = 0;
|
||||
|
||||
/**
|
||||
* Auto clock gating is enabled by default, but no harm
|
||||
@@ -441,20 +339,20 @@ int cam_vfe_top_ver3_init_hw(void *device_priv,
|
||||
*/
|
||||
CAM_DBG(CAM_ISP, "Enabling clock gating at IFE top");
|
||||
|
||||
cam_soc_util_w_mb(common_data.soc_info, VFE_CORE_BASE_IDX,
|
||||
cam_soc_util_w_mb(top_priv->top_common.soc_info, VFE_CORE_BASE_IDX,
|
||||
common_data.common_reg->core_cgc_ovd_0, 0x0);
|
||||
|
||||
cam_soc_util_w_mb(common_data.soc_info, VFE_CORE_BASE_IDX,
|
||||
cam_soc_util_w_mb(top_priv->top_common.soc_info, VFE_CORE_BASE_IDX,
|
||||
common_data.common_reg->core_cgc_ovd_1, 0x0);
|
||||
|
||||
cam_soc_util_w_mb(common_data.soc_info, VFE_CORE_BASE_IDX,
|
||||
cam_soc_util_w_mb(top_priv->top_common.soc_info, VFE_CORE_BASE_IDX,
|
||||
common_data.common_reg->ahb_cgc_ovd, 0x0);
|
||||
|
||||
cam_soc_util_w_mb(common_data.soc_info, VFE_CORE_BASE_IDX,
|
||||
cam_soc_util_w_mb(top_priv->top_common.soc_info, VFE_CORE_BASE_IDX,
|
||||
common_data.common_reg->noc_cgc_ovd, 0x0);
|
||||
|
||||
top_priv->top_common.hw_version =
|
||||
cam_io_r_mb(common_data.soc_info->reg_map[0].mem_base +
|
||||
cam_io_r_mb(top_priv->top_common.soc_info->reg_map[0].mem_base +
|
||||
common_data.common_reg->hw_version);
|
||||
|
||||
return 0;
|
||||
@@ -475,7 +373,7 @@ int cam_vfe_top_ver3_reset(void *device_priv,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
soc_info = top_priv->common_data.soc_info;
|
||||
soc_info = top_priv->top_common.soc_info;
|
||||
reg_common = top_priv->common_data.common_reg;
|
||||
|
||||
soc_private = soc_info->soc_private;
|
||||
@@ -636,7 +534,7 @@ int cam_vfe_top_ver3_start(void *device_priv,
|
||||
}
|
||||
|
||||
top_priv = (struct cam_vfe_top_ver3_priv *)device_priv;
|
||||
soc_info = top_priv->common_data.soc_info;
|
||||
soc_info = top_priv->top_common.soc_info;
|
||||
soc_private = soc_info->soc_private;
|
||||
if (!soc_private) {
|
||||
CAM_ERR(CAM_ISP, "Error soc_private NULL");
|
||||
@@ -647,7 +545,7 @@ int cam_vfe_top_ver3_start(void *device_priv,
|
||||
hw_info = (struct cam_hw_info *)mux_res->hw_intf->hw_priv;
|
||||
|
||||
if (hw_info->hw_state == CAM_HW_STATE_POWER_UP) {
|
||||
rc = cam_vfe_top_ver3_set_hw_clk_rate(top_priv);
|
||||
rc = cam_vfe_top_set_hw_clk_rate(&top_priv->top_common);
|
||||
if (rc) {
|
||||
CAM_ERR(CAM_ISP,
|
||||
"set_hw_clk_rate failed, rc=%d", rc);
|
||||
@@ -695,10 +593,10 @@ int cam_vfe_top_ver3_stop(void *device_priv,
|
||||
top_priv = (struct cam_vfe_top_ver3_priv *)device_priv;
|
||||
mux_res = (struct cam_isp_resource_node *)stop_args;
|
||||
hw_info = (struct cam_hw_info *)mux_res->hw_intf->hw_priv;
|
||||
soc_info = top_priv->common_data.soc_info;
|
||||
soc_info = top_priv->top_common.soc_info;
|
||||
soc_private = soc_info->soc_private;
|
||||
|
||||
soc_info = top_priv->common_data.soc_info;
|
||||
soc_info = top_priv->top_common.soc_info;
|
||||
soc_private = soc_info->soc_private;
|
||||
|
||||
if (mux_res->res_id < CAM_ISP_HW_VFE_IN_MAX) {
|
||||
@@ -712,7 +610,7 @@ int cam_vfe_top_ver3_stop(void *device_priv,
|
||||
for (i = 0; i < top_priv->top_common.num_mux; i++) {
|
||||
if (top_priv->top_common.mux_rsrc[i].res_id ==
|
||||
mux_res->res_id) {
|
||||
top_priv->req_clk_rate[i] = 0;
|
||||
top_priv->top_common.req_clk_rate[i] = 0;
|
||||
memset(&top_priv->top_common.req_axi_vote[i],
|
||||
0, sizeof(struct cam_axi_vote));
|
||||
top_priv->top_common.axi_vote_control[i] =
|
||||
@@ -753,7 +651,7 @@ int cam_vfe_top_ver3_process_cmd(void *device_priv, uint32_t cmd_type,
|
||||
}
|
||||
|
||||
top_priv = (struct cam_vfe_top_ver3_priv *)device_priv;
|
||||
soc_info = top_priv->common_data.soc_info;
|
||||
soc_info = top_priv->top_common.soc_info;
|
||||
soc_private = soc_info->soc_private;
|
||||
if (!soc_private) {
|
||||
CAM_ERR(CAM_ISP, "Error soc_private NULL");
|
||||
@@ -774,7 +672,7 @@ int cam_vfe_top_ver3_process_cmd(void *device_priv, uint32_t cmd_type,
|
||||
arg_size);
|
||||
break;
|
||||
case CAM_ISP_HW_CMD_CLOCK_UPDATE:
|
||||
rc = cam_vfe_top_ver3_clock_update(top_priv, cmd_args,
|
||||
rc = cam_vfe_top_clock_update(&top_priv->top_common, cmd_args,
|
||||
arg_size);
|
||||
break;
|
||||
case CAM_ISP_HW_NOTIFY_OVERFLOW:
|
||||
@@ -850,7 +748,7 @@ int cam_vfe_top_ver3_init(
|
||||
}
|
||||
|
||||
vfe_top->top_priv = top_priv;
|
||||
top_priv->hw_clk_rate = 0;
|
||||
top_priv->top_common.hw_clk_rate = 0;
|
||||
if (ver3_hw_info->num_mux > CAM_VFE_TOP_MUX_MAX) {
|
||||
CAM_ERR(CAM_ISP, "Invalid number of input rsrc: %d, max: %d",
|
||||
ver3_hw_info->num_mux, CAM_VFE_TOP_MUX_MAX);
|
||||
@@ -868,7 +766,7 @@ int cam_vfe_top_ver3_init(
|
||||
top_priv->top_common.mux_rsrc[i].hw_intf = hw_intf;
|
||||
top_priv->top_common.mux_rsrc[i].res_state =
|
||||
CAM_ISP_RESOURCE_STATE_AVAILABLE;
|
||||
top_priv->req_clk_rate[i] = 0;
|
||||
top_priv->top_common.req_clk_rate[i] = 0;
|
||||
|
||||
if (ver3_hw_info->mux_type[i] == CAM_VFE_CAMIF_VER_3_0) {
|
||||
top_priv->top_common.mux_rsrc[i].res_id =
|
||||
@@ -956,7 +854,7 @@ int cam_vfe_top_ver3_init(
|
||||
vfe_top->hw_ops.process_cmd = cam_vfe_top_ver3_process_cmd;
|
||||
*vfe_top_ptr = vfe_top;
|
||||
|
||||
top_priv->common_data.soc_info = soc_info;
|
||||
top_priv->top_common.soc_info = soc_info;
|
||||
top_priv->common_data.hw_intf = hw_intf;
|
||||
top_priv->top_common.hw_idx = hw_intf->hw_idx;
|
||||
top_priv->common_data.common_reg = ver3_hw_info->common_reg;
|
||||
|
@@ -22,7 +22,6 @@
|
||||
#define CAM_VFE_LEN_LOG_BUF 256
|
||||
|
||||
struct cam_vfe_top_ver4_common_data {
|
||||
struct cam_hw_soc_info *soc_info;
|
||||
struct cam_hw_intf *hw_intf;
|
||||
struct cam_vfe_top_ver4_reg_offset_common *common_reg;
|
||||
struct cam_vfe_top_ver4_hw_info *hw_info;
|
||||
@@ -30,9 +29,6 @@ struct cam_vfe_top_ver4_common_data {
|
||||
|
||||
struct cam_vfe_top_ver4_priv {
|
||||
struct cam_vfe_top_ver4_common_data common_data;
|
||||
unsigned long hw_clk_rate;
|
||||
unsigned long req_clk_rate[
|
||||
CAM_VFE_TOP_MUX_MAX];
|
||||
struct cam_vfe_top_priv_common top_common;
|
||||
atomic_t overflow_pending;
|
||||
uint8_t log_buf[CAM_VFE_LEN_LOG_BUF];
|
||||
@@ -701,7 +697,7 @@ static int cam_vfe_top_ver4_mux_get_base(struct cam_vfe_top_ver4_priv *top_priv,
|
||||
}
|
||||
|
||||
if (!cdm_args || !cdm_args->res || !top_priv ||
|
||||
!top_priv->common_data.soc_info) {
|
||||
!top_priv->top_common.soc_info) {
|
||||
CAM_ERR(CAM_ISP, "Error, Invalid args");
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -723,13 +719,13 @@ static int cam_vfe_top_ver4_mux_get_base(struct cam_vfe_top_ver4_priv *top_priv,
|
||||
}
|
||||
|
||||
mem_base = CAM_SOC_GET_REG_MAP_CAM_BASE(
|
||||
top_priv->common_data.soc_info, VFE_CORE_BASE_IDX);
|
||||
top_priv->top_common.soc_info, VFE_CORE_BASE_IDX);
|
||||
if (cdm_args->cdm_id == CAM_CDM_RT)
|
||||
mem_base -= CAM_SOC_GET_REG_MAP_CAM_BASE(
|
||||
top_priv->common_data.soc_info, RT_BASE_IDX);
|
||||
top_priv->top_common.soc_info, RT_BASE_IDX);
|
||||
|
||||
CAM_DBG(CAM_ISP, "core %d mem_base 0x%x, cdm_id: %u",
|
||||
top_priv->common_data.soc_info->index, mem_base,
|
||||
top_priv->top_common.soc_info->index, mem_base,
|
||||
cdm_args->cdm_id);
|
||||
|
||||
cdm_util_ops->cdm_write_changebase(
|
||||
@@ -739,55 +735,6 @@ static int cam_vfe_top_ver4_mux_get_base(struct cam_vfe_top_ver4_priv *top_priv,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cam_vfe_top_ver4_set_hw_clk_rate(
|
||||
struct cam_vfe_top_ver4_priv *top_priv)
|
||||
{
|
||||
struct cam_hw_soc_info *soc_info = NULL;
|
||||
struct cam_vfe_soc_private *soc_private = NULL;
|
||||
struct cam_ahb_vote ahb_vote;
|
||||
int i, rc = 0, clk_lvl = -1;
|
||||
unsigned long max_clk_rate = 0;
|
||||
|
||||
soc_info = top_priv->common_data.soc_info;
|
||||
soc_private =
|
||||
(struct cam_vfe_soc_private *)soc_info->soc_private;
|
||||
|
||||
for (i = 0; i < top_priv->top_common.num_mux; i++) {
|
||||
if (top_priv->req_clk_rate[i] > max_clk_rate)
|
||||
max_clk_rate = top_priv->req_clk_rate[i];
|
||||
}
|
||||
if (max_clk_rate == top_priv->hw_clk_rate)
|
||||
return 0;
|
||||
|
||||
CAM_DBG(CAM_PERF, "VFE: Clock name=%s idx=%d clk=%llu",
|
||||
soc_info->clk_name[soc_info->src_clk_idx],
|
||||
soc_info->src_clk_idx, max_clk_rate);
|
||||
|
||||
rc = cam_soc_util_set_src_clk_rate(soc_info, max_clk_rate);
|
||||
|
||||
if (!rc) {
|
||||
top_priv->hw_clk_rate = max_clk_rate;
|
||||
rc = cam_soc_util_get_clk_level(soc_info, max_clk_rate,
|
||||
soc_info->src_clk_idx, &clk_lvl);
|
||||
if (rc) {
|
||||
CAM_WARN(CAM_ISP,
|
||||
"Failed to get clk level for %s with clk_rate %llu src_idx %d rc %d",
|
||||
soc_info->dev_name, max_clk_rate,
|
||||
soc_info->src_clk_idx, rc);
|
||||
rc = 0;
|
||||
goto end;
|
||||
}
|
||||
ahb_vote.type = CAM_VOTE_ABSOLUTE;
|
||||
ahb_vote.vote.level = clk_lvl;
|
||||
cam_cpas_update_ahb_vote(soc_private->cpas_handle, &ahb_vote);
|
||||
} else {
|
||||
CAM_ERR(CAM_PERF, "Set Clock rate failed, rc=%d", rc);
|
||||
}
|
||||
|
||||
end:
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int cam_vfe_top_fs_update(
|
||||
struct cam_vfe_top_ver4_priv *top_priv,
|
||||
void *cmd_args, uint32_t arg_size)
|
||||
@@ -801,52 +748,6 @@ static int cam_vfe_top_fs_update(
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cam_vfe_top_ver4_clock_update(
|
||||
struct cam_vfe_top_ver4_priv *top_priv,
|
||||
void *cmd_args, uint32_t arg_size)
|
||||
{
|
||||
struct cam_vfe_clock_update_args *clk_update = NULL;
|
||||
struct cam_isp_resource_node *res = NULL;
|
||||
struct cam_hw_info *hw_info = NULL;
|
||||
int i, rc = 0;
|
||||
|
||||
clk_update =
|
||||
(struct cam_vfe_clock_update_args *)cmd_args;
|
||||
res = clk_update->node_res;
|
||||
|
||||
if (!res || !res->hw_intf->hw_priv) {
|
||||
CAM_ERR(CAM_PERF, "Invalid input res %pK", res);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
hw_info = res->hw_intf->hw_priv;
|
||||
|
||||
if (res->res_type != CAM_ISP_RESOURCE_VFE_IN ||
|
||||
res->res_id >= CAM_ISP_HW_VFE_IN_MAX) {
|
||||
CAM_ERR(CAM_PERF, "VFE:%d Invalid res_type:%d res id%d",
|
||||
res->hw_intf->hw_idx, res->res_type,
|
||||
res->res_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
for (i = 0; i < top_priv->top_common.num_mux; i++) {
|
||||
if (top_priv->top_common.mux_rsrc[i].res_id == res->res_id) {
|
||||
top_priv->req_clk_rate[i] = clk_update->clk_rate;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (hw_info->hw_state != CAM_HW_STATE_POWER_UP) {
|
||||
CAM_DBG(CAM_PERF,
|
||||
"VFE:%d Not ready to set clocks yet :%d",
|
||||
res->hw_intf->hw_idx,
|
||||
hw_info->hw_state);
|
||||
} else
|
||||
rc = cam_vfe_top_ver4_set_hw_clk_rate(top_priv);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void cam_vfe_top_ver4_check_module_status(
|
||||
uint32_t num_reg, uint32_t *reg_val,
|
||||
const struct cam_vfe_top_debug_info status_list[][8])
|
||||
@@ -897,7 +798,7 @@ static void cam_vfe_top_ver4_print_debug_reg_status(
|
||||
struct cam_vfe_soc_private *soc_priv;
|
||||
void __iomem *base;
|
||||
|
||||
soc_info = top_priv->common_data.soc_info;
|
||||
soc_info = top_priv->top_common.soc_info;
|
||||
soc_priv = soc_info->soc_private;
|
||||
common_reg = top_priv->common_data.common_reg;
|
||||
num_reg = common_reg->num_top_debug_reg;
|
||||
@@ -1006,7 +907,7 @@ static int cam_vfe_top_ver4_print_overflow_debug_info(
|
||||
int res_id;
|
||||
|
||||
common_data = &top_priv->common_data;
|
||||
soc_info = common_data->soc_info;
|
||||
soc_info = top_priv->top_common.soc_info;
|
||||
soc_private = soc_info->soc_private;
|
||||
|
||||
status = cam_io_r(soc_info->reg_map[VFE_CORE_BASE_IDX].mem_base +
|
||||
@@ -1114,12 +1015,12 @@ int cam_vfe_top_ver4_get_hw_caps(void *device_priv, void *args, uint32_t arg_siz
|
||||
vfe_cap_info = args;
|
||||
vfe_top_prv = device_priv;
|
||||
|
||||
if (!vfe_top_prv->common_data.soc_info) {
|
||||
if (!vfe_top_prv->top_common.soc_info) {
|
||||
CAM_ERR(CAM_ISP, "soc info is null");
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
soc_priv = (struct cam_vfe_soc_private *)vfe_top_prv->common_data.soc_info->soc_private;
|
||||
soc_priv = (struct cam_vfe_soc_private *)vfe_top_prv->top_common.soc_info->soc_private;
|
||||
|
||||
vfe_cap_info->is_lite = soc_priv->is_ife_lite;
|
||||
vfe_cap_info->incr = (vfe_top_prv->top_common.hw_version) & 0x00ffff;
|
||||
@@ -1135,7 +1036,7 @@ int cam_vfe_top_ver4_init_hw(void *device_priv,
|
||||
struct cam_vfe_top_ver4_priv *top_priv = device_priv;
|
||||
struct cam_vfe_top_ver4_common_data common_data = top_priv->common_data;
|
||||
|
||||
top_priv->hw_clk_rate = 0;
|
||||
top_priv->top_common.hw_clk_rate = 0;
|
||||
|
||||
/**
|
||||
* Auto clock gating is enabled by default, but no harm
|
||||
@@ -1143,19 +1044,20 @@ int cam_vfe_top_ver4_init_hw(void *device_priv,
|
||||
*/
|
||||
CAM_DBG(CAM_ISP, "Enabling clock gating at IFE top");
|
||||
|
||||
cam_soc_util_w_mb(common_data.soc_info, VFE_CORE_BASE_IDX,
|
||||
cam_soc_util_w_mb(top_priv->top_common.soc_info, VFE_CORE_BASE_IDX,
|
||||
common_data.common_reg->core_cgc_ovd_0, 0x0);
|
||||
|
||||
cam_soc_util_w_mb(common_data.soc_info, VFE_CORE_BASE_IDX,
|
||||
cam_soc_util_w_mb(top_priv->top_common.soc_info, VFE_CORE_BASE_IDX,
|
||||
common_data.common_reg->core_cgc_ovd_1, 0x0);
|
||||
|
||||
cam_soc_util_w_mb(common_data.soc_info, VFE_CORE_BASE_IDX,
|
||||
cam_soc_util_w_mb(top_priv->top_common.soc_info, VFE_CORE_BASE_IDX,
|
||||
common_data.common_reg->ahb_cgc_ovd, 0x0);
|
||||
|
||||
cam_soc_util_w_mb(common_data.soc_info, VFE_CORE_BASE_IDX,
|
||||
cam_soc_util_w_mb(top_priv->top_common.soc_info, VFE_CORE_BASE_IDX,
|
||||
common_data.common_reg->noc_cgc_ovd, 0x0);
|
||||
|
||||
top_priv->top_common.hw_version = cam_io_r_mb(common_data.soc_info->reg_map[0].mem_base +
|
||||
top_priv->top_common.hw_version = cam_io_r_mb(
|
||||
top_priv->top_common.soc_info->reg_map[0].mem_base +
|
||||
common_data.common_reg->hw_version);
|
||||
return 0;
|
||||
}
|
||||
@@ -1314,7 +1216,7 @@ static void cam_vfe_top_ver4_print_violation_info(
|
||||
uint32_t val = 0;
|
||||
|
||||
common_data = &top_priv->common_data;
|
||||
soc_info = common_data->soc_info;
|
||||
soc_info = top_priv->top_common.soc_info;
|
||||
base = soc_info->reg_map[VFE_CORE_BASE_IDX].mem_base;
|
||||
val = cam_io_r(base +
|
||||
common_data->common_reg->violation_status),
|
||||
@@ -1346,7 +1248,7 @@ int cam_vfe_top_ver4_start(void *device_priv,
|
||||
}
|
||||
|
||||
top_priv = (struct cam_vfe_top_ver4_priv *)device_priv;
|
||||
soc_info = top_priv->common_data.soc_info;
|
||||
soc_info = top_priv->top_common.soc_info;
|
||||
soc_private = soc_info->soc_private;
|
||||
if (!soc_private) {
|
||||
CAM_ERR(CAM_ISP, "Error soc_private NULL");
|
||||
@@ -1357,7 +1259,7 @@ int cam_vfe_top_ver4_start(void *device_priv,
|
||||
hw_info = (struct cam_hw_info *)mux_res->hw_intf->hw_priv;
|
||||
|
||||
if (hw_info->hw_state == CAM_HW_STATE_POWER_UP) {
|
||||
rc = cam_vfe_top_ver4_set_hw_clk_rate(top_priv);
|
||||
rc = cam_vfe_top_set_hw_clk_rate(&top_priv->top_common);
|
||||
if (rc) {
|
||||
CAM_ERR(CAM_ISP,
|
||||
"set_hw_clk_rate failed, rc=%d", rc);
|
||||
@@ -1416,7 +1318,7 @@ int cam_vfe_top_ver4_stop(void *device_priv,
|
||||
for (i = 0; i < top_priv->top_common.num_mux; i++) {
|
||||
if (top_priv->top_common.mux_rsrc[i].res_id ==
|
||||
mux_res->res_id) {
|
||||
top_priv->req_clk_rate[i] = 0;
|
||||
top_priv->top_common.req_clk_rate[i] = 0;
|
||||
memset(&top_priv->top_common.req_axi_vote[i],
|
||||
0, sizeof(struct cam_axi_vote));
|
||||
top_priv->top_common.axi_vote_control[i] =
|
||||
@@ -1456,7 +1358,7 @@ int cam_vfe_top_ver4_process_cmd(void *device_priv, uint32_t cmd_type,
|
||||
}
|
||||
|
||||
top_priv = (struct cam_vfe_top_ver4_priv *)device_priv;
|
||||
soc_info = top_priv->common_data.soc_info;
|
||||
soc_info = top_priv->top_common.soc_info;
|
||||
soc_private = soc_info->soc_private;
|
||||
if (!soc_private) {
|
||||
CAM_ERR(CAM_ISP, "Error soc_private NULL");
|
||||
@@ -1477,7 +1379,7 @@ int cam_vfe_top_ver4_process_cmd(void *device_priv, uint32_t cmd_type,
|
||||
arg_size);
|
||||
break;
|
||||
case CAM_ISP_HW_CMD_CLOCK_UPDATE:
|
||||
rc = cam_vfe_top_ver4_clock_update(top_priv, cmd_args,
|
||||
rc = cam_vfe_top_clock_update(&top_priv->top_common, cmd_args,
|
||||
arg_size);
|
||||
break;
|
||||
case CAM_ISP_HW_NOTIFY_OVERFLOW:
|
||||
@@ -2212,7 +2114,7 @@ int cam_vfe_top_ver4_init(
|
||||
}
|
||||
|
||||
vfe_top->top_priv = top_priv;
|
||||
top_priv->hw_clk_rate = 0;
|
||||
top_priv->top_common.hw_clk_rate = 0;
|
||||
|
||||
if (hw_info->num_mux > CAM_VFE_TOP_MUX_MAX) {
|
||||
CAM_ERR(CAM_ISP, "Invalid number of input rsrc: %d, max: %d",
|
||||
@@ -2230,7 +2132,7 @@ int cam_vfe_top_ver4_init(
|
||||
top_priv->top_common.mux_rsrc[i].hw_intf = hw_intf;
|
||||
top_priv->top_common.mux_rsrc[i].res_state =
|
||||
CAM_ISP_RESOURCE_STATE_AVAILABLE;
|
||||
top_priv->req_clk_rate[i] = 0;
|
||||
top_priv->top_common.req_clk_rate[i] = 0;
|
||||
|
||||
if (hw_info->mux_type[i] == CAM_VFE_CAMIF_VER_4_0) {
|
||||
top_priv->top_common.mux_rsrc[i].res_id =
|
||||
@@ -2291,7 +2193,7 @@ int cam_vfe_top_ver4_init(
|
||||
*vfe_top_ptr = vfe_top;
|
||||
|
||||
top_priv->common_data.hw_info = hw_info;
|
||||
top_priv->common_data.soc_info = soc_info;
|
||||
top_priv->top_common.soc_info = soc_info;
|
||||
top_priv->common_data.hw_intf = hw_intf;
|
||||
top_priv->top_common.hw_idx = hw_intf->hw_idx;
|
||||
top_priv->common_data.common_reg = hw_info->common_reg;
|
||||
|
Atsaukties uz šo jaunā problēmā
Block a user