aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/host/ehci-tegra.c
diff options
context:
space:
mode:
authorVenu Byravarasu <vbyravarasu@nvidia.com>2013-01-24 05:27:03 -0500
committerStephen Warren <swarren@nvidia.com>2013-01-28 13:42:11 -0500
commitab137d04db5a4b32250ce5ef1b288ce6cf06adf6 (patch)
treee11f30d35f28c701b9c58508e06a92c81ec02c51 /drivers/usb/host/ehci-tegra.c
parent40e8b3a690ec0ef574c458a991eb647e56683b7d (diff)
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>
Diffstat (limited to 'drivers/usb/host/ehci-tegra.c')
-rw-r--r--drivers/usb/host/ehci-tegra.c27
1 files changed, 13 insertions, 14 deletions
diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c
index b02622a936c2..568aecc7075b 100644
--- a/drivers/usb/host/ehci-tegra.c
+++ b/drivers/usb/host/ehci-tegra.c
@@ -56,7 +56,7 @@ static void tegra_ehci_power_up(struct usb_hcd *hcd)
56 struct tegra_ehci_hcd *tegra = dev_get_drvdata(hcd->self.controller); 56 struct tegra_ehci_hcd *tegra = dev_get_drvdata(hcd->self.controller);
57 57
58 clk_prepare_enable(tegra->clk); 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 tegra->host_resumed = 1; 60 tegra->host_resumed = 1;
61} 61}
62 62
@@ -65,7 +65,7 @@ static void tegra_ehci_power_down(struct usb_hcd *hcd)
65 struct tegra_ehci_hcd *tegra = dev_get_drvdata(hcd->self.controller); 65 struct tegra_ehci_hcd *tegra = dev_get_drvdata(hcd->self.controller);
66 66
67 tegra->host_resumed = 0; 67 tegra->host_resumed = 0;
68 usb_phy_set_suspend(&tegra->phy->u_phy, 1); 68 usb_phy_set_suspend(hcd->phy, 1);
69 clk_disable_unprepare(tegra->clk); 69 clk_disable_unprepare(tegra->clk);
70} 70}
71 71
@@ -159,7 +159,7 @@ static int tegra_ehci_hub_control(
159 if (tegra->port_resuming && !(temp & PORT_SUSPEND)) { 159 if (tegra->port_resuming && !(temp & PORT_SUSPEND)) {
160 /* Resume completed, re-enable disconnect detection */ 160 /* Resume completed, re-enable disconnect detection */
161 tegra->port_resuming = 0; 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 @@ static int tegra_ehci_hub_control(
212 goto done; 212 goto done;
213 213
214 /* Disable disconnect detection during port resume */ 214 /* Disable disconnect detection during port resume */
215 tegra_usb_phy_preresume(tegra->phy); 215 tegra_usb_phy_preresume(hcd->phy);
216 216
217 ehci->reset_done[wIndex-1] = jiffies + msecs_to_jiffies(25); 217 ehci->reset_done[wIndex-1] = jiffies + msecs_to_jiffies(25);
218 218
@@ -476,7 +476,7 @@ static int controller_resume(struct device *dev)
476 } 476 }
477 477
478 /* Force the phy to keep data lines in suspend state */ 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 /* Enable host mode */ 481 /* Enable host mode */
482 tdi_reset(ehci); 482 tdi_reset(ehci);
@@ -543,17 +543,17 @@ static int controller_resume(struct device *dev)
543 } 543 }
544 } 544 }
545 545
546 tegra_ehci_phy_restore_end(tegra->phy); 546 tegra_ehci_phy_restore_end(hcd->phy);
547 goto done; 547 goto done;
548 548
549 restart: 549 restart:
550 if (tegra->port_speed <= TEGRA_USB_PHY_PORT_SPEED_HIGH) 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 tegra_ehci_restart(hcd); 553 tegra_ehci_restart(hcd);
554 554
555 done: 555 done:
556 tegra_usb_phy_preresume(tegra->phy); 556 tegra_usb_phy_preresume(hcd->phy);
557 tegra->port_resuming = 1; 557 tegra->port_resuming = 1;
558 return 0; 558 return 0;
559} 559}
@@ -740,9 +740,9 @@ static int tegra_ehci_probe(struct platform_device *pdev)
740 goto fail_io; 740 goto fail_io;
741 } 741 }
742 742
743 usb_phy_init(&tegra->phy->u_phy);
744
745 hcd->phy = u_phy = &tegra->phy->u_phy; 743 hcd->phy = u_phy = &tegra->phy->u_phy;
744 usb_phy_init(hcd->phy);
745
746 u_phy->otg = devm_kzalloc(&pdev->dev, sizeof(struct usb_otg), 746 u_phy->otg = devm_kzalloc(&pdev->dev, sizeof(struct usb_otg),
747 GFP_KERNEL); 747 GFP_KERNEL);
748 if (!u_phy->otg) { 748 if (!u_phy->otg) {
@@ -752,7 +752,7 @@ static int tegra_ehci_probe(struct platform_device *pdev)
752 } 752 }
753 u_phy->otg->host = hcd_to_bus(hcd); 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 if (err) { 756 if (err) {
757 dev_err(&pdev->dev, "Failed to power on the phy\n"); 757 dev_err(&pdev->dev, "Failed to power on the phy\n");
758 goto fail; 758 goto fail;
@@ -798,7 +798,7 @@ fail:
798 if (!IS_ERR_OR_NULL(tegra->transceiver)) 798 if (!IS_ERR_OR_NULL(tegra->transceiver))
799 otg_set_host(tegra->transceiver->otg, NULL); 799 otg_set_host(tegra->transceiver->otg, NULL);
800#endif 800#endif
801 usb_phy_shutdown(&tegra->phy->u_phy); 801 usb_phy_shutdown(hcd->phy);
802fail_io: 802fail_io:
803 clk_disable_unprepare(tegra->clk); 803 clk_disable_unprepare(tegra->clk);
804fail_clk: 804fail_clk:
@@ -820,11 +820,10 @@ static int tegra_ehci_remove(struct platform_device *pdev)
820 otg_set_host(tegra->transceiver->otg, NULL); 820 otg_set_host(tegra->transceiver->otg, NULL);
821#endif 821#endif
822 822
823 usb_phy_shutdown(hcd->phy);
823 usb_remove_hcd(hcd); 824 usb_remove_hcd(hcd);
824 usb_put_hcd(hcd); 825 usb_put_hcd(hcd);
825 826
826 usb_phy_shutdown(&tegra->phy->u_phy);
827
828 clk_disable_unprepare(tegra->clk); 827 clk_disable_unprepare(tegra->clk);
829 828
830 return 0; 829 return 0;