Commit 51ee87f27a1d2c0e08492924f2fb0223c4c704d9

Authored by Li Yang
Committed by Dan Williams
1 parent 0a2ce2ffc3

fsldma: fix incorrect exit path for initialization

Signed-off-by: Li Yang <leoli@freescale.com>
Acked-by: Zhang Wei <zw@zh-kernel.org>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>

Showing 1 changed file with 16 additions and 15 deletions Side-by-side Diff

drivers/dma/fsldma.c
... ... @@ -809,8 +809,7 @@
809 809 if (!src) {
810 810 dev_err(fsl_chan->dev,
811 811 "selftest: Cannot alloc memory for test!\n");
812   - err = -ENOMEM;
813   - goto out;
  812 + return -ENOMEM;
814 813 }
815 814  
816 815 dest = src + test_size;
... ... @@ -842,7 +841,7 @@
842 841 if (fsl_dma_is_complete(chan, cookie, NULL, NULL) != DMA_SUCCESS) {
843 842 dev_err(fsl_chan->dev, "selftest: Time out!\n");
844 843 err = -ENODEV;
845   - goto out;
  844 + goto free_resources;
846 845 }
847 846  
848 847 /* Test free and re-alloc channel resources */
... ... @@ -927,8 +926,7 @@
927 926 if (!new_fsl_chan) {
928 927 dev_err(&dev->dev, "No free memory for allocating "
929 928 "dma channels!\n");
930   - err = -ENOMEM;
931   - goto err;
  929 + return -ENOMEM;
932 930 }
933 931  
934 932 /* get dma channel register base */
... ... @@ -936,7 +934,7 @@
936 934 if (err) {
937 935 dev_err(&dev->dev, "Can't get %s property 'reg'\n",
938 936 dev->node->full_name);
939   - goto err;
  937 + goto err_no_reg;
940 938 }
941 939  
942 940 new_fsl_chan->feature = *(u32 *)match->data;
... ... @@ -958,7 +956,7 @@
958 956 dev_err(&dev->dev, "There is no %d channel!\n",
959 957 new_fsl_chan->id);
960 958 err = -EINVAL;
961   - goto err;
  959 + goto err_no_chan;
962 960 }
963 961 fdev->chan[new_fsl_chan->id] = new_fsl_chan;
964 962 tasklet_init(&new_fsl_chan->tasklet, dma_do_tasklet,
965 963  
966 964  
967 965  
968 966  
... ... @@ -997,23 +995,26 @@
997 995 if (err) {
998 996 dev_err(&dev->dev, "DMA channel %s request_irq error "
999 997 "with return %d\n", dev->node->full_name, err);
1000   - goto err;
  998 + goto err_no_irq;
1001 999 }
1002 1000 }
1003 1001  
1004 1002 err = fsl_dma_self_test(new_fsl_chan);
1005 1003 if (err)
1006   - goto err;
  1004 + goto err_self_test;
1007 1005  
1008 1006 dev_info(&dev->dev, "#%d (%s), irq %d\n", new_fsl_chan->id,
1009 1007 match->compatible, new_fsl_chan->irq);
1010 1008  
1011 1009 return 0;
1012   -err:
1013   - dma_halt(new_fsl_chan);
1014   - iounmap(new_fsl_chan->reg_base);
  1010 +
  1011 +err_self_test:
1015 1012 free_irq(new_fsl_chan->irq, new_fsl_chan);
  1013 +err_no_irq:
1016 1014 list_del(&new_fsl_chan->common.device_node);
  1015 +err_no_chan:
  1016 + iounmap(new_fsl_chan->reg_base);
  1017 +err_no_reg:
1017 1018 kfree(new_fsl_chan);
1018 1019 return err;
1019 1020 }
... ... @@ -1054,8 +1055,7 @@
1054 1055 fdev = kzalloc(sizeof(struct fsl_dma_device), GFP_KERNEL);
1055 1056 if (!fdev) {
1056 1057 dev_err(&dev->dev, "No enough memory for 'priv'\n");
1057   - err = -ENOMEM;
1058   - goto err;
  1058 + return -ENOMEM;
1059 1059 }
1060 1060 fdev->dev = &dev->dev;
1061 1061 INIT_LIST_HEAD(&fdev->common.channels);
... ... @@ -1065,7 +1065,7 @@
1065 1065 if (err) {
1066 1066 dev_err(&dev->dev, "Can't get %s property 'reg'\n",
1067 1067 dev->node->full_name);
1068   - goto err;
  1068 + goto err_no_reg;
1069 1069 }
1070 1070  
1071 1071 dev_info(&dev->dev, "Probe the Freescale DMA driver for %s "
... ... @@ -1103,6 +1103,7 @@
1103 1103  
1104 1104 err:
1105 1105 iounmap(fdev->reg_base);
  1106 +err_no_reg:
1106 1107 kfree(fdev);
1107 1108 return err;
1108 1109 }