diff options
author | Nitin Kumbhar <nkumbhar@nvidia.com> | 2011-01-28 13:39:17 +0530 |
---|---|---|
committer | Nitin Kumbhar <nkumbhar@nvidia.com> | 2011-01-28 13:39:17 +0530 |
commit | 8197cb15eaf0640d13c816926f65972ca6cbba84 (patch) | |
tree | 17b034f1f03a3d1b7776001cb63bdfd186415130 /drivers/usb | |
parent | 7cc7de288765bc634a0374e660de01a3fd4e8e39 (diff) | |
parent | 22b3c9ca22924cf7015ecadf7ce111cf402a707b (diff) |
merging android-tegra-2.6.36 into git-master/linux-2.6/android-tegra-2.6.36
Conflicts:
arch/arm/mach-tegra/tegra2_dvfs.c
Change-Id: I3853d668107c191c94f731256a8d0b63149e8279
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/gadget/fsl_tegra_udc.c | 19 | ||||
-rw-r--r-- | drivers/usb/host/ehci-tegra.c | 19 |
2 files changed, 38 insertions, 0 deletions
diff --git a/drivers/usb/gadget/fsl_tegra_udc.c b/drivers/usb/gadget/fsl_tegra_udc.c index 6091d1f7ea0c..74c1d0b52541 100644 --- a/drivers/usb/gadget/fsl_tegra_udc.c +++ b/drivers/usb/gadget/fsl_tegra_udc.c @@ -15,6 +15,7 @@ static struct tegra_usb_phy *phy; static struct clk *udc_clk; +static struct clk *emc_clk; static void *udc_base; int fsl_udc_clk_init(struct platform_device *pdev) @@ -33,6 +34,16 @@ int fsl_udc_clk_init(struct platform_device *pdev) clk_enable(udc_clk); + emc_clk = clk_get(&pdev->dev, "emc"); + if (IS_ERR(emc_clk)) { + dev_err(&pdev->dev, "Can't get emc clock\n"); + err = PTR_ERR(emc_clk); + goto err_emc; + } + + clk_enable(emc_clk); + clk_set_rate(emc_clk, 240000000); + /* we have to remap the registers ourselves as fsl_udc does not * export them for us. */ @@ -65,6 +76,9 @@ int fsl_udc_clk_init(struct platform_device *pdev) err1: iounmap(udc_base); err0: + clk_disable(emc_clk); + clk_put(emc_clk); +err_emc: clk_disable(udc_clk); clk_put(udc_clk); return err; @@ -82,16 +96,21 @@ void fsl_udc_clk_release(void) clk_disable(udc_clk); clk_put(udc_clk); + + clk_disable(emc_clk); + clk_put(emc_clk); } void fsl_udc_clk_suspend(void) { tegra_usb_phy_power_off(phy); clk_disable(udc_clk); + clk_disable(emc_clk); } void fsl_udc_clk_resume(void) { + clk_enable(emc_clk); clk_enable(udc_clk); tegra_usb_phy_power_on(phy); } diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c index 597c0a2a911e..5e14bfbe148c 100644 --- a/drivers/usb/host/ehci-tegra.c +++ b/drivers/usb/host/ehci-tegra.c @@ -50,6 +50,7 @@ struct tegra_ehci_hcd { struct ehci_hcd *ehci; struct tegra_usb_phy *phy; struct clk *clk; + struct clk *emc_clk; struct otg_transceiver *transceiver; int host_resumed; int bus_suspended; @@ -62,6 +63,7 @@ static void tegra_ehci_power_up(struct usb_hcd *hcd) { struct tegra_ehci_hcd *tegra = dev_get_drvdata(hcd->self.controller); + clk_enable(tegra->emc_clk); clk_enable(tegra->clk); tegra_usb_phy_power_on(tegra->phy); tegra->host_resumed = 1; @@ -74,6 +76,7 @@ static void tegra_ehci_power_down(struct usb_hcd *hcd) tegra->host_resumed = 0; tegra_usb_phy_power_off(tegra->phy); clk_disable(tegra->clk); + clk_disable(tegra->emc_clk); } static int tegra_ehci_hub_control( @@ -634,6 +637,16 @@ static int tegra_ehci_probe(struct platform_device *pdev) if (err) goto fail_clken; + tegra->emc_clk = clk_get(&pdev->dev, "emc"); + if (IS_ERR(tegra->emc_clk)) { + dev_err(&pdev->dev, "Can't get emc clock\n"); + err = PTR_ERR(tegra->emc_clk); + goto fail_emc_clk; + } + + clk_enable(tegra->emc_clk); + clk_set_rate(tegra->emc_clk, 240000000); + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { dev_err(&pdev->dev, "Failed to get I/O memory\n"); @@ -708,6 +721,9 @@ fail: fail_phy: iounmap(hcd->regs); fail_io: + clk_disable(tegra->emc_clk); + clk_put(tegra->emc_clk); +fail_emc_clk: clk_disable(tegra->clk); fail_clken: clk_put(tegra->clk); @@ -772,6 +788,9 @@ static int tegra_ehci_remove(struct platform_device *pdev) clk_disable(tegra->clk); clk_put(tegra->clk); + clk_disable(tegra->emc_clk); + clk_put(tegra->emc_clk); + kfree(tegra); return 0; } |