media: rockchip: vpss: online support reset

Signed-off-by: Mingwei Yan <mingwei.yan@rock-chips.com>
Change-Id: I50bd79743fac270ff4ee888959f60dd36f9e6639
This commit is contained in:
Mingwei Yan
2024-08-22 09:30:52 +08:00
parent 866b86dd10
commit c803efb987
5 changed files with 30 additions and 0 deletions

View File

@@ -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;

View File

@@ -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

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;
}