of/address: use range parser for of_dma_get_range
authorRob Herring <robh@kernel.org>
Thu, 6 Feb 2020 14:02:30 +0000 (14:02 +0000)
committerRob Herring <robh@kernel.org>
Fri, 14 Feb 2020 21:20:07 +0000 (15:20 -0600)
of_dma_get_range() does the same ranges parsing as
of_pci_range_parser_one(), so let's refactor of_dma_get_range() to use
it instead.

This commit is no functional change. Subsequent commits will parse more
than the 1st dma-ranges entry.

Signed-off-by: Rob Herring <robh@kernel.org>
drivers/of/address.c

index 6d33f849f114407f5ecbc4bc12dd5f097f31ce8d..a2c45812a50e52f7aa39b19d2121a8dc18de18ad 100644 (file)
@@ -939,10 +939,11 @@ int of_dma_get_range(struct device_node *np, u64 *dma_addr, u64 *paddr, u64 *siz
 {
        struct device_node *node = of_node_get(np);
        const __be32 *ranges = NULL;
-       int len, naddr, nsize, pna;
+       int len;
        int ret = 0;
        bool found_dma_ranges = false;
-       u64 dmaaddr;
+       struct of_range_parser parser;
+       struct of_range range;
 
        while (node) {
                ranges = of_get_property(node, "dma-ranges", &len);
@@ -967,33 +968,20 @@ int of_dma_get_range(struct device_node *np, u64 *dma_addr, u64 *paddr, u64 *siz
                goto out;
        }
 
-       naddr = of_bus_n_addr_cells(node);
-       nsize = of_bus_n_size_cells(node);
-       pna = of_n_addr_cells(node);
-       if ((len / sizeof(__be32)) % (pna + naddr + nsize)) {
-               ret = -EINVAL;
-               goto out;
-       }
+       of_dma_range_parser_init(&parser, node);
+
+       for_each_of_range(&parser, &range) {
+               pr_debug("dma_addr(%llx) cpu_addr(%llx) size(%llx)\n",
+                        range.bus_addr, range.cpu_addr, range.size);
+
+               *dma_addr = range.bus_addr;
+               *paddr = range.cpu_addr;
+               *size = range.size;
 
-       /* dma-ranges format:
-        * DMA addr     : naddr cells
-        * CPU addr     : pna cells
-        * size         : nsize cells
-        */
-       dmaaddr = of_read_number(ranges, naddr);
-       *paddr = of_translate_dma_address(node, ranges + naddr);
-       if (*paddr == OF_BAD_ADDR) {
-               pr_err("translation of DMA address(%llx) to CPU address failed node(%pOF)\n",
-                      dmaaddr, np);
-               ret = -EINVAL;
                goto out;
        }
-       *dma_addr = dmaaddr;
-
-       *size = of_read_number(ranges + naddr + pna, nsize);
 
-       pr_debug("dma_addr(%llx) cpu_addr(%llx) size(%llx)\n",
-                *dma_addr, *paddr, *size);
+       pr_err("translation of DMA ranges failed on node(%pOF)\n", np);
 
 out:
        of_node_put(node);