aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/exynos/exynos_drm_drv.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-12-15 18:52:01 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2014-12-15 18:52:01 -0500
commit988adfdffdd43cfd841df734664727993076d7cb (patch)
tree6794f7bba8f595500c2b7d33376ad6614adcfaf2 /drivers/gpu/drm/exynos/exynos_drm_drv.c
parent26178ec11ef3c6c814bf16a0a2b9c2f7242e3c64 (diff)
parent4e0cd68115620bc3236ff4e58e4c073948629b41 (diff)
Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux
Pull drm updates from Dave Airlie: "Highlights: - AMD KFD driver merge This is the AMD HSA interface for exposing a lowlevel interface for GPGPU use. They have an open source userspace built on top of this interface, and the code looks as good as it was going to get out of tree. - Initial atomic modesetting work The need for an atomic modesetting interface to allow userspace to try and send a complete set of modesetting state to the driver has arisen, and been suffering from neglect this past year. No more, the start of the common code and changes for msm driver to use it are in this tree. Ongoing work to get the userspace ioctl finished and the code clean will probably wait until next kernel. - DisplayID 1.3 and tiled monitor exposed to userspace. Tiled monitor property is now exposed for userspace to make use of. - Rockchip drm driver merged. - imx gpu driver moved out of staging Other stuff: - core: panel - MIPI DSI + new panels. expose suggested x/y properties for virtual GPUs - i915: Initial Skylake (SKL) support gen3/4 reset work start of dri1/ums removal infoframe tracking fixes for lots of things. - nouveau: tegra k1 voltage support GM204 modesetting support GT21x memory reclocking work - radeon: CI dpm fixes GPUVM improvements Initial DPM fan control - rcar-du: HDMI support added removed some support for old boards slave encoder driver for Analog Devices adv7511 - exynos: Exynos4415 SoC support - msm: a4xx gpu support atomic helper conversion - tegra: iommu support universal plane support ganged-mode DSI support - sti: HDMI i2c improvements - vmwgfx: some late fixes. - qxl: use suggested x/y properties" * 'drm-next' of git://people.freedesktop.org/~airlied/linux: (969 commits) drm: sti: fix module compilation issue drm/i915: save/restore GMBUS freq across suspend/resume on gen4 drm: sti: correctly cleanup CRTC and planes drm: sti: add HQVDP plane drm: sti: add cursor plane drm: sti: enable auxiliary CRTC drm: sti: fix delay in VTG programming drm: sti: prepare sti_tvout to support auxiliary crtc drm: sti: use drm_crtc_vblank_{on/off} instead of drm_vblank_{on/off} drm: sti: fix hdmi avi infoframe drm: sti: remove event lock while disabling vblank drm: sti: simplify gdp code drm: sti: clear all mixer control drm: sti: remove gpio for HDMI hot plug detection drm: sti: allow to change hdmi ddc i2c adapter drm/doc: Document drm_add_modes_noedid() usage drm/i915: Remove '& 0xffff' from the mask given to WA_REG() drm/i915: Invert the mask and val arguments in wa_add() and WA_REG() drm: Zero out DRM object memory upon cleanup drm/i915/bdw: Fix the write setting up the WIZ hashing mode ...
Diffstat (limited to 'drivers/gpu/drm/exynos/exynos_drm_drv.c')
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_drv.c252
1 files changed, 95 insertions, 157 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c
index e277d4f12812..121470a83d1a 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c
@@ -203,8 +203,6 @@ static int exynos_drm_resume(struct drm_device *dev)
203 } 203 }
204 drm_modeset_unlock_all(dev); 204 drm_modeset_unlock_all(dev);
205 205
206 drm_helper_resume_force_mode(dev);
207
208 return 0; 206 return 0;
209} 207}
210 208
@@ -475,8 +473,6 @@ void exynos_drm_component_del(struct device *dev,
475 list_del(&cdev->list); 473 list_del(&cdev->list);
476 kfree(cdev); 474 kfree(cdev);
477 } 475 }
478
479 break;
480 } 476 }
481 477
482 mutex_unlock(&drm_component_lock); 478 mutex_unlock(&drm_component_lock);
@@ -556,182 +552,68 @@ static const struct component_master_ops exynos_drm_ops = {
556 .unbind = exynos_drm_unbind, 552 .unbind = exynos_drm_unbind,
557}; 553};
558 554
559static int exynos_drm_platform_probe(struct platform_device *pdev) 555static struct platform_driver *const exynos_drm_kms_drivers[] = {
560{
561 struct component_match *match;
562 int ret;
563
564 pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
565 exynos_drm_driver.num_ioctls = ARRAY_SIZE(exynos_ioctls);
566
567#ifdef CONFIG_DRM_EXYNOS_FIMD 556#ifdef CONFIG_DRM_EXYNOS_FIMD
568 ret = platform_driver_register(&fimd_driver); 557 &fimd_driver,
569 if (ret < 0)
570 return ret;
571#endif 558#endif
572
573#ifdef CONFIG_DRM_EXYNOS_DP 559#ifdef CONFIG_DRM_EXYNOS_DP
574 ret = platform_driver_register(&dp_driver); 560 &dp_driver,
575 if (ret < 0)
576 goto err_unregister_fimd_drv;
577#endif 561#endif
578
579#ifdef CONFIG_DRM_EXYNOS_DSI 562#ifdef CONFIG_DRM_EXYNOS_DSI
580 ret = platform_driver_register(&dsi_driver); 563 &dsi_driver,
581 if (ret < 0)
582 goto err_unregister_dp_drv;
583#endif 564#endif
584
585#ifdef CONFIG_DRM_EXYNOS_HDMI 565#ifdef CONFIG_DRM_EXYNOS_HDMI
586 ret = platform_driver_register(&mixer_driver); 566 &mixer_driver,
587 if (ret < 0) 567 &hdmi_driver,
588 goto err_unregister_dsi_drv;
589 ret = platform_driver_register(&hdmi_driver);
590 if (ret < 0)
591 goto err_unregister_mixer_drv;
592#endif 568#endif
569};
593 570
594 match = exynos_drm_match_add(&pdev->dev); 571static struct platform_driver *const exynos_drm_non_kms_drivers[] = {
595 if (IS_ERR(match)) {
596 ret = PTR_ERR(match);
597 goto err_unregister_hdmi_drv;
598 }
599
600 ret = component_master_add_with_match(&pdev->dev, &exynos_drm_ops,
601 match);
602 if (ret < 0)
603 goto err_unregister_hdmi_drv;
604
605#ifdef CONFIG_DRM_EXYNOS_G2D 572#ifdef CONFIG_DRM_EXYNOS_G2D
606 ret = platform_driver_register(&g2d_driver); 573 &g2d_driver,
607 if (ret < 0)
608 goto err_del_component_master;
609#endif 574#endif
610
611#ifdef CONFIG_DRM_EXYNOS_FIMC 575#ifdef CONFIG_DRM_EXYNOS_FIMC
612 ret = platform_driver_register(&fimc_driver); 576 &fimc_driver,
613 if (ret < 0)
614 goto err_unregister_g2d_drv;
615#endif 577#endif
616
617#ifdef CONFIG_DRM_EXYNOS_ROTATOR 578#ifdef CONFIG_DRM_EXYNOS_ROTATOR
618 ret = platform_driver_register(&rotator_driver); 579 &rotator_driver,
619 if (ret < 0)
620 goto err_unregister_fimc_drv;
621#endif 580#endif
622
623#ifdef CONFIG_DRM_EXYNOS_GSC 581#ifdef CONFIG_DRM_EXYNOS_GSC
624 ret = platform_driver_register(&gsc_driver); 582 &gsc_driver,
625 if (ret < 0)
626 goto err_unregister_rotator_drv;
627#endif
628
629#ifdef CONFIG_DRM_EXYNOS_IPP
630 ret = platform_driver_register(&ipp_driver);
631 if (ret < 0)
632 goto err_unregister_gsc_drv;
633
634 ret = exynos_platform_device_ipp_register();
635 if (ret < 0)
636 goto err_unregister_ipp_drv;
637#endif 583#endif
638
639 return ret;
640
641#ifdef CONFIG_DRM_EXYNOS_IPP 584#ifdef CONFIG_DRM_EXYNOS_IPP
642err_unregister_ipp_drv: 585 &ipp_driver,
643 platform_driver_unregister(&ipp_driver);
644err_unregister_gsc_drv:
645#endif
646
647#ifdef CONFIG_DRM_EXYNOS_GSC
648 platform_driver_unregister(&gsc_driver);
649err_unregister_rotator_drv:
650#endif 586#endif
587};
651 588
652#ifdef CONFIG_DRM_EXYNOS_ROTATOR 589static int exynos_drm_platform_probe(struct platform_device *pdev)
653 platform_driver_unregister(&rotator_driver); 590{
654err_unregister_fimc_drv: 591 struct component_match *match;
655#endif
656
657#ifdef CONFIG_DRM_EXYNOS_FIMC
658 platform_driver_unregister(&fimc_driver);
659err_unregister_g2d_drv:
660#endif
661
662#ifdef CONFIG_DRM_EXYNOS_G2D
663 platform_driver_unregister(&g2d_driver);
664err_del_component_master:
665#endif
666 component_master_del(&pdev->dev, &exynos_drm_ops);
667
668err_unregister_hdmi_drv:
669#ifdef CONFIG_DRM_EXYNOS_HDMI
670 platform_driver_unregister(&hdmi_driver);
671err_unregister_mixer_drv:
672 platform_driver_unregister(&mixer_driver);
673err_unregister_dsi_drv:
674#endif
675 592
676#ifdef CONFIG_DRM_EXYNOS_DSI 593 pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
677 platform_driver_unregister(&dsi_driver); 594 exynos_drm_driver.num_ioctls = ARRAY_SIZE(exynos_ioctls);
678err_unregister_dp_drv:
679#endif
680 595
681#ifdef CONFIG_DRM_EXYNOS_DP 596 match = exynos_drm_match_add(&pdev->dev);
682 platform_driver_unregister(&dp_driver); 597 if (IS_ERR(match)) {
683err_unregister_fimd_drv: 598 return PTR_ERR(match);
684#endif 599 }
685 600
686#ifdef CONFIG_DRM_EXYNOS_FIMD 601 return component_master_add_with_match(&pdev->dev, &exynos_drm_ops,
687 platform_driver_unregister(&fimd_driver); 602 match);
688#endif
689 return ret;
690} 603}
691 604
692static int exynos_drm_platform_remove(struct platform_device *pdev) 605static int exynos_drm_platform_remove(struct platform_device *pdev)
693{ 606{
694#ifdef CONFIG_DRM_EXYNOS_IPP
695 exynos_platform_device_ipp_unregister();
696 platform_driver_unregister(&ipp_driver);
697#endif
698
699#ifdef CONFIG_DRM_EXYNOS_GSC
700 platform_driver_unregister(&gsc_driver);
701#endif
702
703#ifdef CONFIG_DRM_EXYNOS_ROTATOR
704 platform_driver_unregister(&rotator_driver);
705#endif
706
707#ifdef CONFIG_DRM_EXYNOS_FIMC
708 platform_driver_unregister(&fimc_driver);
709#endif
710
711#ifdef CONFIG_DRM_EXYNOS_G2D
712 platform_driver_unregister(&g2d_driver);
713#endif
714
715#ifdef CONFIG_DRM_EXYNOS_HDMI
716 platform_driver_unregister(&mixer_driver);
717 platform_driver_unregister(&hdmi_driver);
718#endif
719
720#ifdef CONFIG_DRM_EXYNOS_FIMD
721 platform_driver_unregister(&fimd_driver);
722#endif
723
724#ifdef CONFIG_DRM_EXYNOS_DSI
725 platform_driver_unregister(&dsi_driver);
726#endif
727
728#ifdef CONFIG_DRM_EXYNOS_DP
729 platform_driver_unregister(&dp_driver);
730#endif
731 component_master_del(&pdev->dev, &exynos_drm_ops); 607 component_master_del(&pdev->dev, &exynos_drm_ops);
732 return 0; 608 return 0;
733} 609}
734 610
611static const char * const strings[] = {
612 "samsung,exynos3",
613 "samsung,exynos4",
614 "samsung,exynos5",
615};
616
735static struct platform_driver exynos_drm_platform_driver = { 617static struct platform_driver exynos_drm_platform_driver = {
736 .probe = exynos_drm_platform_probe, 618 .probe = exynos_drm_platform_probe,
737 .remove = exynos_drm_platform_remove, 619 .remove = exynos_drm_platform_remove,
@@ -743,7 +625,25 @@ static struct platform_driver exynos_drm_platform_driver = {
743 625
744static int exynos_drm_init(void) 626static int exynos_drm_init(void)
745{ 627{
746 int ret; 628 bool is_exynos = false;
629 int ret, i, j;
630
631 /*
632 * Register device object only in case of Exynos SoC.
633 *
634 * Below codes resolves temporarily infinite loop issue incurred
635 * by Exynos drm driver when using multi-platform kernel.
636 * So these codes will be replaced with more generic way later.
637 */
638 for (i = 0; i < ARRAY_SIZE(strings); i++) {
639 if (of_machine_is_compatible(strings[i])) {
640 is_exynos = true;
641 break;
642 }
643 }
644
645 if (!is_exynos)
646 return -ENODEV;
747 647
748 /* 648 /*
749 * Register device object only in case of Exynos SoC. 649 * Register device object only in case of Exynos SoC.
@@ -762,24 +662,50 @@ static int exynos_drm_init(void)
762 if (IS_ERR(exynos_drm_pdev)) 662 if (IS_ERR(exynos_drm_pdev))
763 return PTR_ERR(exynos_drm_pdev); 663 return PTR_ERR(exynos_drm_pdev);
764 664
765#ifdef CONFIG_DRM_EXYNOS_VIDI
766 ret = exynos_drm_probe_vidi(); 665 ret = exynos_drm_probe_vidi();
767 if (ret < 0) 666 if (ret < 0)
768 goto err_unregister_pd; 667 goto err_unregister_pd;
668
669 for (i = 0; i < ARRAY_SIZE(exynos_drm_kms_drivers); ++i) {
670 ret = platform_driver_register(exynos_drm_kms_drivers[i]);
671 if (ret < 0)
672 goto err_unregister_kms_drivers;
673 }
674
675 for (j = 0; j < ARRAY_SIZE(exynos_drm_non_kms_drivers); ++j) {
676 ret = platform_driver_register(exynos_drm_non_kms_drivers[j]);
677 if (ret < 0)
678 goto err_unregister_non_kms_drivers;
679 }
680
681#ifdef CONFIG_DRM_EXYNOS_IPP
682 ret = exynos_platform_device_ipp_register();
683 if (ret < 0)
684 goto err_unregister_non_kms_drivers;
769#endif 685#endif
770 686
771 ret = platform_driver_register(&exynos_drm_platform_driver); 687 ret = platform_driver_register(&exynos_drm_platform_driver);
772 if (ret) 688 if (ret)
773 goto err_remove_vidi; 689 goto err_unregister_resources;
774 690
775 return 0; 691 return 0;
776 692
777err_remove_vidi: 693err_unregister_resources:
778#ifdef CONFIG_DRM_EXYNOS_VIDI 694#ifdef CONFIG_DRM_EXYNOS_IPP
695 exynos_platform_device_ipp_unregister();
696#endif
697
698err_unregister_non_kms_drivers:
699 while (--j >= 0)
700 platform_driver_unregister(exynos_drm_non_kms_drivers[j]);
701
702err_unregister_kms_drivers:
703 while (--i >= 0)
704 platform_driver_unregister(exynos_drm_kms_drivers[i]);
705
779 exynos_drm_remove_vidi(); 706 exynos_drm_remove_vidi();
780 707
781err_unregister_pd: 708err_unregister_pd:
782#endif
783 platform_device_unregister(exynos_drm_pdev); 709 platform_device_unregister(exynos_drm_pdev);
784 710
785 return ret; 711 return ret;
@@ -787,10 +713,22 @@ err_unregister_pd:
787 713
788static void exynos_drm_exit(void) 714static void exynos_drm_exit(void)
789{ 715{
716 int i;
717
718#ifdef CONFIG_DRM_EXYNOS_IPP
719 exynos_platform_device_ipp_unregister();
720#endif
721
722 for (i = ARRAY_SIZE(exynos_drm_non_kms_drivers) - 1; i >= 0; --i)
723 platform_driver_unregister(exynos_drm_non_kms_drivers[i]);
724
725 for (i = ARRAY_SIZE(exynos_drm_kms_drivers) - 1; i >= 0; --i)
726 platform_driver_unregister(exynos_drm_kms_drivers[i]);
727
790 platform_driver_unregister(&exynos_drm_platform_driver); 728 platform_driver_unregister(&exynos_drm_platform_driver);
791#ifdef CONFIG_DRM_EXYNOS_VIDI 729
792 exynos_drm_remove_vidi(); 730 exynos_drm_remove_vidi();
793#endif 731
794 platform_device_unregister(exynos_drm_pdev); 732 platform_device_unregister(exynos_drm_pdev);
795} 733}
796 734