ARM: Orion: EHCI: Add support for enabling clocks
authorAndrew Lunn <andrew@lunn.ch>
Sun, 15 Apr 2012 10:53:47 +0000 (12:53 +0200)
committerMike Turquette <mturquette@linaro.org>
Tue, 8 May 2012 23:33:59 +0000 (16:33 -0700)
Not all platforms support gating the clock, so it is not an error if
the clock does not exist. However, if it does exist, we should
enable/disable it as appropriate.

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Tested-by: Jamie Lentin <jm@lentin.co.uk>
Signed-off-by: Mike Turquette <mturquette@linaro.org>
arch/arm/mach-kirkwood/common.c
drivers/usb/host/ehci-orion.c

index c9fef5b7c56e5c846ae3ab422aa7ddcafb515ae9..b0f20c0c7d54dd0d46587428c84a72d74ef835fe 100644 (file)
@@ -96,7 +96,7 @@ void __init kirkwood_clk_init(void)
        ge1 = kirkwood_register_gate("ge1",    CGC_BIT_GE1);
        sata0 = kirkwood_register_gate("sata0",  CGC_BIT_SATA0);
        sata1 = kirkwood_register_gate("sata1",  CGC_BIT_SATA1);
-       kirkwood_register_gate("usb0",   CGC_BIT_USB0);
+       usb0 = kirkwood_register_gate("usb0",   CGC_BIT_USB0);
        kirkwood_register_gate("sdio",   CGC_BIT_SDIO);
        kirkwood_register_gate("crypto", CGC_BIT_CRYPTO);
        kirkwood_register_gate("xor0",   CGC_BIT_XOR0);
@@ -115,6 +115,7 @@ void __init kirkwood_clk_init(void)
        orion_clkdev_add(NULL, "orion_wdt", tclk);
        orion_clkdev_add("0", "sata_mv.0", sata0);
        orion_clkdev_add("1", "sata_mv.0", sata1);
+       orion_clkdev_add(NULL, "orion-ehci.0", usb0);
 }
 
 /*****************************************************************************
index 6c6a5a3b4ea7edcaaa83916a5d1e0f8eacf48114..82de1073aa529ae105da5ac374face13e6b35bd2 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/mbus.h>
+#include <linux/clk.h>
 #include <plat/ehci-orion.h>
 
 #define rdl(off)       __raw_readl(hcd->regs + (off))
@@ -198,6 +199,7 @@ static int __devinit ehci_orion_drv_probe(struct platform_device *pdev)
        struct resource *res;
        struct usb_hcd *hcd;
        struct ehci_hcd *ehci;
+       struct clk *clk;
        void __iomem *regs;
        int irq, err;
 
@@ -238,6 +240,14 @@ static int __devinit ehci_orion_drv_probe(struct platform_device *pdev)
                goto err2;
        }
 
+       /* Not all platforms can gate the clock, so it is not
+          an error if the clock does not exists. */
+       clk = clk_get(&pdev->dev, NULL);
+       if (!IS_ERR(clk)) {
+               clk_prepare_enable(clk);
+               clk_put(clk);
+       }
+
        hcd = usb_create_hcd(&ehci_orion_hc_driver,
                        &pdev->dev, dev_name(&pdev->dev));
        if (!hcd) {
@@ -301,12 +311,18 @@ err1:
 static int __exit ehci_orion_drv_remove(struct platform_device *pdev)
 {
        struct usb_hcd *hcd = platform_get_drvdata(pdev);
+       struct clk *clk;
 
        usb_remove_hcd(hcd);
        iounmap(hcd->regs);
        release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
        usb_put_hcd(hcd);
 
+       clk = clk_get(&pdev->dev, NULL);
+       if (!IS_ERR(clk)) {
+               clk_disable_unprepare(clk);
+               clk_put(clk);
+       }
        return 0;
 }