Loading drivers/bcma/Kconfig +5 −0 Original line number Diff line number Diff line Loading @@ -13,6 +13,11 @@ config BCMA Bus driver for Broadcom specific Advanced Microcontroller Bus Architecture. # Support for Block-I/O. SELECT this from the driver that needs it. config BCMA_BLOCKIO bool depends on BCMA config BCMA_HOST_PCI_POSSIBLE bool depends on BCMA && PCI = y Loading drivers/bcma/Makefile +1 −1 Original line number Diff line number Diff line bcma-y += main.o scan.o core.o bcma-y += main.o scan.o core.o sprom.o bcma-y += driver_chipcommon.o driver_chipcommon_pmu.o bcma-y += driver_pci.o bcma-$(CONFIG_BCMA_HOST_PCI) += host_pci.o Loading drivers/bcma/bcma_private.h +3 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,9 @@ extern void bcma_bus_unregister(struct bcma_bus *bus); /* scan.c */ int bcma_bus_scan(struct bcma_bus *bus); /* sprom.c */ int bcma_sprom_get(struct bcma_bus *bus); #ifdef CONFIG_BCMA_HOST_PCI /* host_pci.c */ extern int __init bcma_host_pci_init(void); Loading drivers/bcma/driver_pci.c +23 −0 Original line number Diff line number Diff line Loading @@ -161,3 +161,26 @@ void bcma_core_pci_init(struct bcma_drv_pci *pc) { bcma_pcicore_serdes_workaround(pc); } int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc, struct bcma_device *core, bool enable) { struct pci_dev *pdev = pc->core->bus->host_pci; u32 coremask, tmp; int err; err = pci_read_config_dword(pdev, BCMA_PCI_IRQMASK, &tmp); if (err) goto out; coremask = BIT(core->core_index) << 8; if (enable) tmp |= coremask; else tmp &= ~coremask; err = pci_write_config_dword(pdev, BCMA_PCI_IRQMASK, tmp); out: return err; } drivers/bcma/host_pci.c +52 −0 Original line number Diff line number Diff line Loading @@ -65,6 +65,54 @@ static void bcma_host_pci_write32(struct bcma_device *core, u16 offset, iowrite32(value, core->bus->mmio + offset); } #ifdef CONFIG_BCMA_BLOCKIO void bcma_host_pci_block_read(struct bcma_device *core, void *buffer, size_t count, u16 offset, u8 reg_width) { void __iomem *addr = core->bus->mmio + offset; if (core->bus->mapped_core != core) bcma_host_pci_switch_core(core); switch (reg_width) { case sizeof(u8): ioread8_rep(addr, buffer, count); break; case sizeof(u16): WARN_ON(count & 1); ioread16_rep(addr, buffer, count >> 1); break; case sizeof(u32): WARN_ON(count & 3); ioread32_rep(addr, buffer, count >> 2); break; default: WARN_ON(1); } } void bcma_host_pci_block_write(struct bcma_device *core, const void *buffer, size_t count, u16 offset, u8 reg_width) { void __iomem *addr = core->bus->mmio + offset; if (core->bus->mapped_core != core) bcma_host_pci_switch_core(core); switch (reg_width) { case sizeof(u8): iowrite8_rep(addr, buffer, count); break; case sizeof(u16): WARN_ON(count & 1); iowrite16_rep(addr, buffer, count >> 1); break; case sizeof(u32): WARN_ON(count & 3); iowrite32_rep(addr, buffer, count >> 2); break; default: WARN_ON(1); } } #endif static u32 bcma_host_pci_aread32(struct bcma_device *core, u16 offset) { if (core->bus->mapped_core != core) Loading @@ -87,6 +135,10 @@ const struct bcma_host_ops bcma_host_pci_ops = { .write8 = bcma_host_pci_write8, .write16 = bcma_host_pci_write16, .write32 = bcma_host_pci_write32, #ifdef CONFIG_BCMA_BLOCKIO .block_read = bcma_host_pci_block_read, .block_write = bcma_host_pci_block_write, #endif .aread32 = bcma_host_pci_aread32, .awrite32 = bcma_host_pci_awrite32, }; Loading Loading
drivers/bcma/Kconfig +5 −0 Original line number Diff line number Diff line Loading @@ -13,6 +13,11 @@ config BCMA Bus driver for Broadcom specific Advanced Microcontroller Bus Architecture. # Support for Block-I/O. SELECT this from the driver that needs it. config BCMA_BLOCKIO bool depends on BCMA config BCMA_HOST_PCI_POSSIBLE bool depends on BCMA && PCI = y Loading
drivers/bcma/Makefile +1 −1 Original line number Diff line number Diff line bcma-y += main.o scan.o core.o bcma-y += main.o scan.o core.o sprom.o bcma-y += driver_chipcommon.o driver_chipcommon_pmu.o bcma-y += driver_pci.o bcma-$(CONFIG_BCMA_HOST_PCI) += host_pci.o Loading
drivers/bcma/bcma_private.h +3 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,9 @@ extern void bcma_bus_unregister(struct bcma_bus *bus); /* scan.c */ int bcma_bus_scan(struct bcma_bus *bus); /* sprom.c */ int bcma_sprom_get(struct bcma_bus *bus); #ifdef CONFIG_BCMA_HOST_PCI /* host_pci.c */ extern int __init bcma_host_pci_init(void); Loading
drivers/bcma/driver_pci.c +23 −0 Original line number Diff line number Diff line Loading @@ -161,3 +161,26 @@ void bcma_core_pci_init(struct bcma_drv_pci *pc) { bcma_pcicore_serdes_workaround(pc); } int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc, struct bcma_device *core, bool enable) { struct pci_dev *pdev = pc->core->bus->host_pci; u32 coremask, tmp; int err; err = pci_read_config_dword(pdev, BCMA_PCI_IRQMASK, &tmp); if (err) goto out; coremask = BIT(core->core_index) << 8; if (enable) tmp |= coremask; else tmp &= ~coremask; err = pci_write_config_dword(pdev, BCMA_PCI_IRQMASK, tmp); out: return err; }
drivers/bcma/host_pci.c +52 −0 Original line number Diff line number Diff line Loading @@ -65,6 +65,54 @@ static void bcma_host_pci_write32(struct bcma_device *core, u16 offset, iowrite32(value, core->bus->mmio + offset); } #ifdef CONFIG_BCMA_BLOCKIO void bcma_host_pci_block_read(struct bcma_device *core, void *buffer, size_t count, u16 offset, u8 reg_width) { void __iomem *addr = core->bus->mmio + offset; if (core->bus->mapped_core != core) bcma_host_pci_switch_core(core); switch (reg_width) { case sizeof(u8): ioread8_rep(addr, buffer, count); break; case sizeof(u16): WARN_ON(count & 1); ioread16_rep(addr, buffer, count >> 1); break; case sizeof(u32): WARN_ON(count & 3); ioread32_rep(addr, buffer, count >> 2); break; default: WARN_ON(1); } } void bcma_host_pci_block_write(struct bcma_device *core, const void *buffer, size_t count, u16 offset, u8 reg_width) { void __iomem *addr = core->bus->mmio + offset; if (core->bus->mapped_core != core) bcma_host_pci_switch_core(core); switch (reg_width) { case sizeof(u8): iowrite8_rep(addr, buffer, count); break; case sizeof(u16): WARN_ON(count & 1); iowrite16_rep(addr, buffer, count >> 1); break; case sizeof(u32): WARN_ON(count & 3); iowrite32_rep(addr, buffer, count >> 2); break; default: WARN_ON(1); } } #endif static u32 bcma_host_pci_aread32(struct bcma_device *core, u16 offset) { if (core->bus->mapped_core != core) Loading @@ -87,6 +135,10 @@ const struct bcma_host_ops bcma_host_pci_ops = { .write8 = bcma_host_pci_write8, .write16 = bcma_host_pci_write16, .write32 = bcma_host_pci_write32, #ifdef CONFIG_BCMA_BLOCKIO .block_read = bcma_host_pci_block_read, .block_write = bcma_host_pci_block_write, #endif .aread32 = bcma_host_pci_aread32, .awrite32 = bcma_host_pci_awrite32, }; Loading