diff options
Diffstat (limited to 'drivers/usb/host/ehci-omap.c')
-rw-r--r-- | drivers/usb/host/ehci-omap.c | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c index f784ceb862a..d7e223be1c9 100644 --- a/drivers/usb/host/ehci-omap.c +++ b/drivers/usb/host/ehci-omap.c | |||
@@ -195,7 +195,11 @@ struct ehci_hcd_omap { | |||
195 | struct clk *xclk60mhsp1_ck; | 195 | struct clk *xclk60mhsp1_ck; |
196 | struct clk *xclk60mhsp2_ck; | 196 | struct clk *xclk60mhsp2_ck; |
197 | struct clk *utmi_p1_fck; | 197 | struct clk *utmi_p1_fck; |
198 | struct clk *usbhost_p1_fck; | ||
199 | struct clk *usbtll_p1_fck; | ||
198 | struct clk *utmi_p2_fck; | 200 | struct clk *utmi_p2_fck; |
201 | struct clk *usbhost_p2_fck; | ||
202 | struct clk *usbtll_p2_fck; | ||
199 | 203 | ||
200 | /* FIXME the following two workarounds are | 204 | /* FIXME the following two workarounds are |
201 | * board specific not silicon-specific so these | 205 | * board specific not silicon-specific so these |
@@ -410,6 +414,50 @@ static int omap_start_ehc(struct ehci_hcd_omap *omap, struct usb_hcd *hcd) | |||
410 | } | 414 | } |
411 | break; | 415 | break; |
412 | case EHCI_HCD_OMAP_MODE_TLL: | 416 | case EHCI_HCD_OMAP_MODE_TLL: |
417 | omap->xclk60mhsp1_ck = clk_get(omap->dev, | ||
418 | "init_60m_fclk"); | ||
419 | if (IS_ERR(omap->xclk60mhsp1_ck)) { | ||
420 | ret = PTR_ERR(omap->xclk60mhsp1_ck); | ||
421 | dev_err(omap->dev, | ||
422 | "Unable to get Port1 ULPI clock\n"); | ||
423 | } | ||
424 | |||
425 | omap->utmi_p1_fck = clk_get(omap->dev, | ||
426 | "utmi_p1_gfclk"); | ||
427 | if (IS_ERR(omap->utmi_p1_fck)) { | ||
428 | ret = PTR_ERR(omap->utmi_p1_fck); | ||
429 | dev_err(omap->dev, | ||
430 | "Unable to get utmi_p1_fck\n"); | ||
431 | } | ||
432 | |||
433 | ret = clk_set_parent(omap->utmi_p1_fck, | ||
434 | omap->xclk60mhsp1_ck); | ||
435 | if (ret != 0) { | ||
436 | dev_err(omap->dev, | ||
437 | "Unable to set P1 f-clock\n"); | ||
438 | } | ||
439 | |||
440 | omap->usbhost_p1_fck = clk_get(omap->dev, | ||
441 | "usb_host_hs_utmi_p1_clk"); | ||
442 | if (IS_ERR(omap->usbhost_p1_fck)) { | ||
443 | ret = PTR_ERR(omap->usbhost_p1_fck); | ||
444 | dev_err(omap->dev, | ||
445 | "Unable to get HOST PORT 1 clk\n"); | ||
446 | } else { | ||
447 | clk_enable(omap->usbhost_p1_fck); | ||
448 | } | ||
449 | |||
450 | omap->usbtll_p1_fck = clk_get(omap->dev, | ||
451 | "usb_tll_hs_usb_ch0_clk"); | ||
452 | |||
453 | if (IS_ERR(omap->usbtll_p1_fck)) { | ||
454 | ret = PTR_ERR(omap->usbtll_p1_fck); | ||
455 | dev_err(omap->dev, | ||
456 | "Unable to get TLL CH0 clk\n"); | ||
457 | } else { | ||
458 | clk_enable(omap->usbtll_p1_fck); | ||
459 | } | ||
460 | break; | ||
413 | /* TODO */ | 461 | /* TODO */ |
414 | default: | 462 | default: |
415 | break; | 463 | break; |
@@ -440,6 +488,50 @@ static int omap_start_ehc(struct ehci_hcd_omap *omap, struct usb_hcd *hcd) | |||
440 | } | 488 | } |
441 | break; | 489 | break; |
442 | case EHCI_HCD_OMAP_MODE_TLL: | 490 | case EHCI_HCD_OMAP_MODE_TLL: |
491 | omap->xclk60mhsp2_ck = clk_get(omap->dev, | ||
492 | "init_60m_fclk"); | ||
493 | if (IS_ERR(omap->xclk60mhsp2_ck)) { | ||
494 | ret = PTR_ERR(omap->xclk60mhsp2_ck); | ||
495 | dev_err(omap->dev, | ||
496 | "Unable to get Port2 ULPI clock\n"); | ||
497 | } | ||
498 | |||
499 | omap->utmi_p2_fck = clk_get(omap->dev, | ||
500 | "utmi_p2_gfclk"); | ||
501 | if (IS_ERR(omap->utmi_p2_fck)) { | ||
502 | ret = PTR_ERR(omap->utmi_p2_fck); | ||
503 | dev_err(omap->dev, | ||
504 | "Unable to get utmi_p2_fck\n"); | ||
505 | } | ||
506 | |||
507 | ret = clk_set_parent(omap->utmi_p2_fck, | ||
508 | omap->xclk60mhsp2_ck); | ||
509 | if (ret != 0) { | ||
510 | dev_err(omap->dev, | ||
511 | "Unable to set P2 f-clock\n"); | ||
512 | } | ||
513 | |||
514 | omap->usbhost_p2_fck = clk_get(omap->dev, | ||
515 | "usb_host_hs_utmi_p2_clk"); | ||
516 | if (IS_ERR(omap->usbhost_p2_fck)) { | ||
517 | ret = PTR_ERR(omap->usbhost_p2_fck); | ||
518 | dev_err(omap->dev, | ||
519 | "Unable to get HOST PORT 2 clk\n"); | ||
520 | } else { | ||
521 | clk_enable(omap->usbhost_p2_fck); | ||
522 | } | ||
523 | |||
524 | omap->usbtll_p2_fck = clk_get(omap->dev, | ||
525 | "usb_tll_hs_usb_ch1_clk"); | ||
526 | |||
527 | if (IS_ERR(omap->usbtll_p2_fck)) { | ||
528 | ret = PTR_ERR(omap->usbtll_p2_fck); | ||
529 | dev_err(omap->dev, | ||
530 | "Unable to get TLL CH1 clk\n"); | ||
531 | } else { | ||
532 | clk_enable(omap->usbtll_p2_fck); | ||
533 | } | ||
534 | break; | ||
443 | /* TODO */ | 535 | /* TODO */ |
444 | default: | 536 | default: |
445 | break; | 537 | break; |
@@ -602,6 +694,24 @@ static int omap_start_ehc(struct ehci_hcd_omap *omap, struct usb_hcd *hcd) | |||
602 | return 0; | 694 | return 0; |
603 | 695 | ||
604 | err_sys_status: | 696 | err_sys_status: |
697 | |||
698 | if (omap->usbtll_p2_fck != NULL) { | ||
699 | clk_disable(omap->usbtll_p2_fck); | ||
700 | clk_put(omap->usbtll_p2_fck); | ||
701 | } | ||
702 | if (omap->usbhost_p2_fck != NULL) { | ||
703 | clk_disable(omap->usbhost_p2_fck); | ||
704 | clk_put(omap->usbhost_p2_fck); | ||
705 | } | ||
706 | if (omap->usbtll_p1_fck != NULL) { | ||
707 | clk_disable(omap->usbtll_p1_fck); | ||
708 | clk_put(omap->usbtll_p1_fck); | ||
709 | } | ||
710 | if (omap->usbhost_p1_fck != NULL) { | ||
711 | clk_disable(omap->usbhost_p1_fck); | ||
712 | clk_put(omap->usbhost_p1_fck); | ||
713 | } | ||
714 | |||
605 | clk_disable(omap->utmi_p2_fck); | 715 | clk_disable(omap->utmi_p2_fck); |
606 | clk_put(omap->utmi_p2_fck); | 716 | clk_put(omap->utmi_p2_fck); |
607 | clk_disable(omap->xclk60mhsp2_ck); | 717 | clk_disable(omap->xclk60mhsp2_ck); |
@@ -740,6 +850,30 @@ static void omap_stop_ehc(struct ehci_hcd_omap *omap, struct usb_hcd *hcd) | |||
740 | clk_put(omap->utmi_p2_fck); | 850 | clk_put(omap->utmi_p2_fck); |
741 | omap->utmi_p2_fck = NULL; | 851 | omap->utmi_p2_fck = NULL; |
742 | } | 852 | } |
853 | |||
854 | if (omap->usbtll_p2_fck != NULL) { | ||
855 | clk_disable(omap->usbtll_p2_fck); | ||
856 | clk_put(omap->usbtll_p2_fck); | ||
857 | omap->usbtll_p2_fck = NULL; | ||
858 | } | ||
859 | |||
860 | if (omap->usbhost_p2_fck != NULL) { | ||
861 | clk_disable(omap->usbhost_p2_fck); | ||
862 | clk_put(omap->usbhost_p2_fck); | ||
863 | omap->usbhost_p2_fck = NULL; | ||
864 | } | ||
865 | |||
866 | if (omap->usbtll_p1_fck != NULL) { | ||
867 | clk_disable(omap->usbtll_p1_fck); | ||
868 | clk_put(omap->usbtll_p1_fck); | ||
869 | omap->usbtll_p1_fck = NULL; | ||
870 | } | ||
871 | |||
872 | if (omap->usbhost_p1_fck != NULL) { | ||
873 | clk_disable(omap->usbhost_p1_fck); | ||
874 | clk_put(omap->usbhost_p1_fck); | ||
875 | omap->usbhost_p1_fck = NULL; | ||
876 | } | ||
743 | } | 877 | } |
744 | 878 | ||
745 | if (omap->phy_reset) { | 879 | if (omap->phy_reset) { |