diff options
Diffstat (limited to 'drivers/usb/mtu3/mtu3_plat.c')
-rw-r--r-- | drivers/usb/mtu3/mtu3_plat.c | 47 |
1 files changed, 22 insertions, 25 deletions
diff --git a/drivers/usb/mtu3/mtu3_plat.c b/drivers/usb/mtu3/mtu3_plat.c index e086630e41a9..fd0f6c5dfbc1 100644 --- a/drivers/usb/mtu3/mtu3_plat.c +++ b/drivers/usb/mtu3/mtu3_plat.c | |||
@@ -16,6 +16,7 @@ | |||
16 | 16 | ||
17 | #include "mtu3.h" | 17 | #include "mtu3.h" |
18 | #include "mtu3_dr.h" | 18 | #include "mtu3_dr.h" |
19 | #include "mtu3_debug.h" | ||
19 | 20 | ||
20 | /* u2-port0 should be powered on and enabled; */ | 21 | /* u2-port0 should be powered on and enabled; */ |
21 | int ssusb_check_clocks(struct ssusb_mtk *ssusb, u32 ex_clks) | 22 | int ssusb_check_clocks(struct ssusb_mtk *ssusb, u32 ex_clks) |
@@ -210,30 +211,16 @@ static void ssusb_ip_sw_reset(struct ssusb_mtk *ssusb) | |||
210 | mtu3_setbits(ssusb->ippc_base, U3D_SSUSB_IP_PW_CTRL2, SSUSB_IP_DEV_PDN); | 211 | mtu3_setbits(ssusb->ippc_base, U3D_SSUSB_IP_PW_CTRL2, SSUSB_IP_DEV_PDN); |
211 | } | 212 | } |
212 | 213 | ||
213 | /* ignore the error if the clock does not exist */ | ||
214 | static struct clk *get_optional_clk(struct device *dev, const char *id) | ||
215 | { | ||
216 | struct clk *opt_clk; | ||
217 | |||
218 | opt_clk = devm_clk_get(dev, id); | ||
219 | /* ignore error number except EPROBE_DEFER */ | ||
220 | if (IS_ERR(opt_clk) && (PTR_ERR(opt_clk) != -EPROBE_DEFER)) | ||
221 | opt_clk = NULL; | ||
222 | |||
223 | return opt_clk; | ||
224 | } | ||
225 | |||
226 | static int get_ssusb_rscs(struct platform_device *pdev, struct ssusb_mtk *ssusb) | 214 | static int get_ssusb_rscs(struct platform_device *pdev, struct ssusb_mtk *ssusb) |
227 | { | 215 | { |
228 | struct device_node *node = pdev->dev.of_node; | 216 | struct device_node *node = pdev->dev.of_node; |
229 | struct otg_switch_mtk *otg_sx = &ssusb->otg_switch; | 217 | struct otg_switch_mtk *otg_sx = &ssusb->otg_switch; |
230 | struct device *dev = &pdev->dev; | 218 | struct device *dev = &pdev->dev; |
231 | struct regulator *vbus; | ||
232 | struct resource *res; | 219 | struct resource *res; |
233 | int i; | 220 | int i; |
234 | int ret; | 221 | int ret; |
235 | 222 | ||
236 | ssusb->vusb33 = devm_regulator_get(&pdev->dev, "vusb33"); | 223 | ssusb->vusb33 = devm_regulator_get(dev, "vusb33"); |
237 | if (IS_ERR(ssusb->vusb33)) { | 224 | if (IS_ERR(ssusb->vusb33)) { |
238 | dev_err(dev, "failed to get vusb33\n"); | 225 | dev_err(dev, "failed to get vusb33\n"); |
239 | return PTR_ERR(ssusb->vusb33); | 226 | return PTR_ERR(ssusb->vusb33); |
@@ -245,15 +232,15 @@ static int get_ssusb_rscs(struct platform_device *pdev, struct ssusb_mtk *ssusb) | |||
245 | return PTR_ERR(ssusb->sys_clk); | 232 | return PTR_ERR(ssusb->sys_clk); |
246 | } | 233 | } |
247 | 234 | ||
248 | ssusb->ref_clk = get_optional_clk(dev, "ref_ck"); | 235 | ssusb->ref_clk = devm_clk_get_optional(dev, "ref_ck"); |
249 | if (IS_ERR(ssusb->ref_clk)) | 236 | if (IS_ERR(ssusb->ref_clk)) |
250 | return PTR_ERR(ssusb->ref_clk); | 237 | return PTR_ERR(ssusb->ref_clk); |
251 | 238 | ||
252 | ssusb->mcu_clk = get_optional_clk(dev, "mcu_ck"); | 239 | ssusb->mcu_clk = devm_clk_get_optional(dev, "mcu_ck"); |
253 | if (IS_ERR(ssusb->mcu_clk)) | 240 | if (IS_ERR(ssusb->mcu_clk)) |
254 | return PTR_ERR(ssusb->mcu_clk); | 241 | return PTR_ERR(ssusb->mcu_clk); |
255 | 242 | ||
256 | ssusb->dma_clk = get_optional_clk(dev, "dma_ck"); | 243 | ssusb->dma_clk = devm_clk_get_optional(dev, "dma_ck"); |
257 | if (IS_ERR(ssusb->dma_clk)) | 244 | if (IS_ERR(ssusb->dma_clk)) |
258 | return PTR_ERR(ssusb->dma_clk); | 245 | return PTR_ERR(ssusb->dma_clk); |
259 | 246 | ||
@@ -286,7 +273,7 @@ static int get_ssusb_rscs(struct platform_device *pdev, struct ssusb_mtk *ssusb) | |||
286 | ssusb->dr_mode = USB_DR_MODE_OTG; | 273 | ssusb->dr_mode = USB_DR_MODE_OTG; |
287 | 274 | ||
288 | if (ssusb->dr_mode == USB_DR_MODE_PERIPHERAL) | 275 | if (ssusb->dr_mode == USB_DR_MODE_PERIPHERAL) |
289 | return 0; | 276 | goto out; |
290 | 277 | ||
291 | /* if host role is supported */ | 278 | /* if host role is supported */ |
292 | ret = ssusb_wakeup_of_property_parse(ssusb, node); | 279 | ret = ssusb_wakeup_of_property_parse(ssusb, node); |
@@ -299,15 +286,14 @@ static int get_ssusb_rscs(struct platform_device *pdev, struct ssusb_mtk *ssusb) | |||
299 | of_property_read_u32(node, "mediatek,u3p-dis-msk", | 286 | of_property_read_u32(node, "mediatek,u3p-dis-msk", |
300 | &ssusb->u3p_dis_msk); | 287 | &ssusb->u3p_dis_msk); |
301 | 288 | ||
302 | vbus = devm_regulator_get(&pdev->dev, "vbus"); | 289 | otg_sx->vbus = devm_regulator_get(dev, "vbus"); |
303 | if (IS_ERR(vbus)) { | 290 | if (IS_ERR(otg_sx->vbus)) { |
304 | dev_err(dev, "failed to get vbus\n"); | 291 | dev_err(dev, "failed to get vbus\n"); |
305 | return PTR_ERR(vbus); | 292 | return PTR_ERR(otg_sx->vbus); |
306 | } | 293 | } |
307 | otg_sx->vbus = vbus; | ||
308 | 294 | ||
309 | if (ssusb->dr_mode == USB_DR_MODE_HOST) | 295 | if (ssusb->dr_mode == USB_DR_MODE_HOST) |
310 | return 0; | 296 | goto out; |
311 | 297 | ||
312 | /* if dual-role mode is supported */ | 298 | /* if dual-role mode is supported */ |
313 | otg_sx->is_u3_drd = of_property_read_bool(node, "mediatek,usb3-drd"); | 299 | otg_sx->is_u3_drd = of_property_read_bool(node, "mediatek,usb3-drd"); |
@@ -322,6 +308,7 @@ static int get_ssusb_rscs(struct platform_device *pdev, struct ssusb_mtk *ssusb) | |||
322 | } | 308 | } |
323 | } | 309 | } |
324 | 310 | ||
311 | out: | ||
325 | dev_info(dev, "dr_mode: %d, is_u3_dr: %d, u3p_dis_msk: %x, drd: %s\n", | 312 | dev_info(dev, "dr_mode: %d, is_u3_dr: %d, u3p_dis_msk: %x, drd: %s\n", |
326 | ssusb->dr_mode, otg_sx->is_u3_drd, ssusb->u3p_dis_msk, | 313 | ssusb->dr_mode, otg_sx->is_u3_drd, ssusb->u3p_dis_msk, |
327 | otg_sx->manual_drd_enabled ? "manual" : "auto"); | 314 | otg_sx->manual_drd_enabled ? "manual" : "auto"); |
@@ -354,6 +341,8 @@ static int mtu3_probe(struct platform_device *pdev) | |||
354 | if (ret) | 341 | if (ret) |
355 | return ret; | 342 | return ret; |
356 | 343 | ||
344 | ssusb_debugfs_create_root(ssusb); | ||
345 | |||
357 | /* enable power domain */ | 346 | /* enable power domain */ |
358 | pm_runtime_enable(dev); | 347 | pm_runtime_enable(dev); |
359 | pm_runtime_get_sync(dev); | 348 | pm_runtime_get_sync(dev); |
@@ -401,7 +390,11 @@ static int mtu3_probe(struct platform_device *pdev) | |||
401 | goto gadget_exit; | 390 | goto gadget_exit; |
402 | } | 391 | } |
403 | 392 | ||
404 | ssusb_otg_switch_init(ssusb); | 393 | ret = ssusb_otg_switch_init(ssusb); |
394 | if (ret) { | ||
395 | dev_err(dev, "failed to initialize switch\n"); | ||
396 | goto host_exit; | ||
397 | } | ||
405 | break; | 398 | break; |
406 | default: | 399 | default: |
407 | dev_err(dev, "unsupported mode: %d\n", ssusb->dr_mode); | 400 | dev_err(dev, "unsupported mode: %d\n", ssusb->dr_mode); |
@@ -411,6 +404,8 @@ static int mtu3_probe(struct platform_device *pdev) | |||
411 | 404 | ||
412 | return 0; | 405 | return 0; |
413 | 406 | ||
407 | host_exit: | ||
408 | ssusb_host_exit(ssusb); | ||
414 | gadget_exit: | 409 | gadget_exit: |
415 | ssusb_gadget_exit(ssusb); | 410 | ssusb_gadget_exit(ssusb); |
416 | comm_exit: | 411 | comm_exit: |
@@ -418,6 +413,7 @@ comm_exit: | |||
418 | comm_init_err: | 413 | comm_init_err: |
419 | pm_runtime_put_sync(dev); | 414 | pm_runtime_put_sync(dev); |
420 | pm_runtime_disable(dev); | 415 | pm_runtime_disable(dev); |
416 | ssusb_debugfs_remove_root(ssusb); | ||
421 | 417 | ||
422 | return ret; | 418 | return ret; |
423 | } | 419 | } |
@@ -445,6 +441,7 @@ static int mtu3_remove(struct platform_device *pdev) | |||
445 | ssusb_rscs_exit(ssusb); | 441 | ssusb_rscs_exit(ssusb); |
446 | pm_runtime_put_sync(&pdev->dev); | 442 | pm_runtime_put_sync(&pdev->dev); |
447 | pm_runtime_disable(&pdev->dev); | 443 | pm_runtime_disable(&pdev->dev); |
444 | ssusb_debugfs_remove_root(ssusb); | ||
448 | 445 | ||
449 | return 0; | 446 | return 0; |
450 | } | 447 | } |