diff options
author | Mauro Carvalho Chehab <mchehab@infradead.org> | 2008-07-24 13:05:50 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2008-07-24 13:05:50 -0400 |
commit | 698158c799c7961824ccdb773250e16c0dd5d9e4 (patch) | |
tree | 96f034be9e9a95e6f68b5d20d1a3df7a3cbf724a /drivers/dma/fsldma.c | |
parent | 4c7827eec78abe6fe68fd29305806467f2a51e63 (diff) | |
parent | 338b9bb3adac0d2c5a1e180491d9b001d624c402 (diff) |
Merge ../linux-2.6
Diffstat (limited to 'drivers/dma/fsldma.c')
-rw-r--r-- | drivers/dma/fsldma.c | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c index 054eabffc185..c0059ca58340 100644 --- a/drivers/dma/fsldma.c +++ b/drivers/dma/fsldma.c | |||
@@ -366,7 +366,8 @@ static struct fsl_desc_sw *fsl_dma_alloc_descriptor( | |||
366 | * | 366 | * |
367 | * Return - The number of descriptors allocated. | 367 | * Return - The number of descriptors allocated. |
368 | */ | 368 | */ |
369 | static int fsl_dma_alloc_chan_resources(struct dma_chan *chan) | 369 | static int fsl_dma_alloc_chan_resources(struct dma_chan *chan, |
370 | struct dma_client *client) | ||
370 | { | 371 | { |
371 | struct fsl_dma_chan *fsl_chan = to_fsl_chan(chan); | 372 | struct fsl_dma_chan *fsl_chan = to_fsl_chan(chan); |
372 | LIST_HEAD(tmp_list); | 373 | LIST_HEAD(tmp_list); |
@@ -809,8 +810,7 @@ static int fsl_dma_self_test(struct fsl_dma_chan *fsl_chan) | |||
809 | if (!src) { | 810 | if (!src) { |
810 | dev_err(fsl_chan->dev, | 811 | dev_err(fsl_chan->dev, |
811 | "selftest: Cannot alloc memory for test!\n"); | 812 | "selftest: Cannot alloc memory for test!\n"); |
812 | err = -ENOMEM; | 813 | return -ENOMEM; |
813 | goto out; | ||
814 | } | 814 | } |
815 | 815 | ||
816 | dest = src + test_size; | 816 | dest = src + test_size; |
@@ -820,7 +820,7 @@ static int fsl_dma_self_test(struct fsl_dma_chan *fsl_chan) | |||
820 | 820 | ||
821 | chan = &fsl_chan->common; | 821 | chan = &fsl_chan->common; |
822 | 822 | ||
823 | if (fsl_dma_alloc_chan_resources(chan) < 1) { | 823 | if (fsl_dma_alloc_chan_resources(chan, NULL) < 1) { |
824 | dev_err(fsl_chan->dev, | 824 | dev_err(fsl_chan->dev, |
825 | "selftest: Cannot alloc resources for DMA\n"); | 825 | "selftest: Cannot alloc resources for DMA\n"); |
826 | err = -ENODEV; | 826 | err = -ENODEV; |
@@ -842,13 +842,13 @@ static int fsl_dma_self_test(struct fsl_dma_chan *fsl_chan) | |||
842 | if (fsl_dma_is_complete(chan, cookie, NULL, NULL) != DMA_SUCCESS) { | 842 | if (fsl_dma_is_complete(chan, cookie, NULL, NULL) != DMA_SUCCESS) { |
843 | dev_err(fsl_chan->dev, "selftest: Time out!\n"); | 843 | dev_err(fsl_chan->dev, "selftest: Time out!\n"); |
844 | err = -ENODEV; | 844 | err = -ENODEV; |
845 | goto out; | 845 | goto free_resources; |
846 | } | 846 | } |
847 | 847 | ||
848 | /* Test free and re-alloc channel resources */ | 848 | /* Test free and re-alloc channel resources */ |
849 | fsl_dma_free_chan_resources(chan); | 849 | fsl_dma_free_chan_resources(chan); |
850 | 850 | ||
851 | if (fsl_dma_alloc_chan_resources(chan) < 1) { | 851 | if (fsl_dma_alloc_chan_resources(chan, NULL) < 1) { |
852 | dev_err(fsl_chan->dev, | 852 | dev_err(fsl_chan->dev, |
853 | "selftest: Cannot alloc resources for DMA\n"); | 853 | "selftest: Cannot alloc resources for DMA\n"); |
854 | err = -ENODEV; | 854 | err = -ENODEV; |
@@ -927,8 +927,7 @@ static int __devinit of_fsl_dma_chan_probe(struct of_device *dev, | |||
927 | if (!new_fsl_chan) { | 927 | if (!new_fsl_chan) { |
928 | dev_err(&dev->dev, "No free memory for allocating " | 928 | dev_err(&dev->dev, "No free memory for allocating " |
929 | "dma channels!\n"); | 929 | "dma channels!\n"); |
930 | err = -ENOMEM; | 930 | return -ENOMEM; |
931 | goto err; | ||
932 | } | 931 | } |
933 | 932 | ||
934 | /* get dma channel register base */ | 933 | /* get dma channel register base */ |
@@ -936,7 +935,7 @@ static int __devinit of_fsl_dma_chan_probe(struct of_device *dev, | |||
936 | if (err) { | 935 | if (err) { |
937 | dev_err(&dev->dev, "Can't get %s property 'reg'\n", | 936 | dev_err(&dev->dev, "Can't get %s property 'reg'\n", |
938 | dev->node->full_name); | 937 | dev->node->full_name); |
939 | goto err; | 938 | goto err_no_reg; |
940 | } | 939 | } |
941 | 940 | ||
942 | new_fsl_chan->feature = *(u32 *)match->data; | 941 | new_fsl_chan->feature = *(u32 *)match->data; |
@@ -958,7 +957,7 @@ static int __devinit of_fsl_dma_chan_probe(struct of_device *dev, | |||
958 | dev_err(&dev->dev, "There is no %d channel!\n", | 957 | dev_err(&dev->dev, "There is no %d channel!\n", |
959 | new_fsl_chan->id); | 958 | new_fsl_chan->id); |
960 | err = -EINVAL; | 959 | err = -EINVAL; |
961 | goto err; | 960 | goto err_no_chan; |
962 | } | 961 | } |
963 | fdev->chan[new_fsl_chan->id] = new_fsl_chan; | 962 | fdev->chan[new_fsl_chan->id] = new_fsl_chan; |
964 | tasklet_init(&new_fsl_chan->tasklet, dma_do_tasklet, | 963 | tasklet_init(&new_fsl_chan->tasklet, dma_do_tasklet, |
@@ -997,23 +996,26 @@ static int __devinit of_fsl_dma_chan_probe(struct of_device *dev, | |||
997 | if (err) { | 996 | if (err) { |
998 | dev_err(&dev->dev, "DMA channel %s request_irq error " | 997 | dev_err(&dev->dev, "DMA channel %s request_irq error " |
999 | "with return %d\n", dev->node->full_name, err); | 998 | "with return %d\n", dev->node->full_name, err); |
1000 | goto err; | 999 | goto err_no_irq; |
1001 | } | 1000 | } |
1002 | } | 1001 | } |
1003 | 1002 | ||
1004 | err = fsl_dma_self_test(new_fsl_chan); | 1003 | err = fsl_dma_self_test(new_fsl_chan); |
1005 | if (err) | 1004 | if (err) |
1006 | goto err; | 1005 | goto err_self_test; |
1007 | 1006 | ||
1008 | dev_info(&dev->dev, "#%d (%s), irq %d\n", new_fsl_chan->id, | 1007 | dev_info(&dev->dev, "#%d (%s), irq %d\n", new_fsl_chan->id, |
1009 | match->compatible, new_fsl_chan->irq); | 1008 | match->compatible, new_fsl_chan->irq); |
1010 | 1009 | ||
1011 | return 0; | 1010 | return 0; |
1012 | err: | 1011 | |
1013 | dma_halt(new_fsl_chan); | 1012 | err_self_test: |
1014 | iounmap(new_fsl_chan->reg_base); | ||
1015 | free_irq(new_fsl_chan->irq, new_fsl_chan); | 1013 | free_irq(new_fsl_chan->irq, new_fsl_chan); |
1014 | err_no_irq: | ||
1016 | list_del(&new_fsl_chan->common.device_node); | 1015 | list_del(&new_fsl_chan->common.device_node); |
1016 | err_no_chan: | ||
1017 | iounmap(new_fsl_chan->reg_base); | ||
1018 | err_no_reg: | ||
1017 | kfree(new_fsl_chan); | 1019 | kfree(new_fsl_chan); |
1018 | return err; | 1020 | return err; |
1019 | } | 1021 | } |
@@ -1054,8 +1056,7 @@ static int __devinit of_fsl_dma_probe(struct of_device *dev, | |||
1054 | fdev = kzalloc(sizeof(struct fsl_dma_device), GFP_KERNEL); | 1056 | fdev = kzalloc(sizeof(struct fsl_dma_device), GFP_KERNEL); |
1055 | if (!fdev) { | 1057 | if (!fdev) { |
1056 | dev_err(&dev->dev, "No enough memory for 'priv'\n"); | 1058 | dev_err(&dev->dev, "No enough memory for 'priv'\n"); |
1057 | err = -ENOMEM; | 1059 | return -ENOMEM; |
1058 | goto err; | ||
1059 | } | 1060 | } |
1060 | fdev->dev = &dev->dev; | 1061 | fdev->dev = &dev->dev; |
1061 | INIT_LIST_HEAD(&fdev->common.channels); | 1062 | INIT_LIST_HEAD(&fdev->common.channels); |
@@ -1065,7 +1066,7 @@ static int __devinit of_fsl_dma_probe(struct of_device *dev, | |||
1065 | if (err) { | 1066 | if (err) { |
1066 | dev_err(&dev->dev, "Can't get %s property 'reg'\n", | 1067 | dev_err(&dev->dev, "Can't get %s property 'reg'\n", |
1067 | dev->node->full_name); | 1068 | dev->node->full_name); |
1068 | goto err; | 1069 | goto err_no_reg; |
1069 | } | 1070 | } |
1070 | 1071 | ||
1071 | dev_info(&dev->dev, "Probe the Freescale DMA driver for %s " | 1072 | dev_info(&dev->dev, "Probe the Freescale DMA driver for %s " |
@@ -1103,6 +1104,7 @@ static int __devinit of_fsl_dma_probe(struct of_device *dev, | |||
1103 | 1104 | ||
1104 | err: | 1105 | err: |
1105 | iounmap(fdev->reg_base); | 1106 | iounmap(fdev->reg_base); |
1107 | err_no_reg: | ||
1106 | kfree(fdev); | 1108 | kfree(fdev); |
1107 | return err; | 1109 | return err; |
1108 | } | 1110 | } |