mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 20:07:46 +09:00
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:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user