]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/dma/of-dma.c
mac80211: fix typo in starting baserate for rts_cts_rate_idx
[mirror_ubuntu-bionic-kernel.git] / drivers / dma / of-dma.c
index e8fe9dc455f4d8989e6d75618fecdd7ce351647f..d5fbeaa1e7ba76f25a20b7d266a26db3c3204c38 100644 (file)
@@ -218,3 +218,38 @@ struct dma_chan *of_dma_simple_xlate(struct of_phandle_args *dma_spec,
                        &dma_spec->args[0]);
 }
 EXPORT_SYMBOL_GPL(of_dma_simple_xlate);
+
+/**
+ * of_dma_xlate_by_chan_id - Translate dt property to DMA channel by channel id
+ * @dma_spec:  pointer to DMA specifier as found in the device tree
+ * @of_dma:    pointer to DMA controller data
+ *
+ * This function can be used as the of xlate callback for DMA driver which wants
+ * to match the channel based on the channel id. When using this xlate function
+ * the #dma-cells propety of the DMA controller dt node needs to be set to 1.
+ * The data parameter of of_dma_controller_register must be a pointer to the
+ * dma_device struct the function should match upon.
+ *
+ * Returns pointer to appropriate dma channel on success or NULL on error.
+ */
+struct dma_chan *of_dma_xlate_by_chan_id(struct of_phandle_args *dma_spec,
+                                        struct of_dma *ofdma)
+{
+       struct dma_device *dev = ofdma->of_dma_data;
+       struct dma_chan *chan, *candidate = NULL;
+
+       if (!dev || dma_spec->args_count != 1)
+               return NULL;
+
+       list_for_each_entry(chan, &dev->channels, device_node)
+               if (chan->chan_id == dma_spec->args[0]) {
+                       candidate = chan;
+                       break;
+               }
+
+       if (!candidate)
+               return NULL;
+
+       return dma_get_slave_channel(candidate);
+}
+EXPORT_SYMBOL_GPL(of_dma_xlate_by_chan_id);