コード例 #1
0
ファイル: fimc-is-dvfs.c プロジェクト: ShedrockN4/wiliteneo
int fimc_is_dvfs_sel_static(struct fimc_is_device_ischain *device)
{
	struct fimc_is_core *core;
	struct fimc_is_dvfs_ctrl *dvfs_ctrl;
	struct fimc_is_dvfs_scenario_ctrl *static_ctrl;
	struct fimc_is_dvfs_scenario *scenarios;
	struct fimc_is_resourcemgr *resourcemgr;
	int i, scenario_id, scenario_cnt;

	BUG_ON(!device);
	BUG_ON(!device->interface);

	core = (struct fimc_is_core *)device->interface->core;
	resourcemgr = device->resourcemgr;
	dvfs_ctrl = &(resourcemgr->dvfs_ctrl);
	static_ctrl = dvfs_ctrl->static_ctrl;

	/* static scenario */
	if (!static_ctrl) {
		err("static_dvfs_ctrl is NULL\n");
		return -EINVAL;
	}

	if (static_ctrl->scenario_cnt == 0) {
		pr_debug("static_scenario's count is zero\n");
		return -EINVAL;
	}

	scenarios = static_ctrl->scenarios;
	scenario_cnt = static_ctrl->scenario_cnt;

	for (i = 0; i < scenario_cnt; i++) {
		if (!scenarios[i].check_func) {
			warn("check_func[%d] is NULL\n", i);
			continue;
		}

		if ((scenarios[i].check_func(device)) > 0) {
			scenario_id = scenarios[i].scenario_id;
			static_ctrl->cur_scenario_id = scenario_id;
			static_ctrl->cur_scenario_idx = i;
			static_ctrl->cur_frame_tick = scenarios[i].keep_frame_tick;
			return scenario_id;
		}
	}

	warn("couldn't find static dvfs scenario [sensor:(%d/%d)/fps:%d/setfile:%d/scp size:(%d/%d)]\n",
		fimc_is_get_open_sensor_cnt(core),
		device->sensor->pdev->id,
		fimc_is_sensor_g_framerate(device->sensor),
		(device->setfile & FIMC_IS_SETFILE_MASK),
		device->scp.output.width,
		device->scp.output.height);

	static_ctrl->cur_scenario_id = FIMC_IS_SN_DEFAULT;
	static_ctrl->cur_scenario_idx = -1;
	static_ctrl->cur_frame_tick = -1;

	return FIMC_IS_SN_DEFAULT;
}
コード例 #2
0
int fimc_is_dvfs_sel_scenario(u32 type, struct fimc_is_device_ischain *device, struct fimc_is_frame *frame)
{
	struct fimc_is_dvfs_ctrl *dvfs_ctrl;
	struct fimc_is_dvfs_scenario_ctrl *static_ctrl, *dynamic_ctrl;
	struct fimc_is_dvfs_scenario *scenarios;
	struct fimc_is_dvfs_scenario *cur_scenario;
	struct fimc_is_resourcemgr *resourcemgr;
	int i, scenario_id, scenario_cnt;

	if (device == NULL) {
		err("device is NULL\n");
		return -EINVAL;
	}

	resourcemgr = device->resourcemgr;
	dvfs_ctrl = &(resourcemgr->dvfs_ctrl);
	static_ctrl = dvfs_ctrl->static_ctrl;
	dynamic_ctrl = dvfs_ctrl->dynamic_ctrl;

	if (type == FIMC_IS_DYNAMIC_SN) {
		/* dynamic scenario */
		if (!dynamic_ctrl) {
			err("dynamic_dvfs_ctrl is NULL\n");
			return -EINVAL;
		}

		if (dynamic_ctrl->scenario_cnt == 0) {
			pr_debug("dynamic_scenario's count is jero\n");
			return -EINVAL;
		}

		scenarios = dynamic_ctrl->scenarios;
		scenario_cnt = dynamic_ctrl->scenario_cnt;

		if (dynamic_ctrl->cur_frame_tick >= 0) {
			(dynamic_ctrl->cur_frame_tick)--;
			/*
			 * when cur_frame_tick is lower than 0, clear current scenario.
			 * This means that current frame tick to keep dynamic scenario
			 * was expired.
			 */
			if (dynamic_ctrl->cur_frame_tick < 0) {
				dynamic_ctrl->cur_scenario_id = -1;
				dynamic_ctrl->cur_scenario_idx = -1;
			}
		}
	} else {
		/* static scenario */
		if (!static_ctrl) {
			err("static_dvfs_ctrl is NULL\n");
			return -EINVAL;
		}

		if (static_ctrl->scenario_cnt == 0) {
			pr_debug("static_scenario's count is jero\n");
			return -EINVAL;
		}

		scenarios = static_ctrl->scenarios;
		scenario_cnt = static_ctrl->scenario_cnt;
	}

	for (i = 0; i < scenario_cnt; i++) {
		if (!scenarios[i].check_func) {
			warn("check_func[%d] is NULL\n", i);
			continue;
		}

		if ((scenarios[i].check_func(device, frame)) > 0) {
			scenario_id = scenarios[i].scenario_id;

			if (type == FIMC_IS_DYNAMIC_SN) {
				cur_scenario = &scenarios[dynamic_ctrl->cur_scenario_idx];

				/*
				 * if condition 1 or 2 is true
				 * condition 1 : There's no dynamic scenario applied.
				 * condition 2 : Finded scenario's prority was higher than current
				 */
				if ((dynamic_ctrl->cur_scenario_id <= 0) ||
						(scenarios[i].priority < (cur_scenario->priority))) {
					dynamic_ctrl->cur_scenario_id = scenarios[i].scenario_id;
					dynamic_ctrl->cur_scenario_idx = i;
					dynamic_ctrl->cur_frame_tick = scenarios[i].keep_frame_tick;
				} else {
					/* if finded scenario is same */
					if (scenarios[i].priority == (cur_scenario->priority))
						dynamic_ctrl->cur_frame_tick = scenarios[i].keep_frame_tick;
					return -EAGAIN;
				}
			} else {
				static_ctrl->cur_scenario_id = scenario_id;
				static_ctrl->cur_scenario_idx = i;
				static_ctrl->cur_frame_tick = scenarios[i].keep_frame_tick;
			}

			return scenario_id;
		}
	}

	if (type == FIMC_IS_DYNAMIC_SN)
		return -EAGAIN;

	{
		struct fimc_is_core *core;
		int sensor_cnt = 0;
		core = (struct fimc_is_core *)device->interface->core;
		sensor_cnt = fimc_is_get_open_sensor_cnt(core);

		warn("couldn't find static dvfs scenario [sensor:(%d/%d)/fps:%d/setfile:%d/scp size:(%d/%d)]\n",
			sensor_cnt,
			device->sensor->pdev->id,
			fimc_is_sensor_g_framerate(device->sensor),
			(device->setfile & FIMC_IS_SETFILE_MASK),
			device->chain3_width,
			device->chain3_height);
	}

	static_ctrl->cur_scenario_id = FIMC_IS_SN_DEFAULT;
	static_ctrl->cur_scenario_idx = -1;
	static_ctrl->cur_frame_tick = -1;

	return FIMC_IS_SN_DEFAULT;
}