Lines Matching refs:fimc
35 static int fimc_capture_hw_init(struct fimc_dev *fimc) in fimc_capture_hw_init() argument
37 struct fimc_source_info *si = &fimc->vid_cap.source_config; in fimc_capture_hw_init()
38 struct fimc_ctx *ctx = fimc->vid_cap.ctx; in fimc_capture_hw_init()
46 ret = fimc_hw_camblk_cfg_writeback(fimc); in fimc_capture_hw_init()
51 spin_lock_irqsave(&fimc->slock, flags); in fimc_capture_hw_init()
55 fimc_hw_set_camera_polarity(fimc, si); in fimc_capture_hw_init()
56 fimc_hw_set_camera_type(fimc, si); in fimc_capture_hw_init()
57 fimc_hw_set_camera_source(fimc, si); in fimc_capture_hw_init()
58 fimc_hw_set_camera_offset(fimc, &ctx->s_frame); in fimc_capture_hw_init()
70 if (fimc->drv_data->alpha_color) in fimc_capture_hw_init()
72 clear_bit(ST_CAPT_APPLY_CFG, &fimc->state); in fimc_capture_hw_init()
74 spin_unlock_irqrestore(&fimc->slock, flags); in fimc_capture_hw_init()
86 static int fimc_capture_state_cleanup(struct fimc_dev *fimc, bool suspend) in fimc_capture_state_cleanup() argument
88 struct fimc_vid_cap *cap = &fimc->vid_cap; in fimc_capture_state_cleanup()
93 spin_lock_irqsave(&fimc->slock, flags); in fimc_capture_state_cleanup()
94 streaming = fimc->state & (1 << ST_CAPT_ISP_STREAM); in fimc_capture_state_cleanup()
96 fimc->state &= ~(1 << ST_CAPT_RUN | 1 << ST_CAPT_SHUT | in fimc_capture_state_cleanup()
99 fimc->state |= (1 << ST_CAPT_SUSPENDED); in fimc_capture_state_cleanup()
101 fimc->state &= ~(1 << ST_CAPT_PEND | 1 << ST_CAPT_SUSPENDED); in fimc_capture_state_cleanup()
117 fimc_hw_reset(fimc); in fimc_capture_state_cleanup()
120 spin_unlock_irqrestore(&fimc->slock, flags); in fimc_capture_state_cleanup()
128 static int fimc_stop_capture(struct fimc_dev *fimc, bool suspend) in fimc_stop_capture() argument
132 if (!fimc_capture_active(fimc)) in fimc_stop_capture()
135 spin_lock_irqsave(&fimc->slock, flags); in fimc_stop_capture()
136 set_bit(ST_CAPT_SHUT, &fimc->state); in fimc_stop_capture()
137 fimc_deactivate_capture(fimc); in fimc_stop_capture()
138 spin_unlock_irqrestore(&fimc->slock, flags); in fimc_stop_capture()
140 wait_event_timeout(fimc->irq_queue, in fimc_stop_capture()
141 !test_bit(ST_CAPT_SHUT, &fimc->state), in fimc_stop_capture()
144 return fimc_capture_state_cleanup(fimc, suspend); in fimc_stop_capture()
156 struct fimc_dev *fimc = ctx->fimc_dev; in fimc_capture_config_update() local
159 fimc_hw_set_camera_offset(fimc, &ctx->s_frame); in fimc_capture_config_update()
172 if (fimc->drv_data->alpha_color) in fimc_capture_config_update()
175 clear_bit(ST_CAPT_APPLY_CFG, &fimc->state); in fimc_capture_config_update()
179 void fimc_capture_irq_handler(struct fimc_dev *fimc, int deq_buf) in fimc_capture_irq_handler() argument
181 struct fimc_vid_cap *cap = &fimc->vid_cap; in fimc_capture_irq_handler()
189 if (test_and_clear_bit(ST_CAPT_SHUT, &fimc->state)) { in fimc_capture_irq_handler()
190 wake_up(&fimc->irq_queue); in fimc_capture_irq_handler()
195 test_bit(ST_CAPT_RUN, &fimc->state) && deq_buf) { in fimc_capture_irq_handler()
211 fimc_hw_set_output_addr(fimc, &v_buf->paddr, cap->buf_index); in fimc_capture_irq_handler()
218 fimc_hw_get_frame_index(fimc), v_buf->index); in fimc_capture_irq_handler()
230 s32 index = fimc_hw_get_frame_index(fimc); in fimc_capture_irq_handler()
245 clear_bit(ST_CAPT_RUN, &fimc->state); in fimc_capture_irq_handler()
250 set_bit(ST_CAPT_RUN, &fimc->state); in fimc_capture_irq_handler()
253 if (test_bit(ST_CAPT_APPLY_CFG, &fimc->state)) in fimc_capture_irq_handler()
257 fimc_deactivate_capture(fimc); in fimc_capture_irq_handler()
258 clear_bit(ST_CAPT_STREAM, &fimc->state); in fimc_capture_irq_handler()
262 fimc_hw_get_frame_index(fimc), cap->active_buf_cnt); in fimc_capture_irq_handler()
269 struct fimc_dev *fimc = ctx->fimc_dev; in start_streaming() local
270 struct fimc_vid_cap *vid_cap = &fimc->vid_cap; in start_streaming()
276 ret = fimc_capture_hw_init(fimc); in start_streaming()
278 fimc_capture_state_cleanup(fimc, false); in start_streaming()
282 set_bit(ST_CAPT_PEND, &fimc->state); in start_streaming()
284 min_bufs = fimc->vid_cap.reqbufs_count > 1 ? 2 : 1; in start_streaming()
287 !test_and_set_bit(ST_CAPT_STREAM, &fimc->state)) { in start_streaming()
290 if (!test_and_set_bit(ST_CAPT_ISP_STREAM, &fimc->state)) in start_streaming()
300 struct fimc_dev *fimc = ctx->fimc_dev; in stop_streaming() local
302 if (!fimc_capture_active(fimc)) in stop_streaming()
305 fimc_stop_capture(fimc, false); in stop_streaming()
308 int fimc_capture_suspend(struct fimc_dev *fimc) in fimc_capture_suspend() argument
310 bool suspend = fimc_capture_busy(fimc); in fimc_capture_suspend()
312 int ret = fimc_stop_capture(fimc, suspend); in fimc_capture_suspend()
315 return fimc_pipeline_call(&fimc->vid_cap.ve, close); in fimc_capture_suspend()
320 int fimc_capture_resume(struct fimc_dev *fimc) in fimc_capture_resume() argument
322 struct fimc_vid_cap *vid_cap = &fimc->vid_cap; in fimc_capture_resume()
327 if (!test_and_clear_bit(ST_CAPT_SUSPENDED, &fimc->state)) in fimc_capture_resume()
330 INIT_LIST_HEAD(&fimc->vid_cap.active_buf_q); in fimc_capture_resume()
333 fimc_capture_hw_init(fimc); in fimc_capture_resume()
335 clear_bit(ST_CAPT_SUSPENDED, &fimc->state); in fimc_capture_resume()
416 struct fimc_dev *fimc = ctx->fimc_dev; in buffer_queue() local
417 struct fimc_vid_cap *vid_cap = &fimc->vid_cap; in buffer_queue()
422 spin_lock_irqsave(&fimc->slock, flags); in buffer_queue()
425 if (!test_bit(ST_CAPT_SUSPENDED, &fimc->state) && in buffer_queue()
426 !test_bit(ST_CAPT_STREAM, &fimc->state) && in buffer_queue()
432 fimc_hw_set_output_addr(fimc, &buf->paddr, buf_id); in buffer_queue()
447 !test_and_set_bit(ST_CAPT_STREAM, &fimc->state)) { in buffer_queue()
451 spin_unlock_irqrestore(&fimc->slock, flags); in buffer_queue()
453 if (test_and_set_bit(ST_CAPT_ISP_STREAM, &fimc->state)) in buffer_queue()
461 spin_unlock_irqrestore(&fimc->slock, flags); in buffer_queue()
474 static int fimc_capture_set_default_format(struct fimc_dev *fimc);
478 struct fimc_dev *fimc = video_drvdata(file); in fimc_capture_open() local
479 struct fimc_vid_cap *vc = &fimc->vid_cap; in fimc_capture_open()
483 dbg("pid: %d, state: 0x%lx", task_pid_nr(current), fimc->state); in fimc_capture_open()
485 mutex_lock(&fimc->lock); in fimc_capture_open()
487 if (fimc_m2m_active(fimc)) in fimc_capture_open()
490 set_bit(ST_CAPT_BUSY, &fimc->state); in fimc_capture_open()
491 ret = pm_runtime_get_sync(&fimc->pdev->dev); in fimc_capture_open()
497 pm_runtime_put_sync(&fimc->pdev->dev); in fimc_capture_open()
523 ret = fimc_capture_set_default_format(fimc); in fimc_capture_open()
526 clear_bit(ST_CAPT_BUSY, &fimc->state); in fimc_capture_open()
527 pm_runtime_put_sync(&fimc->pdev->dev); in fimc_capture_open()
532 mutex_unlock(&fimc->lock); in fimc_capture_open()
538 struct fimc_dev *fimc = video_drvdata(file); in fimc_capture_release() local
539 struct fimc_vid_cap *vc = &fimc->vid_cap; in fimc_capture_release()
543 dbg("pid: %d, state: 0x%lx", task_pid_nr(current), fimc->state); in fimc_capture_release()
545 mutex_lock(&fimc->lock); in fimc_capture_release()
555 clear_bit(ST_CAPT_BUSY, &fimc->state); in fimc_capture_release()
557 clear_bit(ST_CAPT_SUSPENDED, &fimc->state); in fimc_capture_release()
564 pm_runtime_put_sync(&fimc->pdev->dev); in fimc_capture_release()
565 mutex_unlock(&fimc->lock); in fimc_capture_release()
588 struct fimc_dev *fimc = ctx->fimc_dev; in fimc_capture_try_format() local
589 const struct fimc_variant *var = fimc->variant; in fimc_capture_try_format()
665 struct fimc_dev *fimc = ctx->fimc_dev; in fimc_capture_try_selection() local
666 const struct fimc_variant *var = fimc->variant; in fimc_capture_try_selection()
734 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_querycap() local
736 __fimc_vidioc_querycap(&fimc->pdev->dev, cap, V4L2_CAP_STREAMING | in fimc_cap_querycap()
785 struct fimc_dev *fimc = ctx->fimc_dev; in fimc_pipeline_try_format() local
786 struct fimc_pipeline *p = to_fimc_pipeline(fimc->vid_cap.ve.pipe); in fimc_pipeline_try_format()
818 while (me != &fimc->vid_cap.subdev.entity) { in fimc_pipeline_try_format()
913 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_g_fmt_mplane() local
915 __fimc_get_format(&fimc->vid_cap.ctx->d_frame, f); in fimc_cap_g_fmt_mplane()
924 static int __video_try_or_set_format(struct fimc_dev *fimc, in __video_try_or_set_format() argument
930 struct fimc_vid_cap *vc = &fimc->vid_cap; in __video_try_or_set_format()
968 mf = try ? &mbus_fmt : &fimc->vid_cap.ci_fmt; in __video_try_or_set_format()
1008 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_try_fmt_mplane() local
1011 return __video_try_or_set_format(fimc, f, true, &inp_fmt, &out_fmt); in fimc_cap_try_fmt_mplane()
1028 static int __fimc_capture_set_format(struct fimc_dev *fimc, in __fimc_capture_set_format() argument
1031 struct fimc_vid_cap *vc = &fimc->vid_cap; in __fimc_capture_set_format()
1038 if (vb2_is_busy(&fimc->vid_cap.vbq)) in __fimc_capture_set_format()
1041 ret = __video_try_or_set_format(fimc, f, false, &inp_fmt, &ff->fmt); in __fimc_capture_set_format()
1073 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_s_fmt_mplane() local
1075 return __fimc_capture_set_format(fimc, f); in fimc_cap_s_fmt_mplane()
1081 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_enum_input() local
1082 struct exynos_video_entity *ve = &fimc->vid_cap.ve; in fimc_cap_enum_input()
1116 static int fimc_pipeline_validate(struct fimc_dev *fimc) in fimc_pipeline_validate() argument
1119 struct fimc_vid_cap *vc = &fimc->vid_cap; in fimc_pipeline_validate()
1198 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_streamon() local
1199 struct fimc_vid_cap *vc = &fimc->vid_cap; in fimc_cap_streamon()
1205 if (fimc_capture_active(fimc)) in fimc_cap_streamon()
1230 ret = fimc_pipeline_validate(fimc); in fimc_cap_streamon()
1249 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_streamoff() local
1250 struct fimc_vid_cap *vc = &fimc->vid_cap; in fimc_cap_streamoff()
1265 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_reqbufs() local
1271 fimc->vid_cap.reqbufs_count = reqbufs->count; in fimc_cap_reqbufs()
1279 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_g_selection() local
1280 struct fimc_ctx *ctx = fimc->vid_cap.ctx; in fimc_cap_g_selection()
1327 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_s_selection() local
1328 struct fimc_ctx *ctx = fimc->vid_cap.ctx; in fimc_cap_s_selection()
1354 spin_lock_irqsave(&fimc->slock, flags); in fimc_cap_s_selection()
1357 spin_unlock_irqrestore(&fimc->slock, flags); in fimc_cap_s_selection()
1359 set_bit(ST_CAPT_APPLY_CFG, &fimc->state); in fimc_cap_s_selection()
1396 struct fimc_dev *fimc = v4l2_get_subdevdata(sd); in fimc_link_setup() local
1397 struct fimc_vid_cap *vc = &fimc->vid_cap; in fimc_link_setup()
1403 if (WARN_ON(fimc == NULL)) in fimc_link_setup()
1408 fimc->vid_cap.input); in fimc_link_setup()
1411 fimc->vid_cap.input = 0; in fimc_link_setup()
1455 struct fimc_dev *fimc; in fimc_sensor_notify() local
1466 fimc = si ? source_to_sensor_info(si)->host : NULL; in fimc_sensor_notify()
1468 if (fimc && arg && notification == S5P_FIMC_TX_END_NOTIFY && in fimc_sensor_notify()
1469 test_bit(ST_CAPT_PEND, &fimc->state)) { in fimc_sensor_notify()
1471 spin_lock_irqsave(&fimc->slock, irq_flags); in fimc_sensor_notify()
1472 if (!list_empty(&fimc->vid_cap.active_buf_q)) { in fimc_sensor_notify()
1473 buf = list_entry(fimc->vid_cap.active_buf_q.next, in fimc_sensor_notify()
1477 fimc_capture_irq_handler(fimc, 1); in fimc_sensor_notify()
1478 fimc_deactivate_capture(fimc); in fimc_sensor_notify()
1479 spin_unlock_irqrestore(&fimc->slock, irq_flags); in fimc_sensor_notify()
1501 struct fimc_dev *fimc = v4l2_get_subdevdata(sd); in fimc_subdev_get_fmt() local
1502 struct fimc_ctx *ctx = fimc->vid_cap.ctx; in fimc_subdev_get_fmt()
1513 mutex_lock(&fimc->lock); in fimc_subdev_get_fmt()
1524 *mf = fimc->vid_cap.wb_fmt; in fimc_subdev_get_fmt()
1528 *mf = fimc->vid_cap.ci_fmt; in fimc_subdev_get_fmt()
1532 mutex_unlock(&fimc->lock); in fimc_subdev_get_fmt()
1542 struct fimc_dev *fimc = v4l2_get_subdevdata(sd); in fimc_subdev_set_fmt() local
1544 struct fimc_vid_cap *vc = &fimc->vid_cap; in fimc_subdev_set_fmt()
1555 mutex_lock(&fimc->lock); in fimc_subdev_set_fmt()
1558 mutex_unlock(&fimc->lock); in fimc_subdev_set_fmt()
1583 mutex_lock(&fimc->lock); in fimc_subdev_set_fmt()
1600 mutex_unlock(&fimc->lock); in fimc_subdev_set_fmt()
1608 struct fimc_dev *fimc = v4l2_get_subdevdata(sd); in fimc_subdev_get_selection() local
1609 struct fimc_ctx *ctx = fimc->vid_cap.ctx; in fimc_subdev_get_selection()
1617 mutex_lock(&fimc->lock); in fimc_subdev_get_selection()
1627 mutex_unlock(&fimc->lock); in fimc_subdev_get_selection()
1638 mutex_unlock(&fimc->lock); in fimc_subdev_get_selection()
1655 mutex_unlock(&fimc->lock); in fimc_subdev_get_selection()
1663 struct fimc_dev *fimc = v4l2_get_subdevdata(sd); in fimc_subdev_set_selection() local
1664 struct fimc_ctx *ctx = fimc->vid_cap.ctx; in fimc_subdev_set_selection()
1673 mutex_lock(&fimc->lock); in fimc_subdev_set_selection()
1685 mutex_unlock(&fimc->lock); in fimc_subdev_set_selection()
1692 spin_lock_irqsave(&fimc->slock, flags); in fimc_subdev_set_selection()
1694 set_bit(ST_CAPT_APPLY_CFG, &fimc->state); in fimc_subdev_set_selection()
1697 spin_unlock_irqrestore(&fimc->slock, flags); in fimc_subdev_set_selection()
1703 mutex_unlock(&fimc->lock); in fimc_subdev_set_selection()
1720 static int fimc_capture_set_default_format(struct fimc_dev *fimc) in fimc_capture_set_default_format() argument
1733 return __fimc_capture_set_format(fimc, &fmt); in fimc_capture_set_default_format()
1737 static int fimc_register_capture_device(struct fimc_dev *fimc, in fimc_register_capture_device() argument
1740 struct video_device *vfd = &fimc->vid_cap.ve.vdev; in fimc_register_capture_device()
1741 struct vb2_queue *q = &fimc->vid_cap.vbq; in fimc_register_capture_device()
1751 ctx->fimc_dev = fimc; in fimc_register_capture_device()
1759 snprintf(vfd->name, sizeof(vfd->name), "fimc.%d.capture", fimc->id); in fimc_register_capture_device()
1767 vfd->lock = &fimc->lock; in fimc_register_capture_device()
1769 video_set_drvdata(vfd, fimc); in fimc_register_capture_device()
1770 vid_cap = &fimc->vid_cap; in fimc_register_capture_device()
1786 q->lock = &fimc->lock; in fimc_register_capture_device()
1836 struct fimc_dev *fimc = v4l2_get_subdevdata(sd); in fimc_capture_subdev_registered() local
1839 if (fimc == NULL) in fimc_capture_subdev_registered()
1842 ret = fimc_register_m2m_device(fimc, sd->v4l2_dev); in fimc_capture_subdev_registered()
1846 fimc->vid_cap.ve.pipe = v4l2_get_subdev_hostdata(sd); in fimc_capture_subdev_registered()
1848 ret = fimc_register_capture_device(fimc, sd->v4l2_dev); in fimc_capture_subdev_registered()
1850 fimc_unregister_m2m_device(fimc); in fimc_capture_subdev_registered()
1851 fimc->vid_cap.ve.pipe = NULL; in fimc_capture_subdev_registered()
1859 struct fimc_dev *fimc = v4l2_get_subdevdata(sd); in fimc_capture_subdev_unregistered() local
1862 if (fimc == NULL) in fimc_capture_subdev_unregistered()
1865 mutex_lock(&fimc->lock); in fimc_capture_subdev_unregistered()
1867 fimc_unregister_m2m_device(fimc); in fimc_capture_subdev_unregistered()
1868 vdev = &fimc->vid_cap.ve.vdev; in fimc_capture_subdev_unregistered()
1873 fimc_ctrls_delete(fimc->vid_cap.ctx); in fimc_capture_subdev_unregistered()
1874 fimc->vid_cap.ve.pipe = NULL; in fimc_capture_subdev_unregistered()
1876 kfree(fimc->vid_cap.ctx); in fimc_capture_subdev_unregistered()
1877 fimc->vid_cap.ctx = NULL; in fimc_capture_subdev_unregistered()
1879 mutex_unlock(&fimc->lock); in fimc_capture_subdev_unregistered()
1887 int fimc_initialize_capture_subdev(struct fimc_dev *fimc) in fimc_initialize_capture_subdev() argument
1889 struct v4l2_subdev *sd = &fimc->vid_cap.subdev; in fimc_initialize_capture_subdev()
1894 snprintf(sd->name, sizeof(sd->name), "FIMC.%d", fimc->id); in fimc_initialize_capture_subdev()
1896 fimc->vid_cap.sd_pads[FIMC_SD_PAD_SINK_CAM].flags = MEDIA_PAD_FL_SINK; in fimc_initialize_capture_subdev()
1897 fimc->vid_cap.sd_pads[FIMC_SD_PAD_SINK_FIFO].flags = MEDIA_PAD_FL_SINK; in fimc_initialize_capture_subdev()
1898 fimc->vid_cap.sd_pads[FIMC_SD_PAD_SOURCE].flags = MEDIA_PAD_FL_SOURCE; in fimc_initialize_capture_subdev()
1900 fimc->vid_cap.sd_pads, 0); in fimc_initialize_capture_subdev()
1906 v4l2_set_subdevdata(sd, fimc); in fimc_initialize_capture_subdev()
1910 void fimc_unregister_capture_subdev(struct fimc_dev *fimc) in fimc_unregister_capture_subdev() argument
1912 struct v4l2_subdev *sd = &fimc->vid_cap.subdev; in fimc_unregister_capture_subdev()