diff options
Diffstat (limited to 'drivers/gpu/drm/vmwgfx/vmwgfx_drv.c')
-rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 47 |
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 | ||
426 | out_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 | } | ||
424 | out_no_fifo: | 432 | out_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); |
435 | out_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); |
431 | out_no_device: | 440 | out_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; | ||
436 | out_no_irq: | ||
437 | ttm_object_device_release(&dev_priv->tdev); | 441 | ttm_object_device_release(&dev_priv->tdev); |
438 | out_err4: | 442 | out_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, |