Merge remote-tracking branch 'slave-dma/next'
[karo-tx-linux.git] / drivers / dma / acpi-dma.c
index 0425743..16d0daa 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/ioport.h>
 #include <linux/acpi.h>
 #include <linux/acpi_dma.h>
+#include <linux/property.h>
 
 static LIST_HEAD(acpi_dma_list);
 static DEFINE_MUTEX(acpi_dma_lock);
@@ -412,21 +413,29 @@ EXPORT_SYMBOL_GPL(acpi_dma_request_slave_chan_by_index);
  * translate the names "tx" and "rx" here based on the most common case where
  * the first FixedDMA descriptor is TX and second is RX.
  *
+ * If the device has "dma-names" property the FixedDMA descriptor indices
+ * are retrieved based on those. Otherwise the function falls back using
+ * hardcoded indices.
+ *
  * Return:
  * Pointer to appropriate dma channel on success or an error pointer.
  */
 struct dma_chan *acpi_dma_request_slave_chan_by_name(struct device *dev,
                const char *name)
 {
-       size_t index;
-
-       if (!strcmp(name, "tx"))
-               index = 0;
-       else if (!strcmp(name, "rx"))
-               index = 1;
-       else
-               return ERR_PTR(-ENODEV);
+       int index;
+
+       index = device_property_match_string(dev, "dma-names", name);
+       if (index < 0) {
+               if (!strcmp(name, "tx"))
+                       index = 0;
+               else if (!strcmp(name, "rx"))
+                       index = 1;
+               else
+                       return ERR_PTR(-ENODEV);
+       }
 
+       dev_dbg(dev, "found DMA channel \"%s\" at index %d\n", name, index);
        return acpi_dma_request_slave_chan_by_index(dev, index);
 }
 EXPORT_SYMBOL_GPL(acpi_dma_request_slave_chan_by_name);