[PATCH] QE USB host fix for mpc832x
From: Ben Dubb <hidden>
Date: 2012-08-23 03:54:48
This patch should be used to get QE USB host mode working on mpc832x and mpc8360 based devices. It fixes the following issues: - BRG divisor shall not be an add number greater than 3. - USB param block in multi-user ram can't be accessed at default location on mpc832x device. Allocate it dynamically. These changes have been tested on mpc8360-rdk board as well as mpc8321e based design. On the mpc832x devices, the QE_USB3 microcode patch is required, and has to be loaded early during initialization sequence. These changes are partially based on an earlier patch from Marcel Ziswiler, [PATCH] QE USB Host Integration for MPC832x"<http://lkml.indiana.edu/hypermail/linux/kernel/0904.0/00479.html> -Ben ---- diff -Naur linux-2.6.34.13.orig/arch/powerpc/sysdev/qe_lib/qe.c linux-2.6.34.13.new/arch/powerpc/sysdev/qe_lib/qe.c
--- linux-2.6.34.13.orig/arch/powerpc/sysdev/qe_lib/qe.c 2012-08-2014:45:22.000000000 -0400
+++ linux-2.6.34.13.new/arch/powerpc/sysdev/qe_lib/qe.c 2012-08-2221:51:05.093065082 -0400
@@ -215,8 +215,8 @@ /* Errata QE_General4, which affects some MPC832x and MPC836x SOCs,
says
that the BRG divisor must be even if you're not using
divide-by-16
- mode. */
- if (!div16 && (divisor & 1))
+ mode, and is greater than 3. */
+ if (!div16 && (divisor & 1) && (divisor > 3))
divisor++;
tempval = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) |
diff -Naur linux-2.6.34.13.orig/drivers/usb/host/fhci-hcd.c
linux-2.6.34.13.new/drivers/usb/host/fhci-hcd.c--- linux-2.6.34.13.orig/drivers/usb/host/fhci-hcd.c 2012-08-2014:45:22.000000000 -0400
+++ linux-2.6.34.13.new/drivers/usb/host/fhci-hcd.c 2012-08-2222:39:00.453065145 -0400
@@ -614,15 +614,8 @@ } fhci->regs = hcd->regs; - /* Parameter RAM. */ - iprop = of_get_property(node, "reg", &size); - if (!iprop || size < sizeof(*iprop) * 4) { - dev_err(dev, "can't get pram offset\n"); - ret = -EINVAL; - goto err_pram; - } - - pram_addr = cpm_muram_alloc_fixed(iprop[2], FHCI_PRAM_SIZE); + /* Dynamically allocate USB Parameter RAM. */ + pram_addr = qe_muram_alloc(FHCI_PRAM_SIZE, 64); if (IS_ERR_VALUE(pram_addr)) { dev_err(dev, "failed to allocate usb pram\n"); ret = -ENOMEM;
@@ -630,6 +623,11 @@ } fhci->pram = cpm_muram_addr(pram_addr); + /* On mpc832x devices the usb param base address is outside the 16K
MURAM
+ space, and therefore must be remapped via QE Assign Page
command. */
+ qe_issue_cmd(QE_ASSIGN_PAGE_TO_DEVICE, QE_CR_SUBBLOCK_USB,
+ QE_CR_PROTOCOL_UNSPECIFIED, pi->pram_addr);
+
/* GPIOs and pins */
for (i = 0; i < NUM_GPIOS; i++) {
int gpio;