summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/usb/gadget/fsl_tegra_udc.c19
-rw-r--r--drivers/usb/host/ehci-tegra.c20
2 files changed, 39 insertions, 0 deletions
diff --git a/drivers/usb/gadget/fsl_tegra_udc.c b/drivers/usb/gadget/fsl_tegra_udc.c
index 14e62f40a50a..8589ef781039 100644
--- a/drivers/usb/gadget/fsl_tegra_udc.c
+++ b/drivers/usb/gadget/fsl_tegra_udc.c
@@ -16,6 +16,7 @@
static struct tegra_usb_phy *phy;
static struct clk *udc_clk;
static struct clk *emc_clk;
+static struct clk *sclk_clk;
static void *udc_base;
int fsl_udc_clk_init(struct platform_device *pdev)
@@ -34,6 +35,16 @@ int fsl_udc_clk_init(struct platform_device *pdev)
clk_enable(udc_clk);
+ sclk_clk = clk_get(&pdev->dev, "sclk");
+ if (IS_ERR(sclk_clk)) {
+ dev_err(&pdev->dev, "Can't get sclk clock\n");
+ err = PTR_ERR(sclk_clk);
+ goto err_sclk;
+ }
+
+ clk_set_rate(sclk_clk, 80000000);
+ clk_enable(sclk_clk);
+
emc_clk = clk_get(&pdev->dev, "emc");
if (IS_ERR(emc_clk)) {
dev_err(&pdev->dev, "Can't get emc clock\n");
@@ -79,6 +90,9 @@ err0:
clk_disable(emc_clk);
clk_put(emc_clk);
err_emc:
+ clk_disable(sclk_clk);
+ clk_put(sclk_clk);
+err_sclk:
clk_disable(udc_clk);
clk_put(udc_clk);
return err;
@@ -97,6 +111,9 @@ void fsl_udc_clk_release(void)
clk_disable(udc_clk);
clk_put(udc_clk);
+ clk_disable(sclk_clk);
+ clk_put(sclk_clk);
+
clk_disable(emc_clk);
clk_put(emc_clk);
}
@@ -105,12 +122,14 @@ void fsl_udc_clk_suspend(void)
{
tegra_usb_phy_power_off(phy);
clk_disable(udc_clk);
+ clk_disable(sclk_clk);
clk_disable(emc_clk);
}
void fsl_udc_clk_resume(void)
{
clk_enable(emc_clk);
+ clk_enable(sclk_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 a81046b93af7..fab9edb4cc99 100644
--- a/drivers/usb/host/ehci-tegra.c
+++ b/drivers/usb/host/ehci-tegra.c
@@ -43,6 +43,7 @@ struct tegra_ehci_hcd {
struct tegra_usb_phy *phy;
struct clk *clk;
struct clk *emc_clk;
+ struct clk *sclk_clk;
struct otg_transceiver *transceiver;
int host_resumed;
int bus_suspended;
@@ -57,6 +58,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->sclk_clk);
clk_enable(tegra->clk);
tegra_usb_phy_power_on(tegra->phy);
tegra->host_resumed = 1;
@@ -69,6 +71,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->sclk_clk);
clk_disable(tegra->emc_clk);
}
@@ -836,6 +839,17 @@ static int tegra_ehci_probe(struct platform_device *pdev)
if (err)
goto fail_clken;
+
+ tegra->sclk_clk = clk_get(&pdev->dev, "sclk");
+ if (IS_ERR(tegra->sclk_clk)) {
+ dev_err(&pdev->dev, "Can't get sclk clock\n");
+ err = PTR_ERR(tegra->sclk_clk);
+ goto fail_sclk_clk;
+ }
+
+ clk_set_rate(tegra->sclk_clk, 80000000);
+ clk_enable(tegra->sclk_clk);
+
tegra->emc_clk = clk_get(&pdev->dev, "emc");
if (IS_ERR(tegra->emc_clk)) {
dev_err(&pdev->dev, "Can't get emc clock\n");
@@ -930,6 +944,9 @@ fail_io:
clk_disable(tegra->emc_clk);
clk_put(tegra->emc_clk);
fail_emc_clk:
+ clk_disable(tegra->sclk_clk);
+ clk_put(tegra->sclk_clk);
+fail_sclk_clk:
clk_disable(tegra->clk);
fail_clken:
clk_put(tegra->clk);
@@ -1002,6 +1019,9 @@ static int tegra_ehci_remove(struct platform_device *pdev)
clk_disable(tegra->clk);
clk_put(tegra->clk);
+ clk_disable(tegra->sclk_clk);
+ clk_put(tegra->sclk_clk);
+
clk_disable(tegra->emc_clk);
clk_put(tegra->emc_clk);