diff --git a/bsp/drivers/vin/vin-video/vin_video.c b/bsp/drivers/vin/vin-video/vin_video.c index f1c996e72..8f750c79f 100644 --- a/bsp/drivers/vin/vin-video/vin_video.c +++ b/bsp/drivers/vin/vin-video/vin_video.c @@ -3886,19 +3886,28 @@ static int vin_g_volatile_ctrl(struct v4l2_ctrl *ctrl) struct v4l2_control c; int ret = 0; + if (!cap->vinc || !inst) + return -ENODEV; + c.id = ctrl->id; if (inst->is_isp_used && inst->is_bayer_raw) { switch (ctrl->id) { case V4L2_CID_EXPOSURE: + if (!sensor || !sensor->ctrl_handler) + return -ENODEV; v4l2_g_ctrl(sensor->ctrl_handler, &c); ctrl->val = c.value; break; case V4L2_CID_EXPOSURE_ABSOLUTE: + if (!sensor || !sensor->ctrl_handler) + return -ENODEV; c.id = V4L2_CID_EXPOSURE; v4l2_g_ctrl(sensor->ctrl_handler, &c); ctrl->val = __vin_sensor_line2time(sensor, c.value); break; case V4L2_CID_GAIN: + if (!sensor || !sensor->ctrl_handler) + return -ENODEV; v4l2_g_ctrl(sensor->ctrl_handler, &c); ctrl->val = c.value; break; @@ -3931,11 +3940,15 @@ static int vin_g_volatile_ctrl(struct v4l2_ctrl *ctrl) c.value = inst->is_bayer_raw; break; case V4L2_CID_FLASH_LED_MODE: + if (!flash || !flash->ctrl_handler) + return -ENODEV; ret = v4l2_g_ctrl(flash->ctrl_handler, &c); break; case V4L2_CID_AUTO_FOCUS_STATUS: + if (!sensor || !sensor->ctrl_handler) + return -ENODEV; ret = v4l2_g_ctrl(sensor->ctrl_handler, &c); - if (c.value != V4L2_AUTO_FOCUS_STATUS_BUSY) + if (flash && c.value != V4L2_AUTO_FOCUS_STATUS_BUSY) sunxi_flash_stop(flash); break; case V4L2_CID_VFLIP: @@ -3945,6 +3958,8 @@ static int vin_g_volatile_ctrl(struct v4l2_ctrl *ctrl) ctrl->val = cap->vinc->hflip; break; default: + if (!sensor || !sensor->ctrl_handler) + return -ENODEV; ret = v4l2_g_ctrl(sensor->ctrl_handler, &c); break; }