diff options
-rw-r--r-- | drivers/media/platform/rk-isp10/cif_isp10.c | 88 | ||||
-rw-r--r-- | drivers/media/platform/rk-isp10/cif_isp10_isp.c | 8 | ||||
-rw-r--r-- | drivers/media/platform/rk-isp10/cif_isp10_v4l2.c | 31 | ||||
-rw-r--r-- | drivers/media/platform/rk-isp10/cif_isp10_version.h | 6 |
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) |