forked from mirrors/linux
		
	ASoC: davinci-i2s: Convert to use edma-pcm
The edma-pcm can replace the old davinci-pcm as platform driver. Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
		
							parent
							
								
									4c03a5ebc7
								
							
						
					
					
						commit
						257ade78b6
					
				
					 1 changed files with 26 additions and 41 deletions
				
			
		|  | @ -23,8 +23,9 @@ | ||||||
| #include <sound/pcm_params.h> | #include <sound/pcm_params.h> | ||||||
| #include <sound/initval.h> | #include <sound/initval.h> | ||||||
| #include <sound/soc.h> | #include <sound/soc.h> | ||||||
|  | #include <sound/dmaengine_pcm.h> | ||||||
| 
 | 
 | ||||||
| #include "davinci-pcm.h" | #include "edma-pcm.h" | ||||||
| #include "davinci-i2s.h" | #include "davinci-i2s.h" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -122,7 +123,8 @@ static const unsigned char double_fmt[SNDRV_PCM_FORMAT_S32_LE + 1] = { | ||||||
| 
 | 
 | ||||||
| struct davinci_mcbsp_dev { | struct davinci_mcbsp_dev { | ||||||
| 	struct device *dev; | 	struct device *dev; | ||||||
| 	struct davinci_pcm_dma_params	dma_params[2]; | 	struct snd_dmaengine_dai_dma_data dma_data[2]; | ||||||
|  | 	int dma_request[2]; | ||||||
| 	void __iomem			*base; | 	void __iomem			*base; | ||||||
| #define MOD_DSP_A	0 | #define MOD_DSP_A	0 | ||||||
| #define MOD_DSP_B	1 | #define MOD_DSP_B	1 | ||||||
|  | @ -419,8 +421,6 @@ static int davinci_i2s_hw_params(struct snd_pcm_substream *substream, | ||||||
| 				 struct snd_soc_dai *dai) | 				 struct snd_soc_dai *dai) | ||||||
| { | { | ||||||
| 	struct davinci_mcbsp_dev *dev = snd_soc_dai_get_drvdata(dai); | 	struct davinci_mcbsp_dev *dev = snd_soc_dai_get_drvdata(dai); | ||||||
| 	struct davinci_pcm_dma_params *dma_params = |  | ||||||
| 					&dev->dma_params[substream->stream]; |  | ||||||
| 	struct snd_interval *i = NULL; | 	struct snd_interval *i = NULL; | ||||||
| 	int mcbsp_word_length, master; | 	int mcbsp_word_length, master; | ||||||
| 	unsigned int rcr, xcr, srgr, clk_div, freq, framesize; | 	unsigned int rcr, xcr, srgr, clk_div, freq, framesize; | ||||||
|  | @ -532,8 +532,6 @@ static int davinci_i2s_hw_params(struct snd_pcm_substream *substream, | ||||||
| 			return -EINVAL; | 			return -EINVAL; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	dma_params->acnt = dma_params->data_type = data_type[fmt]; |  | ||||||
| 	dma_params->fifo_level = 0; |  | ||||||
| 	mcbsp_word_length = asp_word_length[fmt]; | 	mcbsp_word_length = asp_word_length[fmt]; | ||||||
| 
 | 
 | ||||||
| 	switch (master) { | 	switch (master) { | ||||||
|  | @ -600,15 +598,6 @@ static int davinci_i2s_trigger(struct snd_pcm_substream *substream, int cmd, | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int davinci_i2s_startup(struct snd_pcm_substream *substream, |  | ||||||
| 			       struct snd_soc_dai *dai) |  | ||||||
| { |  | ||||||
| 	struct davinci_mcbsp_dev *dev = snd_soc_dai_get_drvdata(dai); |  | ||||||
| 
 |  | ||||||
| 	snd_soc_dai_set_dma_data(dai, substream, dev->dma_params); |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static void davinci_i2s_shutdown(struct snd_pcm_substream *substream, | static void davinci_i2s_shutdown(struct snd_pcm_substream *substream, | ||||||
| 		struct snd_soc_dai *dai) | 		struct snd_soc_dai *dai) | ||||||
| { | { | ||||||
|  | @ -620,7 +609,6 @@ static void davinci_i2s_shutdown(struct snd_pcm_substream *substream, | ||||||
| #define DAVINCI_I2S_RATES	SNDRV_PCM_RATE_8000_96000 | #define DAVINCI_I2S_RATES	SNDRV_PCM_RATE_8000_96000 | ||||||
| 
 | 
 | ||||||
| static const struct snd_soc_dai_ops davinci_i2s_dai_ops = { | static const struct snd_soc_dai_ops davinci_i2s_dai_ops = { | ||||||
| 	.startup	= davinci_i2s_startup, |  | ||||||
| 	.shutdown	= davinci_i2s_shutdown, | 	.shutdown	= davinci_i2s_shutdown, | ||||||
| 	.prepare	= davinci_i2s_prepare, | 	.prepare	= davinci_i2s_prepare, | ||||||
| 	.trigger	= davinci_i2s_trigger, | 	.trigger	= davinci_i2s_trigger, | ||||||
|  | @ -630,7 +618,18 @@ static const struct snd_soc_dai_ops davinci_i2s_dai_ops = { | ||||||
| 
 | 
 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | static int davinci_i2s_dai_probe(struct snd_soc_dai *dai) | ||||||
|  | { | ||||||
|  | 	struct davinci_mcbsp_dev *dev = snd_soc_dai_get_drvdata(dai); | ||||||
|  | 
 | ||||||
|  | 	dai->playback_dma_data = &dev->dma_data[SNDRV_PCM_STREAM_PLAYBACK]; | ||||||
|  | 	dai->capture_dma_data = &dev->dma_data[SNDRV_PCM_STREAM_CAPTURE]; | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static struct snd_soc_dai_driver davinci_i2s_dai = { | static struct snd_soc_dai_driver davinci_i2s_dai = { | ||||||
|  | 	.probe = davinci_i2s_dai_probe, | ||||||
| 	.playback = { | 	.playback = { | ||||||
| 		.channels_min = 2, | 		.channels_min = 2, | ||||||
| 		.channels_max = 2, | 		.channels_max = 2, | ||||||
|  | @ -651,11 +650,9 @@ static const struct snd_soc_component_driver davinci_i2s_component = { | ||||||
| 
 | 
 | ||||||
| static int davinci_i2s_probe(struct platform_device *pdev) | static int davinci_i2s_probe(struct platform_device *pdev) | ||||||
| { | { | ||||||
| 	struct snd_platform_data *pdata = pdev->dev.platform_data; |  | ||||||
| 	struct davinci_mcbsp_dev *dev; | 	struct davinci_mcbsp_dev *dev; | ||||||
| 	struct resource *mem, *ioarea, *res; | 	struct resource *mem, *ioarea, *res; | ||||||
| 	enum dma_event_q asp_chan_q = EVENTQ_0; | 	int *dma; | ||||||
| 	enum dma_event_q ram_chan_q = EVENTQ_1; |  | ||||||
| 	int ret; | 	int ret; | ||||||
| 
 | 
 | ||||||
| 	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||||||
|  | @ -676,22 +673,6 @@ static int davinci_i2s_probe(struct platform_device *pdev) | ||||||
| 			   GFP_KERNEL); | 			   GFP_KERNEL); | ||||||
| 	if (!dev) | 	if (!dev) | ||||||
| 		return -ENOMEM; | 		return -ENOMEM; | ||||||
| 	if (pdata) { |  | ||||||
| 		dev->enable_channel_combine = pdata->enable_channel_combine; |  | ||||||
| 		dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].sram_size = |  | ||||||
| 			pdata->sram_size_playback; |  | ||||||
| 		dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].sram_size = |  | ||||||
| 			pdata->sram_size_capture; |  | ||||||
| 		dev->clk_input_pin = pdata->clk_input_pin; |  | ||||||
| 		dev->i2s_accurate_sck = pdata->i2s_accurate_sck; |  | ||||||
| 		asp_chan_q = pdata->asp_chan_q; |  | ||||||
| 		ram_chan_q = pdata->ram_chan_q; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].asp_chan_q	= asp_chan_q; |  | ||||||
| 	dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].ram_chan_q	= ram_chan_q; |  | ||||||
| 	dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].asp_chan_q	= asp_chan_q; |  | ||||||
| 	dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].ram_chan_q	= ram_chan_q; |  | ||||||
| 
 | 
 | ||||||
| 	dev->clk = clk_get(&pdev->dev, NULL); | 	dev->clk = clk_get(&pdev->dev, NULL); | ||||||
| 	if (IS_ERR(dev->clk)) | 	if (IS_ERR(dev->clk)) | ||||||
|  | @ -705,10 +686,10 @@ static int davinci_i2s_probe(struct platform_device *pdev) | ||||||
| 		goto err_release_clk; | 		goto err_release_clk; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].dma_addr = | 	dev->dma_data[SNDRV_PCM_STREAM_PLAYBACK].addr = | ||||||
| 	    (dma_addr_t)(mem->start + DAVINCI_MCBSP_DXR_REG); | 	    (dma_addr_t)(mem->start + DAVINCI_MCBSP_DXR_REG); | ||||||
| 
 | 
 | ||||||
| 	dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].dma_addr = | 	dev->dma_data[SNDRV_PCM_STREAM_CAPTURE].addr = | ||||||
| 	    (dma_addr_t)(mem->start + DAVINCI_MCBSP_DRR_REG); | 	    (dma_addr_t)(mem->start + DAVINCI_MCBSP_DRR_REG); | ||||||
| 
 | 
 | ||||||
| 	/* first TX, then RX */ | 	/* first TX, then RX */ | ||||||
|  | @ -718,7 +699,9 @@ static int davinci_i2s_probe(struct platform_device *pdev) | ||||||
| 		ret = -ENXIO; | 		ret = -ENXIO; | ||||||
| 		goto err_release_clk; | 		goto err_release_clk; | ||||||
| 	} | 	} | ||||||
| 	dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].channel = res->start; | 	dma = &dev->dma_request[SNDRV_PCM_STREAM_PLAYBACK]; | ||||||
|  | 	*dma = res->start; | ||||||
|  | 	dev->dma_data[SNDRV_PCM_STREAM_PLAYBACK].filter_data = dma; | ||||||
| 
 | 
 | ||||||
| 	res = platform_get_resource(pdev, IORESOURCE_DMA, 1); | 	res = platform_get_resource(pdev, IORESOURCE_DMA, 1); | ||||||
| 	if (!res) { | 	if (!res) { | ||||||
|  | @ -726,9 +709,11 @@ static int davinci_i2s_probe(struct platform_device *pdev) | ||||||
| 		ret = -ENXIO; | 		ret = -ENXIO; | ||||||
| 		goto err_release_clk; | 		goto err_release_clk; | ||||||
| 	} | 	} | ||||||
| 	dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].channel = res->start; | 	dma = &dev->dma_request[SNDRV_PCM_STREAM_CAPTURE]; | ||||||
| 	dev->dev = &pdev->dev; | 	*dma = res->start; | ||||||
|  | 	dev->dma_data[SNDRV_PCM_STREAM_CAPTURE].filter_data = dma; | ||||||
| 
 | 
 | ||||||
|  | 	dev->dev = &pdev->dev; | ||||||
| 	dev_set_drvdata(&pdev->dev, dev); | 	dev_set_drvdata(&pdev->dev, dev); | ||||||
| 
 | 
 | ||||||
| 	ret = snd_soc_register_component(&pdev->dev, &davinci_i2s_component, | 	ret = snd_soc_register_component(&pdev->dev, &davinci_i2s_component, | ||||||
|  | @ -736,7 +721,7 @@ static int davinci_i2s_probe(struct platform_device *pdev) | ||||||
| 	if (ret != 0) | 	if (ret != 0) | ||||||
| 		goto err_release_clk; | 		goto err_release_clk; | ||||||
| 
 | 
 | ||||||
| 	ret = davinci_soc_platform_register(&pdev->dev); | 	ret = edma_pcm_platform_register(&pdev->dev); | ||||||
| 	if (ret) { | 	if (ret) { | ||||||
| 		dev_err(&pdev->dev, "register PCM failed: %d\n", ret); | 		dev_err(&pdev->dev, "register PCM failed: %d\n", ret); | ||||||
| 		goto err_unregister_component; | 		goto err_unregister_component; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Peter Ujfalusi
						Peter Ujfalusi