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; }
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; }
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; }