summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Chen <cc@rock-chips.com>2017-07-24 16:58:35 +0800
committerHuang, Tao <huangtao@rock-chips.com>2017-09-21 10:38:49 +0800
commit1750e8d84eaaec9a2912b8d822d777255daaddee (patch)
tree00e6fc58358e7429107cda58a5210621ead0ee45
parent7f8599fc1ab983d540ba8d0ffd55cfd3af513b77 (diff)
media: rk-isp10: test suite 'v4l2-ctl' passed
Initialize default format for current stream and set stream state to 'READY' in case of streaming on by user without passing format to driver. Default format will be overridden by VIDIOC_S_FMT. Implement VIDIOC_G_FMT and application can get the format info of current stream now. This will become necessary when enable '--set-fmt-video' option of v4l2-ctl test suite, Set bytesused of each plane to its real size to prevent confusing. The IO mode of vb2 queue 'VB2_DMABUF' is now supported. Change-Id: Id52da502df8aea796b3405ebf472541a394afd80 Signed-off-by: Jacob Chen <cc@rock-chips.com>
-rw-r--r--drivers/media/platform/rk-isp10/cif_isp10.c88
-rw-r--r--drivers/media/platform/rk-isp10/cif_isp10_isp.c8
-rw-r--r--drivers/media/platform/rk-isp10/cif_isp10_v4l2.c31
-rw-r--r--drivers/media/platform/rk-isp10/cif_isp10_version.h6
4 files changed, 96 insertions, 37 deletions
diff --git a/drivers/media/platform/rk-isp10/cif_isp10.c b/drivers/media/platform/rk-isp10/cif_isp10.c
index d4b0a12a4d06..48874f37c518 100644
--- a/drivers/media/platform/rk-isp10/cif_isp10.c
+++ b/drivers/media/platform/rk-isp10/cif_isp10.c
@@ -3459,34 +3459,45 @@ static void cif_isp10_init_stream(
struct cif_isp10_device *dev,
enum cif_isp10_stream_id stream_id)
{
+ int ret = 0;
struct cif_isp10_stream *stream = NULL;
struct cif_isp10_frm_fmt frm_fmt;
- frm_fmt.pix_fmt = CIF_YUV422I;
- frm_fmt.width = dev->config.img_src_output.frm_fmt.width;
- frm_fmt.height = dev->config.img_src_output.frm_fmt.height;
- frm_fmt.stride = dev->config.img_src_output.frm_fmt.stride;
- frm_fmt.quantization = 0;
-
switch (stream_id) {
case CIF_ISP10_STREAM_SP:
stream = &dev->sp_stream;
+ stream->state = CIF_ISP10_STATE_READY;
+
dev->config.sp_config.rsz_config.ycflt_adjust = false;
dev->config.sp_config.rsz_config.ism_adjust = false;
dev->config.mi_config.sp.busy = false;
-
- // init default formats
- dev->config.mi_config.sp.output = frm_fmt;
- dev->config.mi_config.sp.llength =
- cif_isp10_calc_llength(
- frm_fmt.width,
- frm_fmt.stride,
- frm_fmt.pix_fmt);
-
dev->sp_stream.updt_cfg = true;
+
+ ret = cif_isp10_img_src_select_strm_fmt(dev);
+ if (IS_ERR_VALUE(ret)) {
+ dev->mp_stream.updt_cfg = false;
+ } else {
+ frm_fmt.pix_fmt = CIF_YUV420SP;
+ frm_fmt.width =
+ dev->config.img_src_output.frm_fmt.width;
+ frm_fmt.height =
+ dev->config.img_src_output.frm_fmt.height;
+ frm_fmt.stride = 0;
+ frm_fmt.quantization = 0;
+
+ // init default formats
+ dev->config.mi_config.sp.output = frm_fmt;
+ dev->config.mi_config.sp.llength =
+ cif_isp10_calc_llength(
+ frm_fmt.width,
+ frm_fmt.stride,
+ frm_fmt.pix_fmt);
+ }
break;
case CIF_ISP10_STREAM_MP:
stream = &dev->mp_stream;
+ stream->state = CIF_ISP10_STATE_READY;
+
dev->config.jpeg_config.ratio = 50;
dev->config.jpeg_config.header =
CIF_ISP10_JPEG_HEADER_JFIF;
@@ -3495,18 +3506,30 @@ static void cif_isp10_init_stream(
dev->config.mp_config.rsz_config.ycflt_adjust = false;
dev->config.mp_config.rsz_config.ism_adjust = false;
dev->config.mi_config.mp.busy = false;
-
- // init default formats
- dev->config.mi_config.mp.output = frm_fmt;
- dev->config.mi_config.mp.output.stride = frm_fmt.stride;
-
- dev->config.mi_config.mp.llength =
- cif_isp10_calc_llength(
- frm_fmt.width,
- frm_fmt.stride,
- frm_fmt.pix_fmt);
-
dev->mp_stream.updt_cfg = true;
+
+ ret = cif_isp10_img_src_select_strm_fmt(dev);
+ if (IS_ERR_VALUE(ret)) {
+ dev->mp_stream.updt_cfg = false;
+ } else {
+ frm_fmt.pix_fmt = CIF_YUV420SP;
+ frm_fmt.width =
+ dev->config.img_src_output.frm_fmt.width;
+ frm_fmt.height =
+ dev->config.img_src_output.frm_fmt.height;
+ frm_fmt.stride = 0;
+ frm_fmt.quantization = 0;
+
+ // init default formats
+ dev->config.mi_config.mp.output = frm_fmt;
+ dev->config.mi_config.mp.output.stride = frm_fmt.stride;
+
+ dev->config.mi_config.mp.llength =
+ cif_isp10_calc_llength(
+ frm_fmt.width,
+ frm_fmt.stride,
+ frm_fmt.pix_fmt);
+ }
break;
case CIF_ISP10_STREAM_DMA:
stream = &dev->dma_stream;
@@ -3528,12 +3551,10 @@ static void cif_isp10_init_stream(
cif_isp10_pltfrm_event_clear(dev->dev, &stream->done);
- if (stream->updt_cfg) {
- stream->state = CIF_ISP10_STATE_READY;
- cif_isp10_img_src_select_strm_fmt(dev);
- } else {
+ if (!stream->updt_cfg)
stream->state = CIF_ISP10_STATE_INACTIVE;
- }
+
+ return;
}
static int cif_isp10_jpeg_gen_header(
@@ -5598,7 +5619,10 @@ int cif_isp10_init(
/* set default input, failure is not fatal here */
if ((dev->sp_stream.state == CIF_ISP10_STATE_DISABLED) &&
(dev->mp_stream.state == CIF_ISP10_STATE_DISABLED)) {
- (void)cif_isp10_s_input(dev, 0);
+ ret = cif_isp10_s_input(dev, 0);
+ if (IS_ERR_VALUE(ret))
+ goto err;
+
dev->config.isp_config.si_enable = false;
dev->config.isp_config.ie_config.effect =
CIF_ISP10_IE_NONE;
diff --git a/drivers/media/platform/rk-isp10/cif_isp10_isp.c b/drivers/media/platform/rk-isp10/cif_isp10_isp.c
index 26de7f1ce214..a118303f3065 100644
--- a/drivers/media/platform/rk-isp10/cif_isp10_isp.c
+++ b/drivers/media/platform/rk-isp10/cif_isp10_isp.c
@@ -3065,8 +3065,8 @@ static int cifisp_querycap(struct file *file,
"platform:" DRIVER_NAME "-%03i",
*isp_dev->dev_id);
- cap->capabilities = V4L2_CAP_DEVICE_CAPS;
- cap->device_caps = V4L2_CAP_DEVICE_CAPS;
+ cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_DEVICE_CAPS;
+ cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_DEVICE_CAPS;
return 0;
}
@@ -3278,6 +3278,10 @@ int register_cifisp_device(struct cif_isp10_isp_dev *isp_dev,
dev_err(&vdev_cifisp->dev,
"could not register Video for Linux device\n");
return -ENODEV;
+ } else {
+ dev_info(&vdev_cifisp->dev,
+ "successfully registered video device for cifisp(video%d)\n",
+ vdev_cifisp->minor);
}
CIFISP_DPRINT(CIFISP_DEBUG,
diff --git a/drivers/media/platform/rk-isp10/cif_isp10_v4l2.c b/drivers/media/platform/rk-isp10/cif_isp10_v4l2.c
index bd6899e8ea72..9d6720d377b8 100644
--- a/drivers/media/platform/rk-isp10/cif_isp10_v4l2.c
+++ b/drivers/media/platform/rk-isp10/cif_isp10_v4l2.c
@@ -676,7 +676,31 @@ static int cif_isp10_v4l2_g_fmt(
void *priv,
struct v4l2_format *f)
{
- return -EFAULT;
+ struct vb2_queue *queue = to_vb2_queue(file);
+ struct cif_isp10_device *dev = to_cif_isp10_device(queue);
+ enum cif_isp10_stream_id stream_id = to_cif_isp10_stream_id(queue);
+
+ switch (stream_id) {
+ case CIF_ISP10_STREAM_SP:
+ f->fmt.pix.width =
+ dev->config.mi_config.sp.output.width;
+ f->fmt.pix.height =
+ dev->config.mi_config.sp.output.height;
+ f->fmt.pix.pixelformat =
+ dev->config.mi_config.sp.output.pix_fmt;
+ break;
+ case CIF_ISP10_STREAM_MP:
+ f->fmt.pix.width =
+ dev->config.mi_config.mp.output.width;
+ f->fmt.pix.height =
+ dev->config.mi_config.mp.output.height;
+ f->fmt.pix.pixelformat =
+ dev->config.mi_config.mp.output.pix_fmt;
+ break;
+ default:
+ return -EINVAL;
+ }
+ return 0;
}
static int cif_isp10_v4l2_s_input(
@@ -775,7 +799,7 @@ static void cif_isp10_v4l2_vb2_queue(struct vb2_buffer *vb)
list_add_tail(&ispbuf->queue, &stream->buf_queue);
- cif_isp10_calc_min_out_buff_size(dev, strm, &size, true);
+ cif_isp10_calc_min_out_buff_size(dev, strm, &size, false);
//size = PAGE_ALIGN(size);
vb2_set_plane_payload(vb, 0, size);
}
@@ -838,7 +862,7 @@ static int cif_isp10_init_vb2_queue(struct vb2_queue *q,
mutex_init(&node->qlock);
q->type = buf_type;
- q->io_modes = VB2_MMAP | VB2_USERPTR;
+ q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF;
q->drv_priv = dev;
q->ops = &cif_isp10_v4l2_vb2_ops;
q->buf_struct_size = sizeof(struct cif_isp10_buffer);
@@ -1597,6 +1621,7 @@ const struct v4l2_ioctl_ops cif_isp10_v4l2_dma_ioctlops = {
.vidioc_cropcap = cif_isp10_v4l2_cropcap,
.vidioc_s_crop = cif_isp10_v4l2_s_crop,
.vidioc_g_crop = cif_isp10_v4l2_g_crop,
+ .vidioc_querycap = v4l2_querycap,
};
static struct pltfrm_soc_cfg rk3288_cfg = {
diff --git a/drivers/media/platform/rk-isp10/cif_isp10_version.h b/drivers/media/platform/rk-isp10/cif_isp10_version.h
index d196f3fad19b..100bffdd4625 100644
--- a/drivers/media/platform/rk-isp10/cif_isp10_version.h
+++ b/drivers/media/platform/rk-isp10/cif_isp10_version.h
@@ -78,6 +78,12 @@
*3. Add the check for cam_itf.type(PLTFRM_CAM_ITF_BT656_8I) on
* cif_isp10_s_fmt_mp.
*4. get field_flag value from cif_isp10_isp_isr.
+ *
+ *v0.1.0xb
+ *1. Initialize default format for current stream.
+ *2. Implement command VIDIOC_G_FMT.
+ *3. Set bytesused of each plane to its real size.
+ *4. Support io mode 'VB2_DMABUF'.
*/
#define CONFIG_CIFISP10_DRIVER_VERSION KERNEL_VERSION(0, 1, 0xa)