2 * Samsung EXYNOS4x12 FIMC-IS (Imaging Subsystem) driver
4 * FIMC-IS ISP video input and video output DMA interface driver
6 * Copyright (C) 2013 Samsung Electronics Co., Ltd.
7 * Author: Sylwester Nawrocki <s.nawrocki@samsung.com>
9 * The hardware handling code derived from a driver written by
10 * Younghwan Joo <yhwan.joo@samsung.com>.
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License version 2 as
14 * published by the Free Software Foundation.
17 #include <linux/bitops.h>
18 #include <linux/device.h>
19 #include <linux/delay.h>
20 #include <linux/errno.h>
21 #include <linux/kernel.h>
22 #include <linux/module.h>
23 #include <linux/types.h>
24 #include <linux/printk.h>
25 #include <linux/pm_runtime.h>
26 #include <linux/slab.h>
27 #include <linux/videodev2.h>
29 #include <media/v4l2-device.h>
30 #include <media/v4l2-ioctl.h>
31 #include <media/videobuf2-v4l2.h>
32 #include <media/videobuf2-dma-contig.h>
33 #include <media/drv-intf/exynos-fimc.h>
36 #include "media-dev.h"
38 #include "fimc-isp-video.h"
39 #include "fimc-is-param.h"
41 static int isp_video_capture_queue_setup(struct vb2_queue
*vq
,
42 unsigned int *num_buffers
, unsigned int *num_planes
,
43 unsigned int sizes
[], void *allocators
[])
45 struct fimc_isp
*isp
= vb2_get_drv_priv(vq
);
46 struct v4l2_pix_format_mplane
*vid_fmt
= &isp
->video_capture
.pixfmt
;
47 const struct fimc_fmt
*fmt
= isp
->video_capture
.format
;
50 wh
= vid_fmt
->width
* vid_fmt
->height
;
55 *num_buffers
= clamp_t(u32
, *num_buffers
, FIMC_ISP_REQ_BUFS_MIN
,
56 FIMC_ISP_REQ_BUFS_MAX
);
58 if (*num_planes
!= fmt
->memplanes
)
60 for (i
= 0; i
< *num_planes
; i
++) {
61 if (sizes
[i
] < (wh
* fmt
->depth
[i
]) / 8)
63 allocators
[i
] = isp
->alloc_ctx
;
68 *num_planes
= fmt
->memplanes
;
70 for (i
= 0; i
< fmt
->memplanes
; i
++) {
71 sizes
[i
] = (wh
* fmt
->depth
[i
]) / 8;
72 allocators
[i
] = isp
->alloc_ctx
;
78 static inline struct param_dma_output
*__get_isp_dma2(struct fimc_is
*is
)
80 return &__get_curr_is_config(is
)->isp
.dma2_output
;
83 static int isp_video_capture_start_streaming(struct vb2_queue
*q
,
86 struct fimc_isp
*isp
= vb2_get_drv_priv(q
);
87 struct fimc_is
*is
= fimc_isp_to_is(isp
);
88 struct param_dma_output
*dma
= __get_isp_dma2(is
);
89 struct fimc_is_video
*video
= &isp
->video_capture
;
92 if (!test_bit(ST_ISP_VID_CAP_BUF_PREP
, &isp
->state
) ||
93 test_bit(ST_ISP_VID_CAP_STREAMING
, &isp
->state
))
97 dma
->cmd
= DMA_OUTPUT_COMMAND_ENABLE
;
98 dma
->notify_dma_done
= DMA_OUTPUT_NOTIFY_DMA_DONE_ENABLE
;
99 dma
->buffer_address
= is
->is_dma_p_region
+
100 DMA2_OUTPUT_ADDR_ARRAY_OFFS
;
101 dma
->buffer_number
= video
->reqbufs_count
;
102 dma
->dma_out_mask
= video
->buf_mask
;
104 isp_dbg(2, &video
->ve
.vdev
,
105 "buf_count: %d, planes: %d, dma addr table: %#x\n",
106 video
->buf_count
, video
->format
->memplanes
,
107 dma
->buffer_address
);
109 fimc_is_mem_barrier();
111 fimc_is_set_param_bit(is
, PARAM_ISP_DMA2_OUTPUT
);
112 __fimc_is_hw_update_param(is
, PARAM_ISP_DMA2_OUTPUT
);
114 ret
= fimc_is_itf_s_param(is
, false);
118 ret
= fimc_pipeline_call(&video
->ve
, set_stream
, 1);
122 set_bit(ST_ISP_VID_CAP_STREAMING
, &isp
->state
);
126 static void isp_video_capture_stop_streaming(struct vb2_queue
*q
)
128 struct fimc_isp
*isp
= vb2_get_drv_priv(q
);
129 struct fimc_is
*is
= fimc_isp_to_is(isp
);
130 struct param_dma_output
*dma
= __get_isp_dma2(is
);
133 ret
= fimc_pipeline_call(&isp
->video_capture
.ve
, set_stream
, 0);
137 dma
->cmd
= DMA_OUTPUT_COMMAND_DISABLE
;
138 dma
->notify_dma_done
= DMA_OUTPUT_NOTIFY_DMA_DONE_DISABLE
;
139 dma
->buffer_number
= 0;
140 dma
->buffer_address
= 0;
141 dma
->dma_out_mask
= 0;
143 fimc_is_set_param_bit(is
, PARAM_ISP_DMA2_OUTPUT
);
144 __fimc_is_hw_update_param(is
, PARAM_ISP_DMA2_OUTPUT
);
146 ret
= fimc_is_itf_s_param(is
, false);
148 dev_warn(&is
->pdev
->dev
, "%s: DMA stop failed\n", __func__
);
150 fimc_is_hw_set_isp_buf_mask(is
, 0);
152 clear_bit(ST_ISP_VID_CAP_BUF_PREP
, &isp
->state
);
153 clear_bit(ST_ISP_VID_CAP_STREAMING
, &isp
->state
);
155 isp
->video_capture
.buf_count
= 0;
158 static int isp_video_capture_buffer_prepare(struct vb2_buffer
*vb
)
160 struct fimc_isp
*isp
= vb2_get_drv_priv(vb
->vb2_queue
);
161 struct fimc_is_video
*video
= &isp
->video_capture
;
164 if (video
->format
== NULL
)
167 for (i
= 0; i
< video
->format
->memplanes
; i
++) {
168 unsigned long size
= video
->pixfmt
.plane_fmt
[i
].sizeimage
;
170 if (vb2_plane_size(vb
, i
) < size
) {
171 v4l2_err(&video
->ve
.vdev
,
172 "User buffer too small (%ld < %ld)\n",
173 vb2_plane_size(vb
, i
), size
);
176 vb2_set_plane_payload(vb
, i
, size
);
179 /* Check if we get one of the already known buffers. */
180 if (test_bit(ST_ISP_VID_CAP_BUF_PREP
, &isp
->state
)) {
181 dma_addr_t dma_addr
= vb2_dma_contig_plane_dma_addr(vb
, 0);
184 for (i
= 0; i
< video
->buf_count
; i
++)
185 if (video
->buffers
[i
]->dma_addr
[0] == dma_addr
)
193 static void isp_video_capture_buffer_queue(struct vb2_buffer
*vb
)
195 struct vb2_v4l2_buffer
*vbuf
= to_vb2_v4l2_buffer(vb
);
196 struct fimc_isp
*isp
= vb2_get_drv_priv(vb
->vb2_queue
);
197 struct fimc_is_video
*video
= &isp
->video_capture
;
198 struct fimc_is
*is
= fimc_isp_to_is(isp
);
199 struct isp_video_buf
*ivb
= to_isp_video_buf(vbuf
);
203 if (test_bit(ST_ISP_VID_CAP_BUF_PREP
, &isp
->state
)) {
204 spin_lock_irqsave(&is
->slock
, flags
);
205 video
->buf_mask
|= BIT(ivb
->index
);
206 spin_unlock_irqrestore(&is
->slock
, flags
);
208 unsigned int num_planes
= video
->format
->memplanes
;
210 ivb
->index
= video
->buf_count
;
211 video
->buffers
[ivb
->index
] = ivb
;
213 for (i
= 0; i
< num_planes
; i
++) {
214 int buf_index
= ivb
->index
* num_planes
+ i
;
216 ivb
->dma_addr
[i
] = vb2_dma_contig_plane_dma_addr(vb
, i
);
217 is
->is_p_region
->shared
[32 + buf_index
] =
220 isp_dbg(2, &video
->ve
.vdev
,
221 "dma_buf %d (%d/%d/%d) addr: %pad\n",
222 buf_index
, ivb
->index
, i
, vb
->index
,
226 if (++video
->buf_count
< video
->reqbufs_count
)
229 video
->buf_mask
= (1UL << video
->buf_count
) - 1;
230 set_bit(ST_ISP_VID_CAP_BUF_PREP
, &isp
->state
);
233 if (!test_bit(ST_ISP_VID_CAP_STREAMING
, &isp
->state
))
234 isp_video_capture_start_streaming(vb
->vb2_queue
, 0);
238 * FIMC-IS ISP input and output DMA interface interrupt handler.
239 * Locking: called with is->slock spinlock held.
241 void fimc_isp_video_irq_handler(struct fimc_is
*is
)
243 struct fimc_is_video
*video
= &is
->isp
.video_capture
;
244 struct vb2_v4l2_buffer
*vbuf
;
247 /* TODO: Ensure the DMA is really stopped in stop_streaming callback */
248 if (!test_bit(ST_ISP_VID_CAP_STREAMING
, &is
->isp
.state
))
251 buf_index
= (is
->i2h_cmd
.args
[1] - 1) % video
->buf_count
;
252 vbuf
= &video
->buffers
[buf_index
]->vb
;
254 vbuf
->vb2_buf
.timestamp
= ktime_get_ns();
255 vb2_buffer_done(&vbuf
->vb2_buf
, VB2_BUF_STATE_DONE
);
257 video
->buf_mask
&= ~BIT(buf_index
);
258 fimc_is_hw_set_isp_buf_mask(is
, video
->buf_mask
);
261 static const struct vb2_ops isp_video_capture_qops
= {
262 .queue_setup
= isp_video_capture_queue_setup
,
263 .buf_prepare
= isp_video_capture_buffer_prepare
,
264 .buf_queue
= isp_video_capture_buffer_queue
,
265 .wait_prepare
= vb2_ops_wait_prepare
,
266 .wait_finish
= vb2_ops_wait_finish
,
267 .start_streaming
= isp_video_capture_start_streaming
,
268 .stop_streaming
= isp_video_capture_stop_streaming
,
271 static int isp_video_open(struct file
*file
)
273 struct fimc_isp
*isp
= video_drvdata(file
);
274 struct exynos_video_entity
*ve
= &isp
->video_capture
.ve
;
275 struct media_entity
*me
= &ve
->vdev
.entity
;
278 if (mutex_lock_interruptible(&isp
->video_lock
))
281 ret
= v4l2_fh_open(file
);
285 ret
= pm_runtime_get_sync(&isp
->pdev
->dev
);
289 if (v4l2_fh_is_singular_file(file
)) {
290 mutex_lock(&me
->graph_obj
.mdev
->graph_mutex
);
292 ret
= fimc_pipeline_call(ve
, open
, me
, true);
294 /* Mark the video pipeline as in use. */
298 mutex_unlock(&me
->graph_obj
.mdev
->graph_mutex
);
303 v4l2_fh_release(file
);
305 mutex_unlock(&isp
->video_lock
);
309 static int isp_video_release(struct file
*file
)
311 struct fimc_isp
*isp
= video_drvdata(file
);
312 struct fimc_is_video
*ivc
= &isp
->video_capture
;
313 struct media_entity
*entity
= &ivc
->ve
.vdev
.entity
;
314 struct media_device
*mdev
= entity
->graph_obj
.mdev
;
316 mutex_lock(&isp
->video_lock
);
318 if (v4l2_fh_is_singular_file(file
) && ivc
->streaming
) {
319 media_entity_pipeline_stop(entity
);
323 vb2_fop_release(file
);
325 if (v4l2_fh_is_singular_file(file
)) {
326 fimc_pipeline_call(&ivc
->ve
, close
);
328 mutex_lock(&mdev
->graph_mutex
);
330 mutex_unlock(&mdev
->graph_mutex
);
333 pm_runtime_put(&isp
->pdev
->dev
);
334 mutex_unlock(&isp
->video_lock
);
339 static const struct v4l2_file_operations isp_video_fops
= {
340 .owner
= THIS_MODULE
,
341 .open
= isp_video_open
,
342 .release
= isp_video_release
,
343 .poll
= vb2_fop_poll
,
344 .unlocked_ioctl
= video_ioctl2
,
345 .mmap
= vb2_fop_mmap
,
349 * Video node ioctl operations
351 static int isp_video_querycap(struct file
*file
, void *priv
,
352 struct v4l2_capability
*cap
)
354 struct fimc_isp
*isp
= video_drvdata(file
);
356 __fimc_vidioc_querycap(&isp
->pdev
->dev
, cap
, V4L2_CAP_STREAMING
);
360 static int isp_video_enum_fmt_mplane(struct file
*file
, void *priv
,
361 struct v4l2_fmtdesc
*f
)
363 const struct fimc_fmt
*fmt
;
365 if (f
->index
>= FIMC_ISP_NUM_FORMATS
)
368 fmt
= fimc_isp_find_format(NULL
, NULL
, f
->index
);
369 if (WARN_ON(fmt
== NULL
))
372 strlcpy(f
->description
, fmt
->name
, sizeof(f
->description
));
373 f
->pixelformat
= fmt
->fourcc
;
378 static int isp_video_g_fmt_mplane(struct file
*file
, void *fh
,
379 struct v4l2_format
*f
)
381 struct fimc_isp
*isp
= video_drvdata(file
);
383 f
->fmt
.pix_mp
= isp
->video_capture
.pixfmt
;
387 static void __isp_video_try_fmt(struct fimc_isp
*isp
,
388 struct v4l2_pix_format_mplane
*pixm
,
389 const struct fimc_fmt
**fmt
)
391 *fmt
= fimc_isp_find_format(&pixm
->pixelformat
, NULL
, 2);
393 pixm
->colorspace
= V4L2_COLORSPACE_SRGB
;
394 pixm
->field
= V4L2_FIELD_NONE
;
395 pixm
->num_planes
= (*fmt
)->memplanes
;
396 pixm
->pixelformat
= (*fmt
)->fourcc
;
398 * TODO: double check with the docmentation these width/height
399 * constraints are correct.
401 v4l_bound_align_image(&pixm
->width
, FIMC_ISP_SOURCE_WIDTH_MIN
,
402 FIMC_ISP_SOURCE_WIDTH_MAX
, 3,
403 &pixm
->height
, FIMC_ISP_SOURCE_HEIGHT_MIN
,
404 FIMC_ISP_SOURCE_HEIGHT_MAX
, 0, 0);
407 static int isp_video_try_fmt_mplane(struct file
*file
, void *fh
,
408 struct v4l2_format
*f
)
410 struct fimc_isp
*isp
= video_drvdata(file
);
412 __isp_video_try_fmt(isp
, &f
->fmt
.pix_mp
, NULL
);
416 static int isp_video_s_fmt_mplane(struct file
*file
, void *priv
,
417 struct v4l2_format
*f
)
419 struct fimc_isp
*isp
= video_drvdata(file
);
420 struct fimc_is
*is
= fimc_isp_to_is(isp
);
421 struct v4l2_pix_format_mplane
*pixm
= &f
->fmt
.pix_mp
;
422 const struct fimc_fmt
*ifmt
= NULL
;
423 struct param_dma_output
*dma
= __get_isp_dma2(is
);
425 __isp_video_try_fmt(isp
, pixm
, &ifmt
);
427 if (WARN_ON(ifmt
== NULL
))
430 dma
->format
= DMA_OUTPUT_FORMAT_BAYER
;
431 dma
->order
= DMA_OUTPUT_ORDER_GB_BG
;
432 dma
->plane
= ifmt
->memplanes
;
433 dma
->bitwidth
= ifmt
->depth
[0];
434 dma
->width
= pixm
->width
;
435 dma
->height
= pixm
->height
;
437 fimc_is_mem_barrier();
439 isp
->video_capture
.format
= ifmt
;
440 isp
->video_capture
.pixfmt
= *pixm
;
446 * Check for source/sink format differences at each link.
447 * Return 0 if the formats match or -EPIPE otherwise.
449 static int isp_video_pipeline_validate(struct fimc_isp
*isp
)
451 struct v4l2_subdev
*sd
= &isp
->subdev
;
452 struct v4l2_subdev_format sink_fmt
, src_fmt
;
453 struct media_pad
*pad
;
457 /* Retrieve format at the sink pad */
458 pad
= &sd
->entity
.pads
[0];
459 if (!(pad
->flags
& MEDIA_PAD_FL_SINK
))
461 sink_fmt
.pad
= pad
->index
;
462 sink_fmt
.which
= V4L2_SUBDEV_FORMAT_ACTIVE
;
463 ret
= v4l2_subdev_call(sd
, pad
, get_fmt
, NULL
, &sink_fmt
);
464 if (ret
< 0 && ret
!= -ENOIOCTLCMD
)
467 /* Retrieve format at the source pad */
468 pad
= media_entity_remote_pad(pad
);
469 if (!pad
|| !is_media_entity_v4l2_subdev(pad
->entity
))
472 sd
= media_entity_to_v4l2_subdev(pad
->entity
);
473 src_fmt
.pad
= pad
->index
;
474 src_fmt
.which
= V4L2_SUBDEV_FORMAT_ACTIVE
;
475 ret
= v4l2_subdev_call(sd
, pad
, get_fmt
, NULL
, &src_fmt
);
476 if (ret
< 0 && ret
!= -ENOIOCTLCMD
)
479 if (src_fmt
.format
.width
!= sink_fmt
.format
.width
||
480 src_fmt
.format
.height
!= sink_fmt
.format
.height
||
481 src_fmt
.format
.code
!= sink_fmt
.format
.code
)
488 static int isp_video_streamon(struct file
*file
, void *priv
,
489 enum v4l2_buf_type type
)
491 struct fimc_isp
*isp
= video_drvdata(file
);
492 struct exynos_video_entity
*ve
= &isp
->video_capture
.ve
;
493 struct media_entity
*me
= &ve
->vdev
.entity
;
496 ret
= media_entity_pipeline_start(me
, &ve
->pipe
->mp
);
500 ret
= isp_video_pipeline_validate(isp
);
504 ret
= vb2_ioctl_streamon(file
, priv
, type
);
508 isp
->video_capture
.streaming
= 1;
511 media_entity_pipeline_stop(me
);
515 static int isp_video_streamoff(struct file
*file
, void *priv
,
516 enum v4l2_buf_type type
)
518 struct fimc_isp
*isp
= video_drvdata(file
);
519 struct fimc_is_video
*video
= &isp
->video_capture
;
522 ret
= vb2_ioctl_streamoff(file
, priv
, type
);
526 media_entity_pipeline_stop(&video
->ve
.vdev
.entity
);
527 video
->streaming
= 0;
531 static int isp_video_reqbufs(struct file
*file
, void *priv
,
532 struct v4l2_requestbuffers
*rb
)
534 struct fimc_isp
*isp
= video_drvdata(file
);
537 ret
= vb2_ioctl_reqbufs(file
, priv
, rb
);
541 if (rb
->count
&& rb
->count
< FIMC_ISP_REQ_BUFS_MIN
) {
543 vb2_ioctl_reqbufs(file
, priv
, rb
);
547 isp
->video_capture
.reqbufs_count
= rb
->count
;
551 static const struct v4l2_ioctl_ops isp_video_ioctl_ops
= {
552 .vidioc_querycap
= isp_video_querycap
,
553 .vidioc_enum_fmt_vid_cap_mplane
= isp_video_enum_fmt_mplane
,
554 .vidioc_try_fmt_vid_cap_mplane
= isp_video_try_fmt_mplane
,
555 .vidioc_s_fmt_vid_cap_mplane
= isp_video_s_fmt_mplane
,
556 .vidioc_g_fmt_vid_cap_mplane
= isp_video_g_fmt_mplane
,
557 .vidioc_reqbufs
= isp_video_reqbufs
,
558 .vidioc_querybuf
= vb2_ioctl_querybuf
,
559 .vidioc_prepare_buf
= vb2_ioctl_prepare_buf
,
560 .vidioc_create_bufs
= vb2_ioctl_create_bufs
,
561 .vidioc_qbuf
= vb2_ioctl_qbuf
,
562 .vidioc_dqbuf
= vb2_ioctl_dqbuf
,
563 .vidioc_streamon
= isp_video_streamon
,
564 .vidioc_streamoff
= isp_video_streamoff
,
567 int fimc_isp_video_device_register(struct fimc_isp
*isp
,
568 struct v4l2_device
*v4l2_dev
,
569 enum v4l2_buf_type type
)
571 struct vb2_queue
*q
= &isp
->video_capture
.vb_queue
;
572 struct fimc_is_video
*iv
;
573 struct video_device
*vdev
;
576 if (type
== V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
)
577 iv
= &isp
->video_capture
;
581 mutex_init(&isp
->video_lock
);
582 INIT_LIST_HEAD(&iv
->pending_buf_q
);
583 INIT_LIST_HEAD(&iv
->active_buf_q
);
584 iv
->format
= fimc_isp_find_format(NULL
, NULL
, 0);
585 iv
->pixfmt
.width
= IS_DEFAULT_WIDTH
;
586 iv
->pixfmt
.height
= IS_DEFAULT_HEIGHT
;
587 iv
->pixfmt
.pixelformat
= iv
->format
->fourcc
;
588 iv
->pixfmt
.colorspace
= V4L2_COLORSPACE_SRGB
;
589 iv
->reqbufs_count
= 0;
591 memset(q
, 0, sizeof(*q
));
593 q
->io_modes
= VB2_MMAP
| VB2_USERPTR
;
594 q
->ops
= &isp_video_capture_qops
;
595 q
->mem_ops
= &vb2_dma_contig_memops
;
596 q
->buf_struct_size
= sizeof(struct isp_video_buf
);
598 q
->timestamp_flags
= V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC
;
599 q
->lock
= &isp
->video_lock
;
601 ret
= vb2_queue_init(q
);
606 memset(vdev
, 0, sizeof(*vdev
));
607 snprintf(vdev
->name
, sizeof(vdev
->name
), "fimc-is-isp.%s",
608 type
== V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
?
609 "capture" : "output");
611 vdev
->fops
= &isp_video_fops
;
612 vdev
->ioctl_ops
= &isp_video_ioctl_ops
;
613 vdev
->v4l2_dev
= v4l2_dev
;
615 vdev
->release
= video_device_release_empty
;
616 vdev
->lock
= &isp
->video_lock
;
618 iv
->pad
.flags
= MEDIA_PAD_FL_SINK
;
619 ret
= media_entity_pads_init(&vdev
->entity
, 1, &iv
->pad
);
623 video_set_drvdata(vdev
, isp
);
625 ret
= video_register_device(vdev
, VFL_TYPE_GRABBER
, -1);
627 media_entity_cleanup(&vdev
->entity
);
631 v4l2_info(v4l2_dev
, "Registered %s as /dev/%s\n",
632 vdev
->name
, video_device_node_name(vdev
));
637 void fimc_isp_video_device_unregister(struct fimc_isp
*isp
,
638 enum v4l2_buf_type type
)
640 struct exynos_video_entity
*ve
;
642 if (type
== V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
)
643 ve
= &isp
->video_capture
.ve
;
647 mutex_lock(&isp
->video_lock
);
649 if (video_is_registered(&ve
->vdev
)) {
650 video_unregister_device(&ve
->vdev
);
651 media_entity_cleanup(&ve
->vdev
.entity
);
655 mutex_unlock(&isp
->video_lock
);