aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/phy
diff options
context:
space:
mode:
authorMian Yousaf Kaukab <mian.yousaf.kaukab@stericsson.com>2013-05-15 08:03:26 -0400
committerFelipe Balbi <balbi@ti.com>2013-05-28 13:00:46 -0400
commitd0ed0645a5cfb0cccca6baa84b459eb2078e7fb1 (patch)
tree0f5109b90b3495544e35a0c2c46c785693b884ee /drivers/usb/phy
parent3147dad6fa457e0bb7edaab36f6d290c7048b49e (diff)
usb: phy: ab8500-usb: add transceiver clock control
Add common clock support code for the ab8500-usb phy driver. Acked-by: Ulf Hansson <ulf.hansson@linaro.org> Acked-by: Linus Walleij <linus.walleij@linaro.org> Acked-by: Maxime Coquelin <maxime.coquelin@st.com> Signed-off-by: Mian Yousaf Kaukab <mian.yousaf.kaukab@stericsson.com> Signed-off-by: Fabio Baltieri <fabio.baltieri@linaro.org> Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/phy')
-rw-r--r--drivers/usb/phy/phy-ab8500-usb.c14
1 files changed, 14 insertions, 0 deletions
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 @@
29#include <linux/notifier.h> 29#include <linux/notifier.h>
30#include <linux/interrupt.h> 30#include <linux/interrupt.h>
31#include <linux/delay.h> 31#include <linux/delay.h>
32#include <linux/clk.h>
33#include <linux/err.h>
32#include <linux/mfd/abx500.h> 34#include <linux/mfd/abx500.h>
33#include <linux/mfd/abx500/ab8500.h> 35#include <linux/mfd/abx500/ab8500.h>
34#include <linux/usb/musb-ux500.h> 36#include <linux/usb/musb-ux500.h>
@@ -126,6 +128,7 @@ struct ab8500_usb {
126 unsigned vbus_draw; 128 unsigned vbus_draw;
127 struct work_struct phy_dis_work; 129 struct work_struct phy_dis_work;
128 enum ab8500_usb_mode mode; 130 enum ab8500_usb_mode mode;
131 struct clk *sysclk;
129 struct regulator *v_ape; 132 struct regulator *v_ape;
130 struct regulator *v_musb; 133 struct regulator *v_musb;
131 struct regulator *v_ulpi; 134 struct regulator *v_ulpi;
@@ -252,6 +255,9 @@ static void ab8500_usb_phy_enable(struct ab8500_usb *ab, bool sel_host)
252 if (IS_ERR(ab->pinctrl)) 255 if (IS_ERR(ab->pinctrl))
253 dev_err(ab->dev, "could not get/set default pinstate\n"); 256 dev_err(ab->dev, "could not get/set default pinstate\n");
254 257
258 if (clk_prepare_enable(ab->sysclk))
259 dev_err(ab->dev, "can't prepare/enable clock\n");
260
255 ab8500_usb_regulator_enable(ab); 261 ab8500_usb_regulator_enable(ab);
256 262
257 abx500_mask_and_set_register_interruptible(ab->dev, 263 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)
274 /* Needed to disable the phy.*/ 280 /* Needed to disable the phy.*/
275 ab8500_usb_wd_workaround(ab); 281 ab8500_usb_wd_workaround(ab);
276 282
283 clk_disable_unprepare(ab->sysclk);
284
277 ab8500_usb_regulator_disable(ab); 285 ab8500_usb_regulator_disable(ab);
278 286
279 if (!IS_ERR(ab->pinctrl)) { 287 if (!IS_ERR(ab->pinctrl)) {
@@ -784,6 +792,12 @@ static int ab8500_usb_probe(struct platform_device *pdev)
784 if (err) 792 if (err)
785 return err; 793 return err;
786 794
795 ab->sysclk = devm_clk_get(ab->dev, "sysclk");
796 if (IS_ERR(ab->sysclk)) {
797 dev_err(ab->dev, "Could not get sysclk.\n");
798 return PTR_ERR(ab->sysclk);
799 }
800
787 err = ab8500_usb_irq_setup(pdev, ab); 801 err = ab8500_usb_irq_setup(pdev, ab);
788 if (err < 0) 802 if (err < 0)
789 return err; 803 return err;