Lines Matching refs:fimc
32 static int fimc_capture_hw_init(struct fimc_dev *fimc) in fimc_capture_hw_init() argument
34 struct fimc_source_info *si = &fimc->vid_cap.source_config; in fimc_capture_hw_init()
35 struct fimc_ctx *ctx = fimc->vid_cap.ctx; in fimc_capture_hw_init()
43 ret = fimc_hw_camblk_cfg_writeback(fimc); in fimc_capture_hw_init()
48 spin_lock_irqsave(&fimc->slock, flags); in fimc_capture_hw_init()
52 fimc_hw_set_camera_polarity(fimc, si); in fimc_capture_hw_init()
53 fimc_hw_set_camera_type(fimc, si); in fimc_capture_hw_init()
54 fimc_hw_set_camera_source(fimc, si); in fimc_capture_hw_init()
55 fimc_hw_set_camera_offset(fimc, &ctx->s_frame); in fimc_capture_hw_init()
67 if (fimc->drv_data->alpha_color) in fimc_capture_hw_init()
69 clear_bit(ST_CAPT_APPLY_CFG, &fimc->state); in fimc_capture_hw_init()
71 spin_unlock_irqrestore(&fimc->slock, flags); in fimc_capture_hw_init()
83 static int fimc_capture_state_cleanup(struct fimc_dev *fimc, bool suspend) in fimc_capture_state_cleanup() argument
85 struct fimc_vid_cap *cap = &fimc->vid_cap; in fimc_capture_state_cleanup()
90 spin_lock_irqsave(&fimc->slock, flags); in fimc_capture_state_cleanup()
91 streaming = fimc->state & (1 << ST_CAPT_ISP_STREAM); in fimc_capture_state_cleanup()
93 fimc->state &= ~(1 << ST_CAPT_RUN | 1 << ST_CAPT_SHUT | in fimc_capture_state_cleanup()
96 fimc->state |= (1 << ST_CAPT_SUSPENDED); in fimc_capture_state_cleanup()
98 fimc->state &= ~(1 << ST_CAPT_PEND | 1 << ST_CAPT_SUSPENDED); in fimc_capture_state_cleanup()
114 fimc_hw_reset(fimc); in fimc_capture_state_cleanup()
117 spin_unlock_irqrestore(&fimc->slock, flags); in fimc_capture_state_cleanup()
125 static int fimc_stop_capture(struct fimc_dev *fimc, bool suspend) in fimc_stop_capture() argument
129 if (!fimc_capture_active(fimc)) in fimc_stop_capture()
132 spin_lock_irqsave(&fimc->slock, flags); in fimc_stop_capture()
133 set_bit(ST_CAPT_SHUT, &fimc->state); in fimc_stop_capture()
134 fimc_deactivate_capture(fimc); in fimc_stop_capture()
135 spin_unlock_irqrestore(&fimc->slock, flags); in fimc_stop_capture()
137 wait_event_timeout(fimc->irq_queue, in fimc_stop_capture()
138 !test_bit(ST_CAPT_SHUT, &fimc->state), in fimc_stop_capture()
141 return fimc_capture_state_cleanup(fimc, suspend); in fimc_stop_capture()
154 struct fimc_dev *fimc = ctx->fimc_dev; in fimc_capture_config_update() local
157 fimc_hw_set_camera_offset(fimc, &ctx->s_frame); in fimc_capture_config_update()
170 if (fimc->drv_data->alpha_color) in fimc_capture_config_update()
173 clear_bit(ST_CAPT_APPLY_CFG, &fimc->state); in fimc_capture_config_update()
177 void fimc_capture_irq_handler(struct fimc_dev *fimc, int deq_buf) in fimc_capture_irq_handler() argument
179 struct fimc_vid_cap *cap = &fimc->vid_cap; in fimc_capture_irq_handler()
185 if (test_and_clear_bit(ST_CAPT_SHUT, &fimc->state)) { in fimc_capture_irq_handler()
186 wake_up(&fimc->irq_queue); in fimc_capture_irq_handler()
191 test_bit(ST_CAPT_RUN, &fimc->state) && deq_buf) { in fimc_capture_irq_handler()
203 fimc_hw_set_output_addr(fimc, &v_buf->paddr, cap->buf_index); in fimc_capture_irq_handler()
210 fimc_hw_get_frame_index(fimc), v_buf->index); in fimc_capture_irq_handler()
222 s32 index = fimc_hw_get_frame_index(fimc); in fimc_capture_irq_handler()
237 clear_bit(ST_CAPT_RUN, &fimc->state); in fimc_capture_irq_handler()
242 set_bit(ST_CAPT_RUN, &fimc->state); in fimc_capture_irq_handler()
245 if (test_bit(ST_CAPT_APPLY_CFG, &fimc->state)) in fimc_capture_irq_handler()
249 fimc_deactivate_capture(fimc); in fimc_capture_irq_handler()
250 clear_bit(ST_CAPT_STREAM, &fimc->state); in fimc_capture_irq_handler()
254 fimc_hw_get_frame_index(fimc), cap->active_buf_cnt); in fimc_capture_irq_handler()
261 struct fimc_dev *fimc = ctx->fimc_dev; in start_streaming() local
262 struct fimc_vid_cap *vid_cap = &fimc->vid_cap; in start_streaming()
268 ret = fimc_capture_hw_init(fimc); in start_streaming()
270 fimc_capture_state_cleanup(fimc, false); in start_streaming()
274 set_bit(ST_CAPT_PEND, &fimc->state); in start_streaming()
276 min_bufs = fimc->vid_cap.reqbufs_count > 1 ? 2 : 1; in start_streaming()
279 !test_and_set_bit(ST_CAPT_STREAM, &fimc->state)) { in start_streaming()
282 if (!test_and_set_bit(ST_CAPT_ISP_STREAM, &fimc->state)) in start_streaming()
292 struct fimc_dev *fimc = ctx->fimc_dev; in stop_streaming() local
294 if (!fimc_capture_active(fimc)) in stop_streaming()
297 fimc_stop_capture(fimc, false); in stop_streaming()
300 int fimc_capture_suspend(struct fimc_dev *fimc) in fimc_capture_suspend() argument
302 bool suspend = fimc_capture_busy(fimc); in fimc_capture_suspend()
304 int ret = fimc_stop_capture(fimc, suspend); in fimc_capture_suspend()
307 return fimc_pipeline_call(&fimc->vid_cap.ve, close); in fimc_capture_suspend()
312 int fimc_capture_resume(struct fimc_dev *fimc) in fimc_capture_resume() argument
314 struct fimc_vid_cap *vid_cap = &fimc->vid_cap; in fimc_capture_resume()
319 if (!test_and_clear_bit(ST_CAPT_SUSPENDED, &fimc->state)) in fimc_capture_resume()
322 INIT_LIST_HEAD(&fimc->vid_cap.active_buf_q); in fimc_capture_resume()
325 fimc_capture_hw_init(fimc); in fimc_capture_resume()
327 clear_bit(ST_CAPT_SUSPENDED, &fimc->state); in fimc_capture_resume()
405 struct fimc_dev *fimc = ctx->fimc_dev; in buffer_queue() local
406 struct fimc_vid_cap *vid_cap = &fimc->vid_cap; in buffer_queue()
411 spin_lock_irqsave(&fimc->slock, flags); in buffer_queue()
414 if (!test_bit(ST_CAPT_SUSPENDED, &fimc->state) && in buffer_queue()
415 !test_bit(ST_CAPT_STREAM, &fimc->state) && in buffer_queue()
421 fimc_hw_set_output_addr(fimc, &buf->paddr, buf_id); in buffer_queue()
436 !test_and_set_bit(ST_CAPT_STREAM, &fimc->state)) { in buffer_queue()
440 spin_unlock_irqrestore(&fimc->slock, flags); in buffer_queue()
442 if (test_and_set_bit(ST_CAPT_ISP_STREAM, &fimc->state)) in buffer_queue()
450 spin_unlock_irqrestore(&fimc->slock, flags); in buffer_queue()
463 static int fimc_capture_set_default_format(struct fimc_dev *fimc);
467 struct fimc_dev *fimc = video_drvdata(file); in fimc_capture_open() local
468 struct fimc_vid_cap *vc = &fimc->vid_cap; in fimc_capture_open()
472 dbg("pid: %d, state: 0x%lx", task_pid_nr(current), fimc->state); in fimc_capture_open()
474 mutex_lock(&fimc->lock); in fimc_capture_open()
476 if (fimc_m2m_active(fimc)) in fimc_capture_open()
479 set_bit(ST_CAPT_BUSY, &fimc->state); in fimc_capture_open()
480 ret = pm_runtime_get_sync(&fimc->pdev->dev); in fimc_capture_open()
486 pm_runtime_put_sync(&fimc->pdev->dev); in fimc_capture_open()
512 ret = fimc_capture_set_default_format(fimc); in fimc_capture_open()
515 clear_bit(ST_CAPT_BUSY, &fimc->state); in fimc_capture_open()
516 pm_runtime_put_sync(&fimc->pdev->dev); in fimc_capture_open()
521 mutex_unlock(&fimc->lock); in fimc_capture_open()
527 struct fimc_dev *fimc = video_drvdata(file); in fimc_capture_release() local
528 struct fimc_vid_cap *vc = &fimc->vid_cap; in fimc_capture_release()
532 dbg("pid: %d, state: 0x%lx", task_pid_nr(current), fimc->state); in fimc_capture_release()
534 mutex_lock(&fimc->lock); in fimc_capture_release()
544 clear_bit(ST_CAPT_BUSY, &fimc->state); in fimc_capture_release()
546 clear_bit(ST_CAPT_SUSPENDED, &fimc->state); in fimc_capture_release()
553 pm_runtime_put_sync(&fimc->pdev->dev); in fimc_capture_release()
554 mutex_unlock(&fimc->lock); in fimc_capture_release()
577 struct fimc_dev *fimc = ctx->fimc_dev; in fimc_capture_try_format() local
578 const struct fimc_variant *var = fimc->variant; in fimc_capture_try_format()
654 struct fimc_dev *fimc = ctx->fimc_dev; in fimc_capture_try_selection() local
655 const struct fimc_variant *var = fimc->variant; in fimc_capture_try_selection()
726 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_querycap() local
728 __fimc_vidioc_querycap(&fimc->pdev->dev, cap); in fimc_cap_querycap()
773 struct fimc_dev *fimc = ctx->fimc_dev; in fimc_pipeline_try_format() local
774 struct fimc_pipeline *p = to_fimc_pipeline(fimc->vid_cap.ve.pipe); in fimc_pipeline_try_format()
806 while (me != &fimc->vid_cap.subdev.entity) { in fimc_pipeline_try_format()
902 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_g_fmt_mplane() local
904 __fimc_get_format(&fimc->vid_cap.ctx->d_frame, f); in fimc_cap_g_fmt_mplane()
913 static int __video_try_or_set_format(struct fimc_dev *fimc, in __video_try_or_set_format() argument
919 struct fimc_vid_cap *vc = &fimc->vid_cap; in __video_try_or_set_format()
957 mf = try ? &mbus_fmt : &fimc->vid_cap.ci_fmt; in __video_try_or_set_format()
997 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_try_fmt_mplane() local
1000 return __video_try_or_set_format(fimc, f, true, &inp_fmt, &out_fmt); in fimc_cap_try_fmt_mplane()
1017 static int __fimc_capture_set_format(struct fimc_dev *fimc, in __fimc_capture_set_format() argument
1020 struct fimc_vid_cap *vc = &fimc->vid_cap; in __fimc_capture_set_format()
1027 if (vb2_is_busy(&fimc->vid_cap.vbq)) in __fimc_capture_set_format()
1030 ret = __video_try_or_set_format(fimc, f, false, &inp_fmt, &ff->fmt); in __fimc_capture_set_format()
1062 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_s_fmt_mplane() local
1064 return __fimc_capture_set_format(fimc, f); in fimc_cap_s_fmt_mplane()
1070 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_enum_input() local
1071 struct exynos_video_entity *ve = &fimc->vid_cap.ve; in fimc_cap_enum_input()
1106 static int fimc_pipeline_validate(struct fimc_dev *fimc) in fimc_pipeline_validate() argument
1109 struct fimc_vid_cap *vc = &fimc->vid_cap; in fimc_pipeline_validate()
1187 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_streamon() local
1188 struct fimc_vid_cap *vc = &fimc->vid_cap; in fimc_cap_streamon()
1194 if (fimc_capture_active(fimc)) in fimc_cap_streamon()
1219 ret = fimc_pipeline_validate(fimc); in fimc_cap_streamon()
1238 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_streamoff() local
1239 struct fimc_vid_cap *vc = &fimc->vid_cap; in fimc_cap_streamoff()
1254 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_reqbufs() local
1260 fimc->vid_cap.reqbufs_count = reqbufs->count; in fimc_cap_reqbufs()
1268 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_g_selection() local
1269 struct fimc_ctx *ctx = fimc->vid_cap.ctx; in fimc_cap_g_selection()
1318 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_s_selection() local
1319 struct fimc_ctx *ctx = fimc->vid_cap.ctx; in fimc_cap_s_selection()
1345 spin_lock_irqsave(&fimc->slock, flags); in fimc_cap_s_selection()
1348 spin_unlock_irqrestore(&fimc->slock, flags); in fimc_cap_s_selection()
1350 set_bit(ST_CAPT_APPLY_CFG, &fimc->state); in fimc_cap_s_selection()
1387 struct fimc_dev *fimc = v4l2_get_subdevdata(sd); in fimc_link_setup() local
1388 struct fimc_vid_cap *vc = &fimc->vid_cap; in fimc_link_setup()
1394 if (WARN_ON(fimc == NULL)) in fimc_link_setup()
1399 fimc->vid_cap.input); in fimc_link_setup()
1402 fimc->vid_cap.input = 0; in fimc_link_setup()
1446 struct fimc_dev *fimc; in fimc_sensor_notify() local
1457 fimc = si ? source_to_sensor_info(si)->host : NULL; in fimc_sensor_notify()
1459 if (fimc && arg && notification == S5P_FIMC_TX_END_NOTIFY && in fimc_sensor_notify()
1460 test_bit(ST_CAPT_PEND, &fimc->state)) { in fimc_sensor_notify()
1462 spin_lock_irqsave(&fimc->slock, irq_flags); in fimc_sensor_notify()
1463 if (!list_empty(&fimc->vid_cap.active_buf_q)) { in fimc_sensor_notify()
1464 buf = list_entry(fimc->vid_cap.active_buf_q.next, in fimc_sensor_notify()
1469 fimc_capture_irq_handler(fimc, 1); in fimc_sensor_notify()
1470 fimc_deactivate_capture(fimc); in fimc_sensor_notify()
1471 spin_unlock_irqrestore(&fimc->slock, irq_flags); in fimc_sensor_notify()
1493 struct fimc_dev *fimc = v4l2_get_subdevdata(sd); in fimc_subdev_get_fmt() local
1494 struct fimc_ctx *ctx = fimc->vid_cap.ctx; in fimc_subdev_get_fmt()
1505 mutex_lock(&fimc->lock); in fimc_subdev_get_fmt()
1516 *mf = fimc->vid_cap.wb_fmt; in fimc_subdev_get_fmt()
1520 *mf = fimc->vid_cap.ci_fmt; in fimc_subdev_get_fmt()
1524 mutex_unlock(&fimc->lock); in fimc_subdev_get_fmt()
1534 struct fimc_dev *fimc = v4l2_get_subdevdata(sd); in fimc_subdev_set_fmt() local
1536 struct fimc_vid_cap *vc = &fimc->vid_cap; in fimc_subdev_set_fmt()
1547 mutex_lock(&fimc->lock); in fimc_subdev_set_fmt()
1550 mutex_unlock(&fimc->lock); in fimc_subdev_set_fmt()
1575 mutex_lock(&fimc->lock); in fimc_subdev_set_fmt()
1592 mutex_unlock(&fimc->lock); in fimc_subdev_set_fmt()
1600 struct fimc_dev *fimc = v4l2_get_subdevdata(sd); in fimc_subdev_get_selection() local
1601 struct fimc_ctx *ctx = fimc->vid_cap.ctx; in fimc_subdev_get_selection()
1609 mutex_lock(&fimc->lock); in fimc_subdev_get_selection()
1620 mutex_unlock(&fimc->lock); in fimc_subdev_get_selection()
1631 mutex_unlock(&fimc->lock); in fimc_subdev_get_selection()
1648 mutex_unlock(&fimc->lock); in fimc_subdev_get_selection()
1656 struct fimc_dev *fimc = v4l2_get_subdevdata(sd); in fimc_subdev_set_selection() local
1657 struct fimc_ctx *ctx = fimc->vid_cap.ctx; in fimc_subdev_set_selection()
1666 mutex_lock(&fimc->lock); in fimc_subdev_set_selection()
1678 mutex_unlock(&fimc->lock); in fimc_subdev_set_selection()
1685 spin_lock_irqsave(&fimc->slock, flags); in fimc_subdev_set_selection()
1687 set_bit(ST_CAPT_APPLY_CFG, &fimc->state); in fimc_subdev_set_selection()
1690 spin_unlock_irqrestore(&fimc->slock, flags); in fimc_subdev_set_selection()
1696 mutex_unlock(&fimc->lock); in fimc_subdev_set_selection()
1713 static int fimc_capture_set_default_format(struct fimc_dev *fimc) in fimc_capture_set_default_format() argument
1726 return __fimc_capture_set_format(fimc, &fmt); in fimc_capture_set_default_format()
1730 static int fimc_register_capture_device(struct fimc_dev *fimc, in fimc_register_capture_device() argument
1733 struct video_device *vfd = &fimc->vid_cap.ve.vdev; in fimc_register_capture_device()
1734 struct vb2_queue *q = &fimc->vid_cap.vbq; in fimc_register_capture_device()
1744 ctx->fimc_dev = fimc; in fimc_register_capture_device()
1752 snprintf(vfd->name, sizeof(vfd->name), "fimc.%d.capture", fimc->id); in fimc_register_capture_device()
1760 vfd->lock = &fimc->lock; in fimc_register_capture_device()
1763 video_set_drvdata(vfd, fimc); in fimc_register_capture_device()
1764 vid_cap = &fimc->vid_cap; in fimc_register_capture_device()
1780 q->lock = &fimc->lock; in fimc_register_capture_device()
1781 q->dev = &fimc->pdev->dev; in fimc_register_capture_device()
1832 struct fimc_dev *fimc = v4l2_get_subdevdata(sd); in fimc_capture_subdev_registered() local
1835 if (fimc == NULL) in fimc_capture_subdev_registered()
1838 ret = fimc_register_m2m_device(fimc, sd->v4l2_dev); in fimc_capture_subdev_registered()
1842 fimc->vid_cap.ve.pipe = v4l2_get_subdev_hostdata(sd); in fimc_capture_subdev_registered()
1844 ret = fimc_register_capture_device(fimc, sd->v4l2_dev); in fimc_capture_subdev_registered()
1846 fimc_unregister_m2m_device(fimc); in fimc_capture_subdev_registered()
1847 fimc->vid_cap.ve.pipe = NULL; in fimc_capture_subdev_registered()
1855 struct fimc_dev *fimc = v4l2_get_subdevdata(sd); in fimc_capture_subdev_unregistered() local
1858 if (fimc == NULL) in fimc_capture_subdev_unregistered()
1861 mutex_lock(&fimc->lock); in fimc_capture_subdev_unregistered()
1863 fimc_unregister_m2m_device(fimc); in fimc_capture_subdev_unregistered()
1864 vdev = &fimc->vid_cap.ve.vdev; in fimc_capture_subdev_unregistered()
1869 fimc_ctrls_delete(fimc->vid_cap.ctx); in fimc_capture_subdev_unregistered()
1870 fimc->vid_cap.ve.pipe = NULL; in fimc_capture_subdev_unregistered()
1872 kfree(fimc->vid_cap.ctx); in fimc_capture_subdev_unregistered()
1873 fimc->vid_cap.ctx = NULL; in fimc_capture_subdev_unregistered()
1875 mutex_unlock(&fimc->lock); in fimc_capture_subdev_unregistered()
1883 int fimc_initialize_capture_subdev(struct fimc_dev *fimc) in fimc_initialize_capture_subdev() argument
1885 struct v4l2_subdev *sd = &fimc->vid_cap.subdev; in fimc_initialize_capture_subdev()
1890 snprintf(sd->name, sizeof(sd->name), "FIMC.%d", fimc->id); in fimc_initialize_capture_subdev()
1892 fimc->vid_cap.sd_pads[FIMC_SD_PAD_SINK_CAM].flags = MEDIA_PAD_FL_SINK; in fimc_initialize_capture_subdev()
1893 fimc->vid_cap.sd_pads[FIMC_SD_PAD_SINK_FIFO].flags = MEDIA_PAD_FL_SINK; in fimc_initialize_capture_subdev()
1894 fimc->vid_cap.sd_pads[FIMC_SD_PAD_SOURCE].flags = MEDIA_PAD_FL_SOURCE; in fimc_initialize_capture_subdev()
1896 fimc->vid_cap.sd_pads); in fimc_initialize_capture_subdev()
1902 v4l2_set_subdevdata(sd, fimc); in fimc_initialize_capture_subdev()
1906 void fimc_unregister_capture_subdev(struct fimc_dev *fimc) in fimc_unregister_capture_subdev() argument
1908 struct v4l2_subdev *sd = &fimc->vid_cap.subdev; in fimc_unregister_capture_subdev()