diff options
Diffstat (limited to 'drivers/usb/musb/da8xx.c')
-rw-r--r-- | drivers/usb/musb/da8xx.c | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/drivers/usb/musb/da8xx.c b/drivers/usb/musb/da8xx.c index 45ccac3aad9d..387f4a75706f 100644 --- a/drivers/usb/musb/da8xx.c +++ b/drivers/usb/musb/da8xx.c | |||
@@ -83,6 +83,7 @@ | |||
83 | struct da8xx_glue { | 83 | struct da8xx_glue { |
84 | struct device *dev; | 84 | struct device *dev; |
85 | struct platform_device *musb; | 85 | struct platform_device *musb; |
86 | struct clk *clk; | ||
86 | }; | 87 | }; |
87 | 88 | ||
88 | /* | 89 | /* |
@@ -423,8 +424,6 @@ static int da8xx_musb_init(struct musb *musb) | |||
423 | 424 | ||
424 | musb->mregs += DA8XX_MENTOR_CORE_OFFSET; | 425 | musb->mregs += DA8XX_MENTOR_CORE_OFFSET; |
425 | 426 | ||
426 | clk_enable(musb->clock); | ||
427 | |||
428 | /* Returns zero if e.g. not clocked */ | 427 | /* Returns zero if e.g. not clocked */ |
429 | rev = musb_readl(reg_base, DA8XX_USB_REVISION_REG); | 428 | rev = musb_readl(reg_base, DA8XX_USB_REVISION_REG); |
430 | if (!rev) | 429 | if (!rev) |
@@ -456,7 +455,6 @@ static int da8xx_musb_init(struct musb *musb) | |||
456 | musb->isr = da8xx_musb_interrupt; | 455 | musb->isr = da8xx_musb_interrupt; |
457 | return 0; | 456 | return 0; |
458 | fail: | 457 | fail: |
459 | clk_disable(musb->clock); | ||
460 | return -ENODEV; | 458 | return -ENODEV; |
461 | } | 459 | } |
462 | 460 | ||
@@ -470,8 +468,6 @@ static int da8xx_musb_exit(struct musb *musb) | |||
470 | otg_put_transceiver(musb->xceiv); | 468 | otg_put_transceiver(musb->xceiv); |
471 | usb_nop_xceiv_unregister(); | 469 | usb_nop_xceiv_unregister(); |
472 | 470 | ||
473 | clk_disable(musb->clock); | ||
474 | |||
475 | return 0; | 471 | return 0; |
476 | } | 472 | } |
477 | 473 | ||
@@ -496,6 +492,8 @@ static int __init da8xx_probe(struct platform_device *pdev) | |||
496 | struct platform_device *musb; | 492 | struct platform_device *musb; |
497 | struct da8xx_glue *glue; | 493 | struct da8xx_glue *glue; |
498 | 494 | ||
495 | struct clk *clk; | ||
496 | |||
499 | int ret = -ENOMEM; | 497 | int ret = -ENOMEM; |
500 | 498 | ||
501 | glue = kzalloc(sizeof(*glue), GFP_KERNEL); | 499 | glue = kzalloc(sizeof(*glue), GFP_KERNEL); |
@@ -510,12 +508,26 @@ static int __init da8xx_probe(struct platform_device *pdev) | |||
510 | goto err1; | 508 | goto err1; |
511 | } | 509 | } |
512 | 510 | ||
511 | clk = clk_get(&pdev->dev, "usb20"); | ||
512 | if (IS_ERR(clk)) { | ||
513 | dev_err(&pdev->dev, "failed to get clock\n"); | ||
514 | ret = PTR_ERR(clk); | ||
515 | goto err2; | ||
516 | } | ||
517 | |||
518 | ret = clk_enable(clk); | ||
519 | if (ret) { | ||
520 | dev_err(&pdev->dev, "failed to enable clock\n"); | ||
521 | goto err3; | ||
522 | } | ||
523 | |||
513 | musb->dev.parent = &pdev->dev; | 524 | musb->dev.parent = &pdev->dev; |
514 | musb->dev.dma_mask = &da8xx_dmamask; | 525 | musb->dev.dma_mask = &da8xx_dmamask; |
515 | musb->dev.coherent_dma_mask = da8xx_dmamask; | 526 | musb->dev.coherent_dma_mask = da8xx_dmamask; |
516 | 527 | ||
517 | glue->dev = &pdev->dev; | 528 | glue->dev = &pdev->dev; |
518 | glue->musb = musb; | 529 | glue->musb = musb; |
530 | glue->clk = clk; | ||
519 | 531 | ||
520 | pdata->platform_ops = &da8xx_ops; | 532 | pdata->platform_ops = &da8xx_ops; |
521 | 533 | ||
@@ -525,23 +537,29 @@ static int __init da8xx_probe(struct platform_device *pdev) | |||
525 | pdev->num_resources); | 537 | pdev->num_resources); |
526 | if (ret) { | 538 | if (ret) { |
527 | dev_err(&pdev->dev, "failed to add resources\n"); | 539 | dev_err(&pdev->dev, "failed to add resources\n"); |
528 | goto err2; | 540 | goto err4; |
529 | } | 541 | } |
530 | 542 | ||
531 | ret = platform_device_add_data(musb, pdata, sizeof(*pdata)); | 543 | ret = platform_device_add_data(musb, pdata, sizeof(*pdata)); |
532 | if (ret) { | 544 | if (ret) { |
533 | dev_err(&pdev->dev, "failed to add platform_data\n"); | 545 | dev_err(&pdev->dev, "failed to add platform_data\n"); |
534 | goto err2; | 546 | goto err4; |
535 | } | 547 | } |
536 | 548 | ||
537 | ret = platform_device_add(musb); | 549 | ret = platform_device_add(musb); |
538 | if (ret) { | 550 | if (ret) { |
539 | dev_err(&pdev->dev, "failed to register musb device\n"); | 551 | dev_err(&pdev->dev, "failed to register musb device\n"); |
540 | goto err2; | 552 | goto err4; |
541 | } | 553 | } |
542 | 554 | ||
543 | return 0; | 555 | return 0; |
544 | 556 | ||
557 | err4: | ||
558 | clk_disable(clk); | ||
559 | |||
560 | err3: | ||
561 | clk_put(clk); | ||
562 | |||
545 | err2: | 563 | err2: |
546 | platform_device_put(musb); | 564 | platform_device_put(musb); |
547 | 565 | ||
@@ -558,6 +576,8 @@ static int __exit da8xx_remove(struct platform_device *pdev) | |||
558 | 576 | ||
559 | platform_device_del(glue->musb); | 577 | platform_device_del(glue->musb); |
560 | platform_device_put(glue->musb); | 578 | platform_device_put(glue->musb); |
579 | clk_disable(glue->clk); | ||
580 | clk_put(glue->clk); | ||
561 | kfree(glue); | 581 | kfree(glue); |
562 | 582 | ||
563 | return 0; | 583 | return 0; |