aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/mtu3/mtu3_plat.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/mtu3/mtu3_plat.c')
-rw-r--r--drivers/usb/mtu3/mtu3_plat.c56
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)
143phy_err: 149phy_err:
144 ssusb_phy_exit(ssusb); 150 ssusb_phy_exit(ssusb);
145phy_init_err: 151phy_init_err:
152 clk_disable_unprepare(ssusb->ref_clk);
153ref_clk_err:
146 clk_disable_unprepare(ssusb->sys_clk); 154 clk_disable_unprepare(ssusb->sys_clk);
147clk_err: 155sys_clk_err:
148 regulator_disable(ssusb->vusb33); 156 regulator_disable(ssusb->vusb33);
149vusb33_err: 157vusb33_err:
150 158
@@ -154,6 +162,7 @@ vusb33_err:
154static void ssusb_rscs_exit(struct ssusb_mtk *ssusb) 162static 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