]> Pileus Git - ~andy/linux/blobdiff - drivers/usb/host/ehci-ps3.c
Merge branch 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/groec...
[~andy/linux] / drivers / usb / host / ehci-ps3.c
index 2dc32da75cfc458edff72ec92d20a43d192e2ee6..a20e496eb479b62698c4a73aca8b95dad47d7ef6 100644 (file)
 #include <asm/firmware.h>
 #include <asm/ps3.h>
 
+static void ps3_ehci_setup_insnreg(struct ehci_hcd *ehci)
+{
+       /* PS3 HC internal setup register offsets. */
+
+       enum ps3_ehci_hc_insnreg {
+               ps3_ehci_hc_insnreg01 = 0x084,
+               ps3_ehci_hc_insnreg02 = 0x088,
+               ps3_ehci_hc_insnreg03 = 0x08c,
+       };
+
+       /* PS3 EHCI HC errata fix 316 - The PS3 EHCI HC will reset its
+        * internal INSNREGXX setup regs back to the chip default values
+        * on Host Controller Reset (CMD_RESET) or Light Host Controller
+        * Reset (CMD_LRESET).  The work-around for this is for the HC
+        * driver to re-initialise these regs when ever the HC is reset.
+        */
+
+       /* Set burst transfer counts to 256 out, 32 in. */
+
+       writel_be(0x01000020, (void __iomem *)ehci->regs +
+               ps3_ehci_hc_insnreg01);
+
+       /* Enable burst transfer counts. */
+
+       writel_be(0x00000001, (void __iomem *)ehci->regs +
+               ps3_ehci_hc_insnreg03);
+}
+
 static int ps3_ehci_hc_reset(struct usb_hcd *hcd)
 {
        int result;
@@ -49,6 +77,8 @@ static int ps3_ehci_hc_reset(struct usb_hcd *hcd)
 
        ehci_reset(ehci);
 
+       ps3_ehci_setup_insnreg(ehci);
+
        return result;
 }