]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/staging/speakup/main.c
Merge tag 'v2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[mv-sheeva.git] / drivers / staging / speakup / main.c
index 4b7a9c2b965fd0e958d22603ea790b21e80801f2..3cd00396a462baf3d3837ca192778c25f746c683 100644 (file)
@@ -2253,17 +2253,17 @@ static int __init speakup_init(void)
 
        err = speakup_add_virtual_keyboard();
        if (err)
-               return err;
+               goto out;
 
        initialize_msgs();      /* Initialize arrays for i18n. */
        first_console = kzalloc(sizeof(*first_console), GFP_KERNEL);
-       if (!first_console)
-               return -ENOMEM;
-       err = speakup_kobj_init();
-       if (err) {
-               kfree(first_console);
-               return err;
+       if (!first_console) {
+               err = -ENOMEM;
+               goto err_cons;
        }
+       err = speakup_kobj_init();
+       if (err)
+               goto err_kobject;
 
        reset_default_chars();
        reset_default_chartab();
@@ -2299,11 +2299,20 @@ static int __init speakup_init(void)
 
        speakup_task = kthread_create(speakup_thread, NULL, "speakup");
        set_user_nice(speakup_task, 10);
-       if (!IS_ERR(speakup_task))
-               wake_up_process(speakup_task);
-       else
-               return -ENOMEM;
-       return 0;
+       if (IS_ERR(speakup_task)) {
+               err = -ENOMEM;
+               goto err_kobject;
+       }
+       wake_up_process(speakup_task);
+       goto out;
+
+err_kobject:
+speakup_kobj_exit();
+       kfree(first_console);
+err_cons:
+       speakup_remove_virtual_keyboard();
+out:
+       return err;
 }
 
 module_init(speakup_init);