ASoC: arizona: Move request of speaker IRQs into bus probe
authorCharles Keepax <ckeepax@opensource.wolfsonmicro.com>
Wed, 26 Oct 2016 09:59:57 +0000 (10:59 +0100)
committerMark Brown <broonie@kernel.org>
Wed, 26 Oct 2016 10:07:11 +0000 (11:07 +0100)
It is more idiomatic to request all resources in the bus level probe,
this patch moves the request of the speaker thermal event IRQs from the
ASoC level probe into the bus level probe.

Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/arizona.c
sound/soc/codecs/arizona.h
sound/soc/codecs/cs47l24.c
sound/soc/codecs/wm5102.c
sound/soc/codecs/wm5110.c
sound/soc/codecs/wm8997.c
sound/soc/codecs/wm8998.c

index 7f7d4b31a7fd5525563de74d5e9f51569dd1ae88..99ce6a0e73de9a7c37c002d1a2ae7551d641c132 100644 (file)
@@ -191,6 +191,14 @@ int arizona_init_spk(struct snd_soc_codec *codec)
                break;
        }
 
+       return 0;
+}
+EXPORT_SYMBOL_GPL(arizona_init_spk);
+
+int arizona_init_spk_irqs(struct arizona *arizona)
+{
+       int ret;
+
        ret = arizona_request_irq(arizona, ARIZONA_IRQ_SPK_OVERHEAT_WARN,
                                  "Thermal warning", arizona_thermal_warn,
                                  arizona);
@@ -209,19 +217,16 @@ int arizona_init_spk(struct snd_soc_codec *codec)
 
        return 0;
 }
-EXPORT_SYMBOL_GPL(arizona_init_spk);
+EXPORT_SYMBOL_GPL(arizona_init_spk_irqs);
 
-int arizona_free_spk(struct snd_soc_codec *codec)
+int arizona_free_spk_irqs(struct arizona *arizona)
 {
-       struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
-       struct arizona *arizona = priv->arizona;
-
        arizona_free_irq(arizona, ARIZONA_IRQ_SPK_OVERHEAT_WARN, arizona);
        arizona_free_irq(arizona, ARIZONA_IRQ_SPK_OVERHEAT, arizona);
 
        return 0;
 }
-EXPORT_SYMBOL_GPL(arizona_free_spk);
+EXPORT_SYMBOL_GPL(arizona_free_spk_irqs);
 
 static const struct snd_soc_dapm_route arizona_mono_routes[] = {
        { "OUT1R", NULL, "OUT1L" },
index 9d0997bec8706fcdd98d2d4f13a887ab130c97a2..34d65d1eafba586a1b6dbb5add534aa0ce88cc5b 100644 (file)
@@ -317,7 +317,8 @@ extern int arizona_init_gpio(struct snd_soc_codec *codec);
 extern int arizona_init_mono(struct snd_soc_codec *codec);
 extern int arizona_init_notifiers(struct snd_soc_codec *codec);
 
-extern int arizona_free_spk(struct snd_soc_codec *codec);
+extern int arizona_init_spk_irqs(struct arizona *arizona);
+extern int arizona_free_spk_irqs(struct arizona *arizona);
 
 extern int arizona_init_dai(struct arizona_priv *priv, int dai);
 
index 7df6a67690387336809dbf74ff98051f7aaa46b0..17e52c1599e47e1615aa1532a09cd282914dafc9 100644 (file)
@@ -1170,8 +1170,6 @@ static int cs47l24_codec_remove(struct snd_soc_codec *codec)
 
        arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, priv);
 
-       arizona_free_spk(codec);
-
        return 0;
 }
 
@@ -1287,19 +1285,30 @@ static int cs47l24_probe(struct platform_device *pdev)
        pm_runtime_enable(&pdev->dev);
        pm_runtime_idle(&pdev->dev);
 
+       ret = arizona_init_spk_irqs(arizona);
+       if (ret < 0)
+               return ret;
+
        ret = snd_soc_register_platform(&pdev->dev, &cs47l24_compr_platform);
        if (ret < 0) {
                dev_err(&pdev->dev, "Failed to register platform: %d\n", ret);
-               return ret;
+               goto err_spk_irqs;
        }
 
        ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_cs47l24,
                                      cs47l24_dai, ARRAY_SIZE(cs47l24_dai));
        if (ret < 0) {
                dev_err(&pdev->dev, "Failed to register codec: %d\n", ret);
-               snd_soc_unregister_platform(&pdev->dev);
+               goto err_platform;
        }
 
+       return ret;
+
+err_platform:
+       snd_soc_unregister_platform(&pdev->dev);
+err_spk_irqs:
+       arizona_free_spk_irqs(arizona);
+
        return ret;
 }
 
@@ -1314,6 +1323,8 @@ static int cs47l24_remove(struct platform_device *pdev)
        wm_adsp2_remove(&cs47l24->core.adsp[1]);
        wm_adsp2_remove(&cs47l24->core.adsp[2]);
 
+       arizona_free_spk_irqs(arizona);
+
        return 0;
 }
 
index bb3de5b3d816872c09e462b139619dee68918af8..6f40ee6f0bbc7d3a62dbe2c1185788a95f2abef1 100644 (file)
@@ -1978,8 +1978,6 @@ static int wm5102_codec_remove(struct snd_soc_codec *codec)
 
        arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, priv);
 
-       arizona_free_spk(codec);
-
        return 0;
 }
 
@@ -2097,25 +2095,37 @@ static int wm5102_probe(struct platform_device *pdev)
        pm_runtime_enable(&pdev->dev);
        pm_runtime_idle(&pdev->dev);
 
+       ret = arizona_init_spk_irqs(arizona);
+       if (ret < 0)
+               return ret;
+
        ret = snd_soc_register_platform(&pdev->dev, &wm5102_compr_platform);
        if (ret < 0) {
                dev_err(&pdev->dev, "Failed to register platform: %d\n", ret);
-               return ret;
+               goto err_spk_irqs;
        }
 
        ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm5102,
                                      wm5102_dai, ARRAY_SIZE(wm5102_dai));
        if (ret < 0) {
                dev_err(&pdev->dev, "Failed to register codec: %d\n", ret);
-               snd_soc_unregister_platform(&pdev->dev);
+               goto err_platform;
        }
 
+       return ret;
+
+err_platform:
+       snd_soc_unregister_platform(&pdev->dev);
+err_spk_irqs:
+       arizona_free_spk_irqs(arizona);
+
        return ret;
 }
 
 static int wm5102_remove(struct platform_device *pdev)
 {
        struct wm5102_priv *wm5102 = platform_get_drvdata(pdev);
+       struct arizona *arizona = wm5102->core.arizona;
 
        snd_soc_unregister_platform(&pdev->dev);
        snd_soc_unregister_codec(&pdev->dev);
@@ -2123,6 +2133,8 @@ static int wm5102_remove(struct platform_device *pdev)
 
        wm_adsp2_remove(&wm5102->core.adsp[0]);
 
+       arizona_free_spk_irqs(arizona);
+
        return 0;
 }
 
index 407dc4a43b07738345c87257af40f3247007ba0e..667fc25dd0944b890b58547f27d25d1897446df4 100644 (file)
@@ -2330,8 +2330,6 @@ static int wm5110_codec_remove(struct snd_soc_codec *codec)
 
        arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, priv);
 
-       arizona_free_spk(codec);
-
        return 0;
 }
 
@@ -2453,25 +2451,37 @@ static int wm5110_probe(struct platform_device *pdev)
        pm_runtime_enable(&pdev->dev);
        pm_runtime_idle(&pdev->dev);
 
+       ret = arizona_init_spk_irqs(arizona);
+       if (ret < 0)
+               return ret;
+
        ret = snd_soc_register_platform(&pdev->dev, &wm5110_compr_platform);
        if (ret < 0) {
                dev_err(&pdev->dev, "Failed to register platform: %d\n", ret);
-               return ret;
+               goto err_spk_irqs;
        }
 
        ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm5110,
                                      wm5110_dai, ARRAY_SIZE(wm5110_dai));
        if (ret < 0) {
                dev_err(&pdev->dev, "Failed to register codec: %d\n", ret);
-               snd_soc_unregister_platform(&pdev->dev);
+               goto err_platform;
        }
 
+       return ret;
+
+err_platform:
+       snd_soc_unregister_platform(&pdev->dev);
+err_spk_irqs:
+       arizona_free_spk_irqs(arizona);
+
        return ret;
 }
 
 static int wm5110_remove(struct platform_device *pdev)
 {
        struct wm5110_priv *wm5110 = platform_get_drvdata(pdev);
+       struct arizona *arizona = wm5110->core.arizona;
        int i;
 
        snd_soc_unregister_platform(&pdev->dev);
@@ -2481,6 +2491,8 @@ static int wm5110_remove(struct platform_device *pdev)
        for (i = 0; i < WM5110_NUM_ADSP; i++)
                wm_adsp2_remove(&wm5110->core.adsp[i]);
 
+       arizona_free_spk_irqs(arizona);
+
        return 0;
 }
 
index f5f5d4352670a3d6d6ae00ad8b8b3fb0bbbe987c..600595c54fe770d7120183b231dfd8e39b84f1a6 100644 (file)
@@ -1077,8 +1077,6 @@ static int wm8997_codec_remove(struct snd_soc_codec *codec)
 
        priv->core.arizona->dapm = NULL;
 
-       arizona_free_spk(codec);
-
        return 0;
 }
 
@@ -1124,7 +1122,7 @@ static int wm8997_probe(struct platform_device *pdev)
 {
        struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
        struct wm8997_priv *wm8997;
-       int i;
+       int i, ret;
 
        wm8997 = devm_kzalloc(&pdev->dev, sizeof(struct wm8997_priv),
                              GFP_KERNEL);
@@ -1164,15 +1162,33 @@ static int wm8997_probe(struct platform_device *pdev)
        pm_runtime_enable(&pdev->dev);
        pm_runtime_idle(&pdev->dev);
 
-       return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm8997,
-                                     wm8997_dai, ARRAY_SIZE(wm8997_dai));
+       ret = arizona_init_spk_irqs(arizona);
+       if (ret < 0)
+               return ret;
+
+       ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm8997,
+                                    wm8997_dai, ARRAY_SIZE(wm8997_dai));
+       if (ret < 0) {
+               dev_err(&pdev->dev, "Failed to register codec: %d\n", ret);
+               goto err_spk_irqs;
+       }
+
+err_spk_irqs:
+       arizona_free_spk_irqs(arizona);
+
+       return ret;
 }
 
 static int wm8997_remove(struct platform_device *pdev)
 {
+       struct wm8997_priv *wm8997 = platform_get_drvdata(pdev);
+       struct arizona *arizona = wm8997->core.arizona;
+
        snd_soc_unregister_codec(&pdev->dev);
        pm_runtime_disable(&pdev->dev);
 
+       arizona_free_spk_irqs(arizona);
+
        return 0;
 }
 
index 3eaa3615b82e021bcfbc71c406e3a8f8a3138299..4cccaae6dcfad01cb088fa8bf116368e78357163 100644 (file)
@@ -1337,8 +1337,6 @@ static int wm8998_codec_remove(struct snd_soc_codec *codec)
 
        priv->core.arizona->dapm = NULL;
 
-       arizona_free_spk(codec);
-
        return 0;
 }
 
@@ -1387,7 +1385,7 @@ static int wm8998_probe(struct platform_device *pdev)
 {
        struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
        struct wm8998_priv *wm8998;
-       int i;
+       int i, ret;
 
        wm8998 = devm_kzalloc(&pdev->dev, sizeof(struct wm8998_priv),
                              GFP_KERNEL);
@@ -1419,15 +1417,35 @@ static int wm8998_probe(struct platform_device *pdev)
        pm_runtime_enable(&pdev->dev);
        pm_runtime_idle(&pdev->dev);
 
-       return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm8998,
-                                     wm8998_dai, ARRAY_SIZE(wm8998_dai));
+       ret = arizona_init_spk_irqs(arizona);
+       if (ret < 0)
+               return ret;
+
+       ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm8998,
+                                    wm8998_dai, ARRAY_SIZE(wm8998_dai));
+       if (ret < 0) {
+               dev_err(&pdev->dev, "Failed to register codec: %d\n", ret);
+               goto err_spk_irqs;
+       }
+
+       return ret;
+
+err_spk_irqs:
+       arizona_free_spk_irqs(arizona);
+
+       return ret;
 }
 
 static int wm8998_remove(struct platform_device *pdev)
 {
+       struct wm8998_priv *wm8998 = platform_get_drvdata(pdev);
+       struct arizona *arizona = wm8998->core.arizona;
+
        snd_soc_unregister_codec(&pdev->dev);
        pm_runtime_disable(&pdev->dev);
 
+       arizona_free_spk_irqs(arizona);
+
        return 0;
 }