[PATCH 4/4] usb: s3c-hsotg: Enable HCLK for the OTG module.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Thomas Abraham <thomas.ab@xxxxxxxxxxx>

This patch modifies the following in S3C hsotg driver.

1. Gets a reference to the USB OTG hclk clock and enables it. This is
   required for plaforms on which the USB OTG hclk is disabled during
   the boot time clock intialization.

2. Add necessary clock clean up in case of error during initialization
   failure or during module unload.

3. Add a new field 'clk_otg' in 'struct s3c_hsotg' to maintain a
   reference to the USB OTG hclk clock.

Signed-off-by: Thomas Abraham <thomas.ab@xxxxxxxxxxx>
Signed-off-by: Kukjin Kim <kgene.kim@xxxxxxxxxxx>
---
 drivers/usb/gadget/s3c-hsotg.c |   17 +++++++++++++++++
 1 files changed, 17 insertions(+), 0 deletions(-)

diff --git a/drivers/usb/gadget/s3c-hsotg.c b/drivers/usb/gadget/s3c-hsotg.c
index 81c47d2..526d081 100644
--- a/drivers/usb/gadget/s3c-hsotg.c
+++ b/drivers/usb/gadget/s3c-hsotg.c
@@ -130,6 +130,7 @@ struct s3c_hsotg_ep {
  * @dev: The parent device supplied to the probe function
  * @driver: USB gadget driver
  * @plat: The platform specific configuration data.
+ * @clk_otg: The hclk for otg module.
  * @regs: The memory area mapped for accessing registers.
  * @regs_res: The resource that was allocated when claiming register space.
  * @irq: The IRQ number we are using
@@ -147,6 +148,7 @@ struct s3c_hsotg {
 	struct device		 *dev;
 	struct usb_gadget_driver *driver;
 	struct s3c_hsotg_plat	 *plat;
+	struct clk		 *clk_otg;
 
 	void __iomem		*regs;
 	struct resource		*regs_res;
@@ -3269,6 +3271,14 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev)
 		goto err_regs_res;
 	}
 
+	hsotg->clk_otg = clk_get(&pdev->dev, "otg");
+	if (IS_ERR(hsotg->clk_otg)) {
+		dev_err(dev, "failed to find usb otg clock source\n");
+		ret = -ENODEV;
+		goto err_noclk;
+	}
+	clk_enable(hsotg->clk_otg);
+
 	ret = platform_get_irq(pdev, 0);
 	if (ret < 0) {
 		dev_err(dev, "cannot find IRQ\n");
@@ -3330,6 +3340,10 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev)
 	return 0;
 
 err_regs:
+	clk_disable(hsotg->clk_otg);
+	clk_put(hsotg->clk_otg);
+
+err_noclk:
 	iounmap(hsotg->regs);
 
 err_regs_res:
@@ -3352,6 +3366,9 @@ static int __devexit s3c_hsotg_remove(struct platform_device *pdev)
 	free_irq(hsotg->irq, hsotg);
 	iounmap(hsotg->regs);
 
+	clk_disable(hsotg->clk_otg);
+	clk_put(hsotg->clk_otg);
+
 	release_resource(hsotg->regs_res);
 	kfree(hsotg->regs_res);
 
-- 
1.6.3.3

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux