From d0ed0645a5cfb0cccca6baa84b459eb2078e7fb1 Mon Sep 17 00:00:00 2001 From: Mian Yousaf Kaukab Date: Wed, 15 May 2013 14:03:26 +0200 Subject: usb: phy: ab8500-usb: add transceiver clock control Add common clock support code for the ab8500-usb phy driver. Acked-by: Ulf Hansson Acked-by: Linus Walleij Acked-by: Maxime Coquelin Signed-off-by: Mian Yousaf Kaukab Signed-off-by: Fabio Baltieri Signed-off-by: Felipe Balbi --- drivers/usb/phy/phy-ab8500-usb.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'drivers/usb/phy/phy-ab8500-usb.c') diff --git a/drivers/usb/phy/phy-ab8500-usb.c b/drivers/usb/phy/phy-ab8500-usb.c index f760e935e059..bdf7f570b5e4 100644 --- a/drivers/usb/phy/phy-ab8500-usb.c +++ b/drivers/usb/phy/phy-ab8500-usb.c @@ -29,6 +29,8 @@ #include #include #include +#include +#include #include #include #include @@ -126,6 +128,7 @@ struct ab8500_usb { unsigned vbus_draw; struct work_struct phy_dis_work; enum ab8500_usb_mode mode; + struct clk *sysclk; struct regulator *v_ape; struct regulator *v_musb; struct regulator *v_ulpi; @@ -252,6 +255,9 @@ static void ab8500_usb_phy_enable(struct ab8500_usb *ab, bool sel_host) if (IS_ERR(ab->pinctrl)) dev_err(ab->dev, "could not get/set default pinstate\n"); + if (clk_prepare_enable(ab->sysclk)) + dev_err(ab->dev, "can't prepare/enable clock\n"); + ab8500_usb_regulator_enable(ab); abx500_mask_and_set_register_interruptible(ab->dev, @@ -274,6 +280,8 @@ static void ab8500_usb_phy_disable(struct ab8500_usb *ab, bool sel_host) /* Needed to disable the phy.*/ ab8500_usb_wd_workaround(ab); + clk_disable_unprepare(ab->sysclk); + ab8500_usb_regulator_disable(ab); if (!IS_ERR(ab->pinctrl)) { @@ -784,6 +792,12 @@ static int ab8500_usb_probe(struct platform_device *pdev) if (err) return err; + ab->sysclk = devm_clk_get(ab->dev, "sysclk"); + if (IS_ERR(ab->sysclk)) { + dev_err(ab->dev, "Could not get sysclk.\n"); + return PTR_ERR(ab->sysclk); + } + err = ab8500_usb_irq_setup(pdev, ab); if (err < 0) return err; -- cgit v1.2.3-55-g7522