diff options
| author | Peter Ujfalusi <peter.ujfalusi@ti.com> | 2014-07-08 06:46:37 -0400 |
|---|---|---|
| committer | Vinod Koul <vinod.koul@intel.com> | 2014-07-28 07:33:13 -0400 |
| commit | eb3fe7def66511120766c8fc05ee9631cce7fe6f (patch) | |
| tree | e6e1cf360c7446223e6658832be45085931fdf8d | |
| parent | 85a70762b7c79983888bf4d34c6a6bbcf6b40e7d (diff) | |
ARM: edma: Add edma_assign_channel_eventq() to move channel to a give queue
In some cases it is desired to move a channel to a specific event queue.
Such a use case is audio, where it is preferred that it is served with
highest priority compared to other DMA clients.
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Acked-by: Sekhar Nori <nsekhar@ti.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
| -rw-r--r-- | arch/arm/common/edma.c | 28 | ||||
| -rw-r--r-- | include/linux/platform_data/edma.h | 2 |
2 files changed, 30 insertions, 0 deletions
diff --git a/arch/arm/common/edma.c b/arch/arm/common/edma.c index f834aae7720f..88099175fc56 100644 --- a/arch/arm/common/edma.c +++ b/arch/arm/common/edma.c | |||
| @@ -1414,6 +1414,34 @@ void edma_clear_event(unsigned channel) | |||
| 1414 | } | 1414 | } |
| 1415 | EXPORT_SYMBOL(edma_clear_event); | 1415 | EXPORT_SYMBOL(edma_clear_event); |
| 1416 | 1416 | ||
| 1417 | /* | ||
| 1418 | * edma_assign_channel_eventq - move given channel to desired eventq | ||
| 1419 | * Arguments: | ||
| 1420 | * channel - channel number | ||
| 1421 | * eventq_no - queue to move the channel | ||
| 1422 | * | ||
| 1423 | * Can be used to move a channel to a selected event queue. | ||
| 1424 | */ | ||
| 1425 | void edma_assign_channel_eventq(unsigned channel, enum dma_event_q eventq_no) | ||
| 1426 | { | ||
| 1427 | unsigned ctlr; | ||
| 1428 | |||
| 1429 | ctlr = EDMA_CTLR(channel); | ||
| 1430 | channel = EDMA_CHAN_SLOT(channel); | ||
| 1431 | |||
| 1432 | if (channel >= edma_cc[ctlr]->num_channels) | ||
| 1433 | return; | ||
| 1434 | |||
| 1435 | /* default to low priority queue */ | ||
| 1436 | if (eventq_no == EVENTQ_DEFAULT) | ||
| 1437 | eventq_no = edma_cc[ctlr]->default_queue; | ||
| 1438 | if (eventq_no >= edma_cc[ctlr]->num_tc) | ||
| 1439 | return; | ||
| 1440 | |||
| 1441 | map_dmach_queue(ctlr, channel, eventq_no); | ||
| 1442 | } | ||
| 1443 | EXPORT_SYMBOL(edma_assign_channel_eventq); | ||
| 1444 | |||
| 1417 | static int edma_setup_from_hw(struct device *dev, struct edma_soc_info *pdata, | 1445 | static int edma_setup_from_hw(struct device *dev, struct edma_soc_info *pdata, |
| 1418 | struct edma *edma_cc) | 1446 | struct edma *edma_cc) |
| 1419 | { | 1447 | { |
diff --git a/include/linux/platform_data/edma.h b/include/linux/platform_data/edma.h index eb8d5627d080..bdb2710e2aab 100644 --- a/include/linux/platform_data/edma.h +++ b/include/linux/platform_data/edma.h | |||
| @@ -150,6 +150,8 @@ void edma_clear_event(unsigned channel); | |||
| 150 | void edma_pause(unsigned channel); | 150 | void edma_pause(unsigned channel); |
| 151 | void edma_resume(unsigned channel); | 151 | void edma_resume(unsigned channel); |
| 152 | 152 | ||
| 153 | void edma_assign_channel_eventq(unsigned channel, enum dma_event_q eventq_no); | ||
| 154 | |||
| 153 | struct edma_rsv_info { | 155 | struct edma_rsv_info { |
| 154 | 156 | ||
| 155 | const s16 (*rsv_chans)[2]; | 157 | const s16 (*rsv_chans)[2]; |
