static int __init iforce_init(void)
 {
+       int err = 0;
+
 #ifdef CONFIG_JOYSTICK_IFORCE_USB
-       usb_register(&iforce_usb_driver);
+       err = usb_register(&iforce_usb_driver);
+       if (err)
+               return err;
 #endif
 #ifdef CONFIG_JOYSTICK_IFORCE_232
-       serio_register_driver(&iforce_serio_drv);
+       err = serio_register_driver(&iforce_serio_drv);
+#ifdef CONFIG_JOYSTICK_IFORCE_USB
+       if (err)
+               usb_deregister(&iforce_usb_driver);
 #endif
-       return 0;
+#endif
+       return err;
 }
 
 static void __exit iforce_exit(void)
 
 
 static int __init magellan_init(void)
 {
-       serio_register_driver(&magellan_drv);
-       return 0;
+       return serio_register_driver(&magellan_drv);
 }
 
 static void __exit magellan_exit(void)
 
 
 static int __init spaceball_init(void)
 {
-       serio_register_driver(&spaceball_drv);
-       return 0;
+       return serio_register_driver(&spaceball_drv);
 }
 
 static void __exit spaceball_exit(void)
 
 
 static int __init spaceorb_init(void)
 {
-       serio_register_driver(&spaceorb_drv);
-       return 0;
+       return serio_register_driver(&spaceorb_drv);
 }
 
 static void __exit spaceorb_exit(void)
 
 
 static int __init stinger_init(void)
 {
-       serio_register_driver(&stinger_drv);
-       return 0;
+       return serio_register_driver(&stinger_drv);
 }
 
 static void __exit stinger_exit(void)
 
 
 static int __init twidjoy_init(void)
 {
-       serio_register_driver(&twidjoy_drv);
-       return 0;
+       return serio_register_driver(&twidjoy_drv);
 }
 
 static void __exit twidjoy_exit(void)
 
 
 static int __init warrior_init(void)
 {
-       serio_register_driver(&warrior_drv);
-       return 0;
+       return serio_register_driver(&warrior_drv);
 }
 
 static void __exit warrior_exit(void)
 
 
 static int __init atkbd_init(void)
 {
-       serio_register_driver(&atkbd_drv);
-       return 0;
+       return serio_register_driver(&atkbd_drv);
 }
 
 static void __exit atkbd_exit(void)
 
 
 static int __init hil_kbd_init(void)
 {
-       serio_register_driver(&hil_kbd_serio_drv);
-        return 0;
+       return serio_register_driver(&hil_kbd_serio_drv);
 }
                 
 static void __exit hil_kbd_exit(void)
 
 static int __init
 lkkbd_init (void)
 {
-       serio_register_driver(&lkkbd_drv);
-       return 0;
+       return serio_register_driver(&lkkbd_drv);
 }
 
 static void __exit
 
 
 static int __init nkbd_init(void)
 {
-       serio_register_driver(&nkbd_drv);
-       return 0;
+       return serio_register_driver(&nkbd_drv);
 }
 
 static void __exit nkbd_exit(void)
 
 
 static int __init skbd_init(void)
 {
-       serio_register_driver(&skbd_drv);
-       return 0;
+       return serio_register_driver(&skbd_drv);
 }
 
 static void __exit skbd_exit(void)
 
 
 static int __init sunkbd_init(void)
 {
-       serio_register_driver(&sunkbd_drv);
-       return 0;
+       return serio_register_driver(&sunkbd_drv);
 }
 
 static void __exit sunkbd_exit(void)
 
 
 static int __init xtkbd_init(void)
 {
-       serio_register_driver(&xtkbd_drv);
-       return 0;
+       return serio_register_driver(&xtkbd_drv);
 }
 
 static void __exit xtkbd_exit(void)
 
 
 static int __init hil_ptr_init(void)
 {
-       serio_register_driver(&hil_ptr_serio_driver);
-        return 0;
+       return serio_register_driver(&hil_ptr_serio_driver);
 }
                 
 static void __exit hil_ptr_exit(void)
 
 
 static int __init psmouse_init(void)
 {
+       int err;
+
        kpsmoused_wq = create_singlethread_workqueue("kpsmoused");
        if (!kpsmoused_wq) {
                printk(KERN_ERR "psmouse: failed to create kpsmoused workqueue\n");
                return -ENOMEM;
        }
 
-       serio_register_driver(&psmouse_drv);
+       err = serio_register_driver(&psmouse_drv);
+       if (err)
+               destroy_workqueue(kpsmoused_wq);
 
-       return 0;
+       return err;
 }
 
 static void __exit psmouse_exit(void)
 
 
 static int __init sermouse_init(void)
 {
-       serio_register_driver(&sermouse_drv);
-       return 0;
+       return serio_register_driver(&sermouse_drv);
 }
 
 static void __exit sermouse_exit(void)
 
 static int __init
 vsxxxaa_init (void)
 {
-       serio_register_driver(&vsxxxaa_drv);
-       return 0;
+       return serio_register_driver(&vsxxxaa_drv);
 }
 
 static void __exit
 
 
 static int __init serio_raw_init(void)
 {
-       serio_register_driver(&serio_raw_drv);
-       return 0;
+       return serio_register_driver(&serio_raw_drv);
 }
 
 static void __exit serio_raw_exit(void)
 
 
 static int __init elo_init(void)
 {
-       serio_register_driver(&elo_drv);
-       return 0;
+       return serio_register_driver(&elo_drv);
 }
 
 static void __exit elo_exit(void)
 
 
 static int __init gunze_init(void)
 {
-       serio_register_driver(&gunze_drv);
-       return 0;
+       return serio_register_driver(&gunze_drv);
 }
 
 static void __exit gunze_exit(void)
 
 
 static int __init h3600ts_init(void)
 {
-       serio_register_driver(&h3600ts_drv);
-       return 0;
+       return serio_register_driver(&h3600ts_drv);
 }
 
 static void __exit h3600ts_exit(void)
 
 
 static int __init mtouch_init(void)
 {
-       serio_register_driver(&mtouch_drv);
-       return 0;
+       return serio_register_driver(&mtouch_drv);
 }
 
 static void __exit mtouch_exit(void)
 
 
 static int __init pm_init(void)
 {
-       serio_register_driver(&pm_drv);
-       return 0;
+       return serio_register_driver(&pm_drv);
 }
 
 static void __exit pm_exit(void)
 
 
 static int __init tr_init(void)
 {
-       serio_register_driver(&tr_drv);
-       return 0;
+       return serio_register_driver(&tr_drv);
 }
 
 static void __exit tr_exit(void)
 
 
 static int __init tw_init(void)
 {
-       serio_register_driver(&tw_drv);
-       return 0;
+       return serio_register_driver(&tw_drv);
 }
 
 static void __exit tw_exit(void)