aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/usb/host/ehci-omap.c134
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
604err_sys_status: 696err_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) {