Example #1
0
static int fimc_is_scc_stop_streaming(struct vb2_queue *q)
{
	int ret = 0;
	unsigned long flags;
	struct fimc_is_video_ctx *video_ctx = q->drv_priv;
	struct fimc_is_device_ischain *ischain = video_ctx->device;
	struct fimc_is_subdev *scc = &ischain->scc;
	struct fimc_is_framemgr *framemgr = &scc->framemgr;

	dbg_scc("%s\n", __func__);

	if (test_bit(FIMC_IS_VIDEO_STREAM_ON, &video_ctx->state)) {
		framemgr_e_barrier_irqs(framemgr, 0, flags);
		ret = framemgr->frame_process_cnt;
		framemgr_x_barrier_irqr(framemgr, 0, flags);
		if (ret) {
			err("being processed, can't stop");
			ret = -EINVAL;
			goto exit;
		}

		clear_bit(FIMC_IS_VIDEO_STREAM_ON, &video_ctx->state);
		clear_bit(FIMC_IS_VIDEO_BUFFER_READY, &video_ctx->state);
		clear_bit(FIMC_IS_VIDEO_BUFFER_PREPARED, &video_ctx->state);
		fimc_is_subdev_stop(scc);
	} else {
		err("already stream off");
		ret = -EINVAL;
	}

exit:
	return ret;
}
static int fimc_is_scp_video_s_ctrl(struct file *file, void *priv,
	struct v4l2_control *ctrl)
{
	int ret = 0;
	unsigned long flags;
	struct fimc_is_video_ctx *vctx = file->private_data;
	struct fimc_is_framemgr *framemgr;
	struct fimc_is_frame *frame;

	BUG_ON(!vctx);
	BUG_ON(!ctrl);

	mdbgv_scp("%s\n", vctx, __func__);

	framemgr = GET_DST_FRAMEMGR(vctx);
	frame = NULL;

	switch (ctrl->id) {
	case V4L2_CID_IS_FORCE_DONE:
		if (framemgr->frame_pro_cnt) {
			err("force done can be performed(process count %d)",
				framemgr->frame_pro_cnt);
			ret = -EINVAL;
		} else if (!framemgr->frame_req_cnt) {
			err("force done can be performed(request count %d)",
				framemgr->frame_req_cnt);
			ret = -EINVAL;
		} else {
			framemgr_e_barrier_irqs(framemgr, 0, flags);

			fimc_is_frame_request_head(framemgr, &frame);
			if (frame) {
				fimc_is_frame_trans_req_to_com(framemgr, frame);
				buffer_done(vctx, frame->index);
			} else {
				err("frame is NULL");
				ret = -EINVAL;
			}

			framemgr_x_barrier_irqr(framemgr, 0, flags);
		}
		break;
	default:
		err("unsupported ioctl(%d)\n", ctrl->id);
		ret = -EINVAL;
		break;
	}

	return ret;
}
Example #3
0
static int fimc_is_scc_video_s_ctrl(struct file *file, void *priv,
	struct v4l2_control *ctrl)
{
	int ret = 0;
	unsigned long flags;
	struct fimc_is_video_ctx *video_ctx = file->private_data;
	struct fimc_is_device_ischain *ischain = video_ctx->device;
	struct fimc_is_subdev *scc = &ischain->scc;
	struct fimc_is_framemgr *framemgr = &scc->framemgr;
	struct fimc_is_frame_shot *frame;

	dbg_scc("%s\n", __func__);

	switch (ctrl->id) {
	case V4L2_CID_IS_FORCE_DONE:
		if (framemgr->frame_process_cnt) {
			err("force done can be performed(process count %d)",
				framemgr->frame_process_cnt);
			ret = -EINVAL;
		} else if (!framemgr->frame_request_cnt) {
			err("force done can be performed(request count %d)",
				framemgr->frame_request_cnt);
			ret = -EINVAL;
		} else {
			framemgr_e_barrier_irqs(framemgr, 0, flags);

			fimc_is_frame_request_head(framemgr, &frame);
			if (frame) {
				fimc_is_frame_trans_req_to_com(framemgr, frame);
				buffer_done(video_ctx, frame->index);
			} else {
				err("frame is NULL");
				ret = -EINVAL;
			}

			framemgr_x_barrier_irqr(framemgr, 0, flags);
		}
		break;
	default:
		err("unsupported ioctl(%d)\n", ctrl->id);
		ret = -EINVAL;
		break;
	}

	return ret;
}
Example #4
0
int fimc_is_group_buffer_start(struct fimc_is_groupmgr *groupmgr,
	struct fimc_is_group *group)
{
	int ret = 0;
	unsigned long flags;
	struct fimc_is_group *group_isp;
	struct fimc_is_group *group_dis;
	struct fimc_is_framemgr *isp_framemgr, *dis_framemgr;
	struct fimc_is_framemgr *framemgr;

	mutex_lock(&groupmgr->mutex_group);

	if (!groupmgr) {
		err("groupmgr is NULL");
		ret = -EINVAL;
		goto exit;
	}

	if (!group) {
		err("group is NULL");
		ret = -EINVAL;
		goto exit;
	}

	framemgr = &group->leader.framemgr;
	group_isp = groupmgr->group_isp;
	group_dis = groupmgr->group_dis;
	isp_framemgr = &group_isp->leader.framemgr;
	dis_framemgr = &group_dis->leader.framemgr;

	/* 1. check group ready */
	framemgr_e_barrier_irqs(framemgr, index, flags);

	if (framemgr->frame_request_cnt > 0)
		set_bit(FIMC_IS_GROUP_READY, &group->state);
	else
		clear_bit(FIMC_IS_GROUP_READY, &group->state);

	framemgr_x_barrier_irqr(framemgr, index, flags);

	/*
	 * TODO: this code will be used in the future
	 * if (groupmgr->group_skip_cnt)
	 * 	groupmgr->group_skip_cnt--;
	 * else {
	 * 	if (!test_bit(FIMC_IS_GROUP_READY, &group_isp->state) ||
	 * 		!test_bit(FIMC_IS_GROUP_READY, &group_dis->state)) {
	 * 		err("all group is not ready");
	 * 		goto exit;
	 * 	}
	 * }
	 */

	if (test_bit(FIMC_IS_GROUP_READY, &group_isp->state) &&
		!test_bit(FIMC_IS_GROUP_RUN, &group_isp->state)) {
		ret = fimc_is_ischain_isp_callback(groupmgr->private_data);
		if (ret) {
			err("fimc_is_ischain_isp_callback is fail");
			goto exit;
		}

		set_bit(FIMC_IS_GROUP_RUN, &group_isp->state);

		framemgr_e_barrier_irqs(isp_framemgr, 0, flags);
		if (!isp_framemgr->frame_request_cnt)
			clear_bit(FIMC_IS_GROUP_READY, &group_isp->state);
		framemgr_x_barrier_irqr(isp_framemgr, 0, flags);
	}

	if (test_bit(FIMC_IS_GROUP_READY, &group_dis->state) &&
		!test_bit(FIMC_IS_GROUP_RUN, &group_dis->state)) {
		ret = fimc_is_ischain_dis_callback(groupmgr->private_data);
		if (ret) {
			err("fimc_is_ischain_dis_callback is fail");
			goto exit;
		}

		set_bit(FIMC_IS_GROUP_RUN, &group_dis->state);

		framemgr_e_barrier_irqs(dis_framemgr, 0, flags);
		if (!dis_framemgr->frame_request_cnt)
			clear_bit(FIMC_IS_GROUP_READY, &group_dis->state);
		framemgr_x_barrier_irqr(dis_framemgr, 0, flags);
	}

exit:
	mutex_unlock(&groupmgr->mutex_group);
	return ret;
}
static int fimc_is_scp_video_s_ctrl(struct file *file, void *priv,
	struct v4l2_control *ctrl)
{
	int ret = 0;
	unsigned long flags;
	struct fimc_is_video_ctx *vctx = file->private_data;
	struct fimc_is_device_ischain *device;
	struct fimc_is_framemgr *framemgr;
	struct fimc_is_frame *frame;

	BUG_ON(!vctx);
	BUG_ON(!ctrl);

	mdbgv_scp("%s\n", vctx, __func__);

	device = vctx->device;
	if (!device) {
		merr("device is NULL", vctx);
		ret = -EINVAL;
		goto p_err;
	}

	framemgr = GET_DST_FRAMEMGR(vctx);
	frame = NULL;

	switch (ctrl->id) {
	case V4L2_CID_IS_FORCE_DONE:
		if (framemgr->frame_pro_cnt) {
			err("force done can be performed(process count %d)",
				framemgr->frame_pro_cnt);
			ret = -EINVAL;
		} else if (!framemgr->frame_req_cnt) {
			err("force done can be performed(request count %d)",
				framemgr->frame_req_cnt);
			ret = -EINVAL;
		} else {
			framemgr_e_barrier_irqs(framemgr, 0, flags);

			fimc_is_frame_request_head(framemgr, &frame);
			if (frame) {
				fimc_is_frame_trans_req_to_com(framemgr, frame);
				buffer_done(vctx, frame->index);
			} else {
				err("frame is NULL");
				ret = -EINVAL;
			}

			framemgr_x_barrier_irqr(framemgr, 0, flags);
		}
		break;
	case V4L2_CID_IS_COLOR_RANGE:
		if (test_bit(FIMC_IS_SUBDEV_START, &device->group_isp.leader.state)) {
			err("failed to change color range: device started already (0x%08x)",
					ctrl->value);
			ret = -EINVAL;
		} else {
			device->setfile &= ~FIMC_IS_SCP_CRANGE_MASK;

			if (ctrl->value)
				device->setfile	|=
					(FIMC_IS_CRANGE_LIMITED << FIMC_IS_SCP_CRANGE_SHIFT);
		}
		break;
	default:
		err("unsupported ioctl(%d)\n", ctrl->id);
		ret = -EINVAL;
		break;
	}

p_err:
	return ret;
}