davinci: Fix edma_alloc_channel api for EDMA_CHANNEL_ANY case
authorSudhakar Rajashekhara <sudhakar.raj@ti.com>
Wed, 6 Jan 2010 11:59:11 +0000 (17:29 +0530)
committerKevin Hilman <khilman@deeprootsystems.com>
Thu, 4 Feb 2010 21:30:01 +0000 (13:30 -0800)
Though edma_alloc_channel api was looping through the available
channel controllers in EDMA_CHANNEL_ANY case, it was never
returning the channel for 2nd channel controller, if 1st
channel controller had no free channels. This issue has
been fixed with this patch.

Signed-off-by: Sudhakar Rajashekhara <sudhakar.raj@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
arch/arm/mach-davinci/dma.c

index 97a49f98fe139b6b2142a7dae03a565893fd05c5..89a3dccde19fe57805bea5c537f21630df742498 100644 (file)
@@ -595,7 +595,7 @@ int edma_alloc_channel(int channel,
                void *data,
                enum dma_event_q eventq_no)
 {
-       unsigned i, done, ctlr = 0;
+       unsigned i, done = 0, ctlr = 0;
 
        if (channel >= 0) {
                ctlr = EDMA_CTLR(channel);
@@ -611,7 +611,7 @@ int edma_alloc_channel(int channel,
                                                edma_info[i]->num_channels,
                                                channel);
                                if (channel == edma_info[i]->num_channels)
-                                       return -ENOMEM;
+                                       break;
                                if (!test_and_set_bit(channel,
                                                edma_info[i]->edma_inuse)) {
                                        done = 1;
@@ -623,6 +623,8 @@ int edma_alloc_channel(int channel,
                        if (done)
                                break;
                }
+               if (!done)
+                       return -ENOMEM;
        } else if (channel >= edma_info[ctlr]->num_channels) {
                return -EINVAL;
        } else if (test_and_set_bit(channel, edma_info[ctlr]->edma_inuse)) {