aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/mach-kirkwood/common.c3
-rw-r--r--drivers/usb/host/ehci-orion.c16
2 files changed, 18 insertions, 1 deletions
diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c
index c9fef5b7c56e..b0f20c0c7d54 100644
--- a/arch/arm/mach-kirkwood/common.c
+++ b/arch/arm/mach-kirkwood/common.c
@@ -96,7 +96,7 @@ void __init kirkwood_clk_init(void)
96 ge1 = kirkwood_register_gate("ge1", CGC_BIT_GE1); 96 ge1 = kirkwood_register_gate("ge1", CGC_BIT_GE1);
97 sata0 = kirkwood_register_gate("sata0", CGC_BIT_SATA0); 97 sata0 = kirkwood_register_gate("sata0", CGC_BIT_SATA0);
98 sata1 = kirkwood_register_gate("sata1", CGC_BIT_SATA1); 98 sata1 = kirkwood_register_gate("sata1", CGC_BIT_SATA1);
99 kirkwood_register_gate("usb0", CGC_BIT_USB0); 99 usb0 = kirkwood_register_gate("usb0", CGC_BIT_USB0);
100 kirkwood_register_gate("sdio", CGC_BIT_SDIO); 100 kirkwood_register_gate("sdio", CGC_BIT_SDIO);
101 kirkwood_register_gate("crypto", CGC_BIT_CRYPTO); 101 kirkwood_register_gate("crypto", CGC_BIT_CRYPTO);
102 kirkwood_register_gate("xor0", CGC_BIT_XOR0); 102 kirkwood_register_gate("xor0", CGC_BIT_XOR0);
@@ -115,6 +115,7 @@ void __init kirkwood_clk_init(void)
115 orion_clkdev_add(NULL, "orion_wdt", tclk); 115 orion_clkdev_add(NULL, "orion_wdt", tclk);
116 orion_clkdev_add("0", "sata_mv.0", sata0); 116 orion_clkdev_add("0", "sata_mv.0", sata0);
117 orion_clkdev_add("1", "sata_mv.0", sata1); 117 orion_clkdev_add("1", "sata_mv.0", sata1);
118 orion_clkdev_add(NULL, "orion-ehci.0", usb0);
118} 119}
119 120
120/***************************************************************************** 121/*****************************************************************************
diff --git a/drivers/usb/host/ehci-orion.c b/drivers/usb/host/ehci-orion.c
index 6c6a5a3b4ea7..82de1073aa52 100644
--- a/drivers/usb/host/ehci-orion.c
+++ b/drivers/usb/host/ehci-orion.c
@@ -12,6 +12,7 @@
12#include <linux/module.h> 12#include <linux/module.h>
13#include <linux/platform_device.h> 13#include <linux/platform_device.h>
14#include <linux/mbus.h> 14#include <linux/mbus.h>
15#include <linux/clk.h>
15#include <plat/ehci-orion.h> 16#include <plat/ehci-orion.h>
16 17
17#define rdl(off) __raw_readl(hcd->regs + (off)) 18#define rdl(off) __raw_readl(hcd->regs + (off))
@@ -198,6 +199,7 @@ static int __devinit ehci_orion_drv_probe(struct platform_device *pdev)
198 struct resource *res; 199 struct resource *res;
199 struct usb_hcd *hcd; 200 struct usb_hcd *hcd;
200 struct ehci_hcd *ehci; 201 struct ehci_hcd *ehci;
202 struct clk *clk;
201 void __iomem *regs; 203 void __iomem *regs;
202 int irq, err; 204 int irq, err;
203 205
@@ -238,6 +240,14 @@ static int __devinit ehci_orion_drv_probe(struct platform_device *pdev)
238 goto err2; 240 goto err2;
239 } 241 }
240 242
243 /* Not all platforms can gate the clock, so it is not
244 an error if the clock does not exists. */
245 clk = clk_get(&pdev->dev, NULL);
246 if (!IS_ERR(clk)) {
247 clk_prepare_enable(clk);
248 clk_put(clk);
249 }
250
241 hcd = usb_create_hcd(&ehci_orion_hc_driver, 251 hcd = usb_create_hcd(&ehci_orion_hc_driver,
242 &pdev->dev, dev_name(&pdev->dev)); 252 &pdev->dev, dev_name(&pdev->dev));
243 if (!hcd) { 253 if (!hcd) {
@@ -301,12 +311,18 @@ err1:
301static int __exit ehci_orion_drv_remove(struct platform_device *pdev) 311static int __exit ehci_orion_drv_remove(struct platform_device *pdev)
302{ 312{
303 struct usb_hcd *hcd = platform_get_drvdata(pdev); 313 struct usb_hcd *hcd = platform_get_drvdata(pdev);
314 struct clk *clk;
304 315
305 usb_remove_hcd(hcd); 316 usb_remove_hcd(hcd);
306 iounmap(hcd->regs); 317 iounmap(hcd->regs);
307 release_mem_region(hcd->rsrc_start, hcd->rsrc_len); 318 release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
308 usb_put_hcd(hcd); 319 usb_put_hcd(hcd);
309 320
321 clk = clk_get(&pdev->dev, NULL);
322 if (!IS_ERR(clk)) {
323 clk_disable_unprepare(clk);
324 clk_put(clk);
325 }
310 return 0; 326 return 0;
311} 327}
312 328