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; }
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"); }
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); }
static void __exit pio2_exit(void) { vme_unregister_driver(&pio2_driver); }
static void __exit vme_user_exit(void) { vme_unregister_driver(&vme_user_driver); kfree(vme_user_driver.bind_table); }