static int fimc_lite_streamon(struct file *file, void *priv, enum v4l2_buf_type type) { struct fimc_lite *fimc = video_drvdata(file); struct media_entity *entity = &fimc->ve.vdev.entity; int ret; if (fimc_lite_active(fimc)) return -EBUSY; ret = media_entity_pipeline_start(entity, &fimc->ve.pipe->mp); if (ret < 0) return ret; ret = fimc_pipeline_validate(fimc); if (ret < 0) goto err_p_stop; fimc->sensor = fimc_find_remote_sensor(&fimc->subdev.entity); ret = vb2_ioctl_streamon(file, priv, type); if (!ret) { fimc->streaming = true; return ret; } err_p_stop: media_entity_pipeline_stop(entity); return 0; }
static int stop_streaming(struct vb2_queue *q) { struct fimc_lite *fimc = q->drv_priv; if (!fimc_lite_active(fimc)) return -EINVAL; return fimc_lite_stop_capture(fimc, false); }
static void stop_streaming(struct vb2_queue *q) { struct fimc_lite *fimc = q->drv_priv; if (!fimc_lite_active(fimc)) return; fimc_lite_stop_capture(fimc, false); }
static int fimc_lite_suspend(struct device *dev) { struct fimc_lite *fimc = dev_get_drvdata(dev); bool suspend = test_bit(ST_FLITE_IN_USE, &fimc->state); int ret; if (test_and_set_bit(ST_LPM, &fimc->state)) return 0; ret = fimc_lite_stop_capture(fimc, suspend); if (ret < 0 || !fimc_lite_active(fimc)) return ret; return fimc_pipeline_call(fimc, close, &fimc->pipeline); }
static int fimc_lite_stop_capture(struct fimc_lite *fimc, bool suspend) { unsigned long flags; if (!fimc_lite_active(fimc)) return 0; spin_lock_irqsave(&fimc->slock, flags); set_bit(ST_FLITE_OFF, &fimc->state); flite_hw_capture_stop(fimc); spin_unlock_irqrestore(&fimc->slock, flags); wait_event_timeout(fimc->irq_queue, !test_bit(ST_FLITE_OFF, &fimc->state), (2*HZ/10)); /* 200 ms */ return fimc_lite_reinit(fimc, suspend); }
static int fimc_lite_streamon(struct file *file, void *priv, enum v4l2_buf_type type) { struct fimc_lite *fimc = video_drvdata(file); struct v4l2_subdev *sensor = fimc->pipeline.subdevs[IDX_SENSOR]; struct fimc_pipeline *p = &fimc->pipeline; int ret; if (fimc_lite_active(fimc)) return -EBUSY; ret = media_entity_pipeline_start(&sensor->entity, p->m_pipeline); if (ret < 0) return ret; ret = fimc_pipeline_validate(fimc); if (ret) { media_entity_pipeline_stop(&sensor->entity); return ret; } return vb2_streamon(&fimc->vb_queue, type); }