dice_card_strings(dice);
 
+       err = snd_dice_stream_init_duplex(dice);
+       if (err < 0)
+               goto error;
+
        snd_dice_create_proc(dice);
 
        err = snd_dice_create_pcm(dice);
 
        return;
 error:
+       snd_dice_stream_destroy_duplex(dice);
        snd_dice_transaction_destroy(dice);
        snd_card_free(dice->card);
        dev_info(&dice->unit->device,
        init_completion(&dice->clock_accepted);
        init_waitqueue_head(&dice->hwdep_wait);
 
-       err = snd_dice_stream_init_duplex(dice);
-       if (err < 0) {
-               dice_free(dice);
-               return err;
-       }
-
        /* Allocate and register this sound card later. */
        INIT_DEFERRABLE_WORK(&dice->dwork, do_registration);
        schedule_registration(dice);