|
@@ -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);
|