dmaengine: Add matching device node validation in __dma_request_channel()
[platform/kernel/linux-rpi.git] / drivers / dma / dmaengine.c
index 3a11b10..610080c 100644 (file)
@@ -641,11 +641,13 @@ EXPORT_SYMBOL_GPL(dma_get_any_slave_channel);
  * @mask: capabilities that the channel must satisfy
  * @fn: optional callback to disposition available channels
  * @fn_param: opaque parameter to pass to dma_filter_fn
+ * @np: device node to look for DMA channels
  *
  * Returns pointer to appropriate DMA channel on success or NULL.
  */
 struct dma_chan *__dma_request_channel(const dma_cap_mask_t *mask,
-                                      dma_filter_fn fn, void *fn_param)
+                                      dma_filter_fn fn, void *fn_param,
+                                      struct device_node *np)
 {
        struct dma_device *device, *_d;
        struct dma_chan *chan = NULL;
@@ -653,6 +655,10 @@ struct dma_chan *__dma_request_channel(const dma_cap_mask_t *mask,
        /* Find a channel */
        mutex_lock(&dma_list_mutex);
        list_for_each_entry_safe(device, _d, &dma_device_list, global_node) {
+               /* Finds a DMA controller with matching device node */
+               if (np && device->dev->of_node && np != device->dev->of_node)
+                       continue;
+
                chan = find_candidate(device, mask, fn, fn_param);
                if (!IS_ERR(chan))
                        break;
@@ -769,7 +775,7 @@ struct dma_chan *dma_request_chan_by_mask(const dma_cap_mask_t *mask)
        if (!mask)
                return ERR_PTR(-ENODEV);
 
-       chan = __dma_request_channel(mask, NULL, NULL);
+       chan = __dma_request_channel(mask, NULL, NULL, NULL);
        if (!chan) {
                mutex_lock(&dma_list_mutex);
                if (list_empty(&dma_device_list))