if (ret < 0 && ret != -ENOIOCTLCMD && ret != -ENODEV)
                return ret;
 
+       /* Read standard */
+       vin->std = V4L2_STD_UNKNOWN;
+       ret = v4l2_subdev_call(subdev, video, g_std, &vin->std);
+       if (ret < 0 && ret != -ENOIOCTLCMD)
+               return ret;
+
        /* Add the controls */
        ret = v4l2_ctrl_handler_init(&vin->ctrl_handler, 16);
        if (ret < 0)
 
 static int rvin_setup(struct rvin_dev *vin)
 {
        u32 vnmc, dmr, dmr2, interrupts;
-       v4l2_std_id std;
        bool progressive = false, output_is_yuv = false, input_is_yuv = false;
 
        switch (vin->format.field) {
                /* Default to TB */
                vnmc = VNMC_IM_FULL;
                /* Use BT if video standard can be read and is 60 Hz format */
-               if (!v4l2_subdev_call(vin_to_source(vin), video, g_std, &std)) {
-                       if (std & V4L2_STD_525_60)
-                               vnmc = VNMC_IM_FULL | VNMC_FOC;
-               }
+               if (vin->std & V4L2_STD_525_60)
+                       vnmc = VNMC_IM_FULL | VNMC_FOC;
                break;
        case V4L2_FIELD_INTERLACED_TB:
                vnmc = VNMC_IM_FULL;
 
        if (ret < 0)
                return ret;
 
+       vin->std = a;
+
        /* Changing the standard will change the width/height */
        return rvin_reset_format(vin);
 }
 static int rvin_g_std(struct file *file, void *priv, v4l2_std_id *a)
 {
        struct rvin_dev *vin = video_drvdata(file);
-       struct v4l2_subdev *sd = vin_to_source(vin);
 
-       return v4l2_subdev_call(sd, video, g_std, a);
+       if (v4l2_subdev_has_op(vin_to_source(vin), pad, dv_timings_cap))
+               return -ENOIOCTLCMD;
+
+       *a = vin->std;
+
+       return 0;
 }
 
 static int rvin_subscribe_event(struct v4l2_fh *fh,
 
  * @crop:              active cropping
  * @compose:           active composing
  * @source:            active size of the video source
+ * @std:               active video standard of the video source
  */
 struct rvin_dev {
        struct device *dev;
        struct v4l2_rect crop;
        struct v4l2_rect compose;
        struct v4l2_rect source;
+       v4l2_std_id std;
 };
 
 #define vin_to_source(vin)             ((vin)->digital->subdev)