#include <sound/soc.h>
 #include <sound/dmaengine_pcm.h>
 
-#include "tegra_asoc_utils.h"
 #include "tegra20_ac97.h"
 
 #define DRV_NAME "tegra20-ac97"
        ac97->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
        ac97->playback_dma_data.maxburst = 4;
 
-       ret = tegra_asoc_utils_init(&ac97->util_data, &pdev->dev);
-       if (ret)
-               goto err_clk_put;
-
-       ret = tegra_asoc_utils_set_ac97_rate(&ac97->util_data);
-       if (ret)
-               goto err_asoc_utils_fini;
-
        ret = clk_prepare_enable(ac97->clk_ac97);
        if (ret) {
                dev_err(&pdev->dev, "clk_enable failed: %d\n", ret);
-               goto err_asoc_utils_fini;
+               goto err;
        }
 
        ret = snd_soc_set_ac97_ops(&tegra20_ac97_ops);
        snd_soc_unregister_component(&pdev->dev);
 err_clk_disable_unprepare:
        clk_disable_unprepare(ac97->clk_ac97);
-err_asoc_utils_fini:
-       tegra_asoc_utils_fini(&ac97->util_data);
 err_clk_put:
 err:
        snd_soc_set_ac97_ops(NULL);
        tegra_pcm_platform_unregister(&pdev->dev);
        snd_soc_unregister_component(&pdev->dev);
 
-       tegra_asoc_utils_fini(&ac97->util_data);
-
        clk_disable_unprepare(ac97->clk_ac97);
 
        snd_soc_set_ac97_ops(NULL);
 
 #include <sound/pcm_params.h>
 #include <sound/soc.h>
 
+#include "tegra_asoc_utils.h"
+
 #define DRV_NAME "tegra-snd-wm9712"
 
 struct tegra_wm9712 {
        struct platform_device *codec;
+       struct tegra_asoc_utils_data util_data;
 };
 
 static const struct snd_soc_dapm_widget tegra_wm9712_dapm_widgets[] = {
 
        tegra_wm9712_dai.platform_of_node = tegra_wm9712_dai.cpu_of_node;
 
+       ret = tegra_asoc_utils_init(&machine->util_data, &pdev->dev);
+       if (ret)
+               goto codec_unregister;
+
+       ret = tegra_asoc_utils_set_ac97_rate(&machine->util_data);
+       if (ret)
+               goto asoc_utils_fini;
+
        ret = snd_soc_register_card(card);
        if (ret) {
                dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n",
                        ret);
-               goto codec_unregister;
+               goto asoc_utils_fini;
        }
 
        return 0;
 
+asoc_utils_fini:
+       tegra_asoc_utils_fini(&machine->util_data);
 codec_unregister:
        platform_device_del(machine->codec);
 codec_put:
 
        snd_soc_unregister_card(card);
 
+       tegra_asoc_utils_fini(&machine->util_data);
+
        platform_device_unregister(machine->codec);
 
        return 0;