@@ -20,8 +20,10 @@
#include <linux/mm.h>
#include <linux/slab.h>
#include <linux/types.h>
+#include <linux/kdev_t.h>
#include <linux/videodev2.h>
#include <linux/export.h>
+#include <linux/version.h>
#include <media/v4l2-ctrls.h>
#include <media/v4l2-device.h>
@@ -186,6 +188,30 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg)
#endif
switch (cmd) {
+ case VIDIOC_SUBDEV_QUERYCAP: {
+ struct v4l2_subdev_capability *cap = arg;
+#if defined(CONFIG_MEDIA_CONTROLLER)
+ struct media_device *mdev = sd->entity.graph_obj.mdev;
+ struct media_devnode *devnode = mdev ? mdev->devnode : NULL;
+#endif
+
+ cap->version = LINUX_VERSION_CODE;
+ cap->device_caps = 0;
+ cap->entity_id = 0;
+ cap->media_node_major = 0;
+ cap->media_node_minor = 0;
+#if defined(CONFIG_MEDIA_CONTROLLER)
+ if (devnode) {
+ cap->device_caps = V4L2_SUBDEV_CAP_ENTITY;
+ cap->entity_id = sd->entity.graph_obj.id;
+ cap->media_node_major = MAJOR(devnode->cdev.dev);
+ cap->media_node_minor = MINOR(devnode->cdev.dev);
+ }
+#endif
+ memset(cap->reserved, 0, sizeof(cap->reserved));
+ break;
+ }
+
case VIDIOC_QUERYCTRL:
return v4l2_queryctrl(vfh->ctrl_handler, arg);
@@ -154,9 +154,38 @@ struct v4l2_subdev_selection {
__u32 reserved[8];
};
+/**
+ * struct v4l2_subdev_capability - subdev capabilities
+ * @version: the kernel version
+ * @device_caps: the subdev capabilities
+ * @entity_id: the entity ID as assigned by the media controller. Only
+ * valid if V4L2_SUBDEV_CAP_ENTITY is set
+ * @media_node_major: the major number of the media controller device node.
+ * Only valid if V4L2_SUBDEV_CAP_ENTITY is set
+ * @media_node_minor: the minor number of the media controller device node.
+ * Only valid if V4L2_SUBDEV_CAP_ENTITY is set
+ * @reserved: for future use, set to zero for now
+ */
+struct v4l2_subdev_capability {
+ __u32 version;
+ __u32 device_caps;
+ __u32 entity_id;
+ /* Corresponding media controller device node specifications */
+ __u32 media_node_major;
+ __u32 media_node_minor;
+ __u32 reserved[27];
+};
+
+/*
+ * This v4l2_subdev is also a media entity and the entity_id, media_node_major
+ * and media_node_minor fields are valid
+ */
+#define V4L2_SUBDEV_CAP_ENTITY (1 << 0)
+
/* Backwards compatibility define --- to be removed */
#define v4l2_subdev_edid v4l2_edid
+#define VIDIOC_SUBDEV_QUERYCAP _IOR('V', 0, struct v4l2_subdev_capability)
#define VIDIOC_SUBDEV_G_FMT _IOWR('V', 4, struct v4l2_subdev_format)
#define VIDIOC_SUBDEV_S_FMT _IOWR('V', 5, struct v4l2_subdev_format)
#define VIDIOC_SUBDEV_G_FRAME_INTERVAL _IOWR('V', 21, struct v4l2_subdev_frame_interval)