summaryrefslogtreecommitdiff
path: root/drivers/usb
diff options
context:
space:
mode:
authorNitin Kumbhar <nkumbhar@nvidia.com>2011-01-28 13:39:17 +0530
committerNitin Kumbhar <nkumbhar@nvidia.com>2011-01-28 13:39:17 +0530
commit8197cb15eaf0640d13c816926f65972ca6cbba84 (patch)
tree17b034f1f03a3d1b7776001cb63bdfd186415130 /drivers/usb
parent7cc7de288765bc634a0374e660de01a3fd4e8e39 (diff)
parent22b3c9ca22924cf7015ecadf7ce111cf402a707b (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.c19
-rw-r--r--drivers/usb/host/ehci-tegra.c19
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;
}