diff --git a/drivers/media/platform/rockchip/ispp/common.c b/drivers/media/platform/rockchip/ispp/common.c index 2d79343e6c64..98b61cb58a09 100644 --- a/drivers/media/platform/rockchip/ispp/common.c +++ b/drivers/media/platform/rockchip/ispp/common.c @@ -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; diff --git a/drivers/media/platform/rockchip/ispp/ispp.c b/drivers/media/platform/rockchip/ispp/ispp.c index 57fffbfa9fe9..893e049d8724 100644 --- a/drivers/media/platform/rockchip/ispp/ispp.c +++ b/drivers/media/platform/rockchip/ispp/ispp.c @@ -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; diff --git a/drivers/media/platform/rockchip/ispp/regs.h b/drivers/media/platform/rockchip/ispp/regs.h index c7be7c950621..d40f94034ae5 100644 --- a/drivers/media/platform/rockchip/ispp/regs.h +++ b/drivers/media/platform/rockchip/ispp/regs.h @@ -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) diff --git a/drivers/media/platform/rockchip/ispp/stream.c b/drivers/media/platform/rockchip/ispp/stream.c index 48327630d0dd..dc756424dce2 100644 --- a/drivers/media/platform/rockchip/ispp/stream.c +++ b/drivers/media/platform/rockchip/ispp/stream.c @@ -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);