aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnand Gadiyar <gadiyar@ti.com>2011-02-16 05:13:14 -0500
committerFelipe Balbi <balbi@ti.com>2011-03-01 10:00:56 -0500
commit87ecc73b3d74ca70100e7100313c005fa471f177 (patch)
tree18762ed9b092982b196aa0c5681d01cb80e2e1ab
parentc88ba39c1ea6a1591b6842199069ff50748d2073 (diff)
usb: ehci: omap: add support for TLL mode on OMAP4
The EHCI controller in OMAP4 supports a transceiver-less link mode (TLL mode), similar to the one in OMAP3. On the OMAP4 however, there are an additional set of clocks that need to be turned on to get this working. Request and configure these for each port if that port is connected in TLL mode. Signed-off-by: Anand Gadiyar <gadiyar@ti.com> Cc: Greg Kroah-Hartman <gregkh@suse.de> Signed-off-by: Felipe Balbi <balbi@ti.com>
-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 f784ceb862a3..d7e223be1c9c 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) {