From c803efb9878ef7e075f54fb498a8146d45c13d68 Mon Sep 17 00:00:00 2001 From: Mingwei Yan Date: Thu, 22 Aug 2024 09:30:52 +0800 Subject: [PATCH] media: rockchip: vpss: online support reset Signed-off-by: Mingwei Yan Change-Id: I50bd79743fac270ff4ee888959f60dd36f9e6639 --- drivers/media/platform/rockchip/isp/isp_sditf.c | 8 ++++++++ drivers/media/platform/rockchip/isp/isp_sditf.h | 2 ++ drivers/media/platform/rockchip/isp/isp_vpss.h | 3 +++ drivers/media/platform/rockchip/isp/rkisp.c | 2 ++ drivers/media/platform/rockchip/vpss/vpss.c | 15 +++++++++++++++ 5 files changed, 30 insertions(+) diff --git a/drivers/media/platform/rockchip/isp/isp_sditf.c b/drivers/media/platform/rockchip/isp/isp_sditf.c index 77266494eab8..1dd674c152bd 100644 --- a/drivers/media/platform/rockchip/isp/isp_sditf.c +++ b/drivers/media/platform/rockchip/isp/isp_sditf.c @@ -87,6 +87,14 @@ static int rkisp_sditf_s_power(struct v4l2_subdev *sd, int on) return ret; } +void rkisp_sditf_reset_notify_vpss(struct rkisp_device *dev) +{ + struct rkisp_sditf_device *sditf = dev->sditf_dev; + + v4l2_info(&dev->v4l2_dev, "%s\n", __func__); + v4l2_subdev_call(sditf->remote_sd, core, ioctl, RKISP_VPSS_RESET_NOTIFY_VPSS, NULL); +} + void rkisp_sditf_sof(struct rkisp_device *dev, u32 irq) { struct rkisp_sditf_device *sditf = dev->sditf_dev; diff --git a/drivers/media/platform/rockchip/isp/isp_sditf.h b/drivers/media/platform/rockchip/isp/isp_sditf.h index 5754bddba034..5aae87fb4887 100644 --- a/drivers/media/platform/rockchip/isp/isp_sditf.h +++ b/drivers/media/platform/rockchip/isp/isp_sditf.h @@ -21,8 +21,10 @@ struct rkisp_sditf_device { #if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V39) extern struct platform_driver rkisp_sditf_drv; void rkisp_sditf_sof(struct rkisp_device *dev, u32 irq); +void rkisp_sditf_reset_notify_vpss(struct rkisp_device *dev); #else static inline void rkisp_sditf_sof(struct rkisp_device *dev, u32 irq) {} +static inline void rkisp_sditf_reset_notify_vpss(struct rkisp_device *dev) {} #endif #endif diff --git a/drivers/media/platform/rockchip/isp/isp_vpss.h b/drivers/media/platform/rockchip/isp/isp_vpss.h index 332447487c4f..9523be2d9dcf 100644 --- a/drivers/media/platform/rockchip/isp/isp_vpss.h +++ b/drivers/media/platform/rockchip/isp/isp_vpss.h @@ -13,6 +13,9 @@ #define RKISP_VPSS_GET_UNITE_MODE \ _IOR('V', BASE_VIDIOC_PRIVATE + 2, unsigned int) +#define RKISP_VPSS_RESET_NOTIFY_VPSS \ + _IO('V', BASE_VIDIOC_PRIVATE + 3) + struct rkisp_vpss_sof { u32 irq; u32 seq; diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index a64686764114..e41c69749e86 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -1243,6 +1243,8 @@ static int rkisp_reset_handle(struct rkisp_device *dev) u32 val; dev_info(dev->dev, "%s enter\n", __func__); + if (dev->isp_ver == ISP_V39 && dev->sditf_dev && dev->sditf_dev->is_on) + rkisp_sditf_reset_notify_vpss(dev); rkisp_hw_reg_save(dev->hw_dev); rkisp_soft_reset(dev->hw_dev, true); diff --git a/drivers/media/platform/rockchip/vpss/vpss.c b/drivers/media/platform/rockchip/vpss/vpss.c index ab5c74fc2c90..a6d736e69ab9 100644 --- a/drivers/media/platform/rockchip/vpss/vpss.c +++ b/drivers/media/platform/rockchip/vpss/vpss.c @@ -305,15 +305,30 @@ static int rkvpss_sof(struct rkvpss_subdev *sdev, struct rkisp_vpss_sof *info) return 0; } +static void rkvpss_reset_handle(struct rkvpss_device *vpss_dev) +{ + dev_info(vpss_dev->dev, "%s enter\n", __func__); + rkvpss_hw_reg_save(vpss_dev->hw_dev); + + rkvpss_soft_reset(vpss_dev->hw_dev); + + rkvpss_hw_reg_restore(vpss_dev->hw_dev); + dev_info(vpss_dev->dev, "%s exit\n", __func__); +} + static long rkvpss_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) { struct rkvpss_subdev *sdev = v4l2_get_subdevdata(sd); + struct rkvpss_device *vpss_dev = sdev->dev; long ret = 0; switch (cmd) { case RKISP_VPSS_CMD_SOF: ret = rkvpss_sof(sdev, arg); break; + case RKISP_VPSS_RESET_NOTIFY_VPSS: + rkvpss_reset_handle(vpss_dev); + break; default: ret = -ENOIOCTLCMD; }