struct v4l2_mbus_framefmt *infmt,
                         struct v4l2_fwnode_endpoint *upstream_ep)
 {
+       u32 in_height;
+
        crop->width = min_t(__u32, infmt->width, crop->width);
        if (crop->left + crop->width > infmt->width)
                crop->left = infmt->width - crop->width;
        crop->left &= ~0x3;
        crop->width &= ~0x7;
 
+       in_height = infmt->height;
+       if (infmt->field == V4L2_FIELD_ALTERNATE)
+               in_height *= 2;
+
        /*
         * FIXME: not sure why yet, but on interlaced bt.656,
         * changing the vertical cropping causes loss of vertical
        if (upstream_ep->bus_type == V4L2_MBUS_BT656 &&
            (V4L2_FIELD_HAS_BOTH(infmt->field) ||
             infmt->field == V4L2_FIELD_ALTERNATE)) {
-               crop->height = infmt->height;
-               crop->top = (infmt->height == 480) ? 2 : 0;
+               crop->height = in_height;
+               crop->top = (in_height == 480) ? 2 : 0;
        } else {
-               crop->height = min_t(__u32, infmt->height, crop->height);
-               if (crop->top + crop->height > infmt->height)
-                       crop->top = infmt->height - crop->height;
+               crop->height = min_t(__u32, in_height, crop->height);
+               if (crop->top + crop->height > in_height)
+                       crop->top = in_height - crop->height;
        }
 }
 
                crop->top = 0;
                crop->width = sdformat->format.width;
                crop->height = sdformat->format.height;
+               if (sdformat->format.field == V4L2_FIELD_ALTERNATE)
+                       crop->height *= 2;
                csi_try_crop(priv, crop, cfg, &sdformat->format, upstream_ep);
                compose->left = 0;
                compose->top = 0;
                sel->r.top = 0;
                sel->r.width = infmt->width;
                sel->r.height = infmt->height;
+               if (infmt->field == V4L2_FIELD_ALTERNATE)
+                       sel->r.height *= 2;
                break;
        case V4L2_SEL_TGT_CROP:
                sel->r = *crop;