int fimc_is_video_streamoff(struct file *file, struct fimc_is_video_ctx *vctx, enum v4l2_buf_type type) { int ret = 0; u32 qcount; struct fimc_is_queue *queue; struct vb2_queue *vbq; struct fimc_is_framemgr *framemgr; BUG_ON(!file); BUG_ON(!vctx); if (!(vctx->state & BIT(FIMC_IS_VIDEO_START))) { err("[V%02d] invalid streamoff is requested(%lX)", vctx->video->id, vctx->state); return -EINVAL; } queue = GET_QUEUE(vctx); framemgr = &queue->framemgr; vbq = queue->vbq; if (!vbq) { merr("vbq is NULL", vctx); ret = -EINVAL; goto p_err; } framemgr_e_barrier_irq(framemgr, FMGR_IDX_0); qcount = framemgr->frame_req_cnt + framemgr->frame_pro_cnt + framemgr->frame_com_cnt; framemgr_x_barrier_irq(framemgr, FMGR_IDX_0); if (qcount > 0) mwarn("video%d stream off : queued buffer is not empty(%d)", vctx, vctx->video->id, qcount); if (vbq->type != type) { merr("invalid stream type(%d != %d)", vctx, vbq->type, type); ret = -EINVAL; goto p_err; } if (!vbq->streaming) { merr("streamoff: not streaming", vctx); ret = -EINVAL; goto p_err; } ret = vb2_streamoff(vbq, type); if (ret) { err("[V%02d] vb2_streamoff is fail(%d)", vctx->video->id, ret); goto p_err; } vctx->state = BIT(FIMC_IS_VIDEO_STOP); p_err: return ret; }
int fimc_is_video_dqbuf(struct file *file, struct fimc_is_video_ctx *vctx, struct v4l2_buffer *buf) { int ret = 0; u32 qcount; bool blocking; struct fimc_is_queue *queue; struct fimc_is_framemgr *framemgr; BUG_ON(!file); BUG_ON(!vctx); BUG_ON(!buf); blocking = file->f_flags & O_NONBLOCK; queue = GET_VCTX_QUEUE(vctx, buf); framemgr = &queue->framemgr; if (!queue->vbq) { merr("vbq is NULL", vctx); ret = -EINVAL; goto p_err; } if (buf->type != queue->vbq->type) { merr("buf type is invalid(%d != %d)", vctx, buf->type, queue->vbq->type); ret = -EINVAL; goto p_err; } if (!test_bit(FIMC_IS_QUEUE_STREAM_ON, &queue->state)) { merr("queue is not streamon(%ld)", vctx, queue->state); ret = -EINVAL; goto p_err; } framemgr_e_barrier_irq(framemgr, 0); qcount = framemgr->frame_req_cnt + framemgr->frame_pro_cnt + framemgr->frame_com_cnt; framemgr_x_barrier_irq(framemgr, 0); if (qcount <= 0) { /* HACK : this log is commented until timeout issue fixed */ /* merr("dqbuf can not be executed without qbuf(%d)", vctx, qcount); */ ret = -EINVAL; goto p_err; } ret = vb2_dqbuf(queue->vbq, buf, blocking); p_err: return ret; }
int fimc_is_video_streamoff(struct file *file, struct fimc_is_video_ctx *vctx, enum v4l2_buf_type type) { int ret = 0; u32 qcount; struct fimc_is_queue *queue; struct vb2_queue *vbq; struct fimc_is_framemgr *framemgr; BUG_ON(!file); BUG_ON(!vctx); queue = GET_QUEUE(vctx, type); framemgr = &queue->framemgr; vbq = queue->vbq; if (!vbq) { merr("vbq is NULL", vctx); ret = -EINVAL; goto p_err; } framemgr_e_barrier_irq(framemgr, 0); qcount = framemgr->frame_req_cnt + framemgr->frame_pro_cnt + framemgr->frame_com_cnt; framemgr_x_barrier_irq(framemgr, 0); if (qcount > 0) mwarn("video%d stream off : queued buffer is not empty(%d)", vctx, vctx->video->id, qcount); if (vbq->type != type) { merr("invalid stream type(%d != %d)", vctx, vbq->type, type); ret = -EINVAL; goto p_err; } if (!vbq->streaming) { merr("streamoff: not streaming", vctx); ret = -EINVAL; goto p_err; } ret = vb2_streamoff(vbq, type); p_err: return ret; }