66 lines
2.1 KiB
Diff
66 lines
2.1 KiB
Diff
From c845f409541688e339c6b86b1eeea5f7110821d2 Mon Sep 17 00:00:00 2001
|
|
From: Joel Fernandes <joelf@ti.com>
|
|
Date: Mon, 22 Jul 2013 12:49:17 -0500
|
|
Subject: [PATCH 13/13] ARM: EDMA: Fix clearing of unused list for DT DMA
|
|
resources
|
|
|
|
HWMOD removal for MMC is breaking edma_start as the events are being manually
|
|
triggered due to unused channel list not being clear, Thanks to Balaji TK for
|
|
finding this issue.
|
|
|
|
This patch fixes the issue, by reading the "dmas" property from the DT node if
|
|
it exists and clearing the bits in the unused channel list.
|
|
|
|
Cc: Balaji T K <balajitk@ti.com>
|
|
Cc: Pantel Antoniou <panto@antoniou-consulting.com>
|
|
Signed-off-by: Joel Fernandes <joelf@ti.com>
|
|
---
|
|
arch/arm/common/edma.c | 31 +++++++++++++++++++++++--------
|
|
1 file changed, 23 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/arch/arm/common/edma.c b/arch/arm/common/edma.c
|
|
index 39ad030..18159d7 100644
|
|
--- a/arch/arm/common/edma.c
|
|
+++ b/arch/arm/common/edma.c
|
|
@@ -560,14 +560,29 @@ static int reserve_contiguous_slots(int ctlr, unsigned int id,
|
|
static int prepare_unused_channel_list(struct device *dev, void *data)
|
|
{
|
|
struct platform_device *pdev = to_platform_device(dev);
|
|
- int i, ctlr;
|
|
-
|
|
- for (i = 0; i < pdev->num_resources; i++) {
|
|
- if ((pdev->resource[i].flags & IORESOURCE_DMA) &&
|
|
- (int)pdev->resource[i].start >= 0) {
|
|
- ctlr = EDMA_CTLR(pdev->resource[i].start);
|
|
- clear_bit(EDMA_CHAN_SLOT(pdev->resource[i].start),
|
|
- edma_cc[ctlr]->edma_unused);
|
|
+ int i = 0, ctlr;
|
|
+ u32 dma_chan;
|
|
+ __be32 *dma_chan_p;
|
|
+ struct property *prop;
|
|
+
|
|
+ if (dev->of_node) {
|
|
+ of_property_for_each_u32(dev->of_node, "dmas", prop, \
|
|
+ dma_chan_p, dma_chan) {
|
|
+ if (i++ & 1) {
|
|
+ ctlr = EDMA_CTLR(dma_chan);
|
|
+ clear_bit(EDMA_CHAN_SLOT(dma_chan),
|
|
+ edma_cc[ctlr]->edma_unused);
|
|
+ }
|
|
+ }
|
|
+ } else {
|
|
+ for (; i < pdev->num_resources; i++) {
|
|
+ if ((pdev->resource[i].flags & IORESOURCE_DMA) &&
|
|
+ (int)pdev->resource[i].start >= 0) {
|
|
+ ctlr = EDMA_CTLR(pdev->resource[i].start);
|
|
+ clear_bit(EDMA_CHAN_SLOT(
|
|
+ pdev->resource[i].start),
|
|
+ edma_cc[ctlr]->edma_unused);
|
|
+ }
|
|
}
|
|
}
|
|
|
|
--
|
|
1.8.2.1
|
|
|