Commit ab137d04db5a4b32250ce5ef1b288ce6cf06adf6
Committed by
Stephen Warren
1 parent
40e8b3a690
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
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 |