WREG_ECRT(0x06, 0x00);
 }
 
-static void mga_crtc_dpms(struct drm_crtc *crtc, int mode)
+static void mgag200_enable_display(struct mga_device *mdev)
 {
-       struct drm_device *dev = crtc->dev;
-       struct mga_device *mdev = to_mga_device(dev);
-       u8 seq1 = 0, crtcext1 = 0;
+       u8 seq1, crtcext1;
 
-       switch (mode) {
-       case DRM_MODE_DPMS_ON:
-               seq1 = 0;
-               crtcext1 = 0;
-               mga_crtc_load_lut(crtc);
-               break;
-       case DRM_MODE_DPMS_STANDBY:
-               seq1 = 0x20;
-               crtcext1 = 0x10;
-               break;
-       case DRM_MODE_DPMS_SUSPEND:
-               seq1 = 0x20;
-               crtcext1 = 0x20;
-               break;
-       case DRM_MODE_DPMS_OFF:
-               seq1 = 0x20;
-               crtcext1 = 0x30;
-               break;
-       }
+       /*
+        * TODO: replace busy waiting with vblank IRQ; put
+        *       msleep(50) before changing SCROFF
+        */
+       mga_wait_vsync(mdev);
+       mga_wait_busy(mdev);
+
+       RREG_SEQ(0x01, seq1);
+       seq1 &= ~MGAREG_SEQ1_SCROFF;
+       WREG_SEQ(0x01, seq1);
+
+       msleep(20);
+
+       RREG_ECRT(0x01, crtcext1);
+       crtcext1 &= ~MGAREG_CRTCEXT1_VSYNCOFF;
+       crtcext1 &= ~MGAREG_CRTCEXT1_HSYNCOFF;
+       WREG_ECRT(0x01, crtcext1);
+}
 
-       WREG8(MGAREG_SEQ_INDEX, 0x01);
-       seq1 |= RREG8(MGAREG_SEQ_DATA) & ~0x20;
+static void mgag200_disable_display(struct mga_device *mdev)
+{
+       u8 seq1, crtcext1;
+
+       /*
+        * TODO: replace busy waiting with vblank IRQ; put
+        *       msleep(50) before changing SCROFF
+        */
        mga_wait_vsync(mdev);
        mga_wait_busy(mdev);
-       WREG8(MGAREG_SEQ_DATA, seq1);
+
+       RREG_SEQ(0x01, seq1);
+       seq1 |= MGAREG_SEQ1_SCROFF;
+       WREG_SEQ(0x01, seq1);
+
        msleep(20);
-       WREG8(MGAREG_CRTCEXT_INDEX, 0x01);
-       crtcext1 |= RREG8(MGAREG_CRTCEXT_DATA) & ~0x30;
-       WREG8(MGAREG_CRTCEXT_DATA, crtcext1);
+
+       RREG_ECRT(0x01, crtcext1);
+       crtcext1 |= MGAREG_CRTCEXT1_VSYNCOFF |
+                   MGAREG_CRTCEXT1_HSYNCOFF;
+       WREG_ECRT(0x01, crtcext1);
 }
 
 /*
                mga_g200wb_commit(crtc);
 
        WREG_SEQ(0, 0x3);
-       mga_crtc_dpms(crtc, DRM_MODE_DPMS_ON);
+       mga_crtc_load_lut(crtc);
+       mgag200_enable_display(mdev);
 }
 
 /*
 mgag200_simple_display_pipe_disable(struct drm_simple_display_pipe *pipe)
 {
        struct drm_crtc *crtc = &pipe->crtc;
+       struct mga_device *mdev = to_mga_device(crtc->dev);
 
-       mga_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
+       mgag200_disable_display(mdev);
 }
 
 static int