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

Commit 6303a93e authored by Jeyaprakash Soundrapandian's avatar Jeyaprakash Soundrapandian Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: camera: Dynamically find the request to be deleted" into dev/msm-4.9-camx

parents 9fb77f4b 551bd22d
Loading
Loading
Loading
Loading
+48 −10
Original line number Diff line number Diff line
/* Copyright (c) 2017, The Linux Foundation. All rights reserved.
/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -271,8 +271,8 @@ static int cam_flash_high(
static int delete_req(struct cam_flash_ctrl *fctrl, uint64_t req_id)
{
	int i = 0;
	int frame_offset = 0;
	struct cam_flash_frame_setting *flash_data = NULL;
	uint64_t top = 0, del_req_id = 0;

	if (req_id == 0) {
		flash_data = &fctrl->nrt_info;
@@ -288,16 +288,54 @@ static int delete_req(struct cam_flash_ctrl *fctrl, uint64_t req_id)
				is_settings_valid = false;
		}
	} else {
		frame_offset = (req_id + MAX_PER_FRAME_ARRAY -
			CAM_FLASH_PIPELINE_DELAY) % 8;
		flash_data = &fctrl->per_frame[frame_offset];
		if (req_id > flash_data->cmn_attr.request_id) {
		for (i = 0; i < MAX_PER_FRAME_ARRAY; i++) {
			flash_data = &fctrl->per_frame[i];
			if (req_id >= flash_data->cmn_attr.request_id &&
				flash_data->cmn_attr.is_settings_valid
				== 1) {
				if (top < flash_data->cmn_attr.request_id) {
					del_req_id = top;
					top = flash_data->cmn_attr.request_id;
				} else if (top >
					flash_data->cmn_attr.request_id &&
					del_req_id <
					flash_data->cmn_attr.request_id) {
					del_req_id =
						flash_data->cmn_attr.request_id;
				}
			}
		}

		if (top < req_id) {
			if ((((top % MAX_PER_FRAME_ARRAY) - (req_id %
				MAX_PER_FRAME_ARRAY)) >= BATCH_SIZE_MAX) ||
				(((top % MAX_PER_FRAME_ARRAY) - (req_id %
				MAX_PER_FRAME_ARRAY)) <= -BATCH_SIZE_MAX))
				del_req_id = req_id;
		}

		if (!del_req_id)
			return 0;

		CAM_DBG(CAM_FLASH, "top: %llu, del_req_id:%llu",
			top, del_req_id);

		for (i = 0; i < MAX_PER_FRAME_ARRAY; i++) {
			flash_data = &fctrl->per_frame[i];
			if ((del_req_id ==
				flash_data->cmn_attr.request_id) &&
				(flash_data->cmn_attr.
					is_settings_valid == 1)) {
				CAM_DBG(CAM_FLASH, "Deleting request[%d] %llu",
					i, flash_data->cmn_attr.request_id);
				flash_data->cmn_attr.request_id = 0;
				flash_data->cmn_attr.is_settings_valid = false;
				flash_data->opcode = 0;
				for (i = 0; i < flash_data->cmn_attr.count; i++)
					flash_data->led_current_ma[i] = 0;
			}
		}
	}

	return 0;
}
+44 −17
Original line number Diff line number Diff line
@@ -193,8 +193,9 @@ static int32_t cam_sensor_i2c_pkt_parse(struct cam_sensor_ctrl_t *s_ctrl,
			&i2c_data->
			per_frame[csl_packet->header.request_id %
			MAX_PER_FRAME_ARRAY];
		CAM_DBG(CAM_SENSOR, "Received Packet: %lld",
		csl_packet->header.request_id % MAX_PER_FRAME_ARRAY);
		CAM_DBG(CAM_SENSOR, "Received Packet: %lld req: %lld",
			csl_packet->header.request_id % MAX_PER_FRAME_ARRAY,
			csl_packet->header.request_id);
		if (i2c_reg_settings->is_settings_valid == 1) {
			CAM_ERR(CAM_SENSOR,
				"Already some pkt in offset req : %lld",
@@ -1010,7 +1011,8 @@ int cam_sensor_power_down(struct cam_sensor_ctrl_t *s_ctrl)
int cam_sensor_apply_settings(struct cam_sensor_ctrl_t *s_ctrl,
	int64_t req_id, enum cam_sensor_packet_opcodes opcode)
{
	int rc = 0, offset, del_req_id;
	int rc = 0, offset, i;
	uint64_t top = 0, del_req_id = 0;
	struct i2c_settings_array *i2c_set = NULL;
	struct i2c_settings_list *i2c_list;

@@ -1073,23 +1075,48 @@ int cam_sensor_apply_settings(struct cam_sensor_ctrl_t *s_ctrl,
				"Invalid/NOP request to apply: %lld", req_id);
		}

		del_req_id = (req_id + MAX_PER_FRAME_ARRAY -
			MAX_SYSTEM_PIPELINE_DELAY) % MAX_PER_FRAME_ARRAY;
		CAM_DBG(CAM_SENSOR, "Deleting the Request: %d", del_req_id);
		/* Change the logic dynamically */
		for (i = 0; i < MAX_PER_FRAME_ARRAY; i++) {
			if ((req_id >=
				s_ctrl->i2c_data.per_frame[i].request_id) &&
				(top <
				s_ctrl->i2c_data.per_frame[i].request_id) &&
				(s_ctrl->i2c_data.per_frame[i].
				is_settings_valid == 1)) {
				del_req_id = top;
				top = s_ctrl->i2c_data.per_frame[i].request_id;
			}
		}

		if (top < req_id) {
			if ((((top % MAX_PER_FRAME_ARRAY) - (req_id %
				MAX_PER_FRAME_ARRAY)) >= BATCH_SIZE_MAX) ||
				(((top % MAX_PER_FRAME_ARRAY) - (req_id %
				MAX_PER_FRAME_ARRAY)) <= -BATCH_SIZE_MAX))
				del_req_id = req_id;
		}

		if (!del_req_id)
			return rc;

		if ((req_id >
			 s_ctrl->i2c_data.per_frame[del_req_id].request_id) &&
			(s_ctrl->i2c_data.per_frame[del_req_id].
		CAM_DBG(CAM_SENSOR, "top: %llu, del_req_id:%llu",
			top, del_req_id);

		for (i = 0; i < MAX_PER_FRAME_ARRAY; i++) {
			if ((del_req_id >
				 s_ctrl->i2c_data.per_frame[i].request_id) &&
				(s_ctrl->i2c_data.per_frame[i].
					is_settings_valid == 1)) {
			s_ctrl->i2c_data.per_frame[del_req_id].request_id = 0;
				s_ctrl->i2c_data.per_frame[i].request_id = 0;
				rc = delete_request(
				&(s_ctrl->i2c_data.per_frame[del_req_id]));
					&(s_ctrl->i2c_data.per_frame[i]));
				if (rc < 0)
					CAM_ERR(CAM_SENSOR,
					"Delete request Fail:%d rc:%d",
						"Delete request Fail:%lld rc:%d",
						del_req_id, rc);
			}
		}
	}

	return rc;
}
+1 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
#define MAX_POWER_CONFIG 12

#define MAX_PER_FRAME_ARRAY 32
#define BATCH_SIZE_MAX      16

#define CAM_SENSOR_NAME    "cam-sensor"
#define CAM_ACTUATOR_NAME  "cam-actuator"