Commit 31833ead authored by Charles Keepax's avatar Charles Keepax Committed by Mark Brown

ASoC: arizona: Move request of speaker IRQs into bus probe

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: default avatarCharles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent ae1ea48c
...@@ -191,6 +191,14 @@ int arizona_init_spk(struct snd_soc_codec *codec) ...@@ -191,6 +191,14 @@ int arizona_init_spk(struct snd_soc_codec *codec)
break; 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, ret = arizona_request_irq(arizona, ARIZONA_IRQ_SPK_OVERHEAT_WARN,
"Thermal warning", arizona_thermal_warn, "Thermal warning", arizona_thermal_warn,
arizona); arizona);
...@@ -209,19 +217,16 @@ int arizona_init_spk(struct snd_soc_codec *codec) ...@@ -209,19 +217,16 @@ int arizona_init_spk(struct snd_soc_codec *codec)
return 0; 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_WARN, arizona);
arizona_free_irq(arizona, ARIZONA_IRQ_SPK_OVERHEAT, arizona); arizona_free_irq(arizona, ARIZONA_IRQ_SPK_OVERHEAT, arizona);
return 0; 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[] = { static const struct snd_soc_dapm_route arizona_mono_routes[] = {
{ "OUT1R", NULL, "OUT1L" }, { "OUT1R", NULL, "OUT1L" },
......
...@@ -317,7 +317,8 @@ extern int arizona_init_gpio(struct snd_soc_codec *codec); ...@@ -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_mono(struct snd_soc_codec *codec);
extern int arizona_init_notifiers(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); extern int arizona_init_dai(struct arizona_priv *priv, int dai);
......
...@@ -1170,8 +1170,6 @@ static int cs47l24_codec_remove(struct snd_soc_codec *codec) ...@@ -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_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, priv);
arizona_free_spk(codec);
return 0; return 0;
} }
...@@ -1287,19 +1285,30 @@ static int cs47l24_probe(struct platform_device *pdev) ...@@ -1287,19 +1285,30 @@ static int cs47l24_probe(struct platform_device *pdev)
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
pm_runtime_idle(&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); ret = snd_soc_register_platform(&pdev->dev, &cs47l24_compr_platform);
if (ret < 0) { if (ret < 0) {
dev_err(&pdev->dev, "Failed to register platform: %d\n", ret); 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, ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_cs47l24,
cs47l24_dai, ARRAY_SIZE(cs47l24_dai)); cs47l24_dai, ARRAY_SIZE(cs47l24_dai));
if (ret < 0) { if (ret < 0) {
dev_err(&pdev->dev, "Failed to register codec: %d\n", ret); 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; return ret;
} }
...@@ -1314,6 +1323,8 @@ static int cs47l24_remove(struct platform_device *pdev) ...@@ -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[1]);
wm_adsp2_remove(&cs47l24->core.adsp[2]); wm_adsp2_remove(&cs47l24->core.adsp[2]);
arizona_free_spk_irqs(arizona);
return 0; return 0;
} }
......
...@@ -1978,8 +1978,6 @@ static int wm5102_codec_remove(struct snd_soc_codec *codec) ...@@ -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_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, priv);
arizona_free_spk(codec);
return 0; return 0;
} }
...@@ -2097,25 +2095,37 @@ static int wm5102_probe(struct platform_device *pdev) ...@@ -2097,25 +2095,37 @@ static int wm5102_probe(struct platform_device *pdev)
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
pm_runtime_idle(&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); ret = snd_soc_register_platform(&pdev->dev, &wm5102_compr_platform);
if (ret < 0) { if (ret < 0) {
dev_err(&pdev->dev, "Failed to register platform: %d\n", ret); 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, ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm5102,
wm5102_dai, ARRAY_SIZE(wm5102_dai)); wm5102_dai, ARRAY_SIZE(wm5102_dai));
if (ret < 0) { if (ret < 0) {
dev_err(&pdev->dev, "Failed to register codec: %d\n", ret); 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; return ret;
} }
static int wm5102_remove(struct platform_device *pdev) static int wm5102_remove(struct platform_device *pdev)
{ {
struct wm5102_priv *wm5102 = platform_get_drvdata(pdev); struct wm5102_priv *wm5102 = platform_get_drvdata(pdev);
struct arizona *arizona = wm5102->core.arizona;
snd_soc_unregister_platform(&pdev->dev); snd_soc_unregister_platform(&pdev->dev);
snd_soc_unregister_codec(&pdev->dev); snd_soc_unregister_codec(&pdev->dev);
...@@ -2123,6 +2133,8 @@ static int wm5102_remove(struct platform_device *pdev) ...@@ -2123,6 +2133,8 @@ static int wm5102_remove(struct platform_device *pdev)
wm_adsp2_remove(&wm5102->core.adsp[0]); wm_adsp2_remove(&wm5102->core.adsp[0]);
arizona_free_spk_irqs(arizona);
return 0; return 0;
} }
......
...@@ -2330,8 +2330,6 @@ static int wm5110_codec_remove(struct snd_soc_codec *codec) ...@@ -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_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, priv);
arizona_free_spk(codec);
return 0; return 0;
} }
...@@ -2453,25 +2451,37 @@ static int wm5110_probe(struct platform_device *pdev) ...@@ -2453,25 +2451,37 @@ static int wm5110_probe(struct platform_device *pdev)
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
pm_runtime_idle(&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); ret = snd_soc_register_platform(&pdev->dev, &wm5110_compr_platform);
if (ret < 0) { if (ret < 0) {
dev_err(&pdev->dev, "Failed to register platform: %d\n", ret); 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, ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm5110,
wm5110_dai, ARRAY_SIZE(wm5110_dai)); wm5110_dai, ARRAY_SIZE(wm5110_dai));
if (ret < 0) { if (ret < 0) {
dev_err(&pdev->dev, "Failed to register codec: %d\n", ret); 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; return ret;
} }
static int wm5110_remove(struct platform_device *pdev) static int wm5110_remove(struct platform_device *pdev)
{ {
struct wm5110_priv *wm5110 = platform_get_drvdata(pdev); struct wm5110_priv *wm5110 = platform_get_drvdata(pdev);
struct arizona *arizona = wm5110->core.arizona;
int i; int i;
snd_soc_unregister_platform(&pdev->dev); snd_soc_unregister_platform(&pdev->dev);
...@@ -2481,6 +2491,8 @@ static int wm5110_remove(struct platform_device *pdev) ...@@ -2481,6 +2491,8 @@ static int wm5110_remove(struct platform_device *pdev)
for (i = 0; i < WM5110_NUM_ADSP; i++) for (i = 0; i < WM5110_NUM_ADSP; i++)
wm_adsp2_remove(&wm5110->core.adsp[i]); wm_adsp2_remove(&wm5110->core.adsp[i]);
arizona_free_spk_irqs(arizona);
return 0; return 0;
} }
......
...@@ -1077,8 +1077,6 @@ static int wm8997_codec_remove(struct snd_soc_codec *codec) ...@@ -1077,8 +1077,6 @@ static int wm8997_codec_remove(struct snd_soc_codec *codec)
priv->core.arizona->dapm = NULL; priv->core.arizona->dapm = NULL;
arizona_free_spk(codec);
return 0; return 0;
} }
...@@ -1124,7 +1122,7 @@ static int wm8997_probe(struct platform_device *pdev) ...@@ -1124,7 +1122,7 @@ static int wm8997_probe(struct platform_device *pdev)
{ {
struct arizona *arizona = dev_get_drvdata(pdev->dev.parent); struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
struct wm8997_priv *wm8997; struct wm8997_priv *wm8997;
int i; int i, ret;
wm8997 = devm_kzalloc(&pdev->dev, sizeof(struct wm8997_priv), wm8997 = devm_kzalloc(&pdev->dev, sizeof(struct wm8997_priv),
GFP_KERNEL); GFP_KERNEL);
...@@ -1164,15 +1162,33 @@ static int wm8997_probe(struct platform_device *pdev) ...@@ -1164,15 +1162,33 @@ static int wm8997_probe(struct platform_device *pdev)
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
pm_runtime_idle(&pdev->dev); pm_runtime_idle(&pdev->dev);
return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm8997, 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)); 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) 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); snd_soc_unregister_codec(&pdev->dev);
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
arizona_free_spk_irqs(arizona);
return 0; return 0;
} }
......
...@@ -1337,8 +1337,6 @@ static int wm8998_codec_remove(struct snd_soc_codec *codec) ...@@ -1337,8 +1337,6 @@ static int wm8998_codec_remove(struct snd_soc_codec *codec)
priv->core.arizona->dapm = NULL; priv->core.arizona->dapm = NULL;
arizona_free_spk(codec);
return 0; return 0;
} }
...@@ -1387,7 +1385,7 @@ static int wm8998_probe(struct platform_device *pdev) ...@@ -1387,7 +1385,7 @@ static int wm8998_probe(struct platform_device *pdev)
{ {
struct arizona *arizona = dev_get_drvdata(pdev->dev.parent); struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
struct wm8998_priv *wm8998; struct wm8998_priv *wm8998;
int i; int i, ret;
wm8998 = devm_kzalloc(&pdev->dev, sizeof(struct wm8998_priv), wm8998 = devm_kzalloc(&pdev->dev, sizeof(struct wm8998_priv),
GFP_KERNEL); GFP_KERNEL);
...@@ -1419,15 +1417,35 @@ static int wm8998_probe(struct platform_device *pdev) ...@@ -1419,15 +1417,35 @@ static int wm8998_probe(struct platform_device *pdev)
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
pm_runtime_idle(&pdev->dev); pm_runtime_idle(&pdev->dev);
return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm8998, 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)); 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) 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); snd_soc_unregister_codec(&pdev->dev);
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
arizona_free_spk_irqs(arizona);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment