case V4L2_FIELD_INTERLACED_BT:
                vnmc = VNMC_IM_FULL | VNMC_FOC;
                break;
-       case V4L2_FIELD_ALTERNATE:
        case V4L2_FIELD_NONE:
                vnmc = VNMC_IM_ODD_EVEN;
                progressive = true;
        return rvin_read(vin, VNMS_REG) & VNMS_CA;
 }
 
-static enum v4l2_field rvin_get_active_field(struct rvin_dev *vin, u32 vnms)
-{
-       if (vin->format.field == V4L2_FIELD_ALTERNATE) {
-               /* If FS is set it's a Even field */
-               if (vnms & VNMS_FS)
-                       return V4L2_FIELD_BOTTOM;
-               return V4L2_FIELD_TOP;
-       }
-
-       return vin->format.field;
-}
-
 static void rvin_set_slot_addr(struct rvin_dev *vin, int slot, dma_addr_t addr)
 {
        const struct rvin_video_format *fmt;
 
        /* Capture frame */
        if (vin->queue_buf[slot]) {
-               vin->queue_buf[slot]->field = rvin_get_active_field(vin, vnms);
+               vin->queue_buf[slot]->field = vin->format.field;
                vin->queue_buf[slot]->sequence = vin->sequence;
                vin->queue_buf[slot]->vb2_buf.timestamp = ktime_get_ns();
                vb2_buffer_done(&vin->queue_buf[slot]->vb2_buf,
 
        vin->format.colorspace  = mf->colorspace;
        vin->format.field       = mf->field;
 
-       /*
-        * If the subdevice uses ALTERNATE field mode and G_STD is
-        * implemented use the VIN HW to combine the two fields to
-        * one INTERLACED frame. The ALTERNATE field mode can still
-        * be requested in S_FMT and be respected, this is just the
-        * default which is applied at probing or when S_STD is called.
-        */
-       if (vin->format.field == V4L2_FIELD_ALTERNATE &&
-           v4l2_subdev_has_op(vin_to_source(vin), video, g_std))
-               vin->format.field = V4L2_FIELD_INTERLACED;
-
-       switch (vin->format.field) {
-       case V4L2_FIELD_TOP:
-       case V4L2_FIELD_BOTTOM:
-       case V4L2_FIELD_ALTERNATE:
-               vin->format.height /= 2;
-               break;
-       case V4L2_FIELD_NONE:
-       case V4L2_FIELD_INTERLACED_TB:
-       case V4L2_FIELD_INTERLACED_BT:
-       case V4L2_FIELD_INTERLACED:
-               break;
-       default:
-               vin->format.field = RVIN_DEFAULT_FIELD;
-               break;
-       }
-
        rvin_reset_crop_compose(vin);
 
        vin->format.bytesperline = rvin_format_bytesperline(&vin->format);
        switch (pix->field) {
        case V4L2_FIELD_TOP:
        case V4L2_FIELD_BOTTOM:
-       case V4L2_FIELD_ALTERNATE:
-               pix->height /= 2;
-               source->height /= 2;
-               break;
        case V4L2_FIELD_NONE:
        case V4L2_FIELD_INTERLACED_TB:
        case V4L2_FIELD_INTERLACED_BT:
        case V4L2_FIELD_INTERLACED:
                break;
+       case V4L2_FIELD_ALTERNATE:
+               /*
+                * Driver does not (yet) support outputting ALTERNATE to a
+                * userspace. It does support outputting INTERLACED so use
+                * the VIN hardware to combine the two fields.
+                */
+               pix->field = V4L2_FIELD_INTERLACED;
+               pix->height *= 2;
+               break;
        default:
                pix->field = RVIN_DEFAULT_FIELD;
                break;