media: sunxi-vin: guard volatile control queries

This commit is contained in:
Qubot 2026-06-13 00:48:00 +08:00
parent 9027454e19
commit 93c776150b

View File

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