Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 42a74e77 authored by Sylwester Nawrocki's avatar Sylwester Nawrocki Committed by Mark Brown
Browse files

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: default avatarSylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 2b960386
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -389,7 +389,8 @@ static int s3c_ac97_probe(struct platform_device *pdev)
		goto err5;
		goto err5;


	ret = samsung_asoc_dma_platform_register(&pdev->dev,
	ret = samsung_asoc_dma_platform_register(&pdev->dev,
						 ac97_pdata->dma_filter);
						 ac97_pdata->dma_filter,
						 NULL, NULL);
	if (ret) {
	if (ret) {
		dev_err(&pdev->dev, "failed to get register DMA: %d\n", ret);
		dev_err(&pdev->dev, "failed to get register DMA: %d\n", ret);
		goto err5;
		goto err5;
+6 −3
Original line number Original line Diff line number Diff line
@@ -26,7 +26,10 @@ struct s3c_dma_params {
void samsung_asoc_init_dma_data(struct snd_soc_dai *dai,
void samsung_asoc_init_dma_data(struct snd_soc_dai *dai,
				struct s3c_dma_params *playback,
				struct s3c_dma_params *playback,
				struct s3c_dma_params *capture);
				struct s3c_dma_params *capture);
int samsung_asoc_dma_platform_register(struct device *dev,
/*
				       dma_filter_fn fn);
 * @tx, @rx arguments can be NULL if the DMA channel names are "tx", "rx",

 * otherwise actual DMA channel names must be passed to this function.
 */
int samsung_asoc_dma_platform_register(struct device *dev, dma_filter_fn filter,
				       const char *tx, const char *rx);
#endif
#endif
+20 −11
Original line number Original line Diff line number Diff line
@@ -28,10 +28,6 @@


#include "dma.h"
#include "dma.h"


static struct snd_dmaengine_pcm_config samsung_dmaengine_pcm_config = {
	.prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config,
};

void samsung_asoc_init_dma_data(struct snd_soc_dai *dai,
void samsung_asoc_init_dma_data(struct snd_soc_dai *dai,
				struct s3c_dma_params *playback,
				struct s3c_dma_params *playback,
				struct s3c_dma_params *capture)
				struct s3c_dma_params *capture)
@@ -58,15 +54,28 @@ void samsung_asoc_init_dma_data(struct snd_soc_dai *dai,
}
}
EXPORT_SYMBOL_GPL(samsung_asoc_init_dma_data);
EXPORT_SYMBOL_GPL(samsung_asoc_init_dma_data);


int samsung_asoc_dma_platform_register(struct device *dev,
int samsung_asoc_dma_platform_register(struct device *dev, dma_filter_fn filter,
				       dma_filter_fn filter)
				       const char *tx, const char *rx)
{
{
	samsung_dmaengine_pcm_config.compat_filter_fn = filter;
	unsigned int flags = SND_DMAENGINE_PCM_FLAG_COMPAT;

	struct snd_dmaengine_pcm_config *pcm_conf;

	pcm_conf = devm_kzalloc(dev, sizeof(*pcm_conf), GFP_KERNEL);
	if (!pcm_conf)
		return -ENOMEM;

	pcm_conf->prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config;
	pcm_conf->compat_filter_fn = filter;

	if (dev->of_node) {
		pcm_conf->chan_names[SNDRV_PCM_STREAM_PLAYBACK] = tx;
		pcm_conf->chan_names[SNDRV_PCM_STREAM_CAPTURE] = rx;
	} else {
		flags |= SND_DMAENGINE_PCM_FLAG_CUSTOM_CHANNEL_NAME;
	}


	return devm_snd_dmaengine_pcm_register(dev,
	return devm_snd_dmaengine_pcm_register(dev, pcm_conf, flags);
			&samsung_dmaengine_pcm_config,
			SND_DMAENGINE_PCM_FLAG_CUSTOM_CHANNEL_NAME |
			SND_DMAENGINE_PCM_FLAG_COMPAT);
}
}
EXPORT_SYMBOL_GPL(samsung_asoc_dma_platform_register);
EXPORT_SYMBOL_GPL(samsung_asoc_dma_platform_register);


+3 −2
Original line number Original line Diff line number Diff line
@@ -1244,7 +1244,7 @@ static int samsung_i2s_probe(struct platform_device *pdev)
			return ret;
			return ret;


		return samsung_asoc_dma_platform_register(&pdev->dev,
		return samsung_asoc_dma_platform_register(&pdev->dev,
							  sec_dai->filter);
					sec_dai->filter, "tx-sec", NULL);
	}
	}


	pri_dai = i2s_alloc_dai(pdev, false);
	pri_dai = i2s_alloc_dai(pdev, false);
@@ -1351,7 +1351,8 @@ static int samsung_i2s_probe(struct platform_device *pdev)
	if (ret < 0)
	if (ret < 0)
		goto err_free_dai;
		goto err_free_dai;


	ret = samsung_asoc_dma_platform_register(&pdev->dev, pri_dai->filter);
	ret = samsung_asoc_dma_platform_register(&pdev->dev, pri_dai->filter,
						 NULL, NULL);
	if (ret < 0)
	if (ret < 0)
		goto err_free_dai;
		goto err_free_dai;


+2 −1
Original line number Original line Diff line number Diff line
@@ -576,7 +576,8 @@ static int s3c_pcm_dev_probe(struct platform_device *pdev)
		goto err5;
		goto err5;
	}
	}


	ret = samsung_asoc_dma_platform_register(&pdev->dev, filter);
	ret = samsung_asoc_dma_platform_register(&pdev->dev, filter,
						 NULL, NULL);
	if (ret) {
	if (ret) {
		dev_err(&pdev->dev, "failed to get register DMA: %d\n", ret);
		dev_err(&pdev->dev, "failed to get register DMA: %d\n", ret);
		goto err5;
		goto err5;
Loading