MEDIA_BUS_FMT_Y8_1X8,
 };
 
+static const struct v4l2_mbus_framefmt ov6650_def_fmt = {
+       .width          = W_CIF,
+       .height         = H_CIF,
+       .code           = MEDIA_BUS_FMT_SBGGR8_1X8,
+       .colorspace     = V4L2_COLORSPACE_SRGB,
+       .field          = V4L2_FIELD_NONE,
+       .ycbcr_enc      = V4L2_YCBCR_ENC_DEFAULT,
+       .quantization   = V4L2_QUANTIZATION_DEFAULT,
+       .xfer_func      = V4L2_XFER_FUNC_DEFAULT,
+};
+
 /* read a register */
 static int ov6650_reg_read(struct i2c_client *client, u8 reg, u8 *val)
 {
        if (format->pad)
                return -EINVAL;
 
+       /* initialize response with default media bus frame format */
+       *mf = ov6650_def_fmt;
+
+       /* update media bus format code and frame size */
        mf->width       = priv->rect.width >> priv->half_scale;
        mf->height      = priv->rect.height >> priv->half_scale;
        mf->code        = priv->code;
-       mf->colorspace  = V4L2_COLORSPACE_SRGB;
-       mf->field       = V4L2_FIELD_NONE;
 
        return 0;
 }
        if (!ret)
                ret = ov6650_reg_rmw(client, REG_COML, coml_set, coml_mask);
 
-       if (!ret) {
-               mf->width = priv->rect.width >> half_scale;
-               mf->height = priv->rect.height >> half_scale;
-       }
        return ret;
 }
 
                v4l_bound_align_image(&mf->width, 2, W_CIF, 1,
                                &mf->height, 2, H_CIF, 1, 0);
 
-       mf->field = V4L2_FIELD_NONE;
-       mf->colorspace = V4L2_COLORSPACE_SRGB;
-
        switch (mf->code) {
        case MEDIA_BUS_FMT_Y10_1X10:
                mf->code = MEDIA_BUS_FMT_Y8_1X8;
                break;
        }
 
-       if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE)
-               return ov6650_s_fmt(sd, mf);
-       cfg->try_fmt = *mf;
+       if (format->which == V4L2_SUBDEV_FORMAT_TRY) {
+               /* store media bus format code and frame size in pad config */
+               cfg->try_fmt.width = mf->width;
+               cfg->try_fmt.height = mf->height;
+               cfg->try_fmt.code = mf->code;
 
+               /* return default mbus frame format updated with pad config */
+               *mf = ov6650_def_fmt;
+               mf->width = cfg->try_fmt.width;
+               mf->height = cfg->try_fmt.height;
+               mf->code = cfg->try_fmt.code;
+
+       } else {
+               /* apply new media bus format code and frame size */
+               int ret = ov6650_s_fmt(sd, mf);
+
+               if (ret)
+                       return ret;
+
+               /* return default format updated with active size and code */
+               *mf = ov6650_def_fmt;
+               mf->width = priv->rect.width >> priv->half_scale;
+               mf->height = priv->rect.height >> priv->half_scale;
+               mf->code = priv->code;
+       }
        return 0;
 }