* driver.
  */
 #include <linux/bitops.h>
+#include <linux/clk.h>
 #include <linux/device.h>
 #include <linux/mfd/syscon.h>
 #include <linux/module.h>
        if (!fotg->base)
                return -ENOMEM;
 
+       fotg->pclk = devm_clk_get_optional_enabled(dev, "PCLK");
+       if (IS_ERR(fotg->pclk))
+               return PTR_ERR(fotg->pclk);
+
        mode = usb_get_dr_mode(dev);
 
        if (of_device_is_compatible(dev->of_node, "cortina,gemini-usb")) {
 
 #include <linux/platform_device.h>
 #include <linux/io.h>
 #include <linux/iopoll.h>
-#include <linux/clk.h>
 
 #include <asm/byteorder.h>
 #include <asm/irq.h>
        fotg210->fotg = fotg;
        fotg210->caps = hcd->regs;
 
-       /* It's OK not to supply this clock */
-       fotg210->pclk = clk_get(dev, "PCLK");
-       if (!IS_ERR(fotg210->pclk)) {
-               retval = clk_prepare_enable(fotg210->pclk);
-               if (retval) {
-                       dev_err(dev, "failed to enable PCLK\n");
-                       goto failed_put_hcd;
-               }
-       } else if (PTR_ERR(fotg210->pclk) == -EPROBE_DEFER) {
-               /*
-                * Percolate deferrals, for anything else,
-                * just live without the clocking.
-                */
-               retval = PTR_ERR(fotg210->pclk);
-               goto failed_dis_clk;
-       }
-
        retval = fotg210_setup(hcd);
        if (retval)
-               goto failed_dis_clk;
+               goto failed_put_hcd;
 
        fotg210_init(fotg210);
 
        retval = usb_add_hcd(hcd, irq, IRQF_SHARED);
        if (retval) {
                dev_err(dev, "failed to add hcd with err %d\n", retval);
-               goto failed_dis_clk;
+               goto failed_put_hcd;
        }
        device_wakeup_enable(hcd->self.controller);
        platform_set_drvdata(pdev, hcd);
 
        return retval;
 
-failed_dis_clk:
-       if (!IS_ERR(fotg210->pclk)) {
-               clk_disable_unprepare(fotg210->pclk);
-               clk_put(fotg210->pclk);
-       }
 failed_put_hcd:
        usb_put_hcd(hcd);
 fail_create_hcd:
 int fotg210_hcd_remove(struct platform_device *pdev)
 {
        struct usb_hcd *hcd = platform_get_drvdata(pdev);
-       struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd);
-
-       if (!IS_ERR(fotg210->pclk)) {
-               clk_disable_unprepare(fotg210->pclk);
-               clk_put(fotg210->pclk);
-       }
 
        usb_remove_hcd(hcd);
        usb_put_hcd(hcd);
 
 #include <linux/platform_device.h>
 #include <linux/usb/ch9.h>
 #include <linux/usb/gadget.h>
-#include <linux/clk.h>
 #include <linux/usb/otg.h>
 #include <linux/usb/phy.h>
 
        for (i = 0; i < FOTG210_MAX_NUM_EP; i++)
                kfree(fotg210->ep[i]);
 
-       if (!IS_ERR(fotg210->pclk))
-               clk_disable_unprepare(fotg210->pclk);
-
        kfree(fotg210);
 
        return 0;
        fotg210->dev = dev;
        fotg210->fotg = fotg;
 
-       /* It's OK not to supply this clock */
-       fotg210->pclk = devm_clk_get(dev, "PCLK");
-       if (!IS_ERR(fotg210->pclk)) {
-               ret = clk_prepare_enable(fotg210->pclk);
-               if (ret) {
-                       dev_err(dev, "failed to enable PCLK\n");
-                       goto err;
-               }
-       } else if (PTR_ERR(fotg210->pclk) == -EPROBE_DEFER) {
-               /*
-                * Percolate deferrals, for anything else,
-                * just live without the clocking.
-                */
-               ret = -EPROBE_DEFER;
-               goto err;
-       }
-
        fotg210->phy = devm_usb_get_phy_by_phandle(dev, "usb-phy", 0);
        if (IS_ERR(fotg210->phy)) {
                ret = PTR_ERR(fotg210->phy);
                if (ret == -EPROBE_DEFER)
-                       goto err_pclk;
+                       goto err_free;
                dev_info(dev, "no PHY found\n");
                fotg210->phy = NULL;
        } else {
                ret = usb_phy_init(fotg210->phy);
                if (ret)
-                       goto err_pclk;
+                       goto err_free;
                dev_info(dev, "found and initialized PHY\n");
        }
 
 err_alloc:
        for (i = 0; i < FOTG210_MAX_NUM_EP; i++)
                kfree(fotg210->ep[i]);
-err_pclk:
-       if (!IS_ERR(fotg210->pclk))
-               clk_disable_unprepare(fotg210->pclk);
 
-err:
+err_free:
        kfree(fotg210);
        return ret;
 }
 
 struct fotg210_udc {
        spinlock_t              lock; /* protect the struct */
        void __iomem            *reg;
-       struct clk              *pclk;
 
        unsigned long           irq_trigger;
 
 
        struct device *dev;
        struct resource *res;
        void __iomem *base;
+       struct clk *pclk;
        struct regmap *map;
        enum gemini_port port;
 };