From a864508368bbab9210bde0dced808084b998ca49 Mon Sep 17 00:00:00 2001 From: Xu Hongfei Date: Wed, 16 Dec 2020 11:35:30 +0800 Subject: [PATCH] media: rockchip: isp/ispp: fix error detected by depmod DEPMOD 4.19.111 depmod: ERROR: Cycle detected: video_rkisp -> video_rkispp -> video_rkisp depmod: ERROR: Found 2 modules in dependency cycles! Signed-off-by: Xu Hongfei Change-Id: I4136dcb32e6438865b2d1d1f8df811748db1f549 --- drivers/media/platform/rockchip/isp/bridge.c | 5 +++-- .../media/platform/rockchip/isp/isp_ispp.h | 20 ++++--------------- .../platform/rockchip/isp/isp_stats_v2x.c | 12 +++++++++-- drivers/media/platform/rockchip/ispp/common.c | 7 +------ drivers/media/platform/rockchip/ispp/common.h | 2 ++ drivers/media/platform/rockchip/ispp/ispp.c | 10 ++++++++++ 6 files changed, 30 insertions(+), 26 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/bridge.c b/drivers/media/platform/rockchip/isp/bridge.c index dbb081327706..f843715e0988 100644 --- a/drivers/media/platform/rockchip/isp/bridge.c +++ b/drivers/media/platform/rockchip/isp/bridge.c @@ -433,7 +433,6 @@ static int frame_end(struct rkisp_bridge_device *dev, bool en) { struct rkisp_hw_dev *hw = dev->ispdev->hw_dev; struct v4l2_subdev *sd = v4l2_get_subdev_hostdata(&dev->sd); - struct rkisp_ispp_reg *reg_buf; unsigned long lock_flags = 0; u64 ns = ktime_get_ns(); @@ -452,6 +451,7 @@ static int frame_end(struct rkisp_bridge_device *dev, bool en) spin_unlock_irqrestore(&hw->buf_lock, lock_flags); } else { u64 sof_ns = 0; + struct rkisp_ispp_reg *reg_buf = NULL; ns = 0; rkisp_dmarx_get_frame(dev->ispdev, @@ -462,7 +462,8 @@ static int frame_end(struct rkisp_bridge_device *dev, bool en) ns = ktime_get_ns(); hw->cur_buf->frame_timestamp = ns; hw->cur_buf->index = dev->ispdev->dev_id; - rkispp_request_regbuf(sd, ®_buf); + v4l2_subdev_call(sd, core, ioctl, RKISP_ISPP_CMD_REQUEST_REGBUF, + ®_buf); if (reg_buf) { reg_buf->stat = ISP_ISPP_INUSE; reg_buf->dev_id = hw->cur_buf->index; diff --git a/drivers/media/platform/rockchip/isp/isp_ispp.h b/drivers/media/platform/rockchip/isp/isp_ispp.h index ce254596307f..ac87e1824658 100644 --- a/drivers/media/platform/rockchip/isp/isp_ispp.h +++ b/drivers/media/platform/rockchip/isp/isp_ispp.h @@ -22,6 +22,10 @@ _IOW('V', BASE_VIDIOC_PRIVATE + 0, struct rkisp_ispp_mode) #define RKISP_ISPP_CMD_SET_FMT \ _IOW('V', BASE_VIDIOC_PRIVATE + 1, struct max_input) +#define RKISP_ISPP_CMD_REQUEST_REGBUF \ + _IOW('V', BASE_VIDIOC_PRIVATE + 2, struct rkisp_ispp_reg *) +#define RKISP_ISPP_CMD_GET_REG_WITHSTREAM \ + _IOW('V', BASE_VIDIOC_PRIVATE + 3, bool) enum rkisp_ispp_dev { DEV_ID0 = 0, @@ -113,20 +117,4 @@ static inline void rkisp_get_bridge_sd(struct platform_device *dev, } #endif -#if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISPP) -void rkispp_request_regbuf(struct v4l2_subdev *sd, struct rkisp_ispp_reg **free_buf); -bool rkispp_get_reg_withstream(void); -#else -static inline void rkispp_request_regbuf(struct v4l2_subdev *sd, - struct rkisp_ispp_reg **free_buf) -{ - *free_buf = NULL; -} - -static inline bool rkispp_get_reg_withstream(void) -{ - return false; -} -#endif - #endif diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v2x.c b/drivers/media/platform/rockchip/isp/isp_stats_v2x.c index 7d65902d32e0..6e458a571b18 100644 --- a/drivers/media/platform/rockchip/isp/isp_stats_v2x.c +++ b/drivers/media/platform/rockchip/isp/isp_stats_v2x.c @@ -1257,11 +1257,15 @@ rkisp_stats_send_meas_v2x(struct rkisp_isp_stats_vdev *stats_vdev, } if (cur_buf) { + bool reg_withstream = false; + struct v4l2_subdev *sd = v4l2_get_subdev_hostdata(&stats_vdev->dev->br_dev.sd); + vb2_set_plane_payload(&cur_buf->vb.vb2_buf, 0, sizeof(struct rkisp_isp2x_stat_buffer)); cur_buf->vb.sequence = cur_frame_id; cur_buf->vb.vb2_buf.timestamp = meas_work->timestamp; - if (rkispp_get_reg_withstream()) { + v4l2_subdev_call(sd, core, ioctl, RKISP_ISPP_CMD_GET_REG_WITHSTREAM, ®_withstream); + if (reg_withstream) { struct rkisp_isp2x_stat_buffer *tmp_statsbuf; tmp_statsbuf = (struct rkisp_isp2x_stat_buffer *)stats_vdev->tmp_statsbuf.vaddr; @@ -1462,6 +1466,9 @@ static struct rkisp_isp_stats_ops rkisp_isp_stats_ops_tbl = { void rkisp_stats_first_ddr_config_v2x(struct rkisp_isp_stats_vdev *stats_vdev) { + bool reg_withstream = false; + struct v4l2_subdev *sd = v4l2_get_subdev_hostdata(&stats_vdev->dev->br_dev.sd); + if (stats_vdev->rd_stats_from_ddr) { stats_vdev->wr_buf_idx = 0; stats_vdev->rd_buf_idx = 0; @@ -1474,7 +1481,8 @@ void rkisp_stats_first_ddr_config_v2x(struct rkisp_isp_stats_vdev *stats_vdev) SW_3A_DDR_WRITE_EN, false); } - if (rkispp_get_reg_withstream()) { + v4l2_subdev_call(sd, core, ioctl, RKISP_ISPP_CMD_GET_REG_WITHSTREAM, ®_withstream); + if (reg_withstream) { stats_vdev->tmp_statsbuf.is_need_vaddr = true; stats_vdev->tmp_statsbuf.size = sizeof(struct rkisp_isp2x_stat_buffer); rkisp_alloc_buffer(stats_vdev->dev, &stats_vdev->tmp_statsbuf); diff --git a/drivers/media/platform/rockchip/ispp/common.c b/drivers/media/platform/rockchip/ispp/common.c index 7fd815de5f34..80e2b50fa355 100644 --- a/drivers/media/platform/rockchip/ispp/common.c +++ b/drivers/media/platform/rockchip/ispp/common.c @@ -457,10 +457,8 @@ void rkispp_release_regbuf(struct rkispp_device *ispp, struct rkisp_ispp_reg *fr freebuf->stat = ISP_ISPP_FREE; } -void rkispp_request_regbuf(struct v4l2_subdev *sd, struct rkisp_ispp_reg **free_buf) +void rkispp_request_regbuf(struct rkispp_device *dev, struct rkisp_ispp_reg **free_buf) { - struct rkispp_subdev *ispp_sdev = v4l2_get_subdevdata(sd); - struct rkispp_device *dev = ispp_sdev->dev; struct rkispp_hw_dev *hw = dev->hw_dev; int ret; @@ -474,11 +472,8 @@ void rkispp_request_regbuf(struct v4l2_subdev *sd, struct rkisp_ispp_reg **free_ (*free_buf)->stat = ISP_ISPP_INUSE; } } -EXPORT_SYMBOL(rkispp_request_regbuf); bool rkispp_get_reg_withstream(void) { return rkispp_reg_withstream; } -EXPORT_SYMBOL(rkispp_get_reg_withstream); - diff --git a/drivers/media/platform/rockchip/ispp/common.h b/drivers/media/platform/rockchip/ispp/common.h index c43be6c04811..5c90523890fa 100644 --- a/drivers/media/platform/rockchip/ispp/common.h +++ b/drivers/media/platform/rockchip/ispp/common.h @@ -121,4 +121,6 @@ void rkispp_free_common_dummy_buf(struct rkispp_device *dev); int rkispp_find_regbuf_by_id(struct rkispp_device *ispp, struct rkisp_ispp_reg **free_buf, u32 dev_id, u32 frame_id); void rkispp_release_regbuf(struct rkispp_device *ispp, struct rkisp_ispp_reg *freebuf); +void rkispp_request_regbuf(struct rkispp_device *dev, struct rkisp_ispp_reg **free_buf); +bool rkispp_get_reg_withstream(void); #endif diff --git a/drivers/media/platform/rockchip/ispp/ispp.c b/drivers/media/platform/rockchip/ispp/ispp.c index 113731f2920a..7cbb523277cc 100644 --- a/drivers/media/platform/rockchip/ispp/ispp.c +++ b/drivers/media/platform/rockchip/ispp/ispp.c @@ -374,6 +374,8 @@ static long rkispp_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) struct rkispp_device *ispp_dev = ispp_sdev->dev; struct rkispp_fecbuf_info *fecbuf; struct rkispp_fecbuf_size *fecsize; + struct rkisp_ispp_reg **reg_buf; + bool *rkispp_reg_withstream; long ret = 0; if (!arg) @@ -388,6 +390,14 @@ static long rkispp_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) fecsize = (struct rkispp_fecbuf_size *)arg; rkispp_params_set_fecbuf_size(&ispp_dev->params_vdev, fecsize); break; + case RKISP_ISPP_CMD_REQUEST_REGBUF: + reg_buf = (struct rkisp_ispp_reg **)arg; + rkispp_request_regbuf(ispp_dev, reg_buf); + break; + case RKISP_ISPP_CMD_GET_REG_WITHSTREAM: + rkispp_reg_withstream = arg; + *rkispp_reg_withstream = rkispp_get_reg_withstream(); + break; default: ret = -ENOIOCTLCMD; }