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()
187 if (test_and_clear_bit(ST_CAPT_SHUT, &fimc->state)) { in fimc_capture_irq_handler()
188 wake_up(&fimc->irq_queue); in fimc_capture_irq_handler()
193 test_bit(ST_CAPT_RUN, &fimc->state) && deq_buf) { in fimc_capture_irq_handler()
205 fimc_hw_set_output_addr(fimc, &v_buf->paddr, cap->buf_index); in fimc_capture_irq_handler()
212 fimc_hw_get_frame_index(fimc), v_buf->index); in fimc_capture_irq_handler()
224 s32 index = fimc_hw_get_frame_index(fimc); in fimc_capture_irq_handler()
239 clear_bit(ST_CAPT_RUN, &fimc->state); in fimc_capture_irq_handler()
244 set_bit(ST_CAPT_RUN, &fimc->state); in fimc_capture_irq_handler()
247 if (test_bit(ST_CAPT_APPLY_CFG, &fimc->state)) in fimc_capture_irq_handler()
251 fimc_deactivate_capture(fimc); in fimc_capture_irq_handler()
252 clear_bit(ST_CAPT_STREAM, &fimc->state); in fimc_capture_irq_handler()
256 fimc_hw_get_frame_index(fimc), cap->active_buf_cnt); in fimc_capture_irq_handler()
263 struct fimc_dev *fimc = ctx->fimc_dev; in start_streaming() local
264 struct fimc_vid_cap *vid_cap = &fimc->vid_cap; in start_streaming()
270 ret = fimc_capture_hw_init(fimc); in start_streaming()
272 fimc_capture_state_cleanup(fimc, false); in start_streaming()
276 set_bit(ST_CAPT_PEND, &fimc->state); in start_streaming()
278 min_bufs = fimc->vid_cap.reqbufs_count > 1 ? 2 : 1; in start_streaming()
281 !test_and_set_bit(ST_CAPT_STREAM, &fimc->state)) { in start_streaming()
284 if (!test_and_set_bit(ST_CAPT_ISP_STREAM, &fimc->state)) in start_streaming()
294 struct fimc_dev *fimc = ctx->fimc_dev; in stop_streaming() local
296 if (!fimc_capture_active(fimc)) in stop_streaming()
299 fimc_stop_capture(fimc, false); in stop_streaming()
302 int fimc_capture_suspend(struct fimc_dev *fimc) in fimc_capture_suspend() argument
304 bool suspend = fimc_capture_busy(fimc); in fimc_capture_suspend()
306 int ret = fimc_stop_capture(fimc, suspend); in fimc_capture_suspend()
309 return fimc_pipeline_call(&fimc->vid_cap.ve, close); in fimc_capture_suspend()
314 int fimc_capture_resume(struct fimc_dev *fimc) in fimc_capture_resume() argument
316 struct fimc_vid_cap *vid_cap = &fimc->vid_cap; in fimc_capture_resume()
321 if (!test_and_clear_bit(ST_CAPT_SUSPENDED, &fimc->state)) in fimc_capture_resume()
324 INIT_LIST_HEAD(&fimc->vid_cap.active_buf_q); in fimc_capture_resume()
327 fimc_capture_hw_init(fimc); in fimc_capture_resume()
329 clear_bit(ST_CAPT_SUSPENDED, &fimc->state); in fimc_capture_resume()
412 struct fimc_dev *fimc = ctx->fimc_dev; in buffer_queue() local
413 struct fimc_vid_cap *vid_cap = &fimc->vid_cap; in buffer_queue()
418 spin_lock_irqsave(&fimc->slock, flags); in buffer_queue()
421 if (!test_bit(ST_CAPT_SUSPENDED, &fimc->state) && in buffer_queue()
422 !test_bit(ST_CAPT_STREAM, &fimc->state) && in buffer_queue()
428 fimc_hw_set_output_addr(fimc, &buf->paddr, buf_id); in buffer_queue()
443 !test_and_set_bit(ST_CAPT_STREAM, &fimc->state)) { in buffer_queue()
447 spin_unlock_irqrestore(&fimc->slock, flags); in buffer_queue()
449 if (test_and_set_bit(ST_CAPT_ISP_STREAM, &fimc->state)) in buffer_queue()
457 spin_unlock_irqrestore(&fimc->slock, flags); in buffer_queue()
470 static int fimc_capture_set_default_format(struct fimc_dev *fimc);
474 struct fimc_dev *fimc = video_drvdata(file); in fimc_capture_open() local
475 struct fimc_vid_cap *vc = &fimc->vid_cap; in fimc_capture_open()
479 dbg("pid: %d, state: 0x%lx", task_pid_nr(current), fimc->state); in fimc_capture_open()
481 mutex_lock(&fimc->lock); in fimc_capture_open()
483 if (fimc_m2m_active(fimc)) in fimc_capture_open()
486 set_bit(ST_CAPT_BUSY, &fimc->state); in fimc_capture_open()
487 ret = pm_runtime_get_sync(&fimc->pdev->dev); in fimc_capture_open()
493 pm_runtime_put_sync(&fimc->pdev->dev); in fimc_capture_open()
519 ret = fimc_capture_set_default_format(fimc); in fimc_capture_open()
522 clear_bit(ST_CAPT_BUSY, &fimc->state); in fimc_capture_open()
523 pm_runtime_put_sync(&fimc->pdev->dev); in fimc_capture_open()
528 mutex_unlock(&fimc->lock); in fimc_capture_open()
534 struct fimc_dev *fimc = video_drvdata(file); in fimc_capture_release() local
535 struct fimc_vid_cap *vc = &fimc->vid_cap; in fimc_capture_release()
539 dbg("pid: %d, state: 0x%lx", task_pid_nr(current), fimc->state); in fimc_capture_release()
541 mutex_lock(&fimc->lock); in fimc_capture_release()
551 clear_bit(ST_CAPT_BUSY, &fimc->state); in fimc_capture_release()
553 clear_bit(ST_CAPT_SUSPENDED, &fimc->state); in fimc_capture_release()
560 pm_runtime_put_sync(&fimc->pdev->dev); in fimc_capture_release()
561 mutex_unlock(&fimc->lock); in fimc_capture_release()
584 struct fimc_dev *fimc = ctx->fimc_dev; in fimc_capture_try_format() local
585 const struct fimc_variant *var = fimc->variant; in fimc_capture_try_format()
661 struct fimc_dev *fimc = ctx->fimc_dev; in fimc_capture_try_selection() local
662 const struct fimc_variant *var = fimc->variant; in fimc_capture_try_selection()
730 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_querycap() local
732 __fimc_vidioc_querycap(&fimc->pdev->dev, cap, V4L2_CAP_STREAMING | in fimc_cap_querycap()
781 struct fimc_dev *fimc = ctx->fimc_dev; in fimc_pipeline_try_format() local
782 struct fimc_pipeline *p = to_fimc_pipeline(fimc->vid_cap.ve.pipe); in fimc_pipeline_try_format()
814 while (me != &fimc->vid_cap.subdev.entity) { in fimc_pipeline_try_format()
909 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_g_fmt_mplane() local
911 __fimc_get_format(&fimc->vid_cap.ctx->d_frame, f); in fimc_cap_g_fmt_mplane()
920 static int __video_try_or_set_format(struct fimc_dev *fimc, in __video_try_or_set_format() argument
926 struct fimc_vid_cap *vc = &fimc->vid_cap; in __video_try_or_set_format()
964 mf = try ? &mbus_fmt : &fimc->vid_cap.ci_fmt; in __video_try_or_set_format()
1004 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_try_fmt_mplane() local
1007 return __video_try_or_set_format(fimc, f, true, &inp_fmt, &out_fmt); in fimc_cap_try_fmt_mplane()
1024 static int __fimc_capture_set_format(struct fimc_dev *fimc, in __fimc_capture_set_format() argument
1027 struct fimc_vid_cap *vc = &fimc->vid_cap; in __fimc_capture_set_format()
1034 if (vb2_is_busy(&fimc->vid_cap.vbq)) in __fimc_capture_set_format()
1037 ret = __video_try_or_set_format(fimc, f, false, &inp_fmt, &ff->fmt); in __fimc_capture_set_format()
1069 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_s_fmt_mplane() local
1071 return __fimc_capture_set_format(fimc, f); in fimc_cap_s_fmt_mplane()
1077 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_enum_input() local
1078 struct exynos_video_entity *ve = &fimc->vid_cap.ve; in fimc_cap_enum_input()
1112 static int fimc_pipeline_validate(struct fimc_dev *fimc) in fimc_pipeline_validate() argument
1115 struct fimc_vid_cap *vc = &fimc->vid_cap; in fimc_pipeline_validate()
1194 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_streamon() local
1195 struct fimc_vid_cap *vc = &fimc->vid_cap; in fimc_cap_streamon()
1201 if (fimc_capture_active(fimc)) in fimc_cap_streamon()
1226 ret = fimc_pipeline_validate(fimc); in fimc_cap_streamon()
1245 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_streamoff() local
1246 struct fimc_vid_cap *vc = &fimc->vid_cap; in fimc_cap_streamoff()
1261 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_reqbufs() local
1267 fimc->vid_cap.reqbufs_count = reqbufs->count; in fimc_cap_reqbufs()
1275 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_g_selection() local
1276 struct fimc_ctx *ctx = fimc->vid_cap.ctx; in fimc_cap_g_selection()
1323 struct fimc_dev *fimc = video_drvdata(file); in fimc_cap_s_selection() local
1324 struct fimc_ctx *ctx = fimc->vid_cap.ctx; in fimc_cap_s_selection()
1350 spin_lock_irqsave(&fimc->slock, flags); in fimc_cap_s_selection()
1353 spin_unlock_irqrestore(&fimc->slock, flags); in fimc_cap_s_selection()
1355 set_bit(ST_CAPT_APPLY_CFG, &fimc->state); in fimc_cap_s_selection()
1392 struct fimc_dev *fimc = v4l2_get_subdevdata(sd); in fimc_link_setup() local
1393 struct fimc_vid_cap *vc = &fimc->vid_cap; in fimc_link_setup()
1399 if (WARN_ON(fimc == NULL)) in fimc_link_setup()
1404 fimc->vid_cap.input); in fimc_link_setup()
1407 fimc->vid_cap.input = 0; in fimc_link_setup()
1451 struct fimc_dev *fimc; in fimc_sensor_notify() local
1462 fimc = si ? source_to_sensor_info(si)->host : NULL; in fimc_sensor_notify()
1464 if (fimc && arg && notification == S5P_FIMC_TX_END_NOTIFY && in fimc_sensor_notify()
1465 test_bit(ST_CAPT_PEND, &fimc->state)) { in fimc_sensor_notify()
1467 spin_lock_irqsave(&fimc->slock, irq_flags); in fimc_sensor_notify()
1468 if (!list_empty(&fimc->vid_cap.active_buf_q)) { in fimc_sensor_notify()
1469 buf = list_entry(fimc->vid_cap.active_buf_q.next, in fimc_sensor_notify()
1474 fimc_capture_irq_handler(fimc, 1); in fimc_sensor_notify()
1475 fimc_deactivate_capture(fimc); in fimc_sensor_notify()
1476 spin_unlock_irqrestore(&fimc->slock, irq_flags); in fimc_sensor_notify()
1498 struct fimc_dev *fimc = v4l2_get_subdevdata(sd); in fimc_subdev_get_fmt() local
1499 struct fimc_ctx *ctx = fimc->vid_cap.ctx; in fimc_subdev_get_fmt()
1510 mutex_lock(&fimc->lock); in fimc_subdev_get_fmt()
1521 *mf = fimc->vid_cap.wb_fmt; in fimc_subdev_get_fmt()
1525 *mf = fimc->vid_cap.ci_fmt; in fimc_subdev_get_fmt()
1529 mutex_unlock(&fimc->lock); in fimc_subdev_get_fmt()
1539 struct fimc_dev *fimc = v4l2_get_subdevdata(sd); in fimc_subdev_set_fmt() local
1541 struct fimc_vid_cap *vc = &fimc->vid_cap; in fimc_subdev_set_fmt()
1552 mutex_lock(&fimc->lock); in fimc_subdev_set_fmt()
1555 mutex_unlock(&fimc->lock); in fimc_subdev_set_fmt()
1580 mutex_lock(&fimc->lock); in fimc_subdev_set_fmt()
1597 mutex_unlock(&fimc->lock); in fimc_subdev_set_fmt()
1605 struct fimc_dev *fimc = v4l2_get_subdevdata(sd); in fimc_subdev_get_selection() local
1606 struct fimc_ctx *ctx = fimc->vid_cap.ctx; in fimc_subdev_get_selection()
1614 mutex_lock(&fimc->lock); in fimc_subdev_get_selection()
1624 mutex_unlock(&fimc->lock); in fimc_subdev_get_selection()
1635 mutex_unlock(&fimc->lock); in fimc_subdev_get_selection()
1652 mutex_unlock(&fimc->lock); in fimc_subdev_get_selection()
1660 struct fimc_dev *fimc = v4l2_get_subdevdata(sd); in fimc_subdev_set_selection() local
1661 struct fimc_ctx *ctx = fimc->vid_cap.ctx; in fimc_subdev_set_selection()
1670 mutex_lock(&fimc->lock); in fimc_subdev_set_selection()
1682 mutex_unlock(&fimc->lock); in fimc_subdev_set_selection()
1689 spin_lock_irqsave(&fimc->slock, flags); in fimc_subdev_set_selection()
1691 set_bit(ST_CAPT_APPLY_CFG, &fimc->state); in fimc_subdev_set_selection()
1694 spin_unlock_irqrestore(&fimc->slock, flags); in fimc_subdev_set_selection()
1700 mutex_unlock(&fimc->lock); in fimc_subdev_set_selection()
1717 static int fimc_capture_set_default_format(struct fimc_dev *fimc) in fimc_capture_set_default_format() argument
1730 return __fimc_capture_set_format(fimc, &fmt); in fimc_capture_set_default_format()
1734 static int fimc_register_capture_device(struct fimc_dev *fimc, in fimc_register_capture_device() argument
1737 struct video_device *vfd = &fimc->vid_cap.ve.vdev; in fimc_register_capture_device()
1738 struct vb2_queue *q = &fimc->vid_cap.vbq; in fimc_register_capture_device()
1748 ctx->fimc_dev = fimc; in fimc_register_capture_device()
1756 snprintf(vfd->name, sizeof(vfd->name), "fimc.%d.capture", fimc->id); in fimc_register_capture_device()
1764 vfd->lock = &fimc->lock; in fimc_register_capture_device()
1766 video_set_drvdata(vfd, fimc); in fimc_register_capture_device()
1767 vid_cap = &fimc->vid_cap; in fimc_register_capture_device()
1783 q->lock = &fimc->lock; in fimc_register_capture_device()
1833 struct fimc_dev *fimc = v4l2_get_subdevdata(sd); in fimc_capture_subdev_registered() local
1836 if (fimc == NULL) in fimc_capture_subdev_registered()
1839 ret = fimc_register_m2m_device(fimc, sd->v4l2_dev); in fimc_capture_subdev_registered()
1843 fimc->vid_cap.ve.pipe = v4l2_get_subdev_hostdata(sd); in fimc_capture_subdev_registered()
1845 ret = fimc_register_capture_device(fimc, sd->v4l2_dev); in fimc_capture_subdev_registered()
1847 fimc_unregister_m2m_device(fimc); in fimc_capture_subdev_registered()
1848 fimc->vid_cap.ve.pipe = NULL; in fimc_capture_subdev_registered()
1856 struct fimc_dev *fimc = v4l2_get_subdevdata(sd); in fimc_capture_subdev_unregistered() local
1859 if (fimc == NULL) in fimc_capture_subdev_unregistered()
1862 mutex_lock(&fimc->lock); in fimc_capture_subdev_unregistered()
1864 fimc_unregister_m2m_device(fimc); in fimc_capture_subdev_unregistered()
1865 vdev = &fimc->vid_cap.ve.vdev; in fimc_capture_subdev_unregistered()
1870 fimc_ctrls_delete(fimc->vid_cap.ctx); in fimc_capture_subdev_unregistered()
1871 fimc->vid_cap.ve.pipe = NULL; in fimc_capture_subdev_unregistered()
1873 kfree(fimc->vid_cap.ctx); in fimc_capture_subdev_unregistered()
1874 fimc->vid_cap.ctx = NULL; in fimc_capture_subdev_unregistered()
1876 mutex_unlock(&fimc->lock); in fimc_capture_subdev_unregistered()
1884 int fimc_initialize_capture_subdev(struct fimc_dev *fimc) in fimc_initialize_capture_subdev() argument
1886 struct v4l2_subdev *sd = &fimc->vid_cap.subdev; in fimc_initialize_capture_subdev()
1891 snprintf(sd->name, sizeof(sd->name), "FIMC.%d", fimc->id); in fimc_initialize_capture_subdev()
1893 fimc->vid_cap.sd_pads[FIMC_SD_PAD_SINK_CAM].flags = MEDIA_PAD_FL_SINK; in fimc_initialize_capture_subdev()
1894 fimc->vid_cap.sd_pads[FIMC_SD_PAD_SINK_FIFO].flags = MEDIA_PAD_FL_SINK; in fimc_initialize_capture_subdev()
1895 fimc->vid_cap.sd_pads[FIMC_SD_PAD_SOURCE].flags = MEDIA_PAD_FL_SOURCE; in fimc_initialize_capture_subdev()
1897 fimc->vid_cap.sd_pads, 0); in fimc_initialize_capture_subdev()
1903 v4l2_set_subdevdata(sd, fimc); in fimc_initialize_capture_subdev()
1907 void fimc_unregister_capture_subdev(struct fimc_dev *fimc) in fimc_unregister_capture_subdev() argument
1909 struct v4l2_subdev *sd = &fimc->vid_cap.subdev; in fimc_unregister_capture_subdev()