void unregister_module(struct vmeio_device *dev) { if (dev->vector) vme_free_irq(dev->vector); if (dev->maps[0].kernel_va) vme_release_mapping(&dev->maps[0], 1); if (dev->maps[1].kernel_va) vme_release_mapping(&dev->maps[1], 1); }
int install_device(struct vmeio_device *dev, unsigned i) { memset(dev, 0, sizeof(*dev)); dev->lun = lun[i]; dev->debug = DEBUG; /* configure mmapped I/O */ if (base_address1_num && map(&dev->maps[0], base_address1[i], data_width1, am1, size1)) { printk(KERN_ERR PFX "could not map lun:%d, first space\n", dev->lun); goto out_map1; } if (base_address2_num && map(&dev->maps[1], base_address2[i], data_width2, am2, size2)) { printk(KERN_ERR PFX "could not map lun:%d, second space\n", dev->lun); goto out_map2; } /* configure interrupt handling */ dev->vector = vector[i]; dev->level = level; dev->isrc = isrc; dev->timeout = msecs_to_jiffies(TIMEOUT); dev->icnt = 0; init_waitqueue_head(&dev->queue); if (dev->level && dev->vector && register_isr(dev, dev->vector, dev->level) < 0) { printk(KERN_ERR PFX "could not register isr " "for vector %d, level %d\n", dev->vector, dev->level); goto out_isr; } /* This will be eventually removed */ register_int_source(dev, dev->maps[0].kernel_va, dev->isrc); return 0; out_isr: vme_release_mapping(&dev->maps[1], 1); out_map2: vme_release_mapping(&dev->maps[0], 1); out_map1: return -ENODEV; }
/** * tvme200_unregister Unregister a TVME200 board. * * @carrier Base structure of the board. * */ static void tvme200_unregister(struct tvme200_board *tvme200) { int error = 0; error = vme_release_mapping(&tvme200->info->ioid_mapping, 1); error |= vme_release_mapping(&tvme200->info->mem_mapping, 1); if (!error) dev_info(tvme200->info->dev,"%s: vme mappings released\n", __func__); else dev_info(tvme200->info->dev,"%s: can't release vme mappings [err %d]\n", __func__,error); kfree(tvme200->slots); }
void ctrirq_exit(void) { DisableCtrInterrupt(); DisableCtrModule(); if (vme_free_irq(CTR_IRQ_VECTOR)) printk(KERN_WARNING PFX "Failed to free irq\n"); if (vme_release_mapping(&ctr_desc, 1) != 0) printk(KERN_WARNING PFX "Failed to release mapping\n"); }
int ctrirq_init(void) { int rc; if ((rc = vme_find_mapping(&ctr_desc, 1)) != 0) { printk(KERN_ERR PFX "Failed to map CTR_n"); return rc; } vmeaddr = ctr_desc.kernel_va; mmap = (CtrDrvrMemoryMap *) vmeaddr; ResetCtr(); EnableCtrModule(); if ((rc = vme_request_irq(CTR_IRQ_VECTOR, IntrHandler, &ctr_desc, "ctrirq")) != 0) { printk(KERN_ERR PFX "Failed to register interrupt handler\n"); goto out_unmap; } EnableCtrInterrupt(); show_ctr_info(); return 0; out_unmap: DisableCtrModule(); if (vme_release_mapping(&ctr_desc, 1) != 0) printk(KERN_WARNING PFX "Failed to release mapping on error\n"); return rc; }
/** * tvme200_init_mem - Initialisation of the TVME200 board. * * @carrier Base structure of the carrier. * @dev_specific Specific device informations. * */ static int tvme200_init_mem(struct tvme200_board *tvme200) { int res = 0; struct tvme200_infos *info = tvme200->info; struct device *dev = tvme200->info->dev; int mem_index; struct params_vme params; int ndev = tvme200->number; phys_addr_t ioidint_base; memset(¶ms, 0, sizeof(struct params_vme)); params.ioid_space.address_modifier = mod_address_ioid[ndev]; params.ioid_space.base_address = base_address_ioid[ndev]; params.ioid_space.data_width = data_width_ioid[ndev]; params.ioid_space.window_size = wind_size_ioid[ndev]; params.mem_space.address_modifier = mod_address_mem[ndev]; params.mem_space.base_address = base_address_mem[ndev]; params.mem_space.data_width = data_width_mem[ndev]; params.mem_space.window_size = wind_size_mem[ndev]; res = set_ioid_params(tvme200, ¶ms.ioid_space); if (res) { goto out_err; } mem_index = set_mem_params(tvme200, ¶ms.mem_space); if (mem_index < 0){ res = -EINVAL; goto out_err; } res = vme_find_mapping(&info->ioid_mapping, 1); if (res) { dev_err(dev, "Carrier [%s %d] unable to find window mapping for IO space !\n", TVME200_SHORTNAME, tvme200->lun); goto out_err; } res = vme_find_mapping(&info->mem_mapping, 1); if (res) { dev_err(dev, "Carrier [%s %d] unable to find window mapping for MEM space !\n", TVME200_SHORTNAME, tvme200->lun); goto out_release_ioid; } ioidint_base = info->ioid_mapping.pci_addrl; tvme200->mod_mem[IPACK_IO_SPACE] = ioidint_base + TVME200_IO_SPACE_OFF; tvme200->mod_mem[IPACK_ID_SPACE] = ioidint_base + TVME200_ID_SPACE_OFF; tvme200->mod_mem[IPACK_INT_SPACE] = ioidint_base + TVME200_INT_SPACE_OFF; spin_lock_init(&tvme200->regs_lock); return 0; out_release_ioid : vme_release_mapping(&tvme200->info->ioid_mapping, 1); out_err : return res; }