#include <linux/init.h>
 #include <linux/list.h>
 #include <linux/io.h>
-#include <linux/idr.h>
 #include <linux/of_address.h>
 #include <linux/of_device.h>
 #include <linux/of_dma.h>
        void __iomem *iomem;
 
        struct dma_router dmarouter;
-       struct idr map_idr;
+       struct mutex mutex;
+       unsigned long *dma_inuse;
 
        u16 safe_val; /* Value to rest the crossbar lines */
        u32 xbar_requests; /* number of DMA requests connected to XBAR */
                map->xbar_in, map->xbar_out);
 
        ti_dra7_xbar_write(xbar->iomem, map->xbar_out, xbar->safe_val);
-       idr_remove(&xbar->map_idr, map->xbar_out);
+       mutex_lock(&xbar->mutex);
+       clear_bit(map->xbar_out, xbar->dma_inuse);
+       mutex_unlock(&xbar->mutex);
        kfree(map);
 }
 
                return ERR_PTR(-ENOMEM);
        }
 
-       map->xbar_out = idr_alloc(&xbar->map_idr, NULL, 0, xbar->dma_requests,
-                                 GFP_KERNEL);
+       mutex_lock(&xbar->mutex);
+       map->xbar_out = find_first_zero_bit(xbar->dma_inuse,
+                                           xbar->dma_requests);
+       mutex_unlock(&xbar->mutex);
+       if (map->xbar_out == xbar->dma_requests) {
+               dev_err(&pdev->dev, "Run out of free DMA requests\n");
+               kfree(map);
+               return ERR_PTR(-ENOMEM);
+       }
+       set_bit(map->xbar_out, xbar->dma_inuse);
+
        map->xbar_in = (u16)dma_spec->args[0];
 
        dma_spec->args[0] = map->xbar_out + xbar->dma_offset;
        if (!xbar)
                return -ENOMEM;
 
-       idr_init(&xbar->map_idr);
-
        dma_node = of_parse_phandle(node, "dma-masters", 0);
        if (!dma_node) {
                dev_err(&pdev->dev, "Can't get DMA master node\n");
        }
        of_node_put(dma_node);
 
+       xbar->dma_inuse = devm_kcalloc(&pdev->dev,
+                                      BITS_TO_LONGS(xbar->dma_requests),
+                                      sizeof(unsigned long), GFP_KERNEL);
+       if (!xbar->dma_inuse)
+               return -ENOMEM;
+
        if (of_property_read_u32(node, "dma-requests", &xbar->xbar_requests)) {
                dev_info(&pdev->dev,
                         "Missing XBAR input information, using %u.\n",
        xbar->dmarouter.route_free = ti_dra7_xbar_free;
        xbar->dma_offset = (u32)match->data;
 
+       mutex_init(&xbar->mutex);
        platform_set_drvdata(pdev, xbar);
 
        /* Reset the crossbar */