[PATCH V3 1/2] of: Add generic device tree DMA helpers
Jon Hunter
jon-hunter at ti.com
Wed May 16 13:09:43 EDT 2012
On 05/16/2012 11:22 AM, Jassi Brar wrote:
[...]
> OK, my guts feel people might be interested in what's cooking on
> my side. I started with the binding text first and then would write
> code based upon that approach.
>
> The following might be tweaked as I look deeper into client and DMAC
> drivers while deciding upon what the helper functions should be optimally...
>
> -------------------- 8< --------------------
>
>
> Generic binding to provide a way to provide the client-channel map and
> other dmac specific parameters to the dma controller driver
>
> DMA Model:-
> Only the most common characteristics of a dma setup are assumed
> in this binding.
> Client: Some h/w controller that could request a DMA controller in
> the system to perform data transfer on its behalf. Example SPI, MMC,
> I2S etc.
> DMAC: A DMA Controller instance. Example, PL330, PL08X, SDMA etc.
>
> The assumed model of the DMAC, in this binding, has P peripheral
> interfaces (P request signals) that could request a data transfer
> and C physical channels that actually do the data transfers, hence,
> at most C out of P peripherals could be served by the DMAC at any
> point of time. Usually C := P, but not always. Usually, any of the
> physical channels could be employed by the DMAC driver to serve any
> client.
> The DMAC driver identifies a client by its i/f number, 'peri_id'
> on the given DMAC. For example, TX for SPI has 7th while RX_TX
> (half-duplex) for MMC has 10th peripheral interface (request-signal)
> on a given DMAC. Usually, any of the physical channels could be
> employed by the DMAC driver to serve a client.
>
> * DMA Controller
>
> Required property:
>
> - #map-cells: Number of elements in each chan-map entry.
> At least 3 elements are required by this binding.
>
> - chan-map: List of entries that specify clients' 'peri_id'.
> and also possibly DMAC specific per-client data.
> The first element of each entry being the client's
> phandle. The second the direction of data transfer
> w.r.t the client 1 for RX, 2 for TX and 3 for RX|TX.
> The third the 'peri_id' of the client's request signal
> on the DMAC.
>
> Optional properties:
>
> - #dma-peri-ifs: P, usually the DMAC driver would simply assume the
> number of entries in the 'chan-map' property to be the
> effective number of peripheral request interfaces on the
> DMAC. If specified, it should be at least the number of
> entries in the 'chan-map' property.
>
> - #dma-channels: C, if specified, it should neither be more than
> the value of 'dma-peri-ifs' nor equal to zero.
> If unspecified, it is assumed to be equal to the value of
> 'dma-peri-ifs', i.e, C := P
>
> - #private-data: Peculiarities of the DMAC setup, not taken into
> account by this generic model. The decoding of it would
> be private to the DMAC's driver. For ex, some DMAC drivers
> for dmaengine would specify dma_cap_mask_t for the DMAC,
> if they don't need to specify it on a per-client basis
> (i.e, via 4th element of a 'chan-map' entry).
>
> Example:
>
> dma-controller at 0 {
> compatible = "foo,dmac-xxx";
> #private-data = <0x80808080>;
> #dma-peri-ifs = <32>;
> #dma-channels = <8>;
> #map-cells = <3>;
> chan-map =
> <&i2s1 1 2>, /* peri_id of I2S's RX is 2 */
> <&i2s1 2 3>, /* peri_id of I2S's TX is 3 */
> <&mmc1 3 5>, /* peri_id of MMC's RX_TX is 5 */
> <&spi1 1 6>,
> <&spi1 2 8>,
> ...;
> };
>
>
> * Client Controller
>
> Required property: None.
> The client's DT node doesn't need any DMA specifier.
> Typically it would only comment about the data transfer
> direction associated with each of its request signal.
> Preferably also mentioned in the binding.
>
> Optional property: None.
May be I am still missing something here, but in the case where a client
can use one of two dma controllers, how do you specify which to use? Who
decides?
I was under the impression that you would use the phandle of the dma
controller to specify which controller is used in the client node.
For example ...
i2s1: i2s at 70002800 {
/* This controller has a request-signal for TX and RX each
* i.e, the driver is going to request a channel for RX(1)
* and another for TX(2).
*/
dma = <dma-controller0>
...
};
Cheers
Jon
More information about the linux-arm-kernel
mailing list