Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ac5ae4b8 authored by Jigarkumar Zala's avatar Jigarkumar Zala
Browse files

msm: camera: Add support for active deactive feature



Add CONFIG transition state for Imagesensor and Flash submodule.
Also, add main flash fire support to INIT packet. This change allow
submit real time requests issued before streamon to request manager
and able to fire the main flash before streamon.

Change-Id: If03c4968e947e93277041e0ff066e73f090906f7
Signed-off-by: default avatarJigarkumar Zala <jzala@codeaurora.org>
parent bbd59a1f
Loading
Loading
Loading
Loading
+111 −34
Original line number Diff line number Diff line
@@ -36,7 +36,6 @@ int cam_flash_prepare(struct cam_flash_ctrl *flash_ctrl,
			return rc;
		}
		flash_ctrl->is_regulator_enabled = true;
		flash_ctrl->flash_state = CAM_FLASH_STATE_START;
	} else if ((!regulator_enable) &&
		(flash_ctrl->is_regulator_enabled == true)) {
		rc = qpnp_flash_led_prepare(flash_ctrl->switch_trigger,
@@ -47,7 +46,6 @@ int cam_flash_prepare(struct cam_flash_ctrl *flash_ctrl,
			return rc;
		}
		flash_ctrl->is_regulator_enabled = false;
		flash_ctrl->flash_state = CAM_FLASH_STATE_ACQUIRE;
	} else {
		CAM_ERR(CAM_FLASH, "Wrong Flash State : %d",
			flash_ctrl->flash_state);
@@ -68,12 +66,14 @@ static int cam_flash_flush_nrt(struct cam_flash_ctrl *fctrl)
	nrt_settings = &fctrl->nrt_info;

	if (nrt_settings->cmn_attr.cmd_type ==
		CAMERA_SENSOR_FLASH_CMD_TYPE_INIT) {
		CAMERA_SENSOR_FLASH_CMD_TYPE_INIT_INFO) {
		fctrl->flash_init_setting.cmn_attr.is_settings_valid = false;
	} else if ((nrt_settings->cmn_attr.cmd_type ==
		CAMERA_SENSOR_FLASH_CMD_TYPE_WIDGET) ||
		(nrt_settings->cmn_attr.cmd_type ==
		CAMERA_SENSOR_FLASH_CMD_TYPE_RER)) {
		CAMERA_SENSOR_FLASH_CMD_TYPE_RER) ||
		(nrt_settings->cmn_attr.cmd_type ==
		CAMERA_SENSOR_FLASH_CMD_TYPE_INIT_FIRE)) {
		fctrl->nrt_info.cmn_attr.is_settings_valid = false;
		fctrl->nrt_info.cmn_attr.count = 0;
		fctrl->nrt_info.num_iterations = 0;
@@ -312,6 +312,49 @@ int cam_flash_apply_setting(struct cam_flash_ctrl *fctrl,

	if (req_id == 0) {
		if (fctrl->nrt_info.cmn_attr.cmd_type ==
			CAMERA_SENSOR_FLASH_CMD_TYPE_INIT_FIRE) {
			flash_data = &fctrl->nrt_info;
			if (flash_data->opcode ==
				CAMERA_SENSOR_FLASH_OP_FIREHIGH) {
				if (fctrl->flash_state !=
					CAM_FLASH_STATE_CONFIG) {
					CAM_WARN(CAM_FLASH,
					"Cannot apply Start Dev:Prev state: %d",
					fctrl->flash_state);
					return rc;
				}
				rc = cam_flash_prepare(fctrl, true);
				if (rc) {
					CAM_ERR(CAM_FLASH,
					"Enable Regulator Failed rc = %d", rc);
					return rc;
				}
				rc = cam_flash_high(fctrl, flash_data);
				if (rc)
					CAM_ERR(CAM_FLASH,
						"FLASH ON failed : %d",
						rc);
			}
			if (flash_data->opcode ==
				CAMERA_SENSOR_FLASH_OP_OFF) {
				rc = cam_flash_off(fctrl);
				if (rc) {
					CAM_ERR(CAM_FLASH,
					"LED OFF FAILED: %d",
					rc);
					return rc;
				}
				if ((fctrl->flash_state ==
					CAM_FLASH_STATE_START) &&
					(fctrl->is_regulator_enabled == true)) {
					rc = cam_flash_prepare(fctrl, false);
					if (rc)
						CAM_ERR(CAM_FLASH,
						"Disable Regulator failed: %d",
						rc);
				}
			}
		} else if (fctrl->nrt_info.cmn_attr.cmd_type ==
			CAMERA_SENSOR_FLASH_CMD_TYPE_WIDGET) {
			flash_data = &fctrl->nrt_info;
			if (flash_data->opcode ==
@@ -491,11 +534,39 @@ int cam_flash_parser(struct cam_flash_ctrl *fctrl, void *arg)
		cam_flash_info = (struct cam_flash_init *)cmd_buf;

		switch (cam_flash_info->cmd_type) {
		case CAMERA_SENSOR_FLASH_CMD_TYPE_INIT:
		case CAMERA_SENSOR_FLASH_CMD_TYPE_INIT_INFO:
			fctrl->flash_type = cam_flash_info->flash_type;
			fctrl->is_regulator_enabled = false;
			fctrl->nrt_info.cmn_attr.cmd_type =
				CAMERA_SENSOR_FLASH_CMD_TYPE_INIT;
				CAMERA_SENSOR_FLASH_CMD_TYPE_INIT_INFO;
			fctrl->flash_state =
				CAM_FLASH_STATE_CONFIG;
			break;
		case CAMERA_SENSOR_FLASH_CMD_TYPE_INIT_FIRE:
			CAM_DBG(CAM_FLASH, "Widget Flash Operation");
				flash_operation_info =
					(struct cam_flash_set_on_off *) cmd_buf;
				fctrl->nrt_info.cmn_attr.count =
					flash_operation_info->count;
				fctrl->nrt_info.cmn_attr.request_id = 0;
				fctrl->nrt_info.opcode =
					flash_operation_info->opcode;
				fctrl->nrt_info.cmn_attr.cmd_type =
					CAMERA_SENSOR_FLASH_CMD_TYPE_INIT_FIRE;
				for (i = 0;
					i < flash_operation_info->count; i++)
					fctrl->nrt_info.led_current_ma[i] =
					flash_operation_info->led_current_ma[i];

				mutex_lock(&fctrl->flash_wq_mutex);
				rc = cam_flash_apply_setting(fctrl, 0);
				if (rc)
					CAM_ERR(CAM_FLASH,
						"Apply setting failed: %d",
						rc);
				mutex_unlock(&fctrl->flash_wq_mutex);
				fctrl->flash_state =
					CAM_FLASH_STATE_CONFIG;
			break;
		default:
			CAM_ERR(CAM_FLASH, "Wrong cmd_type = %d",
@@ -541,17 +612,14 @@ int cam_flash_parser(struct cam_flash_ctrl *fctrl, void *arg)
		case CAMERA_SENSOR_FLASH_CMD_TYPE_FIRE: {
			CAM_DBG(CAM_FLASH,
				"CAMERA_FLASH_CMD_TYPE_OPS case called");
			if (fctrl->flash_state != CAM_FLASH_STATE_START) {
				CAM_ERR(CAM_FLASH,
					"Rxed Update packets without linking");
				fctrl->per_frame[frame_offset].
					cmn_attr.is_settings_valid = false;
				return -EINVAL;
			}
			if ((fctrl->flash_state == CAM_FLASH_STATE_START) ||
				(fctrl->flash_state ==
					CAM_FLASH_STATE_CONFIG)) {
				flash_operation_info =
					(struct cam_flash_set_on_off *) cmd_buf;
				if (!flash_operation_info) {
				CAM_ERR(CAM_FLASH, "flash_operation_info Null");
					CAM_ERR(CAM_FLASH,
						"flash_operation_info Null");
					return -EINVAL;
				}

@@ -559,10 +627,20 @@ int cam_flash_parser(struct cam_flash_ctrl *fctrl, void *arg)
					flash_operation_info->opcode;
				fctrl->per_frame[frame_offset].cmn_attr.count =
					flash_operation_info->count;
			for (i = 0; i < flash_operation_info->count; i++)
				fctrl->per_frame[frame_offset].led_current_ma[i]
				for (i = 0;
					i < flash_operation_info->count; i++)
					fctrl->per_frame[frame_offset].
						led_current_ma[i]
						= flash_operation_info->
						led_current_ma[i];

			} else {
				CAM_ERR(CAM_FLASH,
					"Rxed Update packets without linking");
				fctrl->per_frame[frame_offset].
					cmn_attr.is_settings_valid = false;
				return -EINVAL;
			}
			break;
		}
		default:
@@ -663,17 +741,18 @@ int cam_flash_parser(struct cam_flash_ctrl *fctrl, void *arg)
		break;
	}
	case CAM_PKT_NOP_OPCODE: {
		if (fctrl->flash_state != CAM_FLASH_STATE_START) {
		if ((fctrl->flash_state == CAM_FLASH_STATE_START) ||
			(fctrl->flash_state == CAM_FLASH_STATE_CONFIG)) {
			CAM_DBG(CAM_FLASH, "NOP Packet is Received: req_id: %u",
				csl_packet->header.request_id);
			goto update_req_mgr;
		} else {
			CAM_ERR(CAM_FLASH,
				"Rxed Update packets without linking");
			fctrl->per_frame[frame_offset].
				cmn_attr.is_settings_valid = false;
			return -EINVAL;
		}

		CAM_DBG(CAM_FLASH, "NOP Packet is Received: req_id: %u",
			csl_packet->header.request_id);
		goto update_req_mgr;
	}
	default:
		CAM_ERR(CAM_FLASH, "Wrong Opcode : %d",
@@ -795,14 +874,12 @@ void cam_flash_shutdown(struct cam_flash_ctrl *fctrl)
	if (fctrl->flash_state == CAM_FLASH_STATE_INIT)
		return;

	if (fctrl->flash_state == CAM_FLASH_STATE_ACQUIRE) {
		cam_flash_release_dev(fctrl);
		return;
	}

	if ((fctrl->flash_state == CAM_FLASH_STATE_CONFIG) ||
		(fctrl->flash_state == CAM_FLASH_STATE_START)) {
		rc = cam_flash_stop_dev(fctrl);
		if (rc)
			CAM_ERR(CAM_FLASH, "Stop Failed rc: %d", rc);
	}

	rc = cam_flash_release_dev(fctrl);
	if (rc)
+2 −1
Original line number Diff line number Diff line
@@ -131,7 +131,7 @@ static int32_t cam_flash_driver_cmd(struct cam_flash_ctrl *fctrl,
	}
	case CAM_START_DEV: {
		CAM_DBG(CAM_FLASH, "CAM_START_DEV");
		if (fctrl->flash_state != CAM_FLASH_STATE_ACQUIRE) {
		if (fctrl->flash_state != CAM_FLASH_STATE_CONFIG) {
			CAM_WARN(CAM_FLASH,
				"Cannot apply Start Dev: Prev state: %d",
				fctrl->flash_state);
@@ -154,6 +154,7 @@ static int32_t cam_flash_driver_cmd(struct cam_flash_ctrl *fctrl,
		break;
	}
	case CAM_STOP_DEV: {
		CAM_DBG(CAM_FLASH, "CAM_STOP_DEV ENTER");
		if (fctrl->flash_state != CAM_FLASH_STATE_START) {
			CAM_WARN(CAM_FLASH,
				"Cannot apply Stop dev: Prev state is: %d",
+1 −0
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ enum cam_flash_switch_trigger_ops {
enum cam_flash_state {
	CAM_FLASH_STATE_INIT,
	CAM_FLASH_STATE_ACQUIRE,
	CAM_FLASH_STATE_CONFIG,
	CAM_FLASH_STATE_START,
};

+38 −37
Original line number Diff line number Diff line
@@ -165,11 +165,8 @@ static int32_t cam_sensor_i2c_pkt_parse(struct cam_sensor_ctrl_t *s_ctrl,
	}

	case CAM_SENSOR_PACKET_OPCODE_SENSOR_UPDATE: {
		if (s_ctrl->sensor_state != CAM_SENSOR_START) {
			CAM_ERR(CAM_SENSOR,
				"Rxed Update packets without linking");
			return -EINVAL;
		}
		if ((s_ctrl->sensor_state == CAM_SENSOR_CONFIG) ||
			(s_ctrl->sensor_state == CAM_SENSOR_START)) {
			i2c_reg_settings =
				&i2c_data->
				per_frame[csl_packet->header.request_id %
@@ -187,16 +184,22 @@ static int32_t cam_sensor_i2c_pkt_parse(struct cam_sensor_ctrl_t *s_ctrl,
					return rc;
				}
			}
		} else {
			CAM_ERR(CAM_SENSOR,
				"Rxed Update packets without linking");
			return -EINVAL;
		}
	break;
	}
	case CAM_SENSOR_PACKET_OPCODE_SENSOR_NOP: {
		if (s_ctrl->sensor_state != CAM_SENSOR_START) {
		if ((s_ctrl->sensor_state == CAM_SENSOR_CONFIG) ||
			(s_ctrl->sensor_state == CAM_SENSOR_START)) {
			cam_sensor_update_req_mgr(s_ctrl, csl_packet);
		} else {
			CAM_ERR(CAM_SENSOR,
				"Rxed Update packets without linking");
			return -EINVAL;
			rc = -EINVAL;
		}

		cam_sensor_update_req_mgr(s_ctrl, csl_packet);
		return rc;
	}
	default:
@@ -487,22 +490,18 @@ void cam_sensor_shutdown(struct cam_sensor_ctrl_t *s_ctrl)

	cam_sensor_release_resource(s_ctrl);

	if ((s_ctrl->sensor_state == CAM_SENSOR_START) ||
		(s_ctrl->sensor_state == CAM_SENSOR_ACQUIRE)) {
	if (s_ctrl->sensor_state >= CAM_SENSOR_ACQUIRE)
		cam_sensor_power_down(s_ctrl);

	rc = cam_destroy_device_hdl(s_ctrl->bridge_intf.device_hdl);
	if (rc < 0)
		CAM_ERR(CAM_SENSOR, " failed destroying dhdl");
	s_ctrl->bridge_intf.device_hdl = -1;
	s_ctrl->bridge_intf.link_hdl = -1;
	s_ctrl->bridge_intf.session_hdl = -1;
		s_ctrl->sensor_state = CAM_SENSOR_PROBE;
	}

	if (s_ctrl->sensor_state == CAM_SENSOR_PROBE) {
	kfree(power_info->power_setting);
	kfree(power_info->power_down_setting);
	}

	s_ctrl->sensor_state = CAM_SENSOR_INIT;
}
@@ -707,7 +706,8 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl,
	}
		break;
	case CAM_RELEASE_DEV: {
		if (s_ctrl->sensor_state != CAM_SENSOR_ACQUIRE) {
		if ((s_ctrl->sensor_state < CAM_SENSOR_ACQUIRE) ||
			(s_ctrl->sensor_state > CAM_SENSOR_CONFIG)) {
			rc = -EINVAL;
			CAM_WARN(CAM_SENSOR,
			"Not in right state to release : %d",
@@ -754,7 +754,7 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl,
		break;
	}
	case CAM_START_DEV: {
		if (s_ctrl->sensor_state != CAM_SENSOR_ACQUIRE) {
		if (s_ctrl->sensor_state != CAM_SENSOR_CONFIG) {
			rc = -EINVAL;
			CAM_WARN(CAM_SENSOR,
			"Not in right state to start : %d",
@@ -836,6 +836,7 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl,
					"Fail in deleting the config settings");
				goto release_mutex;
			}
			s_ctrl->sensor_state = CAM_SENSOR_CONFIG;
			s_ctrl->i2c_data.config_settings.request_id = -1;
		}
	}
+1 −1
Original line number Diff line number Diff line
@@ -51,8 +51,8 @@

enum cam_sensor_state_t {
	CAM_SENSOR_INIT,
	CAM_SENSOR_PROBE,
	CAM_SENSOR_ACQUIRE,
	CAM_SENSOR_CONFIG,
	CAM_SENSOR_START,
};

Loading