From f6ae766bfe9ae0e5ba9487a902014cd06043a5bc Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Sat, 18 Apr 2020 10:21:45 +0800 Subject: [PATCH] media: rockchip: fix ispp scl isr at power on Change-Id: I4b02c29eb2f0b08c134be2efe91c4ea9ed9c532a Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/isp/csi.c | 3 +++ drivers/media/platform/rockchip/isp/mpfbc.c | 3 +-- drivers/media/platform/rockchip/ispp/ispp.c | 16 ++++++++++++---- drivers/media/platform/rockchip/ispp/regs.h | 16 +++++++++++++++- drivers/media/platform/rockchip/ispp/stream.c | 12 +++++------- 5 files changed, 36 insertions(+), 14 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/csi.c b/drivers/media/platform/rockchip/isp/csi.c index 226831419836..2e70c32642c1 100644 --- a/drivers/media/platform/rockchip/isp/csi.c +++ b/drivers/media/platform/rockchip/isp/csi.c @@ -423,6 +423,9 @@ int rkisp_csi_config_patch(struct rkisp_device *dev) writel(0x7FFFFF7F, dev->base_addr + CSI2RX_MASK_STAT); } + if (IS_HDR_RDBK(dev->hdr.op_mode)) + isp_set_bits(dev->base_addr + CTRL_SWS_CFG, + 0, SW_MPIP_DROP_FRM_DIS); dev->csi_dev.is_first = true; kfifo_reset(&dev->csi_dev.rdbk_kfifo); return ret; diff --git a/drivers/media/platform/rockchip/isp/mpfbc.c b/drivers/media/platform/rockchip/isp/mpfbc.c index 1612b8f3f763..2bf37a6b5223 100644 --- a/drivers/media/platform/rockchip/isp/mpfbc.c +++ b/drivers/media/platform/rockchip/isp/mpfbc.c @@ -266,8 +266,7 @@ static int mpfbc_stop(struct rkisp_mpfbc_device *mpfbc_dev) int ret; mpfbc_dev->stopping = true; - writel(SW_MPFBC_YUV_MODE(1), - base + ISP_MPFBC_BASE); + isp_clear_bits(base + ISP_MPFBC_BASE, SW_MPFBC_EN); hdr_stop_dmatx(dev); ret = wait_event_timeout(mpfbc_dev->done, !mpfbc_dev->en, diff --git a/drivers/media/platform/rockchip/ispp/ispp.c b/drivers/media/platform/rockchip/ispp/ispp.c index 041bd6581fe2..456482e836d0 100644 --- a/drivers/media/platform/rockchip/ispp/ispp.c +++ b/drivers/media/platform/rockchip/ispp/ispp.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 /* Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd. */ +#include #include #include #include @@ -323,6 +324,7 @@ static int rkispp_sd_s_power(struct v4l2_subdev *sd, int on) { struct rkispp_subdev *ispp_sdev = v4l2_get_subdevdata(sd); struct rkispp_device *ispp_dev = ispp_sdev->dev; + void __iomem *base = ispp_dev->base_addr; struct iommu_domain *domain; int ret; @@ -338,10 +340,16 @@ static int rkispp_sd_s_power(struct v4l2_subdev *sd, int on) return ret; } atomic_set(&ispp_sdev->frm_sync_seq, 0); - 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); + writel(SW_SCL_BYPASS, base + RKISPP_SCL0_CTRL); + writel(SW_SCL_BYPASS, base + RKISPP_SCL1_CTRL); + writel(SW_SCL_BYPASS, base + RKISPP_SCL2_CTRL); + writel(OTHER_FORCE_UPD, base + RKISPP_CTRL_UPDATE); + writel(SW_SHP_DMA_DIS, base + RKISPP_SHARP_CORE_CTRL); + writel(SW_FEC2DDR_DIS, base + RKISPP_FEC_CORE_CTRL); + writel(0xfffffff, base + RKISPP_CTRL_INT_MSK); + writel(GATE_DIS_ALL, base + RKISPP_CTRL_CLKGATE); + //usleep_range(1000, 1200); + //writel(0, base + RKISPP_CTRL_CLKGATE); if (ispp_dev->inp == INP_ISP) { struct v4l2_subdev_format fmt; struct v4l2_subdev_selection sel; diff --git a/drivers/media/platform/rockchip/ispp/regs.h b/drivers/media/platform/rockchip/ispp/regs.h index ef88c0a1bab8..b61b6d1f2f31 100644 --- a/drivers/media/platform/rockchip/ispp/regs.h +++ b/drivers/media/platform/rockchip/ispp/regs.h @@ -19,6 +19,7 @@ #define RKISPP_CTRL_INT_STA (RKISPP_CTRL + 0x0028) #define RKISPP_CTRL_INT_SET (RKISPP_CTRL + 0x002C) #define RKISPP_CTRL_INT_CLR (RKISPP_CTRL + 0x0030) +#define RKISPP_QUICK_DIF (RKISPP_CTRL + 0x0034) #define RKISPP_CTRL_SYS_STATUS (RKISPP_CTRL + 0x003C) #define RKISPP_CTRL_QUICK_FRM_NUM (RKISPP_CTRL + 0x0040) #define RKISPP_CTRL_SYS_CTL_STA0 (RKISPP_CTRL + 0x0054) @@ -338,9 +339,16 @@ /* ISPP_CTRL_QUICK */ #define GLB_QUICK_MODE_MASK GENMASK(9, 8) +#define SW_PP_FBC_MODE_DIS BIT(30) +#define SW_PP_MMU_PLUS_DIS BIT(29) +#define SW_PP2ISP_HOLD_SEL BIT(28) #define GLB_FEC2SCL_EN BIT(11) #define GLB_NR_SD32_TNR BIT(10) #define GLB_QUICK_MODE(a) (((a) & 0x3) << 8) +#define GLB_NOC_HURRY(a) (((a) & 0x3) << 4) +#define GLB_TNR_RDY_DIS BIT(3) +#define GLB_TNR2NR_RDY_MODE BIT(2) +#define GLB_DIRECT_MODE BIT(1) #define GLB_QUICK_EN BIT(0) /* ISPP_CTRL_RESET */ @@ -353,10 +361,11 @@ #define GLB_SOFT_RST_ALL BIT(0) /* ISPP_CLKGATE */ +#define GATE_DIS_ALL 0xff #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_SCL BIT(4) #define GATE_DIS_SHP BIT(3) #define GATE_DIS_NR BIT(2) #define GATE_DIS_TNR BIT(1) @@ -387,6 +396,11 @@ #define FRAME_INT BIT(1) #define QUICK_INT BIT(0) +/* ISPP_QUICK_DIF */ +#define GLB_TNR2NR_DIF(a) (((a) & 0xff) << 16) +#define GLB_ISP2NR_DIF(a) (((a) & 0xff) << 8) +#define GLB_NR2FEC_DIF(a) ((a) & 0xff) + /* TNR CTRL */ #define SW_TNR_WR_FORMAT_MASK GENMASK(7, 4) #define SW_TNR_RD_FORMAT_MASK GENMASK(3, 0) diff --git a/drivers/media/platform/rockchip/ispp/stream.c b/drivers/media/platform/rockchip/ispp/stream.c index 899ecd958bee..1ebc645032a2 100644 --- a/drivers/media/platform/rockchip/ispp/stream.c +++ b/drivers/media/platform/rockchip/ispp/stream.c @@ -868,6 +868,7 @@ static int config_mb(struct rkispp_stream *stream) limit_range | stream->out_cap_fmt.wr_fmt << 4); writel((stream->out_fmt.height << 16) | stream->out_fmt.width, base + RKISPP_FEC_PIC_SIZE); + rkispp_clear_bits(base + RKISPP_FEC_CORE_CTRL, SW_FEC2DDR_DIS); } if (stream->out_cap_fmt.wr_fmt & FMT_YUYV) mult = 2; @@ -1190,16 +1191,13 @@ 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, - msecs_to_jiffies(100)); + msecs_to_jiffies(1000)); if (!ret) v4l2_warn(&dev->v4l2_dev, "waiting on event ret:%d\n", ret); @@ -1269,8 +1267,6 @@ static int start_isp(struct rkispp_device *dev) ret = config_modules(dev); if (ret) return ret; - rkispp_set_bits(dev->base_addr + RKISPP_CTRL_QUICK, - 0, GLB_QUICK_EN); writel(ALL_FORCE_UPD, dev->base_addr + RKISPP_CTRL_UPDATE); if (vdev->is_update_manual) i = (vdev->module_ens & ISPP_MODULE_FEC) ? @@ -1281,6 +1277,8 @@ static int start_isp(struct rkispp_device *dev) stream = &vdev->stream[i]; rkispp_frame_end(stream); } + rkispp_set_bits(dev->base_addr + RKISPP_CTRL_QUICK, + 0, GLB_QUICK_EN); return v4l2_subdev_call(&dev->ispp_sdev.sd, video, s_stream, true); }