diff options
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_drv.c')
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_drv.c | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c index bf39fcc49e0f..c8270e4b26f3 100644 --- a/drivers/gpu/drm/omapdrm/omap_drv.c +++ b/drivers/gpu/drm/omapdrm/omap_drv.c | |||
@@ -513,12 +513,18 @@ static int dev_load(struct drm_device *dev, unsigned long flags) | |||
513 | static int dev_unload(struct drm_device *dev) | 513 | static int dev_unload(struct drm_device *dev) |
514 | { | 514 | { |
515 | struct omap_drm_private *priv = dev->dev_private; | 515 | struct omap_drm_private *priv = dev->dev_private; |
516 | int i; | ||
516 | 517 | ||
517 | DBG("unload: dev=%p", dev); | 518 | DBG("unload: dev=%p", dev); |
518 | 519 | ||
519 | drm_kms_helper_poll_fini(dev); | 520 | drm_kms_helper_poll_fini(dev); |
520 | 521 | ||
521 | omap_fbdev_free(dev); | 522 | omap_fbdev_free(dev); |
523 | |||
524 | /* flush crtcs so the fbs get released */ | ||
525 | for (i = 0; i < priv->num_crtcs; i++) | ||
526 | omap_crtc_flush(priv->crtcs[i]); | ||
527 | |||
522 | omap_modeset_free(dev); | 528 | omap_modeset_free(dev); |
523 | omap_gem_deinit(dev); | 529 | omap_gem_deinit(dev); |
524 | 530 | ||
@@ -696,10 +702,11 @@ static int pdev_remove(struct platform_device *device) | |||
696 | { | 702 | { |
697 | DBG(""); | 703 | DBG(""); |
698 | 704 | ||
705 | drm_put_dev(platform_get_drvdata(device)); | ||
706 | |||
699 | omap_disconnect_dssdevs(); | 707 | omap_disconnect_dssdevs(); |
700 | omap_crtc_pre_uninit(); | 708 | omap_crtc_pre_uninit(); |
701 | 709 | ||
702 | drm_put_dev(platform_get_drvdata(device)); | ||
703 | return 0; | 710 | return 0; |
704 | } | 711 | } |
705 | 712 | ||
@@ -726,18 +733,33 @@ static struct platform_driver pdev = { | |||
726 | 733 | ||
727 | static int __init omap_drm_init(void) | 734 | static int __init omap_drm_init(void) |
728 | { | 735 | { |
736 | int r; | ||
737 | |||
729 | DBG("init"); | 738 | DBG("init"); |
730 | if (platform_driver_register(&omap_dmm_driver)) { | 739 | |
731 | /* we can continue on without DMM.. so not fatal */ | 740 | r = platform_driver_register(&omap_dmm_driver); |
732 | dev_err(NULL, "DMM registration failed\n"); | 741 | if (r) { |
742 | pr_err("DMM driver registration failed\n"); | ||
743 | return r; | ||
744 | } | ||
745 | |||
746 | r = platform_driver_register(&pdev); | ||
747 | if (r) { | ||
748 | pr_err("omapdrm driver registration failed\n"); | ||
749 | platform_driver_unregister(&omap_dmm_driver); | ||
750 | return r; | ||
733 | } | 751 | } |
734 | return platform_driver_register(&pdev); | 752 | |
753 | return 0; | ||
735 | } | 754 | } |
736 | 755 | ||
737 | static void __exit omap_drm_fini(void) | 756 | static void __exit omap_drm_fini(void) |
738 | { | 757 | { |
739 | DBG("fini"); | 758 | DBG("fini"); |
759 | |||
740 | platform_driver_unregister(&pdev); | 760 | platform_driver_unregister(&pdev); |
761 | |||
762 | platform_driver_unregister(&omap_dmm_driver); | ||
741 | } | 763 | } |
742 | 764 | ||
743 | /* need late_initcall() so we load after dss_driver's are loaded */ | 765 | /* need late_initcall() so we load after dss_driver's are loaded */ |