#include <linux/ssb/ssb.h>
#include <linux/export.h>
#include <linux/ssb/ssb_embedded.h>
static u32 ssb_pcie_read(struct ssb_pcicore *pc, u32 address);
static void ssb_pcie_write(struct ssb_pcicore *pc, u32 address, u32 data);
static u16 ssb_pcie_mdio_read(struct ssb_pcicore *pc, u8 device, u8 address);
static void ssb_pcie_mdio_write(struct ssb_pcicore *pc, u8 device,
u32 pcicore_read32(struct ssb_pcicore *pc, u16 offset)
return ssb_read32(pc->dev, offset);
void pcicore_write32(struct ssb_pcicore *pc, u16 offset, u32 value)
ssb_write32(pc->dev, offset, value);
u16 pcicore_read16(struct ssb_pcicore *pc, u16 offset)
return ssb_read16(pc->dev, offset);
void pcicore_write16(struct ssb_pcicore *pc, u16 offset, u16 value)
ssb_write16(pc->dev, offset, value);
#ifdef CONFIG_SSB_PCICORE_HOSTMODE
#define mips_busprobe32(val, addr) get_dbe((val), ((u32 *)(addr)))
#define SSB_PCI_SLOT_MAX 16
static DEFINE_SPINLOCK(cfgspace_lock);
static struct ssb_pcicore *extpci_core;
static u32 get_cfgspace_addr(struct ssb_pcicore *pc,
unsigned int bus, unsigned int dev,
unsigned int func, unsigned int off)
if (pc->cardbusmode && (dev > 1))
if (unlikely(dev >= SSB_PCI_SLOT_MAX))
tmp = SSB_PCICORE_SBTOPCI_CFG0;
tmp |= ((1 << (dev + 16)) & SSB_PCICORE_SBTOPCI1_MASK);
pcicore_write32(pc, SSB_PCICORE_SBTOPCI1, tmp);
addr |= ((1 << (dev + 16)) & ~SSB_PCICORE_SBTOPCI1_MASK);