/* host must be already claimed */ int ssb_sdio_switch_core(struct ssb_bus *bus, struct ssb_device *dev) { u8 coreidx = dev->core_index; u32 sbaddr; int error = 0; sbaddr = (coreidx * SSB_CORE_SIZE) + SSB_ENUM_BASE; if (unlikely(bus->sdio_sbaddr != sbaddr)) { #if SSB_VERBOSE_SDIOCORESWITCH_DEBUG dev_info(ssb_sdio_dev(bus), "switching to %s core, index %d\n", ssb_core_name(dev->id.coreid), coreidx); #endif error = ssb_sdio_set_sbaddr_window(bus, sbaddr); if (error) { dev_dbg(ssb_sdio_dev(bus), "failed to switch to" " core %u, error %d\n", coreidx, error); goto out; } bus->mapped_device = dev; } out: return error; }
int ssb_pci_switch_core(struct ssb_bus *bus, struct ssb_device *dev) { int err; unsigned long flags; ssb_dprintk(KERN_INFO PFX "Switching to %s core, index %d\n", ssb_core_name(dev->id.coreid), dev->core_index); spin_lock_irqsave(&bus->bar_lock, flags); err = ssb_pci_switch_coreidx(bus, dev->core_index); if (!err) bus->mapped_device = dev; spin_unlock_irqrestore(&bus->bar_lock, flags); return err; }