Merge branch 'stable-3.2' into pandora-3.2
[pandora-kernel.git] / arch / arm / plat-omap / dma.c
index 78f45de..96c14a3 100644 (file)
@@ -689,8 +689,8 @@ int omap_request_dma(int dev_id, const char *dev_name,
        for (ch = 0; ch < dma_chan_count; ch++) {
                if (free_ch == -1 && dma_chan[ch].dev_id == -1) {
                        free_ch = ch;
-                       if (dev_id == 0)
-                               break;
+                       /* Exit after first free channel found */
+                       break;
                }
        }
        if (free_ch == -1) {
@@ -882,11 +882,12 @@ void omap_start_dma(int lch)
                int next_lch, cur_lch;
                char dma_chan_link_map[dma_lch_count];
 
-               dma_chan_link_map[lch] = 1;
                /* Set the link register of the first channel */
                enable_lnk(lch);
 
                memset(dma_chan_link_map, 0, sizeof(dma_chan_link_map));
+               dma_chan_link_map[lch] = 1;
+
                cur_lch = dma_chan[lch].next_lch;
                do {
                        next_lch = dma_chan[cur_lch].next_lch;
@@ -2013,7 +2014,7 @@ static int __devinit omap_system_dma_probe(struct platform_device *pdev)
        errata                  = p->errata;
 
        if ((d->dev_caps & RESERVE_CHANNEL) && omap_dma_reserve_channels
-                       && (omap_dma_reserve_channels <= dma_lch_count))
+                       && (omap_dma_reserve_channels < d->lch_count))
                d->lch_count    = omap_dma_reserve_channels;
 
        dma_lch_count           = d->lch_count;
@@ -2076,6 +2077,7 @@ static int __devinit omap_system_dma_probe(struct platform_device *pdev)
                dma_irq = platform_get_irq_byname(pdev, irq_name);
                if (dma_irq < 0) {
                        dev_err(&pdev->dev, "failed: request IRQ %d", dma_irq);
+                       ret = dma_irq;
                        goto exit_dma_lch_fail;
                }
                ret = setup_irq(dma_irq, &omap24xx_dma_irq);
@@ -2106,8 +2108,6 @@ exit_dma_irq_fail:
        }
 
 exit_dma_lch_fail:
-       kfree(p);
-       kfree(d);
        kfree(dma_chan);
        return ret;
 }
@@ -2128,8 +2128,6 @@ static int __devexit omap_system_dma_remove(struct platform_device *pdev)
                        free_irq(dma_irq, (void *)(irq_rel + 1));
                }
        }
-       kfree(p);
-       kfree(d);
        kfree(dma_chan);
        return 0;
 }