USB: EHCI: make ehci_read_frame_index platform independent
authorAlan Stern <stern@rowland.harvard.edu>
Wed, 10 Oct 2012 19:07:39 +0000 (15:07 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 24 Oct 2012 21:45:17 +0000 (14:45 -0700)
In preparation for splitting the ehci-hcd driver into a core library
and separate platform-specific driver modules, this patch (as1617)
changes the way ehci_read_frame_index() is handled.

Since the same core library will have to work with both PCI and
non-PCI platforms, the quirk handler routine will be compiled
unconditionally.  The decision about whether to call it or simply to
read the frame index register is made at run time, based on whether
the frame_index_bug quirk flag is set.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Acked-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/ehci-hcd.c
drivers/usb/host/ehci-sched.c
drivers/usb/host/ehci.h

index 28fb5ddaf7864ab825675d73dc52d91ba8718c92..9c2afb516fe5b37e372a97d3f6c01bdc140b78cc 100644 (file)
@@ -118,9 +118,34 @@ MODULE_PARM_DESC(hird, "host initiated resume duration, +1 for each 75us");
 /*-------------------------------------------------------------------------*/
 
 #include "ehci.h"
-#include "ehci-dbg.c"
 #include "pci-quirks.h"
 
+/*
+ * The MosChip MCS9990 controller updates its microframe counter
+ * a little before the frame counter, and occasionally we will read
+ * the invalid intermediate value.  Avoid problems by checking the
+ * microframe number (the low-order 3 bits); if they are 0 then
+ * re-read the register to get the correct value.
+ */
+static unsigned ehci_moschip_read_frame_index(struct ehci_hcd *ehci)
+{
+       unsigned uf;
+
+       uf = ehci_readl(ehci, &ehci->regs->frame_index);
+       if (unlikely((uf & 7) == 0))
+               uf = ehci_readl(ehci, &ehci->regs->frame_index);
+       return uf;
+}
+
+static inline unsigned ehci_read_frame_index(struct ehci_hcd *ehci)
+{
+       if (ehci->frame_index_bug)
+               return ehci_moschip_read_frame_index(ehci);
+       return ehci_readl(ehci, &ehci->regs->frame_index);
+}
+
+#include "ehci-dbg.c"
+
 /*-------------------------------------------------------------------------*/
 
 /*
index b538a4d62d5ee89ff83f2f3554d86461652d5fb6..2e14714b359fa6b123f133af5d7133393c205895 100644 (file)
 
 static int ehci_get_frame (struct usb_hcd *hcd);
 
-#ifdef CONFIG_PCI
-
-static unsigned ehci_read_frame_index(struct ehci_hcd *ehci)
-{
-       unsigned uf;
-
-       /*
-        * The MosChip MCS9990 controller updates its microframe counter
-        * a little before the frame counter, and occasionally we will read
-        * the invalid intermediate value.  Avoid problems by checking the
-        * microframe number (the low-order 3 bits); if they are 0 then
-        * re-read the register to get the correct value.
-        */
-       uf = ehci_readl(ehci, &ehci->regs->frame_index);
-       if (unlikely(ehci->frame_index_bug && ((uf & 7) == 0)))
-               uf = ehci_readl(ehci, &ehci->regs->frame_index);
-       return uf;
-}
-
-#endif
-
-/*-------------------------------------------------------------------------*/
-
 /*
  * periodic_next_shadow - return "next" pointer on shadow list
  * @periodic: host pointer to qh/itd/sitd
index 9b8cbb4b3e2caf1b35eb81885f7314d6c330bb67..ec948c3b1cea6faba93862fc33fe3c6f5234d800 100644 (file)
@@ -776,22 +776,6 @@ static inline u32 hc32_to_cpup (const struct ehci_hcd *ehci, const __hc32 *x)
        static inline void ehci_vdbg(struct ehci_hcd *ehci, ...) {}
 #endif
 
-#ifdef CONFIG_PCI
-
-/* For working around the MosChip frame-index-register bug */
-static unsigned ehci_read_frame_index(struct ehci_hcd *ehci);
-
-#else
-
-static inline unsigned ehci_read_frame_index(struct ehci_hcd *ehci)
-{
-       return ehci_readl(ehci, &ehci->regs->frame_index);
-}
-
-#endif
-
-/*-------------------------------------------------------------------------*/
-
 #ifndef DEBUG
 #define STUB_DEBUG_FILES
 #endif /* DEBUG */