aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mfd/omap-usb-host.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mfd/omap-usb-host.c')
-rw-r--r--drivers/mfd/omap-usb-host.c189
1 files changed, 90 insertions, 99 deletions
diff --git a/drivers/mfd/omap-usb-host.c b/drivers/mfd/omap-usb-host.c
index 90b630ccc8bc..651e249287dc 100644
--- a/drivers/mfd/omap-usb-host.c
+++ b/drivers/mfd/omap-usb-host.c
@@ -665,55 +665,78 @@ static int usbhs_omap_probe(struct platform_device *pdev)
665 goto err_mem; 665 goto err_mem;
666 } 666 }
667 667
668 need_logic_fck = false; 668 /* Set all clocks as invalid to begin with */
669 omap->ehci_logic_fck = ERR_PTR(-ENODEV);
670 omap->init_60m_fclk = ERR_PTR(-ENODEV);
671 omap->utmi_p1_gfclk = ERR_PTR(-ENODEV);
672 omap->utmi_p2_gfclk = ERR_PTR(-ENODEV);
673 omap->xclk60mhsp1_ck = ERR_PTR(-ENODEV);
674 omap->xclk60mhsp2_ck = ERR_PTR(-ENODEV);
675
669 for (i = 0; i < omap->nports; i++) { 676 for (i = 0; i < omap->nports; i++) {
670 if (is_ehci_phy_mode(i) || is_ehci_tll_mode(i) || 677 omap->utmi_clk[i] = ERR_PTR(-ENODEV);
671 is_ehci_hsic_mode(i)) 678 omap->hsic480m_clk[i] = ERR_PTR(-ENODEV);
672 need_logic_fck |= true; 679 omap->hsic60m_clk[i] = ERR_PTR(-ENODEV);
673 } 680 }
674 681
675 omap->ehci_logic_fck = ERR_PTR(-EINVAL); 682 /* for OMAP3 i.e. USBHS REV1 */
676 if (need_logic_fck) { 683 if (omap->usbhs_rev == OMAP_USBHS_REV1) {
677 omap->ehci_logic_fck = clk_get(dev, "ehci_logic_fck"); 684 need_logic_fck = false;
678 if (IS_ERR(omap->ehci_logic_fck)) { 685 for (i = 0; i < omap->nports; i++) {
679 ret = PTR_ERR(omap->ehci_logic_fck); 686 if (is_ehci_phy_mode(pdata->port_mode[i]) ||
680 dev_dbg(dev, "ehci_logic_fck failed:%d\n", ret); 687 is_ehci_tll_mode(pdata->port_mode[i]) ||
688 is_ehci_hsic_mode(pdata->port_mode[i]))
689
690 need_logic_fck |= true;
681 } 691 }
692
693 if (need_logic_fck) {
694 omap->ehci_logic_fck = devm_clk_get(dev,
695 "usbhost_120m_fck");
696 if (IS_ERR(omap->ehci_logic_fck)) {
697 ret = PTR_ERR(omap->ehci_logic_fck);
698 dev_err(dev, "usbhost_120m_fck failed:%d\n",
699 ret);
700 goto err_mem;
701 }
702 }
703 goto initialize;
682 } 704 }
683 705
684 omap->utmi_p1_gfclk = clk_get(dev, "utmi_p1_gfclk"); 706 /* for OMAP4+ i.e. USBHS REV2+ */
707 omap->utmi_p1_gfclk = devm_clk_get(dev, "utmi_p1_gfclk");
685 if (IS_ERR(omap->utmi_p1_gfclk)) { 708 if (IS_ERR(omap->utmi_p1_gfclk)) {
686 ret = PTR_ERR(omap->utmi_p1_gfclk); 709 ret = PTR_ERR(omap->utmi_p1_gfclk);
687 dev_err(dev, "utmi_p1_gfclk failed error:%d\n", ret); 710 dev_err(dev, "utmi_p1_gfclk failed error:%d\n", ret);
688 goto err_p1_gfclk; 711 goto err_mem;
689 } 712 }
690 713
691 omap->utmi_p2_gfclk = clk_get(dev, "utmi_p2_gfclk"); 714 omap->utmi_p2_gfclk = devm_clk_get(dev, "utmi_p2_gfclk");
692 if (IS_ERR(omap->utmi_p2_gfclk)) { 715 if (IS_ERR(omap->utmi_p2_gfclk)) {
693 ret = PTR_ERR(omap->utmi_p2_gfclk); 716 ret = PTR_ERR(omap->utmi_p2_gfclk);
694 dev_err(dev, "utmi_p2_gfclk failed error:%d\n", ret); 717 dev_err(dev, "utmi_p2_gfclk failed error:%d\n", ret);
695 goto err_p2_gfclk; 718 goto err_mem;
696 } 719 }
697 720
698 omap->xclk60mhsp1_ck = clk_get(dev, "xclk60mhsp1_ck"); 721 omap->xclk60mhsp1_ck = devm_clk_get(dev, "refclk_60m_ext_p1");
699 if (IS_ERR(omap->xclk60mhsp1_ck)) { 722 if (IS_ERR(omap->xclk60mhsp1_ck)) {
700 ret = PTR_ERR(omap->xclk60mhsp1_ck); 723 ret = PTR_ERR(omap->xclk60mhsp1_ck);
701 dev_err(dev, "xclk60mhsp1_ck failed error:%d\n", ret); 724 dev_err(dev, "refclk_60m_ext_p1 failed error:%d\n", ret);
702 goto err_xclk60mhsp1; 725 goto err_mem;
703 } 726 }
704 727
705 omap->xclk60mhsp2_ck = clk_get(dev, "xclk60mhsp2_ck"); 728 omap->xclk60mhsp2_ck = devm_clk_get(dev, "refclk_60m_ext_p2");
706 if (IS_ERR(omap->xclk60mhsp2_ck)) { 729 if (IS_ERR(omap->xclk60mhsp2_ck)) {
707 ret = PTR_ERR(omap->xclk60mhsp2_ck); 730 ret = PTR_ERR(omap->xclk60mhsp2_ck);
708 dev_err(dev, "xclk60mhsp2_ck failed error:%d\n", ret); 731 dev_err(dev, "refclk_60m_ext_p2 failed error:%d\n", ret);
709 goto err_xclk60mhsp2; 732 goto err_mem;
710 } 733 }
711 734
712 omap->init_60m_fclk = clk_get(dev, "init_60m_fclk"); 735 omap->init_60m_fclk = devm_clk_get(dev, "refclk_60m_int");
713 if (IS_ERR(omap->init_60m_fclk)) { 736 if (IS_ERR(omap->init_60m_fclk)) {
714 ret = PTR_ERR(omap->init_60m_fclk); 737 ret = PTR_ERR(omap->init_60m_fclk);
715 dev_err(dev, "init_60m_fclk failed error:%d\n", ret); 738 dev_err(dev, "refclk_60m_int failed error:%d\n", ret);
716 goto err_init60m; 739 goto err_mem;
717 } 740 }
718 741
719 for (i = 0; i < omap->nports; i++) { 742 for (i = 0; i < omap->nports; i++) {
@@ -727,55 +750,72 @@ static int usbhs_omap_probe(struct platform_device *pdev)
727 * platforms have all clocks and we can function without 750 * platforms have all clocks and we can function without
728 * them 751 * them
729 */ 752 */
730 omap->utmi_clk[i] = clk_get(dev, clkname); 753 omap->utmi_clk[i] = devm_clk_get(dev, clkname);
731 if (IS_ERR(omap->utmi_clk[i])) 754 if (IS_ERR(omap->utmi_clk[i])) {
732 dev_dbg(dev, "Failed to get clock : %s : %ld\n", 755 ret = PTR_ERR(omap->utmi_clk[i]);
733 clkname, PTR_ERR(omap->utmi_clk[i])); 756 dev_err(dev, "Failed to get clock : %s : %d\n",
757 clkname, ret);
758 goto err_mem;
759 }
734 760
735 snprintf(clkname, sizeof(clkname), 761 snprintf(clkname, sizeof(clkname),
736 "usb_host_hs_hsic480m_p%d_clk", i + 1); 762 "usb_host_hs_hsic480m_p%d_clk", i + 1);
737 omap->hsic480m_clk[i] = clk_get(dev, clkname); 763 omap->hsic480m_clk[i] = devm_clk_get(dev, clkname);
738 if (IS_ERR(omap->hsic480m_clk[i])) 764 if (IS_ERR(omap->hsic480m_clk[i])) {
739 dev_dbg(dev, "Failed to get clock : %s : %ld\n", 765 ret = PTR_ERR(omap->hsic480m_clk[i]);
740 clkname, PTR_ERR(omap->hsic480m_clk[i])); 766 dev_err(dev, "Failed to get clock : %s : %d\n",
767 clkname, ret);
768 goto err_mem;
769 }
741 770
742 snprintf(clkname, sizeof(clkname), 771 snprintf(clkname, sizeof(clkname),
743 "usb_host_hs_hsic60m_p%d_clk", i + 1); 772 "usb_host_hs_hsic60m_p%d_clk", i + 1);
744 omap->hsic60m_clk[i] = clk_get(dev, clkname); 773 omap->hsic60m_clk[i] = devm_clk_get(dev, clkname);
745 if (IS_ERR(omap->hsic60m_clk[i])) 774 if (IS_ERR(omap->hsic60m_clk[i])) {
746 dev_dbg(dev, "Failed to get clock : %s : %ld\n", 775 ret = PTR_ERR(omap->hsic60m_clk[i]);
747 clkname, PTR_ERR(omap->hsic60m_clk[i])); 776 dev_err(dev, "Failed to get clock : %s : %d\n",
777 clkname, ret);
778 goto err_mem;
779 }
748 } 780 }
749 781
750 if (is_ehci_phy_mode(pdata->port_mode[0])) { 782 if (is_ehci_phy_mode(pdata->port_mode[0])) {
751 /* for OMAP3, clk_set_parent fails */
752 ret = clk_set_parent(omap->utmi_p1_gfclk, 783 ret = clk_set_parent(omap->utmi_p1_gfclk,
753 omap->xclk60mhsp1_ck); 784 omap->xclk60mhsp1_ck);
754 if (ret != 0) 785 if (ret != 0) {
755 dev_dbg(dev, "xclk60mhsp1_ck set parent failed: %d\n", 786 dev_err(dev, "xclk60mhsp1_ck set parent failed: %d\n",
756 ret); 787 ret);
788 goto err_mem;
789 }
757 } else if (is_ehci_tll_mode(pdata->port_mode[0])) { 790 } else if (is_ehci_tll_mode(pdata->port_mode[0])) {
758 ret = clk_set_parent(omap->utmi_p1_gfclk, 791 ret = clk_set_parent(omap->utmi_p1_gfclk,
759 omap->init_60m_fclk); 792 omap->init_60m_fclk);
760 if (ret != 0) 793 if (ret != 0) {
761 dev_dbg(dev, "P0 init_60m_fclk set parent failed: %d\n", 794 dev_err(dev, "P0 init_60m_fclk set parent failed: %d\n",
762 ret); 795 ret);
796 goto err_mem;
797 }
763 } 798 }
764 799
765 if (is_ehci_phy_mode(pdata->port_mode[1])) { 800 if (is_ehci_phy_mode(pdata->port_mode[1])) {
766 ret = clk_set_parent(omap->utmi_p2_gfclk, 801 ret = clk_set_parent(omap->utmi_p2_gfclk,
767 omap->xclk60mhsp2_ck); 802 omap->xclk60mhsp2_ck);
768 if (ret != 0) 803 if (ret != 0) {
769 dev_dbg(dev, "xclk60mhsp2_ck set parent failed: %d\n", 804 dev_err(dev, "xclk60mhsp2_ck set parent failed: %d\n",
770 ret); 805 ret);
806 goto err_mem;
807 }
771 } else if (is_ehci_tll_mode(pdata->port_mode[1])) { 808 } else if (is_ehci_tll_mode(pdata->port_mode[1])) {
772 ret = clk_set_parent(omap->utmi_p2_gfclk, 809 ret = clk_set_parent(omap->utmi_p2_gfclk,
773 omap->init_60m_fclk); 810 omap->init_60m_fclk);
774 if (ret != 0) 811 if (ret != 0) {
775 dev_dbg(dev, "P1 init_60m_fclk set parent failed: %d\n", 812 dev_err(dev, "P1 init_60m_fclk set parent failed: %d\n",
776 ret); 813 ret);
814 goto err_mem;
815 }
777 } 816 }
778 817
818initialize:
779 omap_usbhs_init(dev); 819 omap_usbhs_init(dev);
780 820
781 if (dev->of_node) { 821 if (dev->of_node) {
@@ -784,7 +824,7 @@ static int usbhs_omap_probe(struct platform_device *pdev)
784 824
785 if (ret) { 825 if (ret) {
786 dev_err(dev, "Failed to create DT children: %d\n", ret); 826 dev_err(dev, "Failed to create DT children: %d\n", ret);
787 goto err_alloc; 827 goto err_mem;
788 } 828 }
789 829
790 } else { 830 } else {
@@ -792,40 +832,12 @@ static int usbhs_omap_probe(struct platform_device *pdev)
792 if (ret) { 832 if (ret) {
793 dev_err(dev, "omap_usbhs_alloc_children failed: %d\n", 833 dev_err(dev, "omap_usbhs_alloc_children failed: %d\n",
794 ret); 834 ret);
795 goto err_alloc; 835 goto err_mem;
796 } 836 }
797 } 837 }
798 838
799 return 0; 839 return 0;
800 840
801err_alloc:
802 for (i = 0; i < omap->nports; i++) {
803 if (!IS_ERR(omap->utmi_clk[i]))
804 clk_put(omap->utmi_clk[i]);
805 if (!IS_ERR(omap->hsic60m_clk[i]))
806 clk_put(omap->hsic60m_clk[i]);
807 if (!IS_ERR(omap->hsic480m_clk[i]))
808 clk_put(omap->hsic480m_clk[i]);
809 }
810
811 clk_put(omap->init_60m_fclk);
812
813err_init60m:
814 clk_put(omap->xclk60mhsp2_ck);
815
816err_xclk60mhsp2:
817 clk_put(omap->xclk60mhsp1_ck);
818
819err_xclk60mhsp1:
820 clk_put(omap->utmi_p2_gfclk);
821
822err_p2_gfclk:
823 clk_put(omap->utmi_p1_gfclk);
824
825err_p1_gfclk:
826 if (!IS_ERR(omap->ehci_logic_fck))
827 clk_put(omap->ehci_logic_fck);
828
829err_mem: 841err_mem:
830 pm_runtime_disable(dev); 842 pm_runtime_disable(dev);
831 843
@@ -847,27 +859,6 @@ static int usbhs_omap_remove_child(struct device *dev, void *data)
847 */ 859 */
848static int usbhs_omap_remove(struct platform_device *pdev) 860static int usbhs_omap_remove(struct platform_device *pdev)
849{ 861{
850 struct usbhs_hcd_omap *omap = platform_get_drvdata(pdev);
851 int i;
852
853 for (i = 0; i < omap->nports; i++) {
854 if (!IS_ERR(omap->utmi_clk[i]))
855 clk_put(omap->utmi_clk[i]);
856 if (!IS_ERR(omap->hsic60m_clk[i]))
857 clk_put(omap->hsic60m_clk[i]);
858 if (!IS_ERR(omap->hsic480m_clk[i]))
859 clk_put(omap->hsic480m_clk[i]);
860 }
861
862 clk_put(omap->init_60m_fclk);
863 clk_put(omap->utmi_p1_gfclk);
864 clk_put(omap->utmi_p2_gfclk);
865 clk_put(omap->xclk60mhsp2_ck);
866 clk_put(omap->xclk60mhsp1_ck);
867
868 if (!IS_ERR(omap->ehci_logic_fck))
869 clk_put(omap->ehci_logic_fck);
870
871 pm_runtime_disable(&pdev->dev); 862 pm_runtime_disable(&pdev->dev);
872 863
873 /* remove children */ 864 /* remove children */