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@xxxxxxxxxx> --- Documentation/devicetree/bindings/dma/dma.txt | 12 ++++++++---- drivers/dma/of-dma.c | 23 +++++++++++++++-------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/Documentation/devicetree/bindings/dma/dma.txt b/Documentation/devicetree/bindings/dma/dma.txt index 6312fb00ce8d..4d73916fc879 100644 --- a/Documentation/devicetree/bindings/dma/dma.txt +++ b/Documentation/devicetree/bindings/dma/dma.txt @@ -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: diff --git a/drivers/dma/of-dma.c b/drivers/dma/of-dma.c index 1e1f2986eba8..ef3d260610ea 100644 --- a/drivers/dma/of-dma.c +++ b/drivers/dma/of-dma.c @@ -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); -- 2.1.4 -- To unsubscribe from this list: send the line "unsubscribe linux-tegra" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html