Index: dev/drm/radeon_cp.c =================================================================== --- dev/drm/radeon_cp.c (revision 189044) +++ dev/drm/radeon_cp.c (working copy) @@ -1751,6 +1751,12 @@ else dev_priv->flags |= RADEON_IS_PCI; + ret = drm_vblank_init(dev, 2); + if (ret) { + radeon_driver_unload(dev); + return ret; + } + DRM_DEBUG("%s card detected\n", ((dev_priv->flags & RADEON_IS_AGP) ? "AGP" : (((dev_priv->flags & RADEON_IS_PCIE) ? "PCIE" : "PCI")))); return ret; Index: dev/drm/mach64_irq.c =================================================================== --- dev/drm/mach64_irq.c (revision 189044) +++ dev/drm/mach64_irq.c (working copy) @@ -146,7 +146,7 @@ int mach64_driver_irq_postinstall(struct drm_device * dev) { - return drm_vblank_init(dev, 1); + return 0; } void mach64_driver_irq_uninstall(struct drm_device * dev) Index: dev/drm/drm_irq.c =================================================================== --- dev/drm/drm_irq.c (revision 189052) +++ dev/drm/drm_irq.c (working copy) @@ -96,7 +96,7 @@ } } -static void drm_vblank_cleanup(struct drm_device *dev) +void drm_vblank_cleanup(struct drm_device *dev) { unsigned long irqflags; @@ -213,8 +213,6 @@ bus_teardown_intr(dev->device, dev->irqr, dev->irqh); DRM_LOCK(); - drm_vblank_cleanup(dev); - return 0; } Index: dev/drm/i915_irq.c =================================================================== --- dev/drm/i915_irq.c (revision 189054) +++ dev/drm/i915_irq.c (working copy) @@ -484,12 +484,7 @@ int i915_driver_irq_postinstall(struct drm_device *dev) { drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; - int ret, num_pipes = 2; - ret = drm_vblank_init(dev, num_pipes); - if (ret) - return ret; - dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B; dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */ Index: dev/drm/r128_drv.c =================================================================== --- dev/drm/r128_drv.c (revision 189044) +++ dev/drm/r128_drv.c (working copy) @@ -52,6 +52,7 @@ DRIVER_SG | DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ; dev->driver->buf_priv_size = sizeof(drm_r128_buf_priv_t); + dev->driver->load = r128_driver_load; dev->driver->preclose = r128_driver_preclose; dev->driver->lastclose = r128_driver_lastclose; dev->driver->get_vblank_counter = r128_get_vblank_counter; @@ -93,6 +94,11 @@ return drm_attach(nbdev, r128_pciidlist); } +int r128_driver_load(struct drm_device * dev, unsigned long flags) +{ + return drm_vblank_init(dev, 1); +} + static int r128_detach(device_t nbdev) { Index: dev/drm/i915_dma.c =================================================================== --- dev/drm/i915_dma.c (revision 189054) +++ dev/drm/i915_dma.c (working copy) @@ -902,6 +902,13 @@ #endif DRM_SPININIT(&dev_priv->user_irq_lock, "userirq"); + ret = drm_vblank_init(dev, I915_NUM_PIPE); + + if (ret) { + (void) i915_driver_unload(dev); + return ret; + } + return ret; } Index: dev/drm/r128_drv.h =================================================================== --- dev/drm/r128_drv.h (revision 189044) +++ dev/drm/r128_drv.h (working copy) @@ -162,6 +162,7 @@ extern int r128_driver_irq_postinstall(struct drm_device * dev); extern void r128_driver_irq_uninstall(struct drm_device * dev); extern void r128_driver_lastclose(struct drm_device * dev); +extern int r128_driver_load(struct drm_device * dev, unsigned long flags); extern void r128_driver_preclose(struct drm_device * dev, struct drm_file *file_priv); Index: dev/drm/drmP.h =================================================================== --- dev/drm/drmP.h (revision 189052) +++ dev/drm/drmP.h (working copy) @@ -794,6 +794,7 @@ u32 drm_vblank_count(struct drm_device *dev, int crtc); int drm_vblank_get(struct drm_device *dev, int crtc); void drm_vblank_put(struct drm_device *dev, int crtc); +void drm_vblank_cleanup(struct drm_device *dev); int drm_vblank_wait(struct drm_device *dev, unsigned int *vbl_seq); int drm_vblank_init(struct drm_device *dev, int num_crtcs); void drm_vbl_send_signals(struct drm_device *dev, int crtc); Index: dev/drm/mach64_drv.c =================================================================== --- dev/drm/mach64_drv.c (revision 189044) +++ dev/drm/mach64_drv.c (working copy) @@ -54,6 +54,7 @@ DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ; dev->driver->buf_priv_size = 1; /* No dev_priv */ + dev->driver->load = mach64_driver_load; dev->driver->lastclose = mach64_driver_lastclose; dev->driver->get_vblank_counter = mach64_get_vblank_counter; dev->driver->enable_vblank = mach64_enable_vblank; @@ -94,6 +95,12 @@ return drm_attach(nbdev, mach64_pciidlist); } +int +mach64_driver_load(struct drm_device * dev, unsigned long flags) +{ + return drm_vblank_init(dev, 1); +} + static int mach64_detach(device_t nbdev) { Index: dev/drm/drm_drv.c =================================================================== --- dev/drm/drm_drv.c (revision 189053) +++ dev/drm/drm_drv.c (working copy) @@ -519,6 +519,8 @@ DRM_DEBUG("mtrr_del = %d", retcode); } + drm_vblank_cleanup(dev); + DRM_LOCK(); drm_lastclose(dev); DRM_UNLOCK(); Index: dev/drm/mach64_drv.h =================================================================== --- dev/drm/mach64_drv.h (revision 189044) +++ dev/drm/mach64_drv.h (working copy) @@ -166,6 +166,7 @@ extern int mach64_get_param(struct drm_device *dev, void *data, struct drm_file *file_priv); +extern int mach64_driver_load(struct drm_device * dev, unsigned long flags); extern u32 mach64_get_vblank_counter(struct drm_device *dev, int crtc); extern int mach64_enable_vblank(struct drm_device *dev, int crtc); extern void mach64_disable_vblank(struct drm_device *dev, int crtc); Index: dev/drm/r128_irq.c =================================================================== --- dev/drm/r128_irq.c (revision 189044) +++ dev/drm/r128_irq.c (working copy) @@ -105,7 +105,7 @@ int r128_driver_irq_postinstall(struct drm_device * dev) { - return drm_vblank_init(dev, 1); + return 0; } void r128_driver_irq_uninstall(struct drm_device * dev) Index: dev/drm/i915_drv.h =================================================================== --- dev/drm/i915_drv.h (revision 189054) +++ dev/drm/i915_drv.h (working copy) @@ -49,6 +49,8 @@ PIPE_B, }; +#define I915_NUM_PIPE 2 + /* Interface history: * * 1.1: Original. Index: dev/drm/mga_irq.c =================================================================== --- dev/drm/mga_irq.c (revision 189044) +++ dev/drm/mga_irq.c (working copy) @@ -157,12 +157,7 @@ int mga_driver_irq_postinstall(struct drm_device * dev) { drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private; - int ret; - ret = drm_vblank_init(dev, 1); - if (ret) - return ret; - DRM_INIT_WAITQUEUE(&dev_priv->fence_queue); /* Turn on soft trap interrupt. Vertical blank interrupts are enabled Index: dev/drm/radeon_irq.c =================================================================== --- dev/drm/radeon_irq.c (revision 189051) +++ dev/drm/radeon_irq.c (working copy) @@ -372,15 +372,10 @@ { drm_radeon_private_t *dev_priv = (drm_radeon_private_t *) dev->dev_private; - int ret; atomic_set(&dev_priv->swi_emitted, 0); DRM_INIT_WAITQUEUE(&dev_priv->swi_queue); - ret = drm_vblank_init(dev, 2); - if (ret) - return ret; - dev->max_vblank_count = 0x001fffff; radeon_irq_set_state(dev, RADEON_SW_INT_ENABLE, 1); Index: dev/drm/mga_dma.c =================================================================== --- dev/drm/mga_dma.c (revision 189044) +++ dev/drm/mga_dma.c (working copy) @@ -399,6 +399,7 @@ int mga_driver_load(struct drm_device *dev, unsigned long flags) { drm_mga_private_t *dev_priv; + int ret; dev_priv = drm_alloc(sizeof(drm_mga_private_t), DRM_MEM_DRIVER); if (!dev_priv) @@ -418,6 +419,13 @@ dev->types[7] = _DRM_STAT_PRIMARY; dev->types[8] = _DRM_STAT_SECONDARY; + ret = drm_vblank_init(dev, 1); + + if (ret) { + (void) mga_driver_unload(dev); + return ret; + } + return 0; }