gosnd->capturing = 0;
        ret = snd_card_new(go->dev, index[dev], id[dev], THIS_MODULE, 0,
                           &gosnd->card);
-       if (ret < 0) {
-               kfree(gosnd);
-               return ret;
-       }
+       if (ret < 0)
+               goto free_snd;
+
        ret = snd_device_new(gosnd->card, SNDRV_DEV_LOWLEVEL, go,
                        &go7007_snd_device_ops);
-       if (ret < 0) {
-               kfree(gosnd);
-               return ret;
-       }
+       if (ret < 0)
+               goto free_card;
+
        ret = snd_pcm_new(gosnd->card, "go7007", 0, 0, 1, &gosnd->pcm);
-       if (ret < 0) {
-               snd_card_free(gosnd->card);
-               kfree(gosnd);
-               return ret;
-       }
+       if (ret < 0)
+               goto free_card;
+
        strscpy(gosnd->card->driver, "go7007", sizeof(gosnd->card->driver));
        strscpy(gosnd->card->shortname, go->name, sizeof(gosnd->card->shortname));
        strscpy(gosnd->card->longname, gosnd->card->shortname,
                        &go7007_snd_capture_ops);
 
        ret = snd_card_register(gosnd->card);
-       if (ret < 0) {
-               snd_card_free(gosnd->card);
-               kfree(gosnd);
-               return ret;
-       }
+       if (ret < 0)
+               goto free_card;
 
        gosnd->substream = NULL;
        go->snd_context = gosnd;
        ++dev;
 
        return 0;
+
+free_card:
+       snd_card_free(gosnd->card);
+free_snd:
+       kfree(gosnd);
+       return ret;
 }
 EXPORT_SYMBOL(go7007_snd_init);