ARM: edma: Add edma_assign_channel_eventq() to move channel to a give queue
authorPeter Ujfalusi <peter.ujfalusi@ti.com>
Tue, 8 Jul 2014 10:46:37 +0000 (13:46 +0300)
committerVinod Koul <vinod.koul@intel.com>
Mon, 28 Jul 2014 11:33:13 +0000 (17:03 +0530)
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>
arch/arm/common/edma.c
include/linux/platform_data/edma.h

index f834aae..8809917 100644 (file)
@@ -1414,6 +1414,34 @@ void edma_clear_event(unsigned channel)
 }
 EXPORT_SYMBOL(edma_clear_event);
 
+/*
+ * edma_assign_channel_eventq - move given channel to desired eventq
+ * Arguments:
+ *     channel - channel number
+ *     eventq_no - queue to move the channel
+ *
+ * Can be used to move a channel to a selected event queue.
+ */
+void edma_assign_channel_eventq(unsigned channel, enum dma_event_q eventq_no)
+{
+       unsigned ctlr;
+
+       ctlr = EDMA_CTLR(channel);
+       channel = EDMA_CHAN_SLOT(channel);
+
+       if (channel >= edma_cc[ctlr]->num_channels)
+               return;
+
+       /* default to low priority queue */
+       if (eventq_no == EVENTQ_DEFAULT)
+               eventq_no = edma_cc[ctlr]->default_queue;
+       if (eventq_no >= edma_cc[ctlr]->num_tc)
+               return;
+
+       map_dmach_queue(ctlr, channel, eventq_no);
+}
+EXPORT_SYMBOL(edma_assign_channel_eventq);
+
 static int edma_setup_from_hw(struct device *dev, struct edma_soc_info *pdata,
                              struct edma *edma_cc)
 {
index eb8d562..bdb2710 100644 (file)
@@ -150,6 +150,8 @@ void edma_clear_event(unsigned channel);
 void edma_pause(unsigned channel);
 void edma_resume(unsigned channel);
 
+void edma_assign_channel_eventq(unsigned channel, enum dma_event_q eventq_no);
+
 struct edma_rsv_info {
 
        const s16       (*rsv_chans)[2];