mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 10:58:48 +09:00
media: rockchip: vpss: online support reset
Signed-off-by: Mingwei Yan <mingwei.yan@rock-chips.com> Change-Id: I50bd79743fac270ff4ee888959f60dd36f9e6639
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user