#include <linux/compat.h>
 #include <linux/module.h>
 #include <linux/videodev2.h>
+#include <linux/v4l2-subdev.h>
 #include <media/v4l2-dev.h>
 #include <media/v4l2-ioctl.h>
 
        return 0;
 }
 
+struct v4l2_subdev_edid32 {
+       __u32 pad;
+       __u32 start_block;
+       __u32 blocks;
+       __u32 reserved[5];
+       compat_caddr_t edid;
+};
+
+static int get_v4l2_subdev_edid32(struct v4l2_subdev_edid *kp, struct v4l2_subdev_edid32 __user *up)
+{
+       u32 tmp;
+
+       if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_subdev_edid32)) ||
+               get_user(kp->pad, &up->pad) ||
+               get_user(kp->start_block, &up->start_block) ||
+               get_user(kp->blocks, &up->blocks) ||
+               get_user(tmp, &up->edid) ||
+               copy_from_user(kp->reserved, up->reserved, sizeof(kp->reserved)))
+                       return -EFAULT;
+       kp->edid = compat_ptr(tmp);
+       return 0;
+}
+
+static int put_v4l2_subdev_edid32(struct v4l2_subdev_edid *kp, struct v4l2_subdev_edid32 __user *up)
+{
+       u32 tmp = (u32)((unsigned long)kp->edid);
+
+       if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_subdev_edid32)) ||
+               put_user(kp->pad, &up->pad) ||
+               put_user(kp->start_block, &up->start_block) ||
+               put_user(kp->blocks, &up->blocks) ||
+               put_user(tmp, &up->edid) ||
+               copy_to_user(kp->reserved, up->reserved, sizeof(kp->reserved)))
+                       return -EFAULT;
+       return 0;
+}
+
+
 #define VIDIOC_G_FMT32         _IOWR('V',  4, struct v4l2_format32)
 #define VIDIOC_S_FMT32         _IOWR('V',  5, struct v4l2_format32)
 #define VIDIOC_QUERYBUF32      _IOWR('V',  9, struct v4l2_buffer32)
 #define VIDIOC_DQBUF32         _IOWR('V', 17, struct v4l2_buffer32)
 #define VIDIOC_ENUMSTD32       _IOWR('V', 25, struct v4l2_standard32)
 #define VIDIOC_ENUMINPUT32     _IOWR('V', 26, struct v4l2_input32)
+#define VIDIOC_SUBDEV_G_EDID32 _IOWR('V', 63, struct v4l2_subdev_edid32)
+#define VIDIOC_SUBDEV_S_EDID32 _IOWR('V', 64, struct v4l2_subdev_edid32)
 #define VIDIOC_TRY_FMT32       _IOWR('V', 64, struct v4l2_format32)
 #define VIDIOC_G_EXT_CTRLS32    _IOWR('V', 71, struct v4l2_ext_controls32)
 #define VIDIOC_S_EXT_CTRLS32    _IOWR('V', 72, struct v4l2_ext_controls32)
                struct v4l2_ext_controls v2ecs;
                struct v4l2_event v2ev;
                struct v4l2_create_buffers v2crt;
+               struct v4l2_subdev_edid v2edid;
                unsigned long vx;
                int vi;
        } karg;
        case VIDIOC_S_OUTPUT32: cmd = VIDIOC_S_OUTPUT; break;
        case VIDIOC_CREATE_BUFS32: cmd = VIDIOC_CREATE_BUFS; break;
        case VIDIOC_PREPARE_BUF32: cmd = VIDIOC_PREPARE_BUF; break;
+       case VIDIOC_SUBDEV_G_EDID32: cmd = VIDIOC_SUBDEV_G_EDID; break;
+       case VIDIOC_SUBDEV_S_EDID32: cmd = VIDIOC_SUBDEV_S_EDID; break;
        }
 
        switch (cmd) {
                compatible_arg = 0;
                break;
 
+       case VIDIOC_SUBDEV_G_EDID:
+       case VIDIOC_SUBDEV_S_EDID:
+               err = get_v4l2_subdev_edid32(&karg.v2edid, up);
+               compatible_arg = 0;
+               break;
+
        case VIDIOC_G_FMT:
        case VIDIOC_S_FMT:
        case VIDIOC_TRY_FMT:
                err = put_v4l2_event32(&karg.v2ev, up);
                break;
 
+       case VIDIOC_SUBDEV_G_EDID:
+       case VIDIOC_SUBDEV_S_EDID:
+               err = put_v4l2_subdev_edid32(&karg.v2edid, up);
+               break;
+
        case VIDIOC_G_FMT:
        case VIDIOC_S_FMT:
        case VIDIOC_TRY_FMT:
        case VIDIOC_QUERY_DV_TIMINGS:
        case VIDIOC_DV_TIMINGS_CAP:
        case VIDIOC_ENUM_FREQ_BANDS:
+       case VIDIOC_SUBDEV_G_EDID32:
+       case VIDIOC_SUBDEV_S_EDID32:
                ret = do_video_ioctl(file, cmd, arg);
                break;