static int __devinit ilo_map_device(struct pci_dev *pdev, struct ilo_hwinfo *hw) { int error = -ENOMEM; /* map the memory mapped i/o registers */ hw->mmio_vaddr = pci_iomap(pdev, 1, 0); if (hw->mmio_vaddr == NULL) { dev_err(&pdev->dev, "Error mapping mmio\n"); goto out; } /* map the adapter shared memory region */ hw->ram_vaddr = pci_iomap(pdev, 2, MAX_CCB * ILOHW_CCB_SZ); if (hw->ram_vaddr == NULL) { dev_err(&pdev->dev, "Error mapping shared mem\n"); goto mmio_free; } /* map the doorbell aperture */ hw->db_vaddr = pci_iomap(pdev, 3, MAX_CCB * ONE_DB_SIZE); if (hw->db_vaddr == NULL) { dev_err(&pdev->dev, "Error mapping doorbell\n"); goto ram_free; } return 0; ram_free: pci_iounmap(pdev, hw->ram_vaddr); mmio_free: pci_iounmap(pdev, hw->mmio_vaddr); out: return error; }
static void kvaser_pci_del_chan(struct net_device *dev) { struct sja1000_priv *priv; struct kvaser_pci *board; int i; if (!dev) return; priv = netdev_priv(dev); board = priv->priv; if (!board) return; dev_info(&board->pci_dev->dev, "Removing device %s\n", dev->name); /* Disable PCI interrupts */ kvaser_pci_disable_irq(dev); for (i = 0; i < board->no_channels - 1; i++) { if (board->slave_dev[i]) { dev_info(&board->pci_dev->dev, "Removing device %s\n", board->slave_dev[i]->name); unregister_sja1000dev(board->slave_dev[i]); free_sja1000dev(board->slave_dev[i]); } } unregister_sja1000dev(dev); pci_iounmap(board->pci_dev, priv->reg_base); pci_iounmap(board->pci_dev, board->conf_addr); pci_iounmap(board->pci_dev, board->res_addr); free_sja1000dev(dev); }
static void __devexit peak_pci_remove(struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); /* Last device */ struct sja1000_priv *priv = netdev_priv(dev); struct peak_pci_chan *chan = priv->priv; void __iomem *cfg_base = chan->cfg_base; void __iomem *reg_base = priv->reg_base; /* Disable interrupts */ writew(0x0, cfg_base + PITA_ICR + 2); /* Loop over all registered devices */ while (1) { dev_info(&pdev->dev, "removing device %s\n", dev->name); unregister_sja1000dev(dev); free_sja1000dev(dev); dev = chan->prev_dev; if (!dev) break; priv = netdev_priv(dev); chan = priv->priv; } pci_iounmap(pdev, reg_base); pci_iounmap(pdev, cfg_base); pci_release_regions(pdev); pci_disable_device(pdev); pci_set_drvdata(pdev, NULL); }
static void ems_pci_del_card(struct pci_dev *pdev) { struct ems_pci_card *card = pci_get_drvdata(pdev); struct net_device *dev; int i = 0; for (i = 0; i < card->channels; i++) { dev = card->net_dev[i]; if (!dev) continue; dev_info(&pdev->dev, "Removing %s.\n", dev->name); unregister_sja1000dev(dev); free_sja1000dev(dev); } if (card->base_addr != NULL) pci_iounmap(card->pci_dev, card->base_addr); if (card->conf_addr != NULL) pci_iounmap(card->pci_dev, card->conf_addr); kfree(card); pci_disable_device(pdev); pci_set_drvdata(pdev, NULL); }
static void orinoco_tmd_remove_one(struct pci_dev *pdev) { struct orinoco_private *priv = pci_get_drvdata(pdev); struct orinoco_pci_card *card = priv->card; orinoco_if_del(priv); free_irq(pdev->irq, priv); free_orinocodev(priv); pci_iounmap(pdev, priv->hw.iobase); pci_iounmap(pdev, card->bridge_io); pci_release_regions(pdev); pci_disable_device(pdev); }
int ast_driver_unload(struct drm_device *dev) { struct ast_private *ast = dev->dev_private; ast_mode_fini(dev); ast_fbdev_fini(dev); drm_mode_config_cleanup(dev); ast_mm_fini(ast); pci_iounmap(dev->pdev, ast->ioregs); pci_iounmap(dev->pdev, ast->regs); kfree(ast); return 0; }
static void ec_bhf_remove(struct pci_dev *dev) { struct net_device *net_dev = pci_get_drvdata(dev); struct ec_bhf_priv *priv = netdev_priv(net_dev); unregister_netdev(net_dev); free_netdev(net_dev); pci_iounmap(dev, priv->dma_io); pci_iounmap(dev, priv->io); pci_release_regions(dev); pci_clear_master(dev); pci_disable_device(dev); }
void virtio_pci_legacy_remove(struct virtio_pci_device *vp_dev) { struct pci_dev *pci_dev = vp_dev->pci_dev; pci_iounmap(pci_dev, vp_dev->ioaddr); pci_release_region(pci_dev, 0); }
/* Special reset function for Marathon CAN-bus-PCIe card */ static void plx_pci_reset_marathon_pcie(struct pci_dev *pdev) { void __iomem *addr; void __iomem *reset_addr; int i; plx9056_pci_reset_common(pdev); for (i = 0; i < 2; i++) { struct plx_pci_channel_map *chan_map = &plx_pci_card_info_marathon_pcie.chan_map_tbl[i]; addr = pci_iomap(pdev, chan_map->bar, chan_map->size); if (!addr) { dev_err(&pdev->dev, "Failed to remap reset " "space %d (BAR%d)\n", i, chan_map->bar); } else { /* reset the SJA1000 chip */ #define MARATHON_PCIE_RESET_OFFSET 32 reset_addr = addr + chan_map->offset + MARATHON_PCIE_RESET_OFFSET; iowrite8(0x1, reset_addr); udelay(100); pci_iounmap(pdev, addr); } } }
static int marvell_pata_active(struct pci_dev *pdev) { int i; u32 devices; void __iomem *barp; /* We don't yet know how to do this for other devices */ if (pdev->device != 0x6145) return 1; barp = pci_iomap(pdev, 5, 0x10); if (barp == NULL) return -ENOMEM; printk("BAR5:"); for(i = 0; i <= 0x0F; i++) printk("%02X:%02X ", i, ioread8(barp + i)); printk("\n"); devices = ioread32(barp + 0x0C); pci_iounmap(pdev, barp); if (devices & 0x10) return 1; return 0; }
/* Unmap the framebuffer from the core and release the memory */ static void mga_vram_fini(struct mga_device *mdev) { pci_iounmap(mdev->dev->pdev, mdev->rmmio); mdev->rmmio = NULL; if (mdev->mc.vram_base) release_mem_region(mdev->mc.vram_base, mdev->mc.vram_window); }
static void __devexit orinoco_plx_remove_one(struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); struct orinoco_private *priv = netdev_priv(dev); struct orinoco_pci_card *card = priv->card; unregister_netdev(dev); free_irq(pdev->irq, dev); pci_set_drvdata(pdev, NULL); free_orinocodev(dev); pci_iounmap(pdev, priv->hw.iobase); pci_iounmap(pdev, card->attr_io); pci_iounmap(pdev, card->bridge_io); pci_release_regions(pdev); pci_disable_device(pdev); }
static int marvell_pre_reset(struct ata_link *link, unsigned long deadline) { struct ata_port *ap = link->ap; struct pci_dev *pdev = to_pci_dev(ap->host->dev); u32 devices; void __iomem *barp; int i; /* Check if our port is enabled */ barp = pci_iomap(pdev, 5, 0x10); if (barp == NULL) return -ENOMEM; printk("BAR5:"); for(i = 0; i <= 0x0F; i++) printk("%02X:%02X ", i, ioread8(barp + i)); printk("\n"); devices = ioread32(barp + 0x0C); pci_iounmap(pdev, barp); if ((pdev->device == 0x6145) && (ap->port_no == 0) && (!(devices & 0x10))) /* PATA enable ? */ return -ENOENT; return ata_std_prereset(link, deadline); }
static void adf_cleanup_accel(struct adf_accel_dev *accel_dev) { struct adf_accel_pci *accel_pci_dev = &accel_dev->accel_pci_dev; int i; adf_dev_shutdown(accel_dev); for (i = 0; i < ADF_PCI_MAX_BARS; i++) { struct adf_bar *bar = &accel_pci_dev->pci_bars[i]; if (bar->virt_addr) pci_iounmap(accel_pci_dev->pci_dev, bar->virt_addr); } if (accel_dev->hw_device) { switch (accel_dev->hw_device->pci_dev_id) { case ADF_DH895XCC_PCI_DEVICE_ID: adf_clean_hw_data_dh895xcc(accel_dev->hw_device); break; default: break; } kfree(accel_dev->hw_device); } adf_cfg_dev_remove(accel_dev); debugfs_remove(accel_dev->debugfs_dir); adf_devmgr_rm_dev(accel_dev); pci_release_regions(accel_pci_dev->pci_dev); pci_disable_device(accel_pci_dev->pci_dev); kfree(accel_dev); }
/* Map the framebuffer from the card and configure the core */ static int mga_vram_init(struct mga_device *mdev) { void __iomem *mem; struct apertures_struct *aper = alloc_apertures(1); if (!aper) return -ENOMEM; /* BAR 0 is VRAM */ mdev->mc.vram_base = pci_resource_start(mdev->dev->pdev, 0); mdev->mc.vram_window = pci_resource_len(mdev->dev->pdev, 0); aper->ranges[0].base = mdev->mc.vram_base; aper->ranges[0].size = mdev->mc.vram_window; remove_conflicting_framebuffers(aper, "mgafb", true); kfree(aper); if (!devm_request_mem_region(mdev->dev->dev, mdev->mc.vram_base, mdev->mc.vram_window, "mgadrmfb_vram")) { DRM_ERROR("can't reserve VRAM\n"); return -ENXIO; } mem = pci_iomap(mdev->dev->pdev, 0, 0); mdev->mc.vram_size = mga_probe_vram(mdev, mem); pci_iounmap(mdev->dev->pdev, mem); return 0; }
static void wil_pcie_remove(struct pci_dev *pdev) { struct wil6210_priv *wil = pci_get_drvdata(pdev); void __iomem *csr = wil->csr; wil_dbg_misc(wil, "%s()\n", __func__); #ifdef CONFIG_PM #ifdef CONFIG_PM_SLEEP unregister_pm_notifier(&wil->pm_notify); #endif /* CONFIG_PM_SLEEP */ #endif /* CONFIG_PM */ wil6210_debugfs_remove(wil); rtnl_lock(); wil_p2p_wdev_free(wil); rtnl_unlock(); wil_if_remove(wil); wil_if_pcie_disable(wil); pci_iounmap(pdev, csr); pci_release_region(pdev, 0); pci_disable_device(pdev); if (wil->platform_ops.uninit) wil->platform_ops.uninit(wil->platform_handle); wil_if_free(wil); }
void xordev_remove(struct pci_dev *dev) /* PCI device destructor */ { struct xordev_str *xordev; int j; dev_t devt; mutex_lock(&global_lock); xordev = pci_get_drvdata(dev); iowrite32(0, xordev->bar + BAR_INTR_EN); /* disable interruptions */ free_irq(dev->irq, xordev); pci_iounmap(dev, xordev->bar); pci_release_regions(dev); pci_disable_device(dev); for (j = 0; j < 3; j++) { devt = MKDEV(MAJOR(xordev->devno), MINOR(xordev->devno) + j); device_destroy(xordev_class, devt); cdev_del(&xordev->cdev[j]); } mutex_destroy(&xordev->mutex); mutex_unlock(&global_lock); return ; }
/** * mei_remove - Device Removal Routine * * @pdev: PCI device structure * * mei_remove is called by the PCI subsystem to alert the driver * that it should release a PCI device. */ static void mei_me_remove(struct pci_dev *pdev) { struct mei_device *dev; struct mei_me_hw *hw; dev = pci_get_drvdata(pdev); if (!dev) return; hw = to_me_hw(dev); dev_dbg(&pdev->dev, "stop\n"); mei_stop(dev); /* disable interrupts */ mei_disable_interrupts(dev); free_irq(pdev->irq, dev); pci_disable_msi(pdev); if (hw->mem_addr) pci_iounmap(pdev, hw->mem_addr); mei_deregister(dev); kfree(dev); pci_release_regions(pdev); pci_disable_device(pdev); }
static int piix_disable_ahci(struct pci_dev *pdev) { void __iomem *mmio; u32 tmp; int rc = 0; /* BUG: pci_enable_device has not yet been called. This * works because this device is usually set up by BIOS. */ if (!pci_resource_start(pdev, AHCI_PCI_BAR) || !pci_resource_len(pdev, AHCI_PCI_BAR)) return 0; mmio = pci_iomap(pdev, AHCI_PCI_BAR, 64); if (!mmio) return -ENOMEM; tmp = readl(mmio + AHCI_GLOBAL_CTL); if (tmp & AHCI_ENABLE) { tmp &= ~AHCI_ENABLE; writel(tmp, mmio + AHCI_GLOBAL_CTL); tmp = readl(mmio + AHCI_GLOBAL_CTL); if (tmp & AHCI_ENABLE) rc = -EIO; } pci_iounmap(pdev, mmio); return rc; }
static void tpci200_unregister(struct tpci200_board *tpci200) { free_irq(tpci200->info->pdev->irq, (void *) tpci200); pci_iounmap(tpci200->info->pdev, tpci200->info->interface_regs); pci_iounmap(tpci200->info->pdev, tpci200->info->cfg_regs); pci_release_region(tpci200->info->pdev, TPCI200_IP_INTERFACE_BAR); pci_release_region(tpci200->info->pdev, TPCI200_IO_ID_INT_SPACES_BAR); pci_release_region(tpci200->info->pdev, TPCI200_MEM16_SPACE_BAR); pci_release_region(tpci200->info->pdev, TPCI200_MEM8_SPACE_BAR); pci_release_region(tpci200->info->pdev, TPCI200_CFG_MEM_BAR); pci_disable_device(tpci200->info->pdev); pci_dev_put(tpci200->info->pdev); }
/** * ci13xxx_pci_probe: PCI probe * @pdev: USB device controller being probed * @id: PCI hotplug ID connecting controller to UDC framework * * This function returns an error code * Allocates basic PCI resources for this USB device controller, and then * invokes the udc_probe() method to start the UDC associated with it */ static int __devinit ci13xxx_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { void __iomem *regs = NULL; int retval = 0; if (id == NULL) return -EINVAL; retval = pci_enable_device(pdev); if (retval) goto done; if (!pdev->irq) { dev_err(&pdev->dev, "No IRQ, check BIOS/PCI setup!"); retval = -ENODEV; goto disable_device; } retval = pci_request_regions(pdev, UDC_DRIVER_NAME); if (retval) goto disable_device; /* BAR 0 holds all the registers */ regs = pci_iomap(pdev, 0, 0); if (!regs) { dev_err(&pdev->dev, "Error mapping memory!"); retval = -EFAULT; goto release_regions; } pci_set_drvdata(pdev, (__force void *)regs); pci_set_master(pdev); pci_try_set_mwi(pdev); retval = udc_probe(&ci13xxx_pci_udc_driver, &pdev->dev, regs); if (retval) goto iounmap; /* our device does not have MSI capability */ retval = request_irq(pdev->irq, ci13xxx_pci_irq, IRQF_SHARED, UDC_DRIVER_NAME, pdev); if (retval) goto gadget_remove; return 0; gadget_remove: udc_remove(); iounmap: pci_iounmap(pdev, regs); release_regions: pci_release_regions(pdev); disable_device: pci_disable_device(pdev); done: return retval; }
static void orinoco_nortel_remove_one(struct pci_dev *pdev) { struct orinoco_private *priv = pci_get_drvdata(pdev); struct orinoco_pci_card *card = priv->card; /* Clear LEDs */ iowrite16(0, card->bridge_io + 10); orinoco_if_del(priv); free_irq(pdev->irq, priv); free_orinocodev(priv); pci_iounmap(pdev, priv->hw.iobase); pci_iounmap(pdev, card->attr_io); pci_iounmap(pdev, card->bridge_io); pci_release_regions(pdev); pci_disable_device(pdev); }
static void hypercall_cleanup_dev(struct hypercall_dev *dev) { DPRINTK("cleaning up\n"); pci_release_regions(dev->pci_dev); pci_iounmap(dev->pci_dev, (void*)dev->io_addr); pci_set_drvdata (dev->pci_dev, NULL); kfree(dev); }
/** * ci13xxx_pci_remove: PCI remove * @pdev: USB Device Controller being removed * * Reverses the effect of ci13xxx_pci_probe(), * first invoking the udc_remove() and then releases * all PCI resources allocated for this USB device controller */ static void __devexit ci13xxx_pci_remove(struct pci_dev *pdev) { free_irq(pdev->irq, pdev); udc_remove(); pci_iounmap(pdev, (__force void __iomem *)pci_get_drvdata(pdev)); pci_release_regions(pdev); pci_disable_device(pdev); }
static void __devexit agnx_pci_remove(struct pci_dev *pdev) { struct ieee80211_hw *dev = pci_get_drvdata(pdev); struct agnx_priv *priv; AGNX_TRACE; if (!dev) return; priv = dev->priv; ieee80211_unregister_hw(dev); pci_iounmap(pdev, priv->ctl); pci_iounmap(pdev, priv->data); pci_release_regions(pdev); pci_disable_device(pdev); ieee80211_free_hw(dev); }
static void ath_pci_cleanup(struct ath_softc *sc) { struct pci_dev *pdev = to_pci_dev(sc->dev); pci_iounmap(pdev, sc->mem); pci_disable_device(pdev); pci_release_region(pdev, 0); }
static int __devinit geode_aes_probe(struct pci_dev *dev, const struct pci_device_id *id) { int ret; ret = pci_enable_device(dev); if (ret) return ret; ret = pci_request_regions(dev, "geode-aes"); if (ret) goto eenable; _iobase = pci_iomap(dev, 0, 0); if (_iobase == NULL) { ret = -ENOMEM; goto erequest; } spin_lock_init(&lock); /* Clear any pending activity */ iowrite32(AES_INTR_PENDING | AES_INTR_MASK, _iobase + AES_INTR_REG); ret = crypto_register_alg(&geode_alg); if (ret) goto eiomap; ret = crypto_register_alg(&geode_ecb_alg); if (ret) goto ealg; ret = crypto_register_alg(&geode_cbc_alg); if (ret) goto eecb; printk(KERN_NOTICE "geode-aes: GEODE AES engine enabled.\n"); return 0; eecb: crypto_unregister_alg(&geode_ecb_alg); ealg: crypto_unregister_alg(&geode_alg); eiomap: pci_iounmap(dev, _iobase); erequest: pci_release_regions(dev); eenable: pci_disable_device(dev); printk(KERN_ERR "geode-aes: GEODE AES initialization failed.\n"); return ret; }
static int i2c_vr_unmapregs(struct pci_dev *dev, int idx) { if (!dev || idx >= I2C_VR_ADAP_NR) return -EINVAL; if (i2c_vr[idx].regs) pci_iounmap(dev, i2c_vr[idx].regs); return 0; }
static void mei_txe_pci_iounmap(struct pci_dev *pdev, struct mei_txe_hw *hw) { int i; for (i = SEC_BAR; i < NUM_OF_MEM_BARS; i++) { if (hw->mem_addr[i]) { pci_iounmap(pdev, hw->mem_addr[i]); hw->mem_addr[i] = NULL; } } }
/** * genwqe_pci_remove() - Free PCIe related resources for our card */ static void genwqe_pci_remove(struct genwqe_dev *cd) { struct pci_dev *pci_dev = cd->pci_dev; if (cd->mmio) pci_iounmap(pci_dev, cd->mmio); pci_release_mem_regions(pci_dev); pci_disable_device(pci_dev); }