static int fimc_lite_resume(struct device *dev) { struct fimc_lite *fimc = dev_get_drvdata(dev); struct flite_buffer *buf; unsigned long flags; int i; spin_lock_irqsave(&fimc->slock, flags); if (!test_and_clear_bit(ST_LPM, &fimc->state) || !test_bit(ST_FLITE_IN_USE, &fimc->state)) { spin_unlock_irqrestore(&fimc->slock, flags); return 0; } flite_hw_reset(fimc); spin_unlock_irqrestore(&fimc->slock, flags); if (!test_and_clear_bit(ST_FLITE_SUSPENDED, &fimc->state)) return 0; INIT_LIST_HEAD(&fimc->active_buf_q); fimc_pipeline_call(fimc, open, &fimc->pipeline, &fimc->vfd.entity, false); fimc_lite_hw_init(fimc); clear_bit(ST_FLITE_SUSPENDED, &fimc->state); for (i = 0; i < fimc->reqbufs_count; i++) { if (list_empty(&fimc->pending_buf_q)) break; buf = fimc_lite_pending_queue_pop(fimc); buffer_queue(&buf->vb); } return 0; }
int fimc_capture_resume(struct fimc_dev *fimc) { struct fimc_vid_cap *vid_cap = &fimc->vid_cap; struct fimc_vid_buffer *buf; int i; if (!test_and_clear_bit(ST_CAPT_SUSPENDED, &fimc->state)) return 0; INIT_LIST_HEAD(&fimc->vid_cap.active_buf_q); vid_cap->buf_index = 0; fimc_pipeline_initialize(fimc, &fimc->vid_cap.vfd->entity, false); fimc_init_capture(fimc); clear_bit(ST_CAPT_SUSPENDED, &fimc->state); for (i = 0; i < vid_cap->reqbufs_count; i++) { if (list_empty(&vid_cap->pending_buf_q)) break; buf = fimc_pending_queue_pop(vid_cap); buffer_queue(&buf->vb); } return 0; }