From 874374348b10cfcbde7ef324b89b02e8c6c4835f Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Thu, 30 Apr 2020 11:22:42 +0800 Subject: [PATCH] media: rockchip: isp: fix dmatx align and dmarx dt csi to ddr is work unit config damrx data type if dmatx no work Change-Id: If82bfd06c09b725aa159c13a700c02c34e79a253 Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/isp/capture.c | 13 ++++---- drivers/media/platform/rockchip/isp/dmarx.c | 30 +++++++++++++++---- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/capture.c b/drivers/media/platform/rockchip/isp/capture.c index 2e1de4cd61f6..dffe6e205505 100644 --- a/drivers/media/platform/rockchip/isp/capture.c +++ b/drivers/media/platform/rockchip/isp/capture.c @@ -2280,17 +2280,14 @@ rkisp_start_streaming(struct vb2_queue *queue, unsigned int count) v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev, "%s %d\n", __func__, stream->id); - if (!stream->linked) { - v4l2_err(v4l2_dev, "link stream first\n"); - return -EINVAL; - } - if (WARN_ON(stream->streaming)) return -EBUSY; atomic_inc(&dev->cap_dev.refcnt); - if (!dev->isp_inp) + if (!dev->isp_inp || !stream->linked) { + v4l2_err(v4l2_dev, "check video link or isp input\n"); goto buffer_done; + } if (atomic_read(&dev->cap_dev.refcnt) == 1 && (dev->isp_inp & INP_CSI || dev->isp_inp & INP_DVP)) { @@ -2485,9 +2482,11 @@ static int rkisp_set_fmt(struct rkisp_stream *stream, !dev->csi_dev.memory && stream->id != RKISP_STREAM_MP && stream->id != RKISP_STREAM_SP) - bytesperline = width * fmt->bpp[i] / 8; + /* compact mode need bytesperline 4byte align */ + bytesperline = ALIGN(width * fmt->bpp[i] / 8, 4); else bytesperline = width * DIV_ROUND_UP(fmt->bpp[i], 8); + /* stride is only available for sp stream and y plane */ if (stream->id != RKISP_STREAM_SP || i != 0 || plane_fmt->bytesperline < bytesperline) diff --git a/drivers/media/platform/rockchip/isp/dmarx.c b/drivers/media/platform/rockchip/isp/dmarx.c index 667c2295eac0..52b62535ee49 100644 --- a/drivers/media/platform/rockchip/isp/dmarx.c +++ b/drivers/media/platform/rockchip/isp/dmarx.c @@ -280,6 +280,7 @@ static int rawrd_config_mi(struct rkisp_stream *stream) { struct rkisp_device *dev = stream->ispdev; void __iomem *base = dev->base_addr; + u32 val; v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev, "%s id:%d %dx%d\n", __func__, @@ -287,13 +288,30 @@ static int rawrd_config_mi(struct rkisp_stream *stream) stream->out_fmt.width, stream->out_fmt.height); + switch (stream->out_isp_fmt.fourcc) { + case V4L2_PIX_FMT_SRGGB8: + case V4L2_PIX_FMT_SBGGR8: + case V4L2_PIX_FMT_SGRBG8: + case V4L2_PIX_FMT_SGBRG8: + val = CIF_CSI2_DT_RAW8; + break; + case V4L2_PIX_FMT_SRGGB10: + case V4L2_PIX_FMT_SBGGR10: + case V4L2_PIX_FMT_SGRBG10: + case V4L2_PIX_FMT_SGBRG10: + val = CIF_CSI2_DT_RAW10; + break; + default: + val = CIF_CSI2_DT_RAW12; + } + isp_set_bits(base + CSI2RX_DATA_IDS_1, + SW_CSI_ID0(0xff), SW_CSI_ID0(val)); raw_rd_set_pic_size(base, stream->out_fmt.width, stream->out_fmt.height); isp_set_bits(base + CSI2RX_RAW_RD_CTRL, 0, dev->csi_dev.memory << 2 | 1 << (stream->id - 1)); - return 0; } @@ -538,14 +556,14 @@ static int dmarx_start_streaming(struct vb2_queue *queue, struct v4l2_device *v4l2_dev = &dev->v4l2_dev; int ret = -1; - if (!stream->linked) { - v4l2_err(v4l2_dev, "link stream first\n"); - return -EINVAL; - } - if (WARN_ON(stream->streaming)) return -EBUSY; + if (!stream->linked) { + v4l2_err(v4l2_dev, "check video link\n"); + goto free_buf_queue; + } + if (atomic_read(&dev->cap_dev.refcnt) < 1) { v4l2_err(v4l2_dev, "capture stream should start first\n");