aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/usb/host/ehci-fsl.c10
-rw-r--r--drivers/usb/host/ehci-q.c9
-rw-r--r--drivers/usb/host/ehci.h15
3 files changed, 33 insertions, 1 deletions
diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c
index c6012d6cd527..59f90f76ee31 100644
--- a/drivers/usb/host/ehci-fsl.c
+++ b/drivers/usb/host/ehci-fsl.c
@@ -198,6 +198,16 @@ static void mpc83xx_usb_setup(struct usb_hcd *hcd)
198 mpc83xx_setup_phy(ehci, pdata->phy_mode, 0); 198 mpc83xx_setup_phy(ehci, pdata->phy_mode, 0);
199 199
200 if (pdata->operating_mode == FSL_USB2_MPH_HOST) { 200 if (pdata->operating_mode == FSL_USB2_MPH_HOST) {
201 unsigned int chip, rev, svr;
202
203 svr = mfspr(SPRN_SVR);
204 chip = svr >> 16;
205 rev = (svr >> 4) & 0xf;
206
207 /* Deal with USB Erratum #14 on MPC834x Rev 1.0 & 1.1 chips */
208 if ((rev == 1) && (chip >= 0x8050) && (chip <= 0x8055))
209 ehci->has_fsl_port_bug = 1;
210
201 if (pdata->port_enables & FSL_USB2_PORT0_ENABLED) 211 if (pdata->port_enables & FSL_USB2_PORT0_ENABLED)
202 mpc83xx_setup_phy(ehci, pdata->phy_mode, 0); 212 mpc83xx_setup_phy(ehci, pdata->phy_mode, 0);
203 if (pdata->port_enables & FSL_USB2_PORT1_ENABLED) 213 if (pdata->port_enables & FSL_USB2_PORT1_ENABLED)
diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c
index 9b13bf2fa98d..6e28e593c044 100644
--- a/drivers/usb/host/ehci-q.c
+++ b/drivers/usb/host/ehci-q.c
@@ -721,7 +721,14 @@ qh_make (
721 info1 |= maxp << 16; 721 info1 |= maxp << 16;
722 722
723 info2 |= (EHCI_TUNE_MULT_TT << 30); 723 info2 |= (EHCI_TUNE_MULT_TT << 30);
724 info2 |= urb->dev->ttport << 23; 724
725 /* Some Freescale processors have an erratum in which the
726 * port number in the queue head was 0..N-1 instead of 1..N.
727 */
728 if (ehci_has_fsl_portno_bug(ehci))
729 info2 |= (urb->dev->ttport-1) << 23;
730 else
731 info2 |= urb->dev->ttport << 23;
725 732
726 /* set the address of the TT; for TDI's integrated 733 /* set the address of the TT; for TDI's integrated
727 * root hub tt, leave it zeroed. 734 * root hub tt, leave it zeroed.
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h
index 86af41c41de1..679c1cdcc915 100644
--- a/drivers/usb/host/ehci.h
+++ b/drivers/usb/host/ehci.h
@@ -88,8 +88,11 @@ struct ehci_hcd { /* one per controller */
88 unsigned long next_statechange; 88 unsigned long next_statechange;
89 u32 command; 89 u32 command;
90 90
91 /* SILICON QUIRKS */
91 unsigned is_tdi_rh_tt:1; /* TDI roothub with TT */ 92 unsigned is_tdi_rh_tt:1; /* TDI roothub with TT */
92 unsigned no_selective_suspend:1; 93 unsigned no_selective_suspend:1;
94 unsigned has_fsl_port_bug:1; /* FreeScale */
95
93 u8 sbrn; /* packed release number */ 96 u8 sbrn; /* packed release number */
94 97
95 /* irq statistics */ 98 /* irq statistics */
@@ -639,6 +642,18 @@ ehci_port_speed(struct ehci_hcd *ehci, unsigned int portsc)
639 642
640/*-------------------------------------------------------------------------*/ 643/*-------------------------------------------------------------------------*/
641 644
645#ifdef CONFIG_PPC_83xx
646/* Some Freescale processors have an erratum in which the TT
647 * port number in the queue head was 0..N-1 instead of 1..N.
648 */
649#define ehci_has_fsl_portno_bug(e) ((e)->has_fsl_port_bug)
650#else
651#define ehci_has_fsl_portno_bug(e) (0)
652#endif
653
654
655/*-------------------------------------------------------------------------*/
656
642#ifndef DEBUG 657#ifndef DEBUG
643#define STUB_DEBUG_FILES 658#define STUB_DEBUG_FILES
644#endif /* DEBUG */ 659#endif /* DEBUG */