media: rockchip: ispp: fix hold case of nr enable and shp dma disable

Change-Id: I5548c64a8f4a6b2222ba9b0326ef36999b8169c7
Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
Cai YiWei
2020-04-07 14:20:06 +08:00
committed by Tao Huang
parent 016583a966
commit e1f238a4a4
4 changed files with 28 additions and 6 deletions

View File

@@ -62,6 +62,9 @@ int rkispp_allow_buffer(struct rkispp_device *dev,
buf->mem_priv = mem_priv;
buf->dma_addr = *((dma_addr_t *)ops->cookie(mem_priv));
buf->vaddr = ops->vaddr(mem_priv);
v4l2_dbg(1, rkispp_debug, &dev->v4l2_dev,
"%s buf:0x%x~0x%x size:%d\n", __func__,
(u32)buf->dma_addr, (u32)buf->dma_addr + buf->size, buf->size);
return ret;
err:
dev_err(dev->dev, "%s failed ret:%d\n", __func__, ret);
@@ -74,6 +77,9 @@ void rkispp_free_buffer(struct rkispp_device *dev,
const struct vb2_mem_ops *ops = &vb2_dma_contig_memops;
if (buf && buf->mem_priv) {
v4l2_dbg(1, rkispp_debug, &dev->v4l2_dev,
"%s buf:0x%x~0x%x\n", __func__,
(u32)buf->dma_addr, (u32)buf->dma_addr + buf->size);
ops->put(buf->mem_priv);
buf->size = 0;
buf->vaddr = NULL;

View File

@@ -255,6 +255,7 @@ static int rkispp_sd_s_power(struct v4l2_subdev *sd, int on)
writel(0xfffffff, ispp_dev->base_addr + RKISPP_CTRL_INT_MSK);
writel(SW_SHP_DMA_DIS,
ispp_dev->base_addr + RKISPP_SHARP_CORE_CTRL);
writel(GATE_DIS_NR, ispp_dev->base_addr + RKISPP_CTRL_CLKGATE);
if (ispp_dev->inp == INP_ISP) {
struct v4l2_subdev_format *fmt = &ispp_sdev->in_fmt;

View File

@@ -350,6 +350,16 @@
#define RST_PROTECT_DIS BIT(1)
#define GLB_SOFT_RST_ALL BIT(0)
/* ISPP_CLKGATE */
#define GATE_DIS_GLOBAL_RAM_CLK BIT(7)
#define GATE_DIS_SWS BIT(6)
#define GATE_DIS_FEC BIT(5)
#define GATE_DIS_SCL BTI(4)
#define GATE_DIS_SHP BIT(3)
#define GATE_DIS_NR BIT(2)
#define GATE_DIS_TNR BIT(1)
#define GATE_DIS_GLB BIT(0)
/* INT_MASK INT_RAW_STA INT_STA INT_SET INT_CLR */
#define INT_FRAME(stream) \
((stream)->config->frame_end_id)

View File

@@ -880,9 +880,6 @@ static void stop_mb(struct rkispp_stream *stream)
break;
case ISPP_MODULE_NR:
case ISPP_MODULE_SHP:
rkispp_clear_bits(base + RKISPP_NR_UVNR_CTRL_PARA, SW_NR_EN);
rkispp_set_bits(base + RKISPP_SHARP_CORE_CTRL,
SW_SHP_DMA_DIS | SW_SHP_EN, SW_SHP_DMA_DIS);
break;
default:
rkispp_clear_bits(base + RKISPP_FEC_CORE_CTRL, SW_FEC_EN);
@@ -902,8 +899,10 @@ static int is_stopped_mb(struct rkispp_stream *stream)
break;
case ISPP_MODULE_NR:
case ISPP_MODULE_SHP:
en = SW_SHP_EN;
val = readl(base + RKISPP_SHARP_CORE_CTRL);
/* close dma write immediately */
rkispp_set_bits(base + RKISPP_SHARP_CORE_CTRL,
SW_SHP_DMA_DIS, SW_SHP_DMA_DIS);
val = false;
break;
default:
en = SW_FEC_EN_SHD;
@@ -1171,9 +1170,12 @@ static void rkispp_stream_stop(struct rkispp_stream *stream)
wait = true;
}
if (dev->inp == INP_ISP &&
atomic_read(&dev->stream_vdev.refcnt) == 1)
atomic_read(&dev->stream_vdev.refcnt) == 1) {
v4l2_subdev_call(&dev->ispp_sdev.sd,
video, s_stream, false);
rkispp_clear_bits(dev->base_addr + RKISPP_CTRL_QUICK,
GLB_QUICK_EN);
}
if (wait) {
ret = wait_event_timeout(stream->done,
!stream->streaming,
@@ -1220,6 +1222,9 @@ static void rkispp_stop_streaming(struct vb2_queue *queue)
v4l2_dbg(1, rkispp_debug, &dev->v4l2_dev,
"%s id:%d\n", __func__, stream->id);
if (!stream->streaming)
return;
rkispp_stream_stop(stream);
destroy_buf_queue(stream, VB2_BUF_STATE_ERROR);
rkispp_destroy_dummy_buf(stream);