brcm47xx: add new usb driver for bcma bus and replace ssb usb driver.
[openwrt/svn-archive/archive.git] / target / linux / brcm47xx / patches-3.0 / 0028-bcma-scan-for-extra-address-space.patch
diff --git a/target/linux/brcm47xx/patches-3.0/0028-bcma-scan-for-extra-address-space.patch b/target/linux/brcm47xx/patches-3.0/0028-bcma-scan-for-extra-address-space.patch
new file mode 100644 (file)
index 0000000..d74dfcb
--- /dev/null
@@ -0,0 +1,60 @@
+From 1735daf1db79d338dccfc55444b52ed52af79e86 Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke@hauke-m.de>
+Date: Sun, 20 Nov 2011 18:22:35 +0100
+Subject: [PATCH 15/21] bcma: scan for extra address space
+
+Some cores like the USB core have two address spaces. In the USB host
+controller one address space is used for the OHCI and the other for the
+EHCI controller interface. The USB controller is the only core I found
+with two address spaces. This code is based on the AI scan function
+ai_scan() in shared/aiutils.c i the Broadcom SDK.
+
+Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+---
+ drivers/bcma/scan.c       |   17 ++++++++++++++++-
+ include/linux/bcma/bcma.h |    1 +
+ 2 files changed, 17 insertions(+), 1 deletions(-)
+
+--- a/drivers/bcma/scan.c
++++ b/drivers/bcma/scan.c
+@@ -286,6 +286,21 @@ static int bcma_get_next_core(struct bcm
+                       return -EILSEQ;
+       }
++
++      /* First Slave Address Descriptor should be port 0:
++       * the main register space for the core
++       */
++      tmp = bcma_erom_get_addr_desc(bus, eromptr, SCAN_ADDR_TYPE_SLAVE, 0);
++      if (tmp < 0) {
++              /* Try again to see if it is a bridge */
++              tmp = bcma_erom_get_addr_desc(bus, eromptr, SCAN_ADDR_TYPE_BRIDGE, 0);
++              if (tmp) {
++                      printk("found bridge\n");
++              }
++
++      }
++      core->addr = tmp;
++
+       /* get & parse slave ports */
+       for (i = 0; i < ports[1]; i++) {
+               for (j = 0; ; j++) {
+@@ -298,7 +313,7 @@ static int bcma_get_next_core(struct bcm
+                               break;
+                       } else {
+                               if (i == 0 && j == 0)
+-                                      core->addr = tmp;
++                                      core->addr1 = tmp;
+                       }
+               }
+       }
+--- a/include/linux/bcma/bcma.h
++++ b/include/linux/bcma/bcma.h
+@@ -138,6 +138,7 @@ struct bcma_device {
+       u8 core_index;
+       u32 addr;
++      u32 addr1;
+       u32 wrap;
+       void __iomem *io_addr;