Changeset 41804


Ignore:
Timestamp:
2014-07-22T23:40:41+02:00 (4 years ago)
Author:
hauke
Message:

kernel: update bcma and ssb to version master-2014-07-22

This is a backport of bcma and ssb from wireless-tesing/master tag
master-2014-07-22.

Signed-off-by: Hauke Mehrtens <hauke@…>

Location:
trunk/target/linux
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/bcm53xx/patches-3.10/111-bcma-register-bcma-as-device-tree-driver.patch

    r39466 r41804  
    105105--- a/include/linux/bcma/bcma.h 
    106106+++ b/include/linux/bcma/bcma.h 
    107 @@ -319,6 +319,8 @@ struct bcma_bus { 
     107@@ -322,6 +322,8 @@ struct bcma_bus { 
    108108                struct pci_dev *host_pci; 
    109109                /* Pointer to the SDIO device (only for BCMA_HOSTTYPE_SDIO) */ 
  • trunk/target/linux/bcm53xx/patches-3.10/112-bcma-get-irqs-from-dt.patch

    r39466 r41804  
    5858 { 
    5959        struct bcma_device *core; 
    60 @@ -145,7 +179,13 @@ static int bcma_register_cores(struct bc 
     60@@ -146,7 +180,13 @@ static int bcma_register_cores(struct bc 
    6161                        break; 
    6262                case BCMA_HOSTTYPE_SOC: 
  • trunk/target/linux/bcm53xx/patches-3.14/120-bcma-register-bcma-as-device-tree-driver.patch

    r40880 r41804  
    105105--- a/include/linux/bcma/bcma.h 
    106106+++ b/include/linux/bcma/bcma.h 
    107 @@ -319,6 +319,8 @@ struct bcma_bus { 
     107@@ -322,6 +322,8 @@ struct bcma_bus { 
    108108                struct pci_dev *host_pci; 
    109109                /* Pointer to the SDIO device (only for BCMA_HOSTTYPE_SDIO) */ 
  • trunk/target/linux/bcm53xx/patches-3.14/121-bcma-get-irqs-from-dt.patch

    r40880 r41804  
    6060 { 
    6161        struct bcma_device *core; 
    62 @@ -154,7 +188,13 @@ static int bcma_register_cores(struct bc 
     62@@ -155,7 +189,13 @@ static int bcma_register_cores(struct bc 
    6363                        break; 
    6464                case BCMA_HOSTTYPE_SOC: 
  • trunk/target/linux/bcm53xx/patches-3.14/123-bcma-get-sprom-from-devicetree.patch

    r40880 r41804  
    7171                                         struct ssb_sprom *out) 
    7272 { 
    73 @@ -553,7 +595,14 @@ int bcma_sprom_get(struct bcma_bus *bus) 
     73@@ -579,7 +621,14 @@ int bcma_sprom_get(struct bcma_bus *bus) 
    7474        u16 *sprom; 
    7575        size_t sprom_sizes[] = { SSB_SPROMSIZE_WORDS_R4, 
  • trunk/target/linux/bcm53xx/patches-3.14/141-bcma-store-more-alternative-addresses.patch

    r40880 r41804  
    6161--- a/include/linux/bcma/bcma.h 
    6262+++ b/include/linux/bcma/bcma.h 
    63 @@ -263,7 +263,7 @@ struct bcma_device { 
     63@@ -266,7 +266,7 @@ struct bcma_device { 
    6464        u8 core_unit; 
    6565  
  • trunk/target/linux/bcm53xx/patches-3.14/142-bcma-add-support-for-chipcommon-B-core.patch

    r40880 r41804  
    113113                case BCMA_CORE_PCI: 
    114114                case BCMA_CORE_PCIE: 
    115                 case BCMA_CORE_MIPS_74K: 
    116 @@ -300,6 +301,13 @@ int bcma_bus_register(struct bcma_bus *b 
     115                case BCMA_CORE_PCIE2: 
     116@@ -301,6 +302,13 @@ int bcma_bus_register(struct bcma_bus *b 
    117117                bcma_core_chipcommon_init(&bus->drv_cc); 
    118118        } 
     
    128128        core = bcma_find_core(bus, BCMA_CORE_MIPS_74K); 
    129129        if (core) { 
    130 @@ -347,6 +355,8 @@ void bcma_bus_unregister(struct bcma_bus 
     130@@ -355,6 +363,8 @@ void bcma_bus_unregister(struct bcma_bus 
    131131        else if (err) 
    132132                bcma_err(bus, "Can not unregister GPIO driver: %i\n", err); 
     
    149149--- a/include/linux/bcma/bcma.h 
    150150+++ b/include/linux/bcma/bcma.h 
    151 @@ -334,6 +334,7 @@ struct bcma_bus { 
     151@@ -337,6 +337,7 @@ struct bcma_bus { 
    152152        u8 num; 
    153153  
     
    155155+       struct bcma_drv_cc_b drv_cc_b; 
    156156        struct bcma_drv_pci drv_pci[2]; 
     157        struct bcma_drv_pcie2 drv_pcie2; 
    157158        struct bcma_drv_mips drv_mips; 
    158         struct bcma_drv_gmac_cmn drv_gmac_cmn; 
    159159--- a/include/linux/bcma/bcma_driver_chipcommon.h 
    160160+++ b/include/linux/bcma/bcma_driver_chipcommon.h 
  • trunk/target/linux/bcm53xx/patches-3.14/160-bcma-add-PCI-IDs-for-more-devices.patch

    r40880 r41804  
    1414--- a/drivers/bcma/host_pci.c 
    1515+++ b/drivers/bcma/host_pci.c 
    16 @@ -280,6 +280,8 @@ static const struct pci_device_id bcma_p 
    17         { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4359) }, 
     16@@ -281,6 +281,8 @@ static const struct pci_device_id bcma_p 
    1817        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4365) }, 
     18        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43a9) }, 
    1919        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4727) }, 
    2020+       { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 43227) }, 
  • trunk/target/linux/generic/patches-3.10/020-ssb_update.patch

    r41352 r41804  
    560560        if (err) { 
    561561                ssb_bus_may_powerdown(bus); 
     562--- a/drivers/ssb/pci.c 
     563+++ b/drivers/ssb/pci.c 
     564@@ -326,13 +326,13 @@ err_ctlreg: 
     565        return err; 
     566 } 
     567  
     568-static s8 r123_extract_antgain(u8 sprom_revision, const u16 *in, 
     569-                              u16 mask, u16 shift) 
     570+static s8 sprom_extract_antgain(u8 sprom_revision, const u16 *in, u16 offset, 
     571+                               u16 mask, u16 shift) 
     572 { 
     573        u16 v; 
     574        u8 gain; 
     575  
     576-       v = in[SPOFF(SSB_SPROM1_AGAIN)]; 
     577+       v = in[SPOFF(offset)]; 
     578        gain = (v & mask) >> shift; 
     579        if (gain == 0xFF) 
     580                gain = 2; /* If unset use 2dBm */ 
     581@@ -416,12 +416,14 @@ static void sprom_extract_r123(struct ss 
     582        SPEX(alpha2[1], SSB_SPROM1_CCODE, 0x00ff, 0); 
     583  
     584        /* Extract the antenna gain values. */ 
     585-       out->antenna_gain.a0 = r123_extract_antgain(out->revision, in, 
     586-                                                   SSB_SPROM1_AGAIN_BG, 
     587-                                                   SSB_SPROM1_AGAIN_BG_SHIFT); 
     588-       out->antenna_gain.a1 = r123_extract_antgain(out->revision, in, 
     589-                                                   SSB_SPROM1_AGAIN_A, 
     590-                                                   SSB_SPROM1_AGAIN_A_SHIFT); 
     591+       out->antenna_gain.a0 = sprom_extract_antgain(out->revision, in, 
     592+                                                    SSB_SPROM1_AGAIN, 
     593+                                                    SSB_SPROM1_AGAIN_BG, 
     594+                                                    SSB_SPROM1_AGAIN_BG_SHIFT); 
     595+       out->antenna_gain.a1 = sprom_extract_antgain(out->revision, in, 
     596+                                                    SSB_SPROM1_AGAIN, 
     597+                                                    SSB_SPROM1_AGAIN_A, 
     598+                                                    SSB_SPROM1_AGAIN_A_SHIFT); 
     599        if (out->revision >= 2) 
     600                sprom_extract_r23(out, in); 
     601 } 
     602@@ -468,7 +470,15 @@ static void sprom_extract_r458(struct ss 
     603  
     604 static void sprom_extract_r45(struct ssb_sprom *out, const u16 *in) 
     605 { 
     606+       static const u16 pwr_info_offset[] = { 
     607+               SSB_SPROM4_PWR_INFO_CORE0, SSB_SPROM4_PWR_INFO_CORE1, 
     608+               SSB_SPROM4_PWR_INFO_CORE2, SSB_SPROM4_PWR_INFO_CORE3 
     609+       }; 
     610        u16 il0mac_offset; 
     611+       int i; 
     612+ 
     613+       BUILD_BUG_ON(ARRAY_SIZE(pwr_info_offset) != 
     614+                    ARRAY_SIZE(out->core_pwr_info)); 
     615  
     616        if (out->revision == 4) 
     617                il0mac_offset = SSB_SPROM4_IL0MAC; 
     618@@ -524,14 +534,59 @@ static void sprom_extract_r45(struct ssb 
     619        } 
     620  
     621        /* Extract the antenna gain values. */ 
     622-       SPEX(antenna_gain.a0, SSB_SPROM4_AGAIN01, 
     623-            SSB_SPROM4_AGAIN0, SSB_SPROM4_AGAIN0_SHIFT); 
     624-       SPEX(antenna_gain.a1, SSB_SPROM4_AGAIN01, 
     625-            SSB_SPROM4_AGAIN1, SSB_SPROM4_AGAIN1_SHIFT); 
     626-       SPEX(antenna_gain.a2, SSB_SPROM4_AGAIN23, 
     627-            SSB_SPROM4_AGAIN2, SSB_SPROM4_AGAIN2_SHIFT); 
     628-       SPEX(antenna_gain.a3, SSB_SPROM4_AGAIN23, 
     629-            SSB_SPROM4_AGAIN3, SSB_SPROM4_AGAIN3_SHIFT); 
     630+       out->antenna_gain.a0 = sprom_extract_antgain(out->revision, in, 
     631+                                                    SSB_SPROM4_AGAIN01, 
     632+                                                    SSB_SPROM4_AGAIN0, 
     633+                                                    SSB_SPROM4_AGAIN0_SHIFT); 
     634+       out->antenna_gain.a1 = sprom_extract_antgain(out->revision, in, 
     635+                                                    SSB_SPROM4_AGAIN01, 
     636+                                                    SSB_SPROM4_AGAIN1, 
     637+                                                    SSB_SPROM4_AGAIN1_SHIFT); 
     638+       out->antenna_gain.a2 = sprom_extract_antgain(out->revision, in, 
     639+                                                    SSB_SPROM4_AGAIN23, 
     640+                                                    SSB_SPROM4_AGAIN2, 
     641+                                                    SSB_SPROM4_AGAIN2_SHIFT); 
     642+       out->antenna_gain.a3 = sprom_extract_antgain(out->revision, in, 
     643+                                                    SSB_SPROM4_AGAIN23, 
     644+                                                    SSB_SPROM4_AGAIN3, 
     645+                                                    SSB_SPROM4_AGAIN3_SHIFT); 
     646+ 
     647+       /* Extract cores power info info */ 
     648+       for (i = 0; i < ARRAY_SIZE(pwr_info_offset); i++) { 
     649+               u16 o = pwr_info_offset[i]; 
     650+ 
     651+               SPEX(core_pwr_info[i].itssi_2g, o + SSB_SPROM4_2G_MAXP_ITSSI, 
     652+                       SSB_SPROM4_2G_ITSSI, SSB_SPROM4_2G_ITSSI_SHIFT); 
     653+               SPEX(core_pwr_info[i].maxpwr_2g, o + SSB_SPROM4_2G_MAXP_ITSSI, 
     654+                       SSB_SPROM4_2G_MAXP, 0); 
     655+ 
     656+               SPEX(core_pwr_info[i].pa_2g[0], o + SSB_SPROM4_2G_PA_0, ~0, 0); 
     657+               SPEX(core_pwr_info[i].pa_2g[1], o + SSB_SPROM4_2G_PA_1, ~0, 0); 
     658+               SPEX(core_pwr_info[i].pa_2g[2], o + SSB_SPROM4_2G_PA_2, ~0, 0); 
     659+               SPEX(core_pwr_info[i].pa_2g[3], o + SSB_SPROM4_2G_PA_3, ~0, 0); 
     660+ 
     661+               SPEX(core_pwr_info[i].itssi_5g, o + SSB_SPROM4_5G_MAXP_ITSSI, 
     662+                       SSB_SPROM4_5G_ITSSI, SSB_SPROM4_5G_ITSSI_SHIFT); 
     663+               SPEX(core_pwr_info[i].maxpwr_5g, o + SSB_SPROM4_5G_MAXP_ITSSI, 
     664+                       SSB_SPROM4_5G_MAXP, 0); 
     665+               SPEX(core_pwr_info[i].maxpwr_5gh, o + SSB_SPROM4_5GHL_MAXP, 
     666+                       SSB_SPROM4_5GH_MAXP, 0); 
     667+               SPEX(core_pwr_info[i].maxpwr_5gl, o + SSB_SPROM4_5GHL_MAXP, 
     668+                       SSB_SPROM4_5GL_MAXP, SSB_SPROM4_5GL_MAXP_SHIFT); 
     669+ 
     670+               SPEX(core_pwr_info[i].pa_5gl[0], o + SSB_SPROM4_5GL_PA_0, ~0, 0); 
     671+               SPEX(core_pwr_info[i].pa_5gl[1], o + SSB_SPROM4_5GL_PA_1, ~0, 0); 
     672+               SPEX(core_pwr_info[i].pa_5gl[2], o + SSB_SPROM4_5GL_PA_2, ~0, 0); 
     673+               SPEX(core_pwr_info[i].pa_5gl[3], o + SSB_SPROM4_5GL_PA_3, ~0, 0); 
     674+               SPEX(core_pwr_info[i].pa_5g[0], o + SSB_SPROM4_5G_PA_0, ~0, 0); 
     675+               SPEX(core_pwr_info[i].pa_5g[1], o + SSB_SPROM4_5G_PA_1, ~0, 0); 
     676+               SPEX(core_pwr_info[i].pa_5g[2], o + SSB_SPROM4_5G_PA_2, ~0, 0); 
     677+               SPEX(core_pwr_info[i].pa_5g[3], o + SSB_SPROM4_5G_PA_3, ~0, 0); 
     678+               SPEX(core_pwr_info[i].pa_5gh[0], o + SSB_SPROM4_5GH_PA_0, ~0, 0); 
     679+               SPEX(core_pwr_info[i].pa_5gh[1], o + SSB_SPROM4_5GH_PA_1, ~0, 0); 
     680+               SPEX(core_pwr_info[i].pa_5gh[2], o + SSB_SPROM4_5GH_PA_2, ~0, 0); 
     681+               SPEX(core_pwr_info[i].pa_5gh[3], o + SSB_SPROM4_5GH_PA_3, ~0, 0); 
     682+       } 
     683  
     684        sprom_extract_r458(out, in); 
     685  
     686@@ -621,14 +676,22 @@ static void sprom_extract_r8(struct ssb_ 
     687        SPEX32(ofdm5ghpo, SSB_SPROM8_OFDM5GHPO, 0xFFFFFFFF, 0); 
     688  
     689        /* Extract the antenna gain values. */ 
     690-       SPEX(antenna_gain.a0, SSB_SPROM8_AGAIN01, 
     691-            SSB_SPROM8_AGAIN0, SSB_SPROM8_AGAIN0_SHIFT); 
     692-       SPEX(antenna_gain.a1, SSB_SPROM8_AGAIN01, 
     693-            SSB_SPROM8_AGAIN1, SSB_SPROM8_AGAIN1_SHIFT); 
     694-       SPEX(antenna_gain.a2, SSB_SPROM8_AGAIN23, 
     695-            SSB_SPROM8_AGAIN2, SSB_SPROM8_AGAIN2_SHIFT); 
     696-       SPEX(antenna_gain.a3, SSB_SPROM8_AGAIN23, 
     697-            SSB_SPROM8_AGAIN3, SSB_SPROM8_AGAIN3_SHIFT); 
     698+       out->antenna_gain.a0 = sprom_extract_antgain(out->revision, in, 
     699+                                                    SSB_SPROM8_AGAIN01, 
     700+                                                    SSB_SPROM8_AGAIN0, 
     701+                                                    SSB_SPROM8_AGAIN0_SHIFT); 
     702+       out->antenna_gain.a1 = sprom_extract_antgain(out->revision, in, 
     703+                                                    SSB_SPROM8_AGAIN01, 
     704+                                                    SSB_SPROM8_AGAIN1, 
     705+                                                    SSB_SPROM8_AGAIN1_SHIFT); 
     706+       out->antenna_gain.a2 = sprom_extract_antgain(out->revision, in, 
     707+                                                    SSB_SPROM8_AGAIN23, 
     708+                                                    SSB_SPROM8_AGAIN2, 
     709+                                                    SSB_SPROM8_AGAIN2_SHIFT); 
     710+       out->antenna_gain.a3 = sprom_extract_antgain(out->revision, in, 
     711+                                                    SSB_SPROM8_AGAIN23, 
     712+                                                    SSB_SPROM8_AGAIN3, 
     713+                                                    SSB_SPROM8_AGAIN3_SHIFT); 
     714  
     715        /* Extract cores power info info */ 
     716        for (i = 0; i < ARRAY_SIZE(pwr_info_offset); i++) { 
    562717--- a/drivers/ssb/pcihost_wrapper.c 
    563718+++ b/drivers/ssb/pcihost_wrapper.c 
     
    684839 #define SSB_SPROM_BASE31               0x0800 
    685840 #define SSB_SPROM_REVISION             0x007E 
     841@@ -344,6 +345,43 @@ 
     842 #define  SSB_SPROM4_TXPID5GH2_SHIFT    0 
     843 #define  SSB_SPROM4_TXPID5GH3          0xFF00 
     844 #define  SSB_SPROM4_TXPID5GH3_SHIFT    8 
     845+ 
     846+/* There are 4 blocks with power info sharing the same layout */ 
     847+#define SSB_SPROM4_PWR_INFO_CORE0      0x0080 
     848+#define SSB_SPROM4_PWR_INFO_CORE1      0x00AE 
     849+#define SSB_SPROM4_PWR_INFO_CORE2      0x00DC 
     850+#define SSB_SPROM4_PWR_INFO_CORE3      0x010A 
     851+ 
     852+#define SSB_SPROM4_2G_MAXP_ITSSI       0x00    /* 2 GHz ITSSI and 2 GHz Max Power */ 
     853+#define  SSB_SPROM4_2G_MAXP            0x00FF 
     854+#define  SSB_SPROM4_2G_ITSSI           0xFF00 
     855+#define  SSB_SPROM4_2G_ITSSI_SHIFT     8 
     856+#define SSB_SPROM4_2G_PA_0             0x02    /* 2 GHz power amp */ 
     857+#define SSB_SPROM4_2G_PA_1             0x04 
     858+#define SSB_SPROM4_2G_PA_2             0x06 
     859+#define SSB_SPROM4_2G_PA_3             0x08 
     860+#define SSB_SPROM4_5G_MAXP_ITSSI       0x0A    /* 5 GHz ITSSI and 5.3 GHz Max Power */ 
     861+#define  SSB_SPROM4_5G_MAXP            0x00FF 
     862+#define  SSB_SPROM4_5G_ITSSI           0xFF00 
     863+#define  SSB_SPROM4_5G_ITSSI_SHIFT     8 
     864+#define SSB_SPROM4_5GHL_MAXP           0x0C    /* 5.2 GHz and 5.8 GHz Max Power */ 
     865+#define  SSB_SPROM4_5GH_MAXP           0x00FF 
     866+#define  SSB_SPROM4_5GL_MAXP           0xFF00 
     867+#define  SSB_SPROM4_5GL_MAXP_SHIFT     8 
     868+#define SSB_SPROM4_5G_PA_0             0x0E    /* 5.3 GHz power amp */ 
     869+#define SSB_SPROM4_5G_PA_1             0x10 
     870+#define SSB_SPROM4_5G_PA_2             0x12 
     871+#define SSB_SPROM4_5G_PA_3             0x14 
     872+#define SSB_SPROM4_5GL_PA_0            0x16    /* 5.2 GHz power amp */ 
     873+#define SSB_SPROM4_5GL_PA_1            0x18 
     874+#define SSB_SPROM4_5GL_PA_2            0x1A 
     875+#define SSB_SPROM4_5GL_PA_3            0x1C 
     876+#define SSB_SPROM4_5GH_PA_0            0x1E    /* 5.8 GHz power amp */ 
     877+#define SSB_SPROM4_5GH_PA_1            0x20 
     878+#define SSB_SPROM4_5GH_PA_2            0x22 
     879+#define SSB_SPROM4_5GH_PA_3            0x24 
     880+ 
     881+/* TODO: Make it deprecated */ 
     882 #define SSB_SPROM4_MAXP_BG             0x0080  /* Max Power BG in path 1 */ 
     883 #define  SSB_SPROM4_MAXP_BG_MASK       0x00FF  /* Mask for Max Power BG */ 
     884 #define  SSB_SPROM4_ITSSI_BG           0xFF00  /* Mask for path 1 itssi_bg */ 
    686885--- a/arch/mips/bcm47xx/sprom.c 
    687886+++ b/arch/mips/bcm47xx/sprom.c 
  • trunk/target/linux/generic/patches-3.10/025-bcma_backport.patch

    r40347 r41804  
    3434          Driver to provide access to the GPIO pins of the bcma bus. 
    3535  
     36--- a/drivers/bcma/Makefile 
     37+++ b/drivers/bcma/Makefile 
     38@@ -3,6 +3,7 @@ bcma-y                                  += driver_chipcommon.o driver 
     39 bcma-$(CONFIG_BCMA_SFLASH)             += driver_chipcommon_sflash.o 
     40 bcma-$(CONFIG_BCMA_NFLASH)             += driver_chipcommon_nflash.o 
     41 bcma-y                                 += driver_pci.o 
     42+bcma-y                                 += driver_pcie2.o 
     43 bcma-$(CONFIG_BCMA_DRIVER_PCI_HOSTMODE)        += driver_pci_host.o 
     44 bcma-$(CONFIG_BCMA_DRIVER_MIPS)                += driver_mips.o 
     45 bcma-$(CONFIG_BCMA_DRIVER_GMAC_CMN)    += driver_gmac_cmn.o 
    3646--- a/drivers/bcma/bcma_private.h 
    3747+++ b/drivers/bcma/bcma_private.h 
     
    275285        bcma_pmu_workarounds(cc); 
    276286 } 
     287@@ -480,6 +603,7 @@ void bcma_pmu_spuravoid_pllupdate(struct 
     288                tmp = BCMA_CC_PMU_CTL_PLL_UPD | BCMA_CC_PMU_CTL_NOILPONW; 
     289                break; 
     290  
     291+       case BCMA_CHIP_ID_BCM43217: 
     292        case BCMA_CHIP_ID_BCM43227: 
     293        case BCMA_CHIP_ID_BCM43228: 
     294        case BCMA_CHIP_ID_BCM43428: 
    277295--- a/drivers/bcma/driver_chipcommon_sflash.c 
    278296+++ b/drivers/bcma/driver_chipcommon_sflash.c 
     
    480498        chip->label             = "bcma_gpio"; 
    481499        chip->owner             = THIS_MODULE; 
    482 @@ -95,8 +215,17 @@ int bcma_gpio_init(struct bcma_drv_cc *c 
     500@@ -95,8 +215,18 @@ int bcma_gpio_init(struct bcma_drv_cc *c 
    483501        chip->set               = bcma_gpio_set_value; 
    484502        chip->direction_input   = bcma_gpio_direction_input; 
     
    490508+       switch (cc->core->bus->chipinfo.id) { 
    491509+       case BCMA_CHIP_ID_BCM5357: 
     510+       case BCMA_CHIP_ID_BCM53572: 
    492511+               chip->ngpio     = 32; 
    493512+               break; 
     
    499518         * deterministic to address them more easily. The other buses could get 
    500519         * a random base number. */ 
    501 @@ -105,10 +234,21 @@ int bcma_gpio_init(struct bcma_drv_cc *c 
     520@@ -105,10 +235,21 @@ int bcma_gpio_init(struct bcma_drv_cc *c 
    502521        else 
    503522                chip->base              = -1; 
     
    660679 } 
    661680 EXPORT_SYMBOL(bcma_core_pci_plat_dev_init); 
     681--- /dev/null 
     682+++ b/drivers/bcma/driver_pcie2.c 
     683@@ -0,0 +1,175 @@ 
     684+/* 
     685+ * Broadcom specific AMBA 
     686+ * PCIe Gen 2 Core 
     687+ * 
     688+ * Copyright 2014, Broadcom Corporation 
     689+ * Copyright 2014, Rafał Miłecki <zajec5@gmail.com> 
     690+ * 
     691+ * Licensed under the GNU/GPL. See COPYING for details. 
     692+ */ 
     693+ 
     694+#include "bcma_private.h" 
     695+#include <linux/bcma/bcma.h> 
     696+ 
     697+/************************************************** 
     698+ * R/W ops. 
     699+ **************************************************/ 
     700+ 
     701+#if 0 
     702+static u32 bcma_core_pcie2_cfg_read(struct bcma_drv_pcie2 *pcie2, u32 addr) 
     703+{ 
     704+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, addr); 
     705+       pcie2_read32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR); 
     706+       return pcie2_read32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA); 
     707+} 
     708+#endif 
     709+ 
     710+static void bcma_core_pcie2_cfg_write(struct bcma_drv_pcie2 *pcie2, u32 addr, 
     711+                                     u32 val) 
     712+{ 
     713+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, addr); 
     714+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, val); 
     715+} 
     716+ 
     717+/************************************************** 
     718+ * Init. 
     719+ **************************************************/ 
     720+ 
     721+static u32 bcma_core_pcie2_war_delay_perst_enab(struct bcma_drv_pcie2 *pcie2, 
     722+                                               bool enable) 
     723+{ 
     724+       u32 val; 
     725+ 
     726+       /* restore back to default */ 
     727+       val = pcie2_read32(pcie2, BCMA_CORE_PCIE2_CLK_CONTROL); 
     728+       val |= PCIE2_CLKC_DLYPERST; 
     729+       val &= ~PCIE2_CLKC_DISSPROMLD; 
     730+       if (enable) { 
     731+               val &= ~PCIE2_CLKC_DLYPERST; 
     732+               val |= PCIE2_CLKC_DISSPROMLD; 
     733+       } 
     734+       pcie2_write32(pcie2, (BCMA_CORE_PCIE2_CLK_CONTROL), val); 
     735+       /* flush */ 
     736+       return pcie2_read32(pcie2, BCMA_CORE_PCIE2_CLK_CONTROL); 
     737+} 
     738+ 
     739+static void bcma_core_pcie2_set_ltr_vals(struct bcma_drv_pcie2 *pcie2) 
     740+{ 
     741+       /* LTR0 */ 
     742+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, 0x844); 
     743+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, 0x883c883c); 
     744+       /* LTR1 */ 
     745+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, 0x848); 
     746+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, 0x88648864); 
     747+       /* LTR2 */ 
     748+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, 0x84C); 
     749+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, 0x90039003); 
     750+} 
     751+ 
     752+static void bcma_core_pcie2_hw_ltr_war(struct bcma_drv_pcie2 *pcie2) 
     753+{ 
     754+       u8 core_rev = pcie2->core->id.rev; 
     755+       u32 devstsctr2; 
     756+ 
     757+       if (core_rev < 2 || core_rev == 10 || core_rev > 13) 
     758+               return; 
     759+ 
     760+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, 
     761+                     PCIE2_CAP_DEVSTSCTRL2_OFFSET); 
     762+       devstsctr2 = pcie2_read32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA); 
     763+       if (devstsctr2 & PCIE2_CAP_DEVSTSCTRL2_LTRENAB) { 
     764+               /* force the right LTR values */ 
     765+               bcma_core_pcie2_set_ltr_vals(pcie2); 
     766+ 
     767+               /* TODO: 
     768+               si_core_wrapperreg(pcie2, 3, 0x60, 0x8080, 0); */ 
     769+ 
     770+               /* enable the LTR */ 
     771+               devstsctr2 |= PCIE2_CAP_DEVSTSCTRL2_LTRENAB; 
     772+               pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, 
     773+                             PCIE2_CAP_DEVSTSCTRL2_OFFSET); 
     774+               pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, devstsctr2); 
     775+ 
     776+               /* set the LTR state to be active */ 
     777+               pcie2_write32(pcie2, BCMA_CORE_PCIE2_LTR_STATE, 
     778+                             PCIE2_LTR_ACTIVE); 
     779+               usleep_range(1000, 2000); 
     780+ 
     781+               /* set the LTR state to be sleep */ 
     782+               pcie2_write32(pcie2, BCMA_CORE_PCIE2_LTR_STATE, 
     783+                             PCIE2_LTR_SLEEP); 
     784+               usleep_range(1000, 2000); 
     785+       } 
     786+} 
     787+ 
     788+static void pciedev_crwlpciegen2(struct bcma_drv_pcie2 *pcie2) 
     789+{ 
     790+       u8 core_rev = pcie2->core->id.rev; 
     791+       bool pciewar160, pciewar162; 
     792+ 
     793+       pciewar160 = core_rev == 7 || core_rev == 9 || core_rev == 11; 
     794+       pciewar162 = core_rev == 5 || core_rev == 7 || core_rev == 8 || 
     795+                    core_rev == 9 || core_rev == 11; 
     796+ 
     797+       if (!pciewar160 && !pciewar162) 
     798+               return; 
     799+ 
     800+/* TODO */ 
     801+#if 0 
     802+       pcie2_set32(pcie2, BCMA_CORE_PCIE2_CLK_CONTROL, 
     803+                   PCIE_DISABLE_L1CLK_GATING); 
     804+#if 0 
     805+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, 
     806+                     PCIEGEN2_COE_PVT_TL_CTRL_0); 
     807+       pcie2_mask32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, 
     808+                    ~(1 << COE_PVT_TL_CTRL_0_PM_DIS_L1_REENTRY_BIT)); 
     809+#endif 
     810+#endif 
     811+} 
     812+ 
     813+static void pciedev_crwlpciegen2_180(struct bcma_drv_pcie2 *pcie2) 
     814+{ 
     815+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, PCIE2_PMCR_REFUP); 
     816+       pcie2_set32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, 0x1f); 
     817+} 
     818+ 
     819+static void pciedev_crwlpciegen2_182(struct bcma_drv_pcie2 *pcie2) 
     820+{ 
     821+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, PCIE2_SBMBX); 
     822+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, 1 << 0); 
     823+} 
     824+ 
     825+static void pciedev_reg_pm_clk_period(struct bcma_drv_pcie2 *pcie2) 
     826+{ 
     827+       struct bcma_drv_cc *drv_cc = &pcie2->core->bus->drv_cc; 
     828+       u8 core_rev = pcie2->core->id.rev; 
     829+       u32 alp_khz, pm_value; 
     830+ 
     831+       if (core_rev <= 13) { 
     832+               alp_khz = bcma_pmu_get_alp_clock(drv_cc) / 1000; 
     833+               pm_value = (1000000 * 2) / alp_khz; 
     834+               pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, 
     835+                             PCIE2_PVT_REG_PM_CLK_PERIOD); 
     836+               pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, pm_value); 
     837+       } 
     838+} 
     839+ 
     840+void bcma_core_pcie2_init(struct bcma_drv_pcie2 *pcie2) 
     841+{ 
     842+       struct bcma_chipinfo *ci = &pcie2->core->bus->chipinfo; 
     843+       u32 tmp; 
     844+ 
     845+       tmp = pcie2_read32(pcie2, BCMA_CORE_PCIE2_SPROM(54)); 
     846+       if ((tmp & 0xe) >> 1 == 2) 
     847+               bcma_core_pcie2_cfg_write(pcie2, 0x4e0, 0x17); 
     848+ 
     849+       /* TODO: Do we need pcie_reqsize? */ 
     850+ 
     851+       if (ci->id == BCMA_CHIP_ID_BCM4360 && ci->rev > 3) 
     852+               bcma_core_pcie2_war_delay_perst_enab(pcie2, true); 
     853+       bcma_core_pcie2_hw_ltr_war(pcie2); 
     854+       pciedev_crwlpciegen2(pcie2); 
     855+       pciedev_reg_pm_clk_period(pcie2); 
     856+       pciedev_crwlpciegen2_180(pcie2); 
     857+       pciedev_crwlpciegen2_182(pcie2); 
     858+} 
    662859--- a/drivers/bcma/host_pci.c 
    663860+++ b/drivers/bcma/host_pci.c 
     
    684881  
    685882 #ifdef CONFIG_PM_SLEEP 
    686 @@ -267,14 +269,16 @@ static SIMPLE_DEV_PM_OPS(bcma_pm_ops, bc 
     883@@ -267,14 +269,17 @@ static SIMPLE_DEV_PM_OPS(bcma_pm_ops, bc 
    687884  
    688885 #endif /* CONFIG_PM_SLEEP */ 
     
    699896        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4359) }, 
    700897+       { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4365) }, 
     898+       { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43a9) }, 
    701899        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4727) }, 
    702900        { 0, }, 
     
    752950  
    753951 static void bcma_release_core_dev(struct device *dev) 
    754 @@ -148,6 +156,7 @@ static int bcma_register_cores(struct bc 
     952@@ -115,6 +123,7 @@ static int bcma_register_cores(struct bc 
     953                case BCMA_CORE_CHIPCOMMON: 
     954                case BCMA_CORE_PCI: 
     955                case BCMA_CORE_PCIE: 
     956+               case BCMA_CORE_PCIE2: 
     957                case BCMA_CORE_MIPS_74K: 
     958                case BCMA_CORE_4706_MAC_GBIT_COMMON: 
     959                        continue; 
     960@@ -148,6 +157,7 @@ static int bcma_register_cores(struct bc 
    755961                        bcma_err(bus, 
    756962                                 "Could not register dev for core 0x%03X\n", 
     
    760966                } 
    761967                core->dev_registered = true; 
    762 @@ -218,7 +227,7 @@ int bcma_bus_register(struct bcma_bus *b 
     968@@ -218,7 +228,7 @@ int bcma_bus_register(struct bcma_bus *b 
    763969        err = bcma_bus_scan(bus); 
    764970        if (err) { 
     
    769975  
    770976        /* Early init CC core */ 
     977@@ -263,6 +273,13 @@ int bcma_bus_register(struct bcma_bus *b 
     978                bcma_core_pci_init(&bus->drv_pci[1]); 
     979        } 
     980  
     981+       /* Init PCIe Gen 2 core */ 
     982+       core = bcma_find_core_unit(bus, BCMA_CORE_PCIE2, 0); 
     983+       if (core) { 
     984+               bus->drv_pcie2.core = core; 
     985+               bcma_core_pcie2_init(&bus->drv_pcie2); 
     986+       } 
     987+ 
     988        /* Init GBIT MAC COMMON core */ 
     989        core = bcma_find_core(bus, BCMA_CORE_4706_MAC_GBIT_COMMON); 
     990        if (core) { 
    771991--- a/drivers/bcma/scan.c 
    772992+++ b/drivers/bcma/scan.c 
     
    9491169 } 
    9501170  
    951 @@ -208,9 +212,6 @@ static void bcma_sprom_extract_r8(struct 
     1171@@ -197,6 +201,23 @@ static int bcma_sprom_valid(const u16 *s 
     1172                SPEX(_field[7], _offset + 14, _mask, _shift);   \ 
     1173        } while (0) 
     1174  
     1175+static s8 sprom_extract_antgain(const u16 *in, u16 offset, u16 mask, u16 shift) 
     1176+{ 
     1177+       u16 v; 
     1178+       u8 gain; 
     1179+ 
     1180+       v = in[SPOFF(offset)]; 
     1181+       gain = (v & mask) >> shift; 
     1182+       if (gain == 0xFF) { 
     1183+               gain = 8; /* If unset use 2dBm */ 
     1184+       } else { 
     1185+               /* Q5.2 Fractional part is stored in 0xC0 */ 
     1186+               gain = ((gain & 0xC0) >> 6) | ((gain & 0x3F) << 2); 
     1187+       } 
     1188+ 
     1189+       return (s8)gain; 
     1190+} 
     1191+ 
     1192 static void bcma_sprom_extract_r8(struct bcma_bus *bus, const u16 *sprom) 
     1193 { 
     1194        u16 v, o; 
     1195@@ -208,9 +229,6 @@ static void bcma_sprom_extract_r8(struct 
    9521196        BUILD_BUG_ON(ARRAY_SIZE(pwr_info_offset) != 
    9531197                        ARRAY_SIZE(bus->sprom.core_pwr_info)); 
     
    9591203                v = sprom[SPOFF(SSB_SPROM8_IL0MAC) + i]; 
    9601204                *(((__be16 *)bus->sprom.il0mac) + i) = cpu_to_be16(v); 
    961 @@ -502,7 +503,7 @@ static bool bcma_sprom_onchip_available( 
     1205@@ -380,14 +398,22 @@ static void bcma_sprom_extract_r8(struct 
     1206        SPEX32(ofdm5ghpo, SSB_SPROM8_OFDM5GHPO, ~0, 0); 
     1207  
     1208        /* Extract the antenna gain values. */ 
     1209-       SPEX(antenna_gain.a0, SSB_SPROM8_AGAIN01, 
     1210-            SSB_SPROM8_AGAIN0, SSB_SPROM8_AGAIN0_SHIFT); 
     1211-       SPEX(antenna_gain.a1, SSB_SPROM8_AGAIN01, 
     1212-            SSB_SPROM8_AGAIN1, SSB_SPROM8_AGAIN1_SHIFT); 
     1213-       SPEX(antenna_gain.a2, SSB_SPROM8_AGAIN23, 
     1214-            SSB_SPROM8_AGAIN2, SSB_SPROM8_AGAIN2_SHIFT); 
     1215-       SPEX(antenna_gain.a3, SSB_SPROM8_AGAIN23, 
     1216-            SSB_SPROM8_AGAIN3, SSB_SPROM8_AGAIN3_SHIFT); 
     1217+       bus->sprom.antenna_gain.a0 = sprom_extract_antgain(sprom, 
     1218+                                                          SSB_SPROM8_AGAIN01, 
     1219+                                                          SSB_SPROM8_AGAIN0, 
     1220+                                                          SSB_SPROM8_AGAIN0_SHIFT); 
     1221+       bus->sprom.antenna_gain.a1 = sprom_extract_antgain(sprom, 
     1222+                                                          SSB_SPROM8_AGAIN01, 
     1223+                                                          SSB_SPROM8_AGAIN1, 
     1224+                                                          SSB_SPROM8_AGAIN1_SHIFT); 
     1225+       bus->sprom.antenna_gain.a2 = sprom_extract_antgain(sprom, 
     1226+                                                          SSB_SPROM8_AGAIN23, 
     1227+                                                          SSB_SPROM8_AGAIN2, 
     1228+                                                          SSB_SPROM8_AGAIN2_SHIFT); 
     1229+       bus->sprom.antenna_gain.a3 = sprom_extract_antgain(sprom, 
     1230+                                                          SSB_SPROM8_AGAIN23, 
     1231+                                                          SSB_SPROM8_AGAIN3, 
     1232+                                                          SSB_SPROM8_AGAIN3_SHIFT); 
     1233  
     1234        SPEX(leddc_on_time, SSB_SPROM8_LEDDC, SSB_SPROM8_LEDDC_ON, 
     1235             SSB_SPROM8_LEDDC_ON_SHIFT); 
     1236@@ -502,12 +528,13 @@ static bool bcma_sprom_onchip_available( 
    9621237        case BCMA_CHIP_ID_BCM4331: 
    9631238                present = chip_status & BCMA_CC_CHIPST_4331_OTP_PRESENT; 
     
    9681243        case BCMA_CHIP_ID_BCM43225: 
    9691244                /* for these chips OTP is always available */ 
    970 @@ -550,7 +551,9 @@ int bcma_sprom_get(struct bcma_bus *bus) 
     1245                present = true; 
     1246                break; 
     1247+       case BCMA_CHIP_ID_BCM43217: 
     1248        case BCMA_CHIP_ID_BCM43227: 
     1249        case BCMA_CHIP_ID_BCM43228: 
     1250        case BCMA_CHIP_ID_BCM43428: 
     1251@@ -550,7 +577,9 @@ int bcma_sprom_get(struct bcma_bus *bus) 
    9711252 { 
    9721253        u16 offset = BCMA_CC_SPROM; 
     
    9791260        if (!bus->drv_cc.core) 
    9801261                return -EOPNOTSUPP; 
    981 @@ -579,32 +582,37 @@ int bcma_sprom_get(struct bcma_bus *bus) 
     1262@@ -579,32 +608,37 @@ int bcma_sprom_get(struct bcma_bus *bus) 
    9821263                } 
    9831264        } 
     
    10321313--- a/include/linux/bcma/bcma.h 
    10331314+++ b/include/linux/bcma/bcma.h 
    1034 @@ -72,7 +72,19 @@ struct bcma_host_ops { 
     1315@@ -6,6 +6,7 @@ 
     1316  
     1317 #include <linux/bcma/bcma_driver_chipcommon.h> 
     1318 #include <linux/bcma/bcma_driver_pci.h> 
     1319+#include <linux/bcma/bcma_driver_pcie2.h> 
     1320 #include <linux/bcma/bcma_driver_mips.h> 
     1321 #include <linux/bcma/bcma_driver_gmac_cmn.h> 
     1322 #include <linux/ssb/ssb.h> /* SPROM sharing */ 
     1323@@ -72,7 +73,19 @@ struct bcma_host_ops { 
    10351324 /* Core-ID values. */ 
    10361325 #define BCMA_CORE_OOB_ROUTER           0x367   /* Out of band */ 
     
    10521341 #define BCMA_CORE_AMEMC                        0x52E   /* DDR1/2 memory controller core */ 
    10531342 #define BCMA_CORE_ALTA                 0x534   /* I2S core */ 
    1054 @@ -144,6 +156,7 @@ struct bcma_host_ops { 
     1343@@ -144,6 +157,9 @@ struct bcma_host_ops { 
    10551344  
    10561345 /* Chip IDs of PCIe devices */ 
    10571346 #define BCMA_CHIP_ID_BCM4313   0x4313 
    10581347+#define BCMA_CHIP_ID_BCM43142  43142 
     1348+#define BCMA_CHIP_ID_BCM43217  43217 
     1349+#define BCMA_CHIP_ID_BCM43222  43222 
    10591350 #define BCMA_CHIP_ID_BCM43224  43224 
    10601351 #define  BCMA_PKG_ID_BCM43224_FAB_CSM  0x8 
    10611352 #define  BCMA_PKG_ID_BCM43224_FAB_SMIC 0xa 
    1062 @@ -176,6 +189,11 @@ struct bcma_host_ops { 
     1353@@ -176,6 +192,11 @@ struct bcma_host_ops { 
    10631354 #define  BCMA_PKG_ID_BCM5357   11 
    10641355 #define BCMA_CHIP_ID_BCM53572  53572 
     
    10721363 /* Board types (on PCI usually equals to the subsystem dev id) */ 
    10731364 /* BCM4313 */ 
    1074 @@ -400,7 +418,14 @@ static inline void bcma_maskset16(struct 
     1365@@ -315,6 +336,7 @@ struct bcma_bus { 
     1366  
     1367        struct bcma_drv_cc drv_cc; 
     1368        struct bcma_drv_pci drv_pci[2]; 
     1369+       struct bcma_drv_pcie2 drv_pcie2; 
     1370        struct bcma_drv_mips drv_mips; 
     1371        struct bcma_drv_gmac_cmn drv_gmac_cmn; 
     1372  
     1373@@ -400,7 +422,14 @@ static inline void bcma_maskset16(struct 
    10751374        bcma_write16(cc, offset, (bcma_read16(cc, offset) & mask) | set); 
    10761375 } 
     
    12261525 extern int bcma_core_pci_pcibios_map_irq(const struct pci_dev *dev); 
    12271526 extern int bcma_core_pci_plat_dev_init(struct pci_dev *dev); 
     1527--- /dev/null 
     1528+++ b/include/linux/bcma/bcma_driver_pcie2.h 
     1529@@ -0,0 +1,158 @@ 
     1530+#ifndef LINUX_BCMA_DRIVER_PCIE2_H_ 
     1531+#define LINUX_BCMA_DRIVER_PCIE2_H_ 
     1532+ 
     1533+#define BCMA_CORE_PCIE2_CLK_CONTROL            0x0000 
     1534+#define  PCIE2_CLKC_RST_OE                     0x0001 /* When set, drives PCI_RESET out to pin */ 
     1535+#define  PCIE2_CLKC_RST                                0x0002 /* Value driven out to pin */ 
     1536+#define  PCIE2_CLKC_SPERST                     0x0004 /* SurvivePeRst */ 
     1537+#define  PCIE2_CLKC_DISABLE_L1CLK_GATING       0x0010 
     1538+#define  PCIE2_CLKC_DLYPERST                   0x0100 /* Delay PeRst to CoE Core */ 
     1539+#define  PCIE2_CLKC_DISSPROMLD                 0x0200 /* DisableSpromLoadOnPerst */ 
     1540+#define  PCIE2_CLKC_WAKE_MODE_L2               0x1000 /* Wake on L2 */ 
     1541+#define BCMA_CORE_PCIE2_RC_PM_CONTROL          0x0004 
     1542+#define BCMA_CORE_PCIE2_RC_PM_STATUS           0x0008 
     1543+#define BCMA_CORE_PCIE2_EP_PM_CONTROL          0x000C 
     1544+#define BCMA_CORE_PCIE2_EP_PM_STATUS           0x0010 
     1545+#define BCMA_CORE_PCIE2_EP_LTR_CONTROL         0x0014 
     1546+#define BCMA_CORE_PCIE2_EP_LTR_STATUS          0x0018 
     1547+#define BCMA_CORE_PCIE2_EP_OBFF_STATUS         0x001C 
     1548+#define BCMA_CORE_PCIE2_PCIE_ERR_STATUS                0x0020 
     1549+#define BCMA_CORE_PCIE2_RC_AXI_CONFIG          0x0100 
     1550+#define BCMA_CORE_PCIE2_EP_AXI_CONFIG          0x0104 
     1551+#define BCMA_CORE_PCIE2_RXDEBUG_STATUS0                0x0108 
     1552+#define BCMA_CORE_PCIE2_RXDEBUG_CONTROL0       0x010C 
     1553+#define BCMA_CORE_PCIE2_CONFIGINDADDR          0x0120 
     1554+#define BCMA_CORE_PCIE2_CONFIGINDDATA          0x0124 
     1555+#define BCMA_CORE_PCIE2_MDIOCONTROL            0x0128 
     1556+#define BCMA_CORE_PCIE2_MDIOWRDATA             0x012C 
     1557+#define BCMA_CORE_PCIE2_MDIORDDATA             0x0130 
     1558+#define BCMA_CORE_PCIE2_DATAINTF               0x0180 
     1559+#define BCMA_CORE_PCIE2_D2H_INTRLAZY_0         0x0188 
     1560+#define BCMA_CORE_PCIE2_H2D_INTRLAZY_0         0x018c 
     1561+#define BCMA_CORE_PCIE2_H2D_INTSTAT_0          0x0190 
     1562+#define BCMA_CORE_PCIE2_H2D_INTMASK_0          0x0194 
     1563+#define BCMA_CORE_PCIE2_D2H_INTSTAT_0          0x0198 
     1564+#define BCMA_CORE_PCIE2_D2H_INTMASK_0          0x019c 
     1565+#define BCMA_CORE_PCIE2_LTR_STATE              0x01A0 /* Latency Tolerance Reporting */ 
     1566+#define  PCIE2_LTR_ACTIVE                      2 
     1567+#define  PCIE2_LTR_ACTIVE_IDLE                 1 
     1568+#define  PCIE2_LTR_SLEEP                       0 
     1569+#define  PCIE2_LTR_FINAL_MASK                  0x300 
     1570+#define  PCIE2_LTR_FINAL_SHIFT                 8 
     1571+#define BCMA_CORE_PCIE2_PWR_INT_STATUS         0x01A4 
     1572+#define BCMA_CORE_PCIE2_PWR_INT_MASK           0x01A8 
     1573+#define BCMA_CORE_PCIE2_CFG_ADDR               0x01F8 
     1574+#define BCMA_CORE_PCIE2_CFG_DATA               0x01FC 
     1575+#define BCMA_CORE_PCIE2_SYS_EQ_PAGE            0x0200 
     1576+#define BCMA_CORE_PCIE2_SYS_MSI_PAGE           0x0204 
     1577+#define BCMA_CORE_PCIE2_SYS_MSI_INTREN         0x0208 
     1578+#define BCMA_CORE_PCIE2_SYS_MSI_CTRL0          0x0210 
     1579+#define BCMA_CORE_PCIE2_SYS_MSI_CTRL1          0x0214 
     1580+#define BCMA_CORE_PCIE2_SYS_MSI_CTRL2          0x0218 
     1581+#define BCMA_CORE_PCIE2_SYS_MSI_CTRL3          0x021C 
     1582+#define BCMA_CORE_PCIE2_SYS_MSI_CTRL4          0x0220 
     1583+#define BCMA_CORE_PCIE2_SYS_MSI_CTRL5          0x0224 
     1584+#define BCMA_CORE_PCIE2_SYS_EQ_HEAD0           0x0250 
     1585+#define BCMA_CORE_PCIE2_SYS_EQ_TAIL0           0x0254 
     1586+#define BCMA_CORE_PCIE2_SYS_EQ_HEAD1           0x0258 
     1587+#define BCMA_CORE_PCIE2_SYS_EQ_TAIL1           0x025C 
     1588+#define BCMA_CORE_PCIE2_SYS_EQ_HEAD2           0x0260 
     1589+#define BCMA_CORE_PCIE2_SYS_EQ_TAIL2           0x0264 
     1590+#define BCMA_CORE_PCIE2_SYS_EQ_HEAD3           0x0268 
     1591+#define BCMA_CORE_PCIE2_SYS_EQ_TAIL3           0x026C 
     1592+#define BCMA_CORE_PCIE2_SYS_EQ_HEAD4           0x0270 
     1593+#define BCMA_CORE_PCIE2_SYS_EQ_TAIL4           0x0274 
     1594+#define BCMA_CORE_PCIE2_SYS_EQ_HEAD5           0x0278 
     1595+#define BCMA_CORE_PCIE2_SYS_EQ_TAIL5           0x027C 
     1596+#define BCMA_CORE_PCIE2_SYS_RC_INTX_EN         0x0330 
     1597+#define BCMA_CORE_PCIE2_SYS_RC_INTX_CSR                0x0334 
     1598+#define BCMA_CORE_PCIE2_SYS_MSI_REQ            0x0340 
     1599+#define BCMA_CORE_PCIE2_SYS_HOST_INTR_EN       0x0344 
     1600+#define BCMA_CORE_PCIE2_SYS_HOST_INTR_CSR      0x0348 
     1601+#define BCMA_CORE_PCIE2_SYS_HOST_INTR0         0x0350 
     1602+#define BCMA_CORE_PCIE2_SYS_HOST_INTR1         0x0354 
     1603+#define BCMA_CORE_PCIE2_SYS_HOST_INTR2         0x0358 
     1604+#define BCMA_CORE_PCIE2_SYS_HOST_INTR3         0x035C 
     1605+#define BCMA_CORE_PCIE2_SYS_EP_INT_EN0         0x0360 
     1606+#define BCMA_CORE_PCIE2_SYS_EP_INT_EN1         0x0364 
     1607+#define BCMA_CORE_PCIE2_SYS_EP_INT_CSR0                0x0370 
     1608+#define BCMA_CORE_PCIE2_SYS_EP_INT_CSR1                0x0374 
     1609+#define BCMA_CORE_PCIE2_SPROM(wordoffset)      (0x0800 + ((wordoffset) * 2)) 
     1610+#define BCMA_CORE_PCIE2_FUNC0_IMAP0_0          0x0C00 
     1611+#define BCMA_CORE_PCIE2_FUNC0_IMAP0_1          0x0C04 
     1612+#define BCMA_CORE_PCIE2_FUNC0_IMAP0_2          0x0C08 
     1613+#define BCMA_CORE_PCIE2_FUNC0_IMAP0_3          0x0C0C 
     1614+#define BCMA_CORE_PCIE2_FUNC0_IMAP0_4          0x0C10 
     1615+#define BCMA_CORE_PCIE2_FUNC0_IMAP0_5          0x0C14 
     1616+#define BCMA_CORE_PCIE2_FUNC0_IMAP0_6          0x0C18 
     1617+#define BCMA_CORE_PCIE2_FUNC0_IMAP0_7          0x0C1C 
     1618+#define BCMA_CORE_PCIE2_FUNC1_IMAP0_0          0x0C20 
     1619+#define BCMA_CORE_PCIE2_FUNC1_IMAP0_1          0x0C24 
     1620+#define BCMA_CORE_PCIE2_FUNC1_IMAP0_2          0x0C28 
     1621+#define BCMA_CORE_PCIE2_FUNC1_IMAP0_3          0x0C2C 
     1622+#define BCMA_CORE_PCIE2_FUNC1_IMAP0_4          0x0C30 
     1623+#define BCMA_CORE_PCIE2_FUNC1_IMAP0_5          0x0C34 
     1624+#define BCMA_CORE_PCIE2_FUNC1_IMAP0_6          0x0C38 
     1625+#define BCMA_CORE_PCIE2_FUNC1_IMAP0_7          0x0C3C 
     1626+#define BCMA_CORE_PCIE2_FUNC0_IMAP1            0x0C80 
     1627+#define BCMA_CORE_PCIE2_FUNC1_IMAP1            0x0C88 
     1628+#define BCMA_CORE_PCIE2_FUNC0_IMAP2            0x0CC0 
     1629+#define BCMA_CORE_PCIE2_FUNC1_IMAP2            0x0CC8 
     1630+#define BCMA_CORE_PCIE2_IARR0_LOWER            0x0D00 
     1631+#define BCMA_CORE_PCIE2_IARR0_UPPER            0x0D04 
     1632+#define BCMA_CORE_PCIE2_IARR1_LOWER            0x0D08 
     1633+#define BCMA_CORE_PCIE2_IARR1_UPPER            0x0D0C 
     1634+#define BCMA_CORE_PCIE2_IARR2_LOWER            0x0D10 
     1635+#define BCMA_CORE_PCIE2_IARR2_UPPER            0x0D14 
     1636+#define BCMA_CORE_PCIE2_OARR0                  0x0D20 
     1637+#define BCMA_CORE_PCIE2_OARR1                  0x0D28 
     1638+#define BCMA_CORE_PCIE2_OARR2                  0x0D30 
     1639+#define BCMA_CORE_PCIE2_OMAP0_LOWER            0x0D40 
     1640+#define BCMA_CORE_PCIE2_OMAP0_UPPER            0x0D44 
     1641+#define BCMA_CORE_PCIE2_OMAP1_LOWER            0x0D48 
     1642+#define BCMA_CORE_PCIE2_OMAP1_UPPER            0x0D4C 
     1643+#define BCMA_CORE_PCIE2_OMAP2_LOWER            0x0D50 
     1644+#define BCMA_CORE_PCIE2_OMAP2_UPPER            0x0D54 
     1645+#define BCMA_CORE_PCIE2_FUNC1_IARR1_SIZE       0x0D58 
     1646+#define BCMA_CORE_PCIE2_FUNC1_IARR2_SIZE       0x0D5C 
     1647+#define BCMA_CORE_PCIE2_MEM_CONTROL            0x0F00 
     1648+#define BCMA_CORE_PCIE2_MEM_ECC_ERRLOG0                0x0F04 
     1649+#define BCMA_CORE_PCIE2_MEM_ECC_ERRLOG1                0x0F08 
     1650+#define BCMA_CORE_PCIE2_LINK_STATUS            0x0F0C 
     1651+#define BCMA_CORE_PCIE2_STRAP_STATUS           0x0F10 
     1652+#define BCMA_CORE_PCIE2_RESET_STATUS           0x0F14 
     1653+#define BCMA_CORE_PCIE2_RESETEN_IN_LINKDOWN    0x0F18 
     1654+#define BCMA_CORE_PCIE2_MISC_INTR_EN           0x0F1C 
     1655+#define BCMA_CORE_PCIE2_TX_DEBUG_CFG           0x0F20 
     1656+#define BCMA_CORE_PCIE2_MISC_CONFIG            0x0F24 
     1657+#define BCMA_CORE_PCIE2_MISC_STATUS            0x0F28 
     1658+#define BCMA_CORE_PCIE2_INTR_EN                        0x0F30 
     1659+#define BCMA_CORE_PCIE2_INTR_CLEAR             0x0F34 
     1660+#define BCMA_CORE_PCIE2_INTR_STATUS            0x0F38 
     1661+ 
     1662+/* PCIE gen2 config regs */ 
     1663+#define PCIE2_INTSTATUS                                0x090 
     1664+#define PCIE2_INTMASK                          0x094 
     1665+#define PCIE2_SBMBX                            0x098 
     1666+ 
     1667+#define PCIE2_PMCR_REFUP                       0x1814 /* Trefup time */ 
     1668+ 
     1669+#define PCIE2_CAP_DEVSTSCTRL2_OFFSET           0xD4 
     1670+#define PCIE2_CAP_DEVSTSCTRL2_LTRENAB          0x400 
     1671+#define PCIE2_PVT_REG_PM_CLK_PERIOD            0x184c 
     1672+ 
     1673+struct bcma_drv_pcie2 { 
     1674+       struct bcma_device *core; 
     1675+}; 
     1676+ 
     1677+#define pcie2_read16(pcie2, offset)            bcma_read16((pcie2)->core, offset) 
     1678+#define pcie2_read32(pcie2, offset)            bcma_read32((pcie2)->core, offset) 
     1679+#define pcie2_write16(pcie2, offset, val)      bcma_write16((pcie2)->core, offset, val) 
     1680+#define pcie2_write32(pcie2, offset, val)      bcma_write32((pcie2)->core, offset, val) 
     1681+ 
     1682+#define pcie2_set32(pcie2, offset, set)                bcma_set32((pcie2)->core, offset, set) 
     1683+#define pcie2_mask32(pcie2, offset, mask)      bcma_mask32((pcie2)->core, offset, mask) 
     1684+ 
     1685+void bcma_core_pcie2_init(struct bcma_drv_pcie2 *pcie2); 
     1686+ 
     1687+#endif /* LINUX_BCMA_DRIVER_PCIE2_H_ */ 
    12281688--- a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c 
    12291689+++ b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c 
  • trunk/target/linux/generic/patches-3.13/020-ssb_update.patch

    r41553 r41804  
    456456        if (err) { 
    457457                ssb_bus_may_powerdown(bus); 
     458--- a/drivers/ssb/pci.c 
     459+++ b/drivers/ssb/pci.c 
     460@@ -326,13 +326,13 @@ err_ctlreg: 
     461        return err; 
     462 } 
     463  
     464-static s8 r123_extract_antgain(u8 sprom_revision, const u16 *in, 
     465-                              u16 mask, u16 shift) 
     466+static s8 sprom_extract_antgain(u8 sprom_revision, const u16 *in, u16 offset, 
     467+                               u16 mask, u16 shift) 
     468 { 
     469        u16 v; 
     470        u8 gain; 
     471  
     472-       v = in[SPOFF(SSB_SPROM1_AGAIN)]; 
     473+       v = in[SPOFF(offset)]; 
     474        gain = (v & mask) >> shift; 
     475        if (gain == 0xFF) 
     476                gain = 2; /* If unset use 2dBm */ 
     477@@ -416,12 +416,14 @@ static void sprom_extract_r123(struct ss 
     478        SPEX(alpha2[1], SSB_SPROM1_CCODE, 0x00ff, 0); 
     479  
     480        /* Extract the antenna gain values. */ 
     481-       out->antenna_gain.a0 = r123_extract_antgain(out->revision, in, 
     482-                                                   SSB_SPROM1_AGAIN_BG, 
     483-                                                   SSB_SPROM1_AGAIN_BG_SHIFT); 
     484-       out->antenna_gain.a1 = r123_extract_antgain(out->revision, in, 
     485-                                                   SSB_SPROM1_AGAIN_A, 
     486-                                                   SSB_SPROM1_AGAIN_A_SHIFT); 
     487+       out->antenna_gain.a0 = sprom_extract_antgain(out->revision, in, 
     488+                                                    SSB_SPROM1_AGAIN, 
     489+                                                    SSB_SPROM1_AGAIN_BG, 
     490+                                                    SSB_SPROM1_AGAIN_BG_SHIFT); 
     491+       out->antenna_gain.a1 = sprom_extract_antgain(out->revision, in, 
     492+                                                    SSB_SPROM1_AGAIN, 
     493+                                                    SSB_SPROM1_AGAIN_A, 
     494+                                                    SSB_SPROM1_AGAIN_A_SHIFT); 
     495        if (out->revision >= 2) 
     496                sprom_extract_r23(out, in); 
     497 } 
     498@@ -468,7 +470,15 @@ static void sprom_extract_r458(struct ss 
     499  
     500 static void sprom_extract_r45(struct ssb_sprom *out, const u16 *in) 
     501 { 
     502+       static const u16 pwr_info_offset[] = { 
     503+               SSB_SPROM4_PWR_INFO_CORE0, SSB_SPROM4_PWR_INFO_CORE1, 
     504+               SSB_SPROM4_PWR_INFO_CORE2, SSB_SPROM4_PWR_INFO_CORE3 
     505+       }; 
     506        u16 il0mac_offset; 
     507+       int i; 
     508+ 
     509+       BUILD_BUG_ON(ARRAY_SIZE(pwr_info_offset) != 
     510+                    ARRAY_SIZE(out->core_pwr_info)); 
     511  
     512        if (out->revision == 4) 
     513                il0mac_offset = SSB_SPROM4_IL0MAC; 
     514@@ -524,14 +534,59 @@ static void sprom_extract_r45(struct ssb 
     515        } 
     516  
     517        /* Extract the antenna gain values. */ 
     518-       SPEX(antenna_gain.a0, SSB_SPROM4_AGAIN01, 
     519-            SSB_SPROM4_AGAIN0, SSB_SPROM4_AGAIN0_SHIFT); 
     520-       SPEX(antenna_gain.a1, SSB_SPROM4_AGAIN01, 
     521-            SSB_SPROM4_AGAIN1, SSB_SPROM4_AGAIN1_SHIFT); 
     522-       SPEX(antenna_gain.a2, SSB_SPROM4_AGAIN23, 
     523-            SSB_SPROM4_AGAIN2, SSB_SPROM4_AGAIN2_SHIFT); 
     524-       SPEX(antenna_gain.a3, SSB_SPROM4_AGAIN23, 
     525-            SSB_SPROM4_AGAIN3, SSB_SPROM4_AGAIN3_SHIFT); 
     526+       out->antenna_gain.a0 = sprom_extract_antgain(out->revision, in, 
     527+                                                    SSB_SPROM4_AGAIN01, 
     528+                                                    SSB_SPROM4_AGAIN0, 
     529+                                                    SSB_SPROM4_AGAIN0_SHIFT); 
     530+       out->antenna_gain.a1 = sprom_extract_antgain(out->revision, in, 
     531+                                                    SSB_SPROM4_AGAIN01, 
     532+                                                    SSB_SPROM4_AGAIN1, 
     533+                                                    SSB_SPROM4_AGAIN1_SHIFT); 
     534+       out->antenna_gain.a2 = sprom_extract_antgain(out->revision, in, 
     535+                                                    SSB_SPROM4_AGAIN23, 
     536+                                                    SSB_SPROM4_AGAIN2, 
     537+                                                    SSB_SPROM4_AGAIN2_SHIFT); 
     538+       out->antenna_gain.a3 = sprom_extract_antgain(out->revision, in, 
     539+                                                    SSB_SPROM4_AGAIN23, 
     540+                                                    SSB_SPROM4_AGAIN3, 
     541+                                                    SSB_SPROM4_AGAIN3_SHIFT); 
     542+ 
     543+       /* Extract cores power info info */ 
     544+       for (i = 0; i < ARRAY_SIZE(pwr_info_offset); i++) { 
     545+               u16 o = pwr_info_offset[i]; 
     546+ 
     547+               SPEX(core_pwr_info[i].itssi_2g, o + SSB_SPROM4_2G_MAXP_ITSSI, 
     548+                       SSB_SPROM4_2G_ITSSI, SSB_SPROM4_2G_ITSSI_SHIFT); 
     549+               SPEX(core_pwr_info[i].maxpwr_2g, o + SSB_SPROM4_2G_MAXP_ITSSI, 
     550+                       SSB_SPROM4_2G_MAXP, 0); 
     551+ 
     552+               SPEX(core_pwr_info[i].pa_2g[0], o + SSB_SPROM4_2G_PA_0, ~0, 0); 
     553+               SPEX(core_pwr_info[i].pa_2g[1], o + SSB_SPROM4_2G_PA_1, ~0, 0); 
     554+               SPEX(core_pwr_info[i].pa_2g[2], o + SSB_SPROM4_2G_PA_2, ~0, 0); 
     555+               SPEX(core_pwr_info[i].pa_2g[3], o + SSB_SPROM4_2G_PA_3, ~0, 0); 
     556+ 
     557+               SPEX(core_pwr_info[i].itssi_5g, o + SSB_SPROM4_5G_MAXP_ITSSI, 
     558+                       SSB_SPROM4_5G_ITSSI, SSB_SPROM4_5G_ITSSI_SHIFT); 
     559+               SPEX(core_pwr_info[i].maxpwr_5g, o + SSB_SPROM4_5G_MAXP_ITSSI, 
     560+                       SSB_SPROM4_5G_MAXP, 0); 
     561+               SPEX(core_pwr_info[i].maxpwr_5gh, o + SSB_SPROM4_5GHL_MAXP, 
     562+                       SSB_SPROM4_5GH_MAXP, 0); 
     563+               SPEX(core_pwr_info[i].maxpwr_5gl, o + SSB_SPROM4_5GHL_MAXP, 
     564+                       SSB_SPROM4_5GL_MAXP, SSB_SPROM4_5GL_MAXP_SHIFT); 
     565+ 
     566+               SPEX(core_pwr_info[i].pa_5gl[0], o + SSB_SPROM4_5GL_PA_0, ~0, 0); 
     567+               SPEX(core_pwr_info[i].pa_5gl[1], o + SSB_SPROM4_5GL_PA_1, ~0, 0); 
     568+               SPEX(core_pwr_info[i].pa_5gl[2], o + SSB_SPROM4_5GL_PA_2, ~0, 0); 
     569+               SPEX(core_pwr_info[i].pa_5gl[3], o + SSB_SPROM4_5GL_PA_3, ~0, 0); 
     570+               SPEX(core_pwr_info[i].pa_5g[0], o + SSB_SPROM4_5G_PA_0, ~0, 0); 
     571+               SPEX(core_pwr_info[i].pa_5g[1], o + SSB_SPROM4_5G_PA_1, ~0, 0); 
     572+               SPEX(core_pwr_info[i].pa_5g[2], o + SSB_SPROM4_5G_PA_2, ~0, 0); 
     573+               SPEX(core_pwr_info[i].pa_5g[3], o + SSB_SPROM4_5G_PA_3, ~0, 0); 
     574+               SPEX(core_pwr_info[i].pa_5gh[0], o + SSB_SPROM4_5GH_PA_0, ~0, 0); 
     575+               SPEX(core_pwr_info[i].pa_5gh[1], o + SSB_SPROM4_5GH_PA_1, ~0, 0); 
     576+               SPEX(core_pwr_info[i].pa_5gh[2], o + SSB_SPROM4_5GH_PA_2, ~0, 0); 
     577+               SPEX(core_pwr_info[i].pa_5gh[3], o + SSB_SPROM4_5GH_PA_3, ~0, 0); 
     578+       } 
     579  
     580        sprom_extract_r458(out, in); 
     581  
     582@@ -621,14 +676,22 @@ static void sprom_extract_r8(struct ssb_ 
     583        SPEX32(ofdm5ghpo, SSB_SPROM8_OFDM5GHPO, 0xFFFFFFFF, 0); 
     584  
     585        /* Extract the antenna gain values. */ 
     586-       SPEX(antenna_gain.a0, SSB_SPROM8_AGAIN01, 
     587-            SSB_SPROM8_AGAIN0, SSB_SPROM8_AGAIN0_SHIFT); 
     588-       SPEX(antenna_gain.a1, SSB_SPROM8_AGAIN01, 
     589-            SSB_SPROM8_AGAIN1, SSB_SPROM8_AGAIN1_SHIFT); 
     590-       SPEX(antenna_gain.a2, SSB_SPROM8_AGAIN23, 
     591-            SSB_SPROM8_AGAIN2, SSB_SPROM8_AGAIN2_SHIFT); 
     592-       SPEX(antenna_gain.a3, SSB_SPROM8_AGAIN23, 
     593-            SSB_SPROM8_AGAIN3, SSB_SPROM8_AGAIN3_SHIFT); 
     594+       out->antenna_gain.a0 = sprom_extract_antgain(out->revision, in, 
     595+                                                    SSB_SPROM8_AGAIN01, 
     596+                                                    SSB_SPROM8_AGAIN0, 
     597+                                                    SSB_SPROM8_AGAIN0_SHIFT); 
     598+       out->antenna_gain.a1 = sprom_extract_antgain(out->revision, in, 
     599+                                                    SSB_SPROM8_AGAIN01, 
     600+                                                    SSB_SPROM8_AGAIN1, 
     601+                                                    SSB_SPROM8_AGAIN1_SHIFT); 
     602+       out->antenna_gain.a2 = sprom_extract_antgain(out->revision, in, 
     603+                                                    SSB_SPROM8_AGAIN23, 
     604+                                                    SSB_SPROM8_AGAIN2, 
     605+                                                    SSB_SPROM8_AGAIN2_SHIFT); 
     606+       out->antenna_gain.a3 = sprom_extract_antgain(out->revision, in, 
     607+                                                    SSB_SPROM8_AGAIN23, 
     608+                                                    SSB_SPROM8_AGAIN3, 
     609+                                                    SSB_SPROM8_AGAIN3_SHIFT); 
     610  
     611        /* Extract cores power info info */ 
     612        for (i = 0; i < ARRAY_SIZE(pwr_info_offset); i++) { 
    458613--- a/include/linux/ssb/ssb.h 
    459614+++ b/include/linux/ssb/ssb.h 
     
    474629  
    475630        /* Internal-only stuff follows. Do not touch. */ 
     631--- a/include/linux/ssb/ssb_regs.h 
     632+++ b/include/linux/ssb/ssb_regs.h 
     633@@ -345,6 +345,43 @@ 
     634 #define  SSB_SPROM4_TXPID5GH2_SHIFT    0 
     635 #define  SSB_SPROM4_TXPID5GH3          0xFF00 
     636 #define  SSB_SPROM4_TXPID5GH3_SHIFT    8 
     637+ 
     638+/* There are 4 blocks with power info sharing the same layout */ 
     639+#define SSB_SPROM4_PWR_INFO_CORE0      0x0080 
     640+#define SSB_SPROM4_PWR_INFO_CORE1      0x00AE 
     641+#define SSB_SPROM4_PWR_INFO_CORE2      0x00DC 
     642+#define SSB_SPROM4_PWR_INFO_CORE3      0x010A 
     643+ 
     644+#define SSB_SPROM4_2G_MAXP_ITSSI       0x00    /* 2 GHz ITSSI and 2 GHz Max Power */ 
     645+#define  SSB_SPROM4_2G_MAXP            0x00FF 
     646+#define  SSB_SPROM4_2G_ITSSI           0xFF00 
     647+#define  SSB_SPROM4_2G_ITSSI_SHIFT     8 
     648+#define SSB_SPROM4_2G_PA_0             0x02    /* 2 GHz power amp */ 
     649+#define SSB_SPROM4_2G_PA_1             0x04 
     650+#define SSB_SPROM4_2G_PA_2             0x06 
     651+#define SSB_SPROM4_2G_PA_3             0x08 
     652+#define SSB_SPROM4_5G_MAXP_ITSSI       0x0A    /* 5 GHz ITSSI and 5.3 GHz Max Power */ 
     653+#define  SSB_SPROM4_5G_MAXP            0x00FF 
     654+#define  SSB_SPROM4_5G_ITSSI           0xFF00 
     655+#define  SSB_SPROM4_5G_ITSSI_SHIFT     8 
     656+#define SSB_SPROM4_5GHL_MAXP           0x0C    /* 5.2 GHz and 5.8 GHz Max Power */ 
     657+#define  SSB_SPROM4_5GH_MAXP           0x00FF 
     658+#define  SSB_SPROM4_5GL_MAXP           0xFF00 
     659+#define  SSB_SPROM4_5GL_MAXP_SHIFT     8 
     660+#define SSB_SPROM4_5G_PA_0             0x0E    /* 5.3 GHz power amp */ 
     661+#define SSB_SPROM4_5G_PA_1             0x10 
     662+#define SSB_SPROM4_5G_PA_2             0x12 
     663+#define SSB_SPROM4_5G_PA_3             0x14 
     664+#define SSB_SPROM4_5GL_PA_0            0x16    /* 5.2 GHz power amp */ 
     665+#define SSB_SPROM4_5GL_PA_1            0x18 
     666+#define SSB_SPROM4_5GL_PA_2            0x1A 
     667+#define SSB_SPROM4_5GL_PA_3            0x1C 
     668+#define SSB_SPROM4_5GH_PA_0            0x1E    /* 5.8 GHz power amp */ 
     669+#define SSB_SPROM4_5GH_PA_1            0x20 
     670+#define SSB_SPROM4_5GH_PA_2            0x22 
     671+#define SSB_SPROM4_5GH_PA_3            0x24 
     672+ 
     673+/* TODO: Make it deprecated */ 
     674 #define SSB_SPROM4_MAXP_BG             0x0080  /* Max Power BG in path 1 */ 
     675 #define  SSB_SPROM4_MAXP_BG_MASK       0x00FF  /* Mask for Max Power BG */ 
     676 #define  SSB_SPROM4_ITSSI_BG           0xFF00  /* Mask for path 1 itssi_bg */ 
    476677--- a/arch/mips/bcm47xx/sprom.c 
    477678+++ b/arch/mips/bcm47xx/sprom.c 
  • trunk/target/linux/generic/patches-3.13/025-bcma_backport.patch

    r40347 r41804  
    99          Driver to provide access to the GPIO pins of the bcma bus. 
    1010  
     11--- a/drivers/bcma/Makefile 
     12+++ b/drivers/bcma/Makefile 
     13@@ -3,6 +3,7 @@ bcma-y                                  += driver_chipcommon.o driver 
     14 bcma-$(CONFIG_BCMA_SFLASH)             += driver_chipcommon_sflash.o 
     15 bcma-$(CONFIG_BCMA_NFLASH)             += driver_chipcommon_nflash.o 
     16 bcma-y                                 += driver_pci.o 
     17+bcma-y                                 += driver_pcie2.o 
     18 bcma-$(CONFIG_BCMA_DRIVER_PCI_HOSTMODE)        += driver_pci_host.o 
     19 bcma-$(CONFIG_BCMA_DRIVER_MIPS)                += driver_mips.o 
     20 bcma-$(CONFIG_BCMA_DRIVER_GMAC_CMN)    += driver_gmac_cmn.o 
    1121--- a/drivers/bcma/bcma_private.h 
    1222+++ b/drivers/bcma/bcma_private.h 
     
    2030 /* scan.c */ 
    2131 int bcma_bus_scan(struct bcma_bus *bus); 
     32--- a/drivers/bcma/driver_chipcommon_pmu.c 
     33+++ b/drivers/bcma/driver_chipcommon_pmu.c 
     34@@ -603,6 +603,7 @@ void bcma_pmu_spuravoid_pllupdate(struct 
     35                tmp = BCMA_CC_PMU_CTL_PLL_UPD | BCMA_CC_PMU_CTL_NOILPONW; 
     36                break; 
     37  
     38+       case BCMA_CHIP_ID_BCM43217: 
     39        case BCMA_CHIP_ID_BCM43227: 
     40        case BCMA_CHIP_ID_BCM43228: 
     41        case BCMA_CHIP_ID_BCM43428: 
    2242--- a/drivers/bcma/driver_chipcommon_sflash.c 
    2343+++ b/drivers/bcma/driver_chipcommon_sflash.c 
     
    199219        chip->label             = "bcma_gpio"; 
    200220        chip->owner             = THIS_MODULE; 
    201 @@ -95,8 +215,17 @@ int bcma_gpio_init(struct bcma_drv_cc *c 
     221@@ -95,8 +215,18 @@ int bcma_gpio_init(struct bcma_drv_cc *c 
    202222        chip->set               = bcma_gpio_set_value; 
    203223        chip->direction_input   = bcma_gpio_direction_input; 
     
    209229+       switch (cc->core->bus->chipinfo.id) { 
    210230+       case BCMA_CHIP_ID_BCM5357: 
     231+       case BCMA_CHIP_ID_BCM53572: 
    211232+               chip->ngpio     = 32; 
    212233+               break; 
     
    218239         * deterministic to address them more easily. The other buses could get 
    219240         * a random base number. */ 
    220 @@ -105,10 +234,21 @@ int bcma_gpio_init(struct bcma_drv_cc *c 
     241@@ -105,10 +235,21 @@ int bcma_gpio_init(struct bcma_drv_cc *c 
    221242        else 
    222243                chip->base              = -1; 
     
    241262        return gpiochip_remove(&cc->gpio); 
    242263 } 
     264--- /dev/null 
     265+++ b/drivers/bcma/driver_pcie2.c 
     266@@ -0,0 +1,175 @@ 
     267+/* 
     268+ * Broadcom specific AMBA 
     269+ * PCIe Gen 2 Core 
     270+ * 
     271+ * Copyright 2014, Broadcom Corporation 
     272+ * Copyright 2014, Rafał Miłecki <zajec5@gmail.com> 
     273+ * 
     274+ * Licensed under the GNU/GPL. See COPYING for details. 
     275+ */ 
     276+ 
     277+#include "bcma_private.h" 
     278+#include <linux/bcma/bcma.h> 
     279+ 
     280+/************************************************** 
     281+ * R/W ops. 
     282+ **************************************************/ 
     283+ 
     284+#if 0 
     285+static u32 bcma_core_pcie2_cfg_read(struct bcma_drv_pcie2 *pcie2, u32 addr) 
     286+{ 
     287+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, addr); 
     288+       pcie2_read32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR); 
     289+       return pcie2_read32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA); 
     290+} 
     291+#endif 
     292+ 
     293+static void bcma_core_pcie2_cfg_write(struct bcma_drv_pcie2 *pcie2, u32 addr, 
     294+                                     u32 val) 
     295+{ 
     296+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, addr); 
     297+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, val); 
     298+} 
     299+ 
     300+/************************************************** 
     301+ * Init. 
     302+ **************************************************/ 
     303+ 
     304+static u32 bcma_core_pcie2_war_delay_perst_enab(struct bcma_drv_pcie2 *pcie2, 
     305+                                               bool enable) 
     306+{ 
     307+       u32 val; 
     308+ 
     309+       /* restore back to default */ 
     310+       val = pcie2_read32(pcie2, BCMA_CORE_PCIE2_CLK_CONTROL); 
     311+       val |= PCIE2_CLKC_DLYPERST; 
     312+       val &= ~PCIE2_CLKC_DISSPROMLD; 
     313+       if (enable) { 
     314+               val &= ~PCIE2_CLKC_DLYPERST; 
     315+               val |= PCIE2_CLKC_DISSPROMLD; 
     316+       } 
     317+       pcie2_write32(pcie2, (BCMA_CORE_PCIE2_CLK_CONTROL), val); 
     318+       /* flush */ 
     319+       return pcie2_read32(pcie2, BCMA_CORE_PCIE2_CLK_CONTROL); 
     320+} 
     321+ 
     322+static void bcma_core_pcie2_set_ltr_vals(struct bcma_drv_pcie2 *pcie2) 
     323+{ 
     324+       /* LTR0 */ 
     325+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, 0x844); 
     326+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, 0x883c883c); 
     327+       /* LTR1 */ 
     328+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, 0x848); 
     329+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, 0x88648864); 
     330+       /* LTR2 */ 
     331+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, 0x84C); 
     332+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, 0x90039003); 
     333+} 
     334+ 
     335+static void bcma_core_pcie2_hw_ltr_war(struct bcma_drv_pcie2 *pcie2) 
     336+{ 
     337+       u8 core_rev = pcie2->core->id.rev; 
     338+       u32 devstsctr2; 
     339+ 
     340+       if (core_rev < 2 || core_rev == 10 || core_rev > 13) 
     341+               return; 
     342+ 
     343+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, 
     344+                     PCIE2_CAP_DEVSTSCTRL2_OFFSET); 
     345+       devstsctr2 = pcie2_read32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA); 
     346+       if (devstsctr2 & PCIE2_CAP_DEVSTSCTRL2_LTRENAB) { 
     347+               /* force the right LTR values */ 
     348+               bcma_core_pcie2_set_ltr_vals(pcie2); 
     349+ 
     350+               /* TODO: 
     351+               si_core_wrapperreg(pcie2, 3, 0x60, 0x8080, 0); */ 
     352+ 
     353+               /* enable the LTR */ 
     354+               devstsctr2 |= PCIE2_CAP_DEVSTSCTRL2_LTRENAB; 
     355+               pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, 
     356+                             PCIE2_CAP_DEVSTSCTRL2_OFFSET); 
     357+               pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, devstsctr2); 
     358+ 
     359+               /* set the LTR state to be active */ 
     360+               pcie2_write32(pcie2, BCMA_CORE_PCIE2_LTR_STATE, 
     361+                             PCIE2_LTR_ACTIVE); 
     362+               usleep_range(1000, 2000); 
     363+ 
     364+               /* set the LTR state to be sleep */ 
     365+               pcie2_write32(pcie2, BCMA_CORE_PCIE2_LTR_STATE, 
     366+                             PCIE2_LTR_SLEEP); 
     367+               usleep_range(1000, 2000); 
     368+       } 
     369+} 
     370+ 
     371+static void pciedev_crwlpciegen2(struct bcma_drv_pcie2 *pcie2) 
     372+{ 
     373+       u8 core_rev = pcie2->core->id.rev; 
     374+       bool pciewar160, pciewar162; 
     375+ 
     376+       pciewar160 = core_rev == 7 || core_rev == 9 || core_rev == 11; 
     377+       pciewar162 = core_rev == 5 || core_rev == 7 || core_rev == 8 || 
     378+                    core_rev == 9 || core_rev == 11; 
     379+ 
     380+       if (!pciewar160 && !pciewar162) 
     381+               return; 
     382+ 
     383+/* TODO */ 
     384+#if 0 
     385+       pcie2_set32(pcie2, BCMA_CORE_PCIE2_CLK_CONTROL, 
     386+                   PCIE_DISABLE_L1CLK_GATING); 
     387+#if 0 
     388+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, 
     389+                     PCIEGEN2_COE_PVT_TL_CTRL_0); 
     390+       pcie2_mask32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, 
     391+                    ~(1 << COE_PVT_TL_CTRL_0_PM_DIS_L1_REENTRY_BIT)); 
     392+#endif 
     393+#endif 
     394+} 
     395+ 
     396+static void pciedev_crwlpciegen2_180(struct bcma_drv_pcie2 *pcie2) 
     397+{ 
     398+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, PCIE2_PMCR_REFUP); 
     399+       pcie2_set32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, 0x1f); 
     400+} 
     401+ 
     402+static void pciedev_crwlpciegen2_182(struct bcma_drv_pcie2 *pcie2) 
     403+{ 
     404+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, PCIE2_SBMBX); 
     405+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, 1 << 0); 
     406+} 
     407+ 
     408+static void pciedev_reg_pm_clk_period(struct bcma_drv_pcie2 *pcie2) 
     409+{ 
     410+       struct bcma_drv_cc *drv_cc = &pcie2->core->bus->drv_cc; 
     411+       u8 core_rev = pcie2->core->id.rev; 
     412+       u32 alp_khz, pm_value; 
     413+ 
     414+       if (core_rev <= 13) { 
     415+               alp_khz = bcma_pmu_get_alp_clock(drv_cc) / 1000; 
     416+               pm_value = (1000000 * 2) / alp_khz; 
     417+               pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, 
     418+                             PCIE2_PVT_REG_PM_CLK_PERIOD); 
     419+               pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, pm_value); 
     420+       } 
     421+} 
     422+ 
     423+void bcma_core_pcie2_init(struct bcma_drv_pcie2 *pcie2) 
     424+{ 
     425+       struct bcma_chipinfo *ci = &pcie2->core->bus->chipinfo; 
     426+       u32 tmp; 
     427+ 
     428+       tmp = pcie2_read32(pcie2, BCMA_CORE_PCIE2_SPROM(54)); 
     429+       if ((tmp & 0xe) >> 1 == 2) 
     430+               bcma_core_pcie2_cfg_write(pcie2, 0x4e0, 0x17); 
     431+ 
     432+       /* TODO: Do we need pcie_reqsize? */ 
     433+ 
     434+       if (ci->id == BCMA_CHIP_ID_BCM4360 && ci->rev > 3) 
     435+               bcma_core_pcie2_war_delay_perst_enab(pcie2, true); 
     436+       bcma_core_pcie2_hw_ltr_war(pcie2); 
     437+       pciedev_crwlpciegen2(pcie2); 
     438+       pciedev_reg_pm_clk_period(pcie2); 
     439+       pciedev_crwlpciegen2_180(pcie2); 
     440+       pciedev_crwlpciegen2_182(pcie2); 
     441+} 
    243442--- a/drivers/bcma/host_pci.c 
    244443+++ b/drivers/bcma/host_pci.c 
     
    260459        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4313) }, 
    261460        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 43224) }, 
     461@@ -280,6 +279,7 @@ static DEFINE_PCI_DEVICE_TABLE(bcma_pci_ 
     462        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4358) }, 
     463        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4359) }, 
     464        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4365) }, 
     465+       { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43a9) }, 
     466        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4727) }, 
     467        { 0, }, 
     468 }; 
    262469--- a/drivers/bcma/main.c 
    263470+++ b/drivers/bcma/main.c 
     
    289496 bool bcma_wait_value(struct bcma_device *core, u16 reg, u32 mask, u32 value, 
    290497                     int timeout) 
    291 @@ -176,6 +165,7 @@ static int bcma_register_cores(struct bc 
     498@@ -143,6 +132,7 @@ static int bcma_register_cores(struct bc 
     499                case BCMA_CORE_CHIPCOMMON: 
     500                case BCMA_CORE_PCI: 
     501                case BCMA_CORE_PCIE: 
     502+               case BCMA_CORE_PCIE2: 
     503                case BCMA_CORE_MIPS_74K: 
     504                case BCMA_CORE_4706_MAC_GBIT_COMMON: 
     505                        continue; 
     506@@ -176,6 +166,7 @@ static int bcma_register_cores(struct bc 
    292507                        bcma_err(bus, 
    293508                                 "Could not register dev for core 0x%03X\n", 
     
    297512                } 
    298513                core->dev_registered = true; 
     514@@ -291,6 +282,13 @@ int bcma_bus_register(struct bcma_bus *b 
     515                bcma_core_pci_init(&bus->drv_pci[1]); 
     516        } 
     517  
     518+       /* Init PCIe Gen 2 core */ 
     519+       core = bcma_find_core_unit(bus, BCMA_CORE_PCIE2, 0); 
     520+       if (core) { 
     521+               bus->drv_pcie2.core = core; 
     522+               bcma_core_pcie2_init(&bus->drv_pcie2); 
     523+       } 
     524+ 
     525        /* Init GBIT MAC COMMON core */ 
     526        core = bcma_find_core(bus, BCMA_CORE_4706_MAC_GBIT_COMMON); 
     527        if (core) { 
     528--- a/drivers/bcma/sprom.c 
     529+++ b/drivers/bcma/sprom.c 
     530@@ -201,6 +201,23 @@ static int bcma_sprom_valid(struct bcma_ 
     531                SPEX(_field[7], _offset + 14, _mask, _shift);   \ 
     532        } while (0) 
     533  
     534+static s8 sprom_extract_antgain(const u16 *in, u16 offset, u16 mask, u16 shift) 
     535+{ 
     536+       u16 v; 
     537+       u8 gain; 
     538+ 
     539+       v = in[SPOFF(offset)]; 
     540+       gain = (v & mask) >> shift; 
     541+       if (gain == 0xFF) { 
     542+               gain = 8; /* If unset use 2dBm */ 
     543+       } else { 
     544+               /* Q5.2 Fractional part is stored in 0xC0 */ 
     545+               gain = ((gain & 0xC0) >> 6) | ((gain & 0x3F) << 2); 
     546+       } 
     547+ 
     548+       return (s8)gain; 
     549+} 
     550+ 
     551 static void bcma_sprom_extract_r8(struct bcma_bus *bus, const u16 *sprom) 
     552 { 
     553        u16 v, o; 
     554@@ -381,14 +398,22 @@ static void bcma_sprom_extract_r8(struct 
     555        SPEX32(ofdm5ghpo, SSB_SPROM8_OFDM5GHPO, ~0, 0); 
     556  
     557        /* Extract the antenna gain values. */ 
     558-       SPEX(antenna_gain.a0, SSB_SPROM8_AGAIN01, 
     559-            SSB_SPROM8_AGAIN0, SSB_SPROM8_AGAIN0_SHIFT); 
     560-       SPEX(antenna_gain.a1, SSB_SPROM8_AGAIN01, 
     561-            SSB_SPROM8_AGAIN1, SSB_SPROM8_AGAIN1_SHIFT); 
     562-       SPEX(antenna_gain.a2, SSB_SPROM8_AGAIN23, 
     563-            SSB_SPROM8_AGAIN2, SSB_SPROM8_AGAIN2_SHIFT); 
     564-       SPEX(antenna_gain.a3, SSB_SPROM8_AGAIN23, 
     565-            SSB_SPROM8_AGAIN3, SSB_SPROM8_AGAIN3_SHIFT); 
     566+       bus->sprom.antenna_gain.a0 = sprom_extract_antgain(sprom, 
     567+                                                          SSB_SPROM8_AGAIN01, 
     568+                                                          SSB_SPROM8_AGAIN0, 
     569+                                                          SSB_SPROM8_AGAIN0_SHIFT); 
     570+       bus->sprom.antenna_gain.a1 = sprom_extract_antgain(sprom, 
     571+                                                          SSB_SPROM8_AGAIN01, 
     572+                                                          SSB_SPROM8_AGAIN1, 
     573+                                                          SSB_SPROM8_AGAIN1_SHIFT); 
     574+       bus->sprom.antenna_gain.a2 = sprom_extract_antgain(sprom, 
     575+                                                          SSB_SPROM8_AGAIN23, 
     576+                                                          SSB_SPROM8_AGAIN2, 
     577+                                                          SSB_SPROM8_AGAIN2_SHIFT); 
     578+       bus->sprom.antenna_gain.a3 = sprom_extract_antgain(sprom, 
     579+                                                          SSB_SPROM8_AGAIN23, 
     580+                                                          SSB_SPROM8_AGAIN3, 
     581+                                                          SSB_SPROM8_AGAIN3_SHIFT); 
     582  
     583        SPEX(leddc_on_time, SSB_SPROM8_LEDDC, SSB_SPROM8_LEDDC_ON, 
     584             SSB_SPROM8_LEDDC_ON_SHIFT); 
     585@@ -509,6 +534,7 @@ static bool bcma_sprom_onchip_available( 
     586                /* for these chips OTP is always available */ 
     587                present = true; 
     588                break; 
     589+       case BCMA_CHIP_ID_BCM43217: 
     590        case BCMA_CHIP_ID_BCM43227: 
     591        case BCMA_CHIP_ID_BCM43228: 
     592        case BCMA_CHIP_ID_BCM43428: 
    299593--- a/include/linux/bcma/bcma.h 
    300594+++ b/include/linux/bcma/bcma.h 
    301 @@ -418,7 +418,14 @@ static inline void bcma_maskset16(struct 
     595@@ -6,6 +6,7 @@ 
     596  
     597 #include <linux/bcma/bcma_driver_chipcommon.h> 
     598 #include <linux/bcma/bcma_driver_pci.h> 
     599+#include <linux/bcma/bcma_driver_pcie2.h> 
     600 #include <linux/bcma/bcma_driver_mips.h> 
     601 #include <linux/bcma/bcma_driver_gmac_cmn.h> 
     602 #include <linux/ssb/ssb.h> /* SPROM sharing */ 
     603@@ -157,6 +158,8 @@ struct bcma_host_ops { 
     604 /* Chip IDs of PCIe devices */ 
     605 #define BCMA_CHIP_ID_BCM4313   0x4313 
     606 #define BCMA_CHIP_ID_BCM43142  43142 
     607+#define BCMA_CHIP_ID_BCM43217  43217 
     608+#define BCMA_CHIP_ID_BCM43222  43222 
     609 #define BCMA_CHIP_ID_BCM43224  43224 
     610 #define  BCMA_PKG_ID_BCM43224_FAB_CSM  0x8 
     611 #define  BCMA_PKG_ID_BCM43224_FAB_SMIC 0xa 
     612@@ -333,6 +336,7 @@ struct bcma_bus { 
     613  
     614        struct bcma_drv_cc drv_cc; 
     615        struct bcma_drv_pci drv_pci[2]; 
     616+       struct bcma_drv_pcie2 drv_pcie2; 
     617        struct bcma_drv_mips drv_mips; 
     618        struct bcma_drv_gmac_cmn drv_gmac_cmn; 
     619  
     620@@ -418,7 +422,14 @@ static inline void bcma_maskset16(struct 
    302621        bcma_write16(cc, offset, (bcma_read16(cc, offset) & mask) | set); 
    303622 } 
     
    325644 }; 
    326645  
     646--- /dev/null 
     647+++ b/include/linux/bcma/bcma_driver_pcie2.h 
     648@@ -0,0 +1,158 @@ 
     649+#ifndef LINUX_BCMA_DRIVER_PCIE2_H_ 
     650+#define LINUX_BCMA_DRIVER_PCIE2_H_ 
     651+ 
     652+#define BCMA_CORE_PCIE2_CLK_CONTROL            0x0000 
     653+#define  PCIE2_CLKC_RST_OE                     0x0001 /* When set, drives PCI_RESET out to pin */ 
     654+#define  PCIE2_CLKC_RST                                0x0002 /* Value driven out to pin */ 
     655+#define  PCIE2_CLKC_SPERST                     0x0004 /* SurvivePeRst */ 
     656+#define  PCIE2_CLKC_DISABLE_L1CLK_GATING       0x0010 
     657+#define  PCIE2_CLKC_DLYPERST                   0x0100 /* Delay PeRst to CoE Core */ 
     658+#define  PCIE2_CLKC_DISSPROMLD                 0x0200 /* DisableSpromLoadOnPerst */ 
     659+#define  PCIE2_CLKC_WAKE_MODE_L2               0x1000 /* Wake on L2 */ 
     660+#define BCMA_CORE_PCIE2_RC_PM_CONTROL          0x0004 
     661+#define BCMA_CORE_PCIE2_RC_PM_STATUS           0x0008 
     662+#define BCMA_CORE_PCIE2_EP_PM_CONTROL          0x000C 
     663+#define BCMA_CORE_PCIE2_EP_PM_STATUS           0x0010 
     664+#define BCMA_CORE_PCIE2_EP_LTR_CONTROL         0x0014 
     665+#define BCMA_CORE_PCIE2_EP_LTR_STATUS          0x0018 
     666+#define BCMA_CORE_PCIE2_EP_OBFF_STATUS         0x001C 
     667+#define BCMA_CORE_PCIE2_PCIE_ERR_STATUS                0x0020 
     668+#define BCMA_CORE_PCIE2_RC_AXI_CONFIG          0x0100 
     669+#define BCMA_CORE_PCIE2_EP_AXI_CONFIG          0x0104 
     670+#define BCMA_CORE_PCIE2_RXDEBUG_STATUS0                0x0108 
     671+#define BCMA_CORE_PCIE2_RXDEBUG_CONTROL0       0x010C 
     672+#define BCMA_CORE_PCIE2_CONFIGINDADDR          0x0120 
     673+#define BCMA_CORE_PCIE2_CONFIGINDDATA          0x0124 
     674+#define BCMA_CORE_PCIE2_MDIOCONTROL            0x0128 
     675+#define BCMA_CORE_PCIE2_MDIOWRDATA             0x012C 
     676+#define BCMA_CORE_PCIE2_MDIORDDATA             0x0130 
     677+#define BCMA_CORE_PCIE2_DATAINTF               0x0180 
     678+#define BCMA_CORE_PCIE2_D2H_INTRLAZY_0         0x0188 
     679+#define BCMA_CORE_PCIE2_H2D_INTRLAZY_0         0x018c 
     680+#define BCMA_CORE_PCIE2_H2D_INTSTAT_0          0x0190 
     681+#define BCMA_CORE_PCIE2_H2D_INTMASK_0          0x0194 
     682+#define BCMA_CORE_PCIE2_D2H_INTSTAT_0          0x0198 
     683+#define BCMA_CORE_PCIE2_D2H_INTMASK_0          0x019c 
     684+#define BCMA_CORE_PCIE2_LTR_STATE              0x01A0 /* Latency Tolerance Reporting */ 
     685+#define  PCIE2_LTR_ACTIVE                      2 
     686+#define  PCIE2_LTR_ACTIVE_IDLE                 1 
     687+#define  PCIE2_LTR_SLEEP                       0 
     688+#define  PCIE2_LTR_FINAL_MASK                  0x300 
     689+#define  PCIE2_LTR_FINAL_SHIFT                 8 
     690+#define BCMA_CORE_PCIE2_PWR_INT_STATUS         0x01A4 
     691+#define BCMA_CORE_PCIE2_PWR_INT_MASK           0x01A8 
     692+#define BCMA_CORE_PCIE2_CFG_ADDR               0x01F8 
     693+#define BCMA_CORE_PCIE2_CFG_DATA               0x01FC 
     694+#define BCMA_CORE_PCIE2_SYS_EQ_PAGE            0x0200 
     695+#define BCMA_CORE_PCIE2_SYS_MSI_PAGE           0x0204 
     696+#define BCMA_CORE_PCIE2_SYS_MSI_INTREN         0x0208 
     697+#define BCMA_CORE_PCIE2_SYS_MSI_CTRL0          0x0210 
     698+#define BCMA_CORE_PCIE2_SYS_MSI_CTRL1          0x0214 
     699+#define BCMA_CORE_PCIE2_SYS_MSI_CTRL2          0x0218 
     700+#define BCMA_CORE_PCIE2_SYS_MSI_CTRL3          0x021C 
     701+#define BCMA_CORE_PCIE2_SYS_MSI_CTRL4          0x0220 
     702+#define BCMA_CORE_PCIE2_SYS_MSI_CTRL5          0x0224 
     703+#define BCMA_CORE_PCIE2_SYS_EQ_HEAD0           0x0250 
     704+#define BCMA_CORE_PCIE2_SYS_EQ_TAIL0           0x0254 
     705+#define BCMA_CORE_PCIE2_SYS_EQ_HEAD1           0x0258 
     706+#define BCMA_CORE_PCIE2_SYS_EQ_TAIL1           0x025C 
     707+#define BCMA_CORE_PCIE2_SYS_EQ_HEAD2           0x0260 
     708+#define BCMA_CORE_PCIE2_SYS_EQ_TAIL2           0x0264 
     709+#define BCMA_CORE_PCIE2_SYS_EQ_HEAD3           0x0268 
     710+#define BCMA_CORE_PCIE2_SYS_EQ_TAIL3           0x026C 
     711+#define BCMA_CORE_PCIE2_SYS_EQ_HEAD4           0x0270 
     712+#define BCMA_CORE_PCIE2_SYS_EQ_TAIL4           0x0274 
     713+#define BCMA_CORE_PCIE2_SYS_EQ_HEAD5           0x0278 
     714+#define BCMA_CORE_PCIE2_SYS_EQ_TAIL5           0x027C 
     715+#define BCMA_CORE_PCIE2_SYS_RC_INTX_EN         0x0330 
     716+#define BCMA_CORE_PCIE2_SYS_RC_INTX_CSR                0x0334 
     717+#define BCMA_CORE_PCIE2_SYS_MSI_REQ            0x0340 
     718+#define BCMA_CORE_PCIE2_SYS_HOST_INTR_EN       0x0344 
     719+#define BCMA_CORE_PCIE2_SYS_HOST_INTR_CSR      0x0348 
     720+#define BCMA_CORE_PCIE2_SYS_HOST_INTR0         0x0350 
     721+#define BCMA_CORE_PCIE2_SYS_HOST_INTR1         0x0354 
     722+#define BCMA_CORE_PCIE2_SYS_HOST_INTR2         0x0358 
     723+#define BCMA_CORE_PCIE2_SYS_HOST_INTR3         0x035C 
     724+#define BCMA_CORE_PCIE2_SYS_EP_INT_EN0         0x0360 
     725+#define BCMA_CORE_PCIE2_SYS_EP_INT_EN1         0x0364 
     726+#define BCMA_CORE_PCIE2_SYS_EP_INT_CSR0                0x0370 
     727+#define BCMA_CORE_PCIE2_SYS_EP_INT_CSR1                0x0374 
     728+#define BCMA_CORE_PCIE2_SPROM(wordoffset)      (0x0800 + ((wordoffset) * 2)) 
     729+#define BCMA_CORE_PCIE2_FUNC0_IMAP0_0          0x0C00 
     730+#define BCMA_CORE_PCIE2_FUNC0_IMAP0_1          0x0C04 
     731+#define BCMA_CORE_PCIE2_FUNC0_IMAP0_2          0x0C08 
     732+#define BCMA_CORE_PCIE2_FUNC0_IMAP0_3          0x0C0C 
     733+#define BCMA_CORE_PCIE2_FUNC0_IMAP0_4          0x0C10 
     734+#define BCMA_CORE_PCIE2_FUNC0_IMAP0_5          0x0C14 
     735+#define BCMA_CORE_PCIE2_FUNC0_IMAP0_6          0x0C18 
     736+#define BCMA_CORE_PCIE2_FUNC0_IMAP0_7          0x0C1C 
     737+#define BCMA_CORE_PCIE2_FUNC1_IMAP0_0          0x0C20 
     738+#define BCMA_CORE_PCIE2_FUNC1_IMAP0_1          0x0C24 
     739+#define BCMA_CORE_PCIE2_FUNC1_IMAP0_2          0x0C28 
     740+#define BCMA_CORE_PCIE2_FUNC1_IMAP0_3          0x0C2C 
     741+#define BCMA_CORE_PCIE2_FUNC1_IMAP0_4          0x0C30 
     742+#define BCMA_CORE_PCIE2_FUNC1_IMAP0_5          0x0C34 
     743+#define BCMA_CORE_PCIE2_FUNC1_IMAP0_6          0x0C38 
     744+#define BCMA_CORE_PCIE2_FUNC1_IMAP0_7          0x0C3C 
     745+#define BCMA_CORE_PCIE2_FUNC0_IMAP1            0x0C80 
     746+#define BCMA_CORE_PCIE2_FUNC1_IMAP1            0x0C88 
     747+#define BCMA_CORE_PCIE2_FUNC0_IMAP2            0x0CC0 
     748+#define BCMA_CORE_PCIE2_FUNC1_IMAP2            0x0CC8 
     749+#define BCMA_CORE_PCIE2_IARR0_LOWER            0x0D00 
     750+#define BCMA_CORE_PCIE2_IARR0_UPPER            0x0D04 
     751+#define BCMA_CORE_PCIE2_IARR1_LOWER            0x0D08 
     752+#define BCMA_CORE_PCIE2_IARR1_UPPER            0x0D0C 
     753+#define BCMA_CORE_PCIE2_IARR2_LOWER            0x0D10 
     754+#define BCMA_CORE_PCIE2_IARR2_UPPER            0x0D14 
     755+#define BCMA_CORE_PCIE2_OARR0                  0x0D20 
     756+#define BCMA_CORE_PCIE2_OARR1                  0x0D28 
     757+#define BCMA_CORE_PCIE2_OARR2                  0x0D30 
     758+#define BCMA_CORE_PCIE2_OMAP0_LOWER            0x0D40 
     759+#define BCMA_CORE_PCIE2_OMAP0_UPPER            0x0D44 
     760+#define BCMA_CORE_PCIE2_OMAP1_LOWER            0x0D48 
     761+#define BCMA_CORE_PCIE2_OMAP1_UPPER            0x0D4C 
     762+#define BCMA_CORE_PCIE2_OMAP2_LOWER            0x0D50 
     763+#define BCMA_CORE_PCIE2_OMAP2_UPPER            0x0D54 
     764+#define BCMA_CORE_PCIE2_FUNC1_IARR1_SIZE       0x0D58 
     765+#define BCMA_CORE_PCIE2_FUNC1_IARR2_SIZE       0x0D5C 
     766+#define BCMA_CORE_PCIE2_MEM_CONTROL            0x0F00 
     767+#define BCMA_CORE_PCIE2_MEM_ECC_ERRLOG0                0x0F04 
     768+#define BCMA_CORE_PCIE2_MEM_ECC_ERRLOG1                0x0F08 
     769+#define BCMA_CORE_PCIE2_LINK_STATUS            0x0F0C 
     770+#define BCMA_CORE_PCIE2_STRAP_STATUS           0x0F10 
     771+#define BCMA_CORE_PCIE2_RESET_STATUS           0x0F14 
     772+#define BCMA_CORE_PCIE2_RESETEN_IN_LINKDOWN    0x0F18 
     773+#define BCMA_CORE_PCIE2_MISC_INTR_EN           0x0F1C 
     774+#define BCMA_CORE_PCIE2_TX_DEBUG_CFG           0x0F20 
     775+#define BCMA_CORE_PCIE2_MISC_CONFIG            0x0F24 
     776+#define BCMA_CORE_PCIE2_MISC_STATUS            0x0F28 
     777+#define BCMA_CORE_PCIE2_INTR_EN                        0x0F30 
     778+#define BCMA_CORE_PCIE2_INTR_CLEAR             0x0F34 
     779+#define BCMA_CORE_PCIE2_INTR_STATUS            0x0F38 
     780+ 
     781+/* PCIE gen2 config regs */ 
     782+#define PCIE2_INTSTATUS                                0x090 
     783+#define PCIE2_INTMASK                          0x094 
     784+#define PCIE2_SBMBX                            0x098 
     785+ 
     786+#define PCIE2_PMCR_REFUP                       0x1814 /* Trefup time */ 
     787+ 
     788+#define PCIE2_CAP_DEVSTSCTRL2_OFFSET           0xD4 
     789+#define PCIE2_CAP_DEVSTSCTRL2_LTRENAB          0x400 
     790+#define PCIE2_PVT_REG_PM_CLK_PERIOD            0x184c 
     791+ 
     792+struct bcma_drv_pcie2 { 
     793+       struct bcma_device *core; 
     794+}; 
     795+ 
     796+#define pcie2_read16(pcie2, offset)            bcma_read16((pcie2)->core, offset) 
     797+#define pcie2_read32(pcie2, offset)            bcma_read32((pcie2)->core, offset) 
     798+#define pcie2_write16(pcie2, offset, val)      bcma_write16((pcie2)->core, offset, val) 
     799+#define pcie2_write32(pcie2, offset, val)      bcma_write32((pcie2)->core, offset, val) 
     800+ 
     801+#define pcie2_set32(pcie2, offset, set)                bcma_set32((pcie2)->core, offset, set) 
     802+#define pcie2_mask32(pcie2, offset, mask)      bcma_mask32((pcie2)->core, offset, mask) 
     803+ 
     804+void bcma_core_pcie2_init(struct bcma_drv_pcie2 *pcie2); 
     805+ 
     806+#endif /* LINUX_BCMA_DRIVER_PCIE2_H_ */ 
  • trunk/target/linux/generic/patches-3.14/020-ssb_update.patch

    r40833 r41804  
    1 commit 4f4aa2ec24dc45881849833a439558d3a378028c 
    2 Author: Rafał Miłecki <zajec5@gmail.com> 
    3 Date:   Sun May 18 00:22:38 2014 +0200 
    4  
    5     ssb: sprom: add dev_id field for value overriding standard ID 
    6      
    7     Some devices may have different features despite sharing the same ID 
    8     (e.g. PCI ID). For example 14e4:4331 is usually a dual band, but this 
    9     can be "limited". Device with "pci/x/y/devid=0x4332" supports 2.4 GHz 
    10     only. Similarly 0x4333 will mean support for 5 GHz only. 
    11     Add entry in SPROM so info described above can be extracted and stored. 
    12      
    13     Signed-off-by: Rafał Miłecki <zajec5@gmail.com> 
    14     Acked-by: Hauke Mehrtens <hauke@hauke-m.de> 
    15     Signed-off-by: John W. Linville <linville@tuxdriver.com> 
    16  
     1--- a/drivers/ssb/pci.c 
     2+++ b/drivers/ssb/pci.c 
     3@@ -326,13 +326,13 @@ err_ctlreg: 
     4        return err; 
     5 } 
     6  
     7-static s8 r123_extract_antgain(u8 sprom_revision, const u16 *in, 
     8-                              u16 mask, u16 shift) 
     9+static s8 sprom_extract_antgain(u8 sprom_revision, const u16 *in, u16 offset, 
     10+                               u16 mask, u16 shift) 
     11 { 
     12        u16 v; 
     13        u8 gain; 
     14  
     15-       v = in[SPOFF(SSB_SPROM1_AGAIN)]; 
     16+       v = in[SPOFF(offset)]; 
     17        gain = (v & mask) >> shift; 
     18        if (gain == 0xFF) 
     19                gain = 2; /* If unset use 2dBm */ 
     20@@ -416,12 +416,14 @@ static void sprom_extract_r123(struct ss 
     21        SPEX(alpha2[1], SSB_SPROM1_CCODE, 0x00ff, 0); 
     22  
     23        /* Extract the antenna gain values. */ 
     24-       out->antenna_gain.a0 = r123_extract_antgain(out->revision, in, 
     25-                                                   SSB_SPROM1_AGAIN_BG, 
     26-                                                   SSB_SPROM1_AGAIN_BG_SHIFT); 
     27-       out->antenna_gain.a1 = r123_extract_antgain(out->revision, in, 
     28-                                                   SSB_SPROM1_AGAIN_A, 
     29-                                                   SSB_SPROM1_AGAIN_A_SHIFT); 
     30+       out->antenna_gain.a0 = sprom_extract_antgain(out->revision, in, 
     31+                                                    SSB_SPROM1_AGAIN, 
     32+                                                    SSB_SPROM1_AGAIN_BG, 
     33+                                                    SSB_SPROM1_AGAIN_BG_SHIFT); 
     34+       out->antenna_gain.a1 = sprom_extract_antgain(out->revision, in, 
     35+                                                    SSB_SPROM1_AGAIN, 
     36+                                                    SSB_SPROM1_AGAIN_A, 
     37+                                                    SSB_SPROM1_AGAIN_A_SHIFT); 
     38        if (out->revision >= 2) 
     39                sprom_extract_r23(out, in); 
     40 } 
     41@@ -468,7 +470,15 @@ static void sprom_extract_r458(struct ss 
     42  
     43 static void sprom_extract_r45(struct ssb_sprom *out, const u16 *in) 
     44 { 
     45+       static const u16 pwr_info_offset[] = { 
     46+               SSB_SPROM4_PWR_INFO_CORE0, SSB_SPROM4_PWR_INFO_CORE1, 
     47+               SSB_SPROM4_PWR_INFO_CORE2, SSB_SPROM4_PWR_INFO_CORE3 
     48+       }; 
     49        u16 il0mac_offset; 
     50+       int i; 
     51+ 
     52+       BUILD_BUG_ON(ARRAY_SIZE(pwr_info_offset) != 
     53+                    ARRAY_SIZE(out->core_pwr_info)); 
     54  
     55        if (out->revision == 4) 
     56                il0mac_offset = SSB_SPROM4_IL0MAC; 
     57@@ -524,14 +534,59 @@ static void sprom_extract_r45(struct ssb 
     58        } 
     59  
     60        /* Extract the antenna gain values. */ 
     61-       SPEX(antenna_gain.a0, SSB_SPROM4_AGAIN01, 
     62-            SSB_SPROM4_AGAIN0, SSB_SPROM4_AGAIN0_SHIFT); 
     63-       SPEX(antenna_gain.a1, SSB_SPROM4_AGAIN01, 
     64-            SSB_SPROM4_AGAIN1, SSB_SPROM4_AGAIN1_SHIFT); 
     65-       SPEX(antenna_gain.a2, SSB_SPROM4_AGAIN23, 
     66-            SSB_SPROM4_AGAIN2, SSB_SPROM4_AGAIN2_SHIFT); 
     67-       SPEX(antenna_gain.a3, SSB_SPROM4_AGAIN23, 
     68-            SSB_SPROM4_AGAIN3, SSB_SPROM4_AGAIN3_SHIFT); 
     69+       out->antenna_gain.a0 = sprom_extract_antgain(out->revision, in, 
     70+                                                    SSB_SPROM4_AGAIN01, 
     71+                                                    SSB_SPROM4_AGAIN0, 
     72+                                                    SSB_SPROM4_AGAIN0_SHIFT); 
     73+       out->antenna_gain.a1 = sprom_extract_antgain(out->revision, in, 
     74+                                                    SSB_SPROM4_AGAIN01, 
     75+                                                    SSB_SPROM4_AGAIN1, 
     76+                                                    SSB_SPROM4_AGAIN1_SHIFT); 
     77+       out->antenna_gain.a2 = sprom_extract_antgain(out->revision, in, 
     78+                                                    SSB_SPROM4_AGAIN23, 
     79+                                                    SSB_SPROM4_AGAIN2, 
     80+                                                    SSB_SPROM4_AGAIN2_SHIFT); 
     81+       out->antenna_gain.a3 = sprom_extract_antgain(out->revision, in, 
     82+                                                    SSB_SPROM4_AGAIN23, 
     83+                                                    SSB_SPROM4_AGAIN3, 
     84+                                                    SSB_SPROM4_AGAIN3_SHIFT); 
     85+ 
     86+       /* Extract cores power info info */ 
     87+       for (i = 0; i < ARRAY_SIZE(pwr_info_offset); i++) { 
     88+               u16 o = pwr_info_offset[i]; 
     89+ 
     90+               SPEX(core_pwr_info[i].itssi_2g, o + SSB_SPROM4_2G_MAXP_ITSSI, 
     91+                       SSB_SPROM4_2G_ITSSI, SSB_SPROM4_2G_ITSSI_SHIFT); 
     92+               SPEX(core_pwr_info[i].maxpwr_2g, o + SSB_SPROM4_2G_MAXP_ITSSI, 
     93+                       SSB_SPROM4_2G_MAXP, 0); 
     94+ 
     95+               SPEX(core_pwr_info[i].pa_2g[0], o + SSB_SPROM4_2G_PA_0, ~0, 0); 
     96+               SPEX(core_pwr_info[i].pa_2g[1], o + SSB_SPROM4_2G_PA_1, ~0, 0); 
     97+               SPEX(core_pwr_info[i].pa_2g[2], o + SSB_SPROM4_2G_PA_2, ~0, 0); 
     98+               SPEX(core_pwr_info[i].pa_2g[3], o + SSB_SPROM4_2G_PA_3, ~0, 0); 
     99+ 
     100+               SPEX(core_pwr_info[i].itssi_5g, o + SSB_SPROM4_5G_MAXP_ITSSI, 
     101+                       SSB_SPROM4_5G_ITSSI, SSB_SPROM4_5G_ITSSI_SHIFT); 
     102+               SPEX(core_pwr_info[i].maxpwr_5g, o + SSB_SPROM4_5G_MAXP_ITSSI, 
     103+                       SSB_SPROM4_5G_MAXP, 0); 
     104+               SPEX(core_pwr_info[i].maxpwr_5gh, o + SSB_SPROM4_5GHL_MAXP, 
     105+                       SSB_SPROM4_5GH_MAXP, 0); 
     106+               SPEX(core_pwr_info[i].maxpwr_5gl, o + SSB_SPROM4_5GHL_MAXP, 
     107+                       SSB_SPROM4_5GL_MAXP, SSB_SPROM4_5GL_MAXP_SHIFT); 
     108+ 
     109+               SPEX(core_pwr_info[i].pa_5gl[0], o + SSB_SPROM4_5GL_PA_0, ~0, 0); 
     110+               SPEX(core_pwr_info[i].pa_5gl[1], o + SSB_SPROM4_5GL_PA_1, ~0, 0); 
     111+               SPEX(core_pwr_info[i].pa_5gl[2], o + SSB_SPROM4_5GL_PA_2, ~0, 0); 
     112+               SPEX(core_pwr_info[i].pa_5gl[3], o + SSB_SPROM4_5GL_PA_3, ~0, 0); 
     113+               SPEX(core_pwr_info[i].pa_5g[0], o + SSB_SPROM4_5G_PA_0, ~0, 0); 
     114+               SPEX(core_pwr_info[i].pa_5g[1], o + SSB_SPROM4_5G_PA_1, ~0, 0); 
     115+               SPEX(core_pwr_info[i].pa_5g[2], o + SSB_SPROM4_5G_PA_2, ~0, 0); 
     116+               SPEX(core_pwr_info[i].pa_5g[3], o + SSB_SPROM4_5G_PA_3, ~0, 0); 
     117+               SPEX(core_pwr_info[i].pa_5gh[0], o + SSB_SPROM4_5GH_PA_0, ~0, 0); 
     118+               SPEX(core_pwr_info[i].pa_5gh[1], o + SSB_SPROM4_5GH_PA_1, ~0, 0); 
     119+               SPEX(core_pwr_info[i].pa_5gh[2], o + SSB_SPROM4_5GH_PA_2, ~0, 0); 
     120+               SPEX(core_pwr_info[i].pa_5gh[3], o + SSB_SPROM4_5GH_PA_3, ~0, 0); 
     121+       } 
     122  
     123        sprom_extract_r458(out, in); 
     124  
     125@@ -621,14 +676,22 @@ static void sprom_extract_r8(struct ssb_ 
     126        SPEX32(ofdm5ghpo, SSB_SPROM8_OFDM5GHPO, 0xFFFFFFFF, 0); 
     127  
     128        /* Extract the antenna gain values. */ 
     129-       SPEX(antenna_gain.a0, SSB_SPROM8_AGAIN01, 
     130-            SSB_SPROM8_AGAIN0, SSB_SPROM8_AGAIN0_SHIFT); 
     131-       SPEX(antenna_gain.a1, SSB_SPROM8_AGAIN01, 
     132-            SSB_SPROM8_AGAIN1, SSB_SPROM8_AGAIN1_SHIFT); 
     133-       SPEX(antenna_gain.a2, SSB_SPROM8_AGAIN23, 
     134-            SSB_SPROM8_AGAIN2, SSB_SPROM8_AGAIN2_SHIFT); 
     135-       SPEX(antenna_gain.a3, SSB_SPROM8_AGAIN23, 
     136-            SSB_SPROM8_AGAIN3, SSB_SPROM8_AGAIN3_SHIFT); 
     137+       out->antenna_gain.a0 = sprom_extract_antgain(out->revision, in, 
     138+                                                    SSB_SPROM8_AGAIN01, 
     139+                                                    SSB_SPROM8_AGAIN0, 
     140+                                                    SSB_SPROM8_AGAIN0_SHIFT); 
     141+       out->antenna_gain.a1 = sprom_extract_antgain(out->revision, in, 
     142+                                                    SSB_SPROM8_AGAIN01, 
     143+                                                    SSB_SPROM8_AGAIN1, 
     144+                                                    SSB_SPROM8_AGAIN1_SHIFT); 
     145+       out->antenna_gain.a2 = sprom_extract_antgain(out->revision, in, 
     146+                                                    SSB_SPROM8_AGAIN23, 
     147+                                                    SSB_SPROM8_AGAIN2, 
     148+                                                    SSB_SPROM8_AGAIN2_SHIFT); 
     149+       out->antenna_gain.a3 = sprom_extract_antgain(out->revision, in, 
     150+                                                    SSB_SPROM8_AGAIN23, 
     151+                                                    SSB_SPROM8_AGAIN3, 
     152+                                                    SSB_SPROM8_AGAIN3_SHIFT); 
     153  
     154        /* Extract cores power info info */ 
     155        for (i = 0; i < ARRAY_SIZE(pwr_info_offset); i++) { 
     156--- a/include/linux/ssb/ssb.h 
     157+++ b/include/linux/ssb/ssb.h 
     158@@ -33,6 +33,7 @@ struct ssb_sprom { 
     159        u8 et1phyaddr;          /* MII address for enet1 */ 
     160        u8 et0mdcport;          /* MDIO for enet0 */ 
     161        u8 et1mdcport;          /* MDIO for enet1 */ 
     162+       u16 dev_id;             /* Device ID overriding e.g. PCI ID */ 
     163        u16 board_rev;          /* Board revision number from SPROM. */ 
     164        u16 board_num;          /* Board number from SPROM. */ 
     165        u16 board_type;         /* Board type from SPROM. */ 
     166--- a/include/linux/ssb/ssb_regs.h 
     167+++ b/include/linux/ssb/ssb_regs.h 
     168@@ -345,6 +345,43 @@ 
     169 #define  SSB_SPROM4_TXPID5GH2_SHIFT    0 
     170 #define  SSB_SPROM4_TXPID5GH3          0xFF00 
     171 #define  SSB_SPROM4_TXPID5GH3_SHIFT    8 
     172+ 
     173+/* There are 4 blocks with power info sharing the same layout */ 
     174+#define SSB_SPROM4_PWR_INFO_CORE0      0x0080 
     175+#define SSB_SPROM4_PWR_INFO_CORE1      0x00AE 
     176+#define SSB_SPROM4_PWR_INFO_CORE2      0x00DC 
     177+#define SSB_SPROM4_PWR_INFO_CORE3      0x010A 
     178+ 
     179+#define SSB_SPROM4_2G_MAXP_ITSSI       0x00    /* 2 GHz ITSSI and 2 GHz Max Power */ 
     180+#define  SSB_SPROM4_2G_MAXP            0x00FF 
     181+#define  SSB_SPROM4_2G_ITSSI           0xFF00 
     182+#define  SSB_SPROM4_2G_ITSSI_SHIFT     8 
     183+#define SSB_SPROM4_2G_PA_0             0x02    /* 2 GHz power amp */ 
     184+#define SSB_SPROM4_2G_PA_1             0x04 
     185+#define SSB_SPROM4_2G_PA_2             0x06 
     186+#define SSB_SPROM4_2G_PA_3             0x08 
     187+#define SSB_SPROM4_5G_MAXP_ITSSI       0x0A    /* 5 GHz ITSSI and 5.3 GHz Max Power */ 
     188+#define  SSB_SPROM4_5G_MAXP            0x00FF 
     189+#define  SSB_SPROM4_5G_ITSSI           0xFF00 
     190+#define  SSB_SPROM4_5G_ITSSI_SHIFT     8 
     191+#define SSB_SPROM4_5GHL_MAXP           0x0C    /* 5.2 GHz and 5.8 GHz Max Power */ 
     192+#define  SSB_SPROM4_5GH_MAXP           0x00FF 
     193+#define  SSB_SPROM4_5GL_MAXP           0xFF00 
     194+#define  SSB_SPROM4_5GL_MAXP_SHIFT     8 
     195+#define SSB_SPROM4_5G_PA_0             0x0E    /* 5.3 GHz power amp */ 
     196+#define SSB_SPROM4_5G_PA_1             0x10 
     197+#define SSB_SPROM4_5G_PA_2             0x12 
     198+#define SSB_SPROM4_5G_PA_3             0x14 
     199+#define SSB_SPROM4_5GL_PA_0            0x16    /* 5.2 GHz power amp */ 
     200+#define SSB_SPROM4_5GL_PA_1            0x18 
     201+#define SSB_SPROM4_5GL_PA_2            0x1A 
     202+#define SSB_SPROM4_5GL_PA_3            0x1C 
     203+#define SSB_SPROM4_5GH_PA_0            0x1E    /* 5.8 GHz power amp */ 
     204+#define SSB_SPROM4_5GH_PA_1            0x20 
     205+#define SSB_SPROM4_5GH_PA_2            0x22 
     206+#define SSB_SPROM4_5GH_PA_3            0x24 
     207+ 
     208+/* TODO: Make it deprecated */ 
     209 #define SSB_SPROM4_MAXP_BG             0x0080  /* Max Power BG in path 1 */ 
     210 #define  SSB_SPROM4_MAXP_BG_MASK       0x00FF  /* Mask for Max Power BG */ 
     211 #define  SSB_SPROM4_ITSSI_BG           0xFF00  /* Mask for path 1 itssi_bg */ 
    17212--- a/arch/mips/bcm47xx/sprom.c 
    18213+++ b/arch/mips/bcm47xx/sprom.c 
     
    25220        nvram_read_u8(prefix, NULL, "ledbh1", &sprom->gpio1, 0xff, fallback); 
    26221        nvram_read_u8(prefix, NULL, "ledbh2", &sprom->gpio2, 0xff, fallback); 
    27 --- a/include/linux/ssb/ssb.h 
    28 +++ b/include/linux/ssb/ssb.h 
    29 @@ -33,6 +33,7 @@ struct ssb_sprom { 
    30         u8 et1phyaddr;          /* MII address for enet1 */ 
    31         u8 et0mdcport;          /* MDIO for enet0 */ 
    32         u8 et1mdcport;          /* MDIO for enet1 */ 
    33 +       u16 dev_id;             /* Device ID overriding e.g. PCI ID */ 
    34         u16 board_rev;          /* Board revision number from SPROM. */ 
    35         u16 board_num;          /* Board number from SPROM. */ 
    36         u16 board_type;         /* Board type from SPROM. */ 
  • trunk/target/linux/generic/patches-3.14/025-bcma_backport.patch

    r40347 r41804  
     1--- a/drivers/bcma/Makefile 
     2+++ b/drivers/bcma/Makefile 
     3@@ -3,6 +3,7 @@ bcma-y                                  += driver_chipcommon.o driver 
     4 bcma-$(CONFIG_BCMA_SFLASH)             += driver_chipcommon_sflash.o 
     5 bcma-$(CONFIG_BCMA_NFLASH)             += driver_chipcommon_nflash.o 
     6 bcma-y                                 += driver_pci.o 
     7+bcma-y                                 += driver_pcie2.o 
     8 bcma-$(CONFIG_BCMA_DRIVER_PCI_HOSTMODE)        += driver_pci_host.o 
     9 bcma-$(CONFIG_BCMA_DRIVER_MIPS)                += driver_mips.o 
     10 bcma-$(CONFIG_BCMA_DRIVER_GMAC_CMN)    += driver_gmac_cmn.o 
     11--- a/drivers/bcma/driver_chipcommon_pmu.c 
     12+++ b/drivers/bcma/driver_chipcommon_pmu.c 
     13@@ -603,6 +603,7 @@ void bcma_pmu_spuravoid_pllupdate(struct 
     14                tmp = BCMA_CC_PMU_CTL_PLL_UPD | BCMA_CC_PMU_CTL_NOILPONW; 
     15                break; 
     16  
     17+       case BCMA_CHIP_ID_BCM43217: 
     18        case BCMA_CHIP_ID_BCM43227: 
     19        case BCMA_CHIP_ID_BCM43228: 
     20        case BCMA_CHIP_ID_BCM43428: 
    121--- a/drivers/bcma/driver_gpio.c 
    222+++ b/drivers/bcma/driver_gpio.c 
    3 @@ -218,7 +218,14 @@ int bcma_gpio_init(struct bcma_drv_cc *c 
     23@@ -218,7 +218,15 @@ int bcma_gpio_init(struct bcma_drv_cc *c 
    424 #if IS_BUILTIN(CONFIG_BCMA_HOST_SOC) 
    525        chip->to_irq            = bcma_gpio_to_irq; 
     
    828+       switch (cc->core->bus->chipinfo.id) { 
    929+       case BCMA_CHIP_ID_BCM5357: 
     30+       case BCMA_CHIP_ID_BCM53572: 
    1031+               chip->ngpio     = 32; 
    1132+               break; 
     
    1738         * deterministic to address them more easily. The other buses could get 
    1839         * a random base number. */ 
     40--- /dev/null 
     41+++ b/drivers/bcma/driver_pcie2.c 
     42@@ -0,0 +1,175 @@ 
     43+/* 
     44+ * Broadcom specific AMBA 
     45+ * PCIe Gen 2 Core 
     46+ * 
     47+ * Copyright 2014, Broadcom Corporation 
     48+ * Copyright 2014, Rafał Miłecki <zajec5@gmail.com> 
     49+ * 
     50+ * Licensed under the GNU/GPL. See COPYING for details. 
     51+ */ 
     52+ 
     53+#include "bcma_private.h" 
     54+#include <linux/bcma/bcma.h> 
     55+ 
     56+/************************************************** 
     57+ * R/W ops. 
     58+ **************************************************/ 
     59+ 
     60+#if 0 
     61+static u32 bcma_core_pcie2_cfg_read(struct bcma_drv_pcie2 *pcie2, u32 addr) 
     62+{ 
     63+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, addr); 
     64+       pcie2_read32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR); 
     65+       return pcie2_read32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA); 
     66+} 
     67+#endif 
     68+ 
     69+static void bcma_core_pcie2_cfg_write(struct bcma_drv_pcie2 *pcie2, u32 addr, 
     70+                                     u32 val) 
     71+{ 
     72+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, addr); 
     73+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, val); 
     74+} 
     75+ 
     76+/************************************************** 
     77+ * Init. 
     78+ **************************************************/ 
     79+ 
     80+static u32 bcma_core_pcie2_war_delay_perst_enab(struct bcma_drv_pcie2 *pcie2, 
     81+                                               bool enable) 
     82+{ 
     83+       u32 val; 
     84+ 
     85+       /* restore back to default */ 
     86+       val = pcie2_read32(pcie2, BCMA_CORE_PCIE2_CLK_CONTROL); 
     87+       val |= PCIE2_CLKC_DLYPERST; 
     88+       val &= ~PCIE2_CLKC_DISSPROMLD; 
     89+       if (enable) { 
     90+               val &= ~PCIE2_CLKC_DLYPERST; 
     91+               val |= PCIE2_CLKC_DISSPROMLD; 
     92+       } 
     93+       pcie2_write32(pcie2, (BCMA_CORE_PCIE2_CLK_CONTROL), val); 
     94+       /* flush */ 
     95+       return pcie2_read32(pcie2, BCMA_CORE_PCIE2_CLK_CONTROL); 
     96+} 
     97+ 
     98+static void bcma_core_pcie2_set_ltr_vals(struct bcma_drv_pcie2 *pcie2) 
     99+{ 
     100+       /* LTR0 */ 
     101+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, 0x844); 
     102+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, 0x883c883c); 
     103+       /* LTR1 */ 
     104+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, 0x848); 
     105+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, 0x88648864); 
     106+       /* LTR2 */ 
     107+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, 0x84C); 
     108+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, 0x90039003); 
     109+} 
     110+ 
     111+static void bcma_core_pcie2_hw_ltr_war(struct bcma_drv_pcie2 *pcie2) 
     112+{ 
     113+       u8 core_rev = pcie2->core->id.rev; 
     114+       u32 devstsctr2; 
     115+ 
     116+       if (core_rev < 2 || core_rev == 10 || core_rev > 13) 
     117+               return; 
     118+ 
     119+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, 
     120+                     PCIE2_CAP_DEVSTSCTRL2_OFFSET); 
     121+       devstsctr2 = pcie2_read32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA); 
     122+       if (devstsctr2 & PCIE2_CAP_DEVSTSCTRL2_LTRENAB) { 
     123+               /* force the right LTR values */ 
     124+               bcma_core_pcie2_set_ltr_vals(pcie2); 
     125+ 
     126+               /* TODO: 
     127+               si_core_wrapperreg(pcie2, 3, 0x60, 0x8080, 0); */ 
     128+ 
     129+               /* enable the LTR */ 
     130+               devstsctr2 |= PCIE2_CAP_DEVSTSCTRL2_LTRENAB; 
     131+               pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, 
     132+                             PCIE2_CAP_DEVSTSCTRL2_OFFSET); 
     133+               pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, devstsctr2); 
     134+ 
     135+               /* set the LTR state to be active */ 
     136+               pcie2_write32(pcie2, BCMA_CORE_PCIE2_LTR_STATE, 
     137+                             PCIE2_LTR_ACTIVE); 
     138+               usleep_range(1000, 2000); 
     139+ 
     140+               /* set the LTR state to be sleep */ 
     141+               pcie2_write32(pcie2, BCMA_CORE_PCIE2_LTR_STATE, 
     142+                             PCIE2_LTR_SLEEP); 
     143+               usleep_range(1000, 2000); 
     144+       } 
     145+} 
     146+ 
     147+static void pciedev_crwlpciegen2(struct bcma_drv_pcie2 *pcie2) 
     148+{ 
     149+       u8 core_rev = pcie2->core->id.rev; 
     150+       bool pciewar160, pciewar162; 
     151+ 
     152+       pciewar160 = core_rev == 7 || core_rev == 9 || core_rev == 11; 
     153+       pciewar162 = core_rev == 5 || core_rev == 7 || core_rev == 8 || 
     154+                    core_rev == 9 || core_rev == 11; 
     155+ 
     156+       if (!pciewar160 && !pciewar162) 
     157+               return; 
     158+ 
     159+/* TODO */ 
     160+#if 0 
     161+       pcie2_set32(pcie2, BCMA_CORE_PCIE2_CLK_CONTROL, 
     162+                   PCIE_DISABLE_L1CLK_GATING); 
     163+#if 0 
     164+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, 
     165+                     PCIEGEN2_COE_PVT_TL_CTRL_0); 
     166+       pcie2_mask32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, 
     167+                    ~(1 << COE_PVT_TL_CTRL_0_PM_DIS_L1_REENTRY_BIT)); 
     168+#endif 
     169+#endif 
     170+} 
     171+ 
     172+static void pciedev_crwlpciegen2_180(struct bcma_drv_pcie2 *pcie2) 
     173+{ 
     174+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, PCIE2_PMCR_REFUP); 
     175+       pcie2_set32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, 0x1f); 
     176+} 
     177+ 
     178+static void pciedev_crwlpciegen2_182(struct bcma_drv_pcie2 *pcie2) 
     179+{ 
     180+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, PCIE2_SBMBX); 
     181+       pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, 1 << 0); 
     182+} 
     183+ 
     184+static void pciedev_reg_pm_clk_period(struct bcma_drv_pcie2 *pcie2) 
     185+{ 
     186+       struct bcma_drv_cc *drv_cc = &pcie2->core->bus->drv_cc; 
     187+       u8 core_rev = pcie2->core->id.rev; 
     188+       u32 alp_khz, pm_value; 
     189+ 
     190+       if (core_rev <= 13) { 
     191+               alp_khz = bcma_pmu_get_alp_clock(drv_cc) / 1000; 
     192+               pm_value = (1000000 * 2) / alp_khz; 
     193+               pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDADDR, 
     194+                             PCIE2_PVT_REG_PM_CLK_PERIOD); 
     195+               pcie2_write32(pcie2, BCMA_CORE_PCIE2_CONFIGINDDATA, pm_value); 
     196+       } 
     197+} 
     198+ 
     199+void bcma_core_pcie2_init(struct bcma_drv_pcie2 *pcie2) 
     200+{ 
     201+       struct bcma_chipinfo *ci = &pcie2->core->bus->chipinfo; 
     202+       u32 tmp; 
     203+ 
     204+       tmp = pcie2_read32(pcie2, BCMA_CORE_PCIE2_SPROM(54)); 
     205+       if ((tmp & 0xe) >> 1 == 2) 
     206+               bcma_core_pcie2_cfg_write(pcie2, 0x4e0, 0x17); 
     207+ 
     208+       /* TODO: Do we need pcie_reqsize? */ 
     209+ 
     210+       if (ci->id == BCMA_CHIP_ID_BCM4360 && ci->rev > 3) 
     211+               bcma_core_pcie2_war_delay_perst_enab(pcie2, true); 
     212+       bcma_core_pcie2_hw_ltr_war(pcie2); 
     213+       pciedev_crwlpciegen2(pcie2); 
     214+       pciedev_reg_pm_clk_period(pcie2); 
     215+       pciedev_crwlpciegen2_180(pcie2); 
     216+       pciedev_crwlpciegen2_182(pcie2); 
     217+} 
     218--- a/drivers/bcma/host_pci.c 
     219+++ b/drivers/bcma/host_pci.c 
     220@@ -279,6 +279,7 @@ static const struct pci_device_id bcma_p 
     221        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4358) }, 
     222        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4359) }, 
     223        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4365) }, 
     224+       { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43a9) }, 
     225        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4727) }, 
     226        { 0, }, 
     227 }; 
     228--- a/drivers/bcma/main.c 
     229+++ b/drivers/bcma/main.c 
     230@@ -132,6 +132,7 @@ static int bcma_register_cores(struct bc 
     231                case BCMA_CORE_CHIPCOMMON: 
     232                case BCMA_CORE_PCI: 
     233                case BCMA_CORE_PCIE: 
     234+               case BCMA_CORE_PCIE2: 
     235                case BCMA_CORE_MIPS_74K: 
     236                case BCMA_CORE_4706_MAC_GBIT_COMMON: 
     237                        continue; 
     238@@ -281,6 +282,13 @@ int bcma_bus_register(struct bcma_bus *b 
     239                bcma_core_pci_init(&bus->drv_pci[1]); 
     240        } 
     241  
     242+       /* Init PCIe Gen 2 core */ 
     243+       core = bcma_find_core_unit(bus, BCMA_CORE_PCIE2, 0); 
     244+       if (core) { 
     245+               bus->drv_pcie2.core = core; 
     246+               bcma_core_pcie2_init(&bus->drv_pcie2); 
     247+       } 
     248+ 
     249        /* Init GBIT MAC COMMON core */ 
     250        core = bcma_find_core(bus, BCMA_CORE_4706_MAC_GBIT_COMMON); 
     251        if (core) { 
     252--- a/drivers/bcma/sprom.c 
     253+++ b/drivers/bcma/sprom.c 
     254@@ -201,6 +201,23 @@ static int bcma_sprom_valid(struct bcma_ 
     255                SPEX(_field[7], _offset + 14, _mask, _shift);   \ 
     256        } while (0) 
     257  
     258+static s8 sprom_extract_antgain(const u16 *in, u16 offset, u16 mask, u16 shift) 
     259+{ 
     260+       u16 v; 
     261+       u8 gain; 
     262+ 
     263+       v = in[SPOFF(offset)]; 
     264+       gain = (v & mask) >> shift; 
     265+       if (gain == 0xFF) { 
     266+               gain = 8; /* If unset use 2dBm */ 
     267+       } else { 
     268+               /* Q5.2 Fractional part is stored in 0xC0 */ 
     269+               gain = ((gain & 0xC0) >> 6) | ((gain & 0x3F) << 2); 
     270+       } 
     271+ 
     272+       return (s8)gain; 
     273+} 
     274+ 
     275 static void bcma_sprom_extract_r8(struct bcma_bus *bus, const u16 *sprom) 
     276 { 
     277        u16 v, o; 
     278@@ -381,14 +398,22 @@ static void bcma_sprom_extract_r8(struct 
     279        SPEX32(ofdm5ghpo, SSB_SPROM8_OFDM5GHPO, ~0, 0); 
     280  
     281        /* Extract the antenna gain values. */ 
     282-       SPEX(antenna_gain.a0, SSB_SPROM8_AGAIN01, 
     283-            SSB_SPROM8_AGAIN0, SSB_SPROM8_AGAIN0_SHIFT); 
     284-       SPEX(antenna_gain.a1, SSB_SPROM8_AGAIN01, 
     285-            SSB_SPROM8_AGAIN1, SSB_SPROM8_AGAIN1_SHIFT); 
     286-       SPEX(antenna_gain.a2, SSB_SPROM8_AGAIN23, 
     287-            SSB_SPROM8_AGAIN2, SSB_SPROM8_AGAIN2_SHIFT); 
     288-       SPEX(antenna_gain.a3, SSB_SPROM8_AGAIN23, 
     289-            SSB_SPROM8_AGAIN3, SSB_SPROM8_AGAIN3_SHIFT); 
     290+       bus->sprom.antenna_gain.a0 = sprom_extract_antgain(sprom, 
     291+                                                          SSB_SPROM8_AGAIN01, 
     292+                                                          SSB_SPROM8_AGAIN0, 
     293+                                                          SSB_SPROM8_AGAIN0_SHIFT); 
     294+       bus->sprom.antenna_gain.a1 = sprom_extract_antgain(sprom, 
     295+                                                          SSB_SPROM8_AGAIN01, 
     296+                                                          SSB_SPROM8_AGAIN1, 
     297+                                                          SSB_SPROM8_AGAIN1_SHIFT); 
     298+       bus->sprom.antenna_gain.a2 = sprom_extract_antgain(sprom, 
     299+                                                          SSB_SPROM8_AGAIN23, 
     300+                                                          SSB_SPROM8_AGAIN2, 
     301+                                                          SSB_SPROM8_AGAIN2_SHIFT); 
     302+       bus->sprom.antenna_gain.a3 = sprom_extract_antgain(sprom, 
     303+                                                          SSB_SPROM8_AGAIN23, 
     304+                                                          SSB_SPROM8_AGAIN3, 
     305+                                                          SSB_SPROM8_AGAIN3_SHIFT); 
     306  
     307        SPEX(leddc_on_time, SSB_SPROM8_LEDDC, SSB_SPROM8_LEDDC_ON, 
     308             SSB_SPROM8_LEDDC_ON_SHIFT); 
     309@@ -509,6 +534,7 @@ static bool bcma_sprom_onchip_available( 
     310                /* for these chips OTP is always available */ 
     311                present = true; 
     312                break; 
     313+       case BCMA_CHIP_ID_BCM43217: 
     314        case BCMA_CHIP_ID_BCM43227: 
     315        case BCMA_CHIP_ID_BCM43228: 
     316        case BCMA_CHIP_ID_BCM43428: 
     317--- a/include/linux/bcma/bcma.h 
     318+++ b/include/linux/bcma/bcma.h 
     319@@ -6,6 +6,7 @@ 
     320  
     321 #include <linux/bcma/bcma_driver_chipcommon.h> 
     322 #include <linux/bcma/bcma_driver_pci.h> 
     323+#include <linux/bcma/bcma_driver_pcie2.h> 
     324 #include <linux/bcma/bcma_driver_mips.h> 
     325 #include <linux/bcma/bcma_driver_gmac_cmn.h> 
     326 #include <linux/ssb/ssb.h> /* SPROM sharing */ 
     327@@ -157,6 +158,8 @@ struct bcma_host_ops { 
     328 /* Chip IDs of PCIe devices */ 
     329 #define BCMA_CHIP_ID_BCM4313   0x4313 
     330 #define BCMA_CHIP_ID_BCM43142  43142 
     331+#define BCMA_CHIP_ID_BCM43217  43217 
     332+#define BCMA_CHIP_ID_BCM43222  43222 
     333 #define BCMA_CHIP_ID_BCM43224  43224 
     334 #define  BCMA_PKG_ID_BCM43224_FAB_CSM  0x8 
     335 #define  BCMA_PKG_ID_BCM43224_FAB_SMIC 0xa 
     336@@ -333,6 +336,7 @@ struct bcma_bus { 
     337  
     338        struct bcma_drv_cc drv_cc; 
     339        struct bcma_drv_pci drv_pci[2]; 
     340+       struct bcma_drv_pcie2 drv_pcie2; 
     341        struct bcma_drv_mips drv_mips; 
     342        struct bcma_drv_gmac_cmn drv_gmac_cmn; 
     343  
     344--- /dev/null 
     345+++ b/include/linux/bcma/bcma_driver_pcie2.h 
     346@@ -0,0 +1,158 @@ 
     347+#ifndef LINUX_BCMA_DRIVER_PCIE2_H_ 
     348+#define LINUX_BCMA_DRIVER_PCIE2_H_ 
     349+ 
     350+#define BCMA_CORE_PCIE2_CLK_CONTROL            0x0000 
     351+#define  PCIE2_CLKC_RST_OE                     0x0001 /* When set, drives PCI_RESET out to pin */ 
     352+#define  PCIE2_CLKC_RST                                0x0002 /* Value driven out to pin */ 
     353+#define  PCIE2_CLKC_SPERST                     0x0004 /* SurvivePeRst */ 
     354+#define  PCIE2_CLKC_DISABLE_L1CLK_GATING       0x0010 
     355+#define  PCIE2_CLKC_DLYPERST                   0x0100 /* Delay PeRst to CoE Core */ 
     356+#define  PCIE2_CLKC_DISSPROMLD                 0x0200 /* DisableSpromLoadOnPerst */ 
     357+#define  PCIE2_CLKC_WAKE_MODE_L2               0x1000 /* Wake on L2 */ 
     358+#define BCMA_CORE_PCIE2_RC_PM_CONTROL          0x0004 
     359+#define BCMA_CORE_PCIE2_RC_PM_STATUS           0x0008 
     360+#define BCMA_CORE_PCIE2_EP_PM_CONTROL          0x000C 
     361+#define BCMA_CORE_PCIE2_EP_PM_STATUS           0x0010 
     362+#define BCMA_CORE_PCIE2_EP_LTR_CONTROL         0x0014 
     363+#define BCMA_CORE_PCIE2_EP_LTR_STATUS          0x0018 
     364+#define BCMA_CORE_PCIE2_EP_OBFF_STATUS         0x001C 
     365+#define BCMA_CORE_PCIE2_PCIE_ERR_STATUS                0x0020 
     366+#define BCMA_CORE_PCIE2_RC_AXI_CONFIG          0x0100 
     367+#define BCMA_CORE_PCIE2_EP_AXI_CONFIG          0x0104 
     368+#define BCMA_CORE_PCIE2_RXDEBUG_STATUS0                0x0108 
     369+#define BCMA_CORE_PCIE2_RXDEBUG_CONTROL0       0x010C 
     370+#define BCMA_CORE_PCIE2_CONFIGINDADDR          0x0120 
     371+#define BCMA_CORE_PCIE2_CONFIGINDDATA          0x0124 
     372+#define BCMA_CORE_PCIE2_MDIOCONTROL            0x0128 
     373+#define BCMA_CORE_PCIE2_MDIOWRDATA             0x012C 
     374+#define BCMA_CORE_PCIE2_MDIORDDATA             0x0130 
     375+#define BCMA_CORE_PCIE2_DATAINTF               0x0180 
     376+#define BCMA_CORE_PCIE2_D2H_INTRLAZY_0         0x0188 
     377+#define BCMA_CORE_PCIE2_H2D_INTRLAZY_0         0x018c 
     378+#define BCMA_CORE_PCIE2_H2D_INTSTAT_0          0x0190 
     379+#define BCMA_CORE_PCIE2_H2D_INTMASK_0          0x0194 
     380+#define BCMA_CORE_PCIE2_D2H_INTSTAT_0          0x0198 
     381+#define BCMA_CORE_PCIE2_D2H_INTMASK_0          0x019c 
     382+#define BCMA_CORE_PCIE2_LTR_STATE              0x01A0 /* Latency Tolerance Reporting */ 
     383+#define  PCIE2_LTR_ACTIVE                      2 
     384+#define  PCIE2_LTR_ACTIVE_IDLE                 1 
     385+#define  PCIE2_LTR_SLEEP                       0 
     386+#define  PCIE2_LTR_FINAL_MASK                  0x300 
     387+#define  PCIE2_LTR_FINAL_SHIFT                 8 
     388+#define BCMA_CORE_PCIE2_PWR_INT_STATUS         0x01A4 
     389+#define BCMA_CORE_PCIE2_PWR_INT_MASK           0x01A8 
     390+#define BCMA_CORE_PCIE2_CFG_ADDR               0x01F8 
     391+#define BCMA_CORE_PCIE2_CFG_DATA               0x01FC 
     392+#define BCMA_CORE_PCIE2_SYS_EQ_PAGE            0x0200 
     393+#define BCMA_CORE_PCIE2_SYS_MSI_PAGE           0x0204 
     394+#define BCMA_CORE_PCIE2_SYS_MSI_INTREN         0x0208 
     395+#define BCMA_CORE_PCIE2_SYS_MSI_CTRL0          0x0210 
     396+#define BCMA_CORE_PCIE2_SYS_MSI_CTRL1          0x0214 
     397+#define BCMA_CORE_PCIE2_SYS_MSI_CTRL2          0x0218 
     398+#define BCMA_CORE_PCIE2_SYS_MSI_CTRL3          0x021C 
     399+#define BCMA_CORE_PCIE2_SYS_MSI_CTRL4          0x0220 
     400+#define BCMA_CORE_PCIE2_SYS_MSI_CTRL5          0x0224 
     401+#define BCMA_CORE_PCIE2_SYS_EQ_HEAD0           0x0250 
     402+#define BCMA_CORE_PCIE2_SYS_EQ_TAIL0           0x0254 
     403+#define BCMA_CORE_PCIE2_SYS_EQ_HEAD1           0x0258 
     404+#define BCMA_CORE_PCIE2_SYS_EQ_TAIL1           0x025C 
     405+#define BCMA_CORE_PCIE2_SYS_EQ_HEAD2           0x0260 
     406+#define BCMA_CORE_PCIE2_SYS_EQ_TAIL2           0x0264 
     407+#define BCMA_CORE_PCIE2_SYS_EQ_HEAD3           0x0268 
     408+#define BCMA_CORE_PCIE2_SYS_EQ_TAIL3           0x026C 
     409+#define BCMA_CORE_PCIE2_SYS_EQ_HEAD4           0x0270 
     410+#define BCMA_CORE_PCIE2_SYS_EQ_TAIL4           0x0274 
     411+#define BCMA_CORE_PCIE2_SYS_EQ_HEAD5           0x0278 
     412+#define BCMA_CORE_PCIE2_SYS_EQ_TAIL5           0x027C 
     413+#define BCMA_CORE_PCIE2_SYS_RC_INTX_EN         0x0330 
     414+#define BCMA_CORE_PCIE2_SYS_RC_INTX_CSR                0x0334 
     415+#define BCMA_CORE_PCIE2_SYS_MSI_REQ            0x0340 
     416+#define BCMA_CORE_PCIE2_SYS_HOST_INTR_EN       0x0344 
     417+#define BCMA_CORE_PCIE2_SYS_HOST_INTR_CSR      0x0348 
     418+#define BCMA_CORE_PCIE2_SYS_HOST_INTR0         0x0350 
     419+#define BCMA_CORE_PCIE2_SYS_HOST_INTR1         0x0354 
     420+#define BCMA_CORE_PCIE2_SYS_HOST_INTR2         0x0358 
     421+#define BCMA_CORE_PCIE2_SYS_HOST_INTR3         0x035C 
     422+#define BCMA_CORE_PCIE2_SYS_EP_INT_EN0         0x0360 
     423+#define BCMA_CORE_PCIE2_SYS_EP_INT_EN1         0x0364 
     424+#define BCMA_CORE_PCIE2_SYS_EP_INT_CSR0                0x0370 
     425+#define BCMA_CORE_PCIE2_SYS_EP_INT_CSR1                0x0374 
     426+#define BCMA_CORE_PCIE2_SPROM(wordoffset)      (0x0800 + ((wordoffset) * 2)) 
     427+#define BCMA_CORE_PCIE2_FUNC0_IMAP0_0          0x0C00 
     428+#define BCMA_CORE_PCIE2_FUNC0_IMAP0_1          0x0C04 
     429+#define BCMA_CORE_PCIE2_FUNC0_IMAP0_2          0x0C08 
     430+#define BCMA_CORE_PCIE2_FUNC0_IMAP0_3          0x0C0C 
     431+#define BCMA_CORE_PCIE2_FUNC0_IMAP0_4          0x0C10 
     432+#define BCMA_CORE_PCIE2_FUNC0_IMAP0_5          0x0C14 
     433+#define BCMA_CORE_PCIE2_FUNC0_IMAP0_6          0x0C18 
     434+#define BCMA_CORE_PCIE2_FUNC0_IMAP0_7          0x0C1C 
     435+#define BCMA_CORE_PCIE2_FUNC1_IMAP0_0          0x0C20 
     436+#define BCMA_CORE_PCIE2_FUNC1_IMAP0_1          0x0C24 
     437+#define BCMA_CORE_PCIE2_FUNC1_IMAP0_2          0x0C28 
     438+#define BCMA_CORE_PCIE2_FUNC1_IMAP0_3          0x0C2C 
     439+#define BCMA_CORE_PCIE2_FUNC1_IMAP0_4          0x0C30 
     440+#define BCMA_CORE_PCIE2_FUNC1_IMAP0_5          0x0C34 
     441+#define BCMA_CORE_PCIE2_FUNC1_IMAP0_6          0x0C38 
     442+#define BCMA_CORE_PCIE2_FUNC1_IMAP0_7          0x0C3C 
     443+#define BCMA_CORE_PCIE2_FUNC0_IMAP1            0x0C80 
     444+#define BCMA_CORE_PCIE2_FUNC1_IMAP1            0x0C88 
     445+#define BCMA_CORE_PCIE2_FUNC0_IMAP2            0x0CC0 
     446+#define BCMA_CORE_PCIE2_FUNC1_IMAP2            0x0CC8 
     447+#define BCMA_CORE_PCIE2_IARR0_LOWER            0x0D00 
     448+#define BCMA_CORE_PCIE2_IARR0_UPPER            0x0D04 
     449+#define BCMA_CORE_PCIE2_IARR1_LOWER            0x0D08 
     450+#define BCMA_CORE_PCIE2_IARR1_UPPER            0x0D0C 
     451+#define BCMA_CORE_PCIE2_IARR2_LOWER            0x0D10 
     452+#define BCMA_CORE_PCIE2_IARR2_UPPER            0x0D14 
     453+#define BCMA_CORE_PCIE2_OARR0                  0x0D20 
     454+#define BCMA_CORE_PCIE2_OARR1                  0x0D28 
     455+#define BCMA_CORE_PCIE2_OARR2                  0x0D30 
     456+#define BCMA_CORE_PCIE2_OMAP0_LOWER            0x0D40 
     457+#define BCMA_CORE_PCIE2_OMAP0_UPPER            0x0D44 
     458+#define BCMA_CORE_PCIE2_OMAP1_LOWER            0x0D48 
     459+#define BCMA_CORE_PCIE2_OMAP1_UPPER            0x0D4C 
     460+#define BCMA_CORE_PCIE2_OMAP2_LOWER            0x0D50 
     461+#define BCMA_CORE_PCIE2_OMAP2_UPPER            0x0D54 
     462+#define BCMA_CORE_PCIE2_FUNC1_IARR1_SIZE       0x0D58 
     463+#define BCMA_CORE_PCIE2_FUNC1_IARR2_SIZE       0x0D5C 
     464+#define BCMA_CORE_PCIE2_MEM_CONTROL            0x0F00 
     465+#define BCMA_CORE_PCIE2_MEM_ECC_ERRLOG0                0x0F04 
     466+#define BCMA_CORE_PCIE2_MEM_ECC_ERRLOG1                0x0F08 
     467+#define BCMA_CORE_PCIE2_LINK_STATUS            0x0F0C 
     468+#define BCMA_CORE_PCIE2_STRAP_STATUS           0x0F10 
     469+#define BCMA_CORE_PCIE2_RESET_STATUS           0x0F14 
     470+#define BCMA_CORE_PCIE2_RESETEN_IN_LINKDOWN    0x0F18 
     471+#define BCMA_CORE_PCIE2_MISC_INTR_EN           0x0F1C 
     472+#define BCMA_CORE_PCIE2_TX_DEBUG_CFG           0x0F20 
     473+#define BCMA_CORE_PCIE2_MISC_CONFIG            0x0F24 
     474+#define BCMA_CORE_PCIE2_MISC_STATUS            0x0F28 
     475+#define BCMA_CORE_PCIE2_INTR_EN                        0x0F30 
     476+#define BCMA_CORE_PCIE2_INTR_CLEAR             0x0F34 
     477+#define BCMA_CORE_PCIE2_INTR_STATUS            0x0F38 
     478+ 
     479+/* PCIE gen2 config regs */ 
     480+#define PCIE2_INTSTATUS                                0x090 
     481+#define PCIE2_INTMASK                          0x094 
     482+#define PCIE2_SBMBX                            0x098 
     483+ 
     484+#define PCIE2_PMCR_REFUP                       0x1814 /* Trefup time */ 
     485+ 
     486+#define PCIE2_CAP_DEVSTSCTRL2_OFFSET           0xD4 
     487+#define PCIE2_CAP_DEVSTSCTRL2_LTRENAB          0x400 
     488+#define PCIE2_PVT_REG_PM_CLK_PERIOD            0x184c 
     489+ 
     490+struct bcma_drv_pcie2 { 
     491+       struct bcma_device *core; 
     492+}; 
     493+ 
     494+#define pcie2_read16(pcie2, offset)            bcma_read16((pcie2)->core, offset) 
     495+#define pcie2_read32(pcie2, offset)            bcma_read32((pcie2)->core, offset) 
     496+#define pcie2_write16(pcie2, offset, val)      bcma_write16((pcie2)->core, offset, val) 
     497+#define pcie2_write32(pcie2, offset, val)      bcma_write32((pcie2)->core, offset, val) 
     498+ 
     499+#define pcie2_set32(pcie2, offset, set)                bcma_set32((pcie2)->core, offset, set) 
     500+#define pcie2_mask32(pcie2, offset, mask)      bcma_mask32((pcie2)->core, offset, mask) 
     501+ 
     502+void bcma_core_pcie2_init(struct bcma_drv_pcie2 *pcie2); 
     503+ 
     504+#endif /* LINUX_BCMA_DRIVER_PCIE2_H_ */ 
Note: See TracChangeset for help on using the changeset viewer.