static int fimc_capture_close(struct file *file) { struct fimc_dev *fimc = video_drvdata(file); int ret; dbg("pid: %d, state: 0x%lx", task_pid_nr(current), fimc->state); if (mutex_lock_interruptible(&fimc->lock)) return -ERESTARTSYS; if (--fimc->vid_cap.refcnt == 0) { clear_bit(ST_CAPT_BUSY, &fimc->state); fimc_stop_capture(fimc, false); fimc_pipeline_call(fimc, close, &fimc->pipeline); clear_bit(ST_CAPT_SUSPENDED, &fimc->state); } pm_runtime_put(&fimc->pdev->dev); if (fimc->vid_cap.refcnt == 0) { vb2_queue_release(&fimc->vid_cap.vbq); fimc_ctrls_delete(fimc->vid_cap.ctx); } ret = v4l2_fh_release(file); mutex_unlock(&fimc->lock); return ret; }
static int fimc_cap_streamoff(struct file *file, void *priv, enum v4l2_buf_type type) { struct fimc_ctx *ctx = priv; struct fimc_dev *fimc = ctx->fimc_dev; struct fimc_vid_cap *cap = &fimc->vid_cap; unsigned long flags; int ret; spin_lock_irqsave(&fimc->slock, flags); if (!fimc_capture_running(fimc) && !fimc_capture_pending(fimc)) { spin_unlock_irqrestore(&fimc->slock, flags); dbg("state: 0x%lx", fimc->state); return -EINVAL; } spin_unlock_irqrestore(&fimc->slock, flags); if (mutex_lock_interruptible(&fimc->lock)) return -ERESTARTSYS; fimc_stop_capture(fimc); ret = videobuf_streamoff(&cap->vbq); mutex_unlock(&fimc->lock); return ret; }
int fimc_capture_suspend(struct fimc_dev *fimc) { bool suspend = fimc_capture_busy(fimc); int ret = fimc_stop_capture(fimc, suspend); if (ret) return ret; return fimc_pipeline_shutdown(fimc); }
int fimc_capture_suspend(struct fimc_dev *fimc) { bool suspend = fimc_capture_busy(fimc); int ret = fimc_stop_capture(fimc, suspend); if (ret) return ret; return fimc_pipeline_call(fimc, close, &fimc->pipeline); }
static int stop_streaming(struct vb2_queue *q) { struct fimc_ctx *ctx = q->drv_priv; struct fimc_dev *fimc = ctx->fimc_dev; if (!fimc_capture_active(fimc)) return -EINVAL; return fimc_stop_capture(fimc, false); }
static int fimc_capture_close(struct file *file) { struct fimc_dev *fimc = video_drvdata(file); dbg("pid: %d, state: 0x%lx", task_pid_nr(current), fimc->state); if (--fimc->vid_cap.refcnt == 0) { fimc_stop_capture(fimc); vb2_queue_release(&fimc->vid_cap.vbq); v4l2_err(&fimc->vid_cap.v4l2_dev, "releasing ISP\n"); v4l2_subdev_call(fimc->vid_cap.sd, core, s_power, 0); clk_disable(fimc->clock[CLK_CAM]); fimc_subdev_unregister(fimc); } return 0; }
static int fimc_capture_close(struct file *file) { struct fimc_dev *fimc = video_drvdata(file); dbg("pid: %d, state: 0x%lx", task_pid_nr(current), fimc->state); if (--fimc->vid_cap.refcnt == 0) { clear_bit(ST_CAPT_BUSY, &fimc->state); fimc_stop_capture(fimc, false); fimc_pipeline_shutdown(fimc); clear_bit(ST_CAPT_SUSPENDED, &fimc->state); } pm_runtime_put(&fimc->pdev->dev); if (fimc->vid_cap.refcnt == 0) { vb2_queue_release(&fimc->vid_cap.vbq); fimc_ctrls_delete(fimc->vid_cap.ctx); } return v4l2_fh_release(file); }
static int fimc_capture_close(struct file *file) { struct fimc_dev *fimc = video_drvdata(file); if (mutex_lock_interruptible(&fimc->lock)) return -ERESTARTSYS; dbg("pid: %d, state: 0x%lx", task_pid_nr(current), fimc->state); if (--fimc->vid_cap.refcnt == 0) { fimc_stop_capture(fimc); videobuf_stop(&fimc->vid_cap.vbq); videobuf_mmap_free(&fimc->vid_cap.vbq); v4l2_err(&fimc->vid_cap.v4l2_dev, "releasing ISP\n"); v4l2_subdev_call(fimc->vid_cap.sd, core, s_power, 0); fimc_subdev_unregister(fimc); } mutex_unlock(&fimc->lock); return 0; }