}
 
        NVWriteCRTC(dev, head, NV_PCRTC_START, regp->fb_start);
-
-       /* Enable vblank interrupts. */
-       NVWriteCRTC(dev, head, NV_PCRTC_INTR_EN_0,
-                   (dev->vblank_enabled[head] ? 1 : 0));
-       NVWriteCRTC(dev, head, NV_PCRTC_INTR_0, NV_PCRTC_INTR_0_VBLANK);
 }
 
 static void
 
                NVSetOwner(dev, 0);
        }
 
+       /* ensure vblank interrupts are off, they can't be enabled until
+        * drm_vblank has been initialised
+        */
+       NVWriteCRTC(dev, 0, NV_PCRTC_INTR_EN_0, 0);
+       if (nv_two_heads(dev))
+               NVWriteCRTC(dev, 1, NV_PCRTC_INTR_EN_0, 0);
+
        return 0;
 }
 
 void
 nv04_display_fini(struct drm_device *dev)
 {
+       /* disable vblank interrupts */
+       NVWriteCRTC(dev, 0, NV_PCRTC_INTR_EN_0, 0);
+       if (nv_two_heads(dev))
+               NVWriteCRTC(dev, 1, NV_PCRTC_INTR_EN_0, 0);
 }
 
 static void