aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/vmwgfx/vmwgfx_drv.c')
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_drv.c47
1 files changed, 26 insertions, 21 deletions
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index 23e29f3a0c33..6bbe703e7d97 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -374,17 +374,6 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
374 374
375 dev->dev_private = dev_priv; 375 dev->dev_private = dev_priv;
376 376
377 if (!dev->devname)
378 dev->devname = vmw_devname;
379
380 if (dev_priv->capabilities & SVGA_CAP_IRQMASK) {
381 ret = drm_irq_install(dev);
382 if (unlikely(ret != 0)) {
383 DRM_ERROR("Failed installing irq: %d\n", ret);
384 goto out_no_irq;
385 }
386 }
387
388 ret = pci_request_regions(dev->pdev, "vmwgfx probe"); 377 ret = pci_request_regions(dev->pdev, "vmwgfx probe");
389 dev_priv->stealth = (ret != 0); 378 dev_priv->stealth = (ret != 0);
390 if (dev_priv->stealth) { 379 if (dev_priv->stealth) {
@@ -400,7 +389,9 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
400 goto out_no_device; 389 goto out_no_device;
401 } 390 }
402 } 391 }
403 vmw_kms_init(dev_priv); 392 ret = vmw_kms_init(dev_priv);
393 if (unlikely(ret != 0))
394 goto out_no_kms;
404 vmw_overlay_init(dev_priv); 395 vmw_overlay_init(dev_priv);
405 if (dev_priv->enable_fb) { 396 if (dev_priv->enable_fb) {
406 ret = vmw_3d_resource_inc(dev_priv); 397 ret = vmw_3d_resource_inc(dev_priv);
@@ -416,24 +407,37 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
416 "running the device in SVGA mode yet.\n"); 407 "running the device in SVGA mode yet.\n");
417 } 408 }
418 409
410 if (!dev->devname)
411 dev->devname = vmw_devname;
412
413 if (dev_priv->capabilities & SVGA_CAP_IRQMASK) {
414 ret = drm_irq_install(dev);
415 if (unlikely(ret != 0)) {
416 DRM_ERROR("Failed installing irq: %d\n", ret);
417 goto out_no_irq;
418 }
419 }
420
419 dev_priv->pm_nb.notifier_call = vmwgfx_pm_notifier; 421 dev_priv->pm_nb.notifier_call = vmwgfx_pm_notifier;
420 register_pm_notifier(&dev_priv->pm_nb); 422 register_pm_notifier(&dev_priv->pm_nb);
421 423
422 return 0; 424 return 0;
423 425
426out_no_irq:
427 if (dev_priv->enable_fb) {
428 vmw_fb_close(dev_priv);
429 vmw_kms_restore_vga(dev_priv);
430 vmw_3d_resource_dec(dev_priv);
431 }
424out_no_fifo: 432out_no_fifo:
425 vmw_overlay_close(dev_priv); 433 vmw_overlay_close(dev_priv);
426 vmw_kms_close(dev_priv); 434 vmw_kms_close(dev_priv);
435out_no_kms:
427 if (dev_priv->stealth) 436 if (dev_priv->stealth)
428 pci_release_region(dev->pdev, 2); 437 pci_release_region(dev->pdev, 2);
429 else 438 else
430 pci_release_regions(dev->pdev); 439 pci_release_regions(dev->pdev);
431out_no_device: 440out_no_device:
432 if (dev_priv->capabilities & SVGA_CAP_IRQMASK)
433 drm_irq_uninstall(dev_priv->dev);
434 if (dev->devname == vmw_devname)
435 dev->devname = NULL;
436out_no_irq:
437 ttm_object_device_release(&dev_priv->tdev); 441 ttm_object_device_release(&dev_priv->tdev);
438out_err4: 442out_err4:
439 iounmap(dev_priv->mmio_virt); 443 iounmap(dev_priv->mmio_virt);
@@ -460,6 +464,10 @@ static int vmw_driver_unload(struct drm_device *dev)
460 464
461 unregister_pm_notifier(&dev_priv->pm_nb); 465 unregister_pm_notifier(&dev_priv->pm_nb);
462 466
467 if (dev_priv->capabilities & SVGA_CAP_IRQMASK)
468 drm_irq_uninstall(dev_priv->dev);
469 if (dev->devname == vmw_devname)
470 dev->devname = NULL;
463 if (dev_priv->enable_fb) { 471 if (dev_priv->enable_fb) {
464 vmw_fb_close(dev_priv); 472 vmw_fb_close(dev_priv);
465 vmw_kms_restore_vga(dev_priv); 473 vmw_kms_restore_vga(dev_priv);
@@ -472,10 +480,6 @@ static int vmw_driver_unload(struct drm_device *dev)
472 else 480 else
473 pci_release_regions(dev->pdev); 481 pci_release_regions(dev->pdev);
474 482
475 if (dev_priv->capabilities & SVGA_CAP_IRQMASK)
476 drm_irq_uninstall(dev_priv->dev);
477 if (dev->devname == vmw_devname)
478 dev->devname = NULL;
479 ttm_object_device_release(&dev_priv->tdev); 483 ttm_object_device_release(&dev_priv->tdev);
480 iounmap(dev_priv->mmio_virt); 484 iounmap(dev_priv->mmio_virt);
481 drm_mtrr_del(dev_priv->mmio_mtrr, dev_priv->mmio_start, 485 drm_mtrr_del(dev_priv->mmio_mtrr, dev_priv->mmio_start,
@@ -798,6 +802,7 @@ static struct drm_driver driver = {
798 .irq_postinstall = vmw_irq_postinstall, 802 .irq_postinstall = vmw_irq_postinstall,
799 .irq_uninstall = vmw_irq_uninstall, 803 .irq_uninstall = vmw_irq_uninstall,
800 .irq_handler = vmw_irq_handler, 804 .irq_handler = vmw_irq_handler,
805 .get_vblank_counter = vmw_get_vblank_counter,
801 .reclaim_buffers_locked = NULL, 806 .reclaim_buffers_locked = NULL,
802 .get_map_ofs = drm_core_get_map_ofs, 807 .get_map_ofs = drm_core_get_map_ofs,
803 .get_reg_ofs = drm_core_get_reg_ofs, 808 .get_reg_ofs = drm_core_get_reg_ofs,