Skip to content

Commit

Permalink
usb: phy: nop: Defer clock prepare until PHY init
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Mark Brown authored and Felipe Balbi committed Oct 1, 2013
1 parent 15c03dd commit 4d175f3
Show file tree
Hide file tree
Showing 3 changed files with 5 additions and 25 deletions.
5 changes: 2 additions & 3 deletions drivers/usb/phy/phy-am335x.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
24 changes: 3 additions & 21 deletions drivers/usb/phy/phy-generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand All @@ -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))
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -252,23 +237,20 @@ 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;
}

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;
Expand Down
1 change: 0 additions & 1 deletion drivers/usb/phy/phy-generic.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 4d175f3

Please sign in to comment.