summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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)