Merge tag 'dmaengine-5.3-rc1' of git://git.infradead.org/users/vkoul/slave-dma
[sfrench/cifs-2.6.git] / drivers / dma / imx-sdma.c
index ca296f0849ef60526ee15e1587bf3f08b259e10b..a01f4b5d793c4ed591b6666110b7ed00e5bce8e6 100644 (file)
@@ -703,7 +703,7 @@ static int sdma_load_script(struct sdma_engine *sdma, void *buf, int size,
        spin_lock_irqsave(&sdma->channel_0_lock, flags);
 
        bd0->mode.command = C0_SETPM;
-       bd0->mode.status = BD_DONE | BD_INTR | BD_WRAP | BD_EXTD;
+       bd0->mode.status = BD_DONE | BD_WRAP | BD_EXTD;
        bd0->mode.count = size / 2;
        bd0->buffer_addr = buf_phys;
        bd0->ext_buffer_addr = address;
@@ -1025,7 +1025,7 @@ static int sdma_load_context(struct sdma_channel *sdmac)
        context->gReg[7] = sdmac->watermark_level;
 
        bd0->mode.command = C0_SETDM;
-       bd0->mode.status = BD_DONE | BD_INTR | BD_WRAP | BD_EXTD;
+       bd0->mode.status = BD_DONE | BD_WRAP | BD_EXTD;
        bd0->mode.count = sizeof(*context) / 4;
        bd0->buffer_addr = sdma->context_phys;
        bd0->ext_buffer_addr = 2048 + (sizeof(*context) / 4) * channel;
@@ -2091,27 +2091,6 @@ static int sdma_probe(struct platform_device *pdev)
        if (pdata && pdata->script_addrs)
                sdma_add_scripts(sdma, pdata->script_addrs);
 
-       if (pdata) {
-               ret = sdma_get_firmware(sdma, pdata->fw_name);
-               if (ret)
-                       dev_warn(&pdev->dev, "failed to get firmware from platform data\n");
-       } else {
-               /*
-                * Because that device tree does not encode ROM script address,
-                * the RAM script in firmware is mandatory for device tree
-                * probe, otherwise it fails.
-                */
-               ret = of_property_read_string(np, "fsl,sdma-ram-script-name",
-                                             &fw_name);
-               if (ret)
-                       dev_warn(&pdev->dev, "failed to get firmware name\n");
-               else {
-                       ret = sdma_get_firmware(sdma, fw_name);
-                       if (ret)
-                               dev_warn(&pdev->dev, "failed to get firmware from device tree\n");
-               }
-       }
-
        sdma->dma_device.dev = &pdev->dev;
 
        sdma->dma_device.device_alloc_chan_resources = sdma_alloc_chan_resources;
@@ -2156,6 +2135,33 @@ static int sdma_probe(struct platform_device *pdev)
                of_node_put(spba_bus);
        }
 
+       /*
+        * Kick off firmware loading as the very last step:
+        * attempt to load firmware only if we're not on the error path, because
+        * the firmware callback requires a fully functional and allocated sdma
+        * instance.
+        */
+       if (pdata) {
+               ret = sdma_get_firmware(sdma, pdata->fw_name);
+               if (ret)
+                       dev_warn(&pdev->dev, "failed to get firmware from platform data\n");
+       } else {
+               /*
+                * Because that device tree does not encode ROM script address,
+                * the RAM script in firmware is mandatory for device tree
+                * probe, otherwise it fails.
+                */
+               ret = of_property_read_string(np, "fsl,sdma-ram-script-name",
+                                             &fw_name);
+               if (ret) {
+                       dev_warn(&pdev->dev, "failed to get firmware name\n");
+               } else {
+                       ret = sdma_get_firmware(sdma, fw_name);
+                       if (ret)
+                               dev_warn(&pdev->dev, "failed to get firmware from device tree\n");
+               }
+       }
+
        return 0;
 
 err_register: