Merge tag 'zonefs-6.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal...
[sfrench/cifs-2.6.git] / drivers / dma / fsl-qdma.c
index f405c77060ad8b3508e7c75bee09968e1ae9bc78..5005e138fc239bf23a8a888c90e5ad720f697d3d 100644 (file)
 #define FSL_QDMA_CMD_WTHROTL_OFFSET    20
 #define FSL_QDMA_CMD_DSEN_OFFSET       19
 #define FSL_QDMA_CMD_LWC_OFFSET                16
+#define FSL_QDMA_CMD_PF                        BIT(17)
 
 /* Field definition for Descriptor status */
 #define QDMA_CCDF_STATUS_RTE           BIT(5)
@@ -160,6 +161,10 @@ struct fsl_qdma_format {
                        u8 __reserved1[2];
                        u8 cfg8b_w1;
                } __packed;
+               struct {
+                       __le32 __reserved2;
+                       __le32 cmd;
+               } __packed;
                __le64 data;
        };
 } __packed;
@@ -354,7 +359,6 @@ static void fsl_qdma_free_chan_resources(struct dma_chan *chan)
 static void fsl_qdma_comp_fill_memcpy(struct fsl_qdma_comp *fsl_comp,
                                      dma_addr_t dst, dma_addr_t src, u32 len)
 {
-       u32 cmd;
        struct fsl_qdma_format *sdf, *ddf;
        struct fsl_qdma_format *ccdf, *csgf_desc, *csgf_src, *csgf_dest;
 
@@ -383,14 +387,11 @@ static void fsl_qdma_comp_fill_memcpy(struct fsl_qdma_comp *fsl_comp,
        /* This entry is the last entry. */
        qdma_csgf_set_f(csgf_dest, len);
        /* Descriptor Buffer */
-       cmd = cpu_to_le32(FSL_QDMA_CMD_RWTTYPE <<
-                         FSL_QDMA_CMD_RWTTYPE_OFFSET);
-       sdf->data = QDMA_SDDF_CMD(cmd);
-
-       cmd = cpu_to_le32(FSL_QDMA_CMD_RWTTYPE <<
-                         FSL_QDMA_CMD_RWTTYPE_OFFSET);
-       cmd |= cpu_to_le32(FSL_QDMA_CMD_LWC << FSL_QDMA_CMD_LWC_OFFSET);
-       ddf->data = QDMA_SDDF_CMD(cmd);
+       sdf->cmd = cpu_to_le32((FSL_QDMA_CMD_RWTTYPE << FSL_QDMA_CMD_RWTTYPE_OFFSET) |
+                              FSL_QDMA_CMD_PF);
+
+       ddf->cmd = cpu_to_le32((FSL_QDMA_CMD_RWTTYPE << FSL_QDMA_CMD_RWTTYPE_OFFSET) |
+                              (FSL_QDMA_CMD_LWC << FSL_QDMA_CMD_LWC_OFFSET));
 }
 
 /*
@@ -624,7 +625,7 @@ static int fsl_qdma_halt(struct fsl_qdma_engine *fsl_qdma)
 
 static int
 fsl_qdma_queue_transfer_complete(struct fsl_qdma_engine *fsl_qdma,
-                                void *block,
+                                __iomem void *block,
                                 int id)
 {
        bool duplicate;
@@ -1196,10 +1197,6 @@ static int fsl_qdma_probe(struct platform_device *pdev)
        if (!fsl_qdma->queue)
                return -ENOMEM;
 
-       ret = fsl_qdma_irq_init(pdev, fsl_qdma);
-       if (ret)
-               return ret;
-
        fsl_qdma->irq_base = platform_get_irq_byname(pdev, "qdma-queue0");
        if (fsl_qdma->irq_base < 0)
                return fsl_qdma->irq_base;
@@ -1238,16 +1235,19 @@ static int fsl_qdma_probe(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, fsl_qdma);
 
-       ret = dma_async_device_register(&fsl_qdma->dma_dev);
+       ret = fsl_qdma_reg_init(fsl_qdma);
        if (ret) {
-               dev_err(&pdev->dev,
-                       "Can't register NXP Layerscape qDMA engine.\n");
+               dev_err(&pdev->dev, "Can't Initialize the qDMA engine.\n");
                return ret;
        }
 
-       ret = fsl_qdma_reg_init(fsl_qdma);
+       ret = fsl_qdma_irq_init(pdev, fsl_qdma);
+       if (ret)
+               return ret;
+
+       ret = dma_async_device_register(&fsl_qdma->dma_dev);
        if (ret) {
-               dev_err(&pdev->dev, "Can't Initialize the qDMA engine.\n");
+               dev_err(&pdev->dev, "Can't register NXP Layerscape qDMA engine.\n");
                return ret;
        }