Example #1
0
File: ctc.c Project: dcobas/cvorj
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);
}
Example #2
0
File: ctc.c Project: dcobas/coht
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;

}
Example #3
0
/**
 * 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);
}
Example #4
0
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");
}
Example #5
0
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;
}
Example #6
0
/**
 * 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(&params, 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, &params.ioid_space);
	if (res) {
		goto out_err;
	}

	mem_index = set_mem_params(tvme200, &params.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;
}