]> git.sur5r.net Git - u-boot/commitdiff
nand: mxs: fix error handling for mxs_nand_init
authorPeng Fan <van.freenix@gmail.com>
Wed, 27 Jan 2016 02:38:02 +0000 (10:38 +0800)
committerScott Wood <scottwood@freescale.com>
Fri, 12 Feb 2016 23:10:15 +0000 (17:10 -0600)
Fix error handling for mxs_nand_init.

The original error handling is wrong for err2 and err1.
Should first free desc[x], then free desc.

This patch also correctly handle err3, should use
MXS_DMA_CHANNEL_AHB_APBH_GPMI0 as the check point.

Cc: Stefano Babic <sbabic@denx.de>
CC: Fabio Estevam <Fabio.Estevam@freescale.com>
Cc: Scott Wood <scottwood@freescale.com>
Cc: Marek Vasut <marex@denx.de>
Signed-off-by: Peng Fan <van.freenix@gmail.com>
Reviewed-by: Marek Vasut <marex@denx.de>
drivers/mtd/nand/mxs_nand.c

index ba019a07638917c4578059057a571d04de9174fd..b5bbd889ffc711df89ec453b3a5bac2324595da2 100644 (file)
@@ -1090,24 +1090,29 @@ int mxs_nand_init(struct mxs_nand_info *info)
                (struct mxs_gpmi_regs *)MXS_GPMI_BASE;
        struct mxs_bch_regs *bch_regs =
                (struct mxs_bch_regs *)MXS_BCH_BASE;
-       int i = 0, j;
+       int i = 0, j, ret = 0;
 
        info->desc = malloc(sizeof(struct mxs_dma_desc *) *
                                MXS_NAND_DMA_DESCRIPTOR_COUNT);
-       if (!info->desc)
+       if (!info->desc) {
+               ret = -ENOMEM;
                goto err1;
+       }
 
        /* Allocate the DMA descriptors. */
        for (i = 0; i < MXS_NAND_DMA_DESCRIPTOR_COUNT; i++) {
                info->desc[i] = mxs_dma_desc_alloc();
-               if (!info->desc[i])
+               if (!info->desc[i]) {
+                       ret = -ENOMEM;
                        goto err2;
+               }
        }
 
        /* Init the DMA controller. */
        for (j = MXS_DMA_CHANNEL_AHB_APBH_GPMI0;
                j <= MXS_DMA_CHANNEL_AHB_APBH_GPMI7; j++) {
-               if (mxs_dma_init_channel(j))
+               ret = mxs_dma_init_channel(j);
+               if (ret)
                        goto err3;
        }
 
@@ -1127,15 +1132,16 @@ int mxs_nand_init(struct mxs_nand_info *info)
        return 0;
 
 err3:
-       for (--j; j >= 0; j--)
+       for (--j; j >= MXS_DMA_CHANNEL_AHB_APBH_GPMI0; j--)
                mxs_dma_release(j);
 err2:
-       free(info->desc);
-err1:
        for (--i; i >= 0; i--)
                mxs_dma_desc_free(info->desc[i]);
-       printf("MXS NAND: Unable to allocate DMA descriptors\n");
-       return -ENOMEM;
+       free(info->desc);
+err1:
+       if (ret == -ENOMEM)
+               printf("MXS NAND: Unable to allocate DMA descriptors\n");
+       return ret;
 }
 
 /*!