aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/omapdrm
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/omapdrm')
-rw-r--r--drivers/gpu/drm/omapdrm/omap_connector.c2
-rw-r--r--drivers/gpu/drm/omapdrm/omap_drv.c211
2 files changed, 105 insertions, 108 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
index 691cffebb76e..f90e2d22c5ec 100644
--- a/drivers/gpu/drm/omapdrm/omap_connector.c
+++ b/drivers/gpu/drm/omapdrm/omap_connector.c
@@ -240,8 +240,6 @@ struct drm_connector *omap_connector_init(struct drm_device *dev,
240 connector->interlace_allowed = 1; 240 connector->interlace_allowed = 1;
241 connector->doublescan_allowed = 0; 241 connector->doublescan_allowed = 0;
242 242
243 drm_connector_register(connector);
244
245 return connector; 243 return connector;
246 244
247fail: 245fail:
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index 0a2d461d62cf..00aa214b7560 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -493,11 +493,6 @@ static int omap_modeset_init(struct drm_device *dev)
493 return 0; 493 return 0;
494} 494}
495 495
496static void omap_modeset_free(struct drm_device *dev)
497{
498 drm_mode_config_cleanup(dev);
499}
500
501/* 496/*
502 * drm ioctl funcs 497 * drm ioctl funcs
503 */ 498 */
@@ -633,95 +628,6 @@ static const struct drm_ioctl_desc ioctls[DRM_COMMAND_END - DRM_COMMAND_BASE] =
633 * drm driver funcs 628 * drm driver funcs
634 */ 629 */
635 630
636/**
637 * load - setup chip and create an initial config
638 * @dev: DRM device
639 * @flags: startup flags
640 *
641 * The driver load routine has to do several things:
642 * - initialize the memory manager
643 * - allocate initial config memory
644 * - setup the DRM framebuffer with the allocated memory
645 */
646static int dev_load(struct drm_device *dev, unsigned long flags)
647{
648 struct omap_drm_platform_data *pdata = dev->dev->platform_data;
649 struct omap_drm_private *priv;
650 unsigned int i;
651 int ret;
652
653 DBG("load: dev=%p", dev);
654
655 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
656 if (!priv)
657 return -ENOMEM;
658
659 priv->omaprev = pdata->omaprev;
660
661 dev->dev_private = priv;
662
663 priv->wq = alloc_ordered_workqueue("omapdrm", 0);
664 init_waitqueue_head(&priv->commit.wait);
665 spin_lock_init(&priv->commit.lock);
666
667 spin_lock_init(&priv->list_lock);
668 INIT_LIST_HEAD(&priv->obj_list);
669
670 omap_gem_init(dev);
671
672 ret = omap_modeset_init(dev);
673 if (ret) {
674 dev_err(dev->dev, "omap_modeset_init failed: ret=%d\n", ret);
675 dev->dev_private = NULL;
676 kfree(priv);
677 return ret;
678 }
679
680 /* Initialize vblank handling, start with all CRTCs disabled. */
681 ret = drm_vblank_init(dev, priv->num_crtcs);
682 if (ret)
683 dev_warn(dev->dev, "could not init vblank\n");
684
685 for (i = 0; i < priv->num_crtcs; i++)
686 drm_crtc_vblank_off(priv->crtcs[i]);
687
688 priv->fbdev = omap_fbdev_init(dev);
689
690 /* store off drm_device for use in pm ops */
691 dev_set_drvdata(dev->dev, dev);
692
693 drm_kms_helper_poll_init(dev);
694
695 return 0;
696}
697
698static int dev_unload(struct drm_device *dev)
699{
700 struct omap_drm_private *priv = dev->dev_private;
701
702 DBG("unload: dev=%p", dev);
703
704 drm_kms_helper_poll_fini(dev);
705
706 if (priv->fbdev)
707 omap_fbdev_free(dev);
708
709 omap_modeset_free(dev);
710 omap_gem_deinit(dev);
711
712 destroy_workqueue(priv->wq);
713
714 drm_vblank_cleanup(dev);
715 omap_drm_irq_uninstall(dev);
716
717 kfree(dev->dev_private);
718 dev->dev_private = NULL;
719
720 dev_set_drvdata(dev->dev, NULL);
721
722 return 0;
723}
724
725static int dev_open(struct drm_device *dev, struct drm_file *file) 631static int dev_open(struct drm_device *dev, struct drm_file *file)
726{ 632{
727 file->driver_priv = NULL; 633 file->driver_priv = NULL;
@@ -806,8 +712,6 @@ static const struct file_operations omapdriver_fops = {
806static struct drm_driver omap_drm_driver = { 712static struct drm_driver omap_drm_driver = {
807 .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME | 713 .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME |
808 DRIVER_ATOMIC, 714 DRIVER_ATOMIC,
809 .load = dev_load,
810 .unload = dev_unload,
811 .open = dev_open, 715 .open = dev_open,
812 .lastclose = dev_lastclose, 716 .lastclose = dev_lastclose,
813 .get_vblank_counter = drm_vblank_no_hw_counter, 717 .get_vblank_counter = drm_vblank_no_hw_counter,
@@ -837,30 +741,125 @@ static struct drm_driver omap_drm_driver = {
837 .patchlevel = DRIVER_PATCHLEVEL, 741 .patchlevel = DRIVER_PATCHLEVEL,
838}; 742};
839 743
840static int pdev_probe(struct platform_device *device) 744static int pdev_probe(struct platform_device *pdev)
841{ 745{
842 int r; 746 struct omap_drm_platform_data *pdata = pdev->dev.platform_data;
747 struct omap_drm_private *priv;
748 struct drm_device *ddev;
749 unsigned int i;
750 int ret;
751
752 DBG("%s", pdev->name);
843 753
844 if (omapdss_is_initialized() == false) 754 if (omapdss_is_initialized() == false)
845 return -EPROBE_DEFER; 755 return -EPROBE_DEFER;
846 756
847 omap_crtc_pre_init(); 757 omap_crtc_pre_init();
848 758
849 r = omap_connect_dssdevs(); 759 ret = omap_connect_dssdevs();
850 if (r) { 760 if (ret)
851 omap_crtc_pre_uninit(); 761 goto err_crtc_uninit;
852 return r; 762
763 /* Allocate and initialize the driver private structure. */
764 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
765 if (!priv) {
766 ret = -ENOMEM;
767 goto err_disconnect_dssdevs;
768 }
769
770 priv->omaprev = pdata->omaprev;
771 priv->wq = alloc_ordered_workqueue("omapdrm", 0);
772
773 init_waitqueue_head(&priv->commit.wait);
774 spin_lock_init(&priv->commit.lock);
775 spin_lock_init(&priv->list_lock);
776 INIT_LIST_HEAD(&priv->obj_list);
777
778 /* Allocate and initialize the DRM device. */
779 ddev = drm_dev_alloc(&omap_drm_driver, &pdev->dev);
780 if (IS_ERR(ddev)) {
781 ret = PTR_ERR(ddev);
782 goto err_free_priv;
783 }
784
785 ddev->dev_private = priv;
786 platform_set_drvdata(pdev, ddev);
787
788 omap_gem_init(ddev);
789
790 ret = omap_modeset_init(ddev);
791 if (ret) {
792 dev_err(&pdev->dev, "omap_modeset_init failed: ret=%d\n", ret);
793 goto err_free_drm_dev;
794 }
795
796 /* Initialize vblank handling, start with all CRTCs disabled. */
797 ret = drm_vblank_init(ddev, priv->num_crtcs);
798 if (ret) {
799 dev_err(&pdev->dev, "could not init vblank\n");
800 goto err_cleanup_modeset;
853 } 801 }
854 802
855 DBG("%s", device->name); 803 for (i = 0; i < priv->num_crtcs; i++)
856 return drm_platform_init(&omap_drm_driver, device); 804 drm_crtc_vblank_off(priv->crtcs[i]);
805
806 priv->fbdev = omap_fbdev_init(ddev);
807
808 drm_kms_helper_poll_init(ddev);
809
810 /*
811 * Register the DRM device with the core and the connectors with
812 * sysfs.
813 */
814 ret = drm_dev_register(ddev, 0);
815 if (ret)
816 goto err_cleanup_helpers;
817
818 return 0;
819
820err_cleanup_helpers:
821 drm_kms_helper_poll_fini(ddev);
822 if (priv->fbdev)
823 omap_fbdev_free(ddev);
824err_cleanup_modeset:
825 drm_mode_config_cleanup(ddev);
826 omap_drm_irq_uninstall(ddev);
827err_free_drm_dev:
828 omap_gem_deinit(ddev);
829 drm_dev_unref(ddev);
830err_free_priv:
831 destroy_workqueue(priv->wq);
832 kfree(priv);
833err_disconnect_dssdevs:
834 omap_disconnect_dssdevs();
835err_crtc_uninit:
836 omap_crtc_pre_uninit();
837 return ret;
857} 838}
858 839
859static int pdev_remove(struct platform_device *device) 840static int pdev_remove(struct platform_device *pdev)
860{ 841{
842 struct drm_device *ddev = platform_get_drvdata(pdev);
843 struct omap_drm_private *priv = ddev->dev_private;
844
861 DBG(""); 845 DBG("");
862 846
863 drm_put_dev(platform_get_drvdata(device)); 847 drm_dev_unregister(ddev);
848
849 drm_kms_helper_poll_fini(ddev);
850
851 if (priv->fbdev)
852 omap_fbdev_free(ddev);
853
854 drm_mode_config_cleanup(ddev);
855
856 omap_drm_irq_uninstall(ddev);
857 omap_gem_deinit(ddev);
858
859 drm_dev_unref(ddev);
860
861 destroy_workqueue(priv->wq);
862 kfree(priv);
864 863
865 omap_disconnect_dssdevs(); 864 omap_disconnect_dssdevs();
866 omap_crtc_pre_uninit(); 865 omap_crtc_pre_uninit();