]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/blobdiff - drivers/dma/dmaengine.c
Merge tag 'dmaengine-5.3-rc1' of git://git.infradead.org/users/vkoul/slave-dma
[mirror_ubuntu-focal-kernel.git] / drivers / dma / dmaengine.c
index 58cbf9fd5a46c33c4ab946da34b0b382cb735cf9..03ac4b96117cd8dbf423998c6fa3059cdb532dfa 100644 (file)
@@ -61,7 +61,7 @@ static long dmaengine_ref_count;
 /* --- sysfs implementation --- */
 
 /**
- * dev_to_dma_chan - convert a device pointer to the its sysfs container object
+ * dev_to_dma_chan - convert a device pointer to its sysfs container object
  * @dev - device node
  *
  * Must be called under dma_list_mutex
@@ -629,11 +629,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;
@@ -641,6 +643,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;
@@ -699,7 +705,7 @@ struct dma_chan *dma_request_chan(struct device *dev, const char *name)
                chan = acpi_dma_request_slave_chan_by_name(dev, name);
 
        if (chan) {
-               /* Valid channel found or requester need to be deferred */
+               /* Valid channel found or requester needs to be deferred */
                if (!IS_ERR(chan) || PTR_ERR(chan) == -EPROBE_DEFER)
                        return chan;
        }
@@ -757,7 +763,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))