Example #1
0
static int __init vme_user_init(void)
{
	int retval = 0;
	int i;
	struct vme_device_id *ids;

	printk(KERN_INFO "VME User Space Access Driver\n");

	if (bus_num == 0) {
		printk(KERN_ERR "%s: No cards, skipping registration\n",
			driver_name);
		goto err_nocard;
	}

	/* Let's start by supporting one bus, we can support more than one
	 * in future revisions if that ever becomes necessary.
	 */
	if (bus_num > USER_BUS_MAX) {
		printk(KERN_ERR "%s: Driver only able to handle %d PIO2 "
			"Cards\n", driver_name, USER_BUS_MAX);
		bus_num = USER_BUS_MAX;
	}


	/* Dynamically create the bind table based on module parameters */
	ids = kmalloc(sizeof(struct vme_device_id) * (bus_num + 1), GFP_KERNEL);
	if (ids == NULL) {
		printk(KERN_ERR "%s: Unable to allocate ID table\n",
			driver_name);
		goto err_id;
	}

	memset(ids, 0, (sizeof(struct vme_device_id) * (bus_num + 1)));

	for (i = 0; i < bus_num; i++) {
		ids[i].bus = bus[i];
		/*
		 * We register the driver against the slot occupied by *this*
		 * card, since it's really a low level way of controlling
		 * the VME bridge
		 */
		ids[i].slot = VME_SLOT_CURRENT;
	}

	vme_user_driver.bind_table = ids;

	retval = vme_register_driver(&vme_user_driver);
	if (retval != 0)
		goto err_reg;

	return retval;

	vme_unregister_driver(&vme_user_driver);
err_reg:
	kfree(ids);
err_id:
err_nocard:
	return retval;
}
Example #2
0
static void __exit tvme200_exit(void)
{
	printk(KERN_INFO PFX "Carrier driver unloading...\n");

	vme_unregister_driver(&tvme200_driver);
	kfree(carrier_boards);

	printk(KERN_INFO PFX "Carrier driver unloaded.\n");
}
Example #3
0
static void __exit cvorb_exit_module(void)
{
	dev_t devno = MKDEV(MAJOR(cvorb_devno), 0);

	vme_unregister_driver(&cvorb_driver);
	unregister_chrdev_region(devno, num_lun);
	/* some sysfs cleaning before leaving the module */
	cvorb_sysfs_exit_module();
	class_destroy(cvorb_class);
}
Example #4
0
static void __exit pio2_exit(void)
{
	vme_unregister_driver(&pio2_driver);
}
Example #5
0
static void __exit vme_user_exit(void)
{
	vme_unregister_driver(&vme_user_driver);

	kfree(vme_user_driver.bind_table);
}