usb: phy: nop: Defer clock prepare until PHY init
authorMark Brown <broonie@linaro.org>
Sun, 11 Aug 2013 14:26:04 +0000 (15:26 +0100)
committerFelipe Balbi <balbi@ti.com>
Tue, 1 Oct 2013 14:31:10 +0000 (09:31 -0500)
Since we only enable the PHY clock on init and the PHY init and shutdown
does not occur in atomitc context there is no need to prepare the clock
before it is enabled.  Move the clk_prepare() operations to go along
with the enables, allowing the clock to be fully idle when not in use.

Signed-off-by: Mark Brown <broonie@linaro.org>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/phy/phy-am335x.c
drivers/usb/phy/phy-generic.c
drivers/usb/phy/phy-generic.h

index c4d614d1f17349972d3f629a45949c2e2addef9f..f836dc68104cc1c0d22386631bef50cc4946bbe6 100644 (file)
@@ -59,15 +59,14 @@ static int am335x_phy_probe(struct platform_device *pdev)
 
        ret = usb_add_phy_dev(&am_phy->usb_phy_gen.phy);
        if (ret)
-               goto err_add;
+               return ret;
        am_phy->usb_phy_gen.phy.init = am335x_init;
        am_phy->usb_phy_gen.phy.shutdown = am335x_shutdown;
 
        platform_set_drvdata(pdev, am_phy);
+
        return 0;
 
-err_add:
-       usb_phy_gen_cleanup_phy(&am_phy->usb_phy_gen);
        return ret;
 }
 
index efe59f3f7fdae946f1d6b5c76b9e6f21a0143be1..fcc31045fda7115f6d2e9e18be2d5539e1e33edd 100644 (file)
@@ -74,7 +74,7 @@ int usb_gen_phy_init(struct usb_phy *phy)
        }
 
        if (!IS_ERR(nop->clk))
-               clk_enable(nop->clk);
+               clk_prepare_enable(nop->clk);
 
        if (!IS_ERR(nop->reset)) {
                /* De-assert RESET */
@@ -97,7 +97,7 @@ void usb_gen_phy_shutdown(struct usb_phy *phy)
        }
 
        if (!IS_ERR(nop->clk))
-               clk_disable(nop->clk);
+               clk_disable_unprepare(nop->clk);
 
        if (!IS_ERR(nop->vcc)) {
                if (regulator_disable(nop->vcc))
@@ -160,14 +160,6 @@ int usb_phy_gen_create_phy(struct device *dev, struct usb_phy_gen_xceiv *nop,
                }
        }
 
-       if (!IS_ERR(nop->clk)) {
-               err = clk_prepare(nop->clk);
-               if (err) {
-                       dev_err(dev, "Error preparing clock\n");
-                       return err;
-               }
-       }
-
        nop->vcc = devm_regulator_get(dev, "vcc");
        if (IS_ERR(nop->vcc)) {
                dev_dbg(dev, "Error getting vcc regulator: %ld\n",
@@ -200,13 +192,6 @@ int usb_phy_gen_create_phy(struct device *dev, struct usb_phy_gen_xceiv *nop,
 }
 EXPORT_SYMBOL_GPL(usb_phy_gen_create_phy);
 
-void usb_phy_gen_cleanup_phy(struct usb_phy_gen_xceiv *nop)
-{
-       if (!IS_ERR(nop->clk))
-               clk_unprepare(nop->clk);
-}
-EXPORT_SYMBOL_GPL(usb_phy_gen_cleanup_phy);
-
 static int usb_phy_gen_xceiv_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
@@ -252,15 +237,13 @@ static int usb_phy_gen_xceiv_probe(struct platform_device *pdev)
        if (err) {
                dev_err(&pdev->dev, "can't register transceiver, err: %d\n",
                        err);
-               goto err_add;
+               return err;
        }
 
        platform_set_drvdata(pdev, nop);
 
        return 0;
 
-err_add:
-       usb_phy_gen_cleanup_phy(nop);
        return err;
 }
 
@@ -268,7 +251,6 @@ static int usb_phy_gen_xceiv_remove(struct platform_device *pdev)
 {
        struct usb_phy_gen_xceiv *nop = platform_get_drvdata(pdev);
 
-       usb_phy_gen_cleanup_phy(nop);
        usb_remove_phy(&nop->phy);
 
        return 0;
index 61687d5a965b24ef69729a9cf0c5c38a48a7a2b5..386d11b375aa7abd869eadb94357e47cf20fafbd 100644 (file)
@@ -15,6 +15,5 @@ void usb_gen_phy_shutdown(struct usb_phy *phy);
 int usb_phy_gen_create_phy(struct device *dev, struct usb_phy_gen_xceiv *nop,
                enum usb_phy_type type, u32 clk_rate, bool needs_vcc,
                bool needs_reset);
-void usb_phy_gen_cleanup_phy(struct usb_phy_gen_xceiv *nop);
 
 #endif