summaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorSylwester Nawrocki <s.nawrocki@samsung.com>2016-07-21 14:03:50 -0400
committerMark Brown <broonie@kernel.org>2016-07-21 14:18:17 -0400
commit42a74e77471ea42e6ab44e5be16723ede72b9901 (patch)
tree6be321ee4782af38a420aad1ccbd7e8fd83cb702 /sound
parent2b960386cb75bd332a132c44c9ec69bd1f3122d8 (diff)
ASoC: samsung: Specify DMA channels through struct snd_dmaengine_pcm_config
The DMA channel names are specified through struct snd_dmaengine_pcm_config rather than using SND_DMAENGINE_PCM_FLAG_CUSTOM_CHANNEL_NAME flag when booting with devicetree in order to properly support deferred probing. Without this change the sound machine driver initialization can complete successfully with unavailable DMA resources. Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com> Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/samsung/ac97.c3
-rw-r--r--sound/soc/samsung/dma.h9
-rw-r--r--sound/soc/samsung/dmaengine.c31
-rw-r--r--sound/soc/samsung/i2s.c5
-rw-r--r--sound/soc/samsung/pcm.c3
-rw-r--r--sound/soc/samsung/s3c2412-i2s.c3
-rw-r--r--sound/soc/samsung/s3c24xx-i2s.c3
-rw-r--r--sound/soc/samsung/spdif.c3
8 files changed, 39 insertions, 21 deletions
diff --git a/sound/soc/samsung/ac97.c b/sound/soc/samsung/ac97.c
index 4a7a503fe13c..547d31032088 100644
--- a/sound/soc/samsung/ac97.c
+++ b/sound/soc/samsung/ac97.c
@@ -389,7 +389,8 @@ static int s3c_ac97_probe(struct platform_device *pdev)
389 goto err5; 389 goto err5;
390 390
391 ret = samsung_asoc_dma_platform_register(&pdev->dev, 391 ret = samsung_asoc_dma_platform_register(&pdev->dev,
392 ac97_pdata->dma_filter); 392 ac97_pdata->dma_filter,
393 NULL, NULL);
393 if (ret) { 394 if (ret) {
394 dev_err(&pdev->dev, "failed to get register DMA: %d\n", ret); 395 dev_err(&pdev->dev, "failed to get register DMA: %d\n", ret);
395 goto err5; 396 goto err5;
diff --git a/sound/soc/samsung/dma.h b/sound/soc/samsung/dma.h
index a7616cc9b39e..3830f297e0b6 100644
--- a/sound/soc/samsung/dma.h
+++ b/sound/soc/samsung/dma.h
@@ -26,7 +26,10 @@ struct s3c_dma_params {
26void samsung_asoc_init_dma_data(struct snd_soc_dai *dai, 26void samsung_asoc_init_dma_data(struct snd_soc_dai *dai,
27 struct s3c_dma_params *playback, 27 struct s3c_dma_params *playback,
28 struct s3c_dma_params *capture); 28 struct s3c_dma_params *capture);
29int samsung_asoc_dma_platform_register(struct device *dev, 29/*
30 dma_filter_fn fn); 30 * @tx, @rx arguments can be NULL if the DMA channel names are "tx", "rx",
31 31 * otherwise actual DMA channel names must be passed to this function.
32 */
33int samsung_asoc_dma_platform_register(struct device *dev, dma_filter_fn filter,
34 const char *tx, const char *rx);
32#endif 35#endif
diff --git a/sound/soc/samsung/dmaengine.c b/sound/soc/samsung/dmaengine.c
index 063125937311..2c87f380bfc4 100644
--- a/sound/soc/samsung/dmaengine.c
+++ b/sound/soc/samsung/dmaengine.c
@@ -28,10 +28,6 @@
28 28
29#include "dma.h" 29#include "dma.h"
30 30
31static struct snd_dmaengine_pcm_config samsung_dmaengine_pcm_config = {
32 .prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config,
33};
34
35void samsung_asoc_init_dma_data(struct snd_soc_dai *dai, 31void samsung_asoc_init_dma_data(struct snd_soc_dai *dai,
36 struct s3c_dma_params *playback, 32 struct s3c_dma_params *playback,
37 struct s3c_dma_params *capture) 33 struct s3c_dma_params *capture)
@@ -58,15 +54,28 @@ void samsung_asoc_init_dma_data(struct snd_soc_dai *dai,
58} 54}
59EXPORT_SYMBOL_GPL(samsung_asoc_init_dma_data); 55EXPORT_SYMBOL_GPL(samsung_asoc_init_dma_data);
60 56
61int samsung_asoc_dma_platform_register(struct device *dev, 57int samsung_asoc_dma_platform_register(struct device *dev, dma_filter_fn filter,
62 dma_filter_fn filter) 58 const char *tx, const char *rx)
63{ 59{
64 samsung_dmaengine_pcm_config.compat_filter_fn = filter; 60 unsigned int flags = SND_DMAENGINE_PCM_FLAG_COMPAT;
61
62 struct snd_dmaengine_pcm_config *pcm_conf;
63
64 pcm_conf = devm_kzalloc(dev, sizeof(*pcm_conf), GFP_KERNEL);
65 if (!pcm_conf)
66 return -ENOMEM;
67
68 pcm_conf->prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config;
69 pcm_conf->compat_filter_fn = filter;
70
71 if (dev->of_node) {
72 pcm_conf->chan_names[SNDRV_PCM_STREAM_PLAYBACK] = tx;
73 pcm_conf->chan_names[SNDRV_PCM_STREAM_CAPTURE] = rx;
74 } else {
75 flags |= SND_DMAENGINE_PCM_FLAG_CUSTOM_CHANNEL_NAME;
76 }
65 77
66 return devm_snd_dmaengine_pcm_register(dev, 78 return devm_snd_dmaengine_pcm_register(dev, pcm_conf, flags);
67 &samsung_dmaengine_pcm_config,
68 SND_DMAENGINE_PCM_FLAG_CUSTOM_CHANNEL_NAME |
69 SND_DMAENGINE_PCM_FLAG_COMPAT);
70} 79}
71EXPORT_SYMBOL_GPL(samsung_asoc_dma_platform_register); 80EXPORT_SYMBOL_GPL(samsung_asoc_dma_platform_register);
72 81
diff --git a/sound/soc/samsung/i2s.c b/sound/soc/samsung/i2s.c
index 2bb35502b070..50635ee8ff20 100644
--- a/sound/soc/samsung/i2s.c
+++ b/sound/soc/samsung/i2s.c
@@ -1244,7 +1244,7 @@ static int samsung_i2s_probe(struct platform_device *pdev)
1244 return ret; 1244 return ret;
1245 1245
1246 return samsung_asoc_dma_platform_register(&pdev->dev, 1246 return samsung_asoc_dma_platform_register(&pdev->dev,
1247 sec_dai->filter); 1247 sec_dai->filter, "tx-sec", NULL);
1248 } 1248 }
1249 1249
1250 pri_dai = i2s_alloc_dai(pdev, false); 1250 pri_dai = i2s_alloc_dai(pdev, false);
@@ -1351,7 +1351,8 @@ static int samsung_i2s_probe(struct platform_device *pdev)
1351 if (ret < 0) 1351 if (ret < 0)
1352 goto err_free_dai; 1352 goto err_free_dai;
1353 1353
1354 ret = samsung_asoc_dma_platform_register(&pdev->dev, pri_dai->filter); 1354 ret = samsung_asoc_dma_platform_register(&pdev->dev, pri_dai->filter,
1355 NULL, NULL);
1355 if (ret < 0) 1356 if (ret < 0)
1356 goto err_free_dai; 1357 goto err_free_dai;
1357 1358
diff --git a/sound/soc/samsung/pcm.c b/sound/soc/samsung/pcm.c
index 498f563a4c9c..490c1a87fd66 100644
--- a/sound/soc/samsung/pcm.c
+++ b/sound/soc/samsung/pcm.c
@@ -576,7 +576,8 @@ static int s3c_pcm_dev_probe(struct platform_device *pdev)
576 goto err5; 576 goto err5;
577 } 577 }
578 578
579 ret = samsung_asoc_dma_platform_register(&pdev->dev, filter); 579 ret = samsung_asoc_dma_platform_register(&pdev->dev, filter,
580 NULL, NULL);
580 if (ret) { 581 if (ret) {
581 dev_err(&pdev->dev, "failed to get register DMA: %d\n", ret); 582 dev_err(&pdev->dev, "failed to get register DMA: %d\n", ret);
582 goto err5; 583 goto err5;
diff --git a/sound/soc/samsung/s3c2412-i2s.c b/sound/soc/samsung/s3c2412-i2s.c
index 204029d12f5b..d45dffb297d8 100644
--- a/sound/soc/samsung/s3c2412-i2s.c
+++ b/sound/soc/samsung/s3c2412-i2s.c
@@ -177,7 +177,8 @@ static int s3c2412_iis_dev_probe(struct platform_device *pdev)
177 } 177 }
178 178
179 ret = samsung_asoc_dma_platform_register(&pdev->dev, 179 ret = samsung_asoc_dma_platform_register(&pdev->dev,
180 pdata->dma_filter); 180 pdata->dma_filter,
181 NULL, NULL);
181 if (ret) 182 if (ret)
182 pr_err("failed to register the DMA: %d\n", ret); 183 pr_err("failed to register the DMA: %d\n", ret);
183 184
diff --git a/sound/soc/samsung/s3c24xx-i2s.c b/sound/soc/samsung/s3c24xx-i2s.c
index b3a475d73ba7..3e76f2a75a24 100644
--- a/sound/soc/samsung/s3c24xx-i2s.c
+++ b/sound/soc/samsung/s3c24xx-i2s.c
@@ -482,7 +482,8 @@ static int s3c24xx_iis_dev_probe(struct platform_device *pdev)
482 } 482 }
483 483
484 ret = samsung_asoc_dma_platform_register(&pdev->dev, 484 ret = samsung_asoc_dma_platform_register(&pdev->dev,
485 pdata->dma_filter); 485 pdata->dma_filter,
486 NULL, NULL);
486 if (ret) 487 if (ret)
487 pr_err("failed to register the dma: %d\n", ret); 488 pr_err("failed to register the dma: %d\n", ret);
488 489
diff --git a/sound/soc/samsung/spdif.c b/sound/soc/samsung/spdif.c
index 4687f521197c..0cb9c8567546 100644
--- a/sound/soc/samsung/spdif.c
+++ b/sound/soc/samsung/spdif.c
@@ -435,7 +435,8 @@ static int spdif_probe(struct platform_device *pdev)
435 435
436 spdif->dma_playback = &spdif_stereo_out; 436 spdif->dma_playback = &spdif_stereo_out;
437 437
438 ret = samsung_asoc_dma_platform_register(&pdev->dev, filter); 438 ret = samsung_asoc_dma_platform_register(&pdev->dev, filter,
439 NULL, NULL);
439 if (ret) { 440 if (ret) {
440 dev_err(&pdev->dev, "failed to register DMA: %d\n", ret); 441 dev_err(&pdev->dev, "failed to register DMA: %d\n", ret);
441 goto err4; 442 goto err4;