ov5645: Implement VIDIOC_QUERYCTRL ioctl
b/128424247
Change-Id: I3182ac69f96e60e08693abd1685f054c097c631f
diff --git a/drivers/media/platform/imx8/mxc-mipi-csi2_yav.c b/drivers/media/platform/imx8/mxc-mipi-csi2_yav.c
index 41face5..98829be 100644
--- a/drivers/media/platform/imx8/mxc-mipi-csi2_yav.c
+++ b/drivers/media/platform/imx8/mxc-mipi-csi2_yav.c
@@ -316,6 +316,16 @@
return 0;
}
+static int mipi_csi2_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc)
+{
+ struct mxc_mipi_csi2_dev *csi2dev = sd_to_mxc_mipi_csi2_dev(sd);
+ struct device *dev = &csi2dev->pdev->dev;
+ struct v4l2_subdev *sensor_sd = csi2dev->sensor_sd;
+
+ return v4l2_subdev_call(sensor_sd, core, queryctrl, qc);
+
+}
+
static int mipi_csi2_s_stream(struct v4l2_subdev *sd, int enable)
{
struct mxc_mipi_csi2_dev *csi2dev = sd_to_mxc_mipi_csi2_dev(sd);
@@ -444,6 +454,7 @@
static struct v4l2_subdev_core_ops mipi_csi2_core_ops = {
.s_power = mipi_csi2_s_power,
+ .queryctrl = mipi_csi2_queryctrl,
};
static struct v4l2_subdev_video_ops mipi_csi2_video_ops = {
diff --git a/drivers/media/platform/mxc/capture/mx6s_capture.c b/drivers/media/platform/mxc/capture/mx6s_capture.c
index 1de67a9..52c109e 100644
--- a/drivers/media/platform/mxc/capture/mx6s_capture.c
+++ b/drivers/media/platform/mxc/capture/mx6s_capture.c
@@ -1528,6 +1528,14 @@
return -EINVAL;
}
+static int mx6s_vidioc_queryctrl(struct file *file, void *priv, struct v4l2_queryctrl *qc)
+{
+ struct mx6s_csi_dev *csi_dev = video_drvdata(file);
+ struct v4l2_subdev *sd = csi_dev->sd;
+
+ return v4l2_subdev_call(sd, core, queryctrl, qc);
+}
+
static int mx6s_vidioc_streamon(struct file *file, void *priv,
enum v4l2_buf_type i)
{
@@ -1717,6 +1725,7 @@
.vidioc_s_parm = mx6s_vidioc_s_parm,
.vidioc_enum_framesizes = mx6s_vidioc_enum_framesizes,
.vidioc_enum_frameintervals = mx6s_vidioc_enum_frameintervals,
+ .vidioc_queryctrl = mx6s_vidioc_queryctrl,
};
static int subdev_notifier_bound(struct v4l2_async_notifier *notifier,
diff --git a/drivers/media/platform/mxc/capture/ov5645_mipi_v2.c b/drivers/media/platform/mxc/capture/ov5645_mipi_v2.c
index 152e8a0..ced8b2e 100644
--- a/drivers/media/platform/mxc/capture/ov5645_mipi_v2.c
+++ b/drivers/media/platform/mxc/capture/ov5645_mipi_v2.c
@@ -3280,6 +3280,11 @@
return 0;
}
+static int ov5645_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc)
+{
+ return -EINVAL;
+}
+
/*!
* ov5645_enum_frameintervals - V4L2 sensor interface handler for
* VIDIOC_ENUM_FRAMEINTERVALS ioctl
@@ -3391,6 +3396,7 @@
.g_register = ov5645_get_register,
.s_register = ov5645_set_register,
#endif
+ .queryctrl = ov5645_queryctrl,
};
static struct v4l2_subdev_ops ov5645_subdev_ops = {
diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h
index 79f6761..3be1435 100644
--- a/include/media/v4l2-subdev.h
+++ b/include/media/v4l2-subdev.h
@@ -163,6 +163,8 @@
* @s_gpio: set GPIO pins. Very simple right now, might need to be extended with
* a direction argument if needed.
*
+ * @queryctrl: callback for VIDIOC_QUERYCTL ioctl handler code.
+ *
* @ioctl: called at the end of ioctl() syscall handler at the V4L2 core.
* used to provide support for private ioctls used on the driver.
*
@@ -195,6 +197,7 @@
int (*load_fw)(struct v4l2_subdev *sd);
int (*reset)(struct v4l2_subdev *sd, u32 val);
int (*s_gpio)(struct v4l2_subdev *sd, u32 val);
+ int (*queryctrl)(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc);
long (*ioctl)(struct v4l2_subdev *sd, unsigned int cmd, void *arg);
#ifdef CONFIG_COMPAT
long (*compat_ioctl32)(struct v4l2_subdev *sd, unsigned int cmd,