diff options
Diffstat (limited to 'drivers/dma')
-rw-r--r-- | drivers/dma/fsldma.c | 132 |
1 files changed, 0 insertions, 132 deletions
diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c index c0059ca58340..e9b263897c03 100644 --- a/drivers/dma/fsldma.c +++ b/drivers/dma/fsldma.c | |||
@@ -786,132 +786,6 @@ static void dma_do_tasklet(unsigned long data) | |||
786 | fsl_chan_ld_cleanup(fsl_chan); | 786 | fsl_chan_ld_cleanup(fsl_chan); |
787 | } | 787 | } |
788 | 788 | ||
789 | static void fsl_dma_callback_test(void *param) | ||
790 | { | ||
791 | struct fsl_dma_chan *fsl_chan = param; | ||
792 | if (fsl_chan) | ||
793 | dev_dbg(fsl_chan->dev, "selftest: callback is ok!\n"); | ||
794 | } | ||
795 | |||
796 | static int fsl_dma_self_test(struct fsl_dma_chan *fsl_chan) | ||
797 | { | ||
798 | struct dma_chan *chan; | ||
799 | int err = 0; | ||
800 | dma_addr_t dma_dest, dma_src; | ||
801 | dma_cookie_t cookie; | ||
802 | u8 *src, *dest; | ||
803 | int i; | ||
804 | size_t test_size; | ||
805 | struct dma_async_tx_descriptor *tx1, *tx2, *tx3; | ||
806 | |||
807 | test_size = 4096; | ||
808 | |||
809 | src = kmalloc(test_size * 2, GFP_KERNEL); | ||
810 | if (!src) { | ||
811 | dev_err(fsl_chan->dev, | ||
812 | "selftest: Cannot alloc memory for test!\n"); | ||
813 | return -ENOMEM; | ||
814 | } | ||
815 | |||
816 | dest = src + test_size; | ||
817 | |||
818 | for (i = 0; i < test_size; i++) | ||
819 | src[i] = (u8) i; | ||
820 | |||
821 | chan = &fsl_chan->common; | ||
822 | |||
823 | if (fsl_dma_alloc_chan_resources(chan, NULL) < 1) { | ||
824 | dev_err(fsl_chan->dev, | ||
825 | "selftest: Cannot alloc resources for DMA\n"); | ||
826 | err = -ENODEV; | ||
827 | goto out; | ||
828 | } | ||
829 | |||
830 | /* TX 1 */ | ||
831 | dma_src = dma_map_single(fsl_chan->dev, src, test_size / 2, | ||
832 | DMA_TO_DEVICE); | ||
833 | dma_dest = dma_map_single(fsl_chan->dev, dest, test_size / 2, | ||
834 | DMA_FROM_DEVICE); | ||
835 | tx1 = fsl_dma_prep_memcpy(chan, dma_dest, dma_src, test_size / 2, 0); | ||
836 | async_tx_ack(tx1); | ||
837 | |||
838 | cookie = fsl_dma_tx_submit(tx1); | ||
839 | fsl_dma_memcpy_issue_pending(chan); | ||
840 | msleep(2); | ||
841 | |||
842 | if (fsl_dma_is_complete(chan, cookie, NULL, NULL) != DMA_SUCCESS) { | ||
843 | dev_err(fsl_chan->dev, "selftest: Time out!\n"); | ||
844 | err = -ENODEV; | ||
845 | goto free_resources; | ||
846 | } | ||
847 | |||
848 | /* Test free and re-alloc channel resources */ | ||
849 | fsl_dma_free_chan_resources(chan); | ||
850 | |||
851 | if (fsl_dma_alloc_chan_resources(chan, NULL) < 1) { | ||
852 | dev_err(fsl_chan->dev, | ||
853 | "selftest: Cannot alloc resources for DMA\n"); | ||
854 | err = -ENODEV; | ||
855 | goto free_resources; | ||
856 | } | ||
857 | |||
858 | /* Continue to test | ||
859 | * TX 2 | ||
860 | */ | ||
861 | dma_src = dma_map_single(fsl_chan->dev, src + test_size / 2, | ||
862 | test_size / 4, DMA_TO_DEVICE); | ||
863 | dma_dest = dma_map_single(fsl_chan->dev, dest + test_size / 2, | ||
864 | test_size / 4, DMA_FROM_DEVICE); | ||
865 | tx2 = fsl_dma_prep_memcpy(chan, dma_dest, dma_src, test_size / 4, 0); | ||
866 | async_tx_ack(tx2); | ||
867 | |||
868 | /* TX 3 */ | ||
869 | dma_src = dma_map_single(fsl_chan->dev, src + test_size * 3 / 4, | ||
870 | test_size / 4, DMA_TO_DEVICE); | ||
871 | dma_dest = dma_map_single(fsl_chan->dev, dest + test_size * 3 / 4, | ||
872 | test_size / 4, DMA_FROM_DEVICE); | ||
873 | tx3 = fsl_dma_prep_memcpy(chan, dma_dest, dma_src, test_size / 4, 0); | ||
874 | async_tx_ack(tx3); | ||
875 | |||
876 | /* Interrupt tx test */ | ||
877 | tx1 = fsl_dma_prep_interrupt(chan, 0); | ||
878 | async_tx_ack(tx1); | ||
879 | cookie = fsl_dma_tx_submit(tx1); | ||
880 | |||
881 | /* Test exchanging the prepared tx sort */ | ||
882 | cookie = fsl_dma_tx_submit(tx3); | ||
883 | cookie = fsl_dma_tx_submit(tx2); | ||
884 | |||
885 | if (dma_has_cap(DMA_INTERRUPT, ((struct fsl_dma_device *) | ||
886 | dev_get_drvdata(fsl_chan->dev->parent))->common.cap_mask)) { | ||
887 | tx3->callback = fsl_dma_callback_test; | ||
888 | tx3->callback_param = fsl_chan; | ||
889 | } | ||
890 | fsl_dma_memcpy_issue_pending(chan); | ||
891 | msleep(2); | ||
892 | |||
893 | if (fsl_dma_is_complete(chan, cookie, NULL, NULL) != DMA_SUCCESS) { | ||
894 | dev_err(fsl_chan->dev, "selftest: Time out!\n"); | ||
895 | err = -ENODEV; | ||
896 | goto free_resources; | ||
897 | } | ||
898 | |||
899 | err = memcmp(src, dest, test_size); | ||
900 | if (err) { | ||
901 | for (i = 0; (*(src + i) == *(dest + i)) && (i < test_size); | ||
902 | i++); | ||
903 | dev_err(fsl_chan->dev, "selftest: Test failed, data %d/%ld is " | ||
904 | "error! src 0x%x, dest 0x%x\n", | ||
905 | i, (long)test_size, *(src + i), *(dest + i)); | ||
906 | } | ||
907 | |||
908 | free_resources: | ||
909 | fsl_dma_free_chan_resources(chan); | ||
910 | out: | ||
911 | kfree(src); | ||
912 | return err; | ||
913 | } | ||
914 | |||
915 | static int __devinit of_fsl_dma_chan_probe(struct of_device *dev, | 789 | static int __devinit of_fsl_dma_chan_probe(struct of_device *dev, |
916 | const struct of_device_id *match) | 790 | const struct of_device_id *match) |
917 | { | 791 | { |
@@ -1000,17 +874,11 @@ static int __devinit of_fsl_dma_chan_probe(struct of_device *dev, | |||
1000 | } | 874 | } |
1001 | } | 875 | } |
1002 | 876 | ||
1003 | err = fsl_dma_self_test(new_fsl_chan); | ||
1004 | if (err) | ||
1005 | goto err_self_test; | ||
1006 | |||
1007 | dev_info(&dev->dev, "#%d (%s), irq %d\n", new_fsl_chan->id, | 877 | dev_info(&dev->dev, "#%d (%s), irq %d\n", new_fsl_chan->id, |
1008 | match->compatible, new_fsl_chan->irq); | 878 | match->compatible, new_fsl_chan->irq); |
1009 | 879 | ||
1010 | return 0; | 880 | return 0; |
1011 | 881 | ||
1012 | err_self_test: | ||
1013 | free_irq(new_fsl_chan->irq, new_fsl_chan); | ||
1014 | err_no_irq: | 882 | err_no_irq: |
1015 | list_del(&new_fsl_chan->common.device_node); | 883 | list_del(&new_fsl_chan->common.device_node); |
1016 | err_no_chan: | 884 | err_no_chan: |