msm: camera: csiphy: Add support for long and short channel
Config different channel settings according to the flag including short and standard channel. CRs-Fixed: 3441333 Change-Id: I90ae6f941debcd63ecad1e24363997c19bad59ca Signed-off-by: Wang Kan <quic_wkan@quicinc.com>
This commit is contained in:

committed by
Camera Software Integration

parent
11874984b4
commit
512fb4a19b
@@ -660,7 +660,6 @@ static int __cam_csiphy_parse_lane_info_cmd_buf(
|
||||
uint16_t lane_assign = 0, preamble_en = 0;
|
||||
uintptr_t generic_ptr;
|
||||
uint32_t *cmd_buf = NULL;
|
||||
struct cam_csiphy_info *cam_cmd_csiphy_info = NULL;
|
||||
size_t len;
|
||||
|
||||
rc = cam_mem_get_cpu_buf(cmd_desc->mem_handle,
|
||||
@@ -671,6 +670,54 @@ static int __cam_csiphy_parse_lane_info_cmd_buf(
|
||||
return rc;
|
||||
}
|
||||
|
||||
cmd_buf = (uint32_t *)generic_ptr;
|
||||
cmd_buf += cmd_desc->offset / 4;
|
||||
index = cam_csiphy_get_instance_offset(csiphy_dev, dev_handle);
|
||||
if (index < 0 || index >= csiphy_dev->session_max_device_support) {
|
||||
CAM_ERR(CAM_CSIPHY, "index in invalid: %d", index);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (cmd_desc->meta_data == CAM_CSIPHY_PACKET_META_LANE_INFO_V2) {
|
||||
struct cam_csiphy_info_v2 *cam_cmd_csiphy_info_v2 = NULL;
|
||||
|
||||
if ((len < sizeof(struct cam_csiphy_info_v2)) ||
|
||||
(cmd_desc->offset > (len - sizeof(struct cam_csiphy_info_v2)))) {
|
||||
CAM_ERR(CAM_CSIPHY,
|
||||
"Not enough buffer provided for cam_csiphy_info");
|
||||
rc = -EINVAL;
|
||||
return rc;
|
||||
}
|
||||
|
||||
cam_cmd_csiphy_info_v2 = (struct cam_csiphy_info_v2 *)cmd_buf;
|
||||
rc = cam_csiphy_sanitize_lane_cnt(csiphy_dev, index,
|
||||
cam_cmd_csiphy_info_v2->lane_cnt);
|
||||
if (rc) {
|
||||
CAM_ERR(CAM_CSIPHY, "Wrong configuration lane_cnt: %u",
|
||||
cam_cmd_csiphy_info_v2->lane_cnt);
|
||||
return rc;
|
||||
}
|
||||
|
||||
preamble_en = (cam_cmd_csiphy_info_v2->mipi_flags &
|
||||
PREAMBLE_PATTEN_CAL_MASK);
|
||||
|
||||
csiphy_dev->csiphy_info[index].lane_cnt =
|
||||
cam_cmd_csiphy_info_v2->lane_cnt;
|
||||
csiphy_dev->csiphy_info[index].lane_assign =
|
||||
cam_cmd_csiphy_info_v2->lane_assign;
|
||||
csiphy_dev->csiphy_info[index].settle_time =
|
||||
cam_cmd_csiphy_info_v2->settle_time;
|
||||
csiphy_dev->csiphy_info[index].data_rate =
|
||||
cam_cmd_csiphy_info_v2->data_rate;
|
||||
csiphy_dev->csiphy_info[index].secure_mode =
|
||||
cam_cmd_csiphy_info_v2->secure_mode;
|
||||
csiphy_dev->csiphy_info[index].mipi_flags =
|
||||
(cam_cmd_csiphy_info_v2->mipi_flags & SKEW_CAL_MASK);
|
||||
csiphy_dev->csiphy_info[index].channel_type =
|
||||
cam_cmd_csiphy_info_v2->channel_type;
|
||||
} else if (cmd_desc->meta_data == CAM_CSIPHY_PACKET_META_LANE_INFO) {
|
||||
struct cam_csiphy_info *cam_cmd_csiphy_info = NULL;
|
||||
|
||||
if ((len < sizeof(struct cam_csiphy_info)) ||
|
||||
(cmd_desc->offset > (len - sizeof(struct cam_csiphy_info)))) {
|
||||
CAM_ERR(CAM_CSIPHY,
|
||||
@@ -679,16 +726,7 @@ static int __cam_csiphy_parse_lane_info_cmd_buf(
|
||||
return rc;
|
||||
}
|
||||
|
||||
cmd_buf = (uint32_t *)generic_ptr;
|
||||
cmd_buf += cmd_desc->offset / 4;
|
||||
cam_cmd_csiphy_info = (struct cam_csiphy_info *)cmd_buf;
|
||||
|
||||
index = cam_csiphy_get_instance_offset(csiphy_dev, dev_handle);
|
||||
if (index < 0 || index >= csiphy_dev->session_max_device_support) {
|
||||
CAM_ERR(CAM_CSIPHY, "index in invalid: %d", index);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rc = cam_csiphy_sanitize_lane_cnt(csiphy_dev, index,
|
||||
cam_cmd_csiphy_info->lane_cnt);
|
||||
if (rc) {
|
||||
@@ -700,6 +738,22 @@ static int __cam_csiphy_parse_lane_info_cmd_buf(
|
||||
preamble_en = (cam_cmd_csiphy_info->mipi_flags &
|
||||
PREAMBLE_PATTEN_CAL_MASK);
|
||||
|
||||
csiphy_dev->csiphy_info[index].lane_cnt =
|
||||
cam_cmd_csiphy_info->lane_cnt;
|
||||
csiphy_dev->csiphy_info[index].lane_assign =
|
||||
cam_cmd_csiphy_info->lane_assign;
|
||||
csiphy_dev->csiphy_info[index].settle_time =
|
||||
cam_cmd_csiphy_info->settle_time;
|
||||
csiphy_dev->csiphy_info[index].data_rate =
|
||||
cam_cmd_csiphy_info->data_rate;
|
||||
csiphy_dev->csiphy_info[index].secure_mode =
|
||||
cam_cmd_csiphy_info->secure_mode;
|
||||
csiphy_dev->csiphy_info[index].mipi_flags =
|
||||
(cam_cmd_csiphy_info->mipi_flags & SKEW_CAL_MASK);
|
||||
csiphy_dev->csiphy_info[index].channel_type =
|
||||
CAM_CSIPHY_DATARATE_STANDARD_CHANNEL;
|
||||
}
|
||||
|
||||
/* Cannot support CPHY combo mode with One sensor setting
|
||||
* preamble enable and second/third sensor is without
|
||||
* preamble enable.
|
||||
@@ -715,19 +769,6 @@ static int __cam_csiphy_parse_lane_info_cmd_buf(
|
||||
}
|
||||
|
||||
csiphy_dev->preamble_enable = preamble_en;
|
||||
csiphy_dev->csiphy_info[index].lane_cnt = cam_cmd_csiphy_info->lane_cnt;
|
||||
csiphy_dev->csiphy_info[index].lane_assign =
|
||||
cam_cmd_csiphy_info->lane_assign;
|
||||
|
||||
csiphy_dev->csiphy_info[index].settle_time =
|
||||
cam_cmd_csiphy_info->settle_time;
|
||||
csiphy_dev->csiphy_info[index].data_rate =
|
||||
cam_cmd_csiphy_info->data_rate;
|
||||
csiphy_dev->csiphy_info[index].secure_mode =
|
||||
cam_cmd_csiphy_info->secure_mode;
|
||||
csiphy_dev->csiphy_info[index].mipi_flags =
|
||||
(cam_cmd_csiphy_info->mipi_flags & SKEW_CAL_MASK);
|
||||
|
||||
lane_assign = csiphy_dev->csiphy_info[index].lane_assign;
|
||||
lane_cnt = csiphy_dev->csiphy_info[index].lane_cnt;
|
||||
|
||||
@@ -751,7 +792,7 @@ static int __cam_csiphy_parse_lane_info_cmd_buf(
|
||||
lane_assign >>= 4;
|
||||
}
|
||||
|
||||
if (cam_cmd_csiphy_info->secure_mode == 1) {
|
||||
if (csiphy_dev->csiphy_info[index].secure_mode == 1) {
|
||||
rc = cam_csiphy_update_secure_info(csiphy_dev, index);
|
||||
if (rc) {
|
||||
CAM_ERR(CAM_CSIPHY,
|
||||
@@ -769,7 +810,7 @@ static int __cam_csiphy_parse_lane_info_cmd_buf(
|
||||
"3phase:%d, combo mode:%d, secure mode:%d",
|
||||
csiphy_dev->csiphy_info[index].csiphy_3phase,
|
||||
csiphy_dev->combo_mode,
|
||||
cam_cmd_csiphy_info->secure_mode);
|
||||
csiphy_dev->csiphy_info[index].secure_mode);
|
||||
CAM_DBG(CAM_CSIPHY,
|
||||
"lane_cnt: 0x%x, lane_assign: 0x%x, lane_enable: 0x%x, settle time:%llu, datarate:%llu",
|
||||
csiphy_dev->csiphy_info[index].lane_cnt,
|
||||
@@ -959,6 +1000,10 @@ int32_t cam_cmd_buf_parser(struct csiphy_device *csiphy_dev,
|
||||
rc = __cam_csiphy_parse_lane_info_cmd_buf(
|
||||
cfg_dev->dev_handle, csiphy_dev, &cmd_desc[i]);
|
||||
break;
|
||||
case CAM_CSIPHY_PACKET_META_LANE_INFO_V2:
|
||||
rc = __cam_csiphy_parse_lane_info_cmd_buf(
|
||||
cfg_dev->dev_handle, csiphy_dev, &cmd_desc[i]);
|
||||
break;
|
||||
case CAM_CSIPHY_PACKET_META_GENERIC_BLOB:
|
||||
rc = cam_packet_util_process_generic_cmd_buffer(&cmd_desc[i],
|
||||
__cam_csiphy_generic_blob_handler, csiphy_dev);
|
||||
@@ -1063,6 +1108,7 @@ static int cam_csiphy_cphy_data_rate_config(struct csiphy_device *csiphy_device,
|
||||
int32_t delay;
|
||||
struct csiphy_reg_t *config_params;
|
||||
uint8_t csiphy_index = 0;
|
||||
uint32_t channel_type;
|
||||
|
||||
if ((csiphy_device == NULL) || (csiphy_device->ctrl_reg == NULL)) {
|
||||
CAM_ERR(CAM_CSIPHY, "Device is NULL");
|
||||
@@ -1090,6 +1136,7 @@ static int cam_csiphy_cphy_data_rate_config(struct csiphy_device *csiphy_device,
|
||||
do_div(intermediate_var, 200000000);
|
||||
settle_cnt = intermediate_var;
|
||||
csiphy_index = csiphy_device->soc_info.index;
|
||||
channel_type = csiphy_device->csiphy_info[idx].channel_type;
|
||||
|
||||
CAM_DBG(CAM_CSIPHY, "required data rate : %llu", required_phy_data_rate);
|
||||
for (data_rate_idx = 0; data_rate_idx < num_data_rates; data_rate_idx++) {
|
||||
@@ -1137,6 +1184,16 @@ static int cam_csiphy_cphy_data_rate_config(struct csiphy_device *csiphy_device,
|
||||
cam_io_w_mb(reg_data,
|
||||
csiphybase + reg_addr);
|
||||
break;
|
||||
case CSIPHY_SHORT_CHANNEL_PARAMS:
|
||||
if (channel_type == CAM_CSIPHY_DATARATE_SHORT_CHANNEL)
|
||||
cam_io_w_mb(reg_data,
|
||||
csiphybase + reg_addr);
|
||||
break;
|
||||
case CSIPHY_STANDARD_CHANNEL_PARAMS:
|
||||
if (channel_type == CAM_CSIPHY_DATARATE_STANDARD_CHANNEL)
|
||||
cam_io_w_mb(reg_data,
|
||||
csiphybase + reg_addr);
|
||||
break;
|
||||
case CSIPHY_SETTLE_CNT_LOWER_BYTE:
|
||||
cam_io_w_mb(settle_cnt & 0xFF,
|
||||
csiphybase + reg_addr);
|
||||
@@ -1157,7 +1214,18 @@ static int cam_csiphy_cphy_data_rate_config(struct csiphy_device *csiphy_device,
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CSIPHY_CDR_LN_SETTINGS: {
|
||||
default:
|
||||
CAM_DBG(CAM_CSIPHY, "Do Nothing");
|
||||
break;
|
||||
}
|
||||
|
||||
if ((reg_param_type ==
|
||||
(CSIPHY_CDR_LN_SETTINGS | CSIPHY_SHORT_CHANNEL_PARAMS) &&
|
||||
(channel_type == CAM_CSIPHY_DATARATE_SHORT_CHANNEL)) ||
|
||||
(reg_param_type ==
|
||||
(CSIPHY_CDR_LN_SETTINGS | CSIPHY_STANDARD_CHANNEL_PARAMS) &&
|
||||
(channel_type == CAM_CSIPHY_DATARATE_STANDARD_CHANNEL)) ||
|
||||
reg_param_type == CSIPHY_CDR_LN_SETTINGS) {
|
||||
int32_t cdr_val = reg_data;
|
||||
struct cam_csiphy_dev_cdr_sweep_params *cdr_params =
|
||||
&csiphy_device->cdr_params;
|
||||
@@ -1185,11 +1253,7 @@ static int cam_csiphy_cphy_data_rate_config(struct csiphy_device *csiphy_device,
|
||||
reg_addr, cdr_val,
|
||||
CAM_BOOL_TO_YESNO(cdr_params->cdr_sweep_enabled));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
CAM_DBG(CAM_CSIPHY, "Do Nothing");
|
||||
break;
|
||||
}
|
||||
|
||||
if (delay > 0)
|
||||
usleep_range(delay, delay + 5);
|
||||
}
|
||||
|
@@ -41,18 +41,20 @@
|
||||
#define CAMX_CSIPHY_DEV_NAME "cam-csiphy-driver"
|
||||
#define CAM_CSIPHY_RX_CLK_SRC "cphy_rx_src_clk"
|
||||
|
||||
#define CSIPHY_DEFAULT_PARAMS 0
|
||||
#define CSIPHY_LANE_ENABLE 1
|
||||
#define CSIPHY_SETTLE_CNT_LOWER_BYTE 2
|
||||
#define CSIPHY_SETTLE_CNT_HIGHER_BYTE 3
|
||||
#define CSIPHY_2PH_REGS 4
|
||||
#define CSIPHY_3PH_REGS 5
|
||||
#define CSIPHY_SKEW_CAL 6
|
||||
#define CSIPHY_2PH_COMBO_REGS 7
|
||||
#define CSIPHY_3PH_COMBO_REGS 8
|
||||
#define CSIPHY_2PH_3PH_COMBO_REGS 9
|
||||
#define CSIPHY_AUXILIARY_SETTING 10
|
||||
#define CSIPHY_CDR_LN_SETTINGS 11
|
||||
#define CSIPHY_DEFAULT_PARAMS BIT(0)
|
||||
#define CSIPHY_LANE_ENABLE BIT(1)
|
||||
#define CSIPHY_SETTLE_CNT_LOWER_BYTE BIT(2)
|
||||
#define CSIPHY_SETTLE_CNT_HIGHER_BYTE BIT(3)
|
||||
#define CSIPHY_2PH_REGS BIT(4)
|
||||
#define CSIPHY_3PH_REGS BIT(5)
|
||||
#define CSIPHY_SKEW_CAL BIT(6)
|
||||
#define CSIPHY_2PH_COMBO_REGS BIT(7)
|
||||
#define CSIPHY_3PH_COMBO_REGS BIT(8)
|
||||
#define CSIPHY_2PH_3PH_COMBO_REGS BIT(9)
|
||||
#define CSIPHY_AUXILIARY_SETTING BIT(10)
|
||||
#define CSIPHY_CDR_LN_SETTINGS BIT(11)
|
||||
#define CSIPHY_SHORT_CHANNEL_PARAMS BIT(12)
|
||||
#define CSIPHY_STANDARD_CHANNEL_PARAMS BIT(13)
|
||||
|
||||
#define CSIPHY_MAX_INSTANCES_PER_PHY 3
|
||||
|
||||
@@ -90,6 +92,11 @@ enum cam_csiphy_state {
|
||||
CAM_CSIPHY_START,
|
||||
};
|
||||
|
||||
enum cam_csiphy_datarate_channel {
|
||||
CAM_CSIPHY_DATARATE_SHORT_CHANNEL,
|
||||
CAM_CSIPHY_DATARATE_STANDARD_CHANNEL,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum cam_csiphy_common_reg_program
|
||||
* @CAM_CSIPHY_PRGM_ALL : Programs common registers for all CSIPHYs
|
||||
@@ -316,6 +323,7 @@ struct csiphy_ctrl_t {
|
||||
* @conn_csid_idx : Connected CSID core idx (Primary csid in case of dual ife)
|
||||
* @use_hw_client_voting : Whether to use hw client voting for clk on chipsets with cesta
|
||||
* @is_drv_config_en : If drv is configured in CSID
|
||||
* @channel_type : Channel type for different channel settings
|
||||
*/
|
||||
struct cam_csiphy_param {
|
||||
uint16_t lane_assign;
|
||||
@@ -334,6 +342,7 @@ struct cam_csiphy_param {
|
||||
int32_t conn_csid_idx;
|
||||
bool use_hw_client_voting;
|
||||
bool is_drv_config_en;
|
||||
uint32_t channel_type;
|
||||
};
|
||||
|
||||
struct csiphy_work_queue {
|
||||
|
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user