Loading drivers/bcma/driver_pci.c +44 −22 Original line number Diff line number Diff line Loading @@ -144,6 +144,47 @@ static u16 bcma_pcie_mdio_writeread(struct bcma_drv_pci *pc, u16 device, return bcma_pcie_mdio_read(pc, device, address); } /************************************************** * Early init. **************************************************/ static void bcma_core_pci_fixcfg(struct bcma_drv_pci *pc) { struct bcma_device *core = pc->core; u16 val16, core_index; uint regoff; regoff = BCMA_CORE_PCI_SPROM(BCMA_CORE_PCI_SPROM_PI_OFFSET); core_index = (u16)core->core_index; val16 = pcicore_read16(pc, regoff); if (((val16 & BCMA_CORE_PCI_SPROM_PI_MASK) >> BCMA_CORE_PCI_SPROM_PI_SHIFT) != core_index) { val16 = (core_index << BCMA_CORE_PCI_SPROM_PI_SHIFT) | (val16 & ~BCMA_CORE_PCI_SPROM_PI_MASK); pcicore_write16(pc, regoff, val16); } } /* * Apply some early fixes required before accessing SPROM. * See also si_pci_fixcfg. */ void bcma_core_pci_early_init(struct bcma_drv_pci *pc) { if (pc->early_setup_done) return; pc->hostmode = bcma_core_pci_is_in_hostmode(pc); if (pc->hostmode) goto out; bcma_core_pci_fixcfg(pc); out: pc->early_setup_done = true; } /************************************************** * Workarounds. **************************************************/ Loading Loading @@ -175,24 +216,6 @@ static void bcma_pcicore_serdes_workaround(struct bcma_drv_pci *pc) tmp & ~BCMA_CORE_PCI_PLL_CTRL_FREQDET_EN); } static void bcma_core_pci_fixcfg(struct bcma_drv_pci *pc) { struct bcma_device *core = pc->core; u16 val16, core_index; uint regoff; regoff = BCMA_CORE_PCI_SPROM(BCMA_CORE_PCI_SPROM_PI_OFFSET); core_index = (u16)core->core_index; val16 = pcicore_read16(pc, regoff); if (((val16 & BCMA_CORE_PCI_SPROM_PI_MASK) >> BCMA_CORE_PCI_SPROM_PI_SHIFT) != core_index) { val16 = (core_index << BCMA_CORE_PCI_SPROM_PI_SHIFT) | (val16 & ~BCMA_CORE_PCI_SPROM_PI_MASK); pcicore_write16(pc, regoff, val16); } } /* Fix MISC config to allow coming out of L2/L3-Ready state w/o PRST */ /* Needs to happen when coming out of 'standby'/'hibernate' */ static void bcma_core_pci_config_fixup(struct bcma_drv_pci *pc) Loading @@ -216,7 +239,6 @@ static void bcma_core_pci_config_fixup(struct bcma_drv_pci *pc) static void bcma_core_pci_clientmode_init(struct bcma_drv_pci *pc) { bcma_core_pci_fixcfg(pc); bcma_pcicore_serdes_workaround(pc); bcma_core_pci_config_fixup(pc); } Loading @@ -226,11 +248,11 @@ void bcma_core_pci_init(struct bcma_drv_pci *pc) if (pc->setup_done) return; pc->hostmode = bcma_core_pci_is_in_hostmode(pc); bcma_core_pci_early_init(pc); if (pc->hostmode) bcma_core_pci_hostmode_init(pc); if (!pc->hostmode) else bcma_core_pci_clientmode_init(pc); } Loading drivers/bcma/main.c +7 −0 Original line number Diff line number Diff line Loading @@ -402,6 +402,13 @@ int bcma_bus_register(struct bcma_bus *bus) bcma_core_chipcommon_early_init(&bus->drv_cc); } /* Early init PCIE core */ core = bcma_find_core(bus, BCMA_CORE_PCIE); if (core) { bus->drv_pci[0].core = core; bcma_core_pci_early_init(&bus->drv_pci[0]); } /* Cores providing flash access go before SPROM init */ list_for_each_entry(core, &bus->cores, list) { if (bcma_is_core_needed_early(core->id.id)) Loading include/linux/bcma/bcma_driver_pci.h +2 −0 Original line number Diff line number Diff line Loading @@ -223,6 +223,7 @@ struct bcma_drv_pci_host { struct bcma_drv_pci { struct bcma_device *core; u8 early_setup_done:1; u8 setup_done:1; u8 hostmode:1; Loading @@ -237,6 +238,7 @@ struct bcma_drv_pci { #define pcicore_write16(pc, offset, val) bcma_write16((pc)->core, offset, val) #define pcicore_write32(pc, offset, val) bcma_write32((pc)->core, offset, val) extern void bcma_core_pci_early_init(struct bcma_drv_pci *pc); extern void 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); Loading Loading
drivers/bcma/driver_pci.c +44 −22 Original line number Diff line number Diff line Loading @@ -144,6 +144,47 @@ static u16 bcma_pcie_mdio_writeread(struct bcma_drv_pci *pc, u16 device, return bcma_pcie_mdio_read(pc, device, address); } /************************************************** * Early init. **************************************************/ static void bcma_core_pci_fixcfg(struct bcma_drv_pci *pc) { struct bcma_device *core = pc->core; u16 val16, core_index; uint regoff; regoff = BCMA_CORE_PCI_SPROM(BCMA_CORE_PCI_SPROM_PI_OFFSET); core_index = (u16)core->core_index; val16 = pcicore_read16(pc, regoff); if (((val16 & BCMA_CORE_PCI_SPROM_PI_MASK) >> BCMA_CORE_PCI_SPROM_PI_SHIFT) != core_index) { val16 = (core_index << BCMA_CORE_PCI_SPROM_PI_SHIFT) | (val16 & ~BCMA_CORE_PCI_SPROM_PI_MASK); pcicore_write16(pc, regoff, val16); } } /* * Apply some early fixes required before accessing SPROM. * See also si_pci_fixcfg. */ void bcma_core_pci_early_init(struct bcma_drv_pci *pc) { if (pc->early_setup_done) return; pc->hostmode = bcma_core_pci_is_in_hostmode(pc); if (pc->hostmode) goto out; bcma_core_pci_fixcfg(pc); out: pc->early_setup_done = true; } /************************************************** * Workarounds. **************************************************/ Loading Loading @@ -175,24 +216,6 @@ static void bcma_pcicore_serdes_workaround(struct bcma_drv_pci *pc) tmp & ~BCMA_CORE_PCI_PLL_CTRL_FREQDET_EN); } static void bcma_core_pci_fixcfg(struct bcma_drv_pci *pc) { struct bcma_device *core = pc->core; u16 val16, core_index; uint regoff; regoff = BCMA_CORE_PCI_SPROM(BCMA_CORE_PCI_SPROM_PI_OFFSET); core_index = (u16)core->core_index; val16 = pcicore_read16(pc, regoff); if (((val16 & BCMA_CORE_PCI_SPROM_PI_MASK) >> BCMA_CORE_PCI_SPROM_PI_SHIFT) != core_index) { val16 = (core_index << BCMA_CORE_PCI_SPROM_PI_SHIFT) | (val16 & ~BCMA_CORE_PCI_SPROM_PI_MASK); pcicore_write16(pc, regoff, val16); } } /* Fix MISC config to allow coming out of L2/L3-Ready state w/o PRST */ /* Needs to happen when coming out of 'standby'/'hibernate' */ static void bcma_core_pci_config_fixup(struct bcma_drv_pci *pc) Loading @@ -216,7 +239,6 @@ static void bcma_core_pci_config_fixup(struct bcma_drv_pci *pc) static void bcma_core_pci_clientmode_init(struct bcma_drv_pci *pc) { bcma_core_pci_fixcfg(pc); bcma_pcicore_serdes_workaround(pc); bcma_core_pci_config_fixup(pc); } Loading @@ -226,11 +248,11 @@ void bcma_core_pci_init(struct bcma_drv_pci *pc) if (pc->setup_done) return; pc->hostmode = bcma_core_pci_is_in_hostmode(pc); bcma_core_pci_early_init(pc); if (pc->hostmode) bcma_core_pci_hostmode_init(pc); if (!pc->hostmode) else bcma_core_pci_clientmode_init(pc); } Loading
drivers/bcma/main.c +7 −0 Original line number Diff line number Diff line Loading @@ -402,6 +402,13 @@ int bcma_bus_register(struct bcma_bus *bus) bcma_core_chipcommon_early_init(&bus->drv_cc); } /* Early init PCIE core */ core = bcma_find_core(bus, BCMA_CORE_PCIE); if (core) { bus->drv_pci[0].core = core; bcma_core_pci_early_init(&bus->drv_pci[0]); } /* Cores providing flash access go before SPROM init */ list_for_each_entry(core, &bus->cores, list) { if (bcma_is_core_needed_early(core->id.id)) Loading
include/linux/bcma/bcma_driver_pci.h +2 −0 Original line number Diff line number Diff line Loading @@ -223,6 +223,7 @@ struct bcma_drv_pci_host { struct bcma_drv_pci { struct bcma_device *core; u8 early_setup_done:1; u8 setup_done:1; u8 hostmode:1; Loading @@ -237,6 +238,7 @@ struct bcma_drv_pci { #define pcicore_write16(pc, offset, val) bcma_write16((pc)->core, offset, val) #define pcicore_write32(pc, offset, val) bcma_write32((pc)->core, offset, val) extern void bcma_core_pci_early_init(struct bcma_drv_pci *pc); extern void 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); Loading