]> nv-tegra.nvidia Code Review - linux-2.6.git/blobdiff - arch/arm/plat-omap/dma.c
Merge branch '7xx-iosplit-plat' with omap-fixes
[linux-2.6.git] / arch / arm / plat-omap / dma.c
index b53125f412931c6e535df1e111cc293ae067a6b0..3edffde7f439872ee6cd486b870625392a7af4c5 100644 (file)
@@ -32,9 +32,9 @@
 
 #include <asm/system.h>
 #include <mach/hardware.h>
-#include <mach/dma.h>
+#include <plat/dma.h>
 
-#include <mach/tc.h>
+#include <plat/tc.h>
 
 #undef DEBUG
 
@@ -2345,40 +2345,46 @@ EXPORT_SYMBOL(omap_stop_lcd_dma);
 
 static int __init omap_init_dma(void)
 {
+       unsigned long base;
        int ch, r;
 
        if (cpu_class_is_omap1()) {
-               omap_dma_base = OMAP1_IO_ADDRESS(OMAP1_DMA_BASE);
+               base = OMAP1_DMA_BASE;
                dma_lch_count = OMAP1_LOGICAL_DMA_CH_COUNT;
        } else if (cpu_is_omap24xx()) {
-               omap_dma_base = OMAP2_IO_ADDRESS(OMAP24XX_DMA4_BASE);
+               base = OMAP24XX_DMA4_BASE;
                dma_lch_count = OMAP_DMA4_LOGICAL_DMA_CH_COUNT;
        } else if (cpu_is_omap34xx()) {
-               omap_dma_base = OMAP2_IO_ADDRESS(OMAP34XX_DMA4_BASE);
+               base = OMAP34XX_DMA4_BASE;
                dma_lch_count = OMAP_DMA4_LOGICAL_DMA_CH_COUNT;
        } else if (cpu_is_omap44xx()) {
-               omap_dma_base = OMAP2_IO_ADDRESS(OMAP44XX_DMA4_BASE);
+               base = OMAP44XX_DMA4_BASE;
                dma_lch_count = OMAP_DMA4_LOGICAL_DMA_CH_COUNT;
        } else {
                pr_err("DMA init failed for unsupported omap\n");
                return -ENODEV;
        }
 
+       omap_dma_base = ioremap(base, SZ_4K);
+       BUG_ON(!omap_dma_base);
+
        if (cpu_class_is_omap2() && omap_dma_reserve_channels
                        && (omap_dma_reserve_channels <= dma_lch_count))
                dma_lch_count = omap_dma_reserve_channels;
 
        dma_chan = kzalloc(sizeof(struct omap_dma_lch) * dma_lch_count,
                                GFP_KERNEL);
-       if (!dma_chan)
-               return -ENOMEM;
+       if (!dma_chan) {
+               r = -ENOMEM;
+               goto out_unmap;
+       }
 
        if (cpu_class_is_omap2()) {
                dma_linked_lch = kzalloc(sizeof(struct dma_link_info) *
                                                dma_lch_count, GFP_KERNEL);
                if (!dma_linked_lch) {
-                       kfree(dma_chan);
-                       return -ENOMEM;
+                       r = -ENOMEM;
+                       goto out_free;
                }
        }
 
@@ -2452,7 +2458,7 @@ static int __init omap_init_dma(void)
                                for (i = 0; i < ch; i++)
                                        free_irq(omap1_dma_irq[i],
                                                 (void *) (i + 1));
-                               return r;
+                               goto out_free;
                        }
                }
        }
@@ -2494,11 +2500,19 @@ static int __init omap_init_dma(void)
                               "(error %d)\n", r);
                        for (i = 0; i < dma_chan_count; i++)
                                free_irq(omap1_dma_irq[i], (void *) (i + 1));
-                       return r;
+                       goto out_free;
                }
        }
 
        return 0;
+
+out_free:
+       kfree(dma_chan);
+
+out_unmap:
+       iounmap(omap_dma_base);
+
+       return r;
 }
 
 arch_initcall(omap_init_dma);