kernel: update 3.10 to 3.10.18
[openwrt.git] / target / linux / generic / patches-3.3 / 025-bcma_backport.patch
index 05d461d..79f0b59 100644 (file)
@@ -11,7 +11,7 @@
                p->iotype = UPIO_MEM;
 --- a/drivers/bcma/Kconfig
 +++ b/drivers/bcma/Kconfig
-@@ -26,10 +26,11 @@ config BCMA_HOST_PCI_POSSIBLE
+@@ -26,16 +26,23 @@ config BCMA_HOST_PCI_POSSIBLE
  config BCMA_HOST_PCI
        bool "Support for BCMA on PCI-host bus"
        depends on BCMA_HOST_PCI_POSSIBLE
        help
          PCI core hostmode operation (external PCI bus).
  
-@@ -46,6 +47,33 @@ config BCMA_DRIVER_MIPS
+ config BCMA_HOST_SOC
+-      bool
+-      depends on BCMA_DRIVER_MIPS
++      bool "Support for BCMA in a SoC"
++      depends on BCMA
++      help
++        Host interface for a Broadcom AIX bus directly mapped into
++        the memory. This only works with the Broadcom SoCs from the
++        BCM47XX line.
++
++        If unsure, say N
+ config BCMA_DRIVER_MIPS
+       bool "BCMA Broadcom MIPS core driver"
+@@ -46,6 +53,33 @@ config BCMA_DRIVER_MIPS
  
          If unsure, say N
  
   *
   * Licensed under the GNU/GPL. See COPYING for details.
   */
-@@ -16,120 +17,124 @@
+@@ -16,120 +17,131 @@
   * R/W ops.
   **************************************************/
  
  }
 -#endif
  
- static void bcma_pcie_mdio_set_phy(struct bcma_drv_pci *pc, u8 phy)
+-static void bcma_pcie_mdio_set_phy(struct bcma_drv_pci *pc, u8 phy)
++static void bcma_pcie_mdio_set_phy(struct bcma_drv_pci *pc, u16 phy)
  {
 -      const u16 mdio_control = 0x128;
 -      const u16 mdio_data = 0x12C;
        }
  }
  
- static u16 bcma_pcie_mdio_read(struct bcma_drv_pci *pc, u8 device, u8 address)
+-static u16 bcma_pcie_mdio_read(struct bcma_drv_pci *pc, u8 device, u8 address)
++static u16 bcma_pcie_mdio_read(struct bcma_drv_pci *pc, u16 device, u8 address)
  {
 -      const u16 mdio_control = 0x128;
 -      const u16 mdio_data = 0x12C;
        return ret;
  }
  
- static void bcma_pcie_mdio_write(struct bcma_drv_pci *pc, u8 device,
+-static void bcma_pcie_mdio_write(struct bcma_drv_pci *pc, u8 device,
++static void bcma_pcie_mdio_write(struct bcma_drv_pci *pc, u16 device,
                                u8 address, u16 data)
  {
 -      const u16 mdio_control = 0x128;
        }
 -      pcicore_write32(pc, mdio_control, 0);
 +      pcicore_write32(pc, BCMA_CORE_PCI_MDIO_CONTROL, 0);
++}
++
++static u16 bcma_pcie_mdio_writeread(struct bcma_drv_pci *pc, u16 device,
++                                  u8 address, u16 data)
++{
++      bcma_pcie_mdio_write(pc, device, address, data);
++      return bcma_pcie_mdio_read(pc, device, address);
  }
  
  /**************************************************
-@@ -138,88 +143,108 @@ static void bcma_pcie_mdio_write(struct
+@@ -138,88 +150,134 @@ static void bcma_pcie_mdio_write(struct
  
  static u8 bcma_pcicore_polarity_workaround(struct bcma_drv_pci *pc)
  {
 -              pr_err("Driver compiled without support for hostmode PCI\n");
  #endif /* CONFIG_BCMA_DRIVER_PCI_HOSTMODE */
 -      } else {
--              bcma_core_pci_clientmode_init(pc);
++
++      if (!pc->hostmode)
+               bcma_core_pci_clientmode_init(pc);
 -      }
++}
++
++void bcma_core_pci_power_save(struct bcma_bus *bus, bool up)
++{
++      struct bcma_drv_pci *pc;
++      u16 data;
  
 -      pc->setup_done = true;
-+      if (!pc->hostmode)
-+              bcma_core_pci_clientmode_init(pc);
++      if (bus->hosttype != BCMA_HOSTTYPE_PCI)
++              return;
++
++      pc = &bus->drv_pci[0];
++
++      if (pc->core->id.rev >= 15 && pc->core->id.rev <= 20) {
++              data = up ? 0x74 : 0x7C;
++              bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1,
++                                       BCMA_CORE_PCI_MDIO_BLK1_MGMT1, 0x7F64);
++              bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1,
++                                       BCMA_CORE_PCI_MDIO_BLK1_MGMT3, data);
++      } else if (pc->core->id.rev >= 21 && pc->core->id.rev <= 22) {
++              data = up ? 0x75 : 0x7D;
++              bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1,
++                                       BCMA_CORE_PCI_MDIO_BLK1_MGMT1, 0x7E65);
++              bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1,
++                                       BCMA_CORE_PCI_MDIO_BLK1_MGMT3, data);
++      }
  }
++EXPORT_SYMBOL_GPL(bcma_core_pci_power_save);
  
  int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc, struct bcma_device *core,
                          bool enable)
        err = pci_read_config_dword(pdev, BCMA_PCI_IRQMASK, &tmp);
        if (err)
                goto out;
-@@ -236,3 +261,17 @@ out:
+@@ -236,3 +294,42 @@ out:
        return err;
  }
  EXPORT_SYMBOL_GPL(bcma_core_pci_irq_ctl);
 +
-+void bcma_core_pci_extend_L1timer(struct bcma_drv_pci *pc, bool extend)
++static void bcma_core_pci_extend_L1timer(struct bcma_drv_pci *pc, bool extend)
 +{
 +      u32 w;
 +
 +      bcma_pcie_write(pc, BCMA_CORE_PCI_DLLP_PMTHRESHREG, w);
 +      bcma_pcie_read(pc, BCMA_CORE_PCI_DLLP_PMTHRESHREG);
 +}
-+EXPORT_SYMBOL_GPL(bcma_core_pci_extend_L1timer);
++
++void bcma_core_pci_up(struct bcma_bus *bus)
++{
++      struct bcma_drv_pci *pc;
++
++      if (bus->hosttype != BCMA_HOSTTYPE_PCI)
++              return;
++
++      pc = &bus->drv_pci[0];
++
++      bcma_core_pci_extend_L1timer(pc, true);
++}
++EXPORT_SYMBOL_GPL(bcma_core_pci_up);
++
++void bcma_core_pci_down(struct bcma_bus *bus)
++{
++      struct bcma_drv_pci *pc;
++
++      if (bus->hosttype != BCMA_HOSTTYPE_PCI)
++              return;
++
++      pc = &bus->drv_pci[0];
++
++      bcma_core_pci_extend_L1timer(pc, false);
++}
++EXPORT_SYMBOL_GPL(bcma_core_pci_down);
 --- a/drivers/bcma/driver_pci_host.c
 +++ b/drivers/bcma/driver_pci_host.c
-@@ -2,13 +2,616 @@
+@@ -2,13 +2,622 @@
   * Broadcom specific AMBA
   * PCI Core in hostmode
   *
 +int bcma_core_pci_plat_dev_init(struct pci_dev *dev)
 +{
 +      struct bcma_drv_pci_host *pc_host;
++      int readrq;
 +
 +      if (dev->bus->ops->read != bcma_core_pci_hostmode_read_config) {
 +              /* This is not a device on the PCI-core bridge. */
 +      dev->irq = bcma_core_irq(pc_host->pdev->core);
 +      pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq);
 +
++      readrq = pcie_get_readrq(dev);
++      if (readrq > 128) {
++              pr_info("change PCIe max read request size from %i to 128\n", readrq);
++              pcie_set_readrq(dev, 128);
++      }
 +      return 0;
 +}
 +EXPORT_SYMBOL(bcma_core_pci_plat_dev_init);
        err = bcma_bus_scan(bus);
        if (err) {
 -              pr_err("Failed to scan: %d\n", err);
+-              return -1;
 +              bcma_err(bus, "Failed to scan: %d\n", err);
-               return -1;
++              return err;
        }
  
 +      /* Early init CC core */
        }
 --- a/drivers/bcma/scan.c
 +++ b/drivers/bcma/scan.c
-@@ -19,15 +19,27 @@ struct bcma_device_id_name {
+@@ -19,15 +19,39 @@ struct bcma_device_id_name {
        u16 id;
        const char *name;
  };
 +      { BCMA_CORE_4706_CHIPCOMMON, "BCM4706 ChipCommon" },
 +      { BCMA_CORE_4706_SOC_RAM, "BCM4706 SOC RAM" },
 +      { BCMA_CORE_4706_MAC_GBIT, "BCM4706 GBit MAC" },
++      { BCMA_CORE_PCIEG2, "PCIe Gen 2" },
++      { BCMA_CORE_DMA, "DMA" },
++      { BCMA_CORE_SDIO3, "SDIO3" },
++      { BCMA_CORE_USB20, "USB 2.0" },
++      { BCMA_CORE_USB30, "USB 3.0" },
++      { BCMA_CORE_A9JTAG, "ARM Cortex A9 JTAG" },
++      { BCMA_CORE_DDR23, "Denali DDR2/DDR3 memory controller" },
++      { BCMA_CORE_ROM, "ROM" },
++      { BCMA_CORE_NAND, "NAND flash controller" },
++      { BCMA_CORE_QSPI, "SPI flash controller" },
++      { BCMA_CORE_CHIPCOMMON_B, "Chipcommon B" },
++      { BCMA_CORE_ARMCA9, "ARM Cortex A9 core (ihost)" },
 +      { BCMA_CORE_AMEMC, "AMEMC (DDR)" },
 +      { BCMA_CORE_ALTA, "ALTA (I2S)" },
        { BCMA_CORE_INVALID, "Invalid" },
        { BCMA_CORE_ETHERNET, "Fast Ethernet" },
        { BCMA_CORE_V90, "V90" },
        { BCMA_CORE_USB11_HOSTDEV, "USB 1.1 Hostdev" },
-@@ -44,7 +56,6 @@ struct bcma_device_id_name bcma_device_n
+@@ -44,7 +68,6 @@ struct bcma_device_id_name bcma_device_n
        { BCMA_CORE_PHY_A, "PHY A" },
        { BCMA_CORE_PHY_B, "PHY B" },
        { BCMA_CORE_PHY_G, "PHY G" },
        { BCMA_CORE_USB11_HOST, "USB 1.1 Host" },
        { BCMA_CORE_USB11_DEV, "USB 1.1 Device" },
        { BCMA_CORE_USB20_HOST, "USB 2.0 Host" },
-@@ -58,15 +69,11 @@ struct bcma_device_id_name bcma_device_n
+@@ -58,15 +81,11 @@ struct bcma_device_id_name bcma_device_n
        { BCMA_CORE_PHY_N, "PHY N" },
        { BCMA_CORE_SRAM_CTL, "SRAM Controller" },
        { BCMA_CORE_MINI_MACPHY, "Mini MACPHY" },
        { BCMA_CORE_MAC_GBIT, "GBit MAC" },
        { BCMA_CORE_DDR12_MEM_CTL, "DDR1/DDR2 Memory Controller" },
        { BCMA_CORE_PCIE_RC, "PCIe Root Complex" },
-@@ -77,18 +84,45 @@ struct bcma_device_id_name bcma_device_n
+@@ -77,18 +96,45 @@ struct bcma_device_id_name bcma_device_n
        { BCMA_CORE_I2S, "I2S" },
        { BCMA_CORE_SDR_DDR1_MEM_CTL, "SDR/DDR1 Memory Controller" },
        { BCMA_CORE_SHIM, "SHIM" },
 +              break;
 +      default:
 +              return "UNKNOWN";
-       }
++      }
 +
 +      for (i = 0; i < size; i++) {
 +              if (names[i].id == id->id)
 +                      return names[i].name;
-+      }
+       }
 +
        return "UNKNOWN";
  }
  
-@@ -105,19 +139,19 @@ static void bcma_scan_switch_core(struct
+@@ -105,19 +151,19 @@ static void bcma_scan_switch_core(struct
                                       addr);
  }
  
  {
        u32 ent = bcma_erom_get_ent(bus, eromptr);
        if (!(ent & SCAN_ER_VALID))
-@@ -127,14 +161,14 @@ static s32 bcma_erom_get_ci(struct bcma_
+@@ -127,14 +173,14 @@ static s32 bcma_erom_get_ci(struct bcma_
        return ent;
  }
  
  {
        u32 ent = bcma_erom_get_ent(bus, eromptr);
        bcma_erom_push_ent(eromptr);
-@@ -143,7 +177,7 @@ static bool bcma_erom_is_bridge(struct b
+@@ -143,7 +189,7 @@ static bool bcma_erom_is_bridge(struct b
                ((ent & SCAN_ADDR_TYPE) == SCAN_ADDR_TYPE_BRIDGE));
  }
  
  {
        u32 ent;
        while (1) {
-@@ -157,7 +191,7 @@ static void bcma_erom_skip_component(str
+@@ -157,7 +203,7 @@ static void bcma_erom_skip_component(str
        bcma_erom_push_ent(eromptr);
  }
  
  {
        u32 ent = bcma_erom_get_ent(bus, eromptr);
        if (!(ent & SCAN_ER_VALID))
-@@ -167,7 +201,7 @@ static s32 bcma_erom_get_mst_port(struct
+@@ -167,7 +213,7 @@ static s32 bcma_erom_get_mst_port(struct
        return ent;
  }
  
 -static s32 bcma_erom_get_addr_desc(struct bcma_bus *bus, u32 **eromptr,
-+static s32 bcma_erom_get_addr_desc(struct bcma_bus *bus, u32 __iomem **eromptr,
++static u32 bcma_erom_get_addr_desc(struct bcma_bus *bus, u32 __iomem **eromptr,
                                  u32 type, u8 port)
  {
        u32 addrl, addrh, sizel, sizeh = 0;
-@@ -212,6 +246,17 @@ static struct bcma_device *bcma_find_cor
+@@ -179,7 +225,7 @@ static s32 bcma_erom_get_addr_desc(struc
+           ((ent & SCAN_ADDR_TYPE) != type) ||
+           (((ent & SCAN_ADDR_PORT) >> SCAN_ADDR_PORT_SHIFT) != port)) {
+               bcma_erom_push_ent(eromptr);
+-              return -EINVAL;
++              return (u32)-EINVAL;
+       }
+       addrl = ent & SCAN_ADDR_ADDR;
+@@ -212,11 +258,24 @@ static struct bcma_device *bcma_find_cor
        return NULL;
  }
  
 +      return NULL;
 +}
 +
++#define IS_ERR_VALUE_U32(x) ((x) >= (u32)-MAX_ERRNO)
++
  static int bcma_get_next_core(struct bcma_bus *bus, u32 __iomem **eromptr,
                              struct bcma_device_id *match, int core_num,
                              struct bcma_device *core)
-@@ -252,11 +297,15 @@ static int bcma_get_next_core(struct bcm
+ {
+-      s32 tmp;
++      u32 tmp;
+       u8 i, j;
+       s32 cia, cib;
+       u8 ports[2], wrappers[2];
+@@ -252,11 +311,15 @@ static int bcma_get_next_core(struct bcm
  
        /* check if component is a core at all */
        if (wrappers[0] + wrappers[1] == 0) {
        }
  
        if (bcma_erom_is_bridge(bus, eromptr)) {
-@@ -286,6 +335,23 @@ static int bcma_get_next_core(struct bcm
+@@ -286,19 +349,36 @@ static int bcma_get_next_core(struct bcm
                        return -EILSEQ;
        }
  
 +       * the main register space for the core
 +       */
 +      tmp = bcma_erom_get_addr_desc(bus, eromptr, SCAN_ADDR_TYPE_SLAVE, 0);
-+      if (tmp <= 0) {
++      if (tmp == 0 || IS_ERR_VALUE_U32(tmp)) {
 +              /* Try again to see if it is a bridge */
 +              tmp = bcma_erom_get_addr_desc(bus, eromptr,
 +                                            SCAN_ADDR_TYPE_BRIDGE, 0);
-+              if (tmp <= 0) {
++              if (tmp == 0 || IS_ERR_VALUE_U32(tmp)) {
 +                      return -EILSEQ;
 +              } else {
 +                      bcma_info(bus, "Bridge found\n");
        /* get & parse slave ports */
        for (i = 0; i < ports[1]; i++) {
                for (j = 0; ; j++) {
-@@ -298,7 +364,7 @@ static int bcma_get_next_core(struct bcm
+                       tmp = bcma_erom_get_addr_desc(bus, eromptr,
+                               SCAN_ADDR_TYPE_SLAVE, i);
+-                      if (tmp < 0) {
++                      if (IS_ERR_VALUE_U32(tmp)) {
+                               /* no more entries for port _i_ */
+                               /* pr_debug("erom: slave port %d "
+                                * "has %d descriptors\n", i, j); */
                                break;
                        } else {
                                if (i == 0 && j == 0)
                        }
                }
        }
-@@ -353,6 +419,7 @@ static int bcma_get_next_core(struct bcm
+@@ -308,7 +388,7 @@ static int bcma_get_next_core(struct bcm
+               for (j = 0; ; j++) {
+                       tmp = bcma_erom_get_addr_desc(bus, eromptr,
+                               SCAN_ADDR_TYPE_MWRAP, i);
+-                      if (tmp < 0) {
++                      if (IS_ERR_VALUE_U32(tmp)) {
+                               /* no more entries for port _i_ */
+                               /* pr_debug("erom: master wrapper %d "
+                                * "has %d descriptors\n", i, j); */
+@@ -326,7 +406,7 @@ static int bcma_get_next_core(struct bcm
+               for (j = 0; ; j++) {
+                       tmp = bcma_erom_get_addr_desc(bus, eromptr,
+                               SCAN_ADDR_TYPE_SWRAP, i + hack);
+-                      if (tmp < 0) {
++                      if (IS_ERR_VALUE_U32(tmp)) {
+                               /* no more entries for port _i_ */
+                               /* pr_debug("erom: master wrapper %d "
+                                * has %d descriptors\n", i, j); */
+@@ -353,6 +433,7 @@ static int bcma_get_next_core(struct bcm
  void bcma_init_bus(struct bcma_bus *bus)
  {
        s32 tmp;
  
        if (bus->init_done)
                return;
-@@ -363,9 +430,12 @@ void bcma_init_bus(struct bcma_bus *bus)
+@@ -363,9 +444,12 @@ void bcma_init_bus(struct bcma_bus *bus)
        bcma_scan_switch_core(bus, BCMA_ADDR_BASE);
  
        tmp = bcma_scan_read32(bus, 0, BCMA_CC_ID);
        bus->init_done = true;
  }
  
-@@ -392,9 +462,12 @@ int bcma_bus_scan(struct bcma_bus *bus)
+@@ -392,9 +476,12 @@ int bcma_bus_scan(struct bcma_bus *bus)
        bcma_scan_switch_core(bus, erombase);
  
        while (eromptr < eromend) {
                INIT_LIST_HEAD(&core->list);
                core->bus = bus;
  
-@@ -409,25 +482,28 @@ int bcma_bus_scan(struct bcma_bus *bus)
+@@ -409,25 +496,28 @@ int bcma_bus_scan(struct bcma_bus *bus)
                        } else if (err == -ESPIPE) {
                                break;
                        }
  }
  
  int __init bcma_bus_scan_early(struct bcma_bus *bus,
-@@ -467,21 +543,21 @@ int __init bcma_bus_scan_early(struct bc
+@@ -467,21 +557,21 @@ int __init bcma_bus_scan_early(struct bc
                else if (err == -ESPIPE)
                        break;
                else if (err < 0)
  enum bcma_clkmode {
        BCMA_CLKMODE_FAST,
        BCMA_CLKMODE_DYNAMIC,
-@@ -65,6 +71,13 @@ struct bcma_host_ops {
+@@ -65,6 +71,25 @@ struct bcma_host_ops {
  
  /* Core-ID values. */
  #define BCMA_CORE_OOB_ROUTER          0x367   /* Out of band */
 +#define BCMA_CORE_4706_CHIPCOMMON     0x500
++#define BCMA_CORE_PCIEG2              0x501
++#define BCMA_CORE_DMA                 0x502
++#define BCMA_CORE_SDIO3                       0x503
++#define BCMA_CORE_USB20                       0x504
++#define BCMA_CORE_USB30                       0x505
++#define BCMA_CORE_A9JTAG              0x506
++#define BCMA_CORE_DDR23                       0x507
++#define BCMA_CORE_ROM                 0x508
++#define BCMA_CORE_NAND                        0x509
++#define BCMA_CORE_QSPI                        0x50A
++#define BCMA_CORE_CHIPCOMMON_B                0x50B
 +#define BCMA_CORE_4706_SOC_RAM                0x50E
++#define BCMA_CORE_ARMCA9              0x510
 +#define BCMA_CORE_4706_MAC_GBIT               0x52D
 +#define BCMA_CORE_AMEMC                       0x52E   /* DDR1/2 memory controller core */
 +#define BCMA_CORE_ALTA                        0x534   /* I2S core */
  #define BCMA_CORE_INVALID             0x700
  #define BCMA_CORE_CHIPCOMMON          0x800
  #define BCMA_CORE_ILINE20             0x801
-@@ -121,10 +134,104 @@ struct bcma_host_ops {
+@@ -121,10 +146,109 @@ struct bcma_host_ops {
  #define BCMA_CORE_I2S                 0x834
  #define BCMA_CORE_SDR_DDR1_MEM_CTL    0x835   /* SDR/DDR1 memory controller core */
  #define BCMA_CORE_SHIM                        0x837   /* SHIM component in ubus/6362 */
 +#define  BCMA_PKG_ID_BCM5357  11
 +#define BCMA_CHIP_ID_BCM53572 53572
 +#define  BCMA_PKG_ID_BCM47188 9
++#define BCMA_CHIP_ID_BCM4707  53010
++#define  BCMA_PKG_ID_BCM4707  1
++#define  BCMA_PKG_ID_BCM4708  2
++#define  BCMA_PKG_ID_BCM4709  0
++#define BCMA_CHIP_ID_BCM53018 53018
 +
 +/* Board types (on PCI usually equals to the subsystem dev id) */
 +/* BCM4313 */
  struct bcma_device {
        struct bcma_bus *bus;
        struct bcma_device_id id;
-@@ -136,8 +243,10 @@ struct bcma_device {
+@@ -136,8 +260,10 @@ struct bcma_device {
        bool dev_registered;
  
        u8 core_index;
        u32 wrap;
  
        void __iomem *io_addr;
-@@ -175,6 +284,12 @@ int __bcma_driver_register(struct bcma_d
+@@ -175,6 +301,12 @@ int __bcma_driver_register(struct bcma_d
  
  extern void bcma_driver_unregister(struct bcma_driver *drv);
  
  struct bcma_bus {
        /* The MMIO area. */
        void __iomem *mmio;
-@@ -191,14 +306,18 @@ struct bcma_bus {
+@@ -191,14 +323,18 @@ struct bcma_bus {
  
        struct bcma_chipinfo chipinfo;
  
  
        /* We decided to share SPROM struct with SSB as long as we do not need
         * any hacks for BCMA. This simplifies drivers code. */
-@@ -282,6 +401,7 @@ static inline void bcma_maskset16(struct
+@@ -282,6 +418,7 @@ static inline void bcma_maskset16(struct
        bcma_write16(cc, offset, (bcma_read16(cc, offset) & mask) | set);
  }
  
  extern bool bcma_core_is_enabled(struct bcma_device *core);
  extern void bcma_core_disable(struct bcma_device *core, u32 flags);
  extern int bcma_core_enable(struct bcma_device *core, u32 flags);
-@@ -289,6 +409,7 @@ extern void bcma_core_set_clockmode(stru
+@@ -289,6 +426,7 @@ extern void bcma_core_set_clockmode(stru
                                    enum bcma_clkmode clkmode);
  extern void bcma_core_pll_ctl(struct bcma_device *core, u32 req, u32 status,
                              bool on);
  
  /* SBtoPCIx */
  #define BCMA_CORE_PCI_SBTOPCI_MEM             0x00000000
-@@ -72,20 +108,120 @@ struct pci_dev;
+@@ -72,20 +108,143 @@ struct pci_dev;
  #define  BCMA_CORE_PCI_SBTOPCI_RC_READL               0x00000010 /* Memory read line */
  #define  BCMA_CORE_PCI_SBTOPCI_RC_READM               0x00000020 /* Memory read multiple */
  
 +
 +#define BCMA_CORE_PCI_CFG_DEVCTRL             0xd8
 +
++#define BCMA_CORE_PCI_
++
++/* MDIO devices (SERDES modules) */
++#define BCMA_CORE_PCI_MDIO_IEEE0              0x000
++#define BCMA_CORE_PCI_MDIO_IEEE1              0x001
++#define BCMA_CORE_PCI_MDIO_BLK0                       0x800
++#define BCMA_CORE_PCI_MDIO_BLK1                       0x801
++#define  BCMA_CORE_PCI_MDIO_BLK1_MGMT0                0x16
++#define  BCMA_CORE_PCI_MDIO_BLK1_MGMT1                0x17
++#define  BCMA_CORE_PCI_MDIO_BLK1_MGMT2                0x18
++#define  BCMA_CORE_PCI_MDIO_BLK1_MGMT3                0x19
++#define  BCMA_CORE_PCI_MDIO_BLK1_MGMT4                0x1A
++#define BCMA_CORE_PCI_MDIO_BLK2                       0x802
++#define BCMA_CORE_PCI_MDIO_BLK3                       0x803
++#define BCMA_CORE_PCI_MDIO_BLK4                       0x804
++#define BCMA_CORE_PCI_MDIO_TXPLL              0x808   /* TXPLL register block idx */
++#define BCMA_CORE_PCI_MDIO_TXCTRL0            0x820
++#define BCMA_CORE_PCI_MDIO_SERDESID           0x831
++#define BCMA_CORE_PCI_MDIO_RXCTRL0            0x840
++
 +/* PCIE Root Capability Register bits (Host mode only) */
 +#define BCMA_CORE_PCI_RC_CRS_VISIBILITY               0x0001
 +
 +struct bcma_drv_pci;
++struct bcma_bus;
 +
 +#ifdef CONFIG_BCMA_DRIVER_PCI_HOSTMODE
 +struct bcma_drv_pci_host {
 +extern void __devinit bcma_core_pci_init(struct bcma_drv_pci *pc);
  extern int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc,
                                 struct bcma_device *core, bool enable);
-+extern void bcma_core_pci_extend_L1timer(struct bcma_drv_pci *pc, bool extend);
++extern void bcma_core_pci_up(struct bcma_bus *bus);
++extern void bcma_core_pci_down(struct bcma_bus *bus);
++extern void bcma_core_pci_power_save(struct bcma_bus *bus, bool up);
 +
 +extern int bcma_core_pci_pcibios_map_irq(const struct pci_dev *dev);
 +extern int bcma_core_pci_plat_dev_init(struct pci_dev *dev);