diff options
author | Sylwester Nawrocki <s.nawrocki@samsung.com> | 2016-07-21 14:03:50 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2016-07-21 14:18:17 -0400 |
commit | 42a74e77471ea42e6ab44e5be16723ede72b9901 (patch) | |
tree | 6be321ee4782af38a420aad1ccbd7e8fd83cb702 /sound | |
parent | 2b960386cb75bd332a132c44c9ec69bd1f3122d8 (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.c | 3 | ||||
-rw-r--r-- | sound/soc/samsung/dma.h | 9 | ||||
-rw-r--r-- | sound/soc/samsung/dmaengine.c | 31 | ||||
-rw-r--r-- | sound/soc/samsung/i2s.c | 5 | ||||
-rw-r--r-- | sound/soc/samsung/pcm.c | 3 | ||||
-rw-r--r-- | sound/soc/samsung/s3c2412-i2s.c | 3 | ||||
-rw-r--r-- | sound/soc/samsung/s3c24xx-i2s.c | 3 | ||||
-rw-r--r-- | sound/soc/samsung/spdif.c | 3 |
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 { | |||
26 | void samsung_asoc_init_dma_data(struct snd_soc_dai *dai, | 26 | void 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); |
29 | int 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 | */ | ||
33 | int 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 | ||
31 | static struct snd_dmaengine_pcm_config samsung_dmaengine_pcm_config = { | ||
32 | .prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config, | ||
33 | }; | ||
34 | |||
35 | void samsung_asoc_init_dma_data(struct snd_soc_dai *dai, | 31 | void 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 | } |
59 | EXPORT_SYMBOL_GPL(samsung_asoc_init_dma_data); | 55 | EXPORT_SYMBOL_GPL(samsung_asoc_init_dma_data); |
60 | 56 | ||
61 | int samsung_asoc_dma_platform_register(struct device *dev, | 57 | int 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 | } |
71 | EXPORT_SYMBOL_GPL(samsung_asoc_dma_platform_register); | 80 | EXPORT_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; |