diff options
Diffstat (limited to 'arch/arm/common/edma.c')
| -rw-r--r-- | arch/arm/common/edma.c | 40 | 
1 files changed, 35 insertions, 5 deletions
diff --git a/arch/arm/common/edma.c b/arch/arm/common/edma.c index 485be42519b9..d86771abbf57 100644 --- a/arch/arm/common/edma.c +++ b/arch/arm/common/edma.c @@ -1414,15 +1414,43 @@ 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) +			      struct edma *edma_cc, int cc_id)  {  	int i;  	u32 value, cccfg;  	s8 (*queue_priority_map)[2];  	/* Decode the eDMA3 configuration from CCCFG register */ -	cccfg = edma_read(0, EDMA_CCCFG); +	cccfg = edma_read(cc_id, EDMA_CCCFG);  	value = GET_NUM_REGN(cccfg);  	edma_cc->num_region = BIT(value); @@ -1436,7 +1464,8 @@ static int edma_setup_from_hw(struct device *dev, struct edma_soc_info *pdata,  	value = GET_NUM_EVQUE(cccfg);  	edma_cc->num_tc = value + 1; -	dev_dbg(dev, "eDMA3 HW configuration (cccfg: 0x%08x):\n", cccfg); +	dev_dbg(dev, "eDMA3 CC%d HW configuration (cccfg: 0x%08x):\n", cc_id, +		cccfg);  	dev_dbg(dev, "num_region: %u\n", edma_cc->num_region);  	dev_dbg(dev, "num_channel: %u\n", edma_cc->num_channels);  	dev_dbg(dev, "num_slot: %u\n", edma_cc->num_slots); @@ -1470,7 +1499,8 @@ static int edma_setup_from_hw(struct device *dev, struct edma_soc_info *pdata,  	queue_priority_map[i][1] = -1;  	pdata->queue_priority_mapping = queue_priority_map; -	pdata->default_queue = 0; +	/* Default queue has the lowest priority */ +	pdata->default_queue = i - 1;  	return 0;  } @@ -1655,7 +1685,7 @@ static int edma_probe(struct platform_device *pdev)  			return -ENOMEM;  		/* Get eDMA3 configuration from IP */ -		ret = edma_setup_from_hw(dev, info[j], edma_cc[j]); +		ret = edma_setup_from_hw(dev, info[j], edma_cc[j], j);  		if (ret)  			return ret;  |