dmaengine: add a new helper dmaenginem_async_device_register
authorHuang Shijie <sjhuang@iluvatar.ai>
Thu, 26 Jul 2018 06:45:53 +0000 (14:45 +0800)
committerVinod Koul <vkoul@kernel.org>
Mon, 30 Jul 2018 05:20:22 +0000 (10:50 +0530)
This patch adds the dmaenginem_async_device_register for DMA code.
Use the Devres to call the release for the DMA engine driver.

Signed-off-by: Huang Shijie <sjhuang@iluvatar.ai>
Signed-off-by: Vinod Koul <vkoul@kernel.org>
Documentation/driver-model/devres.txt
drivers/dma/dmaengine.c
include/linux/dmaengine.h

index 7c1bb3d..43681ca 100644 (file)
@@ -240,6 +240,7 @@ CLOCK
   devm_of_clk_add_hw_provider()
 
 DMA
+  dmaenginem_async_device_register()
   dmam_alloc_coherent()
   dmam_alloc_attrs()
   dmam_declare_coherent_memory()
index 504420f..272bed6 100644 (file)
@@ -1141,6 +1141,41 @@ void dma_async_device_unregister(struct dma_device *device)
 }
 EXPORT_SYMBOL(dma_async_device_unregister);
 
+static void dmam_device_release(struct device *dev, void *res)
+{
+       struct dma_device *device;
+
+       device = *(struct dma_device **)res;
+       dma_async_device_unregister(device);
+}
+
+/**
+ * dmaenginem_async_device_register - registers DMA devices found
+ * @device: &dma_device
+ *
+ * The operation is managed and will be undone on driver detach.
+ */
+int dmaenginem_async_device_register(struct dma_device *device)
+{
+       void *p;
+       int ret;
+
+       p = devres_alloc(dmam_device_release, sizeof(void *), GFP_KERNEL);
+       if (!p)
+               return -ENOMEM;
+
+       ret = dma_async_device_register(device);
+       if (!ret) {
+               *(struct dma_device **)p = device;
+               devres_add(device->dev, p);
+       } else {
+               devres_free(p);
+       }
+
+       return ret;
+}
+EXPORT_SYMBOL(dmaenginem_async_device_register);
+
 struct dmaengine_unmap_pool {
        struct kmem_cache *cache;
        const char *name;
index c8c3a7a..d49ec5c 100644 (file)
@@ -1406,6 +1406,7 @@ static inline int dmaengine_desc_free(struct dma_async_tx_descriptor *desc)
 /* --- DMA device --- */
 
 int dma_async_device_register(struct dma_device *device);
+int dmaenginem_async_device_register(struct dma_device *device);
 void dma_async_device_unregister(struct dma_device *device);
 void dma_run_dependencies(struct dma_async_tx_descriptor *tx);
 struct dma_chan *dma_get_slave_channel(struct dma_chan *chan);