usb: fotg210: Move clock handling to core
authorLinus Walleij <linus.walleij@linaro.org>
Wed, 18 Jan 2023 07:09:18 +0000 (08:09 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 19 Jan 2023 13:10:44 +0000 (14:10 +0100)
Grab the optional silicon block clock, prepare and enable it in
the core before proceeding to prepare the host or peripheral
driver. This saves duplicate code and also uses the simple
devm_clk_get_optional_enabled() to do everything we really
want to do.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20230103-gemini-fotg210-usb-v2-4-100388af9810@linaro.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/fotg210/fotg210-core.c
drivers/usb/fotg210/fotg210-hcd.c
drivers/usb/fotg210/fotg210-udc.c
drivers/usb/fotg210/fotg210-udc.h
drivers/usb/fotg210/fotg210.h

index 0dd4957ad70af76da72ceadd904cec99a07077fc..f90b2ae9ed9d2f210a516a715d64fb57a5d82b6f 100644 (file)
@@ -6,6 +6,7 @@
  * driver.
  */
 #include <linux/bitops.h>
+#include <linux/clk.h>
 #include <linux/device.h>
 #include <linux/mfd/syscon.h>
 #include <linux/module.h>
@@ -109,6 +110,10 @@ static int fotg210_probe(struct platform_device *pdev)
        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")) {
index 15ba5b1618e1130cabbf3ab1f88c471628426cdf..7bd1e8f3080d78a51d1ccd08d4b24744a0bcf48d 100644 (file)
@@ -33,7 +33,6 @@
 #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>
@@ -5594,44 +5593,22 @@ int fotg210_hcd_probe(struct platform_device *pdev, struct fotg210 *fotg)
        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:
@@ -5647,12 +5624,6 @@ 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);
index a4a6f57c31905cb1f0bafda43559c387fe0713d0..195dc505004685c639d1384b553a37439da00921 100644 (file)
@@ -15,7 +15,6 @@
 #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>
 
@@ -1134,9 +1133,6 @@ int fotg210_udc_remove(struct platform_device *pdev)
        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;
@@ -1164,34 +1160,17 @@ int fotg210_udc_probe(struct platform_device *pdev, struct fotg210 *fotg)
        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");
        }
 
@@ -1288,11 +1267,8 @@ err_map:
 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;
 }
index 20335a38a410d11d4a19d71474c59c22161f793a..22b72caf498c92cc39ed3db6326d5a758ef7c6cb 100644 (file)
@@ -231,7 +231,6 @@ struct fotg210_ep {
 struct fotg210_udc {
        spinlock_t              lock; /* protect the struct */
        void __iomem            *reg;
-       struct clk              *pclk;
 
        unsigned long           irq_trigger;
 
index 50436cc16538c05ef983dd8a82f609f4336ecbac..4d0d4ae1a95764037a2b0f621ec74a42aef9446e 100644 (file)
@@ -12,6 +12,7 @@ struct fotg210 {
        struct device *dev;
        struct resource *res;
        void __iomem *base;
+       struct clk *pclk;
        struct regmap *map;
        enum gemini_port port;
 };