Re: DT DMA channel binding for Tegra I2S
From: Rob Herring <hidden>
Date: 2011-11-23 21:54:44
Also in:
linux-tegra
On 11/23/2011 03:25 PM, Stephen Warren wrote:
Rob, Grant, Re: http://www.spinics.net/lists/arm-kernel/msg148899.html Background: Tegra's DMA controller needs to be told which DMA "request select" to use for each transfer. The identifies which peripheral to transfer to/from. The Tegra I2S driver needs to know its own "request select" value to pass to the audio driver DMA path. The board files typically provide this to the driver as an IORESOURCE_DMA. I don't think there's any standard binding that creates such a resource when instantiating a platform device from device tree, and the discussions I found when looking for one didn't seem to reach conclusion that there should be one. So, I proposed the following property in the I2S driver's DT binding for this:
I think this is a case of every platform being different and IORESOURCE_DMA is not too widely used. Even on PPC, there's not a standard way.
Doc:
- dma-channel : The Tegra DMA controller's channel ID for this I2S controller
Example:
i2s@70002800 {
compatible = "nvidia,tegra20-i2s";
reg = <0x70002800 0x200>;
interrupts = < 45 >;
dma-channel = < 2 >;
};
Does that look reasonable? Or, should I pursue some more standardized
solution?I had some discussion with Thomas Abraham about this for the pl330 dma: http://lists.ozlabs.org/pipermail/devicetree-discuss/2011-September/008269.html So I would just add a phandle to the dma controller here.
(although perhaps dma-request-select would be a better name, since each of the DMA controller's 16 channels can be used for any of the DMA selects)
You'll find h/w with all sorts of relationships between requests and channels on DMA controller h/w...
For reference, the code turns out as below; it might be nicer if the
DT parsing code could create this resource for us, although there was
some previous discussion about IORESOURCE_DMA not being the correct
representation for this anyway.
dmareq = platform_get_resource(pdev, IORESOURCE_DMA, 0);
if (!dmareq) {
if (of_property_read_u32(pdev->dev.of_node,
"nvidia,dma-channel",
&dma_ch) < 0) {It would, but I think IORESOURCE_DMA is supposed to be for ISA bus DMA. Also, I think often you need more information than just a request line like a mode or type of transfer or burst length parameters. Rob