drm: move drm vblank initialization/cleanup to driver load/unload

drm vblank initialization keeps track of the changes in driver-supplied
frame counts across vt switch and mode setting, but only if you let it by
not tearing down the drm vblank structure.

Signed-off-by: Keith Packard <keithp@keithp.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>

authored by Keith Packard and committed by Dave Airlie 52440211 6133047a

+45 -21
+2
drivers/gpu/drm/drm_drv.c
··· 305 305 return; 306 306 } 307 307 308 + drm_vblank_cleanup(dev); 309 + 308 310 drm_lastclose(dev); 309 311 310 312 if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) &&
+1 -3
drivers/gpu/drm/drm_irq.c
··· 94 94 } 95 95 } 96 96 97 - static void drm_vblank_cleanup(struct drm_device *dev) 97 + void drm_vblank_cleanup(struct drm_device *dev) 98 98 { 99 99 /* Bail if the driver didn't call drm_vblank_init() */ 100 100 if (dev->num_crtcs == 0) ··· 277 277 dev->driver->irq_uninstall(dev); 278 278 279 279 free_irq(dev->pdev->irq, dev); 280 - 281 - drm_vblank_cleanup(dev); 282 280 283 281 return 0; 284 282 }
+7
drivers/gpu/drm/i915/i915_dma.c
··· 856 856 857 857 spin_lock_init(&dev_priv->user_irq_lock); 858 858 859 + ret = drm_vblank_init(dev, I915_NUM_PIPE); 860 + 861 + if (ret) { 862 + (void) i915_driver_unload(dev); 863 + return ret; 864 + } 865 + 859 866 return ret; 860 867 } 861 868
+2
drivers/gpu/drm/i915/i915_drv.h
··· 47 47 PIPE_B, 48 48 }; 49 49 50 + #define I915_NUM_PIPE 2 51 + 50 52 /* Interface history: 51 53 * 52 54 * 1.1: Original.
-5
drivers/gpu/drm/i915/i915_irq.c
··· 498 498 int i915_driver_irq_postinstall(struct drm_device *dev) 499 499 { 500 500 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 501 - int ret, num_pipes = 2; 502 - 503 - ret = drm_vblank_init(dev, num_pipes); 504 - if (ret) 505 - return ret; 506 501 507 502 dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B; 508 503
+8
drivers/gpu/drm/mga/mga_dma.c
··· 396 396 int mga_driver_load(struct drm_device * dev, unsigned long flags) 397 397 { 398 398 drm_mga_private_t *dev_priv; 399 + int ret; 399 400 400 401 dev_priv = drm_alloc(sizeof(drm_mga_private_t), DRM_MEM_DRIVER); 401 402 if (!dev_priv) ··· 415 414 dev->types[6] = _DRM_STAT_IRQ; 416 415 dev->types[7] = _DRM_STAT_PRIMARY; 417 416 dev->types[8] = _DRM_STAT_SECONDARY; 417 + 418 + ret = drm_vblank_init(dev, 1); 419 + 420 + if (ret) { 421 + (void) mga_driver_unload(dev); 422 + return ret; 423 + } 418 424 419 425 return 0; 420 426 }
-5
drivers/gpu/drm/mga/mga_irq.c
··· 152 152 int mga_driver_irq_postinstall(struct drm_device *dev) 153 153 { 154 154 drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private; 155 - int ret; 156 - 157 - ret = drm_vblank_init(dev, 1); 158 - if (ret) 159 - return ret; 160 155 161 156 DRM_INIT_WAITQUEUE(&dev_priv->fence_queue); 162 157
+6
drivers/gpu/drm/r128/r128_drv.c
··· 45 45 DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_SG | 46 46 DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED, 47 47 .dev_priv_size = sizeof(drm_r128_buf_priv_t), 48 + .load = r128_driver_load, 48 49 .preclose = r128_driver_preclose, 49 50 .lastclose = r128_driver_lastclose, 50 51 .get_vblank_counter = r128_get_vblank_counter, ··· 84 83 .minor = DRIVER_MINOR, 85 84 .patchlevel = DRIVER_PATCHLEVEL, 86 85 }; 86 + 87 + int r128_driver_load(struct drm_device * dev, unsigned long flags) 88 + { 89 + return drm_vblank_init(dev, 1); 90 + } 87 91 88 92 static int __init r128_init(void) 89 93 {
+1
drivers/gpu/drm/r128/r128_drv.h
··· 159 159 extern int r128_driver_irq_postinstall(struct drm_device *dev); 160 160 extern void r128_driver_irq_uninstall(struct drm_device * dev); 161 161 extern void r128_driver_lastclose(struct drm_device * dev); 162 + extern int r128_driver_load(struct drm_device * dev, unsigned long flags); 162 163 extern void r128_driver_preclose(struct drm_device * dev, 163 164 struct drm_file *file_priv); 164 165
+1 -1
drivers/gpu/drm/r128/r128_irq.c
··· 102 102 103 103 int r128_driver_irq_postinstall(struct drm_device *dev) 104 104 { 105 - return drm_vblank_init(dev, 1); 105 + return 0; 106 106 } 107 107 108 108 void r128_driver_irq_uninstall(struct drm_device * dev)
+6
drivers/gpu/drm/radeon/radeon_cp.c
··· 1757 1757 if (ret != 0) 1758 1758 return ret; 1759 1759 1760 + ret = drm_vblank_init(dev, 2); 1761 + if (ret) { 1762 + radeon_driver_unload(dev); 1763 + return ret; 1764 + } 1765 + 1760 1766 DRM_DEBUG("%s card detected\n", 1761 1767 ((dev_priv->flags & RADEON_IS_AGP) ? "AGP" : (((dev_priv->flags & RADEON_IS_PCIE) ? "PCIE" : "PCI")))); 1762 1768 return ret;
-5
drivers/gpu/drm/radeon/radeon_irq.c
··· 337 337 { 338 338 drm_radeon_private_t *dev_priv = 339 339 (drm_radeon_private_t *) dev->dev_private; 340 - int ret; 341 340 342 341 atomic_set(&dev_priv->swi_emitted, 0); 343 342 DRM_INIT_WAITQUEUE(&dev_priv->swi_queue); 344 - 345 - ret = drm_vblank_init(dev, 2); 346 - if (ret) 347 - return ret; 348 343 349 344 dev->max_vblank_count = 0x001fffff; 350 345
-1
drivers/gpu/drm/via/via_irq.c
··· 314 314 if (!dev_priv) 315 315 return -EINVAL; 316 316 317 - drm_vblank_init(dev, 1); 318 317 status = VIA_READ(VIA_REG_INTERRUPT); 319 318 VIA_WRITE(VIA_REG_INTERRUPT, status | VIA_IRQ_GLOBAL 320 319 | dev_priv->irq_enable_mask);
+10 -1
drivers/gpu/drm/via/via_map.c
··· 107 107 ret = drm_sman_init(&dev_priv->sman, 2, 12, 8); 108 108 if (ret) { 109 109 drm_free(dev_priv, sizeof(*dev_priv), DRM_MEM_DRIVER); 110 + return ret; 110 111 } 111 - return ret; 112 + 113 + ret = drm_vblank_init(dev, 1); 114 + if (ret) { 115 + drm_sman_takedown(&dev_priv->sman); 116 + drm_free(dev_priv, sizeof(drm_via_private_t), DRM_MEM_DRIVER); 117 + return ret; 118 + } 119 + 120 + return 0; 112 121 } 113 122 114 123 int via_driver_unload(struct drm_device *dev)
+1
include/drm/drmP.h
··· 1151 1151 extern void drm_handle_vblank(struct drm_device *dev, int crtc); 1152 1152 extern int drm_vblank_get(struct drm_device *dev, int crtc); 1153 1153 extern void drm_vblank_put(struct drm_device *dev, int crtc); 1154 + extern void drm_vblank_cleanup(struct drm_device *dev); 1154 1155 /* Modesetting support */ 1155 1156 extern int drm_modeset_ctl(struct drm_device *dev, void *data, 1156 1157 struct drm_file *file_priv);