@@ -8,9 +8,12 @@ controller.
* DMA controller
Required property:
-- #dma-cells: Must be at least 1. Used to provide DMA controller
- specific information. See DMA client binding below for
- more details.
+- #dma-cells: Used to provide DMA controller specific information.
+ Can be 0 for DMA controllers where clients may use
+ any channel and any DMA specific information, such
+ as a hardware request signal, does not need to be
+ encoded in the binding. See DMA client binding below
+ for more details.
Optional properties:
- dma-channels: Number of DMA channels supported by the controller.
@@ -79,7 +82,8 @@ Required property:
are defined in the binding of the DMA client device.
Multiple DMA specifiers can be used to represent
alternatives and in this case the dma-names for those
- DMA specifiers must be identical (see examples).
+ DMA specifiers must be identical (see examples). This
+ is optional for DMA controllers where #dma-cells is 0.
Examples:
@@ -214,11 +214,13 @@ static int of_dma_match_channel(struct device_node *np, const char *name,
{
const char *s;
- if (of_property_read_string_index(np, "dma-names", index, &s))
- return -ENODEV;
+ if (name) {
+ if (of_property_read_string_index(np, "dma-names", index, &s))
+ return -ENODEV;
- if (strcmp(name, s))
- return -ENODEV;
+ if (strcmp(name, s))
+ return -ENODEV;
+ }
if (of_parse_phandle_with_args(np, "dmas", "#dma-cells", index,
dma_spec))
@@ -230,7 +232,7 @@ static int of_dma_match_channel(struct device_node *np, const char *name,
/**
* of_dma_request_slave_channel - Get the DMA slave channel
* @np: device node to get DMA request from
- * @name: name of desired channel
+ * @name: name of desired channel (optional)
*
* Returns pointer to appropriate DMA channel on success or an error pointer.
*/
@@ -243,8 +245,8 @@ struct dma_chan *of_dma_request_slave_channel(struct device_node *np,
int count, i;
int ret_no_channel = -ENODEV;
- if (!np || !name) {
- pr_err("%s: not enough information provided\n", __func__);
+ if (!np) {
+ pr_err("%s: device node is not valid\n", __func__);
return ERR_PTR(-ENODEV);
}
@@ -252,7 +254,12 @@ struct dma_chan *of_dma_request_slave_channel(struct device_node *np,
if (!of_find_property(np, "dmas", NULL))
return ERR_PTR(-ENODEV);
- count = of_property_count_strings(np, "dma-names");
+ /*
+ * If a name is not provided, then assume that there is one
+ * DMA specifier in the list for the client and so set the
+ * count to 1 and see if this matches.
+ */
+ count = name ? of_property_count_strings(np, "dma-names") : 1;
if (count < 0) {
pr_err("%s: dma-names property of node '%s' missing or empty\n",
__func__, np->full_name);
Currently, the #dma-cells property must be 1 or more. However, for some DMA controllers, where DMA clients may use any DMA channel and it is not necessary to specify any other DMA information in the device-tree DMA binding, setting #dma-cells to 0 is desirable. The Tegra210 ADMA controller is an example of a DMA controller where neither the DMA channel or the hardware request signal need to be encoded in the device-tree binding. By allowing DMA controllers to set #dma-cells to 0, means that the "dma-names" property for these controllers is not needed. Therefore, update the of_dma_request_slave_channel() and of_dma_match_channel() functions to ignore this property if no name is provided. Signed-off-by: Jon Hunter <jonathanh@nvidia.com> --- Documentation/devicetree/bindings/dma/dma.txt | 12 ++++++++---- drivers/dma/of-dma.c | 23 +++++++++++++++-------- 2 files changed, 23 insertions(+), 12 deletions(-)