aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/phy/phy-msm-usb.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/phy/phy-msm-usb.c')
-rw-r--r--drivers/usb/phy/phy-msm-usb.c93
1 files changed, 42 insertions, 51 deletions
diff --git a/drivers/usb/phy/phy-msm-usb.c b/drivers/usb/phy/phy-msm-usb.c
index e9d4cd960ecd..d204f745ed05 100644
--- a/drivers/usb/phy/phy-msm-usb.c
+++ b/drivers/usb/phy/phy-msm-usb.c
@@ -40,8 +40,6 @@
40#include <linux/usb/msm_hsusb_hw.h> 40#include <linux/usb/msm_hsusb_hw.h>
41#include <linux/regulator/consumer.h> 41#include <linux/regulator/consumer.h>
42 42
43#include <mach/clk.h>
44
45#define MSM_USB_BASE (motg->regs) 43#define MSM_USB_BASE (motg->regs)
46#define DRIVER_NAME "msm_otg" 44#define DRIVER_NAME "msm_otg"
47 45
@@ -161,32 +159,6 @@ put_3p3:
161 return rc; 159 return rc;
162} 160}
163 161
164#ifdef CONFIG_PM_SLEEP
165#define USB_PHY_SUSP_DIG_VOL 500000
166static int msm_hsusb_config_vddcx(int high)
167{
168 int max_vol = USB_PHY_VDD_DIG_VOL_MAX;
169 int min_vol;
170 int ret;
171
172 if (high)
173 min_vol = USB_PHY_VDD_DIG_VOL_MIN;
174 else
175 min_vol = USB_PHY_SUSP_DIG_VOL;
176
177 ret = regulator_set_voltage(hsusb_vddcx, min_vol, max_vol);
178 if (ret) {
179 pr_err("%s: unable to set the voltage for regulator "
180 "HSUSB_VDDCX\n", __func__);
181 return ret;
182 }
183
184 pr_debug("%s: min_vol:%d max_vol:%d\n", __func__, min_vol, max_vol);
185
186 return ret;
187}
188#endif
189
190static int msm_hsusb_ldo_set_mode(int on) 162static int msm_hsusb_ldo_set_mode(int on)
191{ 163{
192 int ret = 0; 164 int ret = 0;
@@ -308,33 +280,30 @@ static void ulpi_init(struct msm_otg *motg)
308 280
309static int msm_otg_link_clk_reset(struct msm_otg *motg, bool assert) 281static int msm_otg_link_clk_reset(struct msm_otg *motg, bool assert)
310{ 282{
311 int ret; 283 int ret = 0;
284
285 if (!motg->pdata->link_clk_reset)
286 return ret;
287
288 ret = motg->pdata->link_clk_reset(motg->clk, assert);
289 if (ret)
290 dev_err(motg->phy.dev, "usb link clk reset %s failed\n",
291 assert ? "assert" : "deassert");
312 292
313 if (assert) {
314 ret = clk_reset(motg->clk, CLK_RESET_ASSERT);
315 if (ret)
316 dev_err(motg->phy.dev, "usb hs_clk assert failed\n");
317 } else {
318 ret = clk_reset(motg->clk, CLK_RESET_DEASSERT);
319 if (ret)
320 dev_err(motg->phy.dev, "usb hs_clk deassert failed\n");
321 }
322 return ret; 293 return ret;
323} 294}
324 295
325static int msm_otg_phy_clk_reset(struct msm_otg *motg) 296static int msm_otg_phy_clk_reset(struct msm_otg *motg)
326{ 297{
327 int ret; 298 int ret = 0;
328 299
329 ret = clk_reset(motg->phy_reset_clk, CLK_RESET_ASSERT); 300 if (!motg->pdata->phy_clk_reset)
330 if (ret) {
331 dev_err(motg->phy.dev, "usb phy clk assert failed\n");
332 return ret; 301 return ret;
333 } 302
334 usleep_range(10000, 12000); 303 ret = motg->pdata->phy_clk_reset(motg->phy_reset_clk);
335 ret = clk_reset(motg->phy_reset_clk, CLK_RESET_DEASSERT);
336 if (ret) 304 if (ret)
337 dev_err(motg->phy.dev, "usb phy clk deassert failed\n"); 305 dev_err(motg->phy.dev, "usb phy clk reset failed\n");
306
338 return ret; 307 return ret;
339} 308}
340 309
@@ -445,7 +414,32 @@ static int msm_otg_reset(struct usb_phy *phy)
445#define PHY_SUSPEND_TIMEOUT_USEC (500 * 1000) 414#define PHY_SUSPEND_TIMEOUT_USEC (500 * 1000)
446#define PHY_RESUME_TIMEOUT_USEC (100 * 1000) 415#define PHY_RESUME_TIMEOUT_USEC (100 * 1000)
447 416
448#ifdef CONFIG_PM_SLEEP 417#ifdef CONFIG_PM
418
419#define USB_PHY_SUSP_DIG_VOL 500000
420static int msm_hsusb_config_vddcx(int high)
421{
422 int max_vol = USB_PHY_VDD_DIG_VOL_MAX;
423 int min_vol;
424 int ret;
425
426 if (high)
427 min_vol = USB_PHY_VDD_DIG_VOL_MIN;
428 else
429 min_vol = USB_PHY_SUSP_DIG_VOL;
430
431 ret = regulator_set_voltage(hsusb_vddcx, min_vol, max_vol);
432 if (ret) {
433 pr_err("%s: unable to set the voltage for regulator "
434 "HSUSB_VDDCX\n", __func__);
435 return ret;
436 }
437
438 pr_debug("%s: min_vol:%d max_vol:%d\n", __func__, min_vol, max_vol);
439
440 return ret;
441}
442
449static int msm_otg_suspend(struct msm_otg *motg) 443static int msm_otg_suspend(struct msm_otg *motg)
450{ 444{
451 struct usb_phy *phy = &motg->phy; 445 struct usb_phy *phy = &motg->phy;
@@ -669,6 +663,7 @@ static void msm_otg_start_host(struct usb_phy *phy, int on)
669 pdata->setup_gpio(OTG_STATE_A_HOST); 663 pdata->setup_gpio(OTG_STATE_A_HOST);
670#ifdef CONFIG_USB 664#ifdef CONFIG_USB
671 usb_add_hcd(hcd, hcd->irq, IRQF_SHARED); 665 usb_add_hcd(hcd, hcd->irq, IRQF_SHARED);
666 device_wakeup_enable(hcd->self.controller);
672#endif 667#endif
673 } else { 668 } else {
674 dev_dbg(phy->dev, "host off\n"); 669 dev_dbg(phy->dev, "host off\n");
@@ -1737,22 +1732,18 @@ static int msm_otg_pm_resume(struct device *dev)
1737} 1732}
1738#endif 1733#endif
1739 1734
1740#ifdef CONFIG_PM
1741static const struct dev_pm_ops msm_otg_dev_pm_ops = { 1735static const struct dev_pm_ops msm_otg_dev_pm_ops = {
1742 SET_SYSTEM_SLEEP_PM_OPS(msm_otg_pm_suspend, msm_otg_pm_resume) 1736 SET_SYSTEM_SLEEP_PM_OPS(msm_otg_pm_suspend, msm_otg_pm_resume)
1743 SET_RUNTIME_PM_OPS(msm_otg_runtime_suspend, msm_otg_runtime_resume, 1737 SET_RUNTIME_PM_OPS(msm_otg_runtime_suspend, msm_otg_runtime_resume,
1744 msm_otg_runtime_idle) 1738 msm_otg_runtime_idle)
1745}; 1739};
1746#endif
1747 1740
1748static struct platform_driver msm_otg_driver = { 1741static struct platform_driver msm_otg_driver = {
1749 .remove = msm_otg_remove, 1742 .remove = msm_otg_remove,
1750 .driver = { 1743 .driver = {
1751 .name = DRIVER_NAME, 1744 .name = DRIVER_NAME,
1752 .owner = THIS_MODULE, 1745 .owner = THIS_MODULE,
1753#ifdef CONFIG_PM
1754 .pm = &msm_otg_dev_pm_ops, 1746 .pm = &msm_otg_dev_pm_ops,
1755#endif
1756 }, 1747 },
1757}; 1748};
1758 1749