diff options
Diffstat (limited to 'drivers/usb/phy/phy-msm-usb.c')
-rw-r--r-- | drivers/usb/phy/phy-msm-usb.c | 93 |
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 | ||
166 | static 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 | |||
190 | static int msm_hsusb_ldo_set_mode(int on) | 162 | static 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 | ||
309 | static int msm_otg_link_clk_reset(struct msm_otg *motg, bool assert) | 281 | static 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 | ||
325 | static int msm_otg_phy_clk_reset(struct msm_otg *motg) | 296 | static 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 | ||
420 | static 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 | |||
449 | static int msm_otg_suspend(struct msm_otg *motg) | 443 | static 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 | ||
1741 | static const struct dev_pm_ops msm_otg_dev_pm_ops = { | 1735 | static 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 | ||
1748 | static struct platform_driver msm_otg_driver = { | 1741 | static 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 | ||