diff options
Diffstat (limited to 'drivers/usb/mtu3/mtu3_plat.c')
-rw-r--r-- | drivers/usb/mtu3/mtu3_plat.c | 56 |
1 files changed, 39 insertions, 17 deletions
diff --git a/drivers/usb/mtu3/mtu3_plat.c b/drivers/usb/mtu3/mtu3_plat.c index 783367805c99..42550c7db3e7 100644 --- a/drivers/usb/mtu3/mtu3_plat.c +++ b/drivers/usb/mtu3/mtu3_plat.c | |||
@@ -123,7 +123,13 @@ static int ssusb_rscs_init(struct ssusb_mtk *ssusb) | |||
123 | ret = clk_prepare_enable(ssusb->sys_clk); | 123 | ret = clk_prepare_enable(ssusb->sys_clk); |
124 | if (ret) { | 124 | if (ret) { |
125 | dev_err(ssusb->dev, "failed to enable sys_clk\n"); | 125 | dev_err(ssusb->dev, "failed to enable sys_clk\n"); |
126 | goto clk_err; | 126 | goto sys_clk_err; |
127 | } | ||
128 | |||
129 | ret = clk_prepare_enable(ssusb->ref_clk); | ||
130 | if (ret) { | ||
131 | dev_err(ssusb->dev, "failed to enable ref_clk\n"); | ||
132 | goto ref_clk_err; | ||
127 | } | 133 | } |
128 | 134 | ||
129 | ret = ssusb_phy_init(ssusb); | 135 | ret = ssusb_phy_init(ssusb); |
@@ -143,8 +149,10 @@ static int ssusb_rscs_init(struct ssusb_mtk *ssusb) | |||
143 | phy_err: | 149 | phy_err: |
144 | ssusb_phy_exit(ssusb); | 150 | ssusb_phy_exit(ssusb); |
145 | phy_init_err: | 151 | phy_init_err: |
152 | clk_disable_unprepare(ssusb->ref_clk); | ||
153 | ref_clk_err: | ||
146 | clk_disable_unprepare(ssusb->sys_clk); | 154 | clk_disable_unprepare(ssusb->sys_clk); |
147 | clk_err: | 155 | sys_clk_err: |
148 | regulator_disable(ssusb->vusb33); | 156 | regulator_disable(ssusb->vusb33); |
149 | vusb33_err: | 157 | vusb33_err: |
150 | 158 | ||
@@ -154,6 +162,7 @@ vusb33_err: | |||
154 | static void ssusb_rscs_exit(struct ssusb_mtk *ssusb) | 162 | static void ssusb_rscs_exit(struct ssusb_mtk *ssusb) |
155 | { | 163 | { |
156 | clk_disable_unprepare(ssusb->sys_clk); | 164 | clk_disable_unprepare(ssusb->sys_clk); |
165 | clk_disable_unprepare(ssusb->ref_clk); | ||
157 | regulator_disable(ssusb->vusb33); | 166 | regulator_disable(ssusb->vusb33); |
158 | ssusb_phy_power_off(ssusb); | 167 | ssusb_phy_power_off(ssusb); |
159 | ssusb_phy_exit(ssusb); | 168 | ssusb_phy_exit(ssusb); |
@@ -204,6 +213,31 @@ static int get_ssusb_rscs(struct platform_device *pdev, struct ssusb_mtk *ssusb) | |||
204 | int i; | 213 | int i; |
205 | int ret; | 214 | int ret; |
206 | 215 | ||
216 | ssusb->vusb33 = devm_regulator_get(&pdev->dev, "vusb33"); | ||
217 | if (IS_ERR(ssusb->vusb33)) { | ||
218 | dev_err(dev, "failed to get vusb33\n"); | ||
219 | return PTR_ERR(ssusb->vusb33); | ||
220 | } | ||
221 | |||
222 | ssusb->sys_clk = devm_clk_get(dev, "sys_ck"); | ||
223 | if (IS_ERR(ssusb->sys_clk)) { | ||
224 | dev_err(dev, "failed to get sys clock\n"); | ||
225 | return PTR_ERR(ssusb->sys_clk); | ||
226 | } | ||
227 | |||
228 | /* | ||
229 | * reference clock is usually a "fixed-clock", make it optional | ||
230 | * for backward compatibility and ignore the error if it does | ||
231 | * not exist. | ||
232 | */ | ||
233 | ssusb->ref_clk = devm_clk_get(dev, "ref_ck"); | ||
234 | if (IS_ERR(ssusb->ref_clk)) { | ||
235 | if (PTR_ERR(ssusb->ref_clk) == -EPROBE_DEFER) | ||
236 | return -EPROBE_DEFER; | ||
237 | |||
238 | ssusb->ref_clk = NULL; | ||
239 | } | ||
240 | |||
207 | ssusb->num_phys = of_count_phandle_with_args(node, | 241 | ssusb->num_phys = of_count_phandle_with_args(node, |
208 | "phys", "#phy-cells"); | 242 | "phys", "#phy-cells"); |
209 | if (ssusb->num_phys > 0) { | 243 | if (ssusb->num_phys > 0) { |
@@ -225,22 +259,8 @@ static int get_ssusb_rscs(struct platform_device *pdev, struct ssusb_mtk *ssusb) | |||
225 | 259 | ||
226 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ippc"); | 260 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ippc"); |
227 | ssusb->ippc_base = devm_ioremap_resource(dev, res); | 261 | ssusb->ippc_base = devm_ioremap_resource(dev, res); |
228 | if (IS_ERR(ssusb->ippc_base)) { | 262 | if (IS_ERR(ssusb->ippc_base)) |
229 | dev_err(dev, "failed to map memory for ippc\n"); | ||
230 | return PTR_ERR(ssusb->ippc_base); | 263 | return PTR_ERR(ssusb->ippc_base); |
231 | } | ||
232 | |||
233 | ssusb->vusb33 = devm_regulator_get(&pdev->dev, "vusb33"); | ||
234 | if (IS_ERR(ssusb->vusb33)) { | ||
235 | dev_err(dev, "failed to get vusb33\n"); | ||
236 | return PTR_ERR(ssusb->vusb33); | ||
237 | } | ||
238 | |||
239 | ssusb->sys_clk = devm_clk_get(dev, "sys_ck"); | ||
240 | if (IS_ERR(ssusb->sys_clk)) { | ||
241 | dev_err(dev, "failed to get sys clock\n"); | ||
242 | return PTR_ERR(ssusb->sys_clk); | ||
243 | } | ||
244 | 264 | ||
245 | ssusb->dr_mode = usb_get_dr_mode(dev); | 265 | ssusb->dr_mode = usb_get_dr_mode(dev); |
246 | if (ssusb->dr_mode == USB_DR_MODE_UNKNOWN) { | 266 | if (ssusb->dr_mode == USB_DR_MODE_UNKNOWN) { |
@@ -428,6 +448,7 @@ static int __maybe_unused mtu3_suspend(struct device *dev) | |||
428 | ssusb_host_disable(ssusb, true); | 448 | ssusb_host_disable(ssusb, true); |
429 | ssusb_phy_power_off(ssusb); | 449 | ssusb_phy_power_off(ssusb); |
430 | clk_disable_unprepare(ssusb->sys_clk); | 450 | clk_disable_unprepare(ssusb->sys_clk); |
451 | clk_disable_unprepare(ssusb->ref_clk); | ||
431 | ssusb_wakeup_enable(ssusb); | 452 | ssusb_wakeup_enable(ssusb); |
432 | 453 | ||
433 | return 0; | 454 | return 0; |
@@ -445,6 +466,7 @@ static int __maybe_unused mtu3_resume(struct device *dev) | |||
445 | 466 | ||
446 | ssusb_wakeup_disable(ssusb); | 467 | ssusb_wakeup_disable(ssusb); |
447 | clk_prepare_enable(ssusb->sys_clk); | 468 | clk_prepare_enable(ssusb->sys_clk); |
469 | clk_prepare_enable(ssusb->ref_clk); | ||
448 | ssusb_phy_power_on(ssusb); | 470 | ssusb_phy_power_on(ssusb); |
449 | ssusb_host_enable(ssusb); | 471 | ssusb_host_enable(ssusb); |
450 | 472 | ||