davinci: Fix edma_alloc_channel api for EDMA_CHANNEL_ANY case
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>
This commit is contained in:

committed by
Kevin Hilman

parent
2d51750806
commit
447f18f1b4
@@ -595,7 +595,7 @@ int edma_alloc_channel(int channel,
|
|||||||
void *data,
|
void *data,
|
||||||
enum dma_event_q eventq_no)
|
enum dma_event_q eventq_no)
|
||||||
{
|
{
|
||||||
unsigned i, done, ctlr = 0;
|
unsigned i, done = 0, ctlr = 0;
|
||||||
|
|
||||||
if (channel >= 0) {
|
if (channel >= 0) {
|
||||||
ctlr = EDMA_CTLR(channel);
|
ctlr = EDMA_CTLR(channel);
|
||||||
@@ -611,7 +611,7 @@ int edma_alloc_channel(int channel,
|
|||||||
edma_info[i]->num_channels,
|
edma_info[i]->num_channels,
|
||||||
channel);
|
channel);
|
||||||
if (channel == edma_info[i]->num_channels)
|
if (channel == edma_info[i]->num_channels)
|
||||||
return -ENOMEM;
|
break;
|
||||||
if (!test_and_set_bit(channel,
|
if (!test_and_set_bit(channel,
|
||||||
edma_info[i]->edma_inuse)) {
|
edma_info[i]->edma_inuse)) {
|
||||||
done = 1;
|
done = 1;
|
||||||
@@ -623,6 +623,8 @@ int edma_alloc_channel(int channel,
|
|||||||
if (done)
|
if (done)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (!done)
|
||||||
|
return -ENOMEM;
|
||||||
} else if (channel >= edma_info[ctlr]->num_channels) {
|
} else if (channel >= edma_info[ctlr]->num_channels) {
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
} else if (test_and_set_bit(channel, edma_info[ctlr]->edma_inuse)) {
|
} else if (test_and_set_bit(channel, edma_info[ctlr]->edma_inuse)) {
|
||||||
|
Reference in New Issue
Block a user