aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKumar Gala <galak@gate.crashing.org>2006-01-20 16:57:52 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2006-03-20 17:49:55 -0500
commit8cd42e97bf451bbbb2f54dc571366ae5a72faaea (patch)
tree9bd591f62813e477da3484bfe159228a7507eeb7
parent80cb9aee01245b38325dd84f1359b14a3f01f10d (diff)
[PATCH] USB: EHCI and Freescale 83xx quirk
On the MPC834x processors the multiport host (MPH) EHCI controller has an erratum in which the port number in the queue head expects to be 0..N-1 instead of 1..N. If we are on one of these chips we subtract one from the port number before putting it into the queue head. Signed-off-by: Kumar Gala <galak@kernel.crashing.org> Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-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 */