aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Ujfalusi <peter.ujfalusi@ti.com>2016-08-19 02:34:24 -0400
committerMark Brown <broonie@kernel.org>2016-08-19 10:18:43 -0400
commit21eb45db282317543ca46c821bbb8d5075e02cbe (patch)
tree5008c14c0d19aa7f75f5b8d5bfe23ca3f3f37a07
parent479e2a86dc6aeaec6013165e1bd3525db6914f3a (diff)
ASoC: omap-abe-twl6040: Correct dmic-codec device registration
The dmic-codec was registered within the platform_driver's probe function, which can cause deferred probe to run in loops as reported and analyzed by Russell King. Use module_init/exit in the driver and handle the dmic-codec device registration and removal at that level instead of the platform_driver probe/remove. Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com> Reported-by: Russell King <rmk+kernel@armlinux.org.uk> Tested-by: Russell King <rmk+kernel@armlinux.org.uk> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--sound/soc/omap/omap-abe-twl6040.c61
1 files changed, 32 insertions, 29 deletions
diff --git a/sound/soc/omap/omap-abe-twl6040.c b/sound/soc/omap/omap-abe-twl6040.c
index 0843a68f277c..f61b3b58083b 100644
--- a/sound/soc/omap/omap-abe-twl6040.c
+++ b/sound/soc/omap/omap-abe-twl6040.c
@@ -38,10 +38,10 @@
38struct abe_twl6040 { 38struct abe_twl6040 {
39 int jack_detection; /* board can detect jack events */ 39 int jack_detection; /* board can detect jack events */
40 int mclk_freq; /* MCLK frequency speed for twl6040 */ 40 int mclk_freq; /* MCLK frequency speed for twl6040 */
41
42 struct platform_device *dmic_codec_dev;
43}; 41};
44 42
43struct platform_device *dmic_codec_dev;
44
45static int omap_abe_hw_params(struct snd_pcm_substream *substream, 45static int omap_abe_hw_params(struct snd_pcm_substream *substream,
46 struct snd_pcm_hw_params *params) 46 struct snd_pcm_hw_params *params)
47{ 47{
@@ -258,8 +258,6 @@ static int omap_abe_probe(struct platform_device *pdev)
258 if (priv == NULL) 258 if (priv == NULL)
259 return -ENOMEM; 259 return -ENOMEM;
260 260
261 priv->dmic_codec_dev = ERR_PTR(-EINVAL);
262
263 if (snd_soc_of_parse_card_name(card, "ti,model")) { 261 if (snd_soc_of_parse_card_name(card, "ti,model")) {
264 dev_err(&pdev->dev, "Card name is not provided\n"); 262 dev_err(&pdev->dev, "Card name is not provided\n");
265 return -ENODEV; 263 return -ENODEV;
@@ -284,13 +282,6 @@ static int omap_abe_probe(struct platform_device *pdev)
284 num_links = 2; 282 num_links = 2;
285 abe_twl6040_dai_links[1].cpu_of_node = dai_node; 283 abe_twl6040_dai_links[1].cpu_of_node = dai_node;
286 abe_twl6040_dai_links[1].platform_of_node = dai_node; 284 abe_twl6040_dai_links[1].platform_of_node = dai_node;
287
288 priv->dmic_codec_dev = platform_device_register_simple(
289 "dmic-codec", -1, NULL, 0);
290 if (IS_ERR(priv->dmic_codec_dev)) {
291 dev_err(&pdev->dev, "Can't instantiate dmic-codec\n");
292 return PTR_ERR(priv->dmic_codec_dev);
293 }
294 } else { 285 } else {
295 num_links = 1; 286 num_links = 1;
296 } 287 }
@@ -299,16 +290,14 @@ static int omap_abe_probe(struct platform_device *pdev)
299 of_property_read_u32(node, "ti,mclk-freq", &priv->mclk_freq); 290 of_property_read_u32(node, "ti,mclk-freq", &priv->mclk_freq);
300 if (!priv->mclk_freq) { 291 if (!priv->mclk_freq) {
301 dev_err(&pdev->dev, "MCLK frequency not provided\n"); 292 dev_err(&pdev->dev, "MCLK frequency not provided\n");
302 ret = -EINVAL; 293 return -EINVAL;
303 goto err_unregister;
304 } 294 }
305 295
306 card->fully_routed = 1; 296 card->fully_routed = 1;
307 297
308 if (!priv->mclk_freq) { 298 if (!priv->mclk_freq) {
309 dev_err(&pdev->dev, "MCLK frequency missing\n"); 299 dev_err(&pdev->dev, "MCLK frequency missing\n");
310 ret = -ENODEV; 300 return -ENODEV;
311 goto err_unregister;
312 } 301 }
313 302
314 card->dai_link = abe_twl6040_dai_links; 303 card->dai_link = abe_twl6040_dai_links;
@@ -317,17 +306,9 @@ static int omap_abe_probe(struct platform_device *pdev)
317 snd_soc_card_set_drvdata(card, priv); 306 snd_soc_card_set_drvdata(card, priv);
318 307
319 ret = snd_soc_register_card(card); 308 ret = snd_soc_register_card(card);
320 if (ret) { 309 if (ret)
321 dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", 310 dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n",
322 ret); 311 ret);
323 goto err_unregister;
324 }
325
326 return 0;
327
328err_unregister:
329 if (!IS_ERR(priv->dmic_codec_dev))
330 platform_device_unregister(priv->dmic_codec_dev);
331 312
332 return ret; 313 return ret;
333} 314}
@@ -335,13 +316,9 @@ err_unregister:
335static int omap_abe_remove(struct platform_device *pdev) 316static int omap_abe_remove(struct platform_device *pdev)
336{ 317{
337 struct snd_soc_card *card = platform_get_drvdata(pdev); 318 struct snd_soc_card *card = platform_get_drvdata(pdev);
338 struct abe_twl6040 *priv = snd_soc_card_get_drvdata(card);
339 319
340 snd_soc_unregister_card(card); 320 snd_soc_unregister_card(card);
341 321
342 if (!IS_ERR(priv->dmic_codec_dev))
343 platform_device_unregister(priv->dmic_codec_dev);
344
345 return 0; 322 return 0;
346} 323}
347 324
@@ -361,7 +338,33 @@ static struct platform_driver omap_abe_driver = {
361 .remove = omap_abe_remove, 338 .remove = omap_abe_remove,
362}; 339};
363 340
364module_platform_driver(omap_abe_driver); 341static int __init omap_abe_init(void)
342{
343 int ret;
344
345 dmic_codec_dev = platform_device_register_simple("dmic-codec", -1, NULL,
346 0);
347 if (IS_ERR(dmic_codec_dev)) {
348 pr_err("%s: dmic-codec device registration failed\n", __func__);
349 return PTR_ERR(dmic_codec_dev);
350 }
351
352 ret = platform_driver_register(&omap_abe_driver);
353 if (ret) {
354 pr_err("%s: platform driver registration failed\n", __func__);
355 platform_device_unregister(dmic_codec_dev);
356 }
357
358 return ret;
359}
360module_init(omap_abe_init);
361
362static void __exit omap_abe_exit(void)
363{
364 platform_driver_unregister(&omap_abe_driver);
365 platform_device_unregister(dmic_codec_dev);
366}
367module_exit(omap_abe_exit);
365 368
366MODULE_AUTHOR("Misael Lopez Cruz <misael.lopez@ti.com>"); 369MODULE_AUTHOR("Misael Lopez Cruz <misael.lopez@ti.com>");
367MODULE_DESCRIPTION("ALSA SoC for OMAP boards with ABE and twl6040 codec"); 370MODULE_DESCRIPTION("ALSA SoC for OMAP boards with ABE and twl6040 codec");