mtd: rawnand: stm32_fmc2: Use dma_request_chan() instead dma_request_slave_channel()
authorPeter Ujfalusi <peter.ujfalusi@ti.com>
Thu, 27 Feb 2020 12:37:49 +0000 (14:37 +0200)
committerMiquel Raynal <miquel.raynal@bootlin.com>
Wed, 11 Mar 2020 15:17:54 +0000 (16:17 +0100)
dma_request_slave_channel() is a wrapper on top of dma_request_chan()
eating up the error code.

Use using dma_request_chan() directly and inform user of error in case the
DMA request failed.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Link: https://lore.kernel.org/linux-mtd/20200227123749.24064-8-peter.ujfalusi@ti.com
drivers/mtd/nand/raw/stm32_fmc2_nand.c

index 3ba73f1..b6d45cd 100644 (file)
@@ -1606,15 +1606,36 @@ static int stm32_fmc2_setup_interface(struct nand_chip *chip, int chipnr,
 /* DMA configuration */
 static int stm32_fmc2_dma_setup(struct stm32_fmc2_nfc *fmc2)
 {
-       int ret;
+       int ret = 0;
 
-       fmc2->dma_tx_ch = dma_request_slave_channel(fmc2->dev, "tx");
-       fmc2->dma_rx_ch = dma_request_slave_channel(fmc2->dev, "rx");
-       fmc2->dma_ecc_ch = dma_request_slave_channel(fmc2->dev, "ecc");
+       fmc2->dma_tx_ch = dma_request_chan(fmc2->dev, "tx");
+       if (IS_ERR(fmc2->dma_tx_ch)) {
+               ret = PTR_ERR(fmc2->dma_tx_ch);
+               if (ret != -ENODEV)
+                       dev_err(fmc2->dev,
+                               "failed to request tx DMA channel: %d\n", ret);
+               fmc2->dma_tx_ch = NULL;
+               goto err_dma;
+       }
 
-       if (!fmc2->dma_tx_ch || !fmc2->dma_rx_ch || !fmc2->dma_ecc_ch) {
-               dev_warn(fmc2->dev, "DMAs not defined in the device tree, polling mode is used\n");
-               return 0;
+       fmc2->dma_rx_ch = dma_request_chan(fmc2->dev, "rx");
+       if (IS_ERR(fmc2->dma_rx_ch)) {
+               ret = PTR_ERR(fmc2->dma_rx_ch);
+               if (ret != -ENODEV)
+                       dev_err(fmc2->dev,
+                               "failed to request rx DMA channel: %d\n", ret);
+               fmc2->dma_rx_ch = NULL;
+               goto err_dma;
+       }
+
+       fmc2->dma_ecc_ch = dma_request_chan(fmc2->dev, "ecc");
+       if (IS_ERR(fmc2->dma_ecc_ch)) {
+               ret = PTR_ERR(fmc2->dma_ecc_ch);
+               if (ret != -ENODEV)
+                       dev_err(fmc2->dev,
+                               "failed to request ecc DMA channel: %d\n", ret);
+               fmc2->dma_ecc_ch = NULL;
+               goto err_dma;
        }
 
        ret = sg_alloc_table(&fmc2->dma_ecc_sg, FMC2_MAX_SG, GFP_KERNEL);
@@ -1635,6 +1656,15 @@ static int stm32_fmc2_dma_setup(struct stm32_fmc2_nfc *fmc2)
        init_completion(&fmc2->dma_ecc_complete);
 
        return 0;
+
+err_dma:
+       if (ret == -ENODEV) {
+               dev_warn(fmc2->dev,
+                        "DMAs not defined in the DT, polling mode is used\n");
+               ret = 0;
+       }
+
+       return ret;
 }
 
 /* NAND callbacks setup */