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

Commit 551bd22d authored by Vishalsingh Hajeri's avatar Vishalsingh Hajeri Committed by Venkat Chinta
Browse files

msm: camera: Dynamically find the request to be deleted



This change updates logic to dynamically determine which
request needs to be deleted from the hashmap based on
which request was last applied and taking into consideration
the pd delay of the device as well.

Change-Id: Ic6e3d69a63f1b16b009813f5e65dc7894daf20d7
Signed-off-by: default avatarvhajeri <vhajeri@codeaurora.org>
Signed-off-by: default avatarKarthik Anantha Ram <kartanan@codeaurora.org>
Signed-off-by: default avatarJigarkumar Zala <jzala@codeaurora.org>
Signed-off-by: default avatarVenkat Chinta <vchinta@codeaurora.org>
parent 3a2bdc26
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"