瀏覽代碼

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 <[email protected]>
Wang Kan 2 年之前
父節點
當前提交
512fb4a19b

+ 104 - 40
drivers/cam_sensor_module/cam_csiphy/cam_csiphy_core.c

@@ -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,34 +670,89 @@ static int __cam_csiphy_parse_lane_info_cmd_buf(
 		return rc;
 	}
 
-	if ((len < sizeof(struct cam_csiphy_info)) ||
-		(cmd_desc->offset > (len - sizeof(struct cam_csiphy_info)))) {
-		CAM_ERR(CAM_CSIPHY,
-			"Not enough buffer provided for cam_csiphy_info");
-		rc = -EINVAL;
-		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) {
-		CAM_ERR(CAM_CSIPHY, "Wrong configuration lane_cnt: %u",
+	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,
+				"Not enough buffer provided for cam_csiphy_info");
+			rc = -EINVAL;
+			return rc;
+		}
+
+		cam_cmd_csiphy_info = (struct cam_csiphy_info *)cmd_buf;
+		rc = cam_csiphy_sanitize_lane_cnt(csiphy_dev, index,
 			cam_cmd_csiphy_info->lane_cnt);
-		return rc;
-	}
+		if (rc) {
+			CAM_ERR(CAM_CSIPHY, "Wrong configuration lane_cnt: %u",
+				cam_cmd_csiphy_info->lane_cnt);
+			return rc;
+		}
 
-	preamble_en = (cam_cmd_csiphy_info->mipi_flags &
-		PREAMBLE_PATTEN_CAL_MASK);
+		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
@@ -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);
 		}

+ 21 - 12
drivers/cam_sensor_module/cam_csiphy/cam_csiphy_dev.h

@@ -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 {

文件差異過大導致無法顯示
+ 352 - 220
drivers/cam_sensor_module/cam_csiphy/include/cam_csiphy_2_2_0_hwreg.h


部分文件因文件數量過多而無法顯示