Commit ab137d04db5a4b32250ce5ef1b288ce6cf06adf6

Authored by Venu Byravarasu
Committed by Stephen Warren
1 parent 40e8b3a690

usb: host: tegra: make use of PHY pointer of HCD

As pointer to PHY structure can be stored in struct usb_hcd
making use of it, to call Tegra PHY APIs.

Call to usb_phy_shutdown() is moved up in tegra_ehci_remove(),
so that to avoid dereferencing of hcd after its freed up.

Signed-off-by: Venu Byravarasu <vbyravarasu@nvidia.com>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Acked-by: Felipe Balbi <balbi@ti.com>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Stephen Warren <swarren@nvidia.com>

Showing 3 changed files with 29 additions and 22 deletions Side-by-side Diff

drivers/usb/host/ehci-tegra.c
... ... @@ -56,7 +56,7 @@
56 56 struct tegra_ehci_hcd *tegra = dev_get_drvdata(hcd->self.controller);
57 57  
58 58 clk_prepare_enable(tegra->clk);
59   - usb_phy_set_suspend(&tegra->phy->u_phy, 0);
  59 + usb_phy_set_suspend(hcd->phy, 0);
60 60 tegra->host_resumed = 1;
61 61 }
62 62  
... ... @@ -65,7 +65,7 @@
65 65 struct tegra_ehci_hcd *tegra = dev_get_drvdata(hcd->self.controller);
66 66  
67 67 tegra->host_resumed = 0;
68   - usb_phy_set_suspend(&tegra->phy->u_phy, 1);
  68 + usb_phy_set_suspend(hcd->phy, 1);
69 69 clk_disable_unprepare(tegra->clk);
70 70 }
71 71  
... ... @@ -159,7 +159,7 @@
159 159 if (tegra->port_resuming && !(temp & PORT_SUSPEND)) {
160 160 /* Resume completed, re-enable disconnect detection */
161 161 tegra->port_resuming = 0;
162   - tegra_usb_phy_postresume(tegra->phy);
  162 + tegra_usb_phy_postresume(hcd->phy);
163 163 }
164 164 }
165 165  
... ... @@ -212,7 +212,7 @@
212 212 goto done;
213 213  
214 214 /* Disable disconnect detection during port resume */
215   - tegra_usb_phy_preresume(tegra->phy);
  215 + tegra_usb_phy_preresume(hcd->phy);
216 216  
217 217 ehci->reset_done[wIndex-1] = jiffies + msecs_to_jiffies(25);
218 218  
... ... @@ -476,7 +476,7 @@
476 476 }
477 477  
478 478 /* Force the phy to keep data lines in suspend state */
479   - tegra_ehci_phy_restore_start(tegra->phy, tegra->port_speed);
  479 + tegra_ehci_phy_restore_start(hcd->phy, tegra->port_speed);
480 480  
481 481 /* Enable host mode */
482 482 tdi_reset(ehci);
483 483  
484 484  
... ... @@ -543,17 +543,17 @@
543 543 }
544 544 }
545 545  
546   - tegra_ehci_phy_restore_end(tegra->phy);
  546 + tegra_ehci_phy_restore_end(hcd->phy);
547 547 goto done;
548 548  
549 549 restart:
550 550 if (tegra->port_speed <= TEGRA_USB_PHY_PORT_SPEED_HIGH)
551   - tegra_ehci_phy_restore_end(tegra->phy);
  551 + tegra_ehci_phy_restore_end(hcd->phy);
552 552  
553 553 tegra_ehci_restart(hcd);
554 554  
555 555 done:
556   - tegra_usb_phy_preresume(tegra->phy);
  556 + tegra_usb_phy_preresume(hcd->phy);
557 557 tegra->port_resuming = 1;
558 558 return 0;
559 559 }
560 560  
... ... @@ -740,9 +740,9 @@
740 740 goto fail_io;
741 741 }
742 742  
743   - usb_phy_init(&tegra->phy->u_phy);
744   -
745 743 hcd->phy = u_phy = &tegra->phy->u_phy;
  744 + usb_phy_init(hcd->phy);
  745 +
746 746 u_phy->otg = devm_kzalloc(&pdev->dev, sizeof(struct usb_otg),
747 747 GFP_KERNEL);
748 748 if (!u_phy->otg) {
... ... @@ -752,7 +752,7 @@
752 752 }
753 753 u_phy->otg->host = hcd_to_bus(hcd);
754 754  
755   - err = usb_phy_set_suspend(&tegra->phy->u_phy, 0);
  755 + err = usb_phy_set_suspend(hcd->phy, 0);
756 756 if (err) {
757 757 dev_err(&pdev->dev, "Failed to power on the phy\n");
758 758 goto fail;
... ... @@ -798,7 +798,7 @@
798 798 if (!IS_ERR_OR_NULL(tegra->transceiver))
799 799 otg_set_host(tegra->transceiver->otg, NULL);
800 800 #endif
801   - usb_phy_shutdown(&tegra->phy->u_phy);
  801 + usb_phy_shutdown(hcd->phy);
802 802 fail_io:
803 803 clk_disable_unprepare(tegra->clk);
804 804 fail_clk:
805 805  
... ... @@ -820,10 +820,9 @@
820 820 otg_set_host(tegra->transceiver->otg, NULL);
821 821 #endif
822 822  
  823 + usb_phy_shutdown(hcd->phy);
823 824 usb_remove_hcd(hcd);
824 825 usb_put_hcd(hcd);
825   -
826   - usb_phy_shutdown(&tegra->phy->u_phy);
827 826  
828 827 clk_disable_unprepare(tegra->clk);
829 828  
drivers/usb/phy/tegra_usb_phy.c
... ... @@ -759,30 +759,38 @@
759 759 }
760 760 EXPORT_SYMBOL_GPL(tegra_usb_phy_open);
761 761  
762   -void tegra_usb_phy_preresume(struct tegra_usb_phy *phy)
  762 +void tegra_usb_phy_preresume(struct usb_phy *x)
763 763 {
  764 + struct tegra_usb_phy *phy = container_of(x, struct tegra_usb_phy, u_phy);
  765 +
764 766 if (!phy->is_ulpi_phy)
765 767 utmi_phy_preresume(phy);
766 768 }
767 769 EXPORT_SYMBOL_GPL(tegra_usb_phy_preresume);
768 770  
769   -void tegra_usb_phy_postresume(struct tegra_usb_phy *phy)
  771 +void tegra_usb_phy_postresume(struct usb_phy *x)
770 772 {
  773 + struct tegra_usb_phy *phy = container_of(x, struct tegra_usb_phy, u_phy);
  774 +
771 775 if (!phy->is_ulpi_phy)
772 776 utmi_phy_postresume(phy);
773 777 }
774 778 EXPORT_SYMBOL_GPL(tegra_usb_phy_postresume);
775 779  
776   -void tegra_ehci_phy_restore_start(struct tegra_usb_phy *phy,
  780 +void tegra_ehci_phy_restore_start(struct usb_phy *x,
777 781 enum tegra_usb_phy_port_speed port_speed)
778 782 {
  783 + struct tegra_usb_phy *phy = container_of(x, struct tegra_usb_phy, u_phy);
  784 +
779 785 if (!phy->is_ulpi_phy)
780 786 utmi_phy_restore_start(phy, port_speed);
781 787 }
782 788 EXPORT_SYMBOL_GPL(tegra_ehci_phy_restore_start);
783 789  
784   -void tegra_ehci_phy_restore_end(struct tegra_usb_phy *phy)
  790 +void tegra_ehci_phy_restore_end(struct usb_phy *x)
785 791 {
  792 + struct tegra_usb_phy *phy = container_of(x, struct tegra_usb_phy, u_phy);
  793 +
786 794 if (!phy->is_ulpi_phy)
787 795 utmi_phy_restore_end(phy);
788 796 }
include/linux/usb/tegra_usb_phy.h
... ... @@ -66,14 +66,14 @@
66 66 struct tegra_usb_phy *tegra_usb_phy_open(struct device *dev, int instance,
67 67 void __iomem *regs, void *config, enum tegra_usb_phy_mode phy_mode);
68 68  
69   -void tegra_usb_phy_preresume(struct tegra_usb_phy *phy);
  69 +void tegra_usb_phy_preresume(struct usb_phy *phy);
70 70  
71   -void tegra_usb_phy_postresume(struct tegra_usb_phy *phy);
  71 +void tegra_usb_phy_postresume(struct usb_phy *phy);
72 72  
73   -void tegra_ehci_phy_restore_start(struct tegra_usb_phy *phy,
  73 +void tegra_ehci_phy_restore_start(struct usb_phy *phy,
74 74 enum tegra_usb_phy_port_speed port_speed);
75 75  
76   -void tegra_ehci_phy_restore_end(struct tegra_usb_phy *phy);
  76 +void tegra_ehci_phy_restore_end(struct usb_phy *phy);
77 77  
78 78 void tegra_ehci_set_pts(struct usb_phy *x, u8 pts_val);
79 79