diff options
Diffstat (limited to 'drivers/usb/otg/mxs-phy.c')
-rw-r--r-- | drivers/usb/otg/mxs-phy.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/usb/otg/mxs-phy.c b/drivers/usb/otg/mxs-phy.c index 60df28a294b7..b0d9f119c749 100644 --- a/drivers/usb/otg/mxs-phy.c +++ b/drivers/usb/otg/mxs-phy.c | |||
@@ -76,6 +76,25 @@ static void mxs_phy_shutdown(struct usb_phy *phy) | |||
76 | clk_disable_unprepare(mxs_phy->clk); | 76 | clk_disable_unprepare(mxs_phy->clk); |
77 | } | 77 | } |
78 | 78 | ||
79 | static int mxs_phy_suspend(struct usb_phy *x, int suspend) | ||
80 | { | ||
81 | struct mxs_phy *mxs_phy = to_mxs_phy(x); | ||
82 | |||
83 | if (suspend) { | ||
84 | writel_relaxed(0xffffffff, x->io_priv + HW_USBPHY_PWD); | ||
85 | writel_relaxed(BM_USBPHY_CTRL_CLKGATE, | ||
86 | x->io_priv + HW_USBPHY_CTRL_SET); | ||
87 | clk_disable_unprepare(mxs_phy->clk); | ||
88 | } else { | ||
89 | clk_prepare_enable(mxs_phy->clk); | ||
90 | writel_relaxed(BM_USBPHY_CTRL_CLKGATE, | ||
91 | x->io_priv + HW_USBPHY_CTRL_CLR); | ||
92 | writel_relaxed(0, x->io_priv + HW_USBPHY_PWD); | ||
93 | } | ||
94 | |||
95 | return 0; | ||
96 | } | ||
97 | |||
79 | static int mxs_phy_on_connect(struct usb_phy *phy, | 98 | static int mxs_phy_on_connect(struct usb_phy *phy, |
80 | enum usb_device_speed speed) | 99 | enum usb_device_speed speed) |
81 | { | 100 | { |
@@ -137,6 +156,7 @@ static int mxs_phy_probe(struct platform_device *pdev) | |||
137 | mxs_phy->phy.label = DRIVER_NAME; | 156 | mxs_phy->phy.label = DRIVER_NAME; |
138 | mxs_phy->phy.init = mxs_phy_init; | 157 | mxs_phy->phy.init = mxs_phy_init; |
139 | mxs_phy->phy.shutdown = mxs_phy_shutdown; | 158 | mxs_phy->phy.shutdown = mxs_phy_shutdown; |
159 | mxs_phy->phy.set_suspend = mxs_phy_suspend; | ||
140 | mxs_phy->phy.notify_connect = mxs_phy_on_connect; | 160 | mxs_phy->phy.notify_connect = mxs_phy_on_connect; |
141 | mxs_phy->phy.notify_disconnect = mxs_phy_on_disconnect; | 161 | mxs_phy->phy.notify_disconnect = mxs_phy_on_disconnect; |
142 | 162 | ||