From 5f2f43419836ab14d16c43dbbe085a02e571cb12 Mon Sep 17 00:00:00 2001 From: Zefa Chen Date: Wed, 3 Aug 2022 17:08:23 +0800 Subject: [PATCH] media: rockchip: vicap fixed dvp segfault [ 0.463070] Unable to handle kernel NULL pointer dereference at virtual address 00000000 [ 0.457836] rkcif rkcif_dvp: rkcif driver version: v00.01.0a [ 0.458009] rkcif rkcif_dvp: attach to cif hw node [ 0.458033] rkcif rkcif_dvp: rkcif wait line 0 [ 0.458056] : terminal subdev does not exist [ 0.463620] rkcif_dvp: There is not terminal subdev, not synchronized with ISP [ 0.464566] [00000000] *pgd=00000000 [ 0.468850] Internal error: Oops: 5 [#1] PREEMPT SMP ARM [ 0.469332] Modules linked in: [ 0.469627] CPU: 1 PID: 1 Comm: swapper/0 Not tainted 5.10.110 #273 [ 0.470186] Hardware name: Generic DT based system [ 0.470637] PC is at subdev_notifier_complete+0x2c0/0x3a0 [ 0.471124] LR is at subdev_notifier_complete+0x34c/0x3a0 [ 0.471608] pc : [] lr : [] psr: 60000013 [ 0.472169] sp : b86dbc78 ip : 0001c52c fp : b1708030 [ 0.472640] r10: b170801c r9 : b1708078 r8 : b1708238 [ 0.473113] r7 : b1708220 r6 : b1708220 r5 : 00000000 r4 : b170fcb0 [ 0.473697] r3 : 00000000 r2 : 00000000 r1 : 60000013 r0 : b170fcb4 [ 0.474282] Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user [ 0.474922] Control: 10c5387d Table: 0000406a DAC: 00000055 [ 0.475442] Process swapper/0 (pid: 1, stack limit = 0xe78b9f4a) Signed-off-by: Zefa Chen Change-Id: Ic36dfc2cbc0928e39844263647eee082e5229e95 --- drivers/media/platform/rockchip/cif/dev.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/drivers/media/platform/rockchip/cif/dev.c b/drivers/media/platform/rockchip/cif/dev.c index 454492c09d5c..70b902fb76c2 100644 --- a/drivers/media/platform/rockchip/cif/dev.c +++ b/drivers/media/platform/rockchip/cif/dev.c @@ -1451,12 +1451,16 @@ static int subdev_notifier_complete(struct v4l2_async_notifier *notifier) if (!completion_done(&dev->cmpl_ntf)) complete(&dev->cmpl_ntf); - ret = v4l2_subdev_call(dev->active_sensor->sd, - core, ioctl, - RKCIF_CMD_SET_CSI_IDX, - &dev->csi_host_idx); - if (ret) - v4l2_err(&dev->v4l2_dev, "set csi idx %d fail\n", dev->csi_host_idx); + if (dev->active_sensor && + (dev->active_sensor->mbus.type == V4L2_MBUS_CSI2_DPHY || + dev->active_sensor->mbus.type == V4L2_MBUS_CSI2_CPHY)) { + ret = v4l2_subdev_call(dev->active_sensor->sd, + core, ioctl, + RKCIF_CMD_SET_CSI_IDX, + &dev->csi_host_idx); + if (ret) + v4l2_err(&dev->v4l2_dev, "set csi idx %d fail\n", dev->csi_host_idx); + } v4l2_info(&dev->v4l2_dev, "Async subdev notifier completed\n"); return ret;