brcm47xx: update usb driver for brcm47xx.
[openwrt.git] / target / linux / brcm47xx / patches-3.2 / 183-bcma-scan-for-extra-address-space.patch
1 From adebff2358c2b631fc04e31ba87eee48e546c655 Mon Sep 17 00:00:00 2001
2 From: Hauke Mehrtens <hauke@hauke-m.de>
3 Date: Sun, 20 Nov 2011 18:22:35 +0100
4 Subject: [PATCH 183/186] bcma: scan for extra address space
5
6 Some cores like the USB core have two address spaces. In the USB host
7 controller one address space is used for the OHCI and the other for the
8 EHCI controller interface. The USB controller is the only core I found
9 with two address spaces. This code is based on the AI scan function
10 ai_scan() in shared/aiutils.c i the Broadcom SDK.
11
12 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
13 ---
14  drivers/bcma/scan.c       |   18 +++++++++++++++++-
15  include/linux/bcma/bcma.h |    1 +
16  2 files changed, 18 insertions(+), 1 deletions(-)
17
18 --- a/drivers/bcma/scan.c
19 +++ b/drivers/bcma/scan.c
20 @@ -297,6 +297,22 @@ static int bcma_get_next_core(struct bcm
21                         return -EILSEQ;
22         }
23  
24 +
25 +       /* First Slave Address Descriptor should be port 0:
26 +        * the main register space for the core
27 +        */
28 +       tmp = bcma_erom_get_addr_desc(bus, eromptr, SCAN_ADDR_TYPE_SLAVE, 0);
29 +       if (tmp <= 0) {
30 +               /* Try again to see if it is a bridge */
31 +               tmp = bcma_erom_get_addr_desc(bus, eromptr,
32 +                                             SCAN_ADDR_TYPE_BRIDGE, 0);
33 +               if (tmp > 0) {
34 +                       pr_info("found bridge");
35 +                       return -ENXIO;
36 +               }
37 +       }
38 +       core->addr = tmp;
39 +
40         /* get & parse slave ports */
41         for (i = 0; i < ports[1]; i++) {
42                 for (j = 0; ; j++) {
43 @@ -309,7 +325,7 @@ static int bcma_get_next_core(struct bcm
44                                 break;
45                         } else {
46                                 if (i == 0 && j == 0)
47 -                                       core->addr = tmp;
48 +                                       core->addr1 = tmp;
49                         }
50                 }
51         }
52 --- a/include/linux/bcma/bcma.h
53 +++ b/include/linux/bcma/bcma.h
54 @@ -139,6 +139,7 @@ struct bcma_device {
55         u8 core_unit;
56  
57         u32 addr;
58 +       u32 addr1;
59         u32 wrap;
60  
61         void __iomem *io_addr;