mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 05:54:26 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			129 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From ad5d3e5a1218a599ec02c81a3bd599acedeea00f Mon Sep 17 00:00:00 2001
 | |
| From: Jyri Sarha <jsarha@ti.com>
 | |
| Date: Tue, 17 Sep 2013 12:09:30 +0300
 | |
| Subject: [PATCH 214/752] ASoC: davinci-mcasp: Extract DMA channels directly
 | |
|  from DT
 | |
| 
 | |
| Extract DMA channels directly from DT as they can not be found from
 | |
| platform resources anymore. This is a work-around until davinci audio
 | |
| driver is updated to use dmaengine.
 | |
| 
 | |
| Signed-off-by: Jyri Sarha <jsarha@ti.com>
 | |
| ---
 | |
|  .../bindings/sound/davinci-mcasp-audio.txt         |    5 +++
 | |
|  include/linux/platform_data/davinci_asp.h          |    2 +
 | |
|  sound/soc/davinci/davinci-mcasp.c                  |   47 +++++++++++++-------
 | |
|  3 files changed, 39 insertions(+), 15 deletions(-)
 | |
| 
 | |
| --- a/Documentation/devicetree/bindings/sound/davinci-mcasp-audio.txt
 | |
| +++ b/Documentation/devicetree/bindings/sound/davinci-mcasp-audio.txt
 | |
| @@ -18,6 +18,11 @@ Required properties:
 | |
|  - serial-dir : A list of serializer pin mode. The list number should be equal
 | |
|  		to "num-serializer" parameter. Each entry is a number indication
 | |
|  		serializer pin direction. (0 - INACTIVE, 1 - TX, 2 - RX)
 | |
| +- dmas: two element list of DMA controller phandles and DMA request line
 | |
| +        ordered pairs.
 | |
| +- dma-names: identifier string for each DMA request line in the dmas property.
 | |
| +	     These strings correspond 1:1 with the ordered pairs in dmas. The dma
 | |
| +	     identifiers must be "rx" and "tx".
 | |
|  
 | |
|  Optional properties:
 | |
|  
 | |
| --- a/include/linux/platform_data/davinci_asp.h
 | |
| +++ b/include/linux/platform_data/davinci_asp.h
 | |
| @@ -84,6 +84,8 @@ struct snd_platform_data {
 | |
|  	u8 version;
 | |
|  	u8 txnumevt;
 | |
|  	u8 rxnumevt;
 | |
| +	int tx_dma_channel;
 | |
| +	int rx_dma_channel;
 | |
|  };
 | |
|  
 | |
|  enum {
 | |
| --- a/sound/soc/davinci/davinci-mcasp.c
 | |
| +++ b/sound/soc/davinci/davinci-mcasp.c
 | |
| @@ -1047,6 +1047,7 @@ static struct snd_platform_data *davinci
 | |
|  	struct snd_platform_data *pdata = NULL;
 | |
|  	const struct of_device_id *match =
 | |
|  			of_match_device(mcasp_dt_ids, &pdev->dev);
 | |
| +	struct of_phandle_args dma_spec;
 | |
|  
 | |
|  	const u32 *of_serial_dir32;
 | |
|  	u8 *of_serial_dir;
 | |
| @@ -1109,6 +1110,28 @@ static struct snd_platform_data *davinci
 | |
|  		pdata->serial_dir = of_serial_dir;
 | |
|  	}
 | |
|  
 | |
| +	ret = of_property_match_string(np, "dma-names", "tx");
 | |
| +	if (ret < 0)
 | |
| +		goto nodata;
 | |
| +
 | |
| +	ret = of_parse_phandle_with_args(np, "dmas", "#dma-cells", ret,
 | |
| +					 &dma_spec);
 | |
| +	if (ret < 0)
 | |
| +		goto nodata;
 | |
| +
 | |
| +	pdata->tx_dma_channel = dma_spec.args[0];
 | |
| +
 | |
| +	ret = of_property_match_string(np, "dma-names", "rx");
 | |
| +	if (ret < 0)
 | |
| +		goto nodata;
 | |
| +
 | |
| +	ret = of_parse_phandle_with_args(np, "dmas", "#dma-cells", ret,
 | |
| +					 &dma_spec);
 | |
| +	if (ret < 0)
 | |
| +		goto nodata;
 | |
| +
 | |
| +	pdata->rx_dma_channel = dma_spec.args[0];
 | |
| +
 | |
|  	ret = of_property_read_u32(np, "tx-num-evt", &val);
 | |
|  	if (ret >= 0)
 | |
|  		pdata->txnumevt = val;
 | |
| @@ -1139,7 +1162,7 @@ nodata:
 | |
|  static int davinci_mcasp_probe(struct platform_device *pdev)
 | |
|  {
 | |
|  	struct davinci_pcm_dma_params *dma_data;
 | |
| -	struct resource *mem, *ioarea, *res;
 | |
| +	struct resource *mem, *ioarea, *res, *dma;
 | |
|  	struct snd_platform_data *pdata;
 | |
|  	struct davinci_audio_dev *dev;
 | |
|  	int ret;
 | |
| @@ -1213,15 +1236,11 @@ static int davinci_mcasp_probe(struct pl
 | |
|  	dma_data->sram_size = pdata->sram_size_playback;
 | |
|  	dma_data->dma_addr = dma->start + pdata->tx_dma_offset;
 | |
|  
 | |
| -	/* first TX, then RX */
 | |
|  	res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
 | |
| -	if (!res) {
 | |
| -		dev_err(&pdev->dev, "no DMA resource\n");
 | |
| -		ret = -ENODEV;
 | |
| -		goto err_release_clk;
 | |
| -	}
 | |
| -
 | |
| -	dma_data->channel = res->start;
 | |
| +	if (res)
 | |
| +		dma_data->channel = res->start;
 | |
| +	else
 | |
| +		dma_data->channel = pdata->tx_dma_channel;
 | |
|  
 | |
|  	dma_data = &dev->dma_params[SNDRV_PCM_STREAM_CAPTURE];
 | |
|  	dma_data->asp_chan_q = pdata->asp_chan_q;
 | |
| @@ -1231,13 +1250,11 @@ static int davinci_mcasp_probe(struct pl
 | |
|  	dma_data->dma_addr = dma->start + pdata->rx_dma_offset;
 | |
|  
 | |
|  	res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
 | |
| -	if (!res) {
 | |
| -		dev_err(&pdev->dev, "no DMA resource\n");
 | |
| -		ret = -ENODEV;
 | |
| -		goto err_release_clk;
 | |
| -	}
 | |
| +	if (res)
 | |
| +		dma_data->channel = res->start;
 | |
| +	else
 | |
| +		dma_data->channel = pdata->rx_dma_channel;
 | |
|  
 | |
| -	dma_data->channel = res->start;
 | |
|  	dev_set_drvdata(&pdev->dev, dev);
 | |
|  	ret = snd_soc_register_component(&pdev->dev, &davinci_mcasp_component,
 | |
|  					 &davinci_mcasp_dai[pdata->op_mode], 1);
 |