ASoC: tegra-ac97: Do common and clock init prior to component registration
authorMark Brown <broonie@linaro.org>
Wed, 26 Jun 2013 11:27:58 +0000 (12:27 +0100)
committerMark Brown <broonie@linaro.org>
Thu, 27 Jun 2013 08:45:14 +0000 (09:45 +0100)
Otherwise we may instantiate and hence have something try to access the
device while it is still completing initialisation.

Acked-by: Stephen Warren <swarren@nvidia.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
sound/soc/tegra/tegra20_ac97.c

index 9043626da6fab8aea78fe3ff6eaad439617ade44..48037f784a8667493730de062410826d6b61f3c5 100644 (file)
@@ -395,23 +395,9 @@ static int tegra20_ac97_platform_probe(struct platform_device *pdev)
        ac97->capture_dma_data.maxburst = 4;
        ac97->capture_dma_data.slave_id = of_dma[0];
 
-       ret = snd_soc_register_component(&pdev->dev, &tegra20_ac97_component,
-                                        &tegra20_ac97_dai, 1);
-       if (ret) {
-               dev_err(&pdev->dev, "Could not register DAI: %d\n", ret);
-               ret = -ENOMEM;
-               goto err_clk_put;
-       }
-
-       ret = tegra_pcm_platform_register(&pdev->dev);
-       if (ret) {
-               dev_err(&pdev->dev, "Could not register PCM: %d\n", ret);
-               goto err_unregister_component;
-       }
-
        ret = tegra_asoc_utils_init(&ac97->util_data, &pdev->dev);
        if (ret)
-               goto err_unregister_pcm;
+               goto err_clk_put;
 
        ret = tegra_asoc_utils_set_ac97_rate(&ac97->util_data);
        if (ret)
@@ -423,17 +409,31 @@ static int tegra20_ac97_platform_probe(struct platform_device *pdev)
                goto err_asoc_utils_fini;
        }
 
+       ret = snd_soc_register_component(&pdev->dev, &tegra20_ac97_component,
+                                        &tegra20_ac97_dai, 1);
+       if (ret) {
+               dev_err(&pdev->dev, "Could not register DAI: %d\n", ret);
+               ret = -ENOMEM;
+               goto err_asoc_utils_fini;
+       }
+
+       ret = tegra_pcm_platform_register(&pdev->dev);
+       if (ret) {
+               dev_err(&pdev->dev, "Could not register PCM: %d\n", ret);
+               goto err_unregister_component;
+       }
+
        /* XXX: crufty ASoC AC97 API - only one AC97 codec allowed */
        workdata = ac97;
 
        return 0;
 
-err_asoc_utils_fini:
-       tegra_asoc_utils_fini(&ac97->util_data);
 err_unregister_pcm:
        tegra_pcm_platform_unregister(&pdev->dev);
 err_unregister_component:
        snd_soc_unregister_component(&pdev->dev);
+err_asoc_utils_fini:
+       tegra_asoc_utils_fini(&ac97->util_data);
 err_clk_put:
 err:
        return ret;