]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
dmaengine: qcom_hidma: simplify DT resource parsing
authorRob Herring <robh@kernel.org>
Thu, 4 Jan 2018 22:45:40 +0000 (16:45 -0600)
committerVinod Koul <vinod.koul@intel.com>
Mon, 8 Jan 2018 17:01:02 +0000 (22:31 +0530)
The hidma driver open codes populating address and IRQ resources from DT.
We have standard functions of_address_to_resource and of_irq_to_resource
for this, so use them instead.

The DT binding states each child should have 2 addresses and 1 IRQ, so we
can simplify the logic and do a fixed size resource allocation. Using the
standard of_address_to_resource will also do any address translation which
was missing.

Signed-off-by: Rob Herring <robh@kernel.org>
Reviewed-by: Sinan Kaya <okaya@codeaurora.org>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
drivers/dma/qcom/hidma_mgmt.c

index 7335e2eb9b72a1fffc01d51317b6eff8d9c4bee7..000c7019ca7d30db231ba6e8b6d597fbf1276fa2 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/acpi.h>
 #include <linux/of.h>
 #include <linux/property.h>
+#include <linux/of_address.h>
 #include <linux/of_irq.h>
 #include <linux/of_platform.h>
 #include <linux/module.h>
@@ -356,67 +357,37 @@ static int __init hidma_mgmt_of_populate_channels(struct device_node *np)
 {
        struct platform_device *pdev_parent = of_find_device_by_node(np);
        struct platform_device_info pdevinfo;
-       struct of_phandle_args out_irq;
        struct device_node *child;
-       struct resource *res = NULL;
-       const __be32 *cell;
-       int ret = 0, size, i, num;
-       u64 addr, addr_size;
+       struct resource *res;
+       int ret = 0;
+
+       /* allocate a resource array */
+       res = kcalloc(3, sizeof(*res), GFP_KERNEL);
+       if (!res)
+               return -ENOMEM;
 
        for_each_available_child_of_node(np, child) {
-               struct resource *res_iter;
                struct platform_device *new_pdev;
 
-               cell = of_get_property(child, "reg", &size);
-               if (!cell) {
-                       ret = -EINVAL;
+               ret = of_address_to_resource(child, 0, &res[0]);
+               if (!ret)
                        goto out;
-               }
-
-               size /= sizeof(*cell);
-               num = size /
-                       (of_n_addr_cells(child) + of_n_size_cells(child)) + 1;
 
-               /* allocate a resource array */
-               res = kcalloc(num, sizeof(*res), GFP_KERNEL);
-               if (!res) {
-                       ret = -ENOMEM;
+               ret = of_address_to_resource(child, 1, &res[1]);
+               if (!ret)
                        goto out;
-               }
-
-               /* read each reg value */
-               i = 0;
-               res_iter = res;
-               while (i < size) {
-                       addr = of_read_number(&cell[i],
-                                             of_n_addr_cells(child));
-                       i += of_n_addr_cells(child);
-
-                       addr_size = of_read_number(&cell[i],
-                                                  of_n_size_cells(child));
-                       i += of_n_size_cells(child);
-
-                       res_iter->start = addr;
-                       res_iter->end = res_iter->start + addr_size - 1;
-                       res_iter->flags = IORESOURCE_MEM;
-                       res_iter++;
-               }
 
-               ret = of_irq_parse_one(child, 0, &out_irq);
-               if (ret)
+               ret = of_irq_to_resource(child, 0, &res[2]);
+               if (ret <= 0)
                        goto out;
 
-               res_iter->start = irq_create_of_mapping(&out_irq);
-               res_iter->name = "hidma event irq";
-               res_iter->flags = IORESOURCE_IRQ;
-
                memset(&pdevinfo, 0, sizeof(pdevinfo));
                pdevinfo.fwnode = &child->fwnode;
                pdevinfo.parent = pdev_parent ? &pdev_parent->dev : NULL;
                pdevinfo.name = child->name;
                pdevinfo.id = object_counter++;
                pdevinfo.res = res;
-               pdevinfo.num_res = num;
+               pdevinfo.num_res = 3;
                pdevinfo.data = NULL;
                pdevinfo.size_data = 0;
                pdevinfo.dma_mask = DMA_BIT_MASK(64);
@@ -434,8 +405,6 @@ static int __init hidma_mgmt_of_populate_channels(struct device_node *np)
                 */
                of_msi_configure(&new_pdev->dev, child);
                of_node_put(child);
-               kfree(res);
-               res = NULL;
        }
 out:
        kfree(res);