dmaengine: Simplify dma_async_device_register()
authorYajun Deng <yajun.deng@linux.dev>
Tue, 15 Aug 2023 07:23:46 +0000 (15:23 +0800)
committerVinod Koul <vkoul@kernel.org>
Mon, 21 Aug 2023 13:06:46 +0000 (18:36 +0530)
There are a lot of duplicate codes for checking if the dma has some
capability.

Define a temporary macro that is used to check if the dma claims some
capability and if the corresponding function is implemented.

Signed-off-by: Yajun Deng <yajun.deng@linux.dev>
Reviewed-by: Dave Jiang <dave.jiang@intel.com>
Link: https://lore.kernel.org/r/20230815072346.2798927-1-yajun.deng@linux.dev
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/dmaengine.c

index 826b982..b7388ae 100644 (file)
@@ -1147,69 +1147,27 @@ int dma_async_device_register(struct dma_device *device)
 
        device->owner = device->dev->driver->owner;
 
-       if (dma_has_cap(DMA_MEMCPY, device->cap_mask) && !device->device_prep_dma_memcpy) {
-               dev_err(device->dev,
-                       "Device claims capability %s, but op is not defined\n",
-                       "DMA_MEMCPY");
-               return -EIO;
-       }
-
-       if (dma_has_cap(DMA_XOR, device->cap_mask) && !device->device_prep_dma_xor) {
-               dev_err(device->dev,
-                       "Device claims capability %s, but op is not defined\n",
-                       "DMA_XOR");
-               return -EIO;
-       }
-
-       if (dma_has_cap(DMA_XOR_VAL, device->cap_mask) && !device->device_prep_dma_xor_val) {
-               dev_err(device->dev,
-                       "Device claims capability %s, but op is not defined\n",
-                       "DMA_XOR_VAL");
-               return -EIO;
-       }
-
-       if (dma_has_cap(DMA_PQ, device->cap_mask) && !device->device_prep_dma_pq) {
-               dev_err(device->dev,
-                       "Device claims capability %s, but op is not defined\n",
-                       "DMA_PQ");
-               return -EIO;
-       }
-
-       if (dma_has_cap(DMA_PQ_VAL, device->cap_mask) && !device->device_prep_dma_pq_val) {
-               dev_err(device->dev,
-                       "Device claims capability %s, but op is not defined\n",
-                       "DMA_PQ_VAL");
-               return -EIO;
-       }
-
-       if (dma_has_cap(DMA_MEMSET, device->cap_mask) && !device->device_prep_dma_memset) {
-               dev_err(device->dev,
-                       "Device claims capability %s, but op is not defined\n",
-                       "DMA_MEMSET");
-               return -EIO;
-       }
-
-       if (dma_has_cap(DMA_INTERRUPT, device->cap_mask) && !device->device_prep_dma_interrupt) {
-               dev_err(device->dev,
-                       "Device claims capability %s, but op is not defined\n",
-                       "DMA_INTERRUPT");
-               return -EIO;
-       }
-
-       if (dma_has_cap(DMA_CYCLIC, device->cap_mask) && !device->device_prep_dma_cyclic) {
-               dev_err(device->dev,
-                       "Device claims capability %s, but op is not defined\n",
-                       "DMA_CYCLIC");
-               return -EIO;
-       }
-
-       if (dma_has_cap(DMA_INTERLEAVE, device->cap_mask) && !device->device_prep_interleaved_dma) {
-               dev_err(device->dev,
-                       "Device claims capability %s, but op is not defined\n",
-                       "DMA_INTERLEAVE");
-               return -EIO;
-       }
+#define CHECK_CAP(_name, _type)                                                                \
+{                                                                                      \
+       if (dma_has_cap(_type, device->cap_mask) && !device->device_prep_##_name) {     \
+               dev_err(device->dev,                                                    \
+                       "Device claims capability %s, but op is not defined\n",         \
+                       __stringify(_type));                                            \
+               return -EIO;                                                            \
+       }                                                                               \
+}
 
+       CHECK_CAP(dma_memcpy,      DMA_MEMCPY);
+       CHECK_CAP(dma_xor,         DMA_XOR);
+       CHECK_CAP(dma_xor_val,     DMA_XOR_VAL);
+       CHECK_CAP(dma_pq,          DMA_PQ);
+       CHECK_CAP(dma_pq_val,      DMA_PQ_VAL);
+       CHECK_CAP(dma_memset,      DMA_MEMSET);
+       CHECK_CAP(dma_interrupt,   DMA_INTERRUPT);
+       CHECK_CAP(dma_cyclic,      DMA_CYCLIC);
+       CHECK_CAP(interleaved_dma, DMA_INTERLEAVE);
+
+#undef CHECK_CAP
 
        if (!device->device_tx_status) {
                dev_err(device->dev, "Device tx_status is not defined\n");